hl7-tstd 0.3.1 → 1.0.0-dev.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.
package/dist/index.cjs CHANGED
@@ -1,420 +1,445 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ 'use strict';
19
2
 
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- default: () => index_default
24
- });
25
- module.exports = __toCommonJS(index_exports);
26
- var Node = class {
27
- constructor(data, next = null, prev = null) {
28
- this.data = data;
29
- this.next = next;
30
- this.prev = prev;
31
- }
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
32
5
  };
6
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
7
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
8
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
9
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
10
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
11
+
12
+ // src/utils/segment.ts
13
+ var _parseMap, _Segment_instances, traverse_fn;
33
14
  var Segment = class {
34
- constructor(type, data = null, parseOptions) {
15
+ constructor(type, parseOptions) {
35
16
  this.type = type;
36
- this.data = data;
17
+ __privateAdd(this, _Segment_instances);
18
+ this.data = {};
19
+ __privateAdd(this, _parseMap);
37
20
  var _a, _b, _c, _d;
21
+ if (!type || !/^[A-Z\d]{3}(\.\d+){0,2}$/.test(type))
22
+ throw new Error(`Invalid parameter: 'type' [${type}]`);
23
+ this.data[type === "MSH" ? "1" : "0"] = [{ 1: [type] }];
38
24
  this.parseOptions = {
39
25
  fieldDelim: (_a = parseOptions == null ? void 0 : parseOptions.fieldDelim) != null ? _a : "|",
40
26
  repeatingDelim: (_b = parseOptions == null ? void 0 : parseOptions.repeatingDelim) != null ? _b : "~",
41
27
  componentDelim: (_c = parseOptions == null ? void 0 : parseOptions.componentDelim) != null ? _c : "^",
42
28
  subCompDelim: (_d = parseOptions == null ? void 0 : parseOptions.subCompDelim) != null ? _d : "&"
43
29
  };
30
+ __privateSet(this, _parseMap, {
31
+ 0: this.parseOptions.fieldDelim,
32
+ 1: this.parseOptions.repeatingDelim,
33
+ 2: this.parseOptions.componentDelim,
34
+ 3: this.parseOptions.subCompDelim
35
+ });
44
36
  }
45
37
  get(field, repeatingIndex = 0, subComponentIndex = 0) {
46
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
47
- if (!this.data) return null;
48
- if (!field || !/^[A-Z\d]{3}(\.\d+){0,2}$/.test(field))
38
+ const validate = (val) => !(typeof val === "number" && val >= 0 || val === true);
39
+ if (!field || !/^[A-Z\d]{3}$/.test(field))
49
40
  throw new Error(`Invalid parameter: 'field' [${field}]`);
50
- if (typeof repeatingIndex !== "number" || repeatingIndex < -1)
41
+ if (validate(repeatingIndex))
51
42
  throw new Error(`Invalid parameter: 'repeatingIndex' [${repeatingIndex}]`);
52
- if (typeof subComponentIndex !== "number" || subComponentIndex < -1)
43
+ if (validate(subComponentIndex))
53
44
  throw new Error(`Invalid parameter: 'subComponentIndex' [${subComponentIndex}]`);
54
- const { fieldDelim, repeatingDelim, componentDelim, subCompDelim } = this.parseOptions;
55
45
  const [type, fieldIdx, compIdx] = field.split(".");
46
+ const path = [fieldIdx, repeatingIndex, compIdx, subComponentIndex];
56
47
  if (!type || type !== this.type)
57
48
  throw new Error(
58
- `Invalid parameter: 'field' [${field}]. Cannot get [${field}] from [${this.type}] segment.`
49
+ `Invalid parameter: 'field'. Cannot get [${field}] from [${this.type}] segment.`
59
50
  );
60
- if (fieldIdx && compIdx) {
61
- if (subComponentIndex === -1) {
62
- return (_d = (_c = (_b = (_a = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _a[repeatingIndex]) == null ? void 0 : _b[`${type}.${fieldIdx}.${compIdx}`]) == null ? void 0 : _c.join(subCompDelim)) != null ? _d : null;
63
- } else {
64
- return (_h = (_g = (_f = (_e = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _e[repeatingIndex]) == null ? void 0 : _f[`${type}.${fieldIdx}.${compIdx}`]) == null ? void 0 : _g[subComponentIndex]) != null ? _h : null;
65
- }
66
- } else if (fieldIdx) {
67
- let field2 = repeatingIndex === -1 ? this.data[`${type}.${fieldIdx}`] : [(_i = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _i[repeatingIndex]];
68
- const repeatingFieldsArr = [];
69
- if (!field2 || !field2[0]) return null;
70
- for (const repeatingField of field2) {
71
- const componentsArr = [];
72
- for (const compKey in repeatingField) {
73
- componentsArr.push(repeatingField[compKey].join(subCompDelim));
74
- }
75
- repeatingFieldsArr.push(componentsArr.join(componentDelim));
76
- }
77
- return repeatingFieldsArr.join(repeatingDelim);
78
- } else {
79
- if (!this.data) return null;
80
- const fieldsArr = [this.type];
81
- for (const fieldKey in this.data) {
82
- const repeatingCompsArr = [];
83
- for (const repeatingField of this.data[fieldKey]) {
84
- const compsArr = [];
85
- for (const compKey in repeatingField) {
86
- compsArr.push((_j = repeatingField[compKey]) == null ? void 0 : _j.join(subCompDelim));
87
- }
88
- repeatingCompsArr.push(compsArr.join(componentDelim));
89
- }
90
- fieldsArr.push(repeatingCompsArr.join(repeatingDelim));
91
- }
92
- return fieldsArr.join(fieldDelim);
93
- }
51
+ return __privateMethod(this, _Segment_instances, traverse_fn).call(this, this.data, path);
94
52
  }
95
53
  set(field, value, repeatingIndex = 0, subComponentIndex = 0) {
96
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
54
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
55
+ const validate = (val) => !(typeof val === "number" && val >= 0 || val === true);
97
56
  if (!field || !/^[A-Z\d]{3}(\.\d+){1,2}$/.test(field))
98
57
  throw new Error(`Invalid parameter: 'field' [${field}]`);
99
58
  if (value == null || typeof value !== "string")
100
59
  throw new Error(`Invalid parameter: 'value' [${value}]`);
101
- if (typeof repeatingIndex !== "number" && repeatingIndex < 0)
60
+ if (validate(repeatingIndex))
102
61
  throw new Error(`Invalid parameter: 'repeatingIndex' [${repeatingIndex}]`);
103
- if (typeof subComponentIndex !== "number" && subComponentIndex < 0)
62
+ if (validate(subComponentIndex))
104
63
  throw new Error(`Invalid parameter: 'subComponentIndex' [${subComponentIndex}]`);
105
64
  const [type, fieldIdx, compIdx] = field.split(".");
106
65
  if (!type || type !== this.type)
107
66
  throw new Error(
108
67
  `Invalid parameter: 'field' [${field}]. Cannot set [${field}] from [${this.type}] segment.`
109
68
  );
110
- if (!fieldIdx) throw new Error(`Invalid parameter: 'field' [${field}]`);
111
- if (!this.data) this.data = {};
112
- for (let i = type === "MSH" ? 2 : 1; i <= parseInt(fieldIdx, 10); i++) {
113
- if (((_b = (_a = this.data[`${type}.${i}`]) == null ? void 0 : _a[0]) == null ? void 0 : _b[`${type}.${i}.${1}`]) == null)
114
- this.data[`${type}.${i}`] = [{ [`${type}.${i}.${1}`]: [""] }];
69
+ if (!fieldIdx || !Number(fieldIdx)) throw new Error(`Invalid parameter: 'field' [${field}]`);
70
+ for (let i = type === "MSH" ? 2 : 1; i <= Number(fieldIdx); i++) {
71
+ if (!((_d = (_c = (_b = (_a = this.data) == null ? void 0 : _a[i]) == null ? void 0 : _b[0]) == null ? void 0 : _c[1]) == null ? void 0 : _d[0]) == null) this.data[i] = [{ 1: [""] }];
115
72
  }
116
- for (let i = 0; i <= repeatingIndex; i++) {
117
- if (((_d = (_c = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _c[i]) == null ? void 0 : _d[`${type}.${fieldIdx}.${1}`]) == null)
118
- this.data[`${type}.${fieldIdx}`][i] = { [`${type}.${fieldIdx}.${1}`]: [""] };
119
- }
120
- if (compIdx) {
121
- for (let i = 1; i <= parseInt(compIdx, 10); i++) {
122
- if (((_f = (_e = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _e[repeatingIndex]) == null ? void 0 : _f[`${type}.${fieldIdx}.${i}`]) == null)
123
- this.data[`${type}.${fieldIdx}`][repeatingIndex][`${type}.${fieldIdx}.${i}`] = [""];
73
+ if (Number.isInteger(repeatingIndex)) {
74
+ for (let i = 0; i <= Number(repeatingIndex); i++) {
75
+ if (((_g = (_f = (_e = this.data[fieldIdx]) == null ? void 0 : _e[i]) == null ? void 0 : _f[1]) == null ? void 0 : _g[0]) == null) this.data[fieldIdx][i] = { 1: [""] };
124
76
  }
125
- for (let i = 0; i <= subComponentIndex; i++) {
126
- if (((_i = (_h = (_g = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _g[repeatingIndex]) == null ? void 0 : _h[`${type}.${fieldIdx}.${compIdx}`]) == null ? void 0 : _i[i]) == null)
127
- this.data[`${type}.${fieldIdx}`][repeatingIndex][`${type}.${fieldIdx}.${compIdx}`][i] = "";
77
+ if (compIdx && Number(compIdx)) {
78
+ for (let i = 1; i <= Number(compIdx); i++) {
79
+ if (((_j = (_i = (_h = this.data[fieldIdx]) == null ? void 0 : _h[repeatingIndex]) == null ? void 0 : _i[i]) == null ? void 0 : _j[0]) == null)
80
+ this.data[fieldIdx][repeatingIndex][i] = [""];
81
+ }
82
+ if (Number.isInteger(subComponentIndex)) {
83
+ for (let i = 0; i <= Number(subComponentIndex); i++) {
84
+ if (((_m = (_l = (_k = this.data[fieldIdx]) == null ? void 0 : _k[repeatingIndex]) == null ? void 0 : _l[compIdx]) == null ? void 0 : _m[i]) == null)
85
+ this.data[fieldIdx][repeatingIndex][compIdx][i] = "";
86
+ }
87
+ this.data[fieldIdx][repeatingIndex][compIdx][subComponentIndex] = value;
88
+ } else if (subComponentIndex === true) {
89
+ this.data[fieldIdx][repeatingIndex][compIdx] = [value];
90
+ }
91
+ } else {
92
+ this.data[fieldIdx][repeatingIndex] = { 1: [value] };
128
93
  }
129
- this.data[`${type}.${fieldIdx}`][repeatingIndex][`${type}.${fieldIdx}.${compIdx}`][subComponentIndex] = value;
94
+ } else if (repeatingIndex == true) {
95
+ this.data[fieldIdx] = [{ 1: [""] }];
96
+ if (compIdx && Number(compIdx)) {
97
+ for (let i = 1; i <= Number(compIdx); i++) {
98
+ if (((_p = (_o = (_n = this.data[fieldIdx]) == null ? void 0 : _n[0]) == null ? void 0 : _o[i]) == null ? void 0 : _p[0]) == null) this.data[fieldIdx][0][i] = [""];
99
+ }
100
+ if (Number.isInteger(subComponentIndex)) {
101
+ for (let i = 0; i <= Number(subComponentIndex); i++) {
102
+ if (((_s = (_r = (_q = this.data[fieldIdx]) == null ? void 0 : _q[0]) == null ? void 0 : _r[compIdx]) == null ? void 0 : _s[i]) == null)
103
+ this.data[fieldIdx][0][compIdx][i] = "";
104
+ }
105
+ this.data[fieldIdx][0][compIdx][subComponentIndex] = value;
106
+ } else if (subComponentIndex === true) {
107
+ this.data[fieldIdx][0][compIdx] = [value];
108
+ }
109
+ } else {
110
+ this.data[fieldIdx] = [{ 1: [value] }];
111
+ }
112
+ }
113
+ }
114
+ };
115
+ _parseMap = new WeakMap();
116
+ _Segment_instances = new WeakSet();
117
+ traverse_fn = function(data, path, depth = 0) {
118
+ const index = path[depth];
119
+ if (Array.isArray(data)) {
120
+ if (index === true || index == null) {
121
+ const delim = __privateGet(this, _parseMap)[depth++];
122
+ return data.map((item) => __privateMethod(this, _Segment_instances, traverse_fn).call(this, item, path, depth)).join(delim);
123
+ } else {
124
+ return __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[Number(index)], path, ++depth);
125
+ }
126
+ } else if (typeof data === "object") {
127
+ if (index === true || index == null) {
128
+ const delim = __privateGet(this, _parseMap)[depth++];
129
+ const val = Object.keys(data).map((key) => __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[key], path, depth));
130
+ return val.join(delim);
130
131
  } else {
131
- this.data[`${type}.${fieldIdx}`][repeatingIndex] = {
132
- [`${type}.${fieldIdx}.${1}`]: [value]
133
- };
132
+ return __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[Number(index)], path, ++depth);
134
133
  }
134
+ } else {
135
+ return data;
135
136
  }
136
137
  };
138
+
139
+ // src/utils/dll.ts
140
+ var Node = class {
141
+ constructor(data, next = null, prev = null) {
142
+ this.data = data;
143
+ this.next = next;
144
+ this.prev = prev;
145
+ }
146
+ };
147
+ var _head, _tail, _segmentNodeMap, _DLL_instances, detachNode_fn;
148
+ var DLL = class {
149
+ constructor() {
150
+ __privateAdd(this, _DLL_instances);
151
+ __privateAdd(this, _head, null);
152
+ __privateAdd(this, _tail, null);
153
+ __privateAdd(this, _segmentNodeMap, /* @__PURE__ */ new WeakMap());
154
+ }
155
+ getSegment(type) {
156
+ let curr = __privateGet(this, _head);
157
+ while (curr) {
158
+ if (curr.data.type === type) return curr.data;
159
+ curr = curr.next;
160
+ }
161
+ return curr || null;
162
+ }
163
+ getSegments(type) {
164
+ const segments = [];
165
+ let curr = __privateGet(this, _head);
166
+ while (curr) {
167
+ if (type) {
168
+ if (type === curr.data.type) segments.push(curr.data);
169
+ } else {
170
+ segments.push(curr.data);
171
+ }
172
+ curr = curr.next;
173
+ }
174
+ return segments;
175
+ }
176
+ getSegmentsAfter(type, startSegment, stopSegmentType = [], consecutive = false) {
177
+ const startNode = this.getNodeFromSegment(startSegment);
178
+ if (!startNode) throw new Error(`Failed to locate: 'startSegment' [${startSegment.type}]`);
179
+ const res = [];
180
+ let curr = startNode.next;
181
+ while (curr) {
182
+ if (stopSegmentType.length && stopSegmentType.includes(curr.data.type)) break;
183
+ if (curr.data.type === type) res.push(curr.data);
184
+ else if (consecutive && res.length) break;
185
+ curr = curr.next;
186
+ }
187
+ return res;
188
+ }
189
+ appendNewSegment(newSegment, targetSegment) {
190
+ const newNode = new Node(newSegment);
191
+ __privateGet(this, _segmentNodeMap).set(newSegment, newNode);
192
+ this.moveNodeAfter(newNode, this.getNodeFromSegment(targetSegment) || __privateGet(this, _tail));
193
+ return newSegment;
194
+ }
195
+ moveNodeAfter(node, targetNode) {
196
+ if (!node) throw new Error("Failed to locate node");
197
+ if (!__privateGet(this, _head)) {
198
+ __privateSet(this, _head, __privateSet(this, _tail, node));
199
+ node.prev = null;
200
+ node.next = null;
201
+ return;
202
+ }
203
+ if (!targetNode) throw new Error("Failed to locate node targetNode");
204
+ if (node === targetNode || targetNode.next === node) return;
205
+ __privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
206
+ node.prev = targetNode;
207
+ node.next = targetNode.next;
208
+ if (targetNode.next) targetNode.next.prev = node;
209
+ else __privateSet(this, _tail, node);
210
+ targetNode.next = node;
211
+ }
212
+ prependNewSegment(newSegment, targetSegment) {
213
+ const newNode = new Node(newSegment);
214
+ __privateGet(this, _segmentNodeMap).set(newSegment, newNode);
215
+ const targetNode = this.getNodeFromSegment(targetSegment);
216
+ if (!targetNode) throw new Error("Failed to locate targetNode");
217
+ this.moveNodeBefore(newNode, targetNode);
218
+ return newSegment;
219
+ }
220
+ moveNodeBefore(node, targetNode) {
221
+ if (!node) throw new Error("Failed to locate node");
222
+ if (!__privateGet(this, _head)) {
223
+ __privateSet(this, _head, __privateSet(this, _tail, node));
224
+ node.prev = null;
225
+ node.next = null;
226
+ return;
227
+ }
228
+ if (!targetNode) throw new Error("Failed to locate targetNode");
229
+ if (node === targetNode || targetNode.prev === node) return;
230
+ __privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
231
+ node.next = targetNode;
232
+ node.prev = targetNode.prev;
233
+ if (targetNode.prev) targetNode.prev.next = node;
234
+ else __privateSet(this, _head, node);
235
+ targetNode.prev = node;
236
+ }
237
+ deleteSegment(segment) {
238
+ const node = this.getNodeFromSegment(segment);
239
+ if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
240
+ __privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
241
+ __privateGet(this, _segmentNodeMap).delete(segment);
242
+ }
243
+ getNodeFromSegment(segment) {
244
+ if (segment && !(segment instanceof Segment))
245
+ throw new Error(`Invalid parameter: 'segment'. segment not an instance of Segment`);
246
+ return segment && __privateGet(this, _segmentNodeMap).get(segment) || null;
247
+ }
248
+ };
249
+ _head = new WeakMap();
250
+ _tail = new WeakMap();
251
+ _segmentNodeMap = new WeakMap();
252
+ _DLL_instances = new WeakSet();
253
+ detachNode_fn = function(node) {
254
+ if (node.prev) node.prev.next = node.next;
255
+ if (__privateGet(this, _head) === node) __privateSet(this, _head, node.next);
256
+ if (node.next) node.next.prev = node.prev;
257
+ if (__privateGet(this, _tail) === node) __privateSet(this, _tail, node.prev);
258
+ node.prev = null;
259
+ node.next = null;
260
+ };
261
+
262
+ // src/utils/hl7.ts
263
+ var _dll;
137
264
  var HL7 = class {
138
265
  constructor(hl7Msg, parseOptions) {
139
- this.head = null;
140
- this.tail = null;
266
+ __privateAdd(this, _dll);
141
267
  var _a, _b, _c, _d, _e, _f;
142
- this.raw = typeof hl7Msg === "string" ? hl7Msg : "";
268
+ this.raw = hl7Msg;
143
269
  this.parseOptions = {
144
270
  fieldDelim: (_a = parseOptions == null ? void 0 : parseOptions.fieldDelim) != null ? _a : "|",
145
271
  repeatingDelim: (_b = parseOptions == null ? void 0 : parseOptions.repeatingDelim) != null ? _b : "~",
146
272
  componentDelim: (_c = parseOptions == null ? void 0 : parseOptions.componentDelim) != null ? _c : "^",
147
273
  subCompDelim: (_d = parseOptions == null ? void 0 : parseOptions.subCompDelim) != null ? _d : "&",
148
274
  eolDelim: (_e = parseOptions == null ? void 0 : parseOptions.eolDelim) != null ? _e : "\r?\n|\r",
149
- buildEolChar: (_f = parseOptions == null ? void 0 : parseOptions.buildEolChar) != null ? _f : "\r\n"
275
+ buildEolChar: (_f = parseOptions == null ? void 0 : parseOptions.buildEolChar) != null ? _f : "\r"
150
276
  };
277
+ if (this.parseOptions.fieldDelim.length !== 1) throw new Error("Invalid field delimiter");
278
+ __privateSet(this, _dll, new DLL());
151
279
  this.transform();
152
280
  }
153
281
  /**
154
282
  * @deprecated This method is triggered internally and doesnt need to be invoked manually.
155
283
  */
156
284
  transform() {
157
- if (!this.raw.startsWith("MSH")) {
158
- throw new Error(
159
- "Expected raw msg to be HL7 message. Message does not start with MSH segment."
160
- );
285
+ if (typeof this.raw !== "string" || !this.raw.startsWith("MSH")) {
286
+ throw new Error("Invalid raw HL7 message. Expected msg to be a string starting with MSH");
161
287
  }
162
- const segmentsStr = this.raw.split(RegExp(this.parseOptions.eolDelim)).filter((segmentStr) => /^[A-Z\d]{3}\|/.test(segmentStr));
288
+ if (!["\r?\n|\r", "\r\n", "\n", "\r"].includes(this.parseOptions.eolDelim)) {
289
+ throw new Error("Invalid EOL character. Expected \\r?\\n|\\r, \\r\\n, \\n, \\r");
290
+ }
291
+ __privateSet(this, _dll, new DLL());
292
+ const segmentsStrArr = this.raw.split(RegExp(this.parseOptions.eolDelim)).filter((segmentStr) => Boolean(segmentStr) && this.validateSegment(segmentStr));
163
293
  const { fieldDelim, repeatingDelim, componentDelim, subCompDelim } = this.parseOptions;
164
- for (const segmentStr of segmentsStr) {
165
- const type = segmentStr.substring(0, 3);
166
- const segment = new Segment(type, null, this.parseOptions);
294
+ for (const segmentStr of segmentsStrArr) {
167
295
  const fields = segmentStr.split(fieldDelim);
296
+ const type = segmentStr.substring(0, 3);
297
+ const segment = new Segment(type, this.parseOptions);
298
+ let fieldIdx = type === "MSH" ? 1 : 0;
168
299
  segment.data = {};
169
- for (let i = 1; i < fields.length; i++) {
170
- const fieldIdx = type === "MSH" ? i + 1 : i;
171
- const repeatingComps = fields[i].split(repeatingDelim);
172
- segment.data[`${type}.${fieldIdx}`] = [];
173
- for (let j = 0; j < repeatingComps.length; j++) {
174
- const components = repeatingComps[j].split(componentDelim);
175
- segment.data[`${type}.${fieldIdx}`][j] = {};
176
- for (let k = 0; k < components.length; k++) {
177
- const subComps = components[k].split(subCompDelim);
178
- segment.data[`${type}.${fieldIdx}`][j][`${type}.${fieldIdx}.${k + 1}`] = [];
179
- for (let l = 0; l < subComps.length; l++) {
180
- segment.data[`${type}.${fieldIdx}`][j][`${type}.${fieldIdx}.${k + 1}`][l] = subComps[l];
181
- }
300
+ for (const field of fields) {
301
+ segment.data[fieldIdx] = segment.data[fieldIdx] || [];
302
+ let repeatFieldIdx = 0;
303
+ for (const repeatField of field.split(repeatingDelim)) {
304
+ let compIdx = 1;
305
+ segment.data[fieldIdx][repeatFieldIdx] = segment.data[fieldIdx][repeatFieldIdx] || {};
306
+ for (const comp of repeatField.split(componentDelim)) {
307
+ segment.data[fieldIdx][repeatFieldIdx][compIdx++] = comp.split(subCompDelim);
182
308
  }
309
+ repeatFieldIdx++;
183
310
  }
311
+ fieldIdx++;
184
312
  }
185
- if (type === "MSH") {
186
- segment.data["MSH.2"] = [
187
- { "MSH.2.1": [`${componentDelim}${repeatingDelim}\\${subCompDelim}`] }
188
- ];
313
+ if (type === "MSH" && fields[1]) {
314
+ segment.data[2] = [{ 1: [fields[1]] }];
189
315
  }
190
- this.appendSegmentNode(segment);
316
+ __privateGet(this, _dll).appendNewSegment(segment);
191
317
  }
192
318
  }
193
319
  build() {
194
320
  var _a;
195
- const segments = this.getSegments();
196
321
  const { fieldDelim, repeatingDelim, componentDelim, subCompDelim, buildEolChar } = this.parseOptions;
197
- const segmentsStrArr = [];
322
+ const segments = this.getSegments();
323
+ const segmentsStr = [];
198
324
  for (const segment of segments) {
199
- const fieldsArr = [segment.type];
325
+ const fieldsStrArr = [];
200
326
  for (const fieldKey in segment.data) {
201
- const repeatingCompsArr = [];
202
- for (const component of segment.data[fieldKey]) {
203
- const compsArr = [];
204
- for (const subCompsKey in component) {
205
- compsArr.push((_a = component[subCompsKey]) == null ? void 0 : _a.join(subCompDelim));
327
+ const repeatsStrArr = [];
328
+ for (const repeatingField of segment.data[fieldKey]) {
329
+ const compsStrArr = [];
330
+ for (const compKey in repeatingField) {
331
+ compsStrArr.push((_a = repeatingField[compKey]) == null ? void 0 : _a.join(subCompDelim));
206
332
  }
207
- repeatingCompsArr.push(compsArr.join(componentDelim));
333
+ repeatsStrArr.push(compsStrArr.join(componentDelim));
208
334
  }
209
- fieldsArr.push(repeatingCompsArr.join(repeatingDelim));
335
+ fieldsStrArr.push(repeatsStrArr.join(repeatingDelim));
210
336
  }
211
- segmentsStrArr.push(fieldsArr.join(fieldDelim));
337
+ segmentsStr.push(fieldsStrArr.join(fieldDelim));
212
338
  }
213
- return segmentsStrArr.join(buildEolChar);
339
+ return segmentsStr.join(buildEolChar);
214
340
  }
215
341
  getSegment(type) {
216
342
  if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
217
- let curr = this.head;
218
- while (curr) {
219
- if (curr.data.type === type) return curr.data;
220
- curr = curr.next;
221
- }
222
- return curr;
343
+ return __privateGet(this, _dll).getSegment(type);
223
344
  }
224
345
  getSegments(type) {
225
346
  if (type && !/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
226
- const segments = [];
227
- let curr = this.head;
228
- while (curr) {
229
- if (type) {
230
- if (type === curr.data.type) segments.push(curr.data);
231
- } else {
232
- segments.push(curr.data);
233
- }
234
- curr = curr.next;
235
- }
236
- return segments;
347
+ return __privateGet(this, _dll).getSegments(type);
237
348
  }
238
349
  getSegmentsAfter(startSegment, type, stopSegmentType = [], consecutive = false) {
350
+ if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
239
351
  if (!startSegment || !(startSegment instanceof Segment))
240
352
  throw new Error(`Invalid parameter: 'startSegment'`);
241
- if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
242
353
  if (!stopSegmentType || !Array.isArray(stopSegmentType))
243
354
  throw new Error(`Invalid parameter: 'stopSegmentType'`);
244
355
  if (typeof consecutive !== "boolean")
245
356
  throw new Error(`Invalid parameter: 'consecutive' [${consecutive}]`);
246
- const startNode = this.getNode(startSegment);
247
- if (!startNode) throw new Error(`Failed to locate: 'startSegment' [${startSegment.type}]`);
248
- const res = [];
249
- let curr = startNode.next;
250
- while (curr) {
251
- if (stopSegmentType.length && stopSegmentType.includes(curr.data.type)) break;
252
- if (curr.data.type === type) res.push(curr.data);
253
- else if (consecutive && res.length) break;
254
- curr = curr.next;
255
- }
256
- return res;
357
+ if (!__privateGet(this, _dll).getNodeFromSegment(startSegment))
358
+ throw new Error(`Failed to locate: 'startSegment' [${startSegment.type}]`);
359
+ return __privateGet(this, _dll).getSegmentsAfter(type, startSegment, stopSegmentType, consecutive);
257
360
  }
258
361
  createSegment(type) {
259
362
  if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
260
- return this.appendSegmentNode(new Segment(type, null, this.parseOptions));
363
+ return __privateGet(this, _dll).appendNewSegment(new Segment(type, this.parseOptions));
261
364
  }
262
365
  createSegmentAfter(type, targetSegment) {
263
366
  if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
264
367
  if (!targetSegment || !(targetSegment instanceof Segment))
265
368
  throw new Error(`Invalid parameter: 'targetSegment'`);
266
- return this.appendSegmentNode(new Segment(type, null, this.parseOptions), targetSegment);
369
+ if (!__privateGet(this, _dll).getNodeFromSegment(targetSegment))
370
+ throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
371
+ return __privateGet(this, _dll).appendNewSegment(new Segment(type, this.parseOptions), targetSegment);
267
372
  }
268
373
  createSegmentBefore(type, targetSegment) {
269
374
  if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
270
375
  if (!targetSegment || !(targetSegment instanceof Segment))
271
376
  throw new Error(`Invalid parameter: 'targetSegment'`);
272
- return this.prependSegmentNode(new Segment(type, null, this.parseOptions), targetSegment);
377
+ if (!__privateGet(this, _dll).getNodeFromSegment(targetSegment))
378
+ throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
379
+ return __privateGet(this, _dll).prependNewSegment(new Segment(type, this.parseOptions), targetSegment);
273
380
  }
274
381
  deleteSegment(segment) {
275
- if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
276
382
  this.deleteSegments([segment]);
277
383
  }
278
384
  deleteSegments(segments) {
279
- var _a, _b;
280
385
  for (const segment of segments) {
281
386
  if (!segment || !(segment instanceof Segment))
282
387
  throw new Error(`Invalid parameter: 'segments'`);
283
- }
284
- for (const segment of segments) {
285
- const node = this.getNode(segment);
286
- if (!node) break;
287
- if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
288
- if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
289
- if (this.head === node) this.head = this.head.next;
290
- if (this.tail === node) this.tail = this.tail.prev;
291
- node.next = null;
292
- node.prev = null;
388
+ if (!__privateGet(this, _dll).getNodeFromSegment(segment))
389
+ throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
390
+ __privateGet(this, _dll).deleteSegment(segment);
293
391
  }
294
392
  }
295
393
  moveSegmentAfter(segment, targetSegment) {
296
- var _a, _b, _c;
297
394
  if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
298
395
  if (!targetSegment || !(targetSegment instanceof Segment))
299
396
  throw new Error(`Invalid parameter: 'targetSegment'`);
300
- if (segment === targetSegment) return;
301
- const node = this.getNode(segment);
397
+ const node = __privateGet(this, _dll).getNodeFromSegment(segment);
398
+ const targetNode = __privateGet(this, _dll).getNodeFromSegment(targetSegment);
302
399
  if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
303
- const targetNode = this.getNode(targetSegment);
304
400
  if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
305
- if (node === this.head) this.head = this.head.next;
306
- if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
307
- if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
308
- node.next = targetNode.next;
309
- node.prev = targetNode;
310
- targetNode.next = node;
311
- if ((_c = node.next) == null ? void 0 : _c.prev) node.next.prev = node;
312
- if (targetNode === this.tail) this.tail = this.tail.next;
401
+ __privateGet(this, _dll).moveNodeAfter(node, targetNode);
313
402
  }
314
403
  moveSegmentBefore(segment, targetSegment) {
315
- var _a, _b, _c;
316
404
  if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
317
405
  if (!targetSegment || !(targetSegment instanceof Segment))
318
406
  throw new Error(`Invalid parameter: 'targetSegment'`);
319
- if (segment === targetSegment) return;
320
- const node = this.getNode(segment);
407
+ const node = __privateGet(this, _dll).getNodeFromSegment(segment);
408
+ const targetNode = __privateGet(this, _dll).getNodeFromSegment(targetSegment);
321
409
  if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
322
- const targetNode = this.getNode(targetSegment);
323
410
  if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
324
- if (node === this.tail) this.tail = this.tail.prev;
325
- if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
326
- if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
327
- node.next = targetNode;
328
- node.prev = targetNode.prev;
329
- targetNode.prev = node;
330
- if ((_c = node.prev) == null ? void 0 : _c.next) node.prev.next = node;
331
- if (targetNode === this.head) this.head = this.head.prev;
411
+ __privateGet(this, _dll).moveNodeBefore(node, targetNode);
332
412
  }
333
- reindexSegments(resetRules, startIndex = 1, field = "1.1") {
334
- if (!resetRules || typeof resetRules !== "object")
335
- throw new Error(`Invalid parameter: 'resetRules'`);
413
+ reindexSegments(reindexConfig, startIndex = 1, field = "1.1") {
414
+ var _a;
415
+ if (!reindexConfig || typeof reindexConfig !== "object" || Object.values(reindexConfig).some((val) => !Array.isArray(val)))
416
+ throw new Error(`Invalid parameter: 'reindexConfig'`);
336
417
  if (!startIndex || typeof startIndex !== "number")
337
418
  throw new Error(`Invalid parameter: 'startIndex' [${startIndex}]`);
338
419
  if (field && !/^(\d+)(\.\d+){0,1}$/.test(field))
339
420
  throw new Error(`Invalid parameter: 'field' [${field}]`);
340
- let curr = this.head;
421
+ const segments = this.getSegments();
341
422
  const indexMap = {};
342
- for (const key of Object.keys(resetRules)) {
343
- if (!Array.isArray(resetRules[key]))
344
- throw new Error(
345
- `Invalid parameter: 'resetRules'. Expected key [${key}] value to be an array.`
346
- );
347
- indexMap[key] = startIndex;
423
+ const indexResetTriggerMap = {};
424
+ for (const [seg, resetTriggerSegs] of Object.entries(reindexConfig)) {
425
+ indexMap[seg] = startIndex;
426
+ if (resetTriggerSegs)
427
+ for (const key of resetTriggerSegs) ((_a = indexResetTriggerMap[key]) != null ? _a : indexResetTriggerMap[key] = []).push(seg);
348
428
  }
349
- while (curr) {
350
- const segment = curr.data;
351
- if (segment.type in resetRules)
429
+ for (const segment of segments) {
430
+ if (reindexConfig[segment.type]) {
352
431
  segment.set(`${segment.type}.${field}`, String(indexMap[segment.type]++));
353
- for (const [segmentType, resetTriggers] of Object.entries(resetRules)) {
354
- for (const resetTrigger of resetTriggers) {
355
- if (segment.type === resetTrigger) {
356
- indexMap[segmentType] = startIndex;
357
- break;
358
- }
359
- }
432
+ if (indexResetTriggerMap[segment.type])
433
+ for (const seg of indexResetTriggerMap[segment.type]) indexMap[seg] = startIndex;
360
434
  }
361
- curr = curr.next;
362
435
  }
363
436
  }
364
- getNode(segment) {
365
- if (!segment || !(segment instanceof Segment)) {
366
- throw new Error(`Invalid parameter: 'segment'`);
367
- }
368
- let curr = this.head;
369
- while (curr) {
370
- if (curr.data === segment) return curr;
371
- curr = curr.next;
372
- }
373
- return curr;
374
- }
375
- appendSegmentNode(newSegment, targetSegment) {
376
- var _a;
377
- if (!newSegment || !(newSegment instanceof Segment))
378
- throw new Error(`Invalid parameter: 'newSegment'`);
379
- if (targetSegment && !(targetSegment instanceof Segment))
380
- throw new Error(`Invalid parameter: 'targetSegment'`);
381
- const newNode = new Node(newSegment);
382
- if (targetSegment) {
383
- const targetNode = this.getNode(targetSegment);
384
- if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
385
- newNode.next = targetNode.next;
386
- newNode.prev = targetNode;
387
- targetNode.next = newNode;
388
- if ((_a = newNode.next) == null ? void 0 : _a.prev) newNode.next.prev = newNode;
389
- if (targetNode === this.tail) this.tail = this.tail.next;
390
- } else if (!this.head) {
391
- this.head = newNode;
392
- this.tail = newNode;
393
- } else if (this.tail) {
394
- newNode.prev = this.tail;
395
- this.tail.next = newNode;
396
- this.tail = this.tail.next;
397
- } else {
398
- throw new Error(`Failed to append segment: ${newSegment.type}`);
399
- }
400
- return newSegment;
401
- }
402
- prependSegmentNode(newSegment, targetSegment) {
403
- var _a;
404
- if (!newSegment || !(newSegment instanceof Segment))
405
- throw new Error(`Invalid parameter: 'newSegment'`);
406
- if (!targetSegment || !(targetSegment instanceof Segment))
407
- throw new Error(`Invalid parameter: 'targetSegment'`);
408
- const targetNode = this.getNode(targetSegment);
409
- if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
410
- const newNode = new Node(newSegment);
411
- newNode.next = targetNode;
412
- newNode.prev = targetNode.prev;
413
- targetNode.prev = newNode;
414
- if ((_a = newNode.prev) == null ? void 0 : _a.next) newNode.prev.next = newNode;
415
- if (targetNode === this.head) this.head = this.head.prev;
416
- return newSegment;
437
+ validateSegment(segment) {
438
+ return new RegExp(`^[A-Zd]{3}${this.parseOptions.fieldDelim}`).test(segment);
417
439
  }
418
440
  };
419
- var index_default = HL7;
420
- //# sourceMappingURL=index.cjs.map
441
+ _dll = new WeakMap();
442
+
443
+ exports.HL7 = HL7;
444
+ //# sourceMappingURL=index.cjs.map
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9zZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL2RsbC50cyIsIi4uL3NyYy91dGlscy9obDcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxTQUFBLEVBQUEsa0JBQUEsRUFBQSxXQUFBO0FBRU8sSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUtuQixXQUFBLENBQ1csTUFDVCxZQUFBLEVBQ0E7QUFGUyxJQUFBLElBQUEsQ0FBQSxJQUFBLEdBQUEsSUFBQTtBQU5OLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxrQkFBQSxDQUFBO0FBQ0wsSUFBQSxJQUFBLENBQUEsSUFBQSxHQUFxQixFQUFDO0FBRXRCLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxTQUFBLENBQUE7QUFMRixJQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQTtBQVdJLElBQUEsSUFBSSxDQUFDLElBQUEsSUFBUSxDQUFDLDBCQUFBLENBQTJCLEtBQUssSUFBSSxDQUFBO0FBQ2hELE1BQUEsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLDJCQUFBLEVBQThCLElBQUksQ0FBQSxDQUFBLENBQUcsQ0FBQTtBQUN2RCxJQUFBLElBQUEsQ0FBSyxJQUFBLENBQUssSUFBQSxLQUFTLEtBQUEsR0FBUSxHQUFBLEdBQU0sR0FBRyxDQUFBLEdBQUksQ0FBQyxFQUFFLENBQUEsRUFBRyxDQUFDLElBQUksQ0FBQSxFQUFHLENBQUE7QUFDdEQsSUFBQSxJQUFBLENBQUssWUFBQSxHQUFlO0FBQUEsTUFDbEIsVUFBQSxFQUFBLENBQVksRUFBQSxHQUFBLFlBQUEsSUFBQSxJQUFBLEdBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBYyxVQUFBLEtBQWQsSUFBQSxHQUFBLEVBQUEsR0FBNEIsR0FBQTtBQUFBLE1BQ3hDLGNBQUEsRUFBQSxDQUFnQixFQUFBLEdBQUEsWUFBQSxJQUFBLElBQUEsR0FBQSxNQUFBLEdBQUEsWUFBQSxDQUFj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QWMsT0FBQSxDQUFRLElBQUksQ0FBQSxFQUFHO0FBQy9CLFFBQUEsT0FBQSxDQUFRLEdBQUEsQ0FBSSxDQUFBLEVBQUcsT0FBQSxDQUFRLElBQUksQ0FBQSxDQUFBLEVBQUksS0FBSyxDQUFBLENBQUEsRUFBSSxNQUFBLENBQU8sUUFBQSxDQUFTLE9BQUEsQ0FBUSxJQUFJLENBQUEsRUFBRyxDQUFDLENBQUE7QUFFeEUsUUFBQSxJQUFJLG9CQUFBLENBQXFCLFFBQVEsSUFBSSxDQUFBO0FBQ25DLFVBQUEsS0FBQSxNQUFXLE9BQU8sb0JBQUEsQ0FBcUIsT0FBQSxDQUFRLElBQUksQ0FBQSxFQUFJLFFBQUEsQ0FBUyxHQUFHLENBQUEsR0FBSSxVQUFBO0FBQUEsTUFDM0U7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsZ0JBQWdCLE9BQUEsRUFBaUI7QUFDdkMsSUFBQSxPQUFPLElBQUksT0FBTyxDQUFBLFVBQUEsRUFBYyxJQUFBLENBQUssYUFBYSxVQUFVLENBQUEsQ0FBRSxDQUFBLENBQUUsSUFBQSxDQUFLLE9BQU8sQ0FBQTtBQUFBLEVBQzlFO0FBQ0Y7QUFuUEUsSUFBQSxHQUFBLElBQUEsT0FBQSxFQUFBIiwiZmlsZSI6ImluZGV4LmNqcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJldHRpZnksIFNlZ21lbnRUeXBlLCBUUGFyc2VPcHRpb25zLCBUU2VnbWVudERhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFNlZ21lbnQge1xuICBkYXRhOiBUU2VnbWVudERhdGEgPSB7fTtcbiAgcHJpdmF0ZSBwYXJzZU9wdGlvbnM6IFByZXR0aWZ5PE9taXQ8VFBhcnNlT3B0aW9ucywgJ2VvbERlbGltJyB8ICdidWlsZEVvbENoYXInPj47XG4gICNwYXJzZU1hcDogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0eXBlOiBTZWdtZW50VHlwZSxcbiAgICBwYXJzZU9wdGlvbnM/OiBQcmV0dGlmeTxPbWl0PFRQYXJzZU9wdGlvbnMsICdlb2xEZWxpbScgfCAnYnVpbGRFb2xDaGFyJz4+LFxuICApIHtcbiAgICBpZiAoIXR5cGUgfHwgIS9eW0EtWlxcZF17M30oXFwuXFxkKyl7MCwyfSQvLnRlc3QodHlwZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG4gICAgdGhpcy5kYXRhW3R5cGUgPT09ICdNU0gnID8gJzEnIDogJzAnXSA9IFt7IDE6IFt0eXBlXSB9XTtcbiAgICB0aGlzLnBhcnNlT3B0aW9ucyA9IHtcbiAgICAgIGZpZWxkRGVsaW06IHBhcnNlT3B0aW9ucz8uZmllbGREZWxpbSA/PyAnfCcsXG4gICAgICByZXBlYXRpbmdEZWxpbTogcGFyc2VPcHRpb25zPy5yZXBlYXRpbmdEZWxpbSA/PyAnficsXG4gICAgICBjb21wb25lbnREZWxpbTogcGFyc2VPcHRpb25zPy5jb21wb25lbnREZWxpbSA/PyAnXicsXG4gICAgICBzdWJDb21wRGVsaW06IHBhcnNlT3B0aW9ucz8uc3ViQ29tcERlbGltID8/ICcmJyxcbiAgICB9O1xuICAgIHRoaXMuI3BhcnNlTWFwID0ge1xuICAgICAgMDogdGhpcy5wYXJzZU9wdGlvbnMuZmllbGREZWxpbSxcbiAgICAgIDE6IHRoaXMucGFyc2VPcHRpb25zLnJlcGVhdGluZ0RlbGltLFxuICAgICAgMjogdGhpcy5wYXJzZU9wdGlvbnMuY29tcG9uZW50RGVsaW0sXG4gICAgICAzOiB0aGlzLnBhcnNlT3B0aW9ucy5zdWJDb21wRGVsaW0sXG4gICAgfTtcbiAgfVxuXG4gIGdldChmaWVsZDogc3RyaW5nLCByZXBlYXRpbmdJbmRleDogbnVtYmVyIHwgdHJ1ZSA9IDAsIHN1YkNvbXBvbmVudEluZGV4OiBudW1iZXIgfCB0cnVlID0gMCkge1xuICAgIGNvbnN0IHZhbGlkYXRlID0gKHZhbDogbnVtYmVyIHwgdHJ1ZSkgPT5cbiAgICAgICEoKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+PSAwKSB8fCB2YWwgPT09IHRydWUpO1xuXG4gICAgaWYgKCFmaWVsZCB8fCAhL15bQS1aXFxkXXszfSQvLnRlc3QoZmllbGQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ2ZpZWxkJyBbJHtmaWVsZH1dYCk7XG4gICAgaWYgKHZhbGlkYXRlKHJlcGVhdGluZ0luZGV4KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdyZXBlYXRpbmdJbmRleCcgWyR7cmVwZWF0aW5nSW5kZXh9XWApO1xuICAgIGlmICh2YWxpZGF0ZShzdWJDb21wb25lbnRJbmRleCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnc3ViQ29tcG9uZW50SW5kZXgnIFske3N1YkNvbXBvbmVudEluZGV4fV1gKTtcblxuICAgIGNvbnN0IFt0eXBlLCBmaWVsZElkeCwgY29tcElkeF0gPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHBhdGggPSBbZmllbGRJZHgsIHJlcGVhdGluZ0luZGV4LCBjb21wSWR4LCBzdWJDb21wb25lbnRJbmRleF0gYXMgY29uc3Q7XG5cbiAgICBpZiAoIXR5cGUgfHwgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcuIENhbm5vdCBnZXQgWyR7ZmllbGR9XSBmcm9tIFske3RoaXMudHlwZX1dIHNlZ21lbnQuYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy4jdHJhdmVyc2UodGhpcy5kYXRhLCBwYXRoKTtcbiAgfVxuXG4gIHNldChcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgcmVwZWF0aW5nSW5kZXg6IG51bWJlciB8IHRydWUgPSAwLFxuICAgIHN1YkNvbXBvbmVudEluZGV4OiBudW1iZXIgfCB0cnVlID0gMCxcbiAgKSB7XG4gICAgY29uc3QgdmFsaWRhdGUgPSAodmFsOiBudW1iZXIgfCB0cnVlKSA9PlxuICAgICAgISgodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgdmFsID49IDApIHx8IHZhbCA9PT0gdHJ1ZSk7XG5cbiAgICBpZiAoIWZpZWxkIHx8ICEvXltBLVpcXGRdezN9KFxcLlxcZCspezEsMn0kLy50ZXN0KGZpZWxkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XWApO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndmFsdWUnIFske3ZhbHVlfV1gKTtcbiAgICBpZiAodmFsaWRhdGUocmVwZWF0aW5nSW5kZXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3JlcGVhdGluZ0luZGV4JyBbJHtyZXBlYXRpbmdJbmRleH1dYCk7XG4gICAgaWYgKHZhbGlkYXRlKHN1YkNvbXBvbmVudEluZGV4KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdWJDb21wb25lbnRJbmRleCcgWyR7c3ViQ29tcG9uZW50SW5kZXh9XWApO1xuXG4gICAgY29uc3QgW3R5cGUsIGZpZWxkSWR4LCBjb21wSWR4XSA9IGZpZWxkLnNwbGl0KCcuJyk7XG5cbiAgICBpZiAoIXR5cGUgfHwgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XS4gQ2Fubm90IHNldCBbJHtmaWVsZH1dIGZyb20gWyR7dGhpcy50eXBlfV0gc2VnbWVudC5gLFxuICAgICAgKTtcbiAgICBpZiAoIWZpZWxkSWR4IHx8ICFOdW1iZXIoZmllbGRJZHgpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnZmllbGQnIFske2ZpZWxkfV1gKTtcblxuICAgIGZvciAobGV0IGkgPSB0eXBlID09PSAnTVNIJyA/IDIgOiAxOyBpIDw9IE51bWJlcihmaWVsZElkeCk7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmRhdGE/LltpXT8uWzBdPy5bMV0/LlswXSA9PSBudWxsKSB0aGlzLmRhdGFbaV0gPSBbeyAxOiBbJyddIH1dO1xuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdGluZ0luZGV4KSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gTnVtYmVyKHJlcGVhdGluZ0luZGV4KTsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5baV0/LlsxXT8uWzBdID09IG51bGwpIHRoaXMuZGF0YVtmaWVsZElkeF0hW2ldID0geyAxOiBbJyddIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wSWR4ICYmIE51bWJlcihjb21wSWR4KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIoY29tcElkeCk7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bcmVwZWF0aW5nSW5kZXggYXMgbnVtYmVyXT8uW2ldPy5bMF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hW3JlcGVhdGluZ0luZGV4IGFzIG51bWJlcl0hW2ldID0gWycnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHN1YkNvbXBvbmVudEluZGV4KSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE51bWJlcihzdWJDb21wb25lbnRJbmRleCk7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtmaWVsZElkeF0/LltyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdPy5bY29tcElkeF0/LltpXSA9PSBudWxsKVxuICAgICAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVtyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdIVtjb21wSWR4XSFbaV0gPSAnJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVtyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdIVtjb21wSWR4XSFbc3ViQ29tcG9uZW50SW5kZXggYXMgbnVtYmVyXSA9XG4gICAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJDb21wb25lbnRJbmRleCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hW3JlcGVhdGluZ0luZGV4IGFzIG51bWJlcl0hW2NvbXBJZHhdID0gW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhW2ZpZWxkSWR4XSFbcmVwZWF0aW5nSW5kZXggYXMgbnVtYmVyXSA9IHsgMTogW3ZhbHVlXSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVwZWF0aW5nSW5kZXggPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5kYXRhW2ZpZWxkSWR4XSA9IFt7IDE6IFsnJ10gfV07XG5cbiAgICAgIGlmIChjb21wSWR4ICYmIE51bWJlcihjb21wSWR4KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIoY29tcElkeCk7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bMF0/LltpXT8uWzBdID09IG51bGwpIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtpXSA9IFsnJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihzdWJDb21wb25lbnRJbmRleCkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBOdW1iZXIoc3ViQ29tcG9uZW50SW5kZXgpOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bMF0/Lltjb21wSWR4XT8uW2ldID09IG51bGwpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtjb21wSWR4XSFbaV0gPSAnJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVswXSFbY29tcElkeF0hW3N1YkNvbXBvbmVudEluZGV4IGFzIG51bWJlcl0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJDb21wb25lbnRJbmRleCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtjb21wSWR4XSA9IFt2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0gPSBbeyAxOiBbdmFsdWVdIH1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICN0cmF2ZXJzZShcbiAgICBkYXRhOiBhbnksXG4gICAgcGF0aDogcmVhZG9ubHkgW3N0cmluZyB8IHVuZGVmaW5lZCwgbnVtYmVyIHwgdHJ1ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBudW1iZXIgfCB0cnVlXSxcbiAgICBkZXB0aCA9IDAsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBwYXRoW2RlcHRoXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRydWUgfHwgaW5kZXggPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkZWxpbSA9IHRoaXMuI3BhcnNlTWFwW2RlcHRoKytdO1xuICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuI3RyYXZlcnNlKGl0ZW0sIHBhdGgsIGRlcHRoKSkuam9pbihkZWxpbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhdmVyc2UoZGF0YVtOdW1iZXIoaW5kZXgpXSwgcGF0aCwgKytkZXB0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdHJ1ZSB8fCBpbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRlbGltID0gdGhpcy4jcGFyc2VNYXBbZGVwdGgrK107XG5cbiAgICAgICAgY29uc3QgdmFsID0gT2JqZWN0LmtleXMoZGF0YSkubWFwKChrZXkpID0+IHRoaXMuI3RyYXZlcnNlKGRhdGFba2V5XSwgcGF0aCwgZGVwdGgpKTtcblxuICAgICAgICByZXR1cm4gdmFsLmpvaW4oZGVsaW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYXZlcnNlKGRhdGFbTnVtYmVyKGluZGV4KV0sIHBhdGgsICsrZGVwdGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNlZ21lbnQgfSBmcm9tICcuL3NlZ21lbnQnO1xuaW1wb3J0IHR5cGUgeyBTZWdtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5jbGFzcyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IFNlZ21lbnQsXG4gICAgcHVibGljIG5leHQ6IE5vZGUgfCBudWxsID0gbnVsbCxcbiAgICBwdWJsaWMgcHJldjogTm9kZSB8IG51bGwgPSBudWxsLFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBETEwge1xuICAjaGVhZDogTm9kZSB8IG51bGwgPSBudWxsO1xuICAjdGFpbDogTm9kZSB8IG51bGwgPSBudWxsO1xuICAjc2VnbWVudE5vZGVNYXAgPSBuZXcgV2Vha01hcDxTZWdtZW50LCBOb2RlPigpO1xuXG4gIGdldFNlZ21lbnQodHlwZTogU2VnbWVudFR5cGUpIHtcbiAgICBsZXQgY3VyciA9IHRoaXMuI2hlYWQ7XG5cbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgaWYgKGN1cnIuZGF0YS50eXBlID09PSB0eXBlKSByZXR1cm4gY3Vyci5kYXRhO1xuXG4gICAgICBjdXJyID0gY3Vyci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyIHx8IG51bGw7XG4gIH1cblxuICBnZXRTZWdtZW50cyh0eXBlPzogU2VnbWVudFR5cGUpIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IFtdO1xuICAgIGxldCBjdXJyID0gdGhpcy4jaGVhZDtcblxuICAgIHdoaWxlIChjdXJyKSB7XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gY3Vyci5kYXRhLnR5cGUpIHNlZ21lbnRzLnB1c2goY3Vyci5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goY3Vyci5kYXRhKTtcbiAgICAgIH1cblxuICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICBnZXRTZWdtZW50c0FmdGVyKFxuICAgIHR5cGU6IFNlZ21lbnRUeXBlLFxuICAgIHN0YXJ0U2VnbWVudDogU2VnbWVudCxcbiAgICBzdG9wU2VnbWVudFR5cGU6IFNlZ21lbnRUeXBlW10gPSBbXSxcbiAgICBjb25zZWN1dGl2ZSA9IGZhbHNlLFxuICApIHtcbiAgICBjb25zdCBzdGFydE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tU2VnbWVudChzdGFydFNlZ21lbnQpO1xuXG4gICAgaWYgKCFzdGFydE5vZGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3N0YXJ0U2VnbWVudCcgWyR7c3RhcnRTZWdtZW50LnR5cGV9XWApO1xuXG4gICAgY29uc3QgcmVzID0gW107XG4gICAgbGV0IGN1cnIgPSBzdGFydE5vZGUubmV4dDtcblxuICAgIHdoaWxlIChjdXJyKSB7XG4gICAgICBpZiAoc3RvcFNlZ21lbnRUeXBlLmxlbmd0aCAmJiBzdG9wU2VnbWVudFR5cGUuaW5jbHVkZXMoY3Vyci5kYXRhLnR5cGUpKSBicmVhaztcblxuICAgICAgaWYgKGN1cnIuZGF0YS50eXBlID09PSB0eXBlKSByZXMucHVzaChjdXJyLmRhdGEpO1xuICAgICAgZWxzZSBpZiAoY29uc2VjdXRpdmUgJiYgcmVzLmxlbmd0aCkgYnJlYWs7XG5cbiAgICAgIGN1cnIgPSBjdXJyLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFwcGVuZE5ld1NlZ21lbnQobmV3U2VnbWVudDogU2VnbWVudCwgdGFyZ2V0U2VnbWVudD86IFNlZ21lbnQpIHtcbiAgICBjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUobmV3U2VnbWVudCk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuc2V0KG5ld1NlZ21lbnQsIG5ld05vZGUpO1xuXG4gICAgdGhpcy5tb3ZlTm9kZUFmdGVyKG5ld05vZGUsIHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpIHx8IHRoaXMuI3RhaWwpO1xuXG4gICAgcmV0dXJuIG5ld1NlZ21lbnQ7XG4gIH1cblxuICBtb3ZlTm9kZUFmdGVyKG5vZGU6IE5vZGUsIHRhcmdldE5vZGU6IE5vZGUgfCBudWxsKSB7XG4gICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2NhdGUgbm9kZScpO1xuXG4gICAgaWYgKCF0aGlzLiNoZWFkKSB7XG4gICAgICB0aGlzLiNoZWFkID0gdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgICBub2RlLnByZXYgPSBudWxsO1xuICAgICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldE5vZGUpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvY2F0ZSBub2RlIHRhcmdldE5vZGUnKTtcbiAgICBpZiAobm9kZSA9PT0gdGFyZ2V0Tm9kZSB8fCB0YXJnZXROb2RlLm5leHQgPT09IG5vZGUpIHJldHVybjtcblxuICAgIHRoaXMuI2RldGFjaE5vZGUobm9kZSk7XG5cbiAgICBub2RlLnByZXYgPSB0YXJnZXROb2RlO1xuICAgIG5vZGUubmV4dCA9IHRhcmdldE5vZGUubmV4dDtcblxuICAgIGlmICh0YXJnZXROb2RlLm5leHQpIHRhcmdldE5vZGUubmV4dC5wcmV2ID0gbm9kZTtcbiAgICBlbHNlIHRoaXMuI3RhaWwgPSBub2RlO1xuXG4gICAgdGFyZ2V0Tm9kZS5uZXh0ID0gbm9kZTtcbiAgfVxuXG4gIHByZXBlbmROZXdTZWdtZW50KG5ld1NlZ21lbnQ6IFNlZ21lbnQsIHRhcmdldFNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICBjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUobmV3U2VnbWVudCk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuc2V0KG5ld1NlZ21lbnQsIG5ld05vZGUpO1xuXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpO1xuXG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2NhdGUgdGFyZ2V0Tm9kZScpO1xuXG4gICAgdGhpcy5tb3ZlTm9kZUJlZm9yZShuZXdOb2RlLCB0YXJnZXROb2RlKTtcblxuICAgIHJldHVybiBuZXdTZWdtZW50O1xuICB9XG5cbiAgbW92ZU5vZGVCZWZvcmUobm9kZTogTm9kZSwgdGFyZ2V0Tm9kZTogTm9kZSkge1xuICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9jYXRlIG5vZGUnKTtcblxuICAgIGlmICghdGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSBub2RlO1xuICAgICAgbm9kZS5wcmV2ID0gbnVsbDtcbiAgICAgIG5vZGUubmV4dCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2NhdGUgdGFyZ2V0Tm9kZScpO1xuICAgIGlmIChub2RlID09PSB0YXJnZXROb2RlIHx8IHRhcmdldE5vZGUucHJldiA9PT0gbm9kZSkgcmV0dXJuO1xuXG4gICAgdGhpcy4jZGV0YWNoTm9kZShub2RlKTtcblxuICAgIG5vZGUubmV4dCA9IHRhcmdldE5vZGU7XG4gICAgbm9kZS5wcmV2ID0gdGFyZ2V0Tm9kZS5wcmV2O1xuXG4gICAgaWYgKHRhcmdldE5vZGUucHJldikgdGFyZ2V0Tm9kZS5wcmV2Lm5leHQgPSBub2RlO1xuICAgIGVsc2UgdGhpcy4jaGVhZCA9IG5vZGU7XG5cbiAgICB0YXJnZXROb2RlLnByZXYgPSBub2RlO1xuICB9XG5cbiAgZGVsZXRlU2VnbWVudChzZWdtZW50OiBTZWdtZW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHNlZ21lbnQpO1xuICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAnc2VnbWVudCcgWyR7c2VnbWVudC50eXBlfV1gKTtcblxuICAgIHRoaXMuI2RldGFjaE5vZGUobm9kZSk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuZGVsZXRlKHNlZ21lbnQpO1xuICB9XG5cbiAgI2RldGFjaE5vZGUobm9kZTogTm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIGlmICh0aGlzLiNoZWFkID09PSBub2RlKSB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuXG4gICAgaWYgKG5vZGUubmV4dCkgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgaWYgKHRoaXMuI3RhaWwgPT09IG5vZGUpIHRoaXMuI3RhaWwgPSBub2RlLnByZXY7XG5cbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IG51bGw7XG4gIH1cblxuICBnZXROb2RlRnJvbVNlZ21lbnQoc2VnbWVudD86IFNlZ21lbnQpIHtcbiAgICBpZiAoc2VnbWVudCAmJiAhKHNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzZWdtZW50Jy4gc2VnbWVudCBub3QgYW4gaW5zdGFuY2Ugb2YgU2VnbWVudGApO1xuXG4gICAgcmV0dXJuIChzZWdtZW50ICYmIHRoaXMuI3NlZ21lbnROb2RlTWFwLmdldChzZWdtZW50KSkgfHwgbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRExMIH0gZnJvbSAnLi9kbGwnO1xuaW1wb3J0IHsgU2VnbWVudCB9IGZyb20gJy4vc2VnbWVudCc7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5LCBTZWdtZW50VHlwZSwgVFBhcnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSEw3IHtcbiAgcmF3OiBzdHJpbmc7XG4gIHBhcnNlT3B0aW9uczogVFBhcnNlT3B0aW9ucztcbiAgI2RsbDogRExMO1xuXG4gIGNvbnN0cnVjdG9yKGhsN01zZzogc3RyaW5nLCBwYXJzZU9wdGlvbnM/OiBQcmV0dGlmeTxQYXJ0aWFsPFRQYXJzZU9wdGlvbnM+Pikge1xuICAgIHRoaXMucmF3ID0gaGw3TXNnO1xuICAgIHRoaXMucGFyc2VPcHRpb25zID0ge1xuICAgICAgZmllbGREZWxpbTogcGFyc2VPcHRpb25zPy5maWVsZERlbGltID8/ICd8JyxcbiAgICAgIHJlcGVhdGluZ0RlbGltOiBwYXJzZU9wdGlvbnM/LnJlcGVhdGluZ0RlbGltID8/ICd+JyxcbiAgICAgIGNvbXBvbmVudERlbGltOiBwYXJzZU9wdGlvbnM/LmNvbXBvbmVudERlbGltID8/ICdeJyxcbiAgICAgIHN1YkNvbXBEZWxpbTogcGFyc2VPcHRpb25zPy5zdWJDb21wRGVsaW0gPz8gJyYnLFxuICAgICAgZW9sRGVsaW06IHBhcnNlT3B0aW9ucz8uZW9sRGVsaW0gPz8gJ1xccj9cXG58XFxyJyxcbiAgICAgIGJ1aWxkRW9sQ2hhcjogcGFyc2VPcHRpb25zPy5idWlsZEVvbENoYXIgPz8gJ1xccicsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnBhcnNlT3B0aW9ucy5maWVsZERlbGltLmxlbmd0aCAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpZWxkIGRlbGltaXRlcicpO1xuXG4gICAgdGhpcy4jZGxsID0gbmV3IERMTCgpO1xuICAgIHRoaXMudHJhbnNmb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgdHJpZ2dlcmVkIGludGVybmFsbHkgYW5kIGRvZXNudCBuZWVkIHRvIGJlIGludm9rZWQgbWFudWFsbHkuXG4gICAqL1xuICB0cmFuc2Zvcm0oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJhdyAhPT0gJ3N0cmluZycgfHwgIXRoaXMucmF3LnN0YXJ0c1dpdGgoJ01TSCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmF3IEhMNyBtZXNzYWdlLiBFeHBlY3RlZCBtc2cgdG8gYmUgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBNU0gnKTtcbiAgICB9XG5cbiAgICBpZiAoIVsnXFxyP1xcblxcfFxccicsICdcXHJcXG4nLCAnXFxuJywgJ1xcciddLmluY2x1ZGVzKHRoaXMucGFyc2VPcHRpb25zLmVvbERlbGltKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEVPTCBjaGFyYWN0ZXIuIEV4cGVjdGVkIFxcXFxyP1xcXFxuXFx8XFxcXHIsIFxcXFxyXFxcXG4sIFxcXFxuLCBcXFxccicpO1xuICAgIH1cblxuICAgIHRoaXMuI2RsbCA9IG5ldyBETEwoKTtcblxuICAgIGNvbnN0IHNlZ21lbnRzU3RyQXJyID0gdGhpcy5yYXdcbiAgICAgIC5zcGxpdChSZWdFeHAodGhpcy5wYXJzZU9wdGlvbnMuZW9sRGVsaW0pKVxuICAgICAgLmZpbHRlcigoc2VnbWVudFN0cikgPT4gQm9vbGVhbihzZWdtZW50U3RyKSAmJiB0aGlzLnZhbGlkYXRlU2VnbWVudChzZWdtZW50U3RyKSk7XG5cbiAgICBjb25zdCB7IGZpZWxkRGVsaW0sIHJlcGVhdGluZ0RlbGltLCBjb21wb25lbnREZWxpbSwgc3ViQ29tcERlbGltIH0gPSB0aGlzLnBhcnNlT3B0aW9ucztcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudFN0ciBvZiBzZWdtZW50c1N0ckFycikge1xuICAgICAgY29uc3QgZmllbGRzID0gc2VnbWVudFN0ci5zcGxpdChmaWVsZERlbGltKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBzZWdtZW50U3RyLnN1YnN0cmluZygwLCAzKSBhcyBTZWdtZW50VHlwZTtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgU2VnbWVudCh0eXBlLCB0aGlzLnBhcnNlT3B0aW9ucyk7XG4gICAgICBsZXQgZmllbGRJZHggPSB0eXBlID09PSAnTVNIJyA/IDEgOiAwO1xuICAgICAgc2VnbWVudC5kYXRhID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0gPSBzZWdtZW50LmRhdGFbZmllbGRJZHhdIHx8IFtdO1xuICAgICAgICBsZXQgcmVwZWF0RmllbGRJZHggPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVwZWF0RmllbGQgb2YgZmllbGQuc3BsaXQocmVwZWF0aW5nRGVsaW0pKSB7XG4gICAgICAgICAgbGV0IGNvbXBJZHggPSAxO1xuICAgICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSA9IHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSB8fCB7fTtcblxuICAgICAgICAgIGZvciAoY29uc3QgY29tcCBvZiByZXBlYXRGaWVsZC5zcGxpdChjb21wb25lbnREZWxpbSkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSFbY29tcElkeCsrXSA9IGNvbXAuc3BsaXQoc3ViQ29tcERlbGltKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXBlYXRGaWVsZElkeCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRJZHgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdNU0gnICYmIGZpZWxkc1sxXSkge1xuICAgICAgICBzZWdtZW50LmRhdGFbMl0gPSBbeyAxOiBbZmllbGRzWzFdXSB9XTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jZGxsLmFwcGVuZE5ld1NlZ21lbnQoc2VnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgY29uc3QgeyBmaWVsZERlbGltLCByZXBlYXRpbmdEZWxpbSwgY29tcG9uZW50RGVsaW0sIHN1YkNvbXBEZWxpbSwgYnVpbGRFb2xDaGFyIH0gPVxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnM7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLmdldFNlZ21lbnRzKCk7XG4gICAgY29uc3Qgc2VnbWVudHNTdHIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3QgZmllbGRzU3RyQXJyID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGRLZXkgaW4gc2VnbWVudC5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHJlcGVhdHNTdHJBcnIgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlcGVhdGluZ0ZpZWxkIG9mIHNlZ21lbnQuZGF0YVtmaWVsZEtleV0hKSB7XG4gICAgICAgICAgY29uc3QgY29tcHNTdHJBcnIgPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgY29tcEtleSBpbiByZXBlYXRpbmdGaWVsZCkge1xuICAgICAgICAgICAgY29tcHNTdHJBcnIucHVzaChyZXBlYXRpbmdGaWVsZFtjb21wS2V5XT8uam9pbihzdWJDb21wRGVsaW0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXBlYXRzU3RyQXJyLnB1c2goY29tcHNTdHJBcnIuam9pbihjb21wb25lbnREZWxpbSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRzU3RyQXJyLnB1c2gocmVwZWF0c1N0ckFyci5qb2luKHJlcGVhdGluZ0RlbGltKSk7XG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnRzU3RyLnB1c2goZmllbGRzU3RyQXJyLmpvaW4oZmllbGREZWxpbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWdtZW50c1N0ci5qb2luKGJ1aWxkRW9sQ2hhcik7XG4gIH1cblxuICBnZXRTZWdtZW50KHR5cGU6IFNlZ21lbnRUeXBlKTogU2VnbWVudCB8IG51bGwge1xuICAgIGlmICghL15bQS1aXFxkXXszfSQvLnRlc3QodHlwZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0eXBlJyBbJHt0eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuZ2V0U2VnbWVudCh0eXBlKTtcbiAgfVxuXG4gIGdldFNlZ21lbnRzKHR5cGU/OiBTZWdtZW50VHlwZSk6IFNlZ21lbnRbXSB7XG4gICAgaWYgKHR5cGUgJiYgIS9eW0EtWlxcZF17M30kLy50ZXN0KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG5cbiAgICByZXR1cm4gdGhpcy4jZGxsLmdldFNlZ21lbnRzKHR5cGUpO1xuICB9XG5cbiAgZ2V0U2VnbWVudHNBZnRlcihcbiAgICBzdGFydFNlZ21lbnQ6IFNlZ21lbnQsXG4gICAgdHlwZTogU2VnbWVudFR5cGUsXG4gICAgc3RvcFNlZ21lbnRUeXBlOiBTZWdtZW50VHlwZVtdID0gW10sXG4gICAgY29uc2VjdXRpdmUgPSBmYWxzZSxcbiAgKTogU2VnbWVudFtdIHtcbiAgICBpZiAoIS9eW0EtWlxcZF17M30kLy50ZXN0KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG4gICAgaWYgKCFzdGFydFNlZ21lbnQgfHwgIShzdGFydFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdGFydFNlZ21lbnQnYCk7XG4gICAgaWYgKCFzdG9wU2VnbWVudFR5cGUgfHwgIUFycmF5LmlzQXJyYXkoc3RvcFNlZ21lbnRUeXBlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdG9wU2VnbWVudFR5cGUnYCk7XG4gICAgaWYgKHR5cGVvZiBjb25zZWN1dGl2ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ2NvbnNlY3V0aXZlJyBbJHtjb25zZWN1dGl2ZX1dYCk7XG4gICAgaWYgKCF0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHN0YXJ0U2VnbWVudCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICdzdGFydFNlZ21lbnQnIFske3N0YXJ0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuZ2V0U2VnbWVudHNBZnRlcih0eXBlLCBzdGFydFNlZ21lbnQsIHN0b3BTZWdtZW50VHlwZSwgY29uc2VjdXRpdmUpO1xuICB9XG5cbiAgY3JlYXRlU2VnbWVudCh0eXBlOiBTZWdtZW50VHlwZSk6IFNlZ21lbnQge1xuICAgIGlmICghL15bQS1aXFxkXXszfSQvLnRlc3QodHlwZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0eXBlJyBbJHt0eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuYXBwZW5kTmV3U2VnbWVudChuZXcgU2VnbWVudCh0eXBlLCB0aGlzLnBhcnNlT3B0aW9ucykpO1xuICB9XG5cbiAgY3JlYXRlU2VnbWVudEFmdGVyKHR5cGU6IFNlZ21lbnRUeXBlLCB0YXJnZXRTZWdtZW50OiBTZWdtZW50KTogU2VnbWVudCB7XG4gICAgaWYgKCEvXltBLVpcXGRdezN9JC8udGVzdCh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3R5cGUnIFske3R5cGV9XWApO1xuICAgIGlmICghdGFyZ2V0U2VnbWVudCB8fCAhKHRhcmdldFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0YXJnZXRTZWdtZW50J2ApO1xuICAgIGlmICghdGhpcy4jZGxsLmdldE5vZGVGcm9tU2VnbWVudCh0YXJnZXRTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3RhcmdldFNlZ21lbnQnIFske3RhcmdldFNlZ21lbnQudHlwZX1dYCk7XG5cbiAgICByZXR1cm4gdGhpcy4jZGxsLmFwcGVuZE5ld1NlZ21lbnQobmV3IFNlZ21lbnQodHlwZSwgdGhpcy5wYXJzZU9wdGlvbnMpLCB0YXJnZXRTZWdtZW50KTtcbiAgfVxuXG4gIGNyZWF0ZVNlZ21lbnRCZWZvcmUodHlwZTogU2VnbWVudFR5cGUsIHRhcmdldFNlZ21lbnQ6IFNlZ21lbnQpOiBTZWdtZW50IHtcbiAgICBpZiAoIS9eW0EtWlxcZF17M30kLy50ZXN0KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG4gICAgaWYgKCF0YXJnZXRTZWdtZW50IHx8ICEodGFyZ2V0U2VnbWVudCBpbnN0YW5jZW9mIFNlZ21lbnQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3RhcmdldFNlZ21lbnQnYCk7XG4gICAgaWYgKCF0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAndGFyZ2V0U2VnbWVudCcgWyR7dGFyZ2V0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwucHJlcGVuZE5ld1NlZ21lbnQobmV3IFNlZ21lbnQodHlwZSwgdGhpcy5wYXJzZU9wdGlvbnMpLCB0YXJnZXRTZWdtZW50KTtcbiAgfVxuXG4gIGRlbGV0ZVNlZ21lbnQoc2VnbWVudDogU2VnbWVudCkge1xuICAgIHRoaXMuZGVsZXRlU2VnbWVudHMoW3NlZ21lbnRdKTtcbiAgfVxuXG4gIGRlbGV0ZVNlZ21lbnRzKHNlZ21lbnRzOiBTZWdtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGlmICghc2VnbWVudCB8fCAhKHNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3NlZ21lbnRzJ2ApO1xuICAgICAgaWYgKCF0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHNlZ21lbnQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICdzZWdtZW50JyBbJHtzZWdtZW50LnR5cGV9XWApO1xuXG4gICAgICB0aGlzLiNkbGwuZGVsZXRlU2VnbWVudChzZWdtZW50KTtcbiAgICB9XG4gIH1cblxuICBtb3ZlU2VnbWVudEFmdGVyKHNlZ21lbnQ6IFNlZ21lbnQsIHRhcmdldFNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICBpZiAoIXNlZ21lbnQgfHwgIShzZWdtZW50IGluc3RhbmNlb2YgU2VnbWVudCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzZWdtZW50J2ApO1xuICAgIGlmICghdGFyZ2V0U2VnbWVudCB8fCAhKHRhcmdldFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0YXJnZXRTZWdtZW50J2ApO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuI2RsbC5nZXROb2RlRnJvbVNlZ21lbnQoc2VnbWVudCk7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMuI2RsbC5nZXROb2RlRnJvbVNlZ21lbnQodGFyZ2V0U2VnbWVudCk7XG5cbiAgICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3NlZ21lbnQnIFske3NlZ21lbnQudHlwZX1dYCk7XG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICd0YXJnZXRTZWdtZW50JyBbJHt0YXJnZXRTZWdtZW50LnR5cGV9XWApO1xuXG4gICAgdGhpcy4jZGxsLm1vdmVOb2RlQWZ0ZXIobm9kZSwgdGFyZ2V0Tm9kZSk7XG4gIH1cblxuICBtb3ZlU2VnbWVudEJlZm9yZShzZWdtZW50OiBTZWdtZW50LCB0YXJnZXRTZWdtZW50OiBTZWdtZW50KSB7XG4gICAgaWYgKCFzZWdtZW50IHx8ICEoc2VnbWVudCBpbnN0YW5jZW9mIFNlZ21lbnQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnc2VnbWVudCdgKTtcbiAgICBpZiAoIXRhcmdldFNlZ21lbnQgfHwgISh0YXJnZXRTZWdtZW50IGluc3RhbmNlb2YgU2VnbWVudCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndGFyZ2V0U2VnbWVudCdgKTtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHNlZ21lbnQpO1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpO1xuXG4gICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICdzZWdtZW50JyBbJHtzZWdtZW50LnR5cGV9XWApO1xuICAgIGlmICghdGFyZ2V0Tm9kZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAndGFyZ2V0U2VnbWVudCcgWyR7dGFyZ2V0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHRoaXMuI2RsbC5tb3ZlTm9kZUJlZm9yZShub2RlLCB0YXJnZXROb2RlKTtcbiAgfVxuXG4gIHJlaW5kZXhTZWdtZW50cyhcbiAgICByZWluZGV4Q29uZmlnOiBQYXJ0aWFsPFJlY29yZDxTZWdtZW50VHlwZSwgU2VnbWVudFR5cGVbXT4+LFxuICAgIHN0YXJ0SW5kZXggPSAxLFxuICAgIGZpZWxkID0gJzEuMScsXG4gICkge1xuICAgIGlmIChcbiAgICAgICFyZWluZGV4Q29uZmlnIHx8XG4gICAgICB0eXBlb2YgcmVpbmRleENvbmZpZyAhPT0gJ29iamVjdCcgfHxcbiAgICAgIE9iamVjdC52YWx1ZXMocmVpbmRleENvbmZpZykuc29tZSgodmFsKSA9PiAhQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdyZWluZGV4Q29uZmlnJ2ApO1xuICAgIGlmICghc3RhcnRJbmRleCB8fCB0eXBlb2Ygc3RhcnRJbmRleCAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnc3RhcnRJbmRleCcgWyR7c3RhcnRJbmRleH1dYCk7XG4gICAgaWYgKGZpZWxkICYmICEvXihcXGQrKShcXC5cXGQrKXswLDF9JC8udGVzdChmaWVsZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnZmllbGQnIFske2ZpZWxkfV1gKTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5nZXRTZWdtZW50cygpO1xuICAgIGNvbnN0IGluZGV4TWFwOiBQYXJ0aWFsPFJlY29yZDxTZWdtZW50VHlwZSwgbnVtYmVyPj4gPSB7fTtcbiAgICBjb25zdCBpbmRleFJlc2V0VHJpZ2dlck1hcDogUGFydGlhbDxSZWNvcmQ8U2VnbWVudFR5cGUsIFNlZ21lbnRUeXBlW10+PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbc2VnLCByZXNldFRyaWdnZXJTZWdzXSBvZiBPYmplY3QuZW50cmllcyhyZWluZGV4Q29uZmlnKSkge1xuICAgICAgaW5kZXhNYXBbc2VnXSA9IHN0YXJ0SW5kZXg7XG5cbiAgICAgIGlmIChyZXNldFRyaWdnZXJTZWdzKVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNldFRyaWdnZXJTZWdzKSAoaW5kZXhSZXNldFRyaWdnZXJNYXBba2V5XSA/Pz0gW10pLnB1c2goc2VnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGlmIChyZWluZGV4Q29uZmlnW3NlZ21lbnQudHlwZV0pIHtcbiAgICAgICAgc2VnbWVudC5zZXQoYCR7c2VnbWVudC50eXBlfS4ke2ZpZWxkfWAsIFN0cmluZyhpbmRleE1hcFtzZWdtZW50LnR5cGVdKyspKTtcblxuICAgICAgICBpZiAoaW5kZXhSZXNldFRyaWdnZXJNYXBbc2VnbWVudC50eXBlXSlcbiAgICAgICAgICBmb3IgKGNvbnN0IHNlZyBvZiBpbmRleFJlc2V0VHJpZ2dlck1hcFtzZWdtZW50LnR5cGVdISkgaW5kZXhNYXBbc2VnXSA9IHN0YXJ0SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlZ21lbnQoc2VnbWVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aXFxkXXszfSR7dGhpcy5wYXJzZU9wdGlvbnMuZmllbGREZWxpbX1gKS50ZXN0KHNlZ21lbnQpO1xuICB9XG59XG4iXX0=