@mnaoumov/typescript-lib 0.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/@types/debug/package.json +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +15 -1
  4. package/dist/lib/cjs/@types/debug.d.cts +21 -0
  5. package/dist/lib/cjs/abort-controller.cjs +144 -0
  6. package/dist/lib/cjs/abort-controller.d.cts +136 -0
  7. package/dist/lib/cjs/aggregate-error.cjs +40 -0
  8. package/dist/lib/cjs/aggregate-error.d.cts +24 -0
  9. package/dist/lib/cjs/array-buffer.cjs +38 -0
  10. package/dist/lib/cjs/array-buffer.d.cts +16 -0
  11. package/dist/lib/cjs/array.cjs +76 -0
  12. package/dist/lib/cjs/array.d.cts +46 -0
  13. package/dist/lib/cjs/async-events.cjs +408 -0
  14. package/dist/lib/cjs/async-events.d.cts +456 -0
  15. package/dist/lib/cjs/async-operation-hook.cjs +55 -0
  16. package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
  17. package/dist/lib/cjs/async.cjs +463 -0
  18. package/dist/lib/cjs/async.d.cts +415 -0
  19. package/dist/lib/cjs/beeper.cjs +68 -0
  20. package/dist/lib/cjs/beeper.d.cts +21 -0
  21. package/dist/lib/cjs/blob.cjs +102 -0
  22. package/dist/lib/cjs/blob.d.cts +60 -0
  23. package/dist/lib/cjs/bytes.cjs +56 -0
  24. package/dist/lib/cjs/bytes.d.cts +17 -0
  25. package/dist/lib/cjs/debug-controller.cjs +22 -0
  26. package/dist/lib/cjs/debug-controller.d.cts +87 -0
  27. package/dist/lib/cjs/debug.cjs +204 -0
  28. package/dist/lib/cjs/debug.d.cts +66 -0
  29. package/dist/lib/cjs/desktop-zip-extractor.cjs +157 -0
  30. package/dist/lib/cjs/desktop-zip-extractor.d.cts +96 -0
  31. package/dist/lib/cjs/disposable.cjs +364 -0
  32. package/dist/lib/cjs/disposable.d.cts +387 -0
  33. package/dist/lib/cjs/enum.cjs +42 -0
  34. package/dist/lib/cjs/enum.d.cts +24 -0
  35. package/dist/lib/cjs/error.cjs +239 -0
  36. package/dist/lib/cjs/error.d.cts +182 -0
  37. package/dist/lib/cjs/function.cjs +83 -0
  38. package/dist/lib/cjs/function.d.cts +128 -0
  39. package/dist/lib/cjs/html-element.cjs +283 -0
  40. package/dist/lib/cjs/html-element.d.cts +200 -0
  41. package/dist/lib/cjs/index.cjs +137 -0
  42. package/dist/lib/cjs/index.d.cts +33 -0
  43. package/dist/lib/cjs/jpeg-metadata.cjs +170 -0
  44. package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
  45. package/dist/lib/cjs/library-references.d.cts +2 -0
  46. package/dist/lib/cjs/library.cjs +100 -0
  47. package/dist/lib/cjs/library.d.cts +96 -0
  48. package/dist/lib/cjs/object-utils.cjs +559 -0
  49. package/dist/lib/cjs/object-utils.d.cts +298 -0
  50. package/dist/lib/cjs/path.cjs +171 -0
  51. package/dist/lib/cjs/path.d.cts +155 -0
  52. package/dist/lib/cjs/reg-exp.cjs +196 -0
  53. package/dist/lib/cjs/reg-exp.d.cts +87 -0
  54. package/dist/lib/cjs/string.cjs +268 -0
  55. package/dist/lib/cjs/string.d.cts +362 -0
  56. package/dist/lib/cjs/transformers/date-transformer.cjs +71 -0
  57. package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
  58. package/dist/lib/cjs/transformers/group-transformer.cjs +115 -0
  59. package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
  60. package/dist/lib/cjs/transformers/index.cjs +65 -0
  61. package/dist/lib/cjs/transformers/index.d.cts +9 -0
  62. package/dist/lib/cjs/transformers/map-transformer.cjs +71 -0
  63. package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
  64. package/dist/lib/cjs/transformers/set-transformer.cjs +71 -0
  65. package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
  66. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +69 -0
  67. package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
  68. package/dist/lib/cjs/transformers/transformer.cjs +112 -0
  69. package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
  70. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +72 -0
  71. package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
  72. package/dist/lib/cjs/transformers/typed-transformer.cjs +36 -0
  73. package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
  74. package/dist/lib/cjs/two-way-map.cjs +150 -0
  75. package/dist/lib/cjs/two-way-map.d.cts +101 -0
  76. package/dist/lib/cjs/type-guards.cjs +70 -0
  77. package/dist/lib/cjs/type-guards.d.cts +84 -0
  78. package/dist/lib/cjs/type.cjs +63 -0
  79. package/dist/lib/cjs/type.d.cts +122 -0
  80. package/dist/lib/cjs/typescript-lib-state.cjs +68 -0
  81. package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
  82. package/dist/lib/cjs/url.cjs +78 -0
  83. package/dist/lib/cjs/url.d.cts +74 -0
  84. package/dist/lib/cjs/value-provider.cjs +42 -0
  85. package/dist/lib/cjs/value-provider.d.cts +29 -0
  86. package/dist/lib/cjs/value-wrapper.cjs +86 -0
  87. package/dist/lib/cjs/value-wrapper.d.cts +47 -0
  88. package/dist/lib/esm/@types/debug.d.mts +21 -0
  89. package/dist/lib/esm/abort-controller.d.mts +136 -0
  90. package/dist/lib/esm/abort-controller.mjs +115 -0
  91. package/dist/lib/esm/aggregate-error.d.mts +24 -0
  92. package/dist/lib/esm/aggregate-error.mjs +16 -0
  93. package/dist/lib/esm/array-buffer.d.mts +16 -0
  94. package/dist/lib/esm/array-buffer.mjs +14 -0
  95. package/dist/lib/esm/array.d.mts +46 -0
  96. package/dist/lib/esm/array.mjs +49 -0
  97. package/dist/lib/esm/async-events.d.mts +456 -0
  98. package/dist/lib/esm/async-events.mjs +383 -0
  99. package/dist/lib/esm/async-operation-hook.d.mts +59 -0
  100. package/dist/lib/esm/async-operation-hook.mjs +27 -0
  101. package/dist/lib/esm/async.d.mts +415 -0
  102. package/dist/lib/esm/async.mjs +435 -0
  103. package/dist/lib/esm/beeper.d.mts +21 -0
  104. package/dist/lib/esm/beeper.mjs +44 -0
  105. package/dist/lib/esm/blob.d.mts +60 -0
  106. package/dist/lib/esm/blob.mjs +77 -0
  107. package/dist/lib/esm/bytes.d.mts +17 -0
  108. package/dist/lib/esm/bytes.mjs +32 -0
  109. package/dist/lib/esm/debug-controller.d.mts +87 -0
  110. package/dist/lib/esm/debug-controller.mjs +6 -0
  111. package/dist/lib/esm/debug.d.mts +66 -0
  112. package/dist/lib/esm/debug.mjs +168 -0
  113. package/dist/lib/esm/desktop-zip-extractor.d.mts +96 -0
  114. package/dist/lib/esm/desktop-zip-extractor.mjs +136 -0
  115. package/dist/lib/esm/disposable.d.mts +387 -0
  116. package/dist/lib/esm/disposable.mjs +324 -0
  117. package/dist/lib/esm/enum.d.mts +24 -0
  118. package/dist/lib/esm/enum.mjs +17 -0
  119. package/dist/lib/esm/error.d.mts +182 -0
  120. package/dist/lib/esm/error.mjs +204 -0
  121. package/dist/lib/esm/function.d.mts +128 -0
  122. package/dist/lib/esm/function.mjs +52 -0
  123. package/dist/lib/esm/html-element.d.mts +200 -0
  124. package/dist/lib/esm/html-element.mjs +247 -0
  125. package/dist/lib/esm/index.d.mts +33 -0
  126. package/dist/lib/esm/index.mjs +72 -0
  127. package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
  128. package/dist/lib/esm/jpeg-metadata.mjs +145 -0
  129. package/dist/lib/esm/library-references.d.mts +2 -0
  130. package/dist/lib/esm/library.d.mts +96 -0
  131. package/dist/lib/esm/library.mjs +74 -0
  132. package/dist/lib/esm/object-utils.d.mts +298 -0
  133. package/dist/lib/esm/object-utils.mjs +523 -0
  134. package/dist/lib/esm/path.d.mts +155 -0
  135. package/dist/lib/esm/path.mjs +122 -0
  136. package/dist/lib/esm/reg-exp.d.mts +87 -0
  137. package/dist/lib/esm/reg-exp.mjs +169 -0
  138. package/dist/lib/esm/string.d.mts +362 -0
  139. package/dist/lib/esm/string.mjs +230 -0
  140. package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
  141. package/dist/lib/esm/transformers/date-transformer.mjs +47 -0
  142. package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
  143. package/dist/lib/esm/transformers/group-transformer.mjs +94 -0
  144. package/dist/lib/esm/transformers/index.d.mts +9 -0
  145. package/dist/lib/esm/transformers/index.mjs +24 -0
  146. package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
  147. package/dist/lib/esm/transformers/map-transformer.mjs +47 -0
  148. package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
  149. package/dist/lib/esm/transformers/set-transformer.mjs +47 -0
  150. package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
  151. package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +45 -0
  152. package/dist/lib/esm/transformers/transformer.d.mts +70 -0
  153. package/dist/lib/esm/transformers/transformer.mjs +88 -0
  154. package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
  155. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +48 -0
  156. package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
  157. package/dist/lib/esm/transformers/typed-transformer.mjs +12 -0
  158. package/dist/lib/esm/two-way-map.d.mts +101 -0
  159. package/dist/lib/esm/two-way-map.mjs +126 -0
  160. package/dist/lib/esm/type-guards.d.mts +84 -0
  161. package/dist/lib/esm/type-guards.mjs +41 -0
  162. package/dist/lib/esm/type.d.mts +122 -0
  163. package/dist/lib/esm/type.mjs +39 -0
  164. package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
  165. package/dist/lib/esm/typescript-lib-state.mjs +40 -0
  166. package/dist/lib/esm/url.d.mts +74 -0
  167. package/dist/lib/esm/url.mjs +50 -0
  168. package/dist/lib/esm/value-provider.d.mts +29 -0
  169. package/dist/lib/esm/value-provider.mjs +18 -0
  170. package/dist/lib/esm/value-wrapper.d.mts +47 -0
  171. package/dist/lib/esm/value-wrapper.mjs +62 -0
  172. package/package.json +153 -13
  173. package/transformers/date-transformer/package.json +6 -0
  174. package/transformers/group-transformer/package.json +6 -0
  175. package/transformers/index/package.json +6 -0
  176. package/transformers/map-transformer/package.json +6 -0
  177. package/transformers/package.json +6 -0
  178. package/transformers/set-transformer/package.json +6 -0
  179. package/transformers/skip-private-property-transformer/package.json +6 -0
  180. package/transformers/transformer/package.json +6 -0
  181. package/transformers/two-way-map-transformer/package.json +6 -0
  182. package/transformers/typed-transformer/package.json +6 -0
