@aws-cdk/aws-amplify-alpha
Version:
The CDK Construct Library for AWS::Amplify
324 lines • 47.8 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CacheConfigType = exports.Platform = exports.CustomRule = exports.RedirectStatus = exports.App = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const iam = require("aws-cdk-lib/aws-iam");
const core_1 = require("aws-cdk-lib/core");
const aws_amplify_1 = require("aws-cdk-lib/aws-amplify");
const branch_1 = require("./branch");
const domain_1 = require("./domain");
const utils_1 = require("./utils");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
/**
* An Amplify Console application
*/
let App = class App extends core_1.Resource {
/**
* Import an existing application
*/
static fromAppId(scope, id, appId) {
class Import extends core_1.Resource {
constructor() {
super(...arguments);
this.appId = appId;
}
}
return new Import(scope, id);
}
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_AppProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, App);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
this.customRules = props.customRules || [];
this.environmentVariables = props.environmentVariables || {};
this.autoBranchEnvironmentVariables = props.autoBranchCreation && props.autoBranchCreation.environmentVariables || {};
const role = props.role || new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('amplify.amazonaws.com'),
});
this.grantPrincipal = role;
let computedRole;
const appPlatform = props.platform || Platform.WEB;
const isSSR = (0, utils_1.isServerSideRendered)(appPlatform);
if (props.computeRole) {
if (!isSSR) {
throw new core_1.ValidationError('`computeRole` can only be specified for `Platform.WEB_COMPUTE` or `Platform.WEB_DYNAMIC`.', this);
}
computedRole = props.computeRole;
}
else if (isSSR) {
computedRole = new iam.Role(this, 'ComputeRole', {
assumedBy: new iam.ServicePrincipal('amplify.amazonaws.com'),
});
}
this.computeRole = computedRole;
const sourceCodeProviderOptions = props.sourceCodeProvider?.bind(this);
this.platform = appPlatform;
const app = new aws_amplify_1.CfnApp(this, 'Resource', {
accessToken: sourceCodeProviderOptions?.accessToken?.unsafeUnwrap(), // Safe usage
autoBranchCreationConfig: props.autoBranchCreation && {
autoBranchCreationPatterns: props.autoBranchCreation.patterns,
basicAuthConfig: props.autoBranchCreation.basicAuth
? props.autoBranchCreation.basicAuth.bind(this, 'BranchBasicAuth')
: { enableBasicAuth: false },
buildSpec: props.autoBranchCreation.buildSpec && props.autoBranchCreation.buildSpec.toBuildSpec(),
enableAutoBranchCreation: true,
enableAutoBuild: props.autoBranchCreation.autoBuild ?? true,
environmentVariables: core_1.Lazy.any({ produce: () => (0, utils_1.renderEnvironmentVariables)(this.autoBranchEnvironmentVariables) }, { omitEmptyArray: true }), // eslint-disable-line max-len
enablePullRequestPreview: props.autoBranchCreation.pullRequestPreview ?? true,
pullRequestEnvironmentName: props.autoBranchCreation.pullRequestEnvironmentName,
stage: props.autoBranchCreation.stage,
},
enableBranchAutoDeletion: props.autoBranchDeletion,
basicAuthConfig: props.basicAuth
? props.basicAuth.bind(this, 'AppBasicAuth')
: { enableBasicAuth: false },
buildSpec: props.buildSpec && props.buildSpec.toBuildSpec(),
cacheConfig: props.cacheConfigType ? { type: props.cacheConfigType } : undefined,
computeRoleArn: this.computeRole?.roleArn,
customRules: core_1.Lazy.any({ produce: () => this.customRules }, { omitEmptyArray: true }),
description: props.description,
environmentVariables: core_1.Lazy.any({ produce: () => (0, utils_1.renderEnvironmentVariables)(this.environmentVariables) }, { omitEmptyArray: true }),
iamServiceRole: role.roleArn,
name: props.appName || this.node.id,
oauthToken: sourceCodeProviderOptions?.oauthToken?.unsafeUnwrap(), // Safe usage
repository: sourceCodeProviderOptions?.repository,
customHeaders: props.customResponseHeaders ? renderCustomResponseHeaders(props.customResponseHeaders, this) : undefined,
platform: appPlatform,
});
this.appId = app.attrAppId;
this.appName = app.attrAppName;
this.arn = app.attrArn;
this.defaultDomain = app.attrDefaultDomain;
}
/**
* Adds a custom rewrite/redirect rule to this application
*/
addCustomRule(rule) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_CustomRule(rule);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addCustomRule);
}
throw error;
}
this.customRules.push(rule);
return this;
}
/**
* Adds an environment variable to this application.
*
* All environment variables that you add are encrypted to prevent rogue
* access so you can use them to store secret information.
*/
addEnvironment(name, value) {
this.environmentVariables[name] = value;
return this;
}
/**
* Adds an environment variable to the auto created branch.
*
* All environment variables that you add are encrypted to prevent rogue
* access so you can use them to store secret information.
*/
addAutoBranchEnvironment(name, value) {
this.autoBranchEnvironmentVariables[name] = value;
return this;
}
/**
* Adds a branch to this application
*/
addBranch(id, options = {}) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_BranchOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addBranch);
}
throw error;
}
return new branch_1.Branch(this, id, {
...options,
app: this,
});
}
/**
* Adds a domain to this application
*/
addDomain(id, options = {}) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_DomainOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addDomain);
}
throw error;
}
return new domain_1.Domain(this, id, {
...options,
app: this,
autoSubDomainIamRole: this.grantPrincipal,
});
}
};
exports.App = App;
_a = JSII_RTTI_SYMBOL_1;
App[_a] = { fqn: "@aws-cdk/aws-amplify-alpha.App", version: "2.210.0-alpha.0" };
/** Uniquely identifies this class. */
App.PROPERTY_INJECTION_ID = '@aws-cdk.aws-amplify-alpha.App';
__decorate([
(0, metadata_resource_1.MethodMetadata)()
], App.prototype, "addCustomRule", null);
__decorate([
(0, metadata_resource_1.MethodMetadata)()
], App.prototype, "addEnvironment", null);
__decorate([
(0, metadata_resource_1.MethodMetadata)()
], App.prototype, "addAutoBranchEnvironment", null);
__decorate([
(0, metadata_resource_1.MethodMetadata)()
], App.prototype, "addBranch", null);
__decorate([
(0, metadata_resource_1.MethodMetadata)()
], App.prototype, "addDomain", null);
exports.App = App = __decorate([
prop_injectable_1.propertyInjectable
], App);
/**
* The status code for a URL rewrite or redirect rule.
*/
var RedirectStatus;
(function (RedirectStatus) {
/**
* Rewrite (200)
*/
RedirectStatus["REWRITE"] = "200";
/**
* Permanent redirect (301)
*/
RedirectStatus["PERMANENT_REDIRECT"] = "301";
/**
* Temporary redirect (302)
*/
RedirectStatus["TEMPORARY_REDIRECT"] = "302";
/**
* Not found (404)
*/
RedirectStatus["NOT_FOUND"] = "404";
/**
* Not found rewrite (404)
*/
RedirectStatus["NOT_FOUND_REWRITE"] = "404-200";
})(RedirectStatus || (exports.RedirectStatus = RedirectStatus = {}));
/**
* Custom rewrite/redirect rule for an Amplify App.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*/
class CustomRule {
constructor(options) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_CustomRuleOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, CustomRule);
}
throw error;
}
this.source = options.source;
this.target = options.target;
this.status = options.status;
this.condition = options.condition;
}
}
exports.CustomRule = CustomRule;
_b = JSII_RTTI_SYMBOL_1;
CustomRule[_b] = { fqn: "@aws-cdk/aws-amplify-alpha.CustomRule", version: "2.210.0-alpha.0" };
/**
* Sets up a 200 rewrite for all paths to `index.html` except for path
* containing a file extension.
*/
CustomRule.SINGLE_PAGE_APPLICATION_REDIRECT = new CustomRule({
source: '</^[^.]+$/>',
target: '/index.html',
status: RedirectStatus.REWRITE,
});
function renderCustomResponseHeaders(customHeaders, scope) {
const hasAppRoot = customHeaders[0].appRoot !== undefined;
const yaml = [hasAppRoot ? 'applications:' : 'customHeaders:'];
for (const customHeader of customHeaders) {
if ((customHeader.appRoot !== undefined) !== hasAppRoot) {
throw new core_1.ValidationError('appRoot must be either be present or absent across all custom response headers', scope);
}
const baseIndentation = ' '.repeat(hasAppRoot ? 6 : 2);
if (hasAppRoot) {
yaml.push(` - appRoot: ${customHeader.appRoot}`);
yaml.push(' customHeaders:');
}
yaml.push(`${baseIndentation}- pattern: "${customHeader.pattern}"`);
yaml.push(`${baseIndentation} headers:`);
for (const [key, value] of Object.entries(customHeader.headers)) {
yaml.push(`${baseIndentation} - key: "${key}"`);
yaml.push(`${baseIndentation} value: "${value}"`);
}
}
return `${yaml.join('\n')}\n`;
}
/**
* Available hosting platforms to use on the App.
*/
var Platform;
(function (Platform) {
/**
* WEB - Used to indicate that the app is hosted using only static assets.
*/
Platform["WEB"] = "WEB";
/**
* WEB_COMPUTE - Used to indicate the app is hosted using a combination of
* server side rendered and static assets.
*/
Platform["WEB_COMPUTE"] = "WEB_COMPUTE";
/**
* WEB_DYNAMIC - Used to indicate the app is hosted using a fully dynamic architecture, where requests are processed at runtime by backend compute services.
*/
Platform["WEB_DYNAMIC"] = "WEB_DYNAMIC";
})(Platform || (exports.Platform = Platform = {}));
/**
* The type of cache configuration to use for an Amplify app.
*/
var CacheConfigType;
(function (CacheConfigType) {
/**
* AMPLIFY_MANAGED - Automatically applies an optimized cache configuration
* for your app based on its platform, routing rules, and rewrite rules.
*/
CacheConfigType["AMPLIFY_MANAGED"] = "AMPLIFY_MANAGED";
/**
* AMPLIFY_MANAGED_NO_COOKIES - The same as AMPLIFY_MANAGED,
* except that it excludes all cookies from the cache key.
*/
CacheConfigType["AMPLIFY_MANAGED_NO_COOKIES"] = "AMPLIFY_MANAGED_NO_COOKIES";
})(CacheConfigType || (exports.CacheConfigType = CacheConfigType = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLDJDQUEyQztBQUMzQywyQ0FBMkY7QUFFM0YseURBQWlEO0FBRWpELHFDQUFpRDtBQUNqRCxxQ0FBaUQ7QUFDakQsbUNBQTJFO0FBQzNFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFrTDFFOztHQUVHO0FBRUksSUFBTSxHQUFHLEdBQVQsTUFBTSxHQUFJLFNBQVEsZUFBUTtJQUkvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBYTtRQUNqRSxNQUFNLE1BQU8sU0FBUSxlQUFRO1lBQTdCOztnQkFDa0IsVUFBSyxHQUFHLEtBQUssQ0FBQztZQUNoQyxDQUFDO1NBQUE7UUFDRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQTRDRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs7Ozs7OytDQXpEUixHQUFHOzs7O1FBMERaLG1DQUFtQztRQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUV0SCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFB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SUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDaEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQWdCWDtBQWhCRCxXQUFZLFFBQVE7SUFDbEI7O09BRUc7SUFDSCx1QkFBVyxDQUFBO0lBRVg7OztPQUdHO0lBQ0gsdUNBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCx1Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBaEJXLFFBQVEsd0JBQVIsUUFBUSxRQWdCbkI7QUFFRDs7R0FFRztBQUNILElBQVksZUFZWDtBQVpELFdBQVksZUFBZTtJQUN6Qjs7O09BR0c7SUFDSCxzREFBbUMsQ0FBQTtJQUVuQzs7O09BR0c7SUFDSCw0RUFBeUQsQ0FBQTtBQUMzRCxDQUFDLEVBWlcsZUFBZSwrQkFBZixlQUFlLFFBWTFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29kZWJ1aWxkIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSVJlc291cmNlLCBMYXp5LCBSZXNvdXJjZSwgU2VjcmV0VmFsdWUsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDZm5BcHAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYW1wbGlmeSc7XG5pbXBvcnQgeyBCYXNpY0F1dGggfSBmcm9tICcuL2Jhc2ljLWF1dGgnO1xuaW1wb3J0IHsgQnJhbmNoLCBCcmFuY2hPcHRpb25zIH0gZnJvbSAnLi9icmFuY2gnO1xuaW1wb3J0IHsgRG9tYWluLCBEb21haW5PcHRpb25zIH0gZnJvbSAnLi9kb21haW4nO1xuaW1wb3J0IHsgcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXMsIGlzU2VydmVyU2lkZVJlbmRlcmVkIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIEFuIEFtcGxpZnkgQ29uc29sZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHAgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGlkXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHNvdXJjZSBjb2RlIHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlQ29kZVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IGZvciB0aGUgYXBwbGljYXRpb24uIE11c3QgdXNlIHRoZSBgSFRUUFNgIHByb3RvY29sLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNka2AuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9BdXRoIHRva2VuIGZvciAzcmQgcGFydHkgc291cmNlIGNvbnRyb2wgc3lzdGVtIGZvciBhbiBBbXBsaWZ5IEFwcCwgdXNlZFxuICAgKiB0byBjcmVhdGUgd2ViaG9vayBhbmQgcmVhZC1vbmx5IGRlcGxveSBrZXkuIE9BdXRoIHRva2VuIGlzIG5vdCBzdG9yZWQuXG4gICAqXG4gICAqIEVpdGhlciBgYWNjZXNzVG9rZW5gIG9yIGBvYXV0aFRva2VuYCBtdXN0IGJlIHNwZWNpZmllZCBpZiBgcmVwb3NpdG9yeWBcbiAgICogaXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCB1c2UgYSB0b2tlblxuICAgKi9cbiAgcmVhZG9ubHkgb2F1dGhUb2tlbj86IFNlY3JldFZhbHVlO1xuXG4gIC8qKlxuICAgKiBQZXJzb25hbCBBY2Nlc3MgdG9rZW4gZm9yIDNyZCBwYXJ0eSBzb3VyY2UgY29udHJvbCBzeXN0ZW0gZm9yIGFuIEFtcGxpZnlcbiAgICogQXBwLCB1c2VkIHRvIGNyZWF0ZSB3ZWJob29rIGFuZCByZWFkLW9ubHkgZGVwbG95IGtleS4gVG9rZW4gaXMgbm90IHN0b3JlZC5cbiAgICpcbiAgICogRWl0aGVyIGBhY2Nlc3NUb2tlbmAgb3IgYG9hdXRoVG9rZW5gIG11c3QgYmUgc3BlY2lmaWVkIGlmIGByZXBvc2l0b3J5YFxuICAgKiBpcyBzZXBjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZG8gbm90IHVzZSBhIHRva2VuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NUb2tlbj86IFNlY3JldFZhbHVlO1xufVxuXG4vKipcbiAqIEEgc291cmNlIGNvZGUgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU291cmNlQ29kZVByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzb3VyY2UgY29kZSBwcm92aWRlciB0byBhbiBhcHBcbiAgICpcbiAgICogQHBhcmFtIGFwcCBUaGUgYXBwIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBiaW5kKGFwcDogQXBwKTogU291cmNlQ29kZVByb3ZpZGVyQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFuIEFwcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIENESyBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBjb2RlIHByb3ZpZGVyIGZvciB0aGlzIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IGNvbm5lY3RlZCB0byBhIHNvdXJjZSBjb2RlIHByb3ZpZGVyXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb2RlUHJvdmlkZXI/OiBJU291cmNlQ29kZVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYXV0byBicmFuY2ggY3JlYXRpb24gY29uZmlndXJhdGlvbi4gVXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjcmVhdGVcbiAgICogYnJhbmNoZXMgdGhhdCBtYXRjaCBhIGNlcnRhaW4gcGF0dGVybi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhdXRvIGJyYW5jaCBjcmVhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0JyYW5jaENyZWF0aW9uPzogQXV0b0JyYW5jaENyZWF0aW9uO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3QgYSBicmFuY2ggaW4gdGhlIEFtcGxpZnkgQ29uc29sZSB3aGVuIHlvdSBkZWxldGUgYVxuICAgKiBicmFuY2ggZnJvbSB5b3VyIEdpdCByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0JyYW5jaERlbGV0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIEJhc2ljIEF1dGggY29uZmlndXJhdGlvbi4gVXNlIHRoaXMgdG8gc2V0IHBhc3N3b3JkIHByb3RlY3Rpb24gYXQgYW5cbiAgICogYXBwIGxldmVsIHRvIGFsbCB5b3VyIGJyYW5jaGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBhc3N3b3JkIHByb3RlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IEJhc2ljQXV0aDtcblxuICAvKipcbiAgICogQnVpbGRTcGVjIGZvciB0aGUgYXBwbGljYXRpb24uIEFsdGVybmF0aXZlbHksIGFkZCBhIGBhbXBsaWZ5LnltbGBcbiAgICogZmlsZSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL2J1aWxkLXNldHRpbmdzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBidWlsZCBzcGVjXG4gICAqL1xuICByZWFkb25seSBidWlsZFNwZWM/OiBjb2RlYnVpbGQuQnVpbGRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBmb3IgYW4gQW1wbGlmeSBhcHAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20taGVhZGVycy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY3VzdG9tIHJlc3BvbnNlIGhlYWRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJlc3BvbnNlSGVhZGVycz86IEN1c3RvbVJlc3BvbnNlSGVhZGVyW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSByZXdyaXRlL3JlZGlyZWN0IHJ1bGVzIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUnVsZXM/OiBDdXN0b21SdWxlW107XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHNlcnZpY2Ugcm9sZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYXBwbGljYXRpb24uIFRoZSBBcHBcbiAgICogaW1wbGVtZW50cyBJR3JhbnRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgaXMgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBob3N0aW5nIHBsYXRmb3JtIHRvIHVzZS4gU2V0IHRvIFdFQiBmb3Igc3RhdGljIHNpdGVcbiAgICogZ2VuZXJhdGVkIChTU0cpIGFwcHMgKGkuZS4gYSBDcmVhdGUgUmVhY3QgQXBwIG9yIEdhdHNieSkgYW5kIFdFQl9DT01QVVRFXG4gICAqIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJlZCAoU1NSKSBhcHBzIChpLmUuIE5leHRKUykuXG4gICAqXG4gICAqIEBkZWZhdWx0IFBsYXRmb3JtLldFQlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm0/OiBQbGF0Zm9ybTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY2FjaGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGFuIEFtcGxpZnkgYXBwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDYWNoZUNvbmZpZ1R5cGUuQU1QTElGWV9NQU5BR0VEXG4gICAqL1xuICByZWFkb25seSBjYWNoZUNvbmZpZ1R5cGU/OiBDYWNoZUNvbmZpZ1R5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBmb3IgYW4gU1NSIGFwcC5cbiAgICogVGhlIENvbXB1dGUgcm9sZSBhbGxvd3MgdGhlIEFtcGxpZnkgSG9zdGluZyBjb21wdXRlIHNlcnZpY2UgdG8gc2VjdXJlbHkgYWNjZXNzIHNwZWNpZmljIEFXUyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIHJvbGUncyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gYSBuZXcgcm9sZSBpcyBjcmVhdGVkIHdoZW4gYHBsYXRmb3JtYCBpcyBgUGxhdGZvcm0uV0VCX0NPTVBVVEVgIG9yIGBQbGF0Zm9ybS5XRUJfRFlOQU1JQ2AsIG90aGVyd2lzZSBubyBjb21wdXRlIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXB1dGVSb2xlPzogaWFtLklSb2xlO1xufVxuXG4vKipcbiAqIEFuIEFtcGxpZnkgQ29uc29sZSBhcHBsaWNhdGlvblxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQXBwLCBpYW0uSUdyYW50YWJsZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWFtcGxpZnktYWxwaGEuQXBwJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcHBJZChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogSUFwcCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQXBwIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBJZCA9IGFwcElkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGRvbWFpbiBvZiB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHREb21haW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGZvciBhbiBTU1IgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm0gb2YgdGhlIGFwcFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21SdWxlczogQ3VzdG9tUnVsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvQnJhbmNoRW52aXJvbm1lbnRWYXJpYWJsZXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBcHBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLmN1c3RvbVJ1bGVzID0gcHJvcHMuY3VzdG9tUnVsZXMgfHwgW107XG4gICAgdGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzIHx8IHt9O1xuICAgIHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzID0gcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uICYmIHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlcyB8fCB7fTtcblxuICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlIHx8IG5ldyBpYW0uUm9sZSh0aGlzLCAnUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhbXBsaWZ5LmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gcm9sZTtcblxuICAgIGxldCBjb21wdXRlZFJvbGU6IGlhbS5JUm9sZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhcHBQbGF0Zm9ybSA9IHByb3BzLnBsYXRmb3JtIHx8IFBsYXRmb3JtLldFQjtcbiAgICBjb25zdCBpc1NTUiA9IGlzU2VydmVyU2lkZVJlbmRlcmVkKGFwcFBsYXRmb3JtKTtcblxuICAgIGlmIChwcm9wcy5jb21wdXRlUm9sZSkge1xuICAgICAgaWYgKCFpc1NTUikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdgY29tcHV0ZVJvbGVgIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYFBsYXRmb3JtLldFQl9DT01QVVRFYCBvciBgUGxhdGZvcm0uV0VCX0RZTkFNSUNgLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgY29tcHV0ZWRSb2xlID0gcHJvcHMuY29tcHV0ZVJvbGU7XG4gICAgfSBlbHNlIGlmIChpc1NTUikge1xuICAgICAgY29tcHV0ZWRSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDb21wdXRlUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FtcGxpZnkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29tcHV0ZVJvbGUgPSBjb21wdXRlZFJvbGU7XG5cbiAgICBjb25zdCBzb3VyY2VDb2RlUHJvdmlkZXJPcHRpb25zID0gcHJvcHMuc291cmNlQ29kZVByb3ZpZGVyPy5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5wbGF0Zm9ybSA9IGFwcFBsYXRmb3JtO1xuXG4gICAgY29uc3QgYXBwID0gbmV3IENmbkFwcCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhY2Nlc3NUb2tlbjogc291cmNlQ29kZVByb3ZpZGVyT3B0aW9ucz8uYWNjZXNzVG9rZW4/LnVuc2FmZVVud3JhcCgpLCAvLyBTYWZlIHVzYWdlXG4gICAgICBhdXRvQnJhbmNoQ3JlYXRpb25Db25maWc6IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbiAmJiB7XG4gICAgICAgIGF1dG9CcmFuY2hDcmVhdGlvblBhdHRlcm5zOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucGF0dGVybnMsXG4gICAgICAgIGJhc2ljQXV0aENvbmZpZzogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJhc2ljQXV0aFxuICAgICAgICAgID8gcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJhc2ljQXV0aC5iaW5kKHRoaXMsICdCcmFuY2hCYXNpY0F1dGgnKVxuICAgICAgICAgIDogeyBlbmFibGVCYXNpY0F1dGg6IGZhbHNlIH0sXG4gICAgICAgIGJ1aWxkU3BlYzogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJ1aWxkU3BlYyAmJiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uYnVpbGRTcGVjLnRvQnVpbGRTcGVjKCksXG4gICAgICAgIGVuYWJsZUF1dG9CcmFuY2hDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXV0b0J1aWxkOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uYXV0b0J1aWxkID8/IHRydWUsXG4gICAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHJlbmRlckVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzKSB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICAgICAgZW5hYmxlUHVsbFJlcXVlc3RQcmV2aWV3OiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RQcmV2aWV3ID8/IHRydWUsXG4gICAgICAgIHB1bGxSZXF1ZXN0RW52aXJvbm1lbnROYW1lOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIHN0YWdlOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uc3RhZ2UsXG4gICAgICB9LFxuICAgICAgZW5hYmxlQnJhbmNoQXV0b0RlbGV0aW9uOiBwcm9wcy5hdXRvQnJhbmNoRGVsZXRpb24sXG4gICAgICBiYXNpY0F1dGhDb25maWc6IHByb3BzLmJhc2ljQXV0aFxuICAgICAgICA/IHByb3BzLmJhc2ljQXV0aC5iaW5kKHRoaXMsICdBcHBCYXNpY0F1dGgnKVxuICAgICAgICA6IHsgZW5hYmxlQmFzaWNBdXRoOiBmYWxzZSB9LFxuICAgICAgYnVpbGRTcGVjOiBwcm9wcy5idWlsZFNwZWMgJiYgcHJvcHMuYnVpbGRTcGVjLnRvQnVpbGRTcGVjKCksXG4gICAgICBjYWNoZUNvbmZpZzogcHJvcHMuY2FjaGVDb25maWdUeXBlID8geyB0eXBlOiBwcm9wcy5jYWNoZUNvbmZpZ1R5cGUgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbXB1dGVSb2xlQXJuOiB0aGlzLmNvbXB1dGVSb2xlPy5yb2xlQXJuLFxuICAgICAgY3VzdG9tUnVsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5jdXN0b21SdWxlcyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlcykgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICAgIGlhbVNlcnZpY2VSb2xlOiByb2xlLnJvbGVBcm4sXG4gICAgICBuYW1lOiBwcm9wcy5hcHBOYW1lIHx8IHRoaXMubm9kZS5pZCxcbiAgICAgIG9hdXRoVG9rZW46IHNvdXJjZUNvZGVQcm92aWRlck9wdGlvbnM/Lm9hdXRoVG9rZW4/LnVuc2FmZVVud3JhcCgpLCAvLyBTYWZlIHVzYWdlXG4gICAgICByZXBvc2l0b3J5OiBzb3VyY2VDb2RlUHJvdmlkZXJPcHRpb25zPy5yZXBvc2l0b3J5LFxuICAgICAgY3VzdG9tSGVhZGVyczogcHJvcHMuY3VzdG9tUmVzcG9uc2VIZWFkZXJzID8gcmVuZGVyQ3VzdG9tUmVzcG9uc2VIZWFkZXJzKHByb3BzLmN1c3RvbVJlc3BvbnNlSGVhZGVycywgdGhpcykgOiB1bmRlZmluZWQsXG4gICAgICBwbGF0Zm9ybTogYXBwUGxhdGZvcm0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFwcElkID0gYXBwLmF0dHJBcHBJZDtcbiAgICB0aGlzLmFwcE5hbWUgPSBhcHAuYXR0ckFwcE5hbWU7XG4gICAgdGhpcy5hcm4gPSBhcHAuYXR0ckFybjtcbiAgICB0aGlzLmRlZmF1bHREb21haW4gPSBhcHAuYXR0ckRlZmF1bHREb21haW47XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGN1c3RvbSByZXdyaXRlL3JlZGlyZWN0IHJ1bGUgdG8gdGhpcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEN1c3RvbVJ1bGUocnVsZTogQ3VzdG9tUnVsZSkge1xuICAgIHRoaXMuY3VzdG9tUnVsZXMucHVzaChydWxlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkQXV0b0JyYW5jaEVudmlyb25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzW25hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJyYW5jaCB0byB0aGlzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkQnJhbmNoKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEJyYW5jaE9wdGlvbnMgPSB7fSk6IEJyYW5jaCB7XG4gICAgcmV0dXJuIG5ldyBCcmFuY2godGhpcywgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhcHA6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRvbWFpbiB0byB0aGlzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRG9tYWluKGlkOiBzdHJpbmcsIG9wdGlvbnM6IERvbWFpbk9wdGlvbnMgPSB7fSk6IERvbWFpbiB7XG4gICAgcmV0dXJuIG5ldyBEb21haW4odGhpcywgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhcHA6IHRoaXMsXG4gICAgICBhdXRvU3ViRG9tYWluSWFtUm9sZTogdGhpcy5ncmFudFByaW5jaXBhbCBhcyBpYW0uSVJvbGUsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvIGJyYW5jaCBjcmVhdGlvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0JyYW5jaENyZWF0aW9uIHtcbiAgLyoqXG4gICAqIEF1dG9tYXRlZCBicmFuY2ggY3JlYXRpb24gZ2xvYiBwYXR0ZXJuc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCByZXBvc2l0b3J5IGJyYW5jaGVzXG4gICAqL1xuICByZWFkb25seSBwYXR0ZXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgQmFzaWMgQXV0aCBjb25maWd1cmF0aW9uLiBVc2UgdGhpcyB0byBzZXQgcGFzc3dvcmQgcHJvdGVjdGlvbiBmb3JcbiAgICogdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFzc3dvcmQgcHJvdGVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYmFzaWNBdXRoPzogQmFzaWNBdXRoO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBzcGVjIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcHBsaWNhdGlvbiBidWlsZCBzcGVjXG4gICAqL1xuICByZWFkb25seSBidWlsZFNwZWM/OiBjb2RlYnVpbGQuQnVpbGRTcGVjO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBhdXRvIGJ1aWxkaW5nIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwdWxsIHJlcXVlc3QgcHJldmlldyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0UHJldmlldz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXBwbGljYXRpb24gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGVkaWNhdGVkIGJhY2tlbmQgZW52aXJvbm1lbnQgZm9yIHRoZSBwdWxsIHJlcXVlc3QgcHJldmlld3Mgb2ZcbiAgICogdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b21hdGljYWxseSBwcm92aXNpb24gYSB0ZW1wb3JhcnkgYmFja2VuZFxuICAgKi9cbiAgcmVhZG9ubHkgcHVsbFJlcXVlc3RFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0YWdlIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YWdlXG4gICAqL1xuICByZWFkb25seSBzdGFnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIGNvZGUgZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAqL1xuZXhwb3J0IGVudW0gUmVkaXJlY3RTdGF0dXMge1xuICAvKipcbiAgICogUmV3cml0ZSAoMjAwKVxuICAgKi9cbiAgUkVXUklURSA9ICcyMDAnLFxuXG4gIC8qKlxuICAgKiBQZXJtYW5lbnQgcmVkaXJlY3QgKDMwMSlcbiAgICovXG4gIFBFUk1BTkVOVF9SRURJUkVDVCA9ICczMDEnLFxuXG4gIC8qKlxuICAgKiBUZW1wb3JhcnkgcmVkaXJlY3QgKDMwMilcbiAgICovXG4gIFRFTVBPUkFSWV9SRURJUkVDVCA9ICczMDInLFxuXG4gIC8qKlxuICAgKiBOb3QgZm91bmQgKDQwNClcbiAgICovXG4gIE5PVF9GT1VORCA9ICc0MDQnLFxuXG4gIC8qKlxuICAgKiBOb3QgZm91bmQgcmV3cml0ZSAoNDA0KVxuICAgKi9cbiAgTk9UX0ZPVU5EX1JFV1JJVEUgPSAnNDA0LTIwMCcsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBjdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlIGZvciBhbiBBbXBsaWZ5IEFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SdWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdHRlcm4gZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXR0ZXJuIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9yZWRpcmVjdHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgY29kZSBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgUEVSTUFORU5UX1JFRElSRUNUXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBSZWRpcmVjdFN0YXR1cztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLCBlLmcuIGNvdW50cnkgY29kZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tIHJld3JpdGUvcmVkaXJlY3QgcnVsZSBmb3IgYW4gQW1wbGlmeSBBcHAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21SdWxlIHtcbiAgLyoqXG4gICAqIFNldHMgdXAgYSAyMDAgcmV3cml0ZSBmb3IgYWxsIHBhdGhzIHRvIGBpbmRleC5odG1sYCBleGNlcHQgZm9yIHBhdGhcbiAgICogY29udGFpbmluZyBhIGZpbGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUEFHRV9BUFBMSUNBVElPTl9SRURJUkVDVCA9IG5ldyBDdXN0b21SdWxlKHtcbiAgICBzb3VyY2U6ICc8L15bXi5dKyQvPicsXG4gICAgdGFyZ2V0OiAnL2luZGV4Lmh0bWwnLFxuICAgIHN0YXR1czogUmVkaXJlY3RTdGF0dXMuUkVXUklURSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0dGVybiBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXR0ZXJuIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9yZWRpcmVjdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIGNvZGUgZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IFBFUk1BTkVOVF9SRURJUkVDVFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IFJlZGlyZWN0U3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9uIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUsIGUuZy4gY291bnRyeSBjb2RlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb25kaXRpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ3VzdG9tUnVsZU9wdGlvbnMpIHtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQ7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cztcbiAgICB0aGlzLmNvbmRpdGlvbiA9IG9wdGlvbnMuY29uZGl0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQ3VzdG9tIHJlc3BvbnNlIGhlYWRlciBvZiBhbiBBbXBsaWZ5IEFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZXNwb25zZUhlYWRlciB7XG4gIC8qKlxuICAgKiBJZiB0aGUgYXBwIHVzZXMgYSBtb25vcmVwbyBzdHJ1Y3R1cmUsIHRoZSBhcHBSb290IGZyb20gdGhlIGJ1aWxkIHNwZWMgdG8gYXBwbHkgdGhlIGN1c3RvbSBoZWFkZXJzIHRvLlxuICAgKiBAZGVmYXVsdCAtIFRoZSBhcHBSb290IGlzIG9taXR0ZWQgaW4gdGhlIGN1c3RvbSBoZWFkZXJzIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZXNlIGN1c3RvbSBoZWFkZXJzIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgVVJMIGZpbGUgcGF0aHMgdGhhdCBtYXRjaCB0aGlzIHBhdHRlcm4uXG4gICAqL1xuICByZWFkb25seSBwYXR0ZXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXAgb2YgY3VzdG9tIGhlYWRlcnMgdG8gYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmZ1bmN0aW9uIHJlbmRlckN1c3RvbVJlc3BvbnNlSGVhZGVycyhjdXN0b21IZWFkZXJzOiBDdXN0b21SZXNwb25zZUhlYWRlcltdLCBzY29wZTogSUNvbnN0cnVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc0FwcFJvb3QgPSBjdXN0b21IZWFkZXJzWzBdLmFwcFJvb3QgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgeWFtbCA9IFtoYXNBcHBSb290ID8gJ2FwcGxpY2F0aW9uczonIDogJ2N1c3RvbUhlYWRlcnM6J107XG5cbiAgZm9yIChjb25zdCBjdXN0b21IZWFkZXIgb2YgY3VzdG9tSGVhZGVycykge1xuICAgIGlmICgoY3VzdG9tSGVhZGVyLmFwcFJvb3QgIT09IHVuZGVmaW5lZCkgIT09IGhhc0FwcFJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ2FwcFJvb3QgbXVzdCBiZSBlaXRoZXIgYmUgcHJlc2VudCBvciBhYnNlbnQgYWNyb3NzIGFsbCBjdXN0b20gcmVzcG9uc2UgaGVhZGVycycsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlSW5kZW50YXRpb24gPSAnICcucmVwZWF0KGhhc0FwcFJvb3QgPyA2IDogMik7XG4gICAgaWYgKGhhc0FwcFJvb3QpIHtcbiAgICAgIHlhbWwucHVzaChgICAtIGFwcFJvb3Q6ICR7Y3VzdG9tSGVhZGVyLmFwcFJvb3R9YCk7XG4gICAgICB5YW1sLnB1c2goJyAgICBjdXN0b21IZWFkZXJzOicpO1xuICAgIH1cbiAgICB5YW1sLnB1c2goYCR7YmFzZUluZGVudGF0aW9ufS0gcGF0dGVybjogXCIke2N1c3RvbUhlYWRlci5wYXR0ZXJufVwiYCk7XG4gICAgeWFtbC5wdXNoKGAke2Jhc2VJbmRlbnRhdGlvbn0gIGhlYWRlcnM6YCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY3VzdG9tSGVhZGVyLmhlYWRlcnMpKSB7XG4gICAgICB5YW1sLnB1c2goYCR7YmFzZUluZGVudGF0aW9ufSAgICAtIGtleTogXCIke2tleX1cImApO1xuICAgICAgeWFtbC5wdXNoKGAke2Jhc2VJbmRlbnRhdGlvbn0gICAgICB2YWx1ZTogXCIke3ZhbHVlfVwiYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGAke3lhbWwuam9pbignXFxuJyl9XFxuYDtcbn1cblxuLyoqXG4gKiBBdmFpbGFibGUgaG9zdGluZyBwbGF0Zm9ybXMgdG8gdXNlIG9uIHRoZSBBcHAuXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgLyoqXG4gICAqIFdFQiAtIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYXBwIGlzIGhvc3RlZCB1c2luZyBvbmx5IHN0YXRpYyBhc3NldHMuXG4gICAqL1xuICBXRUIgPSAnV0VCJyxcblxuICAvKipcbiAgICogV0VCX0NPTVBVVEUgLSBVc2VkIHRvIGluZGljYXRlIHRoZSBhcHAgaXMgaG9zdGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2ZcbiAgICogc2VydmVyIHNpZGUgcmVuZGVyZWQgYW5kIHN0YXRpYyBhc3NldHMuXG4gICAqL1xuICBXRUJfQ09NUFVURSA9ICdXRUJfQ09NUFVURScsXG5cbiAgLyoqXG4gICAqIFdFQl9EWU5BTUlDIC0gVXNlZCB0byBpbmRpY2F0ZSB0aGUgYXBwIGlzIGhvc3RlZCB1c2luZyBhIGZ1bGx5IGR5bmFtaWMgYXJjaGl0ZWN0dXJlLCB3aGVyZSByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkIGF0IHJ1bnRpbWUgYnkgYmFja2VuZCBjb21wdXRlIHNlcnZpY2VzLlxuICAgKi9cbiAgV0VCX0RZTkFNSUMgPSAnV0VCX0RZTkFNSUMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGNhY2hlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBhbiBBbXBsaWZ5IGFwcC5cbiAqL1xuZXhwb3J0IGVudW0gQ2FjaGVDb25maWdUeXBlIHtcbiAgLyoqXG4gICAqIEFNUExJRllfTUFOQUdFRCAtIEF1dG9tYXRpY2FsbHkgYXBwbGllcyBhbiBvcHRpbWl6ZWQgY2FjaGUgY29uZmlndXJhdGlvblxuICAgKiBmb3IgeW91ciBhcHAgYmFzZWQgb24gaXRzIHBsYXRmb3JtLCByb3V0aW5nIHJ1bGVzLCBhbmQgcmV3cml0ZSBydWxlcy5cbiAgICovXG4gIEFNUExJRllfTUFOQUdFRCA9ICdBTVBMSUZZX01BTkFHRUQnLFxuXG4gIC8qKlxuICAgKiBBTVBMSUZZX01BTkFHRURfTk9fQ09PS0lFUyAtIFRoZSBzYW1lIGFzIEFNUExJRllfTUFOQUdFRCxcbiAgICogZXhjZXB0IHRoYXQgaXQgZXhjbHVkZXMgYWxsIGNvb2tpZXMgZnJvbSB0aGUgY2FjaGUga2V5LlxuICAgKi9cbiAgQU1QTElGWV9NQU5BR0VEX05PX0NPT0tJRVMgPSAnQU1QTElGWV9NQU5BR0VEX05PX0NPT0tJRVMnLFxufVxuIl19