projen-cdktf-hybrid-construct 0.1.44 → 0.1.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +38 -7
- package/example/.gitattributes +0 -1
- package/example/.projenrc.ts +25 -6
- package/example/construct-examples/README.md +7 -0
- package/example/construct-examples/basic.ts +14 -0
- package/example/construct-examples/cdktf.json +5 -0
- package/example/construct-examples/cdktf.out/manifest.json +13 -0
- package/example/construct-examples/cdktf.out/stacks/basic-example/cdk.tf.json +18 -0
- package/example/construct-examples/index.ts +11 -0
- package/example/lib/__tests__/index-test.d.ts +1 -0
- package/example/lib/__tests__/index-test.js +16 -0
- package/example/modules/my-awesome-module/README.md +26 -1
- package/example/package.json +0 -1
- package/example/scripts/copy-modules.sh +7 -0
- package/lib/index.d.ts +8 -20
- package/lib/index.js +120 -114
- package/package.json +1 -1
- package/example/.pre-commit-config.yaml +0 -8
package/CHANGELOG.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.1.45
|
4
|
+
|
5
|
+
- _Breaking Change_: `terraformExamplesFolder`, `terraformProvider`, `terraformProvider*Config` are now part of `terraformExamples` and differently structured.
|
6
|
+
- Add documentation hook (using docker if `terraform-docs` is not enabled)
|
7
|
+
- Add terraform and construct example folders
|
8
|
+
- Add tests to the generated code
|
9
|
+
- Remove `pre-commit` hooks
|
package/README.md
CHANGED
@@ -18,13 +18,43 @@ const { HybridModule } = require("projen-cdktf-hybrid-construct");
|
|
18
18
|
|
19
19
|
const project = new HybridModule({
|
20
20
|
defaultReleaseBranch: "main",
|
21
|
-
name
|
21
|
+
// The name of the module & repository need to start with terraform-cdk-
|
22
|
+
name: "terraform-cdk-my-new-hybrid-construct",
|
23
|
+
repositoryUrl:
|
24
|
+
"github.com/DanielMSchmidt/terraform-cdk-my-new-hybrid-construct",
|
22
25
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
//
|
27
|
-
|
26
|
+
author: "Daniel Schmidt",
|
27
|
+
authorAddress: "danielmschmidt92@gmail.com",
|
28
|
+
|
29
|
+
// If enabled an example folder with terraform code will be created
|
30
|
+
terraformExamples: {
|
31
|
+
enabled: true,
|
32
|
+
folder: "terraform",
|
33
|
+
// The configuration to add to the example terraform file
|
34
|
+
providerConfig: `
|
35
|
+
terraform {
|
36
|
+
required_providers {
|
37
|
+
aws = {
|
38
|
+
source = "hashicorp/aws"
|
39
|
+
version = "~> 3.74"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
# Terraform binary version constraint
|
43
|
+
required_version = "~> 1.1.0"
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
provider "aws" {
|
48
|
+
region = "eu-central-1"
|
49
|
+
}
|
50
|
+
`,
|
51
|
+
},
|
52
|
+
|
53
|
+
// If enabled a constructs example folder will be created
|
54
|
+
constructExamples: {
|
55
|
+
enabled: true,
|
56
|
+
folder: "construct-examples",
|
57
|
+
},
|
28
58
|
});
|
29
59
|
project.synth();
|
30
60
|
```
|
@@ -35,7 +65,8 @@ project.synth();
|
|
35
65
|
- [x] Add example folder
|
36
66
|
- [x] Add `terraform` example folder
|
37
67
|
- [x] [Auto-generate parts of the docs](https://github.com/terraform-aws-modules/terraform-aws-eks/blob/e90c877a741ab3cc4215376a70f7bcc360b6a3d2/.github/workflows/pre-commit.yml)
|
38
|
-
- [
|
68
|
+
- [x] Add example folder to project using this
|
69
|
+
- [x] Add testing strategy
|
39
70
|
- [ ] Add deployment scripts to Artifactory
|
40
71
|
- [ ] Add deployment scripts to Github Packages
|
41
72
|
- [ ] Add construct / option / docs to publish existing module as construct
|
package/example/.gitattributes
CHANGED
@@ -12,7 +12,6 @@
|
|
12
12
|
/.gitignore linguist-generated
|
13
13
|
/.mergify.yml linguist-generated
|
14
14
|
/.npmignore linguist-generated
|
15
|
-
/.pre-commit-config.yaml linguist-generated
|
16
15
|
/.prettierignore linguist-generated
|
17
16
|
/.prettierrc.json linguist-generated
|
18
17
|
/.projen/** linguist-generated
|
package/example/.projenrc.ts
CHANGED
@@ -3,16 +3,35 @@ import { HybridModule } from "../lib";
|
|
3
3
|
const project = new HybridModule({
|
4
4
|
name: "my-module",
|
5
5
|
author: "Daniel Schmidt",
|
6
|
-
repository: "github.com/DanielMSchmidt/my-module",
|
7
6
|
defaultReleaseBranch: "main",
|
8
7
|
authorAddress: "danielmschmidt92@gmail.com",
|
9
8
|
repositoryUrl: "github.com/DanielMSchmidt/my-module",
|
10
9
|
outdir: ".",
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
terraformExamples: {
|
11
|
+
enabled: true,
|
12
|
+
folder: "terraform",
|
13
|
+
providerConfig: `
|
14
|
+
terraform {
|
15
|
+
# Limit provider version (some modules are not compatible with aws 4.x)
|
16
|
+
required_providers {
|
17
|
+
aws = {
|
18
|
+
source = "hashicorp/aws"
|
19
|
+
version = "~> 3.74"
|
20
|
+
}
|
21
|
+
}
|
22
|
+
# Terraform binary version constraint
|
23
|
+
required_version = "~> 1.1.0"
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
provider "aws" {
|
28
|
+
region = "eu-central-1"
|
29
|
+
}
|
30
|
+
`,
|
31
|
+
},
|
32
|
+
constructExamples: {
|
33
|
+
enabled: true,
|
34
|
+
folder: "construct-examples",
|
16
35
|
},
|
17
36
|
projectId: "my-project-id",
|
18
37
|
});
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { TerraformStack } from "cdktf";
|
2
|
+
import { Construct } from "constructs";
|
3
|
+
|
4
|
+
import { MyConstruct } from "../src/";
|
5
|
+
|
6
|
+
export class BasicExample extends TerraformStack {
|
7
|
+
constructor(scope: Construct, name: string) {
|
8
|
+
super(scope, name);
|
9
|
+
|
10
|
+
new MyConstruct(this, "my-construct", {
|
11
|
+
propertyA: "valueA",
|
12
|
+
});
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"version": "0.9.4",
|
3
|
+
"stacks": {
|
4
|
+
"basic-example": {
|
5
|
+
"name": "basic-example",
|
6
|
+
"constructPath": "basic-example",
|
7
|
+
"workingDirectory": "stacks/basic-example",
|
8
|
+
"synthesizedStackPath": "stacks/basic-example/cdk.tf.json",
|
9
|
+
"annotations": [],
|
10
|
+
"dependencies": []
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
"//": {
|
3
|
+
"metadata": {
|
4
|
+
"backend": "local",
|
5
|
+
"stackName": "basic-example",
|
6
|
+
"version": "0.9.4"
|
7
|
+
},
|
8
|
+
"outputs": {
|
9
|
+
}
|
10
|
+
},
|
11
|
+
"terraform": {
|
12
|
+
"backend": {
|
13
|
+
"local": {
|
14
|
+
"path": "/home/runner/work/projen-cdktf-hybrid-construct/projen-cdktf-hybrid-construct/example/construct-examples/terraform.basic-example.tfstate"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
// This file will be synthesized to check if all examples are working
|
2
|
+
|
3
|
+
import { App } from "cdktf";
|
4
|
+
// All examples need to be imported here
|
5
|
+
import { BasicExample } from "./basic";
|
6
|
+
|
7
|
+
const app = new App();
|
8
|
+
|
9
|
+
// All examples need to be initialized here
|
10
|
+
new BasicExample(app, "basic-example");
|
11
|
+
app.synth();
|
@@ -0,0 +1 @@
|
|
1
|
+
import "cdktf/lib/testing/adapters/jest";
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const cdktf_1 = require("cdktf");
|
4
|
+
require("cdktf/lib/testing/adapters/jest");
|
5
|
+
const __1 = require("../");
|
6
|
+
// To learn more about testing see cdk.tf/testing
|
7
|
+
describe("MyConstruct", () => {
|
8
|
+
it("should synthesize", () => {
|
9
|
+
expect(cdktf_1.Testing.synthScope((scope) => {
|
10
|
+
new __1.MyConstruct(scope, "my-construct", {
|
11
|
+
propertyA: "valueA",
|
12
|
+
});
|
13
|
+
})).toMatchSnapshot();
|
14
|
+
});
|
15
|
+
});
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgtdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFnQztBQUNoQywyQ0FBeUM7QUFDekMsMkJBQWtDO0FBRWxDLGlEQUFpRDtBQUNqRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FDSixlQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxlQUFXLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRTtnQkFDckMsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdGluZyB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IFwiY2RrdGYvbGliL3Rlc3RpbmcvYWRhcHRlcnMvamVzdFwiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi4vXCI7XG5cbi8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGVzdGluZyBzZWUgY2RrLnRmL3Rlc3RpbmdcbmRlc2NyaWJlKFwiTXlDb25zdHJ1Y3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBzeW50aGVzaXplXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBUZXN0aW5nLnN5bnRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgIG5ldyBNeUNvbnN0cnVjdChzY29wZSwgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7Il19
|
@@ -7,4 +7,29 @@ module "eks_managed_node_group" {
|
|
7
7
|
source = "DanielMSchmidt/my-module//modules/my-awesome-module"
|
8
8
|
|
9
9
|
}
|
10
|
-
```
|
10
|
+
```
|
11
|
+
<!-- BEGIN_TF_DOCS -->
|
12
|
+
## Requirements
|
13
|
+
|
14
|
+
No requirements.
|
15
|
+
|
16
|
+
## Providers
|
17
|
+
|
18
|
+
No providers.
|
19
|
+
|
20
|
+
## Modules
|
21
|
+
|
22
|
+
No modules.
|
23
|
+
|
24
|
+
## Resources
|
25
|
+
|
26
|
+
No resources.
|
27
|
+
|
28
|
+
## Inputs
|
29
|
+
|
30
|
+
No inputs.
|
31
|
+
|
32
|
+
## Outputs
|
33
|
+
|
34
|
+
No outputs.
|
35
|
+
<!-- END_TF_DOCS -->
|
package/example/package.json
CHANGED
@@ -20,7 +20,6 @@
|
|
20
20
|
"post-compile": "npx projen post-compile",
|
21
21
|
"post-upgrade": "npx projen post-upgrade",
|
22
22
|
"pre-compile": "npx projen pre-compile",
|
23
|
-
"precommit": "npx projen precommit",
|
24
23
|
"release": "npx projen release",
|
25
24
|
"test": "npx projen test",
|
26
25
|
"test:update": "npx projen test:update",
|
@@ -38,4 +38,11 @@ for d in */ ; do
|
|
38
38
|
mkdir -p "$TARGET_FOLDER/$dirname"
|
39
39
|
cp "$MODULES_FOLDER/$dirname/cdk.tf.json" "$TARGET_FOLDER/$dirname/cdk.tf.json"
|
40
40
|
cp "$SRC_FOLDER/$dirname.md" "$TARGET_FOLDER/$dirname/README.md"
|
41
|
+
|
42
|
+
# Add README hcl docs
|
43
|
+
if which terraform-docs >/dev/null; then
|
44
|
+
terraform-docs markdown table --output-file "$TARGET_FOLDER/$dirname/README.md" "$TARGET_FOLDER/$dirname"
|
45
|
+
else
|
46
|
+
docker run --rm --volume "$SCRIPTPATH/../modules:/terraform-docs" -u $(id -u) quay.io/terraform-docs/terraform-docs:0.16.0 markdown table --output-file "/terraform-docs/$dirname/README.md" /terraform-docs/$dirname
|
47
|
+
fi
|
41
48
|
done
|
package/lib/index.d.ts
CHANGED
@@ -1,29 +1,17 @@
|
|
1
1
|
import { ConstructLibrary, ConstructLibraryOptions } from "projen/lib/cdk";
|
2
|
-
declare type TerraformProviderAwsConfig = {
|
3
|
-
region: string;
|
4
|
-
requiredProviderVersion: string;
|
5
|
-
};
|
6
|
-
declare type TerraformProviderAzureConfig = {
|
7
|
-
location: string;
|
8
|
-
requiredProviderVersion: string;
|
9
|
-
resourceGroupName: string;
|
10
|
-
};
|
11
2
|
declare type HybridModuleOptions = ConstructLibraryOptions & {
|
12
3
|
cdktfVersion?: string;
|
13
4
|
constructVersion?: string;
|
14
|
-
repository: string;
|
15
5
|
author: string;
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
disableDocsHook?: boolean;
|
6
|
+
terraformExamples?: {
|
7
|
+
enabled: boolean;
|
8
|
+
folder?: string;
|
9
|
+
providerConfig?: string;
|
10
|
+
};
|
11
|
+
constructExamples?: {
|
12
|
+
enabled: boolean;
|
13
|
+
folder?: string;
|
25
14
|
};
|
26
|
-
additionalPrecommitHooks?: Record<string, any>[];
|
27
15
|
projectId?: string;
|
28
16
|
};
|
29
17
|
export declare class HybridModule extends ConstructLibrary {
|
package/lib/index.js
CHANGED
@@ -21,6 +21,25 @@ export class MyConstruct extends Construct {
|
|
21
21
|
super(scope, id);
|
22
22
|
}
|
23
23
|
}
|
24
|
+
`;
|
25
|
+
const constructTestCode = `
|
26
|
+
import { Testing } from "cdktf";
|
27
|
+
import "cdktf/lib/testing/adapters/jest";
|
28
|
+
import { MyConstruct } from "../";
|
29
|
+
|
30
|
+
// To learn more about testing see cdk.tf/testing
|
31
|
+
describe("MyConstruct", () => {
|
32
|
+
it("should synthesize", () => {
|
33
|
+
expect(
|
34
|
+
Testing.synthScope((scope) => {
|
35
|
+
new MyConstruct(scope, "my-construct", {
|
36
|
+
propertyA: "valueA",
|
37
|
+
});
|
38
|
+
})
|
39
|
+
).toMatchSnapshot();
|
40
|
+
});
|
41
|
+
});
|
42
|
+
|
24
43
|
`;
|
25
44
|
const moduleSrcCode = `
|
26
45
|
import { App } from "cdktf";
|
@@ -45,54 +64,6 @@ const app = new App();
|
|
45
64
|
new MyAwesomeModule(app, "my-awesome-module");
|
46
65
|
app.synth();
|
47
66
|
`;
|
48
|
-
const terraformAwsMainSrcCode = `
|
49
|
-
terraform {
|
50
|
-
# Limit provider version (some modules are not compatible with aws 4.x)
|
51
|
-
required_providers {
|
52
|
-
aws = {
|
53
|
-
source = "hashicorp/aws"
|
54
|
-
version = "~> __requiredProviderVersion__"
|
55
|
-
}
|
56
|
-
}
|
57
|
-
# Terraform binary version constraint
|
58
|
-
required_version = "~> 1.1.0"
|
59
|
-
}
|
60
|
-
|
61
|
-
|
62
|
-
provider "aws" {
|
63
|
-
region = "__region__"
|
64
|
-
}
|
65
|
-
`;
|
66
|
-
const terraformAzureMainSrcCode = `
|
67
|
-
# Configure the Azure provider
|
68
|
-
terraform {
|
69
|
-
required_providers {
|
70
|
-
azurerm = {
|
71
|
-
source = "hashicorp/azurerm"
|
72
|
-
version = "~> __requiredProviderVersion__"
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
required_version = ">= 1.1.0"
|
77
|
-
}
|
78
|
-
|
79
|
-
provider "azurerm" {
|
80
|
-
features {}
|
81
|
-
}
|
82
|
-
|
83
|
-
resource "azurerm_resource_group" "rg" {
|
84
|
-
name = "__resourceGroupName__"
|
85
|
-
location = "__location__"
|
86
|
-
}
|
87
|
-
`;
|
88
|
-
const terraformMainSrcCodeMap = {
|
89
|
-
aws: {
|
90
|
-
srcCode: terraformAwsMainSrcCode,
|
91
|
-
},
|
92
|
-
azure: {
|
93
|
-
srcCode: terraformAzureMainSrcCode,
|
94
|
-
},
|
95
|
-
};
|
96
67
|
const terraformReadmeDocs = `
|
97
68
|
# Please add here some pure HCL tests for your modules in order to test HCL Interoperability
|
98
69
|
|
@@ -124,20 +95,7 @@ class HybridModule extends cdk_1.ConstructLibrary {
|
|
124
95
|
eslintOptions: Object.assign({}, config.eslintOptions, {
|
125
96
|
lintProjenRc: false,
|
126
97
|
}),
|
127
|
-
postBuildSteps:
|
128
|
-
? [
|
129
|
-
{
|
130
|
-
id: "install-pre-commit",
|
131
|
-
name: "Install pre-commit hook",
|
132
|
-
run: "pip install pre-commit",
|
133
|
-
},
|
134
|
-
{
|
135
|
-
id: "documentation-precommit-hook",
|
136
|
-
name: "Documentation Pre-commit Hook",
|
137
|
-
run: "pre-commit run --all-files",
|
138
|
-
},
|
139
|
-
]
|
140
|
-
: [],
|
98
|
+
postBuildSteps: [],
|
141
99
|
});
|
142
100
|
const constructVersion = config.constructVersion || "^10.0.25";
|
143
101
|
const cdktfVersion = config.cdktfVersion || "^0.9.4";
|
@@ -154,7 +112,7 @@ class HybridModule extends cdk_1.ConstructLibrary {
|
|
154
112
|
|
155
113
|
\`\`\`hcl
|
156
114
|
module "eks_managed_node_group" {
|
157
|
-
source = "${((_a = config.
|
115
|
+
source = "${((_a = config.repositoryUrl) === null || _a === void 0 ? void 0 : _a.replace("https://github.com/", "").replace("http://github.com/", "").replace("github.com/", "")) || "my-github-repo"}//modules/my-awesome-module"
|
158
116
|
|
159
117
|
}
|
160
118
|
\`\`\`
|
@@ -172,35 +130,101 @@ module "eks_managed_node_group" {
|
|
172
130
|
output: "modules",
|
173
131
|
projectId: config.projectId || (0, uuid_1.v4)(),
|
174
132
|
}, null, 2),
|
133
|
+
"__tests__/index-test.ts": constructTestCode.trim(),
|
175
134
|
},
|
176
135
|
});
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
136
|
+
if (config.terraformExamples && config.terraformExamples.enabled) {
|
137
|
+
const providerConfig = config.terraformExamples.providerConfig ||
|
138
|
+
`
|
139
|
+
terraform {
|
140
|
+
# Terraform binary version constraint
|
141
|
+
required_version = "~> 1.1.0"
|
142
|
+
|
143
|
+
# Define all needed providers here, you can find all available providers here:
|
144
|
+
# https://registry.terraform.io/
|
145
|
+
required_providers {}
|
146
|
+
}
|
147
|
+
|
148
|
+
# Initialize your provider here
|
149
|
+
|
150
|
+
`.trim();
|
151
|
+
const examplesFolder = config.terraformExamples.folder || "terraform-examples";
|
152
|
+
new projen_1.SampleDir(this, examplesFolder, {
|
153
|
+
files: {
|
154
|
+
"main.tf": `
|
155
|
+
# Configure Terraform
|
156
|
+
${providerConfig}
|
157
|
+
|
158
|
+
`.trimStart(),
|
159
|
+
"README.md": terraformReadmeDocs.trim(),
|
160
|
+
},
|
161
|
+
});
|
162
|
+
this.gitignore.addPatterns(`${examplesFolder}/.terraform`, `${examplesFolder}/.terraform.lock.hcl`);
|
163
|
+
}
|
164
|
+
if (config.constructExamples && config.constructExamples.enabled) {
|
165
|
+
const constructExampleFolder = config.constructExamples.folder || "construct-examples";
|
166
|
+
const levels = constructExampleFolder
|
167
|
+
.split("/")
|
168
|
+
.map(() => "..")
|
169
|
+
.join("/");
|
170
|
+
const constructReadmeDocs = `
|
171
|
+
# Construct Examples
|
172
|
+
|
173
|
+
Example use-cases for the Construct library.
|
174
|
+
|
175
|
+
- [Basic Usage](./basic.ts)
|
176
|
+
|
177
|
+
To ensure all examples are working, please make sure the [index.ts](./index.ts) file is importing all of them.
|
178
|
+
`;
|
179
|
+
const constructExampleCode = `
|
180
|
+
import { TerraformStack } from "cdktf";
|
181
|
+
import { Construct } from "constructs";
|
182
|
+
|
183
|
+
import { MyConstruct } from "${levels}/src/";
|
184
|
+
|
185
|
+
export class BasicExample extends TerraformStack {
|
186
|
+
constructor(scope: Construct, name: string) {
|
187
|
+
super(scope, name);
|
188
|
+
|
189
|
+
new MyConstruct(this, "my-construct", {
|
190
|
+
propertyA: "valueA",
|
191
|
+
});
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
|
196
|
+
`;
|
197
|
+
const exampleCollectionCode = `
|
198
|
+
// This file will be synthesized to check if all examples are working
|
199
|
+
|
200
|
+
import { App } from "cdktf";
|
201
|
+
// All examples need to be imported here
|
202
|
+
import { BasicExample } from "./basic";
|
203
|
+
|
204
|
+
const app = new App();
|
205
|
+
|
206
|
+
// All examples need to be initialized here
|
207
|
+
new BasicExample(app, "basic-example");
|
208
|
+
app.synth();
|
209
|
+
`;
|
210
|
+
new projen_1.SampleDir(this, constructExampleFolder, {
|
211
|
+
files: {
|
212
|
+
"index.ts": exampleCollectionCode.trim(),
|
213
|
+
"basic.ts": constructExampleCode.trim(),
|
214
|
+
"cdktf.json": JSON.stringify({
|
215
|
+
language: "typescript",
|
216
|
+
app: "npx ts-node index.ts",
|
217
|
+
projectId: config.projectId || (0, uuid_1.v4)(),
|
218
|
+
}, null, 2),
|
219
|
+
"README.md": constructReadmeDocs.trim(),
|
220
|
+
},
|
221
|
+
});
|
222
|
+
this.testTask.exec(`cdktf synth`, {
|
223
|
+
cwd: constructExampleFolder,
|
224
|
+
});
|
225
|
+
this.gitignore.addPatterns(`${constructExampleFolder}/cdktf.out`);
|
192
226
|
}
|
193
|
-
Object.keys(configProperty).forEach((key) => {
|
194
|
-
mainTfFile = mainTfFile.replace(`__${key}__`, configProperty[key]);
|
195
|
-
});
|
196
|
-
new projen_1.SampleDir(this, config.terraformExamplesFolder, {
|
197
|
-
files: {
|
198
|
-
"main.tf": mainTfFile,
|
199
|
-
"README.md": terraformReadmeDocs.trim(),
|
200
|
-
},
|
201
|
-
});
|
202
227
|
this.gitignore.addPatterns("src/.gen", "src/cdktf.out", "src/modules");
|
203
|
-
this.gitignore.addPatterns(`${config.terraformExamplesFolder}/.terraform`, `${config.terraformExamplesFolder}/.terraform.lock.hcl`);
|
204
228
|
this.compileTask.prependExec("cdktf get", {
|
205
229
|
cwd: this.srcdir,
|
206
230
|
});
|
@@ -249,6 +273,13 @@ for d in */ ; do
|
|
249
273
|
mkdir -p "$TARGET_FOLDER/$dirname"
|
250
274
|
cp "$MODULES_FOLDER/$dirname/cdk.tf.json" "$TARGET_FOLDER/$dirname/cdk.tf.json"
|
251
275
|
cp "$SRC_FOLDER/$dirname.md" "$TARGET_FOLDER/$dirname/README.md"
|
276
|
+
|
277
|
+
# Add README hcl docs
|
278
|
+
if which terraform-docs >/dev/null; then
|
279
|
+
terraform-docs markdown table --output-file "$TARGET_FOLDER/$dirname/README.md" "$TARGET_FOLDER/$dirname"
|
280
|
+
else
|
281
|
+
docker run --rm --volume "$SCRIPTPATH/../modules:/terraform-docs" -u $(id -u) quay.io/terraform-docs/terraform-docs:0.16.0 markdown table --output-file "/terraform-docs/$dirname/README.md" /terraform-docs/$dirname
|
282
|
+
fi
|
252
283
|
done
|
253
284
|
`.trim());
|
254
285
|
this.compileTask.exec("./scripts/copy-modules.sh", {
|
@@ -268,32 +299,7 @@ terraform -chdir=terraform plan
|
|
268
299
|
`);
|
269
300
|
this.testTask.exec("./scripts/tf-module-test.sh");
|
270
301
|
(_c = this.jest) === null || _c === void 0 ? void 0 : _c.addIgnorePattern("terraform");
|
271
|
-
// Pre-commit hooks
|
272
|
-
if (config.documentationPrecommitHook !== false) {
|
273
|
-
const { additionalPrecommitHooks, documentationPrecommitHookOptions } = config;
|
274
|
-
const { version = "v1.70.1", disableDocsHook = false, disableFormatHook = false, } = documentationPrecommitHookOptions || {};
|
275
|
-
new projen_1.YamlFile(this, ".pre-commit-config.yaml", {
|
276
|
-
committed: true,
|
277
|
-
obj: {
|
278
|
-
repos: [
|
279
|
-
{
|
280
|
-
repo: "https://github.com/antonbabenko/pre-commit-terraform",
|
281
|
-
rev: version,
|
282
|
-
hooks: [
|
283
|
-
disableFormatHook ? null : { id: "terraform_fmt" },
|
284
|
-
disableDocsHook ? null : { id: "terraform_docs" },
|
285
|
-
].filter((item) => item !== null),
|
286
|
-
},
|
287
|
-
...(additionalPrecommitHooks !== null && additionalPrecommitHooks !== void 0 ? additionalPrecommitHooks : []),
|
288
|
-
],
|
289
|
-
},
|
290
|
-
});
|
291
|
-
this.tasks.addTask("precommit", {
|
292
|
-
description: "Runs precommit hooks",
|
293
|
-
exec: "pre-commit install",
|
294
|
-
});
|
295
|
-
}
|
296
302
|
}
|
297
303
|
}
|
298
304
|
exports.HybridModule = HybridModule;
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTJFO0FBQzNFLHdDQUEyRTtBQUMzRSwrQkFBa0M7QUFrQ2xDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsSUFBSTtJQUNoQixvQkFBb0IsRUFBRSxNQUFNO0NBQzdCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZeEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JyQixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpQi9CLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQmpDLENBQUM7QUFFRixNQUFNLHVCQUF1QixHQUEyQztJQUN0RSxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQztDQUNGLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHOzs7Ozs7Ozs7S0FTdkIsQ0FBQztBQUVOLE1BQU0sVUFBVyxTQUFRLGlCQUFRO0lBQy9CLFlBQVksT0FBZ0IsRUFBRSxJQUFZLEVBQVUsT0FBZTtRQUNqRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNuQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7UUFIK0MsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUluRSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsQ0FBWTtRQUN0QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBRUQsTUFBYSxZQUFhLFNBQVEsc0JBQWdCO0lBQ2hELFlBQVksTUFBMkI7O1FBQ3JDLEtBQUssQ0FB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QUFLLElBQUksQ0FBQzt5QkFDbEM7d0JBQ0QsR0FBRyxDQUFDLHdCQUF3QixhQUF4Qix3QkFBd0IsY0FBeEIsd0JBQXdCLEdBQUksRUFBRSxDQUFDO3FCQUNwQztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsV0FBVyxFQUFFLHNCQUFzQjtnQkFDbkMsSUFBSSxFQUFFLG9CQUFvQjthQUMzQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Q0FDRjtBQS9ORCxvQ0ErTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWxlQmFzZSwgSVJlc29sdmVyLCBQcm9qZWN0LCBTYW1wbGVEaXIsIFlhbWxGaWxlIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0TGlicmFyeSwgQ29uc3RydWN0TGlicmFyeU9wdGlvbnMgfSBmcm9tIFwicHJvamVuL2xpYi9jZGtcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG50eXBlIFRlcnJhZm9ybVByb3ZpZGVyQXdzQ29uZmlnID0ge1xuICByZWdpb246IHN0cmluZztcbiAgcmVxdWlyZWRQcm92aWRlclZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgVGVycmFmb3JtUHJvdmlkZXJBenVyZUNvbmZpZyA9IHtcbiAgbG9jYXRpb246IHN0cmluZztcbiAgcmVxdWlyZWRQcm92aWRlclZlcnNpb246IHN0cmluZztcbiAgcmVzb3VyY2VHcm91cE5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgSHlicmlkTW9kdWxlT3B0aW9ucyA9IENvbnN0cnVjdExpYnJhcnlPcHRpb25zICYge1xuICBjZGt0ZlZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHRlcnJhZm9ybUV4YW1wbGVzRm9sZGVyOiBzdHJpbmc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyOiBzdHJpbmc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyQXdzQ29uZmlnPzogVGVycmFmb3JtUHJvdmlkZXJBd3NDb25maWc7XG4gIHRlcnJhZm9ybVByb3ZpZGVyQXp1cmVDb25maWc/OiBUZXJyYWZvcm1Qcm92aWRlckF6dXJlQ29uZmlnO1xuICAvLyBSdW4gcHJlLWNvbW1pdCBob29rcyB1c2luZyBsb2NhbCBiaW5hcmllcyAvIG5vdCBhdCBhbGxcbiAgZG9jdW1lbnRhdGlvblByZWNvbW1pdEhvb2s/OiBib29sZWFuO1xuICBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnM/OiB7XG4gICAgdmVyc2lvbj86IHN0cmluZzsgLy8gR2V0IHRoZSBsYXRlc3QgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2FudG9uYmFiZW5rby9wcmUtY29tbWl0LXRlcnJhZm9ybS9yZWxlYXNlc1xuICAgIGRpc2FibGVGb3JtYXRIb29rPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRG9jc0hvb2s/OiBib29sZWFuO1xuICB9O1xuICBhZGRpdGlvbmFsUHJlY29tbWl0SG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gIC8vIERlZmF1bHRlZCB0byBhIHV1aWQgc3RyaW5nIGFzIGNka3RmIHdvdWxkXG4gIHByb2plY3RJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBwcmV0dGllcjogdHJ1ZSxcbiAgcHJvamVucmNUczogdHJ1ZSxcbiAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IFwibWFpblwiLFxufTtcblxuY29uc3QgY29uc3RydWN0U3JjQ29kZSA9IGBcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXlDb25zdHJ1Y3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvcGVydHlBOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNeUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHB1YmxpYyBjb25maWc6IE15Q29uc3RydWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cbn1cbmA7XG5cbmNvbnN0IG1vZHVsZVNyY0NvZGUgPSBgXG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBURk1vZHVsZVN0YWNrIH0gZnJvbSBcImNka3RmLXRmLW1vZHVsZS1zdGFja1wiO1xuaW1wb3J0IHsgTXlDb25zdHJ1Y3QgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5jbGFzcyBNeUF3ZXNvbWVNb2R1bGUgZXh0ZW5kcyBURk1vZHVsZVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgTXlDb25zdHJ1Y3QodGhpcywgXCJteS1jb25zdHJ1Y3RcIiwge1xuICAgICAgcHJvcGVydHlBOiBcInZhbHVlQVwiLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbi8vIFRoaXMgaXMgdGhlIG5hbWUgdGhlIG1vZHVsZSBjYW4gYmUgZm91bmQgdW5kZXIuIFxuLy8gV2UgZXhwZWN0IGEgXCJteS1hd2Vzb21lLW1vZHVsZS5tZFwiIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuXG4vLyBUaGUgUkVBRE1FLm1kIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuXG5uZXcgTXlBd2Vzb21lTW9kdWxlKGFwcCwgXCJteS1hd2Vzb21lLW1vZHVsZVwiKTtcbmFwcC5zeW50aCgpO1xuYDtcblxuY29uc3QgdGVycmFmb3JtQXdzTWFpblNyY0NvZGUgPSBgXG50ZXJyYWZvcm0ge1xuICAjIExpbWl0IHByb3ZpZGVyIHZlcnNpb24gKHNvbWUgbW9kdWxlcyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBhd3MgNC54KVxuICByZXF1aXJlZF9wcm92aWRlcnMge1xuICAgIGF3cyA9IHtcbiAgICAgIHNvdXJjZSAgPSBcImhhc2hpY29ycC9hd3NcIlxuICAgICAgdmVyc2lvbiA9IFwifj4gX19yZXF1aXJlZFByb3ZpZGVyVmVyc2lvbl9fXCJcbiAgICB9XG4gIH1cbiAgIyBUZXJyYWZvcm0gYmluYXJ5IHZlcnNpb24gY29uc3RyYWludFxuICByZXF1aXJlZF92ZXJzaW9uID0gXCJ+PiAxLjEuMFwiXG59XG5cblxucHJvdmlkZXIgXCJhd3NcIiB7XG4gIHJlZ2lvbiA9IFwiX19yZWdpb25fX1wiXG59XG5gO1xuXG5jb25zdCB0ZXJyYWZvcm1BenVyZU1haW5TcmNDb2RlID0gYFxuIyBDb25maWd1cmUgdGhlIEF6dXJlIHByb3ZpZGVyXG50ZXJyYWZvcm0ge1xuICByZXF1aXJlZF9wcm92aWRlcnMge1xuICAgIGF6dXJlcm0gPSB7XG4gICAgICBzb3VyY2UgID0gXCJoYXNoaWNvcnAvYXp1cmVybVwiXG4gICAgICB2ZXJzaW9uID0gXCJ+PiBfX3JlcXVpcmVkUHJvdmlkZXJWZXJzaW9uX19cIlxuICAgIH1cbiAgfVxuXG4gIHJlcXVpcmVkX3ZlcnNpb24gPSBcIj49IDEuMS4wXCJcbn1cblxucHJvdmlkZXIgXCJhenVyZXJtXCIge1xuICBmZWF0dXJlcyB7fVxufVxuXG5yZXNvdXJjZSBcImF6dXJlcm1fcmVzb3VyY2VfZ3JvdXBcIiBcInJnXCIge1xuICBuYW1lICAgICA9IFwiX19yZXNvdXJjZUdyb3VwTmFtZV9fXCJcbiAgbG9jYXRpb24gPSBcIl9fbG9jYXRpb25fX1wiXG59XG5gO1xuXG5jb25zdCB0ZXJyYWZvcm1NYWluU3JjQ29kZU1hcDogeyBba2V5OiBzdHJpbmddOiB7IHNyY0NvZGU6IHN0cmluZyB9IH0gPSB7XG4gIGF3czoge1xuICAgIHNyY0NvZGU6IHRlcnJhZm9ybUF3c01haW5TcmNDb2RlLFxuICB9LFxuICBhenVyZToge1xuICAgIHNyY0NvZGU6IHRlcnJhZm9ybUF6dXJlTWFpblNyY0NvZGUsXG4gIH0sXG59O1xuXG5jb25zdCB0ZXJyYWZvcm1SZWFkbWVEb2NzID0gYFxuIyBQbGVhc2UgYWRkIGhlcmUgc29tZSBwdXJlIEhDTCB0ZXN0cyBmb3IgeW91ciBtb2R1bGVzIGluIG9yZGVyIHRvIHRlc3QgSENMIEludGVyb3BlcmFiaWxpdHlcblxuRXhhbXBsZXM6XG5cbm1vZHVsZSBcIm15X2F3ZXNvbWVfdGVzdFwiIHtcbiAgc291cmNlID0gXCIuLi9tb2R1bGVzL215LWF3ZXNvbWUtbW9kdWxlc1wiXG4gIC4uLnZhcmlhYmxlcy4uLlxufVxuICAgIGA7XG5cbmNsYXNzIFNjcmlwdEZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIHBhdGg6IHN0cmluZywgcHJpdmF0ZSBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBzdXBlcihwcm9qZWN0LCBwYXRoLCB7XG4gICAgICBleGVjdXRhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHlicmlkTW9kdWxlIGV4dGVuZHMgQ29uc3RydWN0TGlicmFyeSB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogSHlicmlkTW9kdWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmRlZmF1bHRzLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgc2FtcGxlQ29kZTogZmFsc2UsXG4gICAgICBlc2xpbnRPcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBjb25maWcuZXNsaW50T3B0aW9ucywge1xuICAgICAgICBsaW50UHJvamVuUmM6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICBwb3N0QnVpbGRTdGVwczpcbiAgICAgICAgY29uZmlnLmRvY3VtZW50YXRpb25QcmVjb21taXRIb29rICE9PSBmYWxzZVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiaW5zdGFsbC1wcmUtY29tbWl0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsIHByZS1jb21taXQgaG9va1wiLFxuICAgICAgICAgICAgICAgIHJ1bjogXCJwaXAgaW5zdGFsbCBwcmUtY29tbWl0XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogXCJkb2N1bWVudGF0aW9uLXByZWNvbW1pdC1ob29rXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJEb2N1bWVudGF0aW9uIFByZS1jb21taXQgSG9va1wiLFxuICAgICAgICAgICAgICAgIHJ1bjogXCJwcmUtY29tbWl0IHJ1biAtLWFsbC1maWxlc1wiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10sXG4gICAgfSk7XG4gICAgY29uc3QgY29uc3RydWN0VmVyc2lvbiA9IGNvbmZpZy5jb25zdHJ1Y3RWZXJzaW9uIHx8IFwiXjEwLjAuMjVcIjtcbiAgICBjb25zdCBjZGt0ZlZlcnNpb24gPSBjb25maWcuY2RrdGZWZXJzaW9uIHx8IFwiXjAuOS40XCI7XG5cbiAgICB0aGlzLmFkZFBlZXJEZXBzKGBjb25zdHJ1Y3RzQCR7Y29uc3RydWN0VmVyc2lvbn1gLCBgY2RrdGZAJHtjZGt0ZlZlcnNpb259YCk7XG4gICAgdGhpcy5hZGREZXZEZXBzKGBjZGt0Zi1jbGlAJHtjZGt0ZlZlcnNpb259YCwgXCJ0cy1ub2RlXCIpO1xuICAgIHRoaXMuYWRkS2V5d29yZHMoXCJjZGt0ZlwiLCBcImNka3RmLWh5YnJpZFwiKTtcbiAgICB0aGlzLnNldFNjcmlwdChcInRlcnJhZm9ybTp0ZXN0XCIsIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIpO1xuXG4gICAgLy8gTW9kdWxlIEVudHJ5cG9pbnRcbiAgICB0aGlzLmFkZERlcHMoXCJjZGt0Zi10Zi1tb2R1bGUtc3RhY2tcIik7XG4gICAgY29uc3QgbW9kdWxlRG9jcyA9IGBcbiMgTXkgQXdlc29tZSBNb2R1bGVcblxuIyMgVXNhZ2VcblxuXFxgXFxgXFxgaGNsXG5tb2R1bGUgXCJla3NfbWFuYWdlZF9ub2RlX2dyb3VwXCIge1xuICBzb3VyY2UgPSBcIiR7XG4gICAgY29uZmlnLnJlcG9zaXRvcnlcbiAgICAgID8ucmVwbGFjZShcImh0dHBzOi8vZ2l0aHViLmNvbS9cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFwiaHR0cDovL2dpdGh1Yi5jb20vXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZShcImdpdGh1Yi5jb20vXCIsIFwiXCIpIHx8IFwibXktZ2l0aHViLXJlcG9cIlxuICB9Ly9tb2R1bGVzL215LWF3ZXNvbWUtbW9kdWxlXCJcblxufVxuXFxgXFxgXFxgXG4gICAgYDtcblxuICAgIG5ldyBTYW1wbGVEaXIodGhpcywgdGhpcy5zcmNkaXIsIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgIFwiaW5kZXgudHNcIjogY29uc3RydWN0U3JjQ29kZS50cmltKCksXG4gICAgICAgIFwidGZNb2R1bGVzLnRzXCI6IG1vZHVsZVNyY0NvZGUudHJpbSgpLFxuICAgICAgICBcIm15LWF3ZXNvbWUtbW9kdWxlLm1kXCI6IG1vZHVsZURvY3MudHJpbSgpLFxuICAgICAgICBcImNka3RmLmpzb25cIjogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICAgICAgYXBwOiBcIm5weCB0cy1ub2RlIHRmTW9kdWxlcy50c1wiLFxuICAgICAgICAgICAgdGVycmFmb3JtUHJvdmlkZXJzOiBbXCJoYXNoaWNvcnAvbnVsbEAzLjEuMVwiXSwgLy8gV2UgbmVlZCBhdCBsZWFzdCBhIHByb3ZpZGVyIGZvciBnZXQgdG8gc3VjY2VlZFxuICAgICAgICAgICAgdGVycmFmb3JtTW9kdWxlczogW10sXG4gICAgICAgICAgICBvdXRwdXQ6IFwibW9kdWxlc1wiLFxuICAgICAgICAgICAgcHJvamVjdElkOiBjb25maWcucHJvamVjdElkIHx8IHV1aWQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJldHJpZXZlIGNvcnJlY3QgVEYgbWFpbiBzdHVmZlxuICAgIGxldCBtYWluVGZGaWxlID1cbiAgICAgIHRlcnJhZm9ybU1haW5TcmNDb2RlTWFwW2NvbmZpZy50ZXJyYWZvcm1Qcm92aWRlcl0uc3JjQ29kZS50cmltKCk7XG5cbiAgICBsZXQgY29uZmlnUHJvcGVydHk6IGFueSA9IHt9O1xuICAgIHN3aXRjaCAoY29uZmlnLnRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICBjYXNlIFwiYXdzXCI6IHtcbiAgICAgICAgY29uZmlnUHJvcGVydHkgPSBjb25maWcudGVycmFmb3JtUHJvdmlkZXJBd3NDb25maWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImF6dXJlXCI6IHtcbiAgICAgICAgY29uZmlnUHJvcGVydHkgPSBjb25maWcudGVycmFmb3JtUHJvdmlkZXJBenVyZUNvbmZpZztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIk5lZWQgdG8gZGVmaW5lIGNvcnJlY3RseSBhIFByb3ZpZGVyLCBvbmx5IFthd3MsYXp1cmUsZ2NwXSBhbGxvd2VkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhjb25maWdQcm9wZXJ0eSkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIG1haW5UZkZpbGUgPSBtYWluVGZGaWxlLnJlcGxhY2UoYF9fJHtrZXl9X19gLCBjb25maWdQcm9wZXJ0eVtrZXldKTtcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVEaXIodGhpcywgY29uZmlnLnRlcnJhZm9ybUV4YW1wbGVzRm9sZGVyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcIm1haW4udGZcIjogbWFpblRmRmlsZSxcbiAgICAgICAgXCJSRUFETUUubWRcIjogdGVycmFmb3JtUmVhZG1lRG9jcy50cmltKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJzcmMvLmdlblwiLCBcInNyYy9jZGt0Zi5vdXRcIiwgXCJzcmMvbW9kdWxlc1wiKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcbiAgICAgIGAke2NvbmZpZy50ZXJyYWZvcm1FeGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybWAsXG4gICAgICBgJHtjb25maWcudGVycmFmb3JtRXhhbXBsZXNGb2xkZXJ9Ly50ZXJyYWZvcm0ubG9jay5oY2xgXG4gICAgKTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnByZXBlbmRFeGVjKFwiY2RrdGYgZ2V0XCIsIHtcbiAgICAgIGN3ZDogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiY2RrdGYgc3ludGhcIiwge1xuICAgICAgY3dkOiB0aGlzLnNyY2RpcixcbiAgICAgIG5hbWU6IFwiU3ludGhlc2l6ZSBtb2R1bGUgSENMXCIsXG4gICAgfSk7XG5cbiAgICBuZXcgU2NyaXB0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBcInNjcmlwdHMvY29weS1tb2R1bGVzLnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxuU0NSSVBUUEFUSD1cIiQoIGNkIC0tIFwiJChkaXJuYW1lIFwiJDBcIilcIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVwiXG5cbiMgY2hlY2sgaWYgdGhlIG1vZHVsZSBmb2xkZXIgaGFzIGJlZW4gZ2VuZXJhdGVkIGFzIGV4cGVjdGVkXG5NT0RVTEVTX0ZPTERFUj0kKCBjZCAtLSBcIiRTQ1JJUFRQQVRILy4uL3NyYy9tb2R1bGVzL3N0YWNrc1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5TUkNfRk9MREVSPSQoIGNkIC0tIFwiJFNDUklQVFBBVEgvLi4vc3JjL1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5UQVJHRVRfRk9MREVSPVwiJFNDUklQVFBBVEgvLi4vbW9kdWxlc1wiXG5cbmlmIFsgISAtZCBcIiRNT0RVTEVTX0ZPTERFUlwiIF07IHRoZW5cbiAgZWNobyBcIkV4cGVjdGVkIG1vZHVsZSBmb2xkZXIgdG8gZXhpc3QgYXQgJE1PRFVMRVNfRk9MREVSXCJcbiAgZXhpdCAxXG5maVxuXG5jZCBcIiRNT0RVTEVTX0ZPTERFUlwiXG5mb3IgZCBpbiAqLyA7IGRvXG4gICAgWyAtTCBcIlxcJHtkJS99XCIgXSAmJiBjb250aW51ZVxuXG4gICAgZGlybmFtZT1cIlxcJHtkJS99XCJcblxuXG4gICAgIyBDaGVjayBpZiBldmVyeXRoaW5nIGlzIGluIHBsYWNlXG4gICAgaWYgWyAhIC1mIFwiJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCIgXTsgdGhlblxuICAgICAgZWNobyBcIkV4cGVjdGVkIGNvZGUgZm9yICRkaXJuYW1lIGF0IGNkay50Zi5qc29uIHRvIGV4aXN0IGF0ICRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZVwiXG4gICAgICBleGl0IDFcbiAgICBmaVxuXG4gICAgaWYgWyAhIC1mIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBdOyB0aGVuXG4gICAgICBlY2hvIFwiRXhwZWN0ZWQgRG9jdW1lbnRhdGlvbiBmb3IgJGRpcm5hbWUgYXQgJGRpcm5hbWUubWQgdG8gZXhpc3QgYXQgJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIlxuICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgICMgQ29weSBtb2R1bGUgYW5kIHJlYWRtZSB0b2dldGhlclxuICAgIGVjaG8gXCJDb3B5aW5nIENvZGUgYW5kIFJFQURNRSBmb3IgbW9kdWxlICRkaXJuYW1lXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lXCJcbiAgICBjcCBcIiRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIlxuICAgIGNwIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL1JFQURNRS5tZFwiXG5kb25lXG5gLnRyaW0oKVxuICAgICk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiLi9zY3JpcHRzL2NvcHktbW9kdWxlcy5zaFwiLCB7XG4gICAgICBuYW1lOiBcIkNvcHkgSENMIE1vZHVsZXNcIixcbiAgICB9KTtcblxuICAgIC8vIGlnbm9yZSBkaXN0IGluIHRlc3RzXG4gICAgdGhpcy5qZXN0Py5hZGRJZ25vcmVQYXR0ZXJuKFwiZGlzdFwiKTtcblxuICAgIG5ldyBTY3JpcHRGaWxlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiLi9zY3JpcHRzL3RmLW1vZHVsZS10ZXN0LnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gaW5pdCAtLXVwZ3JhZGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIGZtdFxudGVycmFmb3JtIC1jaGRpcj10ZXJyYWZvcm0gdmFsaWRhdGVcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIHBsYW4gICAgIFxuICAgICAgICBgXG4gICAgKTtcblxuICAgIHRoaXMudGVzdFRhc2suZXhlYyhcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiKTtcbiAgICB0aGlzLmplc3Q/LmFkZElnbm9yZVBhdHRlcm4oXCJ0ZXJyYWZvcm1cIik7XG5cbiAgICAvLyBQcmUtY29tbWl0IGhvb2tzXG4gICAgaWYgKGNvbmZpZy5kb2N1bWVudGF0aW9uUHJlY29tbWl0SG9vayAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHsgYWRkaXRpb25hbFByZWNvbW1pdEhvb2tzLCBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnMgfSA9XG4gICAgICAgIGNvbmZpZztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmVyc2lvbiA9IFwidjEuNzAuMVwiLFxuICAgICAgICBkaXNhYmxlRG9jc0hvb2sgPSBmYWxzZSxcbiAgICAgICAgZGlzYWJsZUZvcm1hdEhvb2sgPSBmYWxzZSxcbiAgICAgIH0gPSBkb2N1bWVudGF0aW9uUHJlY29tbWl0SG9va09wdGlvbnMgfHwge307XG5cbiAgICAgIG5ldyBZYW1sRmlsZSh0aGlzLCBcIi5wcmUtY29tbWl0LWNvbmZpZy55YW1sXCIsIHtcbiAgICAgICAgY29tbWl0dGVkOiB0cnVlLFxuICAgICAgICBvYmo6IHtcbiAgICAgICAgICByZXBvczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXBvOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9hbnRvbmJhYmVua28vcHJlLWNvbW1pdC10ZXJyYWZvcm1cIixcbiAgICAgICAgICAgICAgcmV2OiB2ZXJzaW9uLFxuICAgICAgICAgICAgICBob29rczogW1xuICAgICAgICAgICAgICAgIGRpc2FibGVGb3JtYXRIb29rID8gbnVsbCA6IHsgaWQ6IFwidGVycmFmb3JtX2ZtdFwiIH0sXG4gICAgICAgICAgICAgICAgZGlzYWJsZURvY3NIb29rID8gbnVsbCA6IHsgaWQ6IFwidGVycmFmb3JtX2RvY3NcIiB9LFxuICAgICAgICAgICAgICBdLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gbnVsbCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGFkZGl0aW9uYWxQcmVjb21taXRIb29rcyA/PyBbXSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRhc2tzLmFkZFRhc2soXCJwcmVjb21taXRcIiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdW5zIHByZWNvbW1pdCBob29rc1wiLFxuICAgICAgICBleGVjOiBcInByZS1jb21taXQgaW5zdGFsbFwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWlFO0FBQ2pFLHdDQUEyRTtBQUMzRSwrQkFBa0M7QUEwQmxDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsSUFBSTtJQUNoQixvQkFBb0IsRUFBRSxNQUFNO0NBQzdCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZeEIsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCekIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JyQixDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRzs7Ozs7Ozs7O0tBU3ZCLENBQUM7QUFFTixNQUFNLFVBQVcsU0FBUSxpQkFBUTtJQUMvQixZQUFZLE9BQWdCLEVBQUUsSUFBWSxFQUFVLE9BQWU7UUFDakUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDbkIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBSCtDLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFJbkUsQ0FBQztJQUVTLGlCQUFpQixDQUFDLENBQVk7UUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUVELE1BQWEsWUFBYSxTQUFRLHNCQUFnQjtJQUNoRCxZQUFZLE1BQTJCOztRQUNyQyxLQUFLLENBQUM7WUFDSixHQUFHLFFBQVE7WUFDWCxHQUFHLE1BQU07WUFDVCxVQUFVLEVBQUUsS0FBSztZQUNqQixhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDckQsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQztZQUNGLGNBQWMsRUFBRSxFQUFFO1NBQ25CLENBQUMsQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLFVBQVUsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQztRQUVyRCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsZ0JBQWdCLEVBQUUsRUFBRSxTQUFTLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLFlBQVksRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUVoRSxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHOzs7Ozs7O2NBUW5CLENBQUEsTUFBQSxNQUFNLENBQUMsYUFBYSwwQ0FDaEIsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsRUFDbEMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsRUFDaEMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsS0FBSSxnQkFDbkM7Ozs7S0FJRyxDQUFDO1FBRUYsSUFBSSxrQkFBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQy9CLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxjQUFjLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRTtnQkFDcEMsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDekMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQzFCO29CQUNFLFFBQVEsRUFBRSxZQUFZO29CQUN0QixHQUFHLEVBQUUsMEJBQTBCO29CQUMvQixrQkFBa0IsRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUM1QyxnQkFBZ0IsRUFBRSxFQUFFO29CQUNwQixNQUFNLEVBQUUsU0FBUztvQkFDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBQSxTQUFJLEdBQUU7aUJBQ3RDLEVBQ0QsSUFBSSxFQUNKLENBQUMsQ0FDRjtnQkFDRCx5QkFBeUIsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7YUFDcEQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFO1lBQ2hFLE1BQU0sY0FBYyxHQUNsQixNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYztnQkFDdkM7Ozs7Ozs7Ozs7OztDQVlQLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FDbEIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQztZQUUxRCxJQUFJLGtCQUFTLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtnQkFDbEMsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRTs7RUFFbkIsY0FBYzs7YUFFSCxDQUFDLFNBQVMsRUFBRTtvQkFDZixXQUFXLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFO2lCQUN4QzthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUN4QixHQUFHLGNBQWMsYUFBYSxFQUM5QixHQUFHLGNBQWMsc0JBQXNCLENBQ3hDLENBQUM7U0FDSDtRQUVELElBQUksTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUU7WUFDaEUsTUFBTSxzQkFBc0IsR0FDMUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQztZQUUxRCxNQUFNLE1BQU0sR0FBRyxzQkFBc0I7aUJBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztpQkFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFYixNQUFNLG1CQUFtQixHQUFHOzs7Ozs7OztDQVFqQyxDQUFDO1lBRUksTUFBTSxvQkFBb0IsR0FBRzs7OzsrQkFJSixNQUFNOzs7Ozs7Ozs7Ozs7O0NBYXBDLENBQUM7WUFFSSxNQUFNLHFCQUFxQixHQUFHOzs7Ozs7Ozs7Ozs7Q0FZbkMsQ0FBQztZQUVJLElBQUksa0JBQVMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7Z0JBQzFDLEtBQUssRUFBRTtvQkFDTCxVQUFVLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFO29CQUN4QyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxFQUFFO29CQUN2QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDMUI7d0JBQ0UsUUFBUSxFQUFFLFlBQVk7d0JBQ3RCLEdBQUcsRUFBRSxzQkFBc0I7d0JBQzNCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUEsU0FBSSxHQUFFO3FCQUN0QyxFQUNELElBQUksRUFDSixDQUFDLENBQ0Y7b0JBQ0QsV0FBVyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRTtpQkFDeEM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2hDLEdBQUcsRUFBRSxzQkFBc0I7YUFDNUIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxzQkFBc0IsWUFBWSxDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUN4QyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNoQixJQUFJLEVBQUUsdUJBQXVCO1NBQzlCLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxDQUNaLElBQUksRUFDSix5QkFBeUIsRUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpREwsQ0FBQyxJQUFJLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDakQsSUFBSSxFQUFFLGtCQUFrQjtTQUN6QixDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyxJQUFJLFVBQVUsQ0FDWixJQUFJLEVBQ0osNkJBQTZCLEVBQzdCOzs7Ozs7Ozs7U0FTRyxDQUNKLENBQUM7UUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2xELE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBblFELG9DQW1RQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZpbGVCYXNlLCBJUmVzb2x2ZXIsIFByb2plY3QsIFNhbXBsZURpciB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbnN0cnVjdExpYnJhcnksIENvbnN0cnVjdExpYnJhcnlPcHRpb25zIH0gZnJvbSBcInByb2plbi9saWIvY2RrXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcblxudHlwZSBIeWJyaWRNb2R1bGVPcHRpb25zID0gQ29uc3RydWN0TGlicmFyeU9wdGlvbnMgJiB7XG4gIGNka3RmVmVyc2lvbj86IHN0cmluZztcbiAgY29uc3RydWN0VmVyc2lvbj86IHN0cmluZztcbiAgLy8gTmFtZSBvZiB0aGUgYXV0aG9yXG4gIGF1dGhvcjogc3RyaW5nO1xuICAvLyBJZiBzZXQgYSB0ZXJyYWZvcm0gZXhhbXBsZXMgZm9sZGVyIHdpbGwgYmUgY3JlYXRlZFxuICB0ZXJyYWZvcm1FeGFtcGxlcz86IHtcbiAgICAvLyBJZiBzZXQgdGVycmFmb3JtIGV4YW1wbGVzIHdpbGwgYmUgcmVuZGVyZWRcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIC8vIFBhdGggZm9yIHRoZSB0ZXJyYWZvcm0gZXhhbXBsZXNcbiAgICBmb2xkZXI/OiBzdHJpbmc7XG4gICAgLy8gVGhlIEhDTCBjb25maWcgZmlsZSB0byB1c2UgZm9yIHRoZSB0ZXJyYWZvcm0gcHJvdmlkZXJcbiAgICBwcm92aWRlckNvbmZpZz86IHN0cmluZztcbiAgfTtcbiAgY29uc3RydWN0RXhhbXBsZXM/OiB7XG4gICAgLy8gSWYgc2V0IGNvbnN0cnVjdCBleGFtcGxlcyB3aWxsIGJlIHJlbmRlcmVkXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvLyBQYXRoIGZvciB0aGUgY29uc3RydWN0IGV4YW1wbGVzXG4gICAgZm9sZGVyPzogc3RyaW5nO1xuICB9O1xuICAvLyBEZWZhdWx0ZWQgdG8gYSB1dWlkIHN0cmluZyBhcyBjZGt0ZiB3b3VsZFxuICBwcm9qZWN0SWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgcHJldHRpZXI6IHRydWUsXG4gIHByb2plbnJjVHM6IHRydWUsXG4gIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiBcIm1haW5cIixcbn07XG5cbmNvbnN0IGNvbnN0cnVjdFNyY0NvZGUgPSBgXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE15Q29uc3RydWN0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb3BlcnR5QTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTXlDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwdWJsaWMgY29uZmlnOiBNeUNvbnN0cnVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG59XG5gO1xuXG5jb25zdCBjb25zdHJ1Y3RUZXN0Q29kZSA9IGBcbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IE15Q29uc3RydWN0IH0gZnJvbSBcIi4uL1wiO1xuXG4vLyBUbyBsZWFybiBtb3JlIGFib3V0IHRlc3Rpbmcgc2VlIGNkay50Zi90ZXN0aW5nXG5kZXNjcmliZShcIk15Q29uc3RydWN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc3ludGhlc2l6ZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgVGVzdGluZy5zeW50aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICBuZXcgTXlDb25zdHJ1Y3Qoc2NvcGUsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgICAgICBwcm9wZXJ0eUE6IFwidmFsdWVBXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9KTtcbn0pO1xuXG5gO1xuXG5jb25zdCBtb2R1bGVTcmNDb2RlID0gYFxuaW1wb3J0IHsgQXBwIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVEZNb2R1bGVTdGFjayB9IGZyb20gXCJjZGt0Zi10Zi1tb2R1bGUtc3RhY2tcIjtcbmltcG9ydCB7IE15Q29uc3RydWN0IH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuY2xhc3MgTXlBd2Vzb21lTW9kdWxlIGV4dGVuZHMgVEZNb2R1bGVTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IE15Q29uc3RydWN0KHRoaXMsIFwibXktY29uc3RydWN0XCIsIHtcbiAgICAgIHByb3BlcnR5QTogXCJ2YWx1ZUFcIixcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4vLyBUaGlzIGlzIHRoZSBuYW1lIHRoZSBtb2R1bGUgY2FuIGJlIGZvdW5kIHVuZGVyLiBcbi8vIFdlIGV4cGVjdCBhIFwibXktYXdlc29tZS1tb2R1bGUubWRcIiBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LlxuLy8gVGhlIFJFQURNRS5tZCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhpcyBmaWxlLlxubmV3IE15QXdlc29tZU1vZHVsZShhcHAsIFwibXktYXdlc29tZS1tb2R1bGVcIik7XG5hcHAuc3ludGgoKTtcbmA7XG5cbmNvbnN0IHRlcnJhZm9ybVJlYWRtZURvY3MgPSBgXG4jIFBsZWFzZSBhZGQgaGVyZSBzb21lIHB1cmUgSENMIHRlc3RzIGZvciB5b3VyIG1vZHVsZXMgaW4gb3JkZXIgdG8gdGVzdCBIQ0wgSW50ZXJvcGVyYWJpbGl0eVxuXG5FeGFtcGxlczpcblxubW9kdWxlIFwibXlfYXdlc29tZV90ZXN0XCIge1xuICBzb3VyY2UgPSBcIi4uL21vZHVsZXMvbXktYXdlc29tZS1tb2R1bGVzXCJcbiAgLi4udmFyaWFibGVzLi4uXG59XG4gICAgYDtcblxuY2xhc3MgU2NyaXB0RmlsZSBleHRlbmRzIEZpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgcGF0aDogc3RyaW5nLCBwcml2YXRlIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHN1cGVyKHByb2plY3QsIHBhdGgsIHtcbiAgICAgIGV4ZWN1dGFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUNvbnRlbnQoXzogSVJlc29sdmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIeWJyaWRNb2R1bGUgZXh0ZW5kcyBDb25zdHJ1Y3RMaWJyYXJ5IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBIeWJyaWRNb2R1bGVPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAuLi5jb25maWcsXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSxcbiAgICAgIGVzbGludE9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5lc2xpbnRPcHRpb25zLCB7XG4gICAgICAgIGxpbnRQcm9qZW5SYzogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHBvc3RCdWlsZFN0ZXBzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBjb25zdHJ1Y3RWZXJzaW9uID0gY29uZmlnLmNvbnN0cnVjdFZlcnNpb24gfHwgXCJeMTAuMC4yNVwiO1xuICAgIGNvbnN0IGNka3RmVmVyc2lvbiA9IGNvbmZpZy5jZGt0ZlZlcnNpb24gfHwgXCJeMC45LjRcIjtcblxuICAgIHRoaXMuYWRkUGVlckRlcHMoYGNvbnN0cnVjdHNAJHtjb25zdHJ1Y3RWZXJzaW9ufWAsIGBjZGt0ZkAke2Nka3RmVmVyc2lvbn1gKTtcbiAgICB0aGlzLmFkZERldkRlcHMoYGNka3RmLWNsaUAke2Nka3RmVmVyc2lvbn1gLCBcInRzLW5vZGVcIik7XG4gICAgdGhpcy5hZGRLZXl3b3JkcyhcImNka3RmXCIsIFwiY2RrdGYtaHlicmlkXCIpO1xuICAgIHRoaXMuc2V0U2NyaXB0KFwidGVycmFmb3JtOnRlc3RcIiwgXCIuL3NjcmlwdHMvdGYtbW9kdWxlLXRlc3Quc2hcIik7XG5cbiAgICAvLyBNb2R1bGUgRW50cnlwb2ludFxuICAgIHRoaXMuYWRkRGVwcyhcImNka3RmLXRmLW1vZHVsZS1zdGFja1wiKTtcbiAgICBjb25zdCBtb2R1bGVEb2NzID0gYFxuIyBNeSBBd2Vzb21lIE1vZHVsZVxuXG4jIyBVc2FnZVxuXG5cXGBcXGBcXGBoY2xcbm1vZHVsZSBcImVrc19tYW5hZ2VkX25vZGVfZ3JvdXBcIiB7XG4gIHNvdXJjZSA9IFwiJHtcbiAgICBjb25maWcucmVwb3NpdG9yeVVybFxuICAgICAgPy5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCJodHRwOi8vZ2l0aHViLmNvbS9cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFwiZ2l0aHViLmNvbS9cIiwgXCJcIikgfHwgXCJteS1naXRodWItcmVwb1wiXG4gIH0vL21vZHVsZXMvbXktYXdlc29tZS1tb2R1bGVcIlxuXG59XG5cXGBcXGBcXGBcbiAgICBgO1xuXG4gICAgbmV3IFNhbXBsZURpcih0aGlzLCB0aGlzLnNyY2Rpciwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgXCJpbmRleC50c1wiOiBjb25zdHJ1Y3RTcmNDb2RlLnRyaW0oKSxcbiAgICAgICAgXCJ0Zk1vZHVsZXMudHNcIjogbW9kdWxlU3JjQ29kZS50cmltKCksXG4gICAgICAgIFwibXktYXdlc29tZS1tb2R1bGUubWRcIjogbW9kdWxlRG9jcy50cmltKCksXG4gICAgICAgIFwiY2RrdGYuanNvblwiOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYW5ndWFnZTogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgICAgICBhcHA6IFwibnB4IHRzLW5vZGUgdGZNb2R1bGVzLnRzXCIsXG4gICAgICAgICAgICB0ZXJyYWZvcm1Qcm92aWRlcnM6IFtcImhhc2hpY29ycC9udWxsQDMuMS4xXCJdLCAvLyBXZSBuZWVkIGF0IGxlYXN0IGEgcHJvdmlkZXIgZm9yIGdldCB0byBzdWNjZWVkXG4gICAgICAgICAgICB0ZXJyYWZvcm1Nb2R1bGVzOiBbXSxcbiAgICAgICAgICAgIG91dHB1dDogXCJtb2R1bGVzXCIsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IGNvbmZpZy5wcm9qZWN0SWQgfHwgdXVpZCgpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICksXG4gICAgICAgIFwiX190ZXN0c19fL2luZGV4LXRlc3QudHNcIjogY29uc3RydWN0VGVzdENvZGUudHJpbSgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChjb25maWcudGVycmFmb3JtRXhhbXBsZXMgJiYgY29uZmlnLnRlcnJhZm9ybUV4YW1wbGVzLmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyQ29uZmlnID1cbiAgICAgICAgY29uZmlnLnRlcnJhZm9ybUV4YW1wbGVzLnByb3ZpZGVyQ29uZmlnIHx8XG4gICAgICAgIGBcbnRlcnJhZm9ybSB7XG4gICMgVGVycmFmb3JtIGJpbmFyeSB2ZXJzaW9uIGNvbnN0cmFpbnRcbiAgcmVxdWlyZWRfdmVyc2lvbiA9IFwifj4gMS4xLjBcIlxuXG4gICMgRGVmaW5lIGFsbCBuZWVkZWQgcHJvdmlkZXJzIGhlcmUsIHlvdSBjYW4gZmluZCBhbGwgYXZhaWxhYmxlIHByb3ZpZGVycyBoZXJlOlxuICAjIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL1xuICByZXF1aXJlZF9wcm92aWRlcnMge31cbn1cblxuIyBJbml0aWFsaXplIHlvdXIgcHJvdmlkZXIgaGVyZVxuXG5gLnRyaW0oKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVzRm9sZGVyID1cbiAgICAgICAgY29uZmlnLnRlcnJhZm9ybUV4YW1wbGVzLmZvbGRlciB8fCBcInRlcnJhZm9ybS1leGFtcGxlc1wiO1xuXG4gICAgICBuZXcgU2FtcGxlRGlyKHRoaXMsIGV4YW1wbGVzRm9sZGVyLCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgXCJtYWluLnRmXCI6IGBcbiMgQ29uZmlndXJlIFRlcnJhZm9ybVxuJHtwcm92aWRlckNvbmZpZ31cblxuICAgICAgICAgICAgYC50cmltU3RhcnQoKSxcbiAgICAgICAgICBcIlJFQURNRS5tZFwiOiB0ZXJyYWZvcm1SZWFkbWVEb2NzLnRyaW0oKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucyhcbiAgICAgICAgYCR7ZXhhbXBsZXNGb2xkZXJ9Ly50ZXJyYWZvcm1gLFxuICAgICAgICBgJHtleGFtcGxlc0ZvbGRlcn0vLnRlcnJhZm9ybS5sb2NrLmhjbGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jb25zdHJ1Y3RFeGFtcGxlcyAmJiBjb25maWcuY29uc3RydWN0RXhhbXBsZXMuZW5hYmxlZCkge1xuICAgICAgY29uc3QgY29uc3RydWN0RXhhbXBsZUZvbGRlciA9XG4gICAgICAgIGNvbmZpZy5jb25zdHJ1Y3RFeGFtcGxlcy5mb2xkZXIgfHwgXCJjb25zdHJ1Y3QtZXhhbXBsZXNcIjtcblxuICAgICAgY29uc3QgbGV2ZWxzID0gY29uc3RydWN0RXhhbXBsZUZvbGRlclxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5tYXAoKCkgPT4gXCIuLlwiKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGNvbnN0cnVjdFJlYWRtZURvY3MgPSBgXG4jIENvbnN0cnVjdCBFeGFtcGxlc1xuXG5FeGFtcGxlIHVzZS1jYXNlcyBmb3IgdGhlIENvbnN0cnVjdCBsaWJyYXJ5LlxuXG4tIFtCYXNpYyBVc2FnZV0oLi9iYXNpYy50cylcblxuVG8gZW5zdXJlIGFsbCBleGFtcGxlcyBhcmUgd29ya2luZywgcGxlYXNlIG1ha2Ugc3VyZSB0aGUgW2luZGV4LnRzXSguL2luZGV4LnRzKSBmaWxlIGlzIGltcG9ydGluZyBhbGwgb2YgdGhlbS5cbmA7XG5cbiAgICAgIGNvbnN0IGNvbnN0cnVjdEV4YW1wbGVDb2RlID0gYFxuaW1wb3J0IHsgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IE15Q29uc3RydWN0IH0gZnJvbSBcIiR7bGV2ZWxzfS9zcmMvXCI7XG5cbmV4cG9ydCBjbGFzcyBCYXNpY0V4YW1wbGUgZXh0ZW5kcyBUZXJyYWZvcm1TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBuYW1lKTtcblxuICAgIG5ldyBNeUNvbnN0cnVjdCh0aGlzLCBcIm15LWNvbnN0cnVjdFwiLCB7XG4gICAgICBwcm9wZXJ0eUE6IFwidmFsdWVBXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuXG5gO1xuXG4gICAgICBjb25zdCBleGFtcGxlQ29sbGVjdGlvbkNvZGUgPSBgXG4vLyBUaGlzIGZpbGUgd2lsbCBiZSBzeW50aGVzaXplZCB0byBjaGVjayBpZiBhbGwgZXhhbXBsZXMgYXJlIHdvcmtpbmdcblxuaW1wb3J0IHsgQXBwIH0gZnJvbSBcImNka3RmXCI7XG4vLyBBbGwgZXhhbXBsZXMgbmVlZCB0byBiZSBpbXBvcnRlZCBoZXJlXG5pbXBvcnQgeyBCYXNpY0V4YW1wbGUgfSBmcm9tIFwiLi9iYXNpY1wiO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5cbi8vIEFsbCBleGFtcGxlcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGhlcmVcbm5ldyBCYXNpY0V4YW1wbGUoYXBwLCBcImJhc2ljLWV4YW1wbGVcIik7XG5hcHAuc3ludGgoKTtcbmA7XG5cbiAgICAgIG5ldyBTYW1wbGVEaXIodGhpcywgY29uc3RydWN0RXhhbXBsZUZvbGRlciwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgIFwiaW5kZXgudHNcIjogZXhhbXBsZUNvbGxlY3Rpb25Db2RlLnRyaW0oKSxcbiAgICAgICAgICBcImJhc2ljLnRzXCI6IGNvbnN0cnVjdEV4YW1wbGVDb2RlLnRyaW0oKSxcbiAgICAgICAgICBcImNka3RmLmpzb25cIjogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhbmd1YWdlOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgICAgICAgYXBwOiBcIm5weCB0cy1ub2RlIGluZGV4LnRzXCIsXG4gICAgICAgICAgICAgIHByb2plY3RJZDogY29uZmlnLnByb2plY3RJZCB8fCB1dWlkKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApLFxuICAgICAgICAgIFwiUkVBRE1FLm1kXCI6IGNvbnN0cnVjdFJlYWRtZURvY3MudHJpbSgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudGVzdFRhc2suZXhlYyhgY2RrdGYgc3ludGhgLCB7XG4gICAgICAgIGN3ZDogY29uc3RydWN0RXhhbXBsZUZvbGRlcixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoYCR7Y29uc3RydWN0RXhhbXBsZUZvbGRlcn0vY2RrdGYub3V0YCk7XG4gICAgfVxuXG4gICAgdGhpcy5naXRpZ25vcmUuYWRkUGF0dGVybnMoXCJzcmMvLmdlblwiLCBcInNyYy9jZGt0Zi5vdXRcIiwgXCJzcmMvbW9kdWxlc1wiKTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnByZXBlbmRFeGVjKFwiY2RrdGYgZ2V0XCIsIHtcbiAgICAgIGN3ZDogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFwiY2RrdGYgc3ludGhcIiwge1xuICAgICAgY3dkOiB0aGlzLnNyY2RpcixcbiAgICAgIG5hbWU6IFwiU3ludGhlc2l6ZSBtb2R1bGUgSENMXCIsXG4gICAgfSk7XG5cbiAgICBuZXcgU2NyaXB0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBcInNjcmlwdHMvY29weS1tb2R1bGVzLnNoXCIsXG4gICAgICBgXG4jIS9iaW4vYmFzaFxuIyBUaGlzIHNjcmlwdCBpcyBjcmVhdGVkIGJ5IHByb2plbiwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuXG5zZXQgLWVcblxuU0NSSVBUUEFUSD1cIiQoIGNkIC0tIFwiJChkaXJuYW1lIFwiJDBcIilcIiA+L2Rldi9udWxsIDI+JjEgOyBwd2QgLVAgKVwiXG5cbiMgY2hlY2sgaWYgdGhlIG1vZHVsZSBmb2xkZXIgaGFzIGJlZW4gZ2VuZXJhdGVkIGFzIGV4cGVjdGVkXG5NT0RVTEVTX0ZPTERFUj0kKCBjZCAtLSBcIiRTQ1JJUFRQQVRILy4uL3NyYy9tb2R1bGVzL3N0YWNrc1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5TUkNfRk9MREVSPSQoIGNkIC0tIFwiJFNDUklQVFBBVEgvLi4vc3JjL1wiID4vZGV2L251bGwgMj4mMSA7IHB3ZCAtUCApXG5UQVJHRVRfRk9MREVSPVwiJFNDUklQVFBBVEgvLi4vbW9kdWxlc1wiXG5cbmlmIFsgISAtZCBcIiRNT0RVTEVTX0ZPTERFUlwiIF07IHRoZW5cbiAgZWNobyBcIkV4cGVjdGVkIG1vZHVsZSBmb2xkZXIgdG8gZXhpc3QgYXQgJE1PRFVMRVNfRk9MREVSXCJcbiAgZXhpdCAxXG5maVxuXG5jZCBcIiRNT0RVTEVTX0ZPTERFUlwiXG5mb3IgZCBpbiAqLyA7IGRvXG4gICAgWyAtTCBcIlxcJHtkJS99XCIgXSAmJiBjb250aW51ZVxuXG4gICAgZGlybmFtZT1cIlxcJHtkJS99XCJcblxuXG4gICAgIyBDaGVjayBpZiBldmVyeXRoaW5nIGlzIGluIHBsYWNlXG4gICAgaWYgWyAhIC1mIFwiJE1PRFVMRVNfRk9MREVSLyRkaXJuYW1lL2Nkay50Zi5qc29uXCIgXTsgdGhlblxuICAgICAgZWNobyBcIkV4cGVjdGVkIGNvZGUgZm9yICRkaXJuYW1lIGF0IGNkay50Zi5qc29uIHRvIGV4aXN0IGF0ICRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZVwiXG4gICAgICBleGl0IDFcbiAgICBmaVxuXG4gICAgaWYgWyAhIC1mIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBdOyB0aGVuXG4gICAgICBlY2hvIFwiRXhwZWN0ZWQgRG9jdW1lbnRhdGlvbiBmb3IgJGRpcm5hbWUgYXQgJGRpcm5hbWUubWQgdG8gZXhpc3QgYXQgJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIlxuICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgICMgQ29weSBtb2R1bGUgYW5kIHJlYWRtZSB0b2dldGhlclxuICAgIGVjaG8gXCJDb3B5aW5nIENvZGUgYW5kIFJFQURNRSBmb3IgbW9kdWxlICRkaXJuYW1lXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSXCJcbiAgICBta2RpciAtcCBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lXCJcbiAgICBjcCBcIiRNT0RVTEVTX0ZPTERFUi8kZGlybmFtZS9jZGsudGYuanNvblwiIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvY2RrLnRmLmpzb25cIlxuICAgIGNwIFwiJFNSQ19GT0xERVIvJGRpcm5hbWUubWRcIiBcIiRUQVJHRVRfRk9MREVSLyRkaXJuYW1lL1JFQURNRS5tZFwiXG5cbiAgICAjIEFkZCBSRUFETUUgaGNsIGRvY3NcbiAgICBpZiB3aGljaCB0ZXJyYWZvcm0tZG9jcyA+L2Rldi9udWxsOyB0aGVuXG4gICAgICB0ZXJyYWZvcm0tZG9jcyBtYXJrZG93biB0YWJsZSAtLW91dHB1dC1maWxlIFwiJFRBUkdFVF9GT0xERVIvJGRpcm5hbWUvUkVBRE1FLm1kXCIgXCIkVEFSR0VUX0ZPTERFUi8kZGlybmFtZVwiIFxuICAgIGVsc2VcbiAgICAgIGRvY2tlciBydW4gLS1ybSAtLXZvbHVtZSBcIiRTQ1JJUFRQQVRILy4uL21vZHVsZXM6L3RlcnJhZm9ybS1kb2NzXCIgLXUgJChpZCAtdSkgcXVheS5pby90ZXJyYWZvcm0tZG9jcy90ZXJyYWZvcm0tZG9jczowLjE2LjAgbWFya2Rvd24gdGFibGUgLS1vdXRwdXQtZmlsZSBcIi90ZXJyYWZvcm0tZG9jcy8kZGlybmFtZS9SRUFETUUubWRcIiAvdGVycmFmb3JtLWRvY3MvJGRpcm5hbWVcbiAgICBmaVxuZG9uZVxuYC50cmltKClcbiAgICApO1xuICAgIHRoaXMuY29tcGlsZVRhc2suZXhlYyhcIi4vc2NyaXB0cy9jb3B5LW1vZHVsZXMuc2hcIiwge1xuICAgICAgbmFtZTogXCJDb3B5IEhDTCBNb2R1bGVzXCIsXG4gICAgfSk7XG5cbiAgICAvLyBpZ25vcmUgZGlzdCBpbiB0ZXN0c1xuICAgIHRoaXMuamVzdD8uYWRkSWdub3JlUGF0dGVybihcImRpc3RcIik7XG5cbiAgICBuZXcgU2NyaXB0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBcIi4vc2NyaXB0cy90Zi1tb2R1bGUtdGVzdC5zaFwiLFxuICAgICAgYFxuIyEvYmluL2Jhc2hcbiMgVGhpcyBzY3JpcHQgaXMgY3JlYXRlZCBieSBwcm9qZW4sIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5Llxuc2V0IC1lXG5cbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIGluaXQgLS11cGdyYWRlXG50ZXJyYWZvcm0gLWNoZGlyPXRlcnJhZm9ybSBmbXRcbnRlcnJhZm9ybSAtY2hkaXI9dGVycmFmb3JtIHZhbGlkYXRlXG50ZXJyYWZvcm0gLWNoZGlyPXRlcnJhZm9ybSBwbGFuICAgICBcbiAgICAgICAgYFxuICAgICk7XG5cbiAgICB0aGlzLnRlc3RUYXNrLmV4ZWMoXCIuL3NjcmlwdHMvdGYtbW9kdWxlLXRlc3Quc2hcIik7XG4gICAgdGhpcy5qZXN0Py5hZGRJZ25vcmVQYXR0ZXJuKFwidGVycmFmb3JtXCIpO1xuICB9XG59XG4iXX0=
|
package/package.json
CHANGED