@@ -0,0 +1,196 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var reg_exp_exports = {};
25
+ __export(reg_exp_exports, {
26
+ ALWAYS_MATCH_REG_EXP: () => ALWAYS_MATCH_REG_EXP,
27
+ NEVER_MATCH_REG_EXP: () => NEVER_MATCH_REG_EXP,
28
+ RegExpMergeFlagsConflictStrategy: () => RegExpMergeFlagsConflictStrategy,
29
+ escapeRegExp: () => escapeRegExp,
30
+ getMandatoryNamedGroup: () => getMandatoryNamedGroup,
31
+ getOptionalNamedGroup: () => getOptionalNamedGroup,
32
+ isValidRegExp: () => isValidRegExp,
33
+ oneOf: () => oneOf
34
+ });
35
+ module.exports = __toCommonJS(reg_exp_exports);
36
+ var import_type_guards = require('./type-guards.cjs');
37
+ var RegExpMergeFlagsConflictStrategy = /* @__PURE__ */ ((RegExpMergeFlagsConflictStrategy2) => {
38
+ RegExpMergeFlagsConflictStrategy2["Intersect"] = "Intersect";
39
+ RegExpMergeFlagsConflictStrategy2["Throw"] = "Throw";
40
+ RegExpMergeFlagsConflictStrategy2["Union"] = "Union";
41
+ return RegExpMergeFlagsConflictStrategy2;
42
+ })(RegExpMergeFlagsConflictStrategy || {});
43
+ function escapeRegExp($string) {
44
+ return $string.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
45
+ }
46
+ function getMandatoryNamedGroup(match, groupName) {
47
+ return (0, import_type_guards.ensureNonNullable)(getOptionalNamedGroup(match, groupName));
48
+ }
49
+ function getOptionalNamedGroup(match, groupName) {
50
+ return match.groups?.[groupName] ?? null;
51
+ }
52
+ function isValidRegExp($string) {
53
+ try {
54
+ new RegExp($string);
55
+ return true;
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+ function hasFlag(regExp, flag) {
61
+ return regExp.flags.includes(flag);
62
+ }
63
+ const ALWAYS_MATCH_REG_EXP = /(?:)/;
64
+ const NEVER_MATCH_REG_EXP = /.^/;
65
+ class RegExpFlagMerger {
66
+ /**
67
+ * Creates a new merger.
68
+ *
69
+ * @param regExps - The regexes whose flags are merged.
70
+ * @param strategy - The strategy to use when flags conflict.
71
+ */
72
+ constructor(regExps, strategy) {
73
+ this.regExps = regExps;
74
+ this.strategy = strategy;
75
+ }
76
+ regExps;
77
+ strategy;
78
+ finalFlags = /* @__PURE__ */ new Set();
79
+ /**
80
+ * Computes the merged flag string for the configured regexes.
81
+ *
82
+ * @returns The merged flags joined into a single string.
83
+ */
84
+ computeFlags() {
85
+ this.addSemanticFlags();
86
+ this.addUnicodeFlags();
87
+ this.addMetaFlags();
88
+ return [...this.finalFlags].join("");
89
+ }
90
+ addMetaFlags() {
91
+ const META_FLAGS = ["g", "d"];
92
+ for (const flag of META_FLAGS) {
93
+ if (this.regExps.some((regExp) => hasFlag(regExp, flag))) {
94
+ this.finalFlags.add(flag);
95
+ }
96
+ }
97
+ }
98
+ addSemanticFlags() {
99
+ const SEMANTIC_FLAGS = ["i", "m", "s", "y"];
100
+ for (const flag of SEMANTIC_FLAGS) {
101
+ if (this.shouldPickFlag(flag)) {
102
+ this.finalFlags.add(flag);
103
+ }
104
+ }
105
+ }
106
+ addUnicodeFlags() {
107
+ const countU = this.regExps.filter((regExp) => hasFlag(regExp, "u")).length;
108
+ const countV = this.regExps.filter((regExp) => hasFlag(regExp, "v")).length;
109
+ let shouldUseUFlag;
110
+ let shouldUseVFlag;
111
+ switch (this.strategy) {
112
+ /* v8 ignore stop */
113
+ case "Intersect" /* Intersect */: {
114
+ shouldUseUFlag = countU === this.regExps.length;
115
+ shouldUseVFlag = countV === this.regExps.length;
116
+ break;
117
+ }
118
+ case "Throw" /* Throw */: {
119
+ const haveAllUFlag = countU === this.regExps.length;
120
+ const haveNoUFlag = countU === 0;
121
+ const haveAllVFlag = countV === this.regExps.length;
122
+ const haveNoVFlag = countV === 0;
123
+ if (!(haveAllUFlag || haveNoUFlag) || !(haveAllVFlag || haveNoVFlag)) {
124
+ throw new Error("Conflicting 'u'/'v' flags across patterns.");
125
+ }
126
+ shouldUseUFlag = haveAllUFlag;
127
+ shouldUseVFlag = haveAllVFlag;
128
+ break;
129
+ }
130
+ case "Union" /* Union */: {
131
+ shouldUseUFlag = countU > 0;
132
+ shouldUseVFlag = countV > 0;
133
+ break;
134
+ }
135
+ default: {
136
+ (0, import_type_guards.assertNever)(this.strategy);
137
+ }
138
+ }
139
+ if (shouldUseUFlag && shouldUseVFlag) {
140
+ (0, import_type_guards.assert)(this.strategy !== "Throw" /* Throw */, "Cannot combine both 'u'/'v' flags in one RegExp.");
141
+ shouldUseUFlag = false;
142
+ }
143
+ if (shouldUseUFlag) {
144
+ this.finalFlags.add("u");
145
+ }
146
+ if (shouldUseVFlag) {
147
+ this.finalFlags.add("v");
148
+ }
149
+ }
150
+ shouldPickFlag(flag) {
151
+ const count = this.regExps.filter((regExp) => hasFlag(regExp, flag)).length;
152
+ switch (this.strategy) {
153
+ /* v8 ignore stop */
154
+ case "Intersect" /* Intersect */: {
155
+ return count === this.regExps.length;
156
+ }
157
+ case "Throw" /* Throw */: {
158
+ break;
159
+ }
160
+ case "Union" /* Union */: {
161
+ return count > 0;
162
+ }
163
+ default: {
164
+ (0, import_type_guards.assertNever)(this.strategy);
165
+ }
166
+ }
167
+ const haveAllSameFlag = count === 0 || count === this.regExps.length;
168
+ if (!haveAllSameFlag) {
169
+ throw new Error(`Conflicting flag '${flag}' across patterns.`);
170
+ }
171
+ return count === this.regExps.length;
172
+ }
173
+ }
174
+ function oneOf(regExps, strategy = "Throw" /* Throw */) {
175
+ if (regExps.length === 0) {
176
+ return ALWAYS_MATCH_REG_EXP;
177
+ }
178
+ if (regExps.length === 1 && regExps[0] !== void 0) {
179
+ return regExps[0];
180
+ }
181
+ const source = regExps.map((regExp) => `(?:${regExp.source})`).join("|");
182
+ const flags = new RegExpFlagMerger(regExps, strategy).computeFlags();
183
+ return new RegExp(source, flags);
184
+ }
185
+ // Annotate the CommonJS export names for ESM import in node:
186
+ 0 && (module.exports = {
187
+ ALWAYS_MATCH_REG_EXP,
188
+ NEVER_MATCH_REG_EXP,
189
+ RegExpMergeFlagsConflictStrategy,
190
+ escapeRegExp,
191
+ getMandatoryNamedGroup,
192
+ getOptionalNamedGroup,
193
+ isValidRegExp,
194
+ oneOf
195
+ });
196
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlZy1leHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1lcmdpbmcgbXVsdGlwbGUgcmVnZXggZmxhZ3MgaW50byBvbmUgYWx0ZXJuYXRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbGwgcmVnZXhlcy5cbiAgICovXG4gIEludGVyc2VjdCA9ICdJbnRlcnNlY3QnLFxuICAvKipcbiAgICogVGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlZ2V4ZXMgaGF2ZSBjb25mbGljdGluZyBmbGFncy5cbiAgICovXG4gIFRocm93ID0gJ1Rocm93JyxcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbnkgcmVnZXguXG4gICAqL1xuICBVbmlvbiA9ICdVbmlvbidcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHN0cmluZyB0byBzYWZlbHkgdXNlIGl0IHdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzIHByZWZpeGVkIHdpdGggYSBiYWNrc2xhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTk9URTogV2UgY2FuJ3QgdXNlIGByZXBsYWNlQWxsKClgIGZyb20gYFN0cmluZy50c2AgaGVyZSBiZWNhdXNlIGl0IGludHJvZHVjZXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICByZXR1cm4gJHN0cmluZy5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtYW5kYXRvcnkgbmFtZWQgY2FwdHVyZSBncm91cCBmcm9tIGEgcmVnZXggbWF0Y2guXG4gKlxuICogVXNlIHRoaXMgZm9yIGEgbmFtZWQgZ3JvdXAgdGhhdCBpcyBBTFdBWVMgcHJlc2VudCB3aGVuIHRoZSBwYXR0ZXJuIG1hdGNoZXMgXHUyMDE0IG5vdCB3cmFwcGVkIGluIGFuIG9wdGlvbmFsXG4gKiBgKD86XHUyMDI2KT9gIC8gYChcdTIwMjYpP2AuIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZyAod2hpY2ggbWF5IGJlIGAnJ2AgZm9yIGEgemVyby13aWR0aCBtYXRjaCBzdWNoIGFzIGBcXHcqYCksXG4gKiB0aHJvd2luZyBpZiB0aGUgZ3JvdXAgXHUyMDE0IG9yIHRoZSBtYXRjaCdzIGBncm91cHNgIG9iamVjdCBcdTIwMTQgaXMgYWJzZW50LCBzbyBhIHBhdHRlcm4gY2hhbmdlIHRoYXQgZHJvcHMgdGhlXG4gKiBncm91cCBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSB5aWVsZGluZyBhIHdyb25nIHZhbHVlLlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgYG1hdGNoLmdyb3Vwcz8uW25hbWVdID8/ICcnYDogZm9yIGEgbWFuZGF0b3J5IGdyb3VwIHRoYXQgZmFsbGJhY2sgaXMgYSBuZXZlci10YWtlbiAoZGVhZClcbiAqIGJyYW5jaCB0aGF0IGZhaWxzIGEgMTAwJS1icmFuY2ggY292ZXJhZ2UgZ2F0ZSwgd2hlcmVhcyB0aGUgdGhyb3cgaGVyZSBsaXZlcyBpbnNpZGUgYGVuc3VyZU5vbk51bGxhYmxlYFxuICogKGFscmVhZHkgY292ZXJlZCksIGxlYXZpbmcgbm8gaW5saW5lIGJyYW5jaCBhdCB0aGUgY2FsbCBzaXRlLiBGb3IgYSBncm91cCB0aGF0IG1heSBsZWdpdGltYXRlbHkgYmUgYWJzZW50LFxuICogdXNlIHtAbGluayBnZXRPcHRpb25hbE5hbWVkR3JvdXB9IGFuZCBkZWZhdWx0IGl0cyBgbnVsbGAgd2l0aCBgPz8gXHUyMDI2YC5cbiAqXG4gKiBAcGFyYW0gbWF0Y2ggLSBUaGUgbWF0Y2ggcmV0dXJuZWQgYnkgYFJlZ0V4cC5leGVjYCwgYFN0cmluZy5tYXRjaEFsbGAsIG9yIGBTdHJpbmcubWF0Y2hgLlxuICogQHBhcmFtIGdyb3VwTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjYXB0dXJlIGdyb3VwIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY2FwdHVyZWQgc3RyaW5nLlxuICogQHRocm93cyBXaGVuIHRoZSBuYW1lZCBncm91cCBpcyBhYnNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LCBncm91cE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsIGdyb3VwTmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRzIGFuIG9wdGlvbmFsIG5hbWVkIGNhcHR1cmUgZ3JvdXAgZnJvbSBhIHJlZ2V4IG1hdGNoLCBkaXN0aW5ndWlzaGluZyBhbiBhYnNlbnQgZ3JvdXAgZnJvbSBhIHByZXNlbnRcbiAqIGVtcHR5IG9uZS5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcgd2hlbiB0aGUgZ3JvdXAgcGFydGljaXBhdGVkIGluIHRoZSBtYXRjaCBcdTIwMTQgd2hpY2ggbWF5IGJlIGAnJ2AgZm9yIGEgemVyby13aWR0aFxuICogbWF0Y2ggc3VjaCBhcyBgXFx3KmAgXHUyMDE0IG9yIGBudWxsYCB3aGVuIHRoZSBncm91cCwgb3IgdGhlIG1hdGNoJ3MgYGdyb3Vwc2Agb2JqZWN0LCBpcyBhYnNlbnQgKGUuZy4gYW4gb3B0aW9uYWxcbiAqIGAoPzpcdTIwMjYpP2AgZ3JvdXAgdGhhdCBkaWQgbm90IG1hdGNoKS4gQmVjYXVzZSBgbnVsbGAgaXMgcmV0dXJuZWQgb25seSBmb3IgYSBnZW51aW5lbHktYWJzZW50IGdyb3VwLCBhXG4gKiBjYWxsZXIncyBgPz8gPGRlZmF1bHQ+YCBpcyBhIGxpdmUgYnJhbmNoIHJhdGhlciB0aGFuIHRoZSBkZWFkIG9uZSB0aGF0IGBtYXRjaC5ncm91cHM/LltuYW1lXSA/PyAnJ2AgbGVhdmVzXG4gKiBmb3IgYSBtYW5kYXRvcnkgZ3JvdXAuIEZvciBhIGdyb3VwIHRoYXQgbXVzdCBhbHdheXMgYmUgcHJlc2VudCwgdXNlIHtAbGluayBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwfS5cbiAqXG4gKiBAcGFyYW0gbWF0Y2ggLSBUaGUgbWF0Y2ggcmV0dXJuZWQgYnkgYFJlZ0V4cC5leGVjYCwgYFN0cmluZy5tYXRjaEFsbGAsIG9yIGBTdHJpbmcubWF0Y2hgLlxuICogQHBhcmFtIGdyb3VwTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjYXB0dXJlIGdyb3VwIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY2FwdHVyZWQgc3RyaW5nLCBvciBgbnVsbGAgd2hlbiB0aGUgZ3JvdXAgaXMgYWJzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LCBncm91cE5hbWU6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICByZXR1cm4gbWF0Y2guZ3JvdXBzPy5bZ3JvdXBOYW1lXSA/PyBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmVnRXhwKCRzdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBSZWdFeHAoJHN0cmluZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNGbGFnKHJlZ0V4cDogUmVnRXhwLCBmbGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlZ0V4cC5mbGFncy5pbmNsdWRlcyhmbGFnKTtcbn1cblxuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGFsd2F5cyBtYXRjaGVzLlxuICovXG5leHBvcnQgY29uc3QgQUxXQVlTX01BVENIX1JFR19FWFAgPSAvKD86KS87XG5cbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBuZXZlciBtYXRjaGVzLlxuICovXG5leHBvcnQgY29uc3QgTkVWRVJfTUFUQ0hfUkVHX0VYUCA9IC8uXi87XG5cbi8qKlxuICogTWVyZ2VzIHRoZSBmbGFncyBvZiBtdWx0aXBsZSByZWdleGVzIGludG8gYSBzaW5nbGUgZmxhZyBzdHJpbmcsIGFwcGx5aW5nIGEgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKlxuICogVGhlIGNvb3BlcmF0aW5nIHBlci1mbGFnIGhlbHBlcnMgc2hhcmUgdGhlIHNhbWUgcmVnZXhlcywgc3RyYXRlZ3ksIGFuZCBhY2N1bXVsYXRlZCBmbGFnIHNldCwgc29cbiAqIHRoZXkgYXJlIGdyb3VwZWQgaGVyZSBhcyBtZXRob2RzIG92ZXIgdGhvc2UgZmllbGRzIHJhdGhlciB0aGFuIHRocmVhZGluZyB0aGUgc3RhdGUgdGhyb3VnaFxuICogcG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKi9cbmNsYXNzIFJlZ0V4cEZsYWdNZXJnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmFsRmxhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBtZXJnZXIuXG4gICAqXG4gICAqIEBwYXJhbSByZWdFeHBzIC0gVGhlIHJlZ2V4ZXMgd2hvc2UgZmxhZ3MgYXJlIG1lcmdlZC5cbiAgICogQHBhcmFtIHN0cmF0ZWd5IC0gVGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIGZsYWdzIGNvbmZsaWN0LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVnRXhwczogUmVnRXhwW10sIHByaXZhdGUgcmVhZG9ubHkgc3RyYXRlZ3k6IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5KSB7fVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgbWVyZ2VkIGZsYWcgc3RyaW5nIGZvciB0aGUgY29uZmlndXJlZCByZWdleGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbWVyZ2VkIGZsYWdzIGpvaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBjb21wdXRlRmxhZ3MoKTogc3RyaW5nIHtcbiAgICB0aGlzLmFkZFNlbWFudGljRmxhZ3MoKTtcbiAgICB0aGlzLmFkZFVuaWNvZGVGbGFncygpO1xuICAgIHRoaXMuYWRkTWV0YUZsYWdzKCk7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZpbmFsRmxhZ3NdLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNZXRhRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgTUVUQV9GTEFHUyA9IFsnZycsICdkJ107XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIE1FVEFfRkxBR1MpIHtcbiAgICAgIGlmICh0aGlzLnJlZ0V4cHMuc29tZSgocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgZmxhZykpKSB7XG4gICAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoZmxhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZW1hbnRpY0ZsYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IFNFTUFOVElDX0ZMQUdTID0gWydpJywgJ20nLCAncycsICd5J107XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIFNFTUFOVElDX0ZMQUdTKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRQaWNrRmxhZyhmbGFnKSkge1xuICAgICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKGZsYWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5pY29kZUZsYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvdW50VSA9IHRoaXMucmVnRXhwcy5maWx0ZXIoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsICd1JykpLmxlbmd0aDtcbiAgICBjb25zdCBjb3VudFYgPSB0aGlzLnJlZ0V4cHMuZmlsdGVyKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCAndicpKS5sZW5ndGg7XG5cbiAgICBsZXQgc2hvdWxkVXNlVUZsYWc6IGJvb2xlYW47XG4gICAgbGV0IHNob3VsZFVzZVZGbGFnOiBib29sZWFuO1xuXG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHY4IGNvdW50cyB0aGUgaW1wbGljaXQgZGVmYXVsdCBicmFuY2ggYXMgdW5jb3ZlcmVkIGV2ZW4gd2hlbiBhbGwgZW51bSBjYXNlcyBhcmUgaGFuZGxlZC4gKi9cbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LkludGVyc2VjdDoge1xuICAgICAgICBzaG91bGRVc2VVRmxhZyA9IGNvdW50VSA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBjb3VudFYgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzoge1xuICAgICAgICBjb25zdCBoYXZlQWxsVUZsYWcgPSBjb3VudFUgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGhhdmVOb1VGbGFnID0gY291bnRVID09PSAwO1xuICAgICAgICBjb25zdCBoYXZlQWxsVkZsYWcgPSBjb3VudFYgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGhhdmVOb1ZGbGFnID0gY291bnRWID09PSAwO1xuXG4gICAgICAgIGlmICghKGhhdmVBbGxVRmxhZyB8fCBoYXZlTm9VRmxhZykgfHwgIShoYXZlQWxsVkZsYWcgfHwgaGF2ZU5vVkZsYWcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBcXCd1XFwnL1xcJ3ZcXCcgZmxhZ3MgYWNyb3NzIHBhdHRlcm5zLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBoYXZlQWxsVUZsYWc7XG4gICAgICAgIHNob3VsZFVzZVZGbGFnID0gaGF2ZUFsbFZGbGFnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246IHtcbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBjb3VudFUgPiAwO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGNvdW50ViA+IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQuICovXG4gICAgICAgIGFzc2VydE5ldmVyKHRoaXMuc3RyYXRlZ3kpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cblxuICAgIGlmIChzaG91bGRVc2VVRmxhZyAmJiBzaG91bGRVc2VWRmxhZykge1xuICAgICAgYXNzZXJ0KHRoaXMuc3RyYXRlZ3kgIT09IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93LCAnQ2Fubm90IGNvbWJpbmUgYm90aCBcXCd1XFwnL1xcJ3ZcXCcgZmxhZ3MgaW4gb25lIFJlZ0V4cC4nKTtcbiAgICAgIHNob3VsZFVzZVVGbGFnID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFVzZVVGbGFnKSB7XG4gICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKCd1Jyk7XG4gICAgfVxuICAgIGlmIChzaG91bGRVc2VWRmxhZykge1xuICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZCgndicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUGlja0ZsYWcoZmxhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLnJlZ0V4cHMuZmlsdGVyKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCBmbGFnKSkubGVuZ3RoO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCBjb3VudHMgdGhlIGltcGxpY2l0IGRlZmF1bHQgYnJhbmNoIGFzIHVuY292ZXJlZCBldmVuIHdoZW4gYWxsIGVudW0gY2FzZXMgYXJlIGhhbmRsZWQuICovXG4gICAgc3dpdGNoICh0aGlzLnN0cmF0ZWd5KSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5JbnRlcnNlY3Q6IHtcbiAgICAgICAgcmV0dXJuIGNvdW50ID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246IHtcbiAgICAgICAgcmV0dXJuIGNvdW50ID4gMDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnN0cmF0ZWd5KTtcbiAgICAgIH1cbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG5cbiAgICBjb25zdCBoYXZlQWxsU2FtZUZsYWcgPSBjb3VudCA9PT0gMCB8fCBjb3VudCA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICBpZiAoIWhhdmVBbGxTYW1lRmxhZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25mbGljdGluZyBmbGFnICcke2ZsYWd9JyBhY3Jvc3MgcGF0dGVybnMuYCk7XG4gICAgfVxuICAgIHJldHVybiBjb3VudCA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgfVxufVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgcmVnZXhlcyBpbnRvIG9uZSBhbHRlcm5hdGlvbiwgaGFuZGxpbmcgZmxhZ3MuXG4gKlxuICogQHBhcmFtIHJlZ0V4cHMgLSBUaGUgcmVnZXhlcyB0byBjb21iaW5lLlxuICogQHBhcmFtIHN0cmF0ZWd5IC0gVGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1lcmdpbmcgZmxhZ3MgKGRlZmF1bHQ6IGBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvd2ApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIHJlZ2V4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2YoXG4gIHJlZ0V4cHM6IFJlZ0V4cFtdLFxuICBzdHJhdGVneTogUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kgPSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvd1xuKTogUmVnRXhwIHtcbiAgaWYgKHJlZ0V4cHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEFMV0FZU19NQVRDSF9SRUdfRVhQO1xuICB9XG5cbiAgaWYgKHJlZ0V4cHMubGVuZ3RoID09PSAxICYmIHJlZ0V4cHNbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZWdFeHBzWzBdO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gcmVnRXhwcy5tYXAoKHJlZ0V4cCkgPT4gYCg/OiR7cmVnRXhwLnNvdXJjZX0pYCkuam9pbignfCcpO1xuICBjb25zdCBmbGFncyA9IG5ldyBSZWdFeHBGbGFnTWVyZ2VyKHJlZ0V4cHMsIHN0cmF0ZWd5KS5jb21wdXRlRmxhZ3MoKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCBmbGFncyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHlCQUlPO0FBS0EsSUFBSyxtQ0FBTCxrQkFBS0Esc0NBQUw7QUFJTCxFQUFBQSxrQ0FBQSxlQUFZO0FBSVosRUFBQUEsa0NBQUEsV0FBUTtBQUlSLEVBQUFBLGtDQUFBLFdBQVE7QUFaRSxTQUFBQTtBQUFBLEdBQUE7QUFxQkwsU0FBUyxhQUFhLFNBQXlCO0FBRXBELFNBQU8sUUFBUSxXQUFXLHVCQUF1QixPQUFPLFFBQVE7QUFDbEU7QUFvQk8sU0FBUyx1QkFBdUIsT0FBeUIsV0FBMkI7QUFDekYsYUFBTyxzQ0FBa0Isc0JBQXNCLE9BQU8sU0FBUyxDQUFDO0FBQ2xFO0FBZ0JPLFNBQVMsc0JBQXNCLE9BQXlCLFdBQWtDO0FBQy9GLFNBQU8sTUFBTSxTQUFTLFNBQVMsS0FBSztBQUN0QztBQVFPLFNBQVMsY0FBYyxTQUEwQjtBQUN0RCxNQUFJO0FBQ0YsUUFBSSxPQUFPLE9BQU87QUFDbEIsV0FBTztBQUFBLEVBQ1QsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxTQUFTLFFBQVEsUUFBZ0IsTUFBdUI7QUFDdEQsU0FBTyxPQUFPLE1BQU0sU0FBUyxJQUFJO0FBQ25DO0FBS08sTUFBTSx1QkFBdUI7QUFLN0IsTUFBTSxzQkFBc0I7QUFTbkMsTUFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNkLFlBQTZCLFNBQW9DLFVBQTRDO0FBQWhGO0FBQW9DO0FBQUEsRUFBNkM7QUFBQSxFQUFqRjtBQUFBLEVBQW9DO0FBQUEsRUFSdkQsYUFBYSxvQkFBSSxJQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZXZDLGVBQXVCO0FBQzVCLFNBQUssaUJBQWlCO0FBQ3RCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssYUFBYTtBQUNsQixXQUFPLENBQUMsR0FBRyxLQUFLLFVBQVUsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUNyQztBQUFBLEVBRVEsZUFBcUI7QUFDM0IsVUFBTSxhQUFhLENBQUMsS0FBSyxHQUFHO0FBQzVCLGVBQVcsUUFBUSxZQUFZO0FBQzdCLFVBQUksS0FBSyxRQUFRLEtBQUssQ0FBQyxXQUFXLFFBQVEsUUFBUSxJQUFJLENBQUMsR0FBRztBQUN4RCxhQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsbUJBQXlCO0FBQy9CLFVBQU0saUJBQWlCLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRztBQUMxQyxlQUFXLFFBQVEsZ0JBQWdCO0FBQ2pDLFVBQUksS0FBSyxlQUFlLElBQUksR0FBRztBQUM3QixhQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsa0JBQXdCO0FBQzlCLFVBQU0sU0FBUyxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLEdBQUcsQ0FBQyxFQUFFO0FBQ3JFLFVBQU0sU0FBUyxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLEdBQUcsQ0FBQyxFQUFFO0FBRXJFLFFBQUk7QUFDSixRQUFJO0FBR0osWUFBUSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRXJCLEtBQUssNkJBQTRDO0FBQy9DLHlCQUFpQixXQUFXLEtBQUssUUFBUTtBQUN6Qyx5QkFBaUIsV0FBVyxLQUFLLFFBQVE7QUFDekM7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLHFCQUF3QztBQUMzQyxjQUFNLGVBQWUsV0FBVyxLQUFLLFFBQVE7QUFDN0MsY0FBTSxjQUFjLFdBQVc7QUFDL0IsY0FBTSxlQUFlLFdBQVcsS0FBSyxRQUFRO0FBQzdDLGNBQU0sY0FBYyxXQUFXO0FBRS9CLFlBQUksRUFBRSxnQkFBZ0IsZ0JBQWdCLEVBQUUsZ0JBQWdCLGNBQWM7QUFDcEUsZ0JBQU0sSUFBSSxNQUFNLDRDQUFnRDtBQUFBLFFBQ2xFO0FBRUEseUJBQWlCO0FBQ2pCLHlCQUFpQjtBQUNqQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUsscUJBQXdDO0FBQzNDLHlCQUFpQixTQUFTO0FBQzFCLHlCQUFpQixTQUFTO0FBQzFCO0FBQUEsTUFDRjtBQUFBLE1BQ0EsU0FBUztBQUVQLDRDQUFZLEtBQUssUUFBUTtBQUFBLE1BQzNCO0FBQUEsSUFFRjtBQUVBLFFBQUksa0JBQWtCLGdCQUFnQjtBQUNwQyxxQ0FBTyxLQUFLLGFBQWEscUJBQXdDLGtEQUFzRDtBQUN2SCx1QkFBaUI7QUFBQSxJQUNuQjtBQUVBLFFBQUksZ0JBQWdCO0FBQ2xCLFdBQUssV0FBVyxJQUFJLEdBQUc7QUFBQSxJQUN6QjtBQUNBLFFBQUksZ0JBQWdCO0FBQ2xCLFdBQUssV0FBVyxJQUFJLEdBQUc7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGVBQWUsTUFBdUI7QUFDNUMsVUFBTSxRQUFRLEtBQUssUUFBUSxPQUFPLENBQUMsV0FBVyxRQUFRLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFFckUsWUFBUSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRXJCLEtBQUssNkJBQTRDO0FBQy9DLGVBQU8sVUFBVSxLQUFLLFFBQVE7QUFBQSxNQUNoQztBQUFBLE1BQ0EsS0FBSyxxQkFBd0M7QUFDM0M7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLHFCQUF3QztBQUMzQyxlQUFPLFFBQVE7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsU0FBUztBQUVQLDRDQUFZLEtBQUssUUFBUTtBQUFBLE1BQzNCO0FBQUEsSUFFRjtBQUVBLFVBQU0sa0JBQWtCLFVBQVUsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUM5RCxRQUFJLENBQUMsaUJBQWlCO0FBQ3BCLFlBQU0sSUFBSSxNQUFNLHFCQUFxQixJQUFJLG9CQUFvQjtBQUFBLElBQy9EO0FBQ0EsV0FBTyxVQUFVLEtBQUssUUFBUTtBQUFBLEVBQ2hDO0FBQ0Y7QUFTTyxTQUFTLE1BQ2QsU0FDQSxXQUE2QyxxQkFDckM7QUFDUixNQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLENBQUMsTUFBTSxRQUFXO0FBQ3BELFdBQU8sUUFBUSxDQUFDO0FBQUEsRUFDbEI7QUFFQSxRQUFNLFNBQVMsUUFBUSxJQUFJLENBQUMsV0FBVyxNQUFNLE9BQU8sTUFBTSxHQUFHLEVBQUUsS0FBSyxHQUFHO0FBQ3ZFLFFBQU0sUUFBUSxJQUFJLGlCQUFpQixTQUFTLFFBQVEsRUFBRSxhQUFhO0FBQ25FLFNBQU8sSUFBSSxPQUFPLFFBQVEsS0FBSztBQUNqQzsiLAogICJuYW1lcyI6IFsiUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kiXQp9Cg==
@@ -0,0 +1,87 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains utility functions for regular expressions.
6
+ */
7
+ /**
8
+ * A strategy to use when merging multiple regex flags into one alternation.
9
+ */
10
+ export declare enum RegExpMergeFlagsConflictStrategy {
11
+ /**
12
+ * Keep only the flags present in all regexes.
13
+ */
14
+ Intersect = "Intersect",
15
+ /**
16
+ * Throw an error if the regexes have conflicting flags.
17
+ */
18
+ Throw = "Throw",
19
+ /**
20
+ * Keep only the flags present in any regex.
21
+ */
22
+ Union = "Union"
23
+ }
24
+ /**
25
+ * Escapes special characters in a string to safely use it within a regular expression.
26
+ *
27
+ * @param $string - The string to escape.
28
+ * @returns The escaped string with special characters prefixed with a backslash.
29
+ */
30
+ export declare function escapeRegExp($string: string): string;
31
+ /**
32
+ * Reads a mandatory named capture group from a regex match.
33
+ *
34
+ * Use this for a named group that is ALWAYS present when the pattern matches — not wrapped in an optional
35
+ * `(?:…)?` / `(…)?`. Returns the captured string (which may be `''` for a zero-width match such as `\w*`),
36
+ * throwing if the group — or the match's `groups` object — is absent, so a pattern change that drops the
37
+ * group fails loudly instead of silently yielding a wrong value.
38
+ *
39
+ * Prefer this over `match.groups?.[name] ?? ''`: for a mandatory group that fallback is a never-taken (dead)
40
+ * branch that fails a 100%-branch coverage gate, whereas the throw here lives inside `ensureNonNullable`
41
+ * (already covered), leaving no inline branch at the call site. For a group that may legitimately be absent,
42
+ * use {@link getOptionalNamedGroup} and default its `null` with `?? …`.
43
+ *
44
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
45
+ * @param groupName - The name of the capture group to read.
46
+ * @returns The captured string.
47
+ * @throws When the named group is absent.
48
+ */
49
+ export declare function getMandatoryNamedGroup(match: RegExpMatchArray, groupName: string): string;
50
+ /**
51
+ * Reads an optional named capture group from a regex match, distinguishing an absent group from a present
52
+ * empty one.
53
+ *
54
+ * Returns the captured string when the group participated in the match — which may be `''` for a zero-width
55
+ * match such as `\w*` — or `null` when the group, or the match's `groups` object, is absent (e.g. an optional
56
+ * `(?:…)?` group that did not match). Because `null` is returned only for a genuinely-absent group, a
57
+ * caller's `?? <default>` is a live branch rather than the dead one that `match.groups?.[name] ?? ''` leaves
58
+ * for a mandatory group. For a group that must always be present, use {@link getMandatoryNamedGroup}.
59
+ *
60
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
61
+ * @param groupName - The name of the capture group to read.
62
+ * @returns The captured string, or `null` when the group is absent.
63
+ */
64
+ export declare function getOptionalNamedGroup(match: RegExpMatchArray, groupName: string): null | string;
65
+ /**
66
+ * Checks if a string is a valid regular expression.
67
+ *
68
+ * @param $string - The string to check.
69
+ * @returns `true` if the string is a valid regular expression, `false` otherwise.
70
+ */
71
+ export declare function isValidRegExp($string: string): boolean;
72
+ /**
73
+ * A regular expression that always matches.
74
+ */
75
+ export declare const ALWAYS_MATCH_REG_EXP: RegExp;
76
+ /**
77
+ * A regular expression that never matches.
78
+ */
79
+ export declare const NEVER_MATCH_REG_EXP: RegExp;
80
+ /**
81
+ * Combine multiple regexes into one alternation, handling flags.
82
+ *
83
+ * @param regExps - The regexes to combine.
84
+ * @param strategy - The strategy to use when merging flags (default: `RegExpMergeFlagsConflictStrategy.Throw`).
85
+ * @returns The combined regex.
86
+ */
87
+ export declare function oneOf(regExps: RegExp[], strategy?: RegExpMergeFlagsConflictStrategy): RegExp;
@@ -0,0 +1,268 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var string_exports = {};
25
+ __export(string_exports, {
26
+ EMPTY: () => EMPTY,
27
+ ensureEndsWith: () => ensureEndsWith,
28
+ ensureLfEndings: () => ensureLfEndings,
29
+ ensureStartsWith: () => ensureStartsWith,
30
+ escape: () => escape,
31
+ getLfNormalizedOffsetToOriginalOffsetMapper: () => getLfNormalizedOffsetToOriginalOffsetMapper,
32
+ hasSingleOccurrence: () => hasSingleOccurrence,
33
+ indent: () => indent,
34
+ insertAt: () => insertAt,
35
+ makeValidVariableName: () => makeValidVariableName,
36
+ normalizeString: () => normalizeString,
37
+ replace: () => replace,
38
+ replaceAll: () => replaceAll,
39
+ replaceAllAsync: () => replaceAllAsync,
40
+ trimEnd: () => trimEnd,
41
+ trimStart: () => trimStart,
42
+ unescape: () => unescape,
43
+ unindent: () => unindent
44
+ });
45
+ module.exports = __toCommonJS(string_exports);
46
+ var import_abort_controller = require('./abort-controller.cjs');
47
+ var import_reg_exp = require('./reg-exp.cjs');
48
+ var import_type_guards = require('./type-guards.cjs');
49
+ var import_value_provider = require('./value-provider.cjs');
50
+ const EMPTY = "";
51
+ const ESCAPE_MAP = {
52
+ "\n": String.raw`\n`,
53
+ "\r": String.raw`\r`,
54
+ " ": String.raw`\t`,
55
+ "\b": String.raw`\b`,
56
+ "\f": String.raw`\f`,
57
+ "'": String.raw`\'`,
58
+ '"': String.raw`\"`,
59
+ "\\": "\\\\"
60
+ };
61
+ const CR = "\r";
62
+ const LF = "\n";
63
+ const NOT_FOUND_INDEX = -1;
64
+ const UNESCAPE_MAP = {};
65
+ for (const [key, value] of Object.entries(ESCAPE_MAP)) {
66
+ UNESCAPE_MAP[value] = key;
67
+ }
68
+ function ensureEndsWith(params) {
69
+ const { $string, suffix } = params;
70
+ return $string.endsWith(suffix) ? $string : $string + suffix;
71
+ }
72
+ function ensureLfEndings($string) {
73
+ return $string.replaceAll(/\r\n?/g, "\n");
74
+ }
75
+ function ensureStartsWith(params) {
76
+ const { $string, prefix } = params;
77
+ return $string.startsWith(prefix) ? $string : prefix + $string;
78
+ }
79
+ function escape($string) {
80
+ return replace($string, ESCAPE_MAP);
81
+ }
82
+ function getLfNormalizedOffsetToOriginalOffsetMapper($string) {
83
+ const lfOffsetToOriginalOffsetMap = [];
84
+ for (let index = 0; index < $string.length; index++) {
85
+ if ($string[index] === CR && $string[index + 1] === LF) {
86
+ lfOffsetToOriginalOffsetMap.push(index + 1);
87
+ index++;
88
+ } else {
89
+ lfOffsetToOriginalOffsetMap.push(index);
90
+ }
91
+ }
92
+ return (lfOffset) => {
93
+ if (lfOffset < 0) {
94
+ return lfOffset;
95
+ }
96
+ if (lfOffset >= lfOffsetToOriginalOffsetMap.length) {
97
+ return lfOffset - lfOffsetToOriginalOffsetMap.length + $string.length;
98
+ }
99
+ (0, import_type_guards.assert)(lfOffsetToOriginalOffsetMap[lfOffset] !== void 0, "Could not map offset");
100
+ return lfOffsetToOriginalOffsetMap[lfOffset];
101
+ };
102
+ }
103
+ function hasSingleOccurrence(params) {
104
+ const { $string, searchValue } = params;
105
+ const firstIndex = $string.indexOf(searchValue);
106
+ const lastIndex = $string.lastIndexOf(searchValue);
107
+ return firstIndex !== NOT_FOUND_INDEX && firstIndex === lastIndex;
108
+ }
109
+ function indent(params) {
110
+ const { prefix, text } = params;
111
+ return text.split("\n").map((line) => `${prefix}${line}`).join("\n");
112
+ }
113
+ function insertAt(params) {
114
+ const {
115
+ $string,
116
+ endIndex,
117
+ startIndex,
118
+ substring
119
+ } = params;
120
+ const effectiveEndIndex = endIndex ?? startIndex;
121
+ return $string.slice(0, startIndex) + substring + $string.slice(effectiveEndIndex);
122
+ }
123
+ function makeValidVariableName($string) {
124
+ return replaceAll({
125
+ $string,
126
+ replacer: "_",
127
+ searchValue: /[^a-zA-Z0-9_]/g
128
+ });
129
+ }
130
+ function normalizeString($string) {
131
+ return replaceAll({
132
+ $string,
133
+ replacer: " ",
134
+ // eslint-disable-next-line unicorn/prefer-unicode-code-point-escapes -- These are the conventional spellings for U+00A0 and U+202F. The code-point form is only unambiguous with the `u` flag, so taking the fix would also change how the pattern is parsed.
135
+ searchValue: /\u00A0|\u202F/g
136
+ }).normalize("NFC");
137
+ }
138
+ function replace($string, replacementsMap) {
139
+ const regExp = new RegExp(Object.keys(replacementsMap).map((source) => (0, import_reg_exp.escapeRegExp)(source)).join("|"), "g");
140
+ return replaceAll({
141
+ $string,
142
+ replacer: ({ substring: source }) => (0, import_type_guards.ensureNonNullable)(replacementsMap[source]),
143
+ searchValue: regExp
144
+ });
145
+ }
146
+ function replaceAll(params) {
147
+ const { $string, replacer } = params;
148
+ let { searchValue } = params;
149
+ if (replacer === void 0) {
150
+ return $string;
151
+ }
152
+ if (searchValue instanceof RegExp && !searchValue.global) {
153
+ searchValue = new RegExp(searchValue.source, `${searchValue.flags}g`);
154
+ }
155
+ return typeof replacer === "string" ? $string.replaceAll(searchValue, replacer) : $string.replaceAll(searchValue, (substring, ...$arguments) => {
156
+ const SOURCE_INDEX_OFFSET_FOR_GROUP_ARG = 2;
157
+ const hasGroupsArgument = typeof $arguments.at(-1) === "object";
158
+ const sourceIndex = hasGroupsArgument ? $arguments.length - SOURCE_INDEX_OFFSET_FOR_GROUP_ARG : $arguments.length - 1;
159
+ const replaceArguments = {
160
+ // eslint-disable-next-line no-restricted-syntax -- Can't avoid.
161
+ capturedGroupArguments: [],
162
+ groups: hasGroupsArgument ? $arguments.at(-1) : void 0,
163
+ missingGroupIndices: [],
164
+ offset: $arguments.at(sourceIndex - 1),
165
+ source: $arguments.at(sourceIndex),
166
+ substring
167
+ };
168
+ for (let index = 0; index < sourceIndex - 1; index++) {
169
+ const item = $arguments[index];
170
+ if (typeof item === "string") {
171
+ replaceArguments.capturedGroupArguments.push(item);
172
+ } else if (item === void 0) {
173
+ replaceArguments.missingGroupIndices.push(index);
174
+ }
175
+ }
176
+ return replacer(replaceArguments) ?? replaceArguments.substring;
177
+ });
178
+ }
179
+ async function replaceAllAsync(params) {
180
+ const { $string, replacer, searchValue } = params;
181
+ let { abortSignal } = params;
182
+ abortSignal ??= (0, import_abort_controller.abortSignalNever)();
183
+ abortSignal.throwIfAborted();
184
+ if (typeof replacer === "string") {
185
+ return replaceAll({
186
+ $string,
187
+ replacer,
188
+ searchValue
189
+ });
190
+ }
191
+ const replacementAsyncFns = [];
192
+ replaceAll({
193
+ $string,
194
+ replacer: ($arguments) => {
195
+ replacementAsyncFns.push(() => (0, import_value_provider.resolveValue)(replacer, { abortSignal, ...$arguments }));
196
+ return "";
197
+ },
198
+ searchValue
199
+ });
200
+ const replacements = [];
201
+ for (const asyncFunction of replacementAsyncFns) {
202
+ abortSignal.throwIfAborted();
203
+ replacements.push(await asyncFunction());
204
+ }
205
+ abortSignal.throwIfAborted();
206
+ return replaceAll({
207
+ $string,
208
+ replacer: ($arguments) => replacements.shift() ?? $arguments.substring,
209
+ searchValue
210
+ });
211
+ }
212
+ function trimEnd(params) {
213
+ const { $string, shouldValidate, suffix } = params;
214
+ if ($string.endsWith(suffix)) {
215
+ return $string.slice(0, -suffix.length);
216
+ }
217
+ if (shouldValidate) {
218
+ throw new Error(`String ${$string} does not end with suffix ${suffix}`);
219
+ }
220
+ return $string;
221
+ }
222
+ function trimStart(params) {
223
+ const { $string, prefix, shouldValidate } = params;
224
+ if ($string.startsWith(prefix)) {
225
+ return $string.slice(prefix.length);
226
+ }
227
+ if (shouldValidate) {
228
+ throw new Error(`String ${$string} does not start with prefix ${prefix}`);
229
+ }
230
+ return $string;
231
+ }
232
+ function unescape($string) {
233
+ return replace($string, UNESCAPE_MAP);
234
+ }
235
+ function unindent(params) {
236
+ const { prefix, shouldThrowIfNotIndented = false, text } = params;
237
+ return text.split("\n").map((line) => {
238
+ if (line.startsWith(prefix)) {
239
+ return line.slice(prefix.length);
240
+ }
241
+ if (shouldThrowIfNotIndented) {
242
+ throw new Error(`Line "${line}" is not indented with "${prefix}"`);
243
+ }
244
+ return line;
245
+ }).join("\n");
246
+ }
247
+ // Annotate the CommonJS export names for ESM import in node:
248
+ 0 && (module.exports = {
249
+ EMPTY,
250
+ ensureEndsWith,
251
+ ensureLfEndings,
252
+ ensureStartsWith,
253
+ escape,
254
+ getLfNormalizedOffsetToOriginalOffsetMapper,
255
+ hasSingleOccurrence,
256
+ indent,
257
+ insertAt,
258
+ makeValidVariableName,
259
+ normalizeString,
260
+ replace,
261
+ replaceAll,
262
+ replaceAllAsync,
263
+ trimEnd,
264
+ trimStart,
265
+ unescape,
266
+ unindent
267
+ });
268
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmluZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJpbmcgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4vdmFsdWUtcHJvdmlkZXIudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vcmVnLWV4cC50cyc7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5cbi8qKlxuICogQW4gZW1wdHkgc3RyaW5nIGNvbnN0YW50LlxuICpcbiAqIEEgc2hhcmVkIHNlbnRpbmVsIGZvciB0aGUgYCR7RU1QVFl9YCBwcmVmaXggdGhhdCBzaWxlbmNlcyB0aGUgYG9ic2lkaWFubWQvdWkvc2VudGVuY2UtY2FzZWAgRVNMaW50XG4gKiBmYWxzZSBwb3NpdGl2ZSBvbiBsZWdpdGltYXRlIGxvd2VyLWNhc2UgVUkgdGV4dCAoZS5nLiBgY3Vyc29yYCBjb2xsaWRpbmcgd2l0aCB0aGUgYEN1cnNvcmAgYnJhbmQpLlxuICogYHNldE5hbWUoYCR7RU1QVFl9Li4uYXQgY3Vyc29yLi4uYClgIHJlbmRlcnMgYnl0ZS1pZGVudGljYWwgYCcnYCBhdCBydW50aW1lIHdoaWxlIHRoZSBgey4uLn1gXG4gKiBwbGFjZWhvbGRlciBtYWtlcyB0aGUgcnVsZSBza2lwIHRoZSBzdHJpbmcuIENvbnN1bWVycyBpbXBvcnQgdGhpcyBpbnN0ZWFkIG9mIHJlZGVmaW5pbmcgYSBwZXItZmlsZVxuICogYGNvbnN0IEVNUFRZID0gJydgLlxuICovXG5leHBvcnQgY29uc3QgRU1QVFkgPSAnJztcblxuLyoqXG4gKiBBIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEFzeW5jUmVwbGFjZXI8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiA9IFZhbHVlUHJvdmlkZXI8U3RyaW5nUmVwbGFjZW1lbnQsIFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4+O1xuXG4vKipcbiAqIENvbW1vbiBhcmd1bWVudHMgZm9yIHRoZSBgcmVwbGFjZUFsbGAvYHJlcGxhY2VBbGxBc3luY2AgZnVuY3Rpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gQ2FwdHVyZWRHcm91cEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgY2FwdHVyZWQgZ3JvdXAgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiB7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gICAqL1xuICBjYXB0dXJlZEdyb3VwQXJndW1lbnRzOiBDYXB0dXJlZEdyb3VwQXJndW1lbnRzO1xuXG4gIC8qKlxuICAgKiBHcm91cHMgb2YgdGhlIG1hdGNoLlxuICAgKi9cbiAgZ3JvdXBzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2VzIG9mIHRoZSBncm91cHMgdGhhdCB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgbWF0Y2guXG4gICAqL1xuICBtaXNzaW5nR3JvdXBJbmRpY2VzOiBudW1iZXJbXTtcblxuICAvKipcbiAgICogQW4gb2Zmc2V0IG9mIHRoZSBtYXRjaC5cbiAgICovXG4gIG9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBvZiB0aGUgbWF0Y2guXG4gICAqL1xuICBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJzdHJpbmcgb2YgdGhlIG1hdGNoLlxuICAgKi9cbiAgc3Vic3RyaW5nOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxhY2VyPENhcHR1cmVkR3JvdXBBcmd1bWVudHMgZXh0ZW5kcyBzdHJpbmdbXT4gPSAoKCRhcmd1bWVudHM6IFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4pID0+IFN0cmluZ1JlcGxhY2VtZW50KSB8IFN0cmluZ1JlcGxhY2VtZW50O1xuXG50eXBlIFN0cmluZ1JlcGxhY2VtZW50ID0gTWF5YmVSZXR1cm48c3RyaW5nPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIHNwZWNpYWwgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIGNvdW50ZXJwYXJ0cy5cbiAqL1xuY29uc3QgRVNDQVBFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcbic6IFN0cmluZy5yYXdgXFxuYCxcbiAgJ1xccic6IFN0cmluZy5yYXdgXFxyYCxcbiAgJ1xcdCc6IFN0cmluZy5yYXdgXFx0YCxcbiAgJ1xcYic6IFN0cmluZy5yYXdgXFxiYCxcbiAgJ1xcZic6IFN0cmluZy5yYXdgXFxmYCxcbiAgJ1xcJyc6IFN0cmluZy5yYXdgXFwnYCxcbiAgJ1wiJzogU3RyaW5nLnJhd2BcXFwiYCxcbiAgJ1xcXFwnOiAnXFxcXFxcXFwnXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDUiA9ICdcXHInO1xuY29uc3QgTEYgPSAnXFxuJztcbmNvbnN0IE5PVF9GT1VORF9JTkRFWCA9IC0xO1xuXG4vKipcbiAqIE1hcHBpbmcgb2YgZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gdGhlaXIgdW5lc2NhcGVkIGNvdW50ZXJwYXJ0cy5cbiAqL1xuY29uc3QgVU5FU0NBUEVfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5mb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhFU0NBUEVfTUFQKSkge1xuICBVTkVTQ0FQRV9NQVBbdmFsdWVdID0ga2V5O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbnN1cmVFbmRzV2l0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlRW5kc1dpdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHN0cmluZyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5ICRzdHJpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1ZmZpeCB0byBlbnN1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWZmaXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlU3RhcnRzV2l0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlU3RhcnRzV2l0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIGNoZWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGVuc3VyZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBoYXNTaW5nbGVPY2N1cnJlbmNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYXNTaW5nbGVPY2N1cnJlbmNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggdmFsdWUgdG8gY2hlY2sgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5kZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0byBhZGQgdG8gZWFjaCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdG8gaW5kZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnNlcnRBdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0QXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHN0cmluZyB0byBpbnNlcnQgdGhlIHN1YnN0cmluZyBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggdG8gZW5kIHRoZSBzdWJzdHJpbmcgYXQuXG4gICAqL1xuICByZWFkb25seSBlbmRJbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IHRvIGluc2VydCB0aGUgc3Vic3RyaW5nIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRJbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3Vic3RyaW5nIHRvIGluc2VydC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnN0cmluZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXBsYWNlQWxsQXN5bmN9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVwbGFjZUdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUFsbEFzeW5jUGFyYW1zPFJlcGxhY2VHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIGluIHdoaWNoIHRvIHBlcmZvcm0gcmVwbGFjZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gICAqL1xuICByZWFkb25seSByZXBsYWNlcjogQXN5bmNSZXBsYWNlcjxSZXBsYWNlR3JvdXBBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IFJlZ0V4cCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVwbGFjZUFsbH0uXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUFsbFBhcmFtczxDYXB0dXJlZEdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+IHtcbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgaW4gd2hpY2ggdG8gcGVyZm9ybSByZXBsYWNlbWVudHMuXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVwbGFjZXIgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgcmVwbGFjZW1lbnQgc3RyaW5ncywgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGFjZXI6IFJlcGxhY2VyPENhcHR1cmVkR3JvdXBBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IFJlZ0V4cCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdHJpbUVuZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJpbUVuZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgZW5kIHdpdGggdGhlIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmFsaWRhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VmZml4IHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHN1ZmZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmltU3RhcnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyaW1TdGFydFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdG8gcmVtb3ZlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZhbGlkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbmRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaW5kZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdG8gcmVtb3ZlIGZyb20gZWFjaCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhyb3dzIGFuIGVycm9yIGlmIGEgbGluZSBpcyBub3QgaW5kZW50ZWQgd2l0aCB0aGUgcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd0lmTm90SW5kZW50ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHVuaW5kZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIGFkZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHN0cmluZyB0aGF0IGVuZHMgd2l0aCB0aGUgc3VmZml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5kc1dpdGgocGFyYW1zOiBFbnN1cmVFbmRzV2l0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgc3VmZml4IH0gPSBwYXJhbXM7XG4gIHJldHVybiAkc3RyaW5nLmVuZHNXaXRoKHN1ZmZpeCkgPyAkc3RyaW5nIDogJHN0cmluZyArIHN1ZmZpeDtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBzdHJpbmcgaGFzIGBMRmAgbGluZSBlbmRpbmdzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBDUkxGYCBsaW5lIGVuZGluZ3Mgd2l0aCBgTEZgLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgd2l0aCBgTEZgIGxpbmUgZW5kaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUxmRW5kaW5ncygkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJHN0cmluZy5yZXBsYWNlQWxsKC9cXHJcXG4/L2csICdcXG4nKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIGFkZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVTdGFydHNXaXRoKHBhcmFtczogRW5zdXJlU3RhcnRzV2l0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcHJlZml4IH0gPSBwYXJhbXM7XG4gIHJldHVybiAkc3RyaW5nLnN0YXJ0c1dpdGgocHJlZml4KSA/ICRzdHJpbmcgOiBwcmVmaXggKyAkc3RyaW5nO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2UoJHN0cmluZywgRVNDQVBFX01BUCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgbWFwcyBMRi1ub3JtYWxpemVkIG9mZnNldHMgdG8gb3JpZ2luYWwgb2Zmc2V0cy5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gZ2V0IHRoZSBMRi1ub3JtYWxpemVkIGluZGljZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBtYXBzIExGLW5vcm1hbGl6ZWQgb2Zmc2V0cyB0byBvcmlnaW5hbCBvZmZzZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcigkc3RyaW5nOiBzdHJpbmcpOiAobGZPZmZzZXQ6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgY29uc3QgbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAkc3RyaW5nLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICgkc3RyaW5nW2luZGV4XSA9PT0gQ1IgJiYgJHN0cmluZ1tpbmRleCArIDFdID09PSBMRikge1xuICAgICAgbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwLnB1c2goaW5kZXggKyAxKTtcbiAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5wdXNoKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGxmT2Zmc2V0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmIChsZk9mZnNldCA8IDApIHtcbiAgICAgIHJldHVybiBsZk9mZnNldDtcbiAgICB9XG4gICAgaWYgKGxmT2Zmc2V0ID49IGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBsZk9mZnNldCAtIGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5sZW5ndGggKyAkc3RyaW5nLmxlbmd0aDtcbiAgICB9XG5cbiAgICBhc3NlcnQobGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwW2xmT2Zmc2V0XSAhPT0gdW5kZWZpbmVkLCAnQ291bGQgbm90IG1hcCBvZmZzZXQnKTtcbiAgICByZXR1cm4gbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwW2xmT2Zmc2V0XTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaGFzIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgYSBzZWFyY2ggdmFsdWUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdHJpbmcgaGFzIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgdGhlIHNlYXJjaCB2YWx1ZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTaW5nbGVPY2N1cnJlbmNlKHBhcmFtczogSGFzU2luZ2xlT2NjdXJyZW5jZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7ICRzdHJpbmcsIHNlYXJjaFZhbHVlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpcnN0SW5kZXggPSAkc3RyaW5nLmluZGV4T2Yoc2VhcmNoVmFsdWUpO1xuICBjb25zdCBsYXN0SW5kZXggPSAkc3RyaW5nLmxhc3RJbmRleE9mKHNlYXJjaFZhbHVlKTtcbiAgcmV0dXJuIGZpcnN0SW5kZXggIT09IE5PVF9GT1VORF9JTkRFWCAmJiBmaXJzdEluZGV4ID09PSBsYXN0SW5kZXg7XG59XG5cbi8qKlxuICogSW5kZW50cyBhIHN0cmluZyBieSBhZGRpbmcgYSBwcmVmaXggdG8gZWFjaCBsaW5lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBpbmRlbnRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRlbnQocGFyYW1zOiBJbmRlbnRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IHByZWZpeCwgdGV4dCB9ID0gcGFyYW1zO1xuICByZXR1cm4gdGV4dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9JHtsaW5lfWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEluc2VydHMgYSBzdWJzdHJpbmcgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZyB3aXRoIHRoZSBzdWJzdHJpbmcgaW5zZXJ0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRBdChwYXJhbXM6IEluc2VydEF0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgICRzdHJpbmcsXG4gICAgZW5kSW5kZXgsXG4gICAgc3RhcnRJbmRleCxcbiAgICBzdWJzdHJpbmdcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZWZmZWN0aXZlRW5kSW5kZXggPSBlbmRJbmRleCA/PyBzdGFydEluZGV4O1xuICByZXR1cm4gJHN0cmluZy5zbGljZSgwLCBzdGFydEluZGV4KSArIHN1YnN0cmluZyArICRzdHJpbmcuc2xpY2UoZWZmZWN0aXZlRW5kSW5kZXgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB2YWxpZCBKYXZhU2NyaXB0IHZhcmlhYmxlIG5hbWUgYnkgcmVwbGFjaW5nIGludmFsaWQgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmVzLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIHZhbGlkIHZhcmlhYmxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVmFsaWRWYXJpYWJsZU5hbWUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICdfJyxcbiAgICBzZWFyY2hWYWx1ZTogL1teYS16QS1aMC05X10vZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc3RyaW5nIGJ5IGNvbnZlcnRpbmcgaXQgdG8gdGhlIE5GQyBmb3JtIGFuZCByZXBsYWNpbmcgbm9uLWJyZWFraW5nIHNwYWNlcyB3aXRoIHJlZ3VsYXIgc3BhY2VzLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmcoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICcgJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItdW5pY29kZS1jb2RlLXBvaW50LWVzY2FwZXMgLS0gVGhlc2UgYXJlIHRoZSBjb252ZW50aW9uYWwgc3BlbGxpbmdzIGZvciBVKzAwQTAgYW5kIFUrMjAyRi4gVGhlIGNvZGUtcG9pbnQgZm9ybSBpcyBvbmx5IHVuYW1iaWd1b3VzIHdpdGggdGhlIGB1YCBmbGFnLCBzbyB0YWtpbmcgdGhlIGZpeCB3b3VsZCBhbHNvIGNoYW5nZSBob3cgdGhlIHBhdHRlcm4gaXMgcGFyc2VkLlxuICAgIHNlYXJjaFZhbHVlOiAvXFx1MDBBMHxcXHUyMDJGL2dcbiAgfSkubm9ybWFsaXplKCdORkMnKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiBzdHJpbmdzIGluIGEgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIGEgcmVwbGFjZW1lbnRzIG1hcC5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gcGVyZm9ybSByZXBsYWNlbWVudHMgb24uXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnRzTWFwIC0gQW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5ncyB0byB0aGVpciByZXBsYWNlbWVudCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc3RyaW5nIHdpdGggcmVwbGFjZW1lbnRzIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlKCRzdHJpbmc6IHN0cmluZywgcmVwbGFjZW1lbnRzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhyZXBsYWNlbWVudHNNYXApLm1hcCgoc291cmNlKSA9PiBlc2NhcGVSZWdFeHAoc291cmNlKSkuam9pbignfCcpLCAnZycpO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZyxcbiAgICByZXBsYWNlcjogKHsgc3Vic3RyaW5nOiBzb3VyY2UgfSkgPT4gZW5zdXJlTm9uTnVsbGFibGUocmVwbGFjZW1lbnRzTWFwW3NvdXJjZV0pLFxuICAgIHNlYXJjaFZhbHVlOiByZWdFeHBcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIGEgc2VhcmNoIHN0cmluZyBvciBwYXR0ZXJuIHdpdGggdGhlIHJlc3VsdHMgb2YgYW4gcmVwbGFjZXIgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHdpdGggYWxsIHJlcGxhY2VtZW50cyBtYWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUFsbDxDYXB0dXJlZEdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+KHBhcmFtczogUmVwbGFjZUFsbFBhcmFtczxDYXB0dXJlZEdyb3VwQXJndW1lbnRzPik6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcmVwbGFjZXIgfSA9IHBhcmFtcztcbiAgbGV0IHsgc2VhcmNoVmFsdWUgfSA9IHBhcmFtcztcbiAgaWYgKHJlcGxhY2VyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJHN0cmluZztcbiAgfVxuXG4gIGlmIChzZWFyY2hWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhc2VhcmNoVmFsdWUuZ2xvYmFsKSB7XG4gICAgc2VhcmNoVmFsdWUgPSBuZXcgUmVnRXhwKHNlYXJjaFZhbHVlLnNvdXJjZSwgYCR7c2VhcmNoVmFsdWUuZmxhZ3N9Z2ApO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiByZXBsYWNlciA9PT0gJ3N0cmluZydcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtc3RyaW5nLXJlcGxhY2VtZW50IC0tIFRoZSBwYXNzLXRocm91Z2ggaXMgbG9hZC1iZWFyaW5nOiBjYWxsZXJzIHJlbHkgb24gYCQmYCBhbmQgZnJpZW5kcyBiZWluZyBleHBhbmRlZC4gYGVzY2FwZUFsaWFzYCBwYXNzZXMgYFxcJCZgIHRvIHByZWZpeCBlYWNoIG1hdGNoZWQgY2hhcmFjdGVyIHdpdGggYSBiYWNrc2xhc2gsIGFuZCBgY2xpLXV0aWxzYCBwYXNzZXMgYF4kJmAuIEluc2VydGluZyB0aGUgc3RyaW5nIGxpdGVyYWxseSB3b3VsZCBicmVhayBib3RoLlxuICAgID8gJHN0cmluZy5yZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlcilcbiAgICA6ICRzdHJpbmcucmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgKHN1YnN0cmluZzogc3RyaW5nLCAuLi4kYXJndW1lbnRzOiB1bmtub3duW10pID0+IHtcbiAgICAgIGNvbnN0IFNPVVJDRV9JTkRFWF9PRkZTRVRfRk9SX0dST1VQX0FSRyA9IDI7XG4gICAgICBjb25zdCBoYXNHcm91cHNBcmd1bWVudCA9IHR5cGVvZiAkYXJndW1lbnRzLmF0KC0xKSA9PT0gJ29iamVjdCc7XG4gICAgICBjb25zdCBzb3VyY2VJbmRleCA9IGhhc0dyb3Vwc0FyZ3VtZW50ID8gJGFyZ3VtZW50cy5sZW5ndGggLSBTT1VSQ0VfSU5ERVhfT0ZGU0VUX0ZPUl9HUk9VUF9BUkcgOiAkYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VBcmd1bWVudHM6IFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4gPSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBDYW4ndCBhdm9pZC5cbiAgICAgICAgY2FwdHVyZWRHcm91cEFyZ3VtZW50czogW10gYXMgdW5rbm93bltdIGFzIENhcHR1cmVkR3JvdXBBcmd1bWVudHMsXG4gICAgICAgIGdyb3VwczogaGFzR3JvdXBzQXJndW1lbnQgPyAkYXJndW1lbnRzLmF0KC0xKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IDogdW5kZWZpbmVkLFxuICAgICAgICBtaXNzaW5nR3JvdXBJbmRpY2VzOiBbXSxcbiAgICAgICAgb2Zmc2V0OiAkYXJndW1lbnRzLmF0KHNvdXJjZUluZGV4IC0gMSkgYXMgbnVtYmVyLFxuICAgICAgICBzb3VyY2U6ICRhcmd1bWVudHMuYXQoc291cmNlSW5kZXgpIGFzIHN0cmluZyxcbiAgICAgICAgc3Vic3RyaW5nXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlSW5kZXggLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSAkYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJlcGxhY2VBcmd1bWVudHMuY2FwdHVyZWRHcm91cEFyZ3VtZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCB0cmFja3MgdGhlIGltcGxpY2l0IGVsc2UgYnJhbmNoIHRoYXQgbmV2ZXIgaGFwcGVucy4gKi9cbiAgICAgICAgfSBlbHNlIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgIHJlcGxhY2VBcmd1bWVudHMubWlzc2luZ0dyb3VwSW5kaWNlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHJlcGxhY2VyKHJlcGxhY2VBcmd1bWVudHMpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcmVwbGFjZUFyZ3VtZW50cy5zdWJzdHJpbmc7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIGEgc2VhcmNoIHN0cmluZyBvciBwYXR0ZXJuIHdpdGggdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIHJlcGxhY2VyIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gUmVwbGFjZUdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdHJpbmcgd2l0aCBhbGwgcmVwbGFjZW1lbnRzIG1hZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBsYWNlQWxsQXN5bmM8UmVwbGFjZUdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+KHBhcmFtczogUmVwbGFjZUFsbEFzeW5jUGFyYW1zPFJlcGxhY2VHcm91cEFyZ3VtZW50cz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7ICRzdHJpbmcsIHJlcGxhY2VyLCBzZWFyY2hWYWx1ZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAgICRzdHJpbmcsXG4gICAgICByZXBsYWNlcixcbiAgICAgIHNlYXJjaFZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXBsYWNlbWVudEFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzZTxTdHJpbmdSZXBsYWNlbWVudD4pW10gPSBbXTtcblxuICByZXBsYWNlQWxsPFJlcGxhY2VHcm91cEFyZ3VtZW50cz4oe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICgkYXJndW1lbnRzKSA9PiB7XG4gICAgICByZXBsYWNlbWVudEFzeW5jRm5zLnB1c2goKCkgPT4gcmVzb2x2ZVZhbHVlKHJlcGxhY2VyLCB7IGFib3J0U2lnbmFsLCAuLi4kYXJndW1lbnRzIH0pKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlXG4gIH0pO1xuXG4gIGNvbnN0IHJlcGxhY2VtZW50czogU3RyaW5nUmVwbGFjZW1lbnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYXN5bmNGdW5jdGlvbiBvZiByZXBsYWNlbWVudEFzeW5jRm5zKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXBsYWNlbWVudHMucHVzaChhd2FpdCBhc3luY0Z1bmN0aW9uKCkpO1xuICB9XG5cbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICgkYXJndW1lbnRzKTogc3RyaW5nID0+IHJlcGxhY2VtZW50cy5zaGlmdCgpID8/ICRhcmd1bWVudHMuc3Vic3RyaW5nLFxuICAgIHNlYXJjaFZhbHVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaW1zIHRoZSBzcGVjaWZpZWQgc3VmZml4IGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdHJpbW1lZCBzdHJpbmcuXG4gKiBAdGhyb3dzIElmIGBzaG91bGRWYWxpZGF0ZWAgaXMgYHRydWVgIGFuZCB0aGUgc3RyaW5nIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltRW5kKHBhcmFtczogVHJpbUVuZFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgc2hvdWxkVmFsaWRhdGUsIHN1ZmZpeCB9ID0gcGFyYW1zO1xuICBpZiAoJHN0cmluZy5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgcmV0dXJuICRzdHJpbmcuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpO1xuICB9XG5cbiAgaWYgKHNob3VsZFZhbGlkYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHskc3RyaW5nfSBkb2VzIG5vdCBlbmQgd2l0aCBzdWZmaXggJHtzdWZmaXh9YCk7XG4gIH1cblxuICByZXR1cm4gJHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmltcyB0aGUgc3BlY2lmaWVkIHByZWZpeCBmcm9tIHRoZSBzdGFydCBvZiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdHJpbW1lZCBzdHJpbmcuXG4gKiBAdGhyb3dzIElmIGBzaG91bGRWYWxpZGF0ZWAgaXMgYHRydWVgIGFuZCB0aGUgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIHByZWZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1TdGFydChwYXJhbXM6IFRyaW1TdGFydFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcHJlZml4LCBzaG91bGRWYWxpZGF0ZSB9ID0gcGFyYW1zO1xuICBpZiAoJHN0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gJHN0cmluZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU3RyaW5nICR7JHN0cmluZ30gZG9lcyBub3Qgc3RhcnQgd2l0aCBwcmVmaXggJHtwcmVmaXh9YCk7XG4gIH1cblxuICByZXR1cm4gJHN0cmluZztcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGVzY2FwZSBzZXF1ZW5jZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICogQHJldHVybnMgVGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZSgkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZSgkc3RyaW5nLCBVTkVTQ0FQRV9NQVApO1xufVxuXG4vKipcbiAqIFVuaW5kZW50cyBhIHN0cmluZyBieSByZW1vdmluZyBhIHByZWZpeCBmcm9tIGVhY2ggbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdW5pbmRlbnRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmluZGVudChwYXJhbXM6IFVuaW5kZW50UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBwcmVmaXgsIHNob3VsZFRocm93SWZOb3RJbmRlbnRlZCA9IGZhbHNlLCB0ZXh0IH0gPSBwYXJhbXM7XG4gIHJldHVybiB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IHtcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiBsaW5lLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkVGhyb3dJZk5vdEluZGVudGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmUgXCIke2xpbmV9XCIgaXMgbm90IGluZGVudGVkIHdpdGggXCIke3ByZWZpeH1cImApO1xuICAgIH1cbiAgICByZXR1cm4gbGluZTtcbiAgfSkuam9pbignXFxuJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0EsOEJBQWlDO0FBQ2pDLHFCQUE2QjtBQUM3Qix5QkFHTztBQUNQLDRCQUE2QjtBQVd0QixNQUFNLFFBQVE7QUEwRHJCLE1BQU0sYUFBcUM7QUFBQSxFQUN6QyxNQUFNLE9BQU87QUFBQSxFQUNiLE1BQU0sT0FBTztBQUFBLEVBQ2IsS0FBTSxPQUFPO0FBQUEsRUFDYixNQUFNLE9BQU87QUFBQSxFQUNiLE1BQU0sT0FBTztBQUFBLEVBQ2IsS0FBTSxPQUFPO0FBQUEsRUFDYixLQUFLLE9BQU87QUFBQSxFQUNaLE1BQU07QUFDUjtBQUVBLE1BQU0sS0FBSztBQUNYLE1BQU0sS0FBSztBQUNYLE1BQU0sa0JB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