@codedrifters/configulator 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +761 -1
  3. package/lib/aws/aws-deployment-config.d.ts +45 -108
  4. package/lib/aws/aws-deployment-config.js +69 -100
  5. package/lib/aws/aws-deployment-target.d.ts +210 -0
  6. package/lib/aws/aws-deployment-target.js +202 -0
  7. package/lib/aws/index.d.ts +1 -1
  8. package/lib/aws/index.js +2 -2
  9. package/lib/index.d.ts +9 -0
  10. package/lib/index.js +26 -0
  11. package/lib/jsii/index.d.ts +1 -0
  12. package/lib/jsii/index.js +18 -0
  13. package/lib/jsii/jsii-faker.d.ts +47 -0
  14. package/lib/jsii/jsii-faker.js +103 -0
  15. package/lib/pnpm/pnpm-workspace.d.ts +240 -1
  16. package/lib/pnpm/pnpm-workspace.js +155 -15
  17. package/lib/projects/index.d.ts +2 -0
  18. package/lib/projects/index.js +19 -0
  19. package/lib/projects/monorepo-project.d.ts +50 -0
  20. package/lib/projects/monorepo-project.js +203 -0
  21. package/lib/projects/typescript-project.d.ts +4 -0
  22. package/lib/projects/typescript-project.js +150 -0
  23. package/lib/turbo/turbo-repo.d.ts +116 -9
  24. package/lib/turbo/turbo-repo.js +107 -20
  25. package/lib/versions.d.ts +19 -7
  26. package/lib/versions.js +20 -8
  27. package/lib/vscode/vscode.js +2 -1
  28. package/lib/workflows/aws-deploy-workflow.d.ts +84 -0
  29. package/lib/workflows/aws-deploy-workflow.js +312 -0
  30. package/lib/workflows/index.d.ts +1 -2
  31. package/lib/workflows/index.js +2 -3
  32. package/package.json +21 -20
  33. package/lib/workflows/build-workflow.d.ts +0 -13
  34. package/lib/workflows/build-workflow.js +0 -64
  35. package/lib/workflows/deploy-workflow.d.ts +0 -17
  36. package/lib/workflows/deploy-workflow.js +0 -113
  37. package/lib/workflows/steps/deploy.d.ts +0 -4
  38. package/lib/workflows/steps/deploy.js +0 -62
@@ -1,141 +1,78 @@
1
- import { Component, Project } from "projen";
2
- import { TypeScriptAppProject } from "projen/lib/typescript";
3
- import { GitBranch } from "../git/git-types";
1
+ import { Component } from "projen";
2
+ import { AwsCdkTypeScriptApp } from "projen/lib/awscdk";
3
+ import { AwsDeploymentTarget } from "./aws-deployment-target";
4
4
  /*******************************************************************************
5
5
  *
6
+ * AWS Deployment Configuration
7
+ *
8
+ * This component allows configuration of multiple AWS deployment
9
+ * targets, each with its own account, region, and deployment type
10
+ * (dev, stage, prod). It supports both local and CI deployments,
11
+ * with customizable settings for each target.
6
12
  *
7
13
  ******************************************************************************/
