@cdktn/provider-generator 0.23.0-pre.7 → 0.23.0

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 (195) hide show
  1. package/ambient.d.ts +0 -1
  2. package/{lib → build}/__tests__/edge-provider-schema/builder.d.ts +1 -0
  3. package/build/__tests__/edge-provider-schema/builder.js +106 -0
  4. package/build/__tests__/edge-provider-schema/cli.d.ts +2 -0
  5. package/build/__tests__/edge-provider-schema/cli.js +67 -0
  6. package/{lib → build}/__tests__/edge-provider-schema/index.d.ts +1 -0
  7. package/build/__tests__/edge-provider-schema/index.js +154 -0
  8. package/build/__tests__/edge-provider-schema.test.d.ts +2 -0
  9. package/build/__tests__/edge-provider-schema.test.js +46 -0
  10. package/build/__tests__/provider.test.d.ts +2 -0
  11. package/build/__tests__/provider.test.js +158 -0
  12. package/build/get/__tests__/constructs-maker.test.d.ts +2 -0
  13. package/build/get/__tests__/constructs-maker.test.js +113 -0
  14. package/build/get/__tests__/generator/complex-computed-types.test.d.ts +2 -0
  15. package/build/get/__tests__/generator/complex-computed-types.test.js +42 -0
  16. package/build/get/__tests__/generator/deep-nested-attributes.test.d.ts +2 -0
  17. package/build/get/__tests__/generator/deep-nested-attributes.test.js +50 -0
  18. package/build/get/__tests__/generator/description-escaping.test.d.ts +2 -0
  19. package/build/get/__tests__/generator/description-escaping.test.js +65 -0
  20. package/build/get/__tests__/generator/empty-provider-resources.test.d.ts +2 -0
  21. package/build/get/__tests__/generator/empty-provider-resources.test.js +40 -0
  22. package/build/get/__tests__/generator/export-sharding.test.d.ts +2 -0
  23. package/build/get/__tests__/generator/export-sharding.test.js +82 -0
  24. package/build/get/__tests__/generator/module-generator.test.d.ts +2 -0
  25. package/build/get/__tests__/generator/module-generator.test.js +476 -0
  26. package/build/get/__tests__/generator/nested-types.test.d.ts +2 -0
  27. package/build/get/__tests__/generator/nested-types.test.js +51 -0
  28. package/build/get/__tests__/generator/provider.test.d.ts +2 -0
  29. package/build/get/__tests__/generator/provider.test.js +51 -0
  30. package/build/get/__tests__/generator/resource-types.test.d.ts +2 -0
  31. package/build/get/__tests__/generator/resource-types.test.js +78 -0
  32. package/build/get/__tests__/generator/skipped-attributes.test.d.ts +2 -0
  33. package/build/get/__tests__/generator/skipped-attributes.test.js +55 -0
  34. package/build/get/__tests__/generator/types.test.d.ts +2 -0
  35. package/build/get/__tests__/generator/types.test.js +289 -0
  36. package/build/get/__tests__/generator/versions-file.test.d.ts +2 -0
  37. package/build/get/__tests__/generator/versions-file.test.js +74 -0
  38. package/{lib → build}/get/__tests__/util.d.ts +1 -0
  39. package/build/get/__tests__/util.js +59 -0
  40. package/{lib → build}/get/constructs-maker.d.ts +2 -1
  41. package/{lib → build}/get/constructs-maker.js +5 -2
  42. package/{lib → build}/get/generator/custom-defaults.d.ts +1 -0
  43. package/build/get/generator/custom-defaults.js +403 -0
  44. package/{lib → build}/get/generator/emitter/attributes-emitter.d.ts +1 -0
  45. package/build/get/generator/emitter/attributes-emitter.js +161 -0
  46. package/{lib → build}/get/generator/emitter/index.d.ts +1 -0
  47. package/{lib → build}/get/generator/emitter/index.js +1 -1
  48. package/{lib → build}/get/generator/emitter/resource-emitter.d.ts +1 -0
  49. package/build/get/generator/emitter/resource-emitter.js +147 -0
  50. package/{lib → build}/get/generator/emitter/struct-emitter.d.ts +1 -0
  51. package/build/get/generator/emitter/struct-emitter.js +500 -0
  52. package/{lib → build}/get/generator/loop-detection.d.ts +1 -0
  53. package/build/get/generator/loop-detection.js +56 -0
  54. package/{lib → build}/get/generator/models/attribute-model.d.ts +1 -0
  55. package/build/get/generator/models/attribute-model.js +160 -0
  56. package/{lib → build}/get/generator/models/attribute-type-model.d.ts +1 -0
  57. package/build/get/generator/models/attribute-type-model.js +376 -0
  58. package/{lib → build}/get/generator/models/index.d.ts +1 -0
  59. package/{lib → build}/get/generator/models/index.js +1 -1
  60. package/{lib → build}/get/generator/models/resource-model.d.ts +1 -0
  61. package/build/get/generator/models/resource-model.js +106 -0
  62. package/{lib → build}/get/generator/models/scope.d.ts +1 -0
  63. package/build/get/generator/models/scope.js +36 -0
  64. package/{lib → build}/get/generator/models/struct.d.ts +1 -0
  65. package/build/get/generator/models/struct.js +90 -0
  66. package/{lib → build}/get/generator/module-generator.d.ts +1 -0
  67. package/build/get/generator/module-generator.js +184 -0
  68. package/{lib → build}/get/generator/provider-generator.d.ts +1 -0
  69. package/build/get/generator/provider-generator.js +225 -0
  70. package/{lib → build}/get/generator/resource-parser.d.ts +1 -0
  71. package/build/get/generator/resource-parser.js +497 -0
  72. package/{lib → build}/get/generator/sanitized-comments.d.ts +1 -0
  73. package/build/get/generator/sanitized-comments.js +44 -0
  74. package/{lib → build}/get/generator/skipped-attributes.d.ts +1 -0
  75. package/build/get/generator/skipped-attributes.js +29 -0
  76. package/{lib → build}/index.d.ts +1 -0
  77. package/{lib → build}/index.js +1 -1
  78. package/{lib → build}/util.d.ts +1 -0
  79. package/build/util.js +30 -0
  80. package/package.json +13 -15
  81. package/{lib → src}/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +1 -1
  82. package/{lib → src}/__tests__/__snapshots__/provider.test.ts.snap +14953 -890
  83. package/{lib → src}/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +1 -1
  84. package/{lib → src}/get/__tests__/generator/__snapshots__/description-escaping.test.ts.snap +1 -1
  85. package/{lib → src}/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +1 -1
  86. package/{lib → src}/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +10 -10
  87. package/{lib → src}/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +1 -1
  88. package/{lib → src}/get/__tests__/generator/__snapshots__/provider.test.ts.snap +1 -1
  89. package/{lib → src}/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +1 -1
  90. package/{lib → src}/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +1 -1
  91. package/{lib → src}/get/__tests__/generator/__snapshots__/types.test.ts.snap +92 -1
  92. package/src/get/__tests__/generator/fixtures/map-of-map-of-string.test.fixture.json +27 -0
  93. package/tsconfig.json +6 -3
  94. package/lib/__tests__/edge-provider-schema/builder.js +0 -106
  95. package/lib/__tests__/edge-provider-schema/cli.d.ts +0 -1
  96. package/lib/__tests__/edge-provider-schema/cli.js +0 -67
  97. package/lib/__tests__/edge-provider-schema/index.js +0 -154
  98. package/lib/__tests__/edge-provider-schema.test.d.ts +0 -1
  99. package/lib/__tests__/edge-provider-schema.test.js +0 -46
  100. package/lib/__tests__/provider.test.d.ts +0 -1
  101. package/lib/__tests__/provider.test.js +0 -158
  102. package/lib/get/__tests__/constructs-maker.test.d.ts +0 -1
  103. package/lib/get/__tests__/constructs-maker.test.js +0 -113
  104. package/lib/get/__tests__/generator/complex-computed-types.test.d.ts +0 -1
  105. package/lib/get/__tests__/generator/complex-computed-types.test.js +0 -42
  106. package/lib/get/__tests__/generator/deep-nested-attributes.test.d.ts +0 -1
  107. package/lib/get/__tests__/generator/deep-nested-attributes.test.js +0 -50
  108. package/lib/get/__tests__/generator/description-escaping.test.d.ts +0 -1
  109. package/lib/get/__tests__/generator/description-escaping.test.js +0 -65
  110. package/lib/get/__tests__/generator/empty-provider-resources.test.d.ts +0 -1
  111. package/lib/get/__tests__/generator/empty-provider-resources.test.js +0 -40
  112. package/lib/get/__tests__/generator/export-sharding.test.d.ts +0 -1
  113. package/lib/get/__tests__/generator/export-sharding.test.js +0 -82
  114. package/lib/get/__tests__/generator/module-generator.test.d.ts +0 -1
  115. package/lib/get/__tests__/generator/module-generator.test.js +0 -476
  116. package/lib/get/__tests__/generator/nested-types.test.d.ts +0 -1
  117. package/lib/get/__tests__/generator/nested-types.test.js +0 -51
  118. package/lib/get/__tests__/generator/provider.test.d.ts +0 -1
  119. package/lib/get/__tests__/generator/provider.test.js +0 -51
  120. package/lib/get/__tests__/generator/resource-types.test.d.ts +0 -1
  121. package/lib/get/__tests__/generator/resource-types.test.js +0 -78
  122. package/lib/get/__tests__/generator/skipped-attributes.test.d.ts +0 -1
  123. package/lib/get/__tests__/generator/skipped-attributes.test.js +0 -55
  124. package/lib/get/__tests__/generator/types.test.d.ts +0 -1
  125. package/lib/get/__tests__/generator/types.test.js +0 -280
  126. package/lib/get/__tests__/generator/versions-file.test.d.ts +0 -1
  127. package/lib/get/__tests__/generator/versions-file.test.js +0 -74
  128. package/lib/get/__tests__/util.js +0 -59
  129. package/lib/get/generator/custom-defaults.js +0 -403
  130. package/lib/get/generator/emitter/attributes-emitter.js +0 -161
  131. package/lib/get/generator/emitter/resource-emitter.js +0 -144
  132. package/lib/get/generator/emitter/struct-emitter.js +0 -500
  133. package/lib/get/generator/loop-detection.js +0 -56
  134. package/lib/get/generator/models/attribute-model.js +0 -160
  135. package/lib/get/generator/models/attribute-type-model.js +0 -376
  136. package/lib/get/generator/models/resource-model.js +0 -106
  137. package/lib/get/generator/models/scope.js +0 -36
  138. package/lib/get/generator/models/struct.js +0 -90
  139. package/lib/get/generator/module-generator.js +0 -184
  140. package/lib/get/generator/provider-generator.js +0 -225
  141. package/lib/get/generator/resource-parser.js +0 -497
  142. package/lib/get/generator/sanitized-comments.js +0 -44
  143. package/lib/get/generator/skipped-attributes.js +0 -29
  144. package/lib/util.js +0 -30
  145. /package/{lib → src}/get/__tests__/generator/fixtures/aws-provider.test.fixture.json +0 -0
  146. /package/{lib → src}/get/__tests__/generator/fixtures/aws_acm_certificate.test.fixture.json +0 -0
  147. /package/{lib → src}/get/__tests__/generator/fixtures/aws_cloudfront_distribution.test.fixture.json +0 -0
  148. /package/{lib → src}/get/__tests__/generator/fixtures/aws_fms_admin_account.test.fixture.json +0 -0
  149. /package/{lib → src}/get/__tests__/generator/fixtures/aws_quicksight_template.test.fixture.json +0 -0
  150. /package/{lib → src}/get/__tests__/generator/fixtures/aws_s3_bucket.test.fixture.json +0 -0
  151. /package/{lib → src}/get/__tests__/generator/fixtures/aws_security_group.test.fixture.json +0 -0
  152. /package/{lib → src}/get/__tests__/generator/fixtures/aws_wafv2_web_acl.test.fixture.json +0 -0
  153. /package/{lib → src}/get/__tests__/generator/fixtures/block-type-nested-computed-list.test.fixture.json +0 -0
  154. /package/{lib → src}/get/__tests__/generator/fixtures/block-type-set-list.test.fixture.json +0 -0
  155. /package/{lib → src}/get/__tests__/generator/fixtures/boolean-list.test.fixture.json +0 -0
  156. /package/{lib → src}/get/__tests__/generator/fixtures/boolean-map.test.fixture.json +0 -0
  157. /package/{lib → src}/get/__tests__/generator/fixtures/comment-ending-sequence.test.fixture.json +0 -0
  158. /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex-nested.test.fixture.json +0 -0
  159. /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex.test.fixture.json +0 -0
  160. /package/{lib → src}/get/__tests__/generator/fixtures/computed-optional-complex.test.fixture.json +0 -0
  161. /package/{lib → src}/get/__tests__/generator/fixtures/data_aws_quicksight_analysis.fixture.json +0 -0
  162. /package/{lib → src}/get/__tests__/generator/fixtures/datadog_dashboard.test.fixture.json +0 -0
  163. /package/{lib → src}/get/__tests__/generator/fixtures/datadog_spans_metric.test.fixture.json +0 -0
  164. /package/{lib → src}/get/__tests__/generator/fixtures/deep-attributes.test.fixture.json +0 -0
  165. /package/{lib → src}/get/__tests__/generator/fixtures/deeply-nested-block-types.test.fixture.json +0 -0
  166. /package/{lib → src}/get/__tests__/generator/fixtures/description-escaping.test.fixture.json +0 -0
  167. /package/{lib → src}/get/__tests__/generator/fixtures/elasticstack-provider.test.fixture.json +0 -0
  168. /package/{lib → src}/get/__tests__/generator/fixtures/empty-provider-resources.test.fixture.json +0 -0
  169. /package/{lib → src}/get/__tests__/generator/fixtures/ignored-attributes.test.fixture.json +0 -0
  170. /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-attribute-names.test.fixture.json +0 -0
  171. /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-resource-names.test.fixture.json +0 -0
  172. /package/{lib → src}/get/__tests__/generator/fixtures/list-list-object.test.fixture.json +0 -0
  173. /package/{lib → src}/get/__tests__/generator/fixtures/list-list-string.test.fixture.json +0 -0
  174. /package/{lib → src}/get/__tests__/generator/fixtures/list-of-string-map.test.fixture.json +0 -0
  175. /package/{lib → src}/get/__tests__/generator/fixtures/map-of-string-list.test.fixture.json +0 -0
  176. /package/{lib → src}/get/__tests__/generator/fixtures/markdown-description-with-code-blocks.test.fixture.json +0 -0
  177. /package/{lib → src}/get/__tests__/generator/fixtures/module-get-x.test.fixture.tf +0 -0
  178. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-1.test.fixture.tf +0 -0
  179. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-2.test.fixture.tf +0 -0
  180. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-outputs.test.fixture.tf +0 -0
  181. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-variable-type.test.fixture.tf +0 -0
  182. /package/{lib → src}/get/__tests__/generator/fixtures/module-with-star-default.test.fixture.tf +0 -0
  183. /package/{lib → src}/get/__tests__/generator/fixtures/name-conflict.test.fixture.json +0 -0
  184. /package/{lib → src}/get/__tests__/generator/fixtures/nested-type-without-attributes.test.fixture.json +0 -0
  185. /package/{lib → src}/get/__tests__/generator/fixtures/nested-types.test.fixture.json +0 -0
  186. /package/{lib → src}/get/__tests__/generator/fixtures/number-list.test.fixture.json +0 -0
  187. /package/{lib → src}/get/__tests__/generator/fixtures/number-map.test.fixture.json +0 -0
  188. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-boolean.test.fixture.json +0 -0
  189. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-dynamic.test.fixture.json +0 -0
  190. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-number.test.fixture.json +0 -0
  191. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-string.test.fixture.json +0 -0
  192. /package/{lib → src}/get/__tests__/generator/fixtures/single-block-type.test.fixture.json +0 -0
  193. /package/{lib → src}/get/__tests__/generator/fixtures/string-list.test.fixture.json +0 -0
  194. /package/{lib → src}/get/__tests__/generator/fixtures/string-map.test.fixture.json +0 -0
  195. /package/{lib → src}/get/__tests__/generator/fixtures/stripe-schema.test.fixture.json +0 -0