8
- export interface AwsDeploymentConfigOptions {
9
- }
10
- export declare const AWS_DEPLOY_TYPE: {
11
- /**
12
- * Development environment, typically used for testing and development.
13
- */
14
- readonly DEV: "dev";
15
- /**
16
- * Staging environment, used for pre-production testing.
17
- */
18
- readonly STAGE: "stage";
19
- /**
20
- * Production environment, used for live deployments.
21
- */
22
- readonly PROD: "prod";
23
- };
24
- /**
25
- * Above const as a type.
26
- */
27
- export type AwsDeploymentType = (typeof AWS_DEPLOY_TYPE)[keyof typeof AWS_DEPLOY_TYPE];
28
- /**
29
- * Represents the configuration for local deployment in AWS.
30
- */
31
- export interface AwsLocalDeploymentConfig {
32
- /**
33
- * The AWS profile (in ~/.aws/config) to use for local deployment.
34
- *
35
- * @default generated dynamically based role name, account and region
36
- */
37
- profile?: string;
38
- /**
39
- * Named Role used to conduct local deployments.
40
- *
41
- * @default "administratoraccess"
42
- */
43
- roleName?: string;
44
- }
45
- export interface CiDeploymentConfig {
46
- /**
47
- * The OIDC IAM Role to assume for CI deployments.
48
- */
49
- roleArn: string;
50
- }
51
- /**
52
- * Represents a deployment target in AWS, including account and region, and
53
- * branches allowed to deploy to this target.
54
- */
55
- export interface AwsDeploymentTarget {
56
- /**
57
- * The account name for the deployment target.
58
- */
59
- account: string;
60
- /**
61
- * The AWS region for the deployment target.
62
- */
63
- region: string;
64
- /**'
65
- * AWS deployment type, such as dev, stage, or prod.
66
- */
67
- awsDeploymentType: AwsDeploymentType;
68
- /**
69
- * The AWS profile to use for this deployment target.
70
- */
71
- branches: Array<GitBranch>;
72
- /**
73
- * Can this deployment target be used for local development?
74
- */
75
- localDeployment: boolean;
76
- /**
77
- * Configuration when deploying to this target locally.
78
- */
79
- localDeploymentConfig?: AwsLocalDeploymentConfig;
80
- /**
81
- * Can this deployment target be used in CI deployments?
82
- */
83
- ciDeployment: boolean;
84
- ciDeploymentConfig?: CiDeploymentConfig;
85
- }
86
14
  export declare class AwsDeploymentConfig extends Component {
87
- static of(project: Project): Array<AwsDeploymentConfig> | undefined;
15
+ static of(project: AwsCdkTypeScriptApp): AwsDeploymentConfig | undefined;
88
16
  /**
89
17
  * Environment variables to be injected into all tasks.
90
18
  */
91
- private readonly env;
19
+ readonly env: Record<string, string>;
92
20
  /**
93
21
  * The relative path to the project directory from the root of the project.
94
22
  */
95
- private readonly projectPath;
23
+ readonly projectPath: string;
96
24
  /**
97
25
  * The relative path to the root of the project from the output directory.
98
26
  */
99
- private readonly rootPath;
27
+ readonly rootPath: string;
100
28
  /**
101
- * The output directory for the CDK synthesis.
29
+ * The output directory for the CDK synthesis, from the root directory.
102
30
  */
103
- private readonly cdkOut;
31
+ readonly rootCdkOut: string;
104
32
  /**
105
- * Array of targets for deployment.
33
+ * The output directory for the CDK synthesis.
106
34
  */
107
- readonly deploymentTargets: Array<AwsDeploymentTarget>;
108
- constructor(project: TypeScriptAppProject);
35
+ readonly cdkOut: string;
109
36
  /**
110
- * Adds a deployment target to the configuration.
111
- *
112
- * @param target The deployment target to add.
37
+ * Array of targets for deployment.
113
38
  */
114
- addDeploymentTarget(target: AwsDeploymentTarget): void;
39
+ readonly awsDeploymentTargets: Array<AwsDeploymentTarget>;
40
+ constructor(project: AwsCdkTypeScriptApp);
115
41
  /*****************************************************************************
116
42
  *
117
- * Synth Tasks
43
+ * Target filter helpers
118
44
  *
119
- * - Configure synth task to use the branch name
120
- * - Change the output location for easier workflows.
45
+ * Return various targets for deployment scripts to use.
121
46
  *
122
47
  ****************************************************************************/
123
- private configureSynthTask;
124
- /*****************************************************************************
125
- *
126
- * Deploy Tasks
48
+ /**
49
+ * @returns All production deployment targets.
50
+ */
51
+ get prodTargets(): Array<AwsDeploymentTarget>;
52
+ get prodTargetsForCI(): Array<AwsDeploymentTarget>;
53
+ get prodTargetsForLocal(): Array<AwsDeploymentTarget>;
54
+ /**
127
55
  *
128
- * - If local deploy, add a deploy task.
56
+ * @returns All stage deployment targets.
57
+ */
58
+ get stageTargets(): Array<AwsDeploymentTarget>;
59
+ get stageTargetsForCI(): Array<AwsDeploymentTarget>;
60
+ get stageTargetsForLocal(): Array<AwsDeploymentTarget>;
61
+ /**
129
62
  *
130
- ****************************************************************************/
131
- private configureDeployTask;
63
+ * @returns All dev deployment targets.
64
+ */
65
+ get devTargets(): Array<AwsDeploymentTarget>;
66
+ get devTargetsForCI(): Array<AwsDeploymentTarget>;
67
+ get devTargetsForLocal(): Array<AwsDeploymentTarget>;
132
68
  /*****************************************************************************
133
69
  *
134
- * Watch tasks
70
+ * Synth Tasks
135
71
  *
136
- * - Configure watch task to use the branch name
137
- * - configure watch task to use the correct synth output location.
72
+ * - Configure synth task to use the branch name
73
+ * - Change the output location for easier workflows.
138
74
  *
139
75
  ****************************************************************************/
140
- private configureWatchTask;
76
+ private configureSynthTask;
77
+ preSynthesize(): void;
141
78
  }
@@ -1,33 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AwsDeploymentConfig = exports.AWS_DEPLOY_TYPE = void 0;
3
+ exports.AwsDeploymentConfig = void 0;
4
4
  const node_path_1 = require("node:path");
5
5
  const projen_1 = require("projen");
6
- exports.AWS_DEPLOY_TYPE = {
7
- /**
8
- * Development environment, typically used for testing and development.
9
- */
10
- DEV: "dev",
11
- /**
12
- * Staging environment, used for pre-production testing.
13
- */
14
- STAGE: "stage",
15
- /**
16
- * Production environment, used for live deployments.
17
- */
18
- PROD: "prod",
19
- };
6
+ const aws_deployment_target_1 = require("./aws-deployment-target");
7
+ const turbo_1 = require("../turbo");
8
+ /*******************************************************************************
9
+ *
10
+ * AWS Deployment Configuration
11
+ *
12
+ * This component allows configuration of multiple AWS deployment
13
+ * targets, each with its own account, region, and deployment type
14
+ * (dev, stage, prod). It supports both local and CI deployments,
15
+ * with customizable settings for each target.
16
+ *
17
+ ******************************************************************************/
18
+ /*
19
+ export interface AwsDeploymentConfigOptions {}
20
+ */
20
21
  class AwsDeploymentConfig extends projen_1.Component {
21
22
  static of(project) {
22
23
  const isDefined = (c) => c instanceof AwsDeploymentConfig;
23
- return project.components.filter(isDefined);
24
+ return project.components.find(isDefined);
24
25
  }
25
26
  constructor(project) {
26
27
  super(project);
27
28
  /**
28
29
  * Array of targets for deployment.
29
30
  */
30
- this.deploymentTargets = [];
31
+ this.awsDeploymentTargets = [];
31
32
  /*****************************************************************************
32
33
  *
33
34
  * Synth Tasks
@@ -46,51 +47,13 @@ class AwsDeploymentConfig extends projen_1.Component {
46
47
  .tryFind("synth:silent")
47
48
  ?.exec(`cdk synth -q --output ${this.cdkOut}`, { env: this.env });
48
49
  };
49
- /*****************************************************************************
50
- *
51
- * Deploy Tasks
52
- *
53
- * - If local deploy, add a deploy task.
54
- *
55
- ****************************************************************************/
56
- this.configureDeployTask = (target) => {
57
- if (target.localDeployment) {
58
- const taskName = ["deploy", target.account, target.region].join(":");
59
- const deployTask = this.project.tasks.addTask(taskName, {
60
- env: this.env,
61
- });
62
- deployTask.exec(`cdk deploy --lookups=false --require-approval=never --profile=${target.localDeploymentConfig?.profile} --app=${this.cdkOut} "*-${target.account}-${target.region}"`);
63
- }
64
- };
65
- /*****************************************************************************
66
- *
67
- * Watch tasks
68
- *
69
- * - Configure watch task to use the branch name
70
- * - configure watch task to use the correct synth output location.
71
- *
72
- ****************************************************************************/
73
- this.configureWatchTask = (target) => {
74
- if (target.localDeployment) {
75
- const taskName = ["watch", target.account, target.region].join(":");
76
- const watchTask = this.project.tasks.addTask(taskName, { env: this.env });
77
- // update the synth first
78
- const synthSilent = this.project.tasks.tryFind("synth:silent");
79
- if (synthSilent) {
80
- watchTask.spawn(synthSilent);
81
- }
82
- // do a normal deploy
83
- watchTask.exec(`cdk deploy --lookups=false --require-approval=never --profile=${target.localDeploymentConfig?.profile} --app=${this.cdkOut} "*-${target.account}-${target.region}"`);
84
- // watch for changes and log output
85
- watchTask.exec(`cdk watch --lookups=false --require-approval=never --hotswap --profile=${target.localDeploymentConfig?.profile} "*-${target.account}-${target.region}"`);
86
- }
87
- };
88
50
  /**
89
51
  * Common variables used across tasks.
90
52
  */
91
53
  this.env = { GIT_BRANCH: "$(git branch --show-current)" };
92
54
  this.projectPath = (0, node_path_1.relative)(project.root.outdir, project.outdir);
93
55
  this.rootPath = (0, node_path_1.relative)(project.outdir, project.root.outdir);
56
+ this.rootCdkOut = (0, node_path_1.join)("dist", this.projectPath, "cdk.out");
94
57
  this.cdkOut = (0, node_path_1.join)(this.rootPath, "dist", this.projectPath, "cdk.out");
95
58
  /**
96
59
  * Reset some tasks we will rebuild below.
@@ -110,56 +73,62 @@ class AwsDeploymentConfig extends projen_1.Component {
110
73
  */
111
74
  this.configureSynthTask();
112
75
  }
76
+ /*****************************************************************************
77
+ *
78
+ * Target filter helpers
79
+ *
80
+ * Return various targets for deployment scripts to use.
81
+ *
82
+ ****************************************************************************/
83
+ /**
84
+ * @returns All production deployment targets.
85
+ */
86
+ get prodTargets() {
87
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.PROD);
88
+ }
89
+ get prodTargetsForCI() {
90
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.PROD && target.ciDeployment);
91
+ }
92
+ get prodTargetsForLocal() {
93
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.PROD && target.localDeployment);
94
+ }
113
95
  /**
114
- * Adds a deployment target to the configuration.
115
96
  *
116
- * @param target The deployment target to add.
97
+ * @returns All stage deployment targets.
117
98
  */
118
- addDeploymentTarget(target) {
119
- /***************************************************************************
120
- *
121
- * Configure the deploy target.
122
- *
123
- * - For local deployments, discover or build profile name.
124
- * - For CI deployments, discover or build role ARN.
125
- * - Add the target to the deployment targets array.
126
- *
127
- **************************************************************************/
128
- /**
129
- * Some defaults for local deployments.
130
- */
131
- if (target.localDeployment) {
132
- const roleName = target.localDeploymentConfig?.roleName?.toLowerCase() ||
133
- "administratoraccess";
134
- const profile = target.localDeploymentConfig?.profile ||
135
- `${roleName}-${target.account}-${target.region}`;
136
- target = {
137
- ...target,
138
- localDeploymentConfig: {
139
- profile,
140
- roleName,
141
- },
142
- };
143
- }
99
+ get stageTargets() {
100
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.STAGE);
101
+ }
102
+ get stageTargetsForCI() {
103
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.STAGE && target.ciDeployment);
104
+ }
105
+ get stageTargetsForLocal() {
106
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.STAGE && target.localDeployment);
107
+ }
108
+ /**
109
+ *
110
+ * @returns All dev deployment targets.
111
+ */
112
+ get devTargets() {
113
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.DEV);
114
+ }
115
+ get devTargetsForCI() {
116
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.DEV && target.ciDeployment);
117
+ }
118
+ get devTargetsForLocal() {
119
+ return this.awsDeploymentTargets.filter((target) => target.awsStageType === aws_deployment_target_1.AWS_STAGE_TYPE.DEV && target.localDeployment);
120
+ }
121
+ preSynthesize() {
122
+ super.preSynthesize();
144
123
  /**
145
- * Some defaults for CI deployments.
124
+ * If turbo's active we should ensure the post compile task
125
+ * is configured to consider the cdk output directory in it's root location.
146
126
  */
147
- if (target.ciDeployment) {
148
- const roleArn = target.ciDeploymentConfig?.roleArn ||
149
- `arn:aws:iam::${target.account}:role/GitHub${this.project.name.replace("-", "")}`;
150
- target = {
151
- ...target,
152
- ciDeploymentConfig: {
153
- roleArn,
154
- },
155
- };
127
+ if (turbo_1.TurboRepo.of(this.project)) {
128
+ const turbo = turbo_1.TurboRepo.of(this.project);
129
+ turbo.postCompileTask?.outputs.push((0, node_path_1.join)(this.cdkOut, "**"));
156
130
  }
157
- this.deploymentTargets.push(target);
158
- // Deploy tasks are configured per target.
159
- this.configureDeployTask(target);
160
- // Watch tasks are configured per target.
161
- this.configureWatchTask(target);
162
131
  }
163
132
  }