@@ -1,161 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AttributesEmitter = void 0;
4
- const models_1 = require("../models");
5
- const custom_defaults_1 = require("../custom-defaults");
6
- function titleCase(value) {
7
- return value[0].toUpperCase() + value.slice(1);
8
- }
9
- class AttributesEmitter {
10
- constructor(code) {
11
- this.code = code;
12
- }
13
- emit(att, escapeReset, escapeInput) {
14
- this.code.line();
15
- this.code.line(`// ${att.terraformName} - computed: ${att.computed}, optional: ${att.isOptional}, required: ${att.isRequired}`);
16
- const isStored = att.isStored;
17
- const hasResetMethod = isStored && !att.isRequired && att.setterType._type !== "none";
18
- const hasInputMethod = isStored && att.setterType._type !== "none";
19
- const getterType = att.getterType;
20
- if (getterType._type === "stored_class") {
21
- this.code.line(`private ${att.storageName} = ${this.storedClassInit(att)};`);
22
- }
23
- else if (isStored) {
24
- this.code.line(`private ${att.storageName}?: ${att.type.inputTypeDefinition}; `);
25
- }
26
- switch (getterType._type) {
27
- case "plain":
28
- this.code.openBlock(`public get ${att.name}()`);
29
- this.code.line(`return ${this.determineGetAttCall(att)};`);
30
- this.code.closeBlock();
31
- break;
32
- case "args":
33
- this.code.openBlock(`public ${att.name}(${getterType.args})${getterType.returnType ? ": " + getterType.returnType : ""}`);
34
- this.code.line(`return ${getterType.returnStatement};`);
35
- this.code.closeBlock();
36
- break;
37
- case "stored_class":
38
- this.code.openBlock(`public get ${att.name}()`);
39
- this.code.line(`return this.${att.storageName};`);
40
- this.code.closeBlock();
41
- break;
42
- }
43
- const setterType = att.setterType;
44
- switch (setterType._type) {
45
- case "set":
46
- this.code.openBlock(`public set ${att.name}(value: ${setterType.type})`);
47
- this.code.line(`this.${att.storageName} = value;`);
48
- this.code.closeBlock();
49
- break;
50
- case "put":
51
- this.code.openBlock(`public put${titleCase(att.name)}(value: ${setterType.type})`);
52
- this.code.line(`this.${att.storageName} = value;`);
53
- this.code.closeBlock();
54
- break;
55
- case "stored_class":
56
- this.code.openBlock(`public put${titleCase(att.name)}(value: ${setterType.type})`);
57
- this.code.line(`this.${att.storageName}.internalValue = value;`);
58
- this.code.closeBlock();
59
- break;
60
- }
61
- if (hasResetMethod) {
62
- this.code.openBlock(`public ${this.getResetName(att.name, escapeReset)}()`);
63
- if (setterType._type === "stored_class") {
64
- this.code.line(`this.${att.storageName}.internalValue = undefined;`);
65
- }
66
- else {
67
- this.code.line(`this.${att.storageName} = undefined;`);
68
- }
69
- this.code.closeBlock();
70
- }
71
- if (hasInputMethod) {
72
- this.code.line(`// Temporarily expose input value. Use with caution.`);
73
- this.code.openBlock(`public get ${this.getInputName(att, escapeInput)}()`);
74
- if (setterType._type === "stored_class") {
75
- this.code.line(`return this.${att.storageName}.internalValue;`);
76
- }
77
- else {
78
- this.code.line(`return this.${att.storageName};`);
79
- }
80
- this.code.closeBlock();
81
- }
82
- }
83
- // returns an invocation of a stored class, e.g. 'new DeplotmentMetadataOutputReference(this, "metadata")'
84
- storedClassInit(att) {
85
- return att.type.getStoredClassInitializer(att.terraformName);
86
- }
87
- determineGetAttCall(att) {
88
- if (att.isProvider) {
89
- return `this.${att.storageName}`;
90
- }
91
- return att.type.getAttributeAccessFunction(att.terraformName);
92
- }
93
- needsInputEscape(att, attributes) {
94
- return (attributes.find((a) => a.terraformName.match(`^${att.terraformName}_input$`)) instanceof models_1.AttributeModel);
95
- }
96
- getInputName(att, escape) {
97
- if (escape) {
98
- return `${att.name}TfInput`;
99
- }
100
- else {
101
- return `${att.name}Input`;
102
- }
103
- }
104
- needsResetEscape(att, attributes) {
105
- return (attributes.find((a) => a.terraformName.match(`^reset_${att.terraformName}$`)) instanceof models_1.AttributeModel);
106
- }
107
- getResetName(name, escape) {
108
- if (!name)
109
- return name;
110
- if (escape) {
111
- return `resetTf${titleCase(name)}`;
112
- }
113
- else {
114
- return `reset${titleCase(name)}`;
115
- }
116
- }
117
- emitToHclTerraform(att, isStruct) {
118
- var _a;
119
- const type = att.type;
120
- const context = isStruct ? "struct!" : "this";
121
- const name = isStruct ? att.name : att.storageName;
122
- const customDefault = custom_defaults_1.CUSTOM_DEFAULTS[att.terraformFullName];
123
- const varReference = `${context}.${name}${!isStruct &&
124
- type.isComplex &&
125
- !att.isProvider &&
126
- (((_a = type.struct) === null || _a === void 0 ? void 0 : _a.isClass) || att.getterType._type === "stored_class")
127
- ? ".internalValue"
128
- : ""}`;
129
- const defaultCheck = customDefault !== undefined
130
- ? `${varReference} === undefined ? ${customDefault} : `
131
- : "";
132
- const value = `${defaultCheck}${type.toHclTerraformFunction}(${varReference})`;
133
- const isBlock = att.type.isComplex;
134
- const tt = att.type.typeModelType;
135
- this.code.open(`${att.terraformName}: {`);
136
- this.code.line(`value: ${value},`);
137
- this.code.line(`isBlock: ${isBlock},`);
138
- this.code.line(`type: "${tt}",`);
139
- this.code.line(`storageClassType: "${att.type.storedClassType}",`);
140
- this.code.close("},");
141
- }
142
- emitToTerraform(att, isStruct) {
143
- var _a;
144
- const type = att.type;
145
- const context = isStruct ? "struct!" : "this";
146
- const name = isStruct ? att.name : att.storageName;
147
- const customDefault = custom_defaults_1.CUSTOM_DEFAULTS[att.terraformFullName];
148
- const varReference = `${context}.${name}${!isStruct &&
149
- type.isComplex &&
150
- !att.isProvider &&
151
- (((_a = type.struct) === null || _a === void 0 ? void 0 : _a.isClass) || att.getterType._type === "stored_class")
152
- ? ".internalValue"
153
- : ""}`;
154
- const defaultCheck = customDefault !== undefined
155
- ? `${varReference} === undefined ? ${customDefault} : `
156
- : "";
157
- this.code.line(`${att.terraformName}: ${defaultCheck}${type.toTerraformFunction}(${varReference}),`);
158
- }
159
- }
160
- exports.AttributesEmitter = AttributesEmitter;
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy1lbWl0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXR0cmlidXRlcy1lbWl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHNDQUEyQztBQUMzQyx3REFBcUQ7QUFFckQsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFhLGlCQUFpQjtJQUM1QixZQUFvQixJQUFlO1FBQWYsU0FBSSxHQUFKLElBQUksQ0FBVztJQUFHLENBQUM7SUFFaEMsSUFBSSxDQUFDLEdBQW1CLEVBQUUsV0FBb0IsRUFBRSxXQUFvQjtRQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLE1BQU0sR0FBRyxDQUFDLGFBQWEsZ0JBQWdCLEdBQUcsQ0FBQyxRQUFRLGVBQWUsR0FBRyxDQUFDLFVBQVUsZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQ2hILENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzlCLE1BQU0sY0FBYyxHQUNsQixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQztRQUNqRSxNQUFNLGNBQWMsR0FBRyxRQUFRLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDO1FBRW5FLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFFbEMsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLFdBQVcsR0FBRyxD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QUMsR0FBRyxDQUFDLFVBQVU7WUFDZixDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxPQUFPLEtBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxnQkFBZ0I7WUFDbEIsQ0FBQyxDQUFDLEVBQ04sRUFBRSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQ2hCLGFBQWEsS0FBSyxTQUFTO1lBQ3pCLENBQUMsQ0FBQyxHQUFHLFlBQVksb0JBQW9CLGFBQWEsS0FBSztZQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osR0FBRyxHQUFHLENBQUMsYUFBYSxLQUFLLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLElBQUksWUFBWSxJQUFJLENBQ3JGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF0TkQsOENBc05DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuaW1wb3J0IHsgQ1VTVE9NX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2N1c3RvbS1kZWZhdWx0c1wiO1xuXG5mdW5jdGlvbiB0aXRsZUNhc2UodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gdmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xufVxuXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlc0VtaXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvZGU6IENvZGVNYWtlcikge31cblxuICBwdWJsaWMgZW1pdChhdHQ6IEF0dHJpYnV0ZU1vZGVsLCBlc2NhcGVSZXNldDogYm9vbGVhbiwgZXNjYXBlSW5wdXQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYC8vICR7YXR0LnRlcnJhZm9ybU5hbWV9IC0gY29tcHV0ZWQ6ICR7YXR0LmNvbXB1dGVkfSwgb3B0aW9uYWw6ICR7YXR0LmlzT3B0aW9uYWx9LCByZXF1aXJlZDogJHthdHQuaXNSZXF1aXJlZH1gLFxuICAgICk7XG5cbiAgICBjb25zdCBpc1N0b3JlZCA9IGF0dC5pc1N0b3JlZDtcbiAgICBjb25zdCBoYXNSZXNldE1ldGhvZCA9XG4gICAgICBpc1N0b3JlZCAmJiAhYXR0LmlzUmVxdWlyZWQgJiYgYXR0LnNldHRlclR5cGUuX3R5cGUgIT09IFwibm9uZVwiO1xuICAgIGNvbnN0IGhhc0lucHV0TWV0aG9kID0gaXNTdG9yZWQgJiYgYXR0LnNldHRlclR5cGUuX3R5cGUgIT09IFwibm9uZVwiO1xuXG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IGF0dC5nZXR0ZXJUeXBlO1xuXG4gICAgaWYgKGdldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJpdmF0ZSAke2F0dC5zdG9yYWdlTmFtZX0gPSAke3RoaXMuc3RvcmVkQ2xhc3NJbml0KGF0dCl9O2AsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNTdG9yZWQpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJpdmF0ZSAke2F0dC5zdG9yYWdlTmFtZX0/OiAke2F0dC50eXBlLmlucHV0VHlwZURlZmluaXRpb259OyBgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdldHRlclR5cGUuX3R5cGUpIHtcbiAgICAgIGNhc2UgXCJwbGFpblwiOlxuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgZ2V0ICR7YXR0Lm5hbWV9KClgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiAke3RoaXMuZGV0ZXJtaW5lR2V0QXR0Q2FsbChhdHQpfTtgKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJhcmdzXCI6XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyAke2F0dC5uYW1lfSgke2dldHRlclR5cGUuYXJnc30pJHtcbiAgICAgICAgICAgIGdldHRlclR5cGUucmV0dXJuVHlwZSA/IFwiOiBcIiArIGdldHRlclR5cGUucmV0dXJuVHlwZSA6IFwiXCJcbiAgICAgICAgICB9YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiAke2dldHRlclR5cGUucmV0dXJuU3RhdGVtZW50fTtgKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJzdG9yZWRfY2xhc3NcIjpcbiAgICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGdldCAke2F0dC5uYW1lfSgpYCk7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke2F0dC5zdG9yYWdlTmFtZX07YCk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRlclR5cGUgPSBhdHQuc2V0dGVyVHlwZTtcblxuICAgIHN3aXRjaCAoc2V0dGVyVHlwZS5fdHlwZSkge1xuICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgIGBwdWJsaWMgc2V0ICR7YXR0Lm5hbWV9KHZhbHVlOiAke3NldHRlclR5cGUudHlwZX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9ID0gdmFsdWU7YCk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwicHV0XCI6XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyBwdXQke3RpdGxlQ2FzZShhdHQubmFtZSl9KHZhbHVlOiAke3NldHRlclR5cGUudHlwZX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9ID0gdmFsdWU7YCk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwic3RvcmVkX2NsYXNzXCI6XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyBwdXQke3RpdGxlQ2FzZShhdHQubmFtZSl9KHZhbHVlOiAke3NldHRlclR5cGUudHlwZX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSB2YWx1ZTtgKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGhhc1Jlc2V0TWV0aG9kKSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljICR7dGhpcy5nZXRSZXNldE5hbWUoYXR0Lm5hbWUsIGVzY2FwZVJlc2V0KX0oKWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2V0dGVyVHlwZS5fdHlwZSA9PT0gXCJzdG9yZWRfY2xhc3NcIikge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke2F0dC5zdG9yYWdlTmFtZX0uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IHVuZGVmaW5lZDtgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzSW5wdXRNZXRob2QpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uYCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIGdldCAke3RoaXMuZ2V0SW5wdXROYW1lKGF0dCwgZXNjYXBlSW5wdXQpfSgpYCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChzZXR0ZXJUeXBlLl90eXBlID09PSBcInN0b3JlZF9jbGFzc1wiKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke2F0dC5zdG9yYWdlTmFtZX0uaW50ZXJuYWxWYWx1ZTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke2F0dC5zdG9yYWdlTmFtZX07YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJucyBhbiBpbnZvY2F0aW9uIG9mIGEgc3RvcmVkIGNsYXNzLCBlLmcuICduZXcgRGVwbG90bWVudE1ldGFkYXRhT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwibWV0YWRhdGFcIiknXG4gIHByaXZhdGUgc3RvcmVkQ2xhc3NJbml0KGF0dDogQXR0cmlidXRlTW9kZWwpIHtcbiAgICByZXR1cm4gYXR0LnR5cGUuZ2V0U3RvcmVkQ2xhc3NJbml0aWFsaXplcihhdHQudGVycmFmb3JtTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZGV0ZXJtaW5lR2V0QXR0Q2FsbChhdHQ6IEF0dHJpYnV0ZU1vZGVsKTogc3RyaW5nIHtcbiAgICBpZiAoYXR0LmlzUHJvdmlkZXIpIHtcbiAgICAgIHJldHVybiBgdGhpcy4ke2F0dC5zdG9yYWdlTmFtZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBhdHQudHlwZS5nZXRBdHRyaWJ1dGVBY2Nlc3NGdW5jdGlvbihhdHQudGVycmFmb3JtTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgbmVlZHNJbnB1dEVzY2FwZShcbiAgICBhdHQ6IEF0dHJpYnV0ZU1vZGVsLFxuICAgIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZU1vZGVsW10sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhdHRyaWJ1dGVzLmZpbmQoKGEpID0+XG4gICAgICAgIGEudGVycmFmb3JtTmFtZS5tYXRjaChgXiR7YXR0LnRlcnJhZm9ybU5hbWV9X2lucHV0JGApLFxuICAgICAgKSBpbnN0YW5jZW9mIEF0dHJpYnV0ZU1vZGVsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnB1dE5hbWUoYXR0OiBBdHRyaWJ1dGVNb2RlbCwgZXNjYXBlOiBib29sZWFuKSB7XG4gICAgaWYgKGVzY2FwZSkge1xuICAgICAgcmV0dXJuIGAke2F0dC5uYW1lfVRmSW5wdXRgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7YXR0Lm5hbWV9SW5wdXRgO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZWVkc1Jlc2V0RXNjYXBlKFxuICAgIGF0dDogQXR0cmlidXRlTW9kZWwsXG4gICAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF0dHJpYnV0ZXMuZmluZCgoYSkgPT5cbiAgICAgICAgYS50ZXJyYWZvcm1OYW1lLm1hdGNoKGBecmVzZXRfJHthdHQudGVycmFmb3JtTmFtZX0kYCksXG4gICAgICApIGluc3RhbmNlb2YgQXR0cmlidXRlTW9kZWxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFJlc2V0TmFtZShuYW1lOiBzdHJpbmcsIGVzY2FwZTogYm9vbGVhbikge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG5hbWU7XG4gICAgaWYgKGVzY2FwZSkge1xuICAgICAgcmV0dXJuIGByZXNldFRmJHt0aXRsZUNhc2UobmFtZSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGByZXNldCR7dGl0bGVDYXNlKG5hbWUpfWA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXRUb0hjbFRlcnJhZm9ybShhdHQ6IEF0dHJpYnV0ZU1vZGVsLCBpc1N0cnVjdDogYm9vbGVhbikge1xuICAgIGNvbnN0IHR5cGUgPSBhdHQudHlwZTtcbiAgICBjb25zdCBjb250ZXh0ID0gaXNTdHJ1Y3QgPyBcInN0cnVjdCFcIiA6IFwidGhpc1wiO1xuICAgIGNvbnN0IG5hbWUgPSBpc1N0cnVjdCA/IGF0dC5uYW1lIDogYXR0LnN0b3JhZ2VOYW1lO1xuICAgIGNvbnN0IGN1c3RvbURlZmF1bHQgPSBDVVNUT01fREVGQVVMVFNbYXR0LnRlcnJhZm9ybUZ1bGxOYW1lXTtcblxuICAgIGNvbnN0IHZhclJlZmVyZW5jZSA9IGAke2NvbnRleHR9LiR7bmFtZX0ke1xuICAgICAgIWlzU3RydWN0ICYmXG4gICAgICB0eXBlLmlzQ29tcGxleCAmJlxuICAgICAgIWF0dC5pc1Byb3ZpZGVyICYmXG4gICAgICAodHlwZS5zdHJ1Y3Q/LmlzQ2xhc3MgfHwgYXR0LmdldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpXG4gICAgICAgID8gXCIuaW50ZXJuYWxWYWx1ZVwiXG4gICAgICAgIDogXCJcIlxuICAgIH1gO1xuICAgIGNvbnN0IGRlZmF1bHRDaGVjayA9XG4gICAgICBjdXN0b21EZWZhdWx0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBgJHt2YXJSZWZlcmVuY2V9ID09PSB1bmRlZmluZWQgPyAke2N1c3RvbURlZmF1bHR9IDogYFxuICAgICAgICA6IFwiXCI7XG5cbiAgICBjb25zdCB2YWx1ZSA9IGAke2RlZmF1bHRDaGVja30ke3R5cGUudG9IY2xUZXJyYWZvcm1GdW5jdGlvbn0oJHt2YXJSZWZlcmVuY2V9KWA7XG4gICAgY29uc3QgaXNCbG9jayA9IGF0dC50eXBlLmlzQ29tcGxleDtcbiAgICBjb25zdCB0dCA9IGF0dC50eXBlLnR5cGVNb2RlbFR5cGU7XG5cbiAgICB0aGlzLmNvZGUub3BlbihgJHthdHQudGVycmFmb3JtTmFtZX06IHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShgdmFsdWU6ICR7dmFsdWV9LGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBpc0Jsb2NrOiAke2lzQmxvY2t9LGApO1xuICAgIHRoaXMuY29kZS5saW5lKGB0eXBlOiBcIiR7dHR9XCIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHN0b3JhZ2VDbGFzc1R5cGU6IFwiJHthdHQudHlwZS5zdG9yZWRDbGFzc1R5cGV9XCIsYCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlKFwifSxcIik7XG4gIH1cblxuICBwdWJsaWMgZW1pdFRvVGVycmFmb3JtKGF0dDogQXR0cmlidXRlTW9kZWwsIGlzU3RydWN0OiBib29sZWFuKSB7XG4gICAgY29uc3QgdHlwZSA9IGF0dC50eXBlO1xuICAgIGNvbnN0IGNvbnRleHQgPSBpc1N0cnVjdCA/IFwic3RydWN0IVwiIDogXCJ0aGlzXCI7XG4gICAgY29uc3QgbmFtZSA9IGlzU3RydWN0ID8gYXR0Lm5hbWUgOiBhdHQuc3RvcmFnZU5hbWU7XG4gICAgY29uc3QgY3VzdG9tRGVmYXVsdCA9IENVU1RPTV9ERUZBVUxUU1thdHQudGVycmFmb3JtRnVsbE5hbWVdO1xuXG4gICAgY29uc3QgdmFyUmVmZXJlbmNlID0gYCR7Y29udGV4dH0uJHtuYW1lfSR7XG4gICAgICAhaXNTdHJ1Y3QgJiZcbiAgICAgIHR5cGUuaXNDb21wbGV4ICYmXG4gICAgICAhYXR0LmlzUHJvdmlkZXIgJiZcbiAgICAgICh0eXBlLnN0cnVjdD8uaXNDbGFzcyB8fCBhdHQuZ2V0dGVyVHlwZS5fdHlwZSA9PT0gXCJzdG9yZWRfY2xhc3NcIilcbiAgICAgICAgPyBcIi5pbnRlcm5hbFZhbHVlXCJcbiAgICAgICAgOiBcIlwiXG4gICAgfWA7XG4gICAgY29uc3QgZGVmYXVsdENoZWNrID1cbiAgICAgIGN1c3RvbURlZmF1bHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGAke3ZhclJlZmVyZW5jZX0gPT09IHVuZGVmaW5lZCA/ICR7Y3VzdG9tRGVmYXVsdH0gOiBgXG4gICAgICAgIDogXCJcIjtcblxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCR7YXR0LnRlcnJhZm9ybU5hbWV9OiAke2RlZmF1bHRDaGVja30ke3R5cGUudG9UZXJyYWZvcm1GdW5jdGlvbn0oJHt2YXJSZWZlcmVuY2V9KSxgLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,144 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ResourceEmitter = void 0;
4
- const attributes_emitter_1 = require("./attributes-emitter");
5
- const sanitized_comments_1 = require("../sanitized-comments");
6
- class ResourceEmitter {
7
- constructor(code) {
8
- this.code = code;
9
- this.attributesEmitter = new attributes_emitter_1.AttributesEmitter(this.code);
10
- }
11
- emit(resource) {
12
- this.code.line();
13
- const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
14
- comment.line(`Represents a {@link ${resource.linkToDocs} ${resource.terraformResourceType}}`);
15
- comment.end();
16
- this.code.openBlock(`export class ${resource.className} extends cdktn.${resource.parentClassName}`);
17
- this.emitHeader("STATIC PROPERTIES");
18
- this.emitStaticProperties(resource);
19
- this.emitHeader("STATIC Methods");
20
- this.emitStaticMethods(resource);
21
- this.emitHeader("INITIALIZER");
22
- this.emitInitializer(resource);
23
- this.emitHeader("ATTRIBUTES");
24
- this.emitResourceAttributes(resource);
25
- // synthesis
26
- this.emitHeader("SYNTHESIS");
27
- this.emitResourceSynthesis(resource);
28
- this.emitHclResourceSynthesis(resource);
29
- this.code.closeBlock(); // construct
30
- }
31
- emitHeader(title) {
32
- this.code.line();
33
- this.code.line("// " + "=".repeat(title.length));
34
- this.code.line(`// ${title}`);
35
- this.code.line("// " + "=".repeat(title.length));
36
- }
37
- emitStaticProperties(resource) {
38
- this.code.line(`public static readonly tfResourceType = "${resource.terraformResourceType}";`);
39
- }
40
- emitStaticMethods(resource) {
41
- const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
42
- comment.line(`Generates CDKTN code for importing a ${resource.className} resource upon running "cdktn plan <stack-name>"`);
43
- comment.line(`@param scope The scope in which to define this construct`);
44
- comment.line(`@param importToId The construct id used in the generated config for the ${resource.className} to import`);
45
- comment.line(`@param importFromId The id of the existing ${resource.className} that should be imported. Refer to the {@link ${resource.linkToDocs}#import import section} in the documentation of this resource for the id to use`);
46
- comment.line(`@param provider? Optional instance of the provider where the ${resource.className} to import is found`);
47
- comment.end();
48
- this.code.line(`public static generateConfigForImport(scope: Construct, importToId: string, importFromId: string, provider?: cdktn.TerraformProvider) {
49
- return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "${resource.terraformResourceType}", importId: importFromId, provider });
50
- }`);
51
- }
52
- emitHclResourceSynthesis(resource) {
53
- this.code.line();
54
- this.code.openBlock(`protected synthesizeHclAttributes(): { [name: string]: any }`);
55
- this.code.open(`const attrs = {`);
56
- for (const att of resource.synthesizableAttributes) {
57
- this.attributesEmitter.emitToHclTerraform(att, false);
58
- }
59
- this.code.close(`};`);
60
- if (resource.synthesizableAttributes.length > 0) {
61
- this.code.line();
62
- this.code.line(`// remove undefined attributes`);
63
- this.code.line(`return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined ))`);
64
- }
65
- else {
66
- this.code.line(`return attrs;`);
67
- }
68
- this.code.closeBlock();
69
- }
70
- emitResourceSynthesis(resource) {
71
- this.code.line();
72
- this.code.openBlock(`protected synthesizeAttributes(): { [name: string]: any }`);
73
- this.code.open(`return {`);
74
- for (const att of resource.synthesizableAttributes) {
75
- this.attributesEmitter.emitToTerraform(att, false);
76
- }
77
- this.code.close(`};`);
78
- this.code.closeBlock();
79
- }
80
- emitResourceAttributes(resource) {
81
- for (const att of resource.attributes) {
82
- this.attributesEmitter.emit(att, this.attributesEmitter.needsResetEscape(att, resource.attributes), this.attributesEmitter.needsInputEscape(att, resource.attributes));
83
- }
84
- }
85
- emitInitializer(resource) {
86
- this.code.line();
87
- const comment = (0, sanitized_comments_1.sanitizedComment)(this.code);
88
- comment.line(`Create a new {@link ${resource.linkToDocs} ${resource.terraformResourceType}} ${resource.isDataSource ? "Data Source" : "Resource"}`);
89
- comment.line(``);
90
- comment.line(`@param scope The scope in which to define this construct`);
91
- comment.line(`@param id The scoped construct ID. Must be unique amongst siblings in the same scope`);
92
- comment.line(`@param options ${resource.configStruct.attributeType}`);
93
- comment.end();
94
- this.code.openBlock(`public constructor(scope: Construct, id: string, config: ${resource.configStruct.attributeType})`);
95
- resource.isProvider
96
- ? this.emitProviderSuper(resource)
97
- : this.emitResourceSuper(resource);
98
- // initialize config properties
99
- for (const att of resource.configStruct.assignableAttributes) {
100
- if (att.setterType._type === "stored_class") {
101
- this.code.line(`this.${att.storageName}.internalValue = config.${att.name};`);
102
- }
103
- else {
104
- this.code.line(`this.${att.storageName} = config.${att.name};`);
105
- }
106
- }
107
- this.code.closeBlock();
108
- }
109
- emitResourceSuper(resource) {
110
- this.code.open(`super(scope, id, {`);
111
- this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
112
- this.emitTerraformGeneratorMetadata(resource);
113
- this.code.line(`provider: config.provider,`);
114
- this.code.line(`dependsOn: config.dependsOn,`);
115
- this.code.line(`count: config.count,`);
116
- this.code.line(`lifecycle: config.lifecycle,`);
117
- this.code.line(`provisioners: config.provisioners,`);
118
- this.code.line(`connection: config.connection,`);
119
- this.code.line(`forEach: config.forEach`);
120
- this.code.close(`});`);
121
- }
122
- emitProviderSuper(resource) {
123
- this.code.open(`super(scope, id, {`);
124
- this.code.line(`terraformResourceType: '${resource.terraformResourceType}',`);
125
- this.emitTerraformGeneratorMetadata(resource);
126
- this.code.line(`terraformProviderSource: '${resource.terraformProviderSource}'`);
127
- this.code.close(`});`);
128
- }
129
- emitTerraformGeneratorMetadata(resource) {
130
- this.code.open(`terraformGeneratorMetadata: {`);
131
- this.code.line(`providerName: '${resource.provider}'${resource.providerVersion || resource.providerVersionConstraint
132
- ? ","
133
- : ""}`);
134
- if (resource.providerVersion) {
135
- this.code.line(`providerVersion: '${resource.providerVersion}'${resource.providerVersionConstraint ? "," : ""}`);
136
- }
137
- if (resource.providerVersionConstraint) {
138
- this.code.line(`providerVersionConstraint: '${resource.providerVersionConstraint}'`);
139
- }
140
- this.code.close(`},`);
141
- }
142
- }
143
- exports.ResourceEmitter = ResourceEmitter;
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlc291cmNlLWVtaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsNkRBQXlEO0FBQ3pELDhEQUF5RDtBQUV6RCxNQUFhLGVBQWU7SUFHMUIsWUFBNkIsSUFBZTtRQUFmLFNBQUksR0FBSixJQUFJLENBQVc7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksc0NBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxJQUFJLENBQUMsUUFBdUI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFnQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsSUFBSSxDQUNWLHVCQUF1QixRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxDQUNoRixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLGdCQUFnQixRQUFRLENBQUMsU0FBUyxrQkFBa0IsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUMvRSxDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsVUFBVSxDQUFDLFlB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QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiw2QkFBNkIsUUFBUSxDQUFDLHVCQUF1QixHQUFHLENBQ2pFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRU8sOEJBQThCLENBQUMsUUFBdUI7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixrQkFBa0IsUUFBUSxDQUFDLFFBQVEsSUFDakMsUUFBUSxDQUFDLGVBQWUsSUFBSSxRQUFRLENBQUMseUJBQXlCO1lBQzVELENBQUMsQ0FBQyxHQUFHO1lBQ0wsQ0FBQyxDQUFDLEVBQ04sRUFBRSxDQUNILENBQUM7UUFFRixJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixxQkFBcUIsUUFBUSxDQUFDLGVBQWUsSUFDM0MsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQzdDLEVBQUUsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osK0JBQStCLFFBQVEsQ0FBQyx5QkFBeUIsR0FBRyxDQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQXhORCwwQ0F3TkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0IHsgQ29kZU1ha2VyIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHNcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZXNFbWl0dGVyIH0gZnJvbSBcIi4vYXR0cmlidXRlcy1lbWl0dGVyXCI7XG5pbXBvcnQgeyBzYW5pdGl6ZWRDb21tZW50IH0gZnJvbSBcIi4uL3Nhbml0aXplZC1jb21tZW50c1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VFbWl0dGVyIHtcbiAgYXR0cmlidXRlc0VtaXR0ZXI6IEF0dHJpYnV0ZXNFbWl0dGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlciA9IG5ldyBBdHRyaWJ1dGVzRW1pdHRlcih0aGlzLmNvZGUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZWRDb21tZW50KHRoaXMuY29kZSk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYFJlcHJlc2VudHMgYSB7QGxpbmsgJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSAke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX19YCxcbiAgICApO1xuICAgIGNvbW1lbnQuZW5kKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBleHBvcnQgY2xhc3MgJHtyZXNvdXJjZS5jbGFzc05hbWV9IGV4dGVuZHMgY2RrdG4uJHtyZXNvdXJjZS5wYXJlbnRDbGFzc05hbWV9YCxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0SGVhZGVyKFwiU1RBVElDIFBST1BFUlRJRVNcIik7XG4gICAgdGhpcy5lbWl0U3RhdGljUHJvcGVydGllcyhyZXNvdXJjZSk7XG5cbiAgICB0aGlzLmVtaXRIZWFkZXIoXCJTVEFUSUMgTWV0aG9kc1wiKTtcbiAgICB0aGlzLmVtaXRTdGF0aWNNZXRob2RzKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIklOSVRJQUxJWkVSXCIpO1xuICAgIHRoaXMuZW1pdEluaXRpYWxpemVyKHJlc291cmNlKTtcblxuICAgIHRoaXMuZW1pdEhlYWRlcihcIkFUVFJJQlVURVNcIik7XG4gICAgdGhpcy5lbWl0UmVzb3VyY2VBdHRyaWJ1dGVzKHJlc291cmNlKTtcblxuICAgIC8vIHN5bnRoZXNpc1xuICAgIHRoaXMuZW1pdEhlYWRlcihcIlNZTlRIRVNJU1wiKTtcbiAgICB0aGlzLmVtaXRSZXNvdXJjZVN5bnRoZXNpcyhyZXNvdXJjZSk7XG4gICAgdGhpcy5lbWl0SGNsUmVzb3VyY2VTeW50aGVzaXMocmVzb3VyY2UpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY29uc3RydWN0XG4gIH1cblxuICBwcml2YXRlIGVtaXRIZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXCIvLyBcIiArIFwiPVwiLnJlcGVhdCh0aXRsZS5sZW5ndGgpKTtcbiAgICB0aGlzLmNvZGUubGluZShgLy8gJHt0aXRsZX1gKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIFwiICsgXCI9XCIucmVwZWF0KHRpdGxlLmxlbmd0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljUHJvcGVydGllcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcIiR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfVwiO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRpY01ldGhvZHMocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJgLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdGApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSAke3Jlc291cmNlLmNsYXNzTmFtZX0gdG8gaW1wb3J0YCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30jaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlYCxcbiAgICApO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgJHtyZXNvdXJjZS5jbGFzc05hbWV9IHRvIGltcG9ydCBpcyBmb3VuZGAsXG4gICAgKTtcbiAgICBjb21tZW50LmVuZCgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0bi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RuLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiJHtyZXNvdXJjZS50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9XCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEhjbFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUub3BlbihgY29uc3QgYXR0cnMgPSB7YCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiByZXNvdXJjZS5zeW50aGVzaXphYmxlQXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5lbWl0VG9IY2xUZXJyYWZvcm0oYXR0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlKGB9O2ApO1xuXG4gICAgaWYgKHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZShgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzYCk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICkpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gYXR0cnM7YCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlc291cmNlU3ludGhlc2lzKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUub3BlbihgcmV0dXJuIHtgKTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLnN5bnRoZXNpemFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLmVtaXRUb1RlcnJhZm9ybShhdHQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2UoYH07YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlc291cmNlQXR0cmlidXRlcyhyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIGZvciAoY29uc3QgYXR0IG9mIHJlc291cmNlLmF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlc0VtaXR0ZXIuZW1pdChcbiAgICAgICAgYXR0LFxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNFbWl0dGVyLm5lZWRzUmVzZXRFc2NhcGUoYXR0LCByZXNvdXJjZS5hdHRyaWJ1dGVzKSxcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzRW1pdHRlci5uZWVkc0lucHV0RXNjYXBlKGF0dCwgcmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEluaXRpYWxpemVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVkQ29tbWVudCh0aGlzLmNvZGUpO1xuICAgIGNvbW1lbnQubGluZShcbiAgICAgIGBDcmVhdGUgYSBuZXcge0BsaW5rICR7cmVzb3VyY2UubGlua1RvRG9jc30gJHtcbiAgICAgICAgcmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlXG4gICAgICB9fSAke3Jlc291cmNlLmlzRGF0YVNvdXJjZSA/IFwiRGF0YSBTb3VyY2VcIiA6IFwiUmVzb3VyY2VcIn1gLFxuICAgICk7XG4gICAgY29tbWVudC5saW5lKGBgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0YCk7XG4gICAgY29tbWVudC5saW5lKFxuICAgICAgYEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZWAsXG4gICAgKTtcbiAgICBjb21tZW50LmxpbmUoYEBwYXJhbSBvcHRpb25zICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9YCk7XG4gICAgY29tbWVudC5lbmQoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6ICR7cmVzb3VyY2UuY29uZmlnU3RydWN0LmF0dHJpYnV0ZVR5cGV9KWAsXG4gICAgKTtcblxuICAgIHJlc291cmNlLmlzUHJvdmlkZXJcbiAgICAgID8gdGhpcy5lbWl0UHJvdmlkZXJTdXBlcihyZXNvdXJjZSlcbiAgICAgIDogdGhpcy5lbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZSk7XG5cbiAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBhdHQgb2YgcmVzb3VyY2UuY29uZmlnU3RydWN0LmFzc2lnbmFibGVBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0LnNldHRlclR5cGUuX3R5cGUgPT09IFwic3RvcmVkX2NsYXNzXCIpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHthdHQuc3RvcmFnZU5hbWV9LmludGVybmFsVmFsdWUgPSBjb25maWcuJHthdHQubmFtZX07YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7YXR0LnN0b3JhZ2VOYW1lfSA9IGNvbmZpZy4ke2F0dC5uYW1lfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VTdXBlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5vcGVuKGBzdXBlcihzY29wZSwgaWQsIHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICcke3Jlc291cmNlLnRlcnJhZm9ybVJlc291cmNlVHlwZX0nLGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRUZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YShyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixgKTtcbiAgICB0aGlzLmNvZGUubGluZShgY291bnQ6IGNvbmZpZy5jb3VudCxgKTtcbiAgICB0aGlzLmNvZGUubGluZShgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLGApO1xuICAgIHRoaXMuY29kZS5saW5lKGBmb3JFYWNoOiBjb25maWcuZm9yRWFjaGApO1xuICAgIHRoaXMuY29kZS5jbG9zZShgfSk7YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm92aWRlclN1cGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLm9wZW4oYHN1cGVyKHNjb3BlLCBpZCwge2ApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHRlcnJhZm9ybVJlc291cmNlVHlwZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUmVzb3VyY2VUeXBlfScsYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhKHJlc291cmNlKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0ZXJyYWZvcm1Qcm92aWRlclNvdXJjZTogJyR7cmVzb3VyY2UudGVycmFmb3JtUHJvdmlkZXJTb3VyY2V9J2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2UoYH0pO2ApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpIHtcbiAgICB0aGlzLmNvZGUub3BlbihgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBwcm92aWRlck5hbWU6ICcke3Jlc291cmNlLnByb3ZpZGVyfScke1xuICAgICAgICByZXNvdXJjZS5wcm92aWRlclZlcnNpb24gfHwgcmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludFxuICAgICAgICAgID8gXCIsXCJcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG5cbiAgICBpZiAocmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbjogJyR7cmVzb3VyY2UucHJvdmlkZXJWZXJzaW9ufScke1xuICAgICAgICAgIHJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQgPyBcIixcIiA6IFwiXCJcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZXNvdXJjZS5wcm92aWRlclZlcnNpb25Db25zdHJhaW50KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICcke3Jlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZShgfSxgKTtcbiAgfVxufVxuIl19