164
133
  exports.AwsDeploymentConfig = AwsDeploymentConfig;
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlcGxveW1lbnQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3MtZGVwbG95bWVudC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTJDO0FBQzNDLG1DQUE0QztBQWUvQixRQUFBLGVBQWUsR0FBRztJQUM3Qjs7T0FFRztJQUNILEdBQUcsRUFBRSxLQUFLO0lBRVY7O09BRUc7SUFDSCxLQUFLLEVBQUUsT0FBTztJQUVkOztPQUVHO0lBQ0gsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBaUZYLE1BQWEsbUJBQW9CLFNBQVEsa0JBQVM7SUFDekMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFnQjtRQUMvQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQVksRUFBNEIsRUFBRSxDQUMzRCxDQUFDLFlBQVksbUJBQW1CLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBMkJELFlBQVksT0FBNkI7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTmpCOztXQUVHO1FBQ2Esc0JBQWlCLEdBQStCLEVBQUUsQ0FBQztRQWdHbkU7Ozs7Ozs7c0ZBTzhFO1FBRXRFLHVCQUFrQixHQUFHLEdBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2lCQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ2pCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFakUsSUFBSSxD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TyxHQUNYLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUNsQyxnQkFBZ0IsTUFBTSxDQUFDLE9BQU8sZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFcEYsTUFBTSxHQUFHO2dCQUNQLEdBQUcsTUFBTTtnQkFDVCxrQkFBa0IsRUFBRTtvQkFDbEIsT0FBTztpQkFDUjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpDLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQTBFRjtBQXRNRCxrREFzTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbXBvbmVudCwgUHJvamVjdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IFR5cGVTY3JpcHRBcHBQcm9qZWN0IH0gZnJvbSBcInByb2plbi9saWIvdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgR2l0QnJhbmNoIH0gZnJvbSBcIi4uL2dpdC9naXQtdHlwZXNcIjtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXG4gKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGludGVyZmFjZSBBd3NEZXBsb3ltZW50Q29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKlxuICAgKi9cbn1cblxuZXhwb3J0IGNvbnN0IEFXU19ERVBMT1lfVFlQRSA9IHtcbiAgLyoqXG4gICAqIERldmVsb3BtZW50IGVudmlyb25tZW50LCB0eXBpY2FsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGV2ZWxvcG1lbnQuXG4gICAqL1xuICBERVY6IFwiZGV2XCIsXG5cbiAgLyoqXG4gICAqIFN0YWdpbmcgZW52aXJvbm1lbnQsIHVzZWQgZm9yIHByZS1wcm9kdWN0aW9uIHRlc3RpbmcuXG4gICAqL1xuICBTVEFHRTogXCJzdGFnZVwiLFxuXG4gIC8qKlxuICAgKiBQcm9kdWN0aW9uIGVudmlyb25tZW50LCB1c2VkIGZvciBsaXZlIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgUFJPRDogXCJwcm9kXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEFib3ZlIGNvbnN0IGFzIGEgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXdzRGVwbG95bWVudFR5cGUgPVxuICAodHlwZW9mIEFXU19ERVBMT1lfVFlQRSlba2V5b2YgdHlwZW9mIEFXU19ERVBMT1lfVFlQRV07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgZGVwbG95bWVudCBpbiBBV1MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzTG9jYWxEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSAoaW4gfi8uYXdzL2NvbmZpZykgdG8gdXNlIGZvciBsb2NhbCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgYmFzZWQgcm9sZSBuYW1lLCBhY2NvdW50IGFuZCByZWdpb25cbiAgICovXG4gIHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVkIFJvbGUgdXNlZCB0byBjb25kdWN0IGxvY2FsIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImFkbWluaXN0cmF0b3JhY2Nlc3NcIlxuICAgKi9cbiAgcm9sZU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2lEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBPSURDIElBTSBSb2xlIHRvIGFzc3VtZSBmb3IgQ0kgZGVwbG95bWVudHMuXG4gICAqL1xuICByb2xlQXJuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRlcGxveW1lbnQgdGFyZ2V0IGluIEFXUywgaW5jbHVkaW5nIGFjY291bnQgYW5kIHJlZ2lvbiwgYW5kXG4gKiBicmFuY2hlcyBhbGxvd2VkIHRvIGRlcGxveSB0byB0aGlzIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NEZXBsb3ltZW50VGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IG5hbWUgZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldC5cbiAgICovXG4gIGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyByZWdpb24gZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldC5cbiAgICovXG4gIHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKidcbiAgICogQVdTIGRlcGxveW1lbnQgdHlwZSwgc3VjaCBhcyBkZXYsIHN0YWdlLCBvciBwcm9kLlxuICAgKi9cbiAgYXdzRGVwbG95bWVudFR5cGU6IEF3c0RlcGxveW1lbnRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlIGZvciB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0LlxuICAgKi9cbiAgYnJhbmNoZXM6IEFycmF5PEdpdEJyYW5jaD47XG5cbiAgLyoqXG4gICAqIENhbiB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0IGJlIHVzZWQgZm9yIGxvY2FsIGRldmVsb3BtZW50P1xuICAgKi9cbiAgbG9jYWxEZXBsb3ltZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHdoZW4gZGVwbG95aW5nIHRvIHRoaXMgdGFyZ2V0IGxvY2FsbHkuXG4gICAqL1xuICBsb2NhbERlcGxveW1lbnRDb25maWc/OiBBd3NMb2NhbERlcGxveW1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIENhbiB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0IGJlIHVzZWQgaW4gQ0kgZGVwbG95bWVudHM/XG4gICAqL1xuICBjaURlcGxveW1lbnQ6IGJvb2xlYW47XG5cbiAgLypcbiAgICogQ29uZmlndXJhdGlvbiB3aGVuIGRlcGxveWluZyB0byB0aGlzIHRhcmdldCBpbiBDSS5cblxuICAgKi9cbiAgY2lEZXBsb3ltZW50Q29uZmlnPzogQ2lEZXBsb3ltZW50Q29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgQXdzRGVwbG95bWVudENvbmZpZyBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEFycmF5PEF3c0RlcGxveW1lbnRDb25maWc+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0RlZmluZWQgPSAoYzogQ29tcG9uZW50KTogYyBpcyBBd3NEZXBsb3ltZW50Q29uZmlnID0+XG4gICAgICBjIGluc3RhbmNlb2YgQXdzRGVwbG95bWVudENvbmZpZztcbiAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbHRlcihpc0RlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmplY3RlZCBpbnRvIGFsbCB0YXNrcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZnJvbSB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjZGtPdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgdGFyZ2V0cyBmb3IgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50VGFyZ2V0czogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBUeXBlU2NyaXB0QXBwUHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgLyoqXG4gICAgICogQ29tbW9uIHZhcmlhYmxlcyB1c2VkIGFjcm9zcyB0YXNrcy5cbiAgICAgKi9cbiAgICB0aGlzLmVudiA9IHsgR0lUX0JSQU5DSDogXCIkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpXCIgfTtcbiAgICB0aGlzLnByb2plY3RQYXRoID0gcmVsYXRpdmUocHJvamVjdC5yb290Lm91dGRpciwgcHJvamVjdC5vdXRkaXIpO1xuICAgIHRoaXMucm9vdFBhdGggPSByZWxhdGl2ZShwcm9qZWN0Lm91dGRpciwgcHJvamVjdC5yb290Lm91dGRpcik7XG4gICAgdGhpcy5jZGtPdXQgPSBqb2luKHRoaXMucm9vdFBhdGgsIFwiZGlzdFwiLCB0aGlzLnByb2plY3RQYXRoLCBcImNkay5vdXRcIik7XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBzb21lIHRhc2tzIHdlIHdpbGwgcmVidWlsZCBiZWxvdy5cbiAgICAgKi9cbiAgICBbXCJkZXBsb3lcIiwgXCJ3YXRjaFwiXS5mb3JFYWNoKCh0YXNrTmFtZSkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9IHByb2plY3QudGFza3MudHJ5RmluZCh0YXNrTmFtZSk7XG4gICAgICBpZiAodGFzaykge1xuICAgICAgICB0YXNrLnJlc2V0KCk7XG4gICAgICAgIHRhc2suc2F5KFxuICAgICAgICAgIFwiR2VuZXJpYyB0YXNrIGlzIGRpc2FibGVkLiBQbGVhc2UgdXNlIHRoZSBzcGVjaWZpYyB0YXNrIGZvciB5b3VyIGRlcGxveW1lbnQgdGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkZWZpbmUgU3ludGggaGVyZVxuICAgICAqXG4gICAgICogRGVwbG95IGFuZCB3YXRjaCBnZXQgcmVjb25maWd1cmVkIHBlciBkZXBsb3ltZW50IHRhcmdldC5cbiAgICAgKiBAc2VlIGFkZERlcGxveW1lbnRUYXJnZXQoKVxuICAgICAqL1xuICAgIHRoaXMuY29uZmlndXJlU3ludGhUYXNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRlcGxveW1lbnQgdGFyZ2V0IHRvIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBkZXBsb3ltZW50IHRhcmdldCB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwbG95bWVudFRhcmdldCh0YXJnZXQ6IEF3c0RlcGxveW1lbnRUYXJnZXQpOiB2b2lkIHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBDb25maWd1cmUgdGhlIGRlcGxveSB0YXJnZXQuXG4gICAgICpcbiAgICAgKiAtIEZvciBsb2NhbCBkZXBsb3ltZW50cywgZGlzY292ZXIgb3IgYnVpbGQgcHJvZmlsZSBuYW1lLlxuICAgICAqIC0gRm9yIENJIGRlcGxveW1lbnRzLCBkaXNjb3ZlciBvciBidWlsZCByb2xlIEFSTi5cbiAgICAgKiAtIEFkZCB0aGUgdGFyZ2V0IHRvIHRoZSBkZXBsb3ltZW50IHRhcmdldHMgYXJyYXkuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICAvKipcbiAgICAgKiBTb21lIGRlZmF1bHRzIGZvciBsb2NhbCBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICBpZiAodGFyZ2V0LmxvY2FsRGVwbG95bWVudCkge1xuICAgICAgY29uc3Qgcm9sZU5hbWUgPVxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50Q29uZmlnPy5yb2xlTmFtZT8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICBcImFkbWluaXN0cmF0b3JhY2Nlc3NcIjtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50Q29uZmlnPy5wcm9maWxlIHx8XG4gICAgICAgIGAke3JvbGVOYW1lfS0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259YDtcblxuICAgICAgdGFyZ2V0ID0ge1xuICAgICAgICAuLi50YXJnZXQsXG4gICAgICAgIGxvY2FsRGVwbG95bWVudENvbmZpZzoge1xuICAgICAgICAgIHByb2ZpbGUsXG4gICAgICAgICAgcm9sZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvbWUgZGVmYXVsdHMgZm9yIENJIGRlcGxveW1lbnRzLlxuICAgICAqL1xuICAgIGlmICh0YXJnZXQuY2lEZXBsb3ltZW50KSB7XG4gICAgICBjb25zdCByb2xlQXJuID1cbiAgICAgICAgdGFyZ2V0LmNpRGVwbG95bWVudENvbmZpZz8ucm9sZUFybiB8fFxuICAgICAgICBgYXJuOmF3czppYW06OiR7dGFyZ2V0LmFjY291bnR9OnJvbGUvR2l0SHViJHt0aGlzLnByb2plY3QubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKX1gO1xuXG4gICAgICB0YXJnZXQgPSB7XG4gICAgICAgIC4uLnRhcmdldCxcbiAgICAgICAgY2lEZXBsb3ltZW50Q29uZmlnOiB7XG4gICAgICAgICAgcm9sZUFybixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5kZXBsb3ltZW50VGFyZ2V0cy5wdXNoKHRhcmdldCk7XG5cbiAgICAvLyBEZXBsb3kgdGFza3MgYXJlIGNvbmZpZ3VyZWQgcGVyIHRhcmdldC5cbiAgICB0aGlzLmNvbmZpZ3VyZURlcGxveVRhc2sodGFyZ2V0KTtcblxuICAgIC8vIFdhdGNoIHRhc2tzIGFyZSBjb25maWd1cmVkIHBlciB0YXJnZXQuXG4gICAgdGhpcy5jb25maWd1cmVXYXRjaFRhc2sodGFyZ2V0KTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBTeW50aCBUYXNrc1xuICAgKlxuICAgKiAtIENvbmZpZ3VyZSBzeW50aCB0YXNrIHRvIHVzZSB0aGUgYnJhbmNoIG5hbWVcbiAgICogLSBDaGFuZ2UgdGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZWFzaWVyIHdvcmtmbG93cy5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBjb25maWd1cmVTeW50aFRhc2sgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoXCJzeW50aFwiKT8ucmVzZXQoYHJtIC1yZiAke3RoaXMuY2RrT3V0fWApO1xuICAgIHRoaXMucHJvamVjdC50YXNrc1xuICAgICAgLnRyeUZpbmQoXCJzeW50aFwiKVxuICAgICAgPy5leGVjKGBjZGsgc3ludGggLS1vdXRwdXQgJHt0aGlzLmNka091dH1gLCB7IGVudjogdGhpcy5lbnYgfSk7XG5cbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKT8ucmVzZXQoYHJtIC1yZiAke3RoaXMuY2RrT3V0fWApO1xuICAgIHRoaXMucHJvamVjdC50YXNrc1xuICAgICAgLnRyeUZpbmQoXCJzeW50aDpzaWxlbnRcIilcbiAgICAgID8uZXhlYyhgY2RrIHN5bnRoIC1xIC0tb3V0cHV0ICR7dGhpcy5jZGtPdXR9YCwgeyBlbnY6IHRoaXMuZW52IH0pO1xuICB9O1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBEZXBsb3kgVGFza3NcbiAgICpcbiAgICogLSBJZiBsb2NhbCBkZXBsb3ksIGFkZCBhIGRlcGxveSB0YXNrLlxuICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveVRhc2sgPSAodGFyZ2V0OiBBd3NEZXBsb3ltZW50VGFyZ2V0KTogdm9pZCA9PiB7XG4gICAgaWYgKHRhcmdldC5sb2NhbERlcGxveW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhc2tOYW1lID0gW1wiZGVwbG95XCIsIHRhcmdldC5hY2NvdW50LCB0YXJnZXQucmVnaW9uXS5qb2luKFwiOlwiKTtcbiAgICAgIGNvbnN0IGRlcGxveVRhc2sgPSB0aGlzLnByb2plY3QudGFza3MuYWRkVGFzayh0YXNrTmFtZSwge1xuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgfSk7XG4gICAgICBkZXBsb3lUYXNrLmV4ZWMoXG4gICAgICAgIGBjZGsgZGVwbG95IC0tbG9va3Vwcz1mYWxzZSAtLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXIgLS1wcm9maWxlPSR7dGFyZ2V0LmxvY2FsRGVwbG95bWVudENvbmZpZz8ucHJvZmlsZX0gLS1hcHA9JHt0aGlzLmNka091dH0gXCIqLSR7dGFyZ2V0LmFjY291bnR9LSR7dGFyZ2V0LnJlZ2lvbn1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICpcbiAgICogV2F0Y2ggdGFza3NcbiAgICpcbiAgICogLSBDb25maWd1cmUgd2F0Y2ggdGFzayB0byB1c2UgdGhlIGJyYW5jaCBuYW1lXG4gICAqIC0gY29uZmlndXJlIHdhdGNoIHRhc2sgdG8gdXNlIHRoZSBjb3JyZWN0IHN5bnRoIG91dHB1dCBsb2NhdGlvbi5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBjb25maWd1cmVXYXRjaFRhc2sgPSAodGFyZ2V0OiBBd3NEZXBsb3ltZW50VGFyZ2V0KTogdm9pZCA9PiB7XG4gICAgaWYgKHRhcmdldC5sb2NhbERlcGxveW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhc2tOYW1lID0gW1wid2F0Y2hcIiwgdGFyZ2V0LmFjY291bnQsIHRhcmdldC5yZWdpb25dLmpvaW4oXCI6XCIpO1xuICAgICAgY29uc3Qgd2F0Y2hUYXNrID0gdGhpcy5wcm9qZWN0LnRhc2tzLmFkZFRhc2sodGFza05hbWUsIHsgZW52OiB0aGlzLmVudiB9KTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBzeW50aCBmaXJzdFxuICAgICAgY29uc3Qgc3ludGhTaWxlbnQgPSB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKTtcbiAgICAgIGlmIChzeW50aFNpbGVudCkge1xuICAgICAgICB3YXRjaFRhc2suc3Bhd24oc3ludGhTaWxlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBhIG5vcm1hbCBkZXBsb3lcbiAgICAgIHdhdGNoVGFzay5leGVjKFxuICAgICAgICBgY2RrIGRlcGxveSAtLWxvb2t1cHM9ZmFsc2UgLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyIC0tcHJvZmlsZT0ke3RhcmdldC5sb2NhbERlcGxveW1lbnRDb25maWc/LnByb2ZpbGV9IC0tYXBwPSR7dGhpcy5jZGtPdXR9IFwiKi0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259XCJgLFxuICAgICAgKTtcblxuICAgICAgLy8gd2F0Y2ggZm9yIGNoYW5nZXMgYW5kIGxvZyBvdXRwdXRcbiAgICAgIHdhdGNoVGFzay5leGVjKFxuICAgICAgICBgY2RrIHdhdGNoIC0tbG9va3Vwcz1mYWxzZSAtLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXIgLS1ob3Rzd2FwIC0tcHJvZmlsZT0ke3RhcmdldC5sb2NhbERlcGxveW1lbnRDb25maWc/LnByb2ZpbGV9IFwiKi0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259XCJgLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG4iXX0=
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlcGxveW1lbnQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3MtZGVwbG95bWVudC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTJDO0FBQzNDLG1DQUFtQztBQUVuQyxtRUFBOEU7QUFDOUUsb0NBQXFDO0FBRXJDOzs7Ozs7Ozs7Z0ZBU2dGO0FBRWhGOztFQUVFO0FBRUYsTUFBYSxtQkFBb0IsU0FBUSxrQkFBUztJQUN6QyxNQUFNLENBQUMsRUFBRSxDQUNkLE9BQTRCO1FBRTVCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBWSxFQUE0QixFQUFFLENBQzNELENBQUMsWUFBWSxtQkFBbUIsQ0FBQztRQUNuQyxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFnQ0QsWUFBWSxPQUE0QjtRQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFOakI7O1dBRUc7UUFDYSx5QkFBb0IsR0FBK0IsRUFBRSxDQUFDO1FBNkd0RTs7Ozs7OztzRkFPOEU7UUFFdEUsdUJBQWtCLEdBQUcsR0FBUyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7aUJBQ2YsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDakIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUVqRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFB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QUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbkxELGtEQW1MQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gXCJwcm9qZW4vbGliL2F3c2Nka1wiO1xuaW1wb3J0IHsgQVdTX1NUQUdFX1RZUEUsIEF3c0RlcGxveW1lbnRUYXJnZXQgfSBmcm9tIFwiLi9hd3MtZGVwbG95bWVudC10YXJnZXRcIjtcbmltcG9ydCB7IFR1cmJvUmVwbyB9IGZyb20gXCIuLi90dXJib1wiO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcbiAqIEFXUyBEZXBsb3ltZW50IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBhbGxvd3MgY29uZmlndXJhdGlvbiBvZiBtdWx0aXBsZSBBV1MgZGVwbG95bWVudFxuICogdGFyZ2V0cywgZWFjaCB3aXRoIGl0cyBvd24gYWNjb3VudCwgcmVnaW9uLCBhbmQgZGVwbG95bWVudCB0eXBlXG4gKiAoZGV2LCBzdGFnZSwgcHJvZCkuIEl0IHN1cHBvcnRzIGJvdGggbG9jYWwgYW5kIENJIGRlcGxveW1lbnRzLFxuICogd2l0aCBjdXN0b21pemFibGUgc2V0dGluZ3MgZm9yIGVhY2ggdGFyZ2V0LlxuICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qXG5leHBvcnQgaW50ZXJmYWNlIEF3c0RlcGxveW1lbnRDb25maWdPcHRpb25zIHt9XG4qL1xuXG5leHBvcnQgY2xhc3MgQXdzRGVwbG95bWVudENvbmZpZyBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YoXG4gICAgcHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCxcbiAgKTogQXdzRGVwbG95bWVudENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNEZWZpbmVkID0gKGM6IENvbXBvbmVudCk6IGMgaXMgQXdzRGVwbG95bWVudENvbmZpZyA9PlxuICAgICAgYyBpbnN0YW5jZW9mIEF3c0RlcGxveW1lbnRDb25maWc7XG4gICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzRGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIGluamVjdGVkIGludG8gYWxsIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5IGZyb20gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb290UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIENESyBzeW50aGVzaXMsIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvb3RDZGtPdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka091dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiB0YXJnZXRzIGZvciBkZXBsb3ltZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBBcnJheTxBd3NEZXBsb3ltZW50VGFyZ2V0PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIC8qKlxuICAgICAqIENvbW1vbiB2YXJpYWJsZXMgdXNlZCBhY3Jvc3MgdGFza3MuXG4gICAgICovXG4gICAgdGhpcy5lbnYgPSB7IEdJVF9CUkFOQ0g6IFwiJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KVwiIH07XG4gICAgdGhpcy5wcm9qZWN0UGF0aCA9IHJlbGF0aXZlKHByb2plY3Qucm9vdC5vdXRkaXIsIHByb2plY3Qub3V0ZGlyKTtcbiAgICB0aGlzLnJvb3RQYXRoID0gcmVsYXRpdmUocHJvamVjdC5vdXRkaXIsIHByb2plY3Qucm9vdC5vdXRkaXIpO1xuICAgIHRoaXMucm9vdENka091dCA9IGpvaW4oXCJkaXN0XCIsIHRoaXMucHJvamVjdFBhdGgsIFwiY2RrLm91dFwiKTtcbiAgICB0aGlzLmNka091dCA9IGpvaW4odGhpcy5yb290UGF0aCwgXCJkaXN0XCIsIHRoaXMucHJvamVjdFBhdGgsIFwiY2RrLm91dFwiKTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHNvbWUgdGFza3Mgd2Ugd2lsbCByZWJ1aWxkIGJlbG93LlxuICAgICAqL1xuICAgIFtcImRlcGxveVwiLCBcIndhdGNoXCJdLmZvckVhY2goKHRhc2tOYW1lKSA9PiB7XG4gICAgICBjb25zdCB0YXNrID0gcHJvamVjdC50YXNrcy50cnlGaW5kKHRhc2tOYW1lKTtcbiAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgIHRhc2sucmVzZXQoKTtcbiAgICAgICAgdGFzay5zYXkoXG4gICAgICAgICAgXCJHZW5lcmljIHRhc2sgaXMgZGlzYWJsZWQuIFBsZWFzZSB1c2UgdGhlIHNwZWNpZmljIHRhc2sgZm9yIHlvdXIgZGVwbG95bWVudCB0YXJnZXQuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWRlZmluZSBTeW50aCBoZXJlXG4gICAgICpcbiAgICAgKiBEZXBsb3kgYW5kIHdhdGNoIGdldCByZWNvbmZpZ3VyZWQgcGVyIGRlcGxveW1lbnQgdGFyZ2V0LlxuICAgICAqIEBzZWUgYWRkRGVwbG95bWVudFRhcmdldCgpXG4gICAgICovXG4gICAgdGhpcy5jb25maWd1cmVTeW50aFRhc2soKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBUYXJnZXQgZmlsdGVyIGhlbHBlcnNcbiAgICpcbiAgICogUmV0dXJuIHZhcmlvdXMgdGFyZ2V0cyBmb3IgZGVwbG95bWVudCBzY3JpcHRzIHRvIHVzZS5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFsbCBwcm9kdWN0aW9uIGRlcGxveW1lbnQgdGFyZ2V0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZFRhcmdldHMoKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+IHRhcmdldC5hd3NTdGFnZVR5cGUgPT09IEFXU19TVEFHRV9UWVBFLlBST0QsXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByb2RUYXJnZXRzRm9yQ0koKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldC5hd3NTdGFnZVR5cGUgPT09IEFXU19TVEFHRV9UWVBFLlBST0QgJiYgdGFyZ2V0LmNpRGVwbG95bWVudCxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJvZFRhcmdldHNGb3JMb2NhbCgpOiBBcnJheTxBd3NEZXBsb3ltZW50VGFyZ2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuYXdzRGVwbG95bWVudFRhcmdldHMuZmlsdGVyKFxuICAgICAgKHRhcmdldCkgPT5cbiAgICAgICAgdGFyZ2V0LmF3c1N0YWdlVHlwZSA9PT0gQVdTX1NUQUdFX1RZUEUuUFJPRCAmJiB0YXJnZXQubG9jYWxEZXBsb3ltZW50LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgQWxsIHN0YWdlIGRlcGxveW1lbnQgdGFyZ2V0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhZ2VUYXJnZXRzKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PiB0YXJnZXQuYXdzU3RhZ2VUeXBlID09PSBBV1NfU1RBR0VfVFlQRS5TVEFHRSxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RhZ2VUYXJnZXRzRm9yQ0koKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldC5hd3NTdGFnZVR5cGUgPT09IEFXU19TVEFHRV9UWVBFLlNUQUdFICYmIHRhcmdldC5jaURlcGxveW1lbnQsXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHN0YWdlVGFyZ2V0c0ZvckxvY2FsKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzU3RhZ2VUeXBlID09PSBBV1NfU1RBR0VfVFlQRS5TVEFHRSAmJiB0YXJnZXQubG9jYWxEZXBsb3ltZW50LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgQWxsIGRldiBkZXBsb3ltZW50IHRhcmdldHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRldlRhcmdldHMoKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+IHRhcmdldC5hd3NTdGFnZVR5cGUgPT09IEFXU19TVEFHRV9UWVBFLkRFVixcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgZGV2VGFyZ2V0c0ZvckNJKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzU3RhZ2VUeXBlID09PSBBV1NfU1RBR0VfVFlQRS5ERVYgJiYgdGFyZ2V0LmNpRGVwbG95bWVudCxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgZGV2VGFyZ2V0c0ZvckxvY2FsKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzU3RhZ2VUeXBlID09PSBBV1NfU1RBR0VfVFlQRS5ERVYgJiYgdGFyZ2V0LmxvY2FsRGVwbG95bWVudCxcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqXG4gICAqIFN5bnRoIFRhc2tzXG4gICAqXG4gICAqIC0gQ29uZmlndXJlIHN5bnRoIHRhc2sgdG8gdXNlIHRoZSBicmFuY2ggbmFtZVxuICAgKiAtIENoYW5nZSB0aGUgb3V0cHV0IGxvY2F0aW9uIGZvciBlYXNpZXIgd29ya2Zsb3dzLlxuICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbmZpZ3VyZVN5bnRoVGFzayA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoXCIpPy5yZXNldChgcm0gLXJmICR7dGhpcy5jZGtPdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzXG4gICAgICAudHJ5RmluZChcInN5bnRoXCIpXG4gICAgICA/LmV4ZWMoYGNkayBzeW50aCAtLW91dHB1dCAke3RoaXMuY2RrT3V0fWAsIHsgZW52OiB0aGlzLmVudiB9KTtcblxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwic3ludGg6c2lsZW50XCIpPy5yZXNldChgcm0gLXJmICR7dGhpcy5jZGtPdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzXG4gICAgICAudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKVxuICAgICAgPy5leGVjKGBjZGsgc3ludGggLXEgLS1vdXRwdXQgJHt0aGlzLmNka091dH1gLCB7IGVudjogdGhpcy5lbnYgfSk7XG4gIH07XG5cbiAgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5wcmVTeW50aGVzaXplKCk7XG5cbiAgICAvKipcbiAgICAgKiBJZiB0dXJibydzIGFjdGl2ZSB3ZSBzaG91bGQgZW5zdXJlIHRoZSBwb3N0IGNvbXBpbGUgdGFza1xuICAgICAqIGlzIGNvbmZpZ3VyZWQgdG8gY29uc2lkZXIgdGhlIGNkayBvdXRwdXQgZGlyZWN0b3J5IGluIGl0J3Mgcm9vdCBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICBpZiAoVHVyYm9SZXBvLm9mKHRoaXMucHJvamVjdCkpIHtcbiAgICAgIGNvbnN0IHR1cmJvID0gVHVyYm9SZXBvLm9mKHRoaXMucHJvamVjdCkhO1xuICAgICAgdHVyYm8ucG9zdENvbXBpbGVUYXNrPy5vdXRwdXRzLnB1c2goam9pbih0aGlzLmNka091dCwgXCIqKlwiKSk7XG4gICAgfVxuICB9XG59XG4iXX0=