occam-languages 3.0.4 → 3.0.8

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.
@@ -67,59 +67,43 @@ _export(exports, {
67
67
  const _necessary = require("necessary");
68
68
  const { filter: arrayFilter } = _necessary.arrayUtilities;
69
69
  function one(array, callback, ...initialArguments) {
70
- const continuation = initialArguments.pop(), length = array.length, index = 0;
70
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
71
71
  function next(index, ...nextArguments) {
72
72
  if (index === length) {
73
- const success = count === 1, finalArguemnts = success ? nextArguments : initialArguments; ///
74
- return continuation(success, ...finalArguemnts);
73
+ return count === 1 ? forward(...nextArguments) : back();
75
74
  }
76
75
  const element = array[index];
77
- return callback(element, ...initialArguments, (success, ...callbackArguments)=>{
78
- if (success) {
79
- count++;
80
- if (count === 2) {
81
- const success = false, finalArguments = initialArguments; ///
82
- return continuation(success, ...finalArguments);
83
- }
84
- return next(index + 1, ...callbackArguments);
76
+ return callback(element, ...initialArguments, ()=>next(index + 1, ...nextArguments), (...callbackArguments)=>{
77
+ count++;
78
+ if (count === 2) {
79
+ return back();
85
80
  }
86
- return next(index + 1, ...nextArguments);
81
+ return next(index + 1, ...callbackArguments);
87
82
  });
88
83
  }
89
84
  let count = 0;
90
85
  return next(index, ...initialArguments);
91
86
  }
92
87
  function some(array, callback, ...initialArguments) {
93
- const continuation = initialArguments.pop(), length = array.length, index = 0;
88
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length;
94
89
  function next(index) {
95
90
  if (index === length) {
96
- const success = false, finalArguments = initialArguments; ///
97
- return continuation(success, ...finalArguments);
91
+ return back();
98
92
  }
99
93
  const element = array[index];
100
- return callback(element, ...initialArguments, (success, ...callbackArguments)=>{
101
- if (success) {
102
- const finalArguments = callbackArguments; //
103
- return continuation(success, ...finalArguments);
104
- }
105
- return next(index + 1);
106
- });
94
+ return callback(element, ...initialArguments, ()=>next(index + 1), forward);
107
95
  }
96
+ const index = 0;
108
97
  return next(index);
109
98
  }
110
99
  function each(array, callback, ...initialArguments) {
111
- const continuation = initialArguments.pop(), length = array.length, index = 0;
100
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
112
101
  function next(index, ...nextArguments) {
113
102
  if (index === length) {
114
- const success = count !== 0, finalArguments = success ? nextArguments : initialArguments; ///
115
- return continuation(success, ...finalArguments);
103
+ return count !== 0 ? forward(...nextArguments) : back();
116
104
  }
117
105
  const element = array[index];
118
- return callback(element, ...nextArguments, (success, ...callbackArguments)=>{
119
- if (!success) {
120
- const finalArguments = initialArguments; ///
121
- return continuation(success, ...finalArguments);
122
- }
106
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
123
107
  count++;
124
108
  return next(index + 1, ...callbackArguments);
125
109
  });
@@ -128,124 +112,104 @@ function each(array, callback, ...initialArguments) {
128
112
  return next(index, ...initialArguments);
129
113
  }
130
114
  function every(array, callback, ...initialArguments) {
131
- const continuation = initialArguments.pop(), length = array.length, index = 0;
115
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
132
116
  function next(index, ...nextArguments) {
133
117
  if (index === length) {
134
- const success = true, finalArguments = nextArguments; ///
135
- return continuation(success, ...finalArguments);
118
+ return forward(...nextArguments);
136
119
  }
137
120
  const element = array[index];
138
- return callback(element, ...nextArguments, (success, ...callbackArguments)=>{
139
- if (!success) {
140
- const finalArguments = initialArguments; ///
141
- return continuation(success, ...finalArguments);
142
- }
121
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
143
122
  return next(index + 1, ...callbackArguments);
144
123
  });
145
124
  }
146
125
  return next(index, ...initialArguments);
147
126
  }
148
127
  function reduce(array, initialValue, callback, ...initialArguments) {
149
- const continuation = initialArguments.pop(), length = array.length, index = 0;
128
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
150
129
  function next(index, value, ...nextArguments) {
151
130
  if (index === length) {
152
- const finalArguments = nextArguments; ///
153
- return continuation(value, ...finalArguments);
131
+ return forward(value, ...nextArguments);
154
132
  }
155
133
  const element = array[index];
156
- return callback(element, value, ...nextArguments, (value, ...callbackArguments)=>{
134
+ return callback(element, value, ...nextArguments, back, (value, ...callbackArguments)=>{
157
135
  return next(index + 1, value, ...callbackArguments);
158
136
  });
159
137
  }
160
138
  return next(index, initialValue, ...initialArguments);
161
139
  }
162
140
  function forEach(array, callback, ...initialArguments) {
163
- const continuation = initialArguments.pop(), length = array.length, index = 0;
141
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
164
142
  function next(index, ...nextArguments) {
165
143
  if (index === length) {
166
- const finalArguments = nextArguments; ///
167
- return continuation(...finalArguments);
144
+ return forward(...nextArguments);
168
145
  }
169
146
  const element = array[index];
170
- return callback(element, ...nextArguments, (...callbackArguments)=>{
147
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
171
148
  return next(index + 1, ...callbackArguments);
172
149
  });
173
150
  }
174
151
  return next(index, ...initialArguments);
175
152
  }
176
153
  function forwardsEvery(array, callback, ...initialArguments) {
177
- const continuation = initialArguments.pop(), length = array.length, index = 0;
154
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
178
155
  function next(index, ...nextArguments) {
179
156
  if (index === length) {
180
- const success = true, finalArguments = nextArguments; ///
181
- return continuation(success, ...finalArguments);
157
+ return forward(...nextArguments);
182
158
  }
183
159
  const element = array[index];
184
- return callback(element, ...nextArguments, (success, ...callbackArguments)=>{
185
- if (!success) {
186
- const finalArguments = initialArguments; ///
187
- return continuation(success, ...finalArguments);
188
- }
160
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
189
161
  return next(index + 1, ...callbackArguments);
190
162
  });
191
163
  }
192
164
  return next(index, ...initialArguments);
193
165
  }
194
166
  function backwardsEvery(array, callback, ...initialArguments) {
195
- const continuation = initialArguments.pop(), length = array.length, index = length - 1;
167
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = length - 1;
196
168
  function next(index, ...nextArguments) {
197
169
  if (index === -1) {
198
- const success = true, finalArguments = nextArguments; ///
199
- return continuation(success, ...finalArguments);
170
+ return forward(...nextArguments);
200
171
  }
201
172
  const element = array[index];
202
- return callback(element, ...nextArguments, (success, ...callbackArguments)=>{
203
- if (!success) {
204
- const finalArguments = initialArguments; ///
205
- return continuation(success, ...finalArguments);
206
- }
173
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
207
174
  return next(index - 1, ...callbackArguments);
208
175
  });
209
176
  }
210
177
  return next(index, ...initialArguments);
211
178
  }
212
179
  function forwardsForEach(array, callback, ...initialArguments) {
213
- const continuation = initialArguments.pop(), length = array.length, index = 0;
180
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
214
181
  function next(index, ...nextArguments) {
215
182
  if (index === length) {
216
- const finalArguments = nextArguments; ///
217
- return continuation(...finalArguments);
183
+ return forward(...nextArguments);
218
184
  }
219
185
  const element = array[index];
220
- return callback(element, ...nextArguments, (...callbackArguments)=>{
186
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
221
187
  return next(index + 1, ...callbackArguments);
222
188
  });
223
189
  }
224
190
  return next(index, ...initialArguments);
225
191
  }
226
192
  function backwardsForEach(array, callback, ...initialArguments) {
227
- const continuation = initialArguments.pop(), length = array.length, index = length - 1;
193
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = length - 1;
228
194
  function next(index, ...nextArguments) {
229
195
  if (index === -1) {
230
- const finalArguments = nextArguments; ///
231
- return continuation(...finalArguments);
196
+ return forward(...nextArguments);
232
197
  }
233
198
  const element = array[index];
234
- return callback(element, ...nextArguments, (...callbackArguments)=>{
199
+ return callback(element, ...nextArguments, back, (...callbackArguments)=>{
235
200
  return next(index - 1, ...callbackArguments);
236
201
  });
237
202
  }
238
203
  return next(index, ...initialArguments);
239
204
  }
240
205
  function filter(array, callback, ...initialArguments) {
241
- const continuation = initialArguments.pop(), length = array.length, deletedElements = [], index = length - 1;
206
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, deletedElements = [], index = length - 1;
242
207
  function next(index, ...nextArguments) {
243
208
  if (index === -1) {
244
- const finalArguments = nextArguments; ///
245
- return continuation(deletedElements, ...finalArguments);
209
+ return forward(deletedElements, ...nextArguments);
246
210
  }
247
211
  const element = array[index];
248
- return callback(element, ...nextArguments, (passed, ...callbackArguments)=>{
212
+ return callback(element, ...nextArguments, back, (passed, ...callbackArguments)=>{
249
213
  if (!passed) {
250
214
  const startIndex = index, deleteCount = 1, deletedElement = element; ///
251
215
  array.splice(startIndex, deleteCount);
@@ -257,61 +221,55 @@ function filter(array, callback, ...initialArguments) {
257
221
  return next(index, ...initialArguments);
258
222
  }
259
223
  function prune(array, callback, ...initialArguments) {
260
- const continuation = initialArguments.pop(), length = array.length, index = 0;
261
- function next(index) {
224
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
225
+ function next(index, ...nextArguments) {
262
226
  if (index === length) {
263
- const deletedElement = undefined, finalArguments = initialArguments; ///
264
- return continuation(deletedElement, ...finalArguments);
227
+ const deletedElement = undefined;
228
+ return forward(deletedElement, ...nextArguments);
265
229
  }
266
230
  const element = array[index];
267
- return callback(element, ...initialArguments, (passed, ...callbackArguments)=>{
231
+ return callback(element, ...nextArguments, back, (passed, ...callbackArguments)=>{
268
232
  if (!passed) {
269
- const startIndex = index, deleteCount = 1, deletedElement = element, finalArguments = callbackArguments; ///
233
+ const startIndex = index, deleteCount = 1, deletedElement = element; ///
270
234
  array.splice(startIndex, deleteCount);
271
- return continuation(deletedElement, ...finalArguments);
235
+ return forward(deletedElement, ...callbackArguments);
272
236
  }
273
- return next(index + 1);
237
+ return next(index + 1, ...callbackArguments);
274
238
  });
275
239
  }
276
- return next(index);
240
+ return next(index, ...initialArguments);
277
241
  }
278
242
  function extract(array, callback, ...initialArguments) {
279
- const continuation = initialArguments.pop(), length = array.length, index = 0;
280
- function next(index) {
243
+ const forward = initialArguments.pop(), back = initialArguments.pop(), length = array.length, index = 0;
244
+ function next(index, ...nextArguments) {
281
245
  if (index === length) {
282
- const deletedElement = undefined, finalArguments = initialArguments; ///
283
- return continuation(deletedElement, ...finalArguments);
246
+ const deletedElement = undefined;
247
+ return forward(deletedElement, ...nextArguments);
284
248
  }
285
249
  const element = array[index];
286
- return callback(element, ...initialArguments, (passed, ...callbackArguments)=>{
250
+ return callback(element, ...nextArguments, back, (passed, ...callbackArguments)=>{
287
251
  if (passed) {
288
- const startIndex = index, deleteCount = 1, deletedElement = element, finalArguments = callbackArguments; ///
252
+ const startIndex = index, deleteCount = 1, deletedElement = element; ///
289
253
  array.splice(startIndex, deleteCount);
290
- return continuation(deletedElement, ...finalArguments);
254
+ return forward(deletedElement, ...callbackArguments);
291
255
  }
292
- return next(index + 1);
256
+ return next(index + 1, ...callbackArguments);
293
257
  });
294
258
  }
295
- return next(index);
259
+ return next(index, ...initialArguments);
296
260
  }
297
261
  function match(arrayA, arrayB, callback, ...initialArguments) {
298
- const continuation = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
262
+ const forward = initialArguments.pop(), back = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
299
263
  if (arrayALength !== arrayBLength) {
300
- const success = false, finalArguments = initialArguments; ///
301
- return continuation(success, ...finalArguments);
264
+ return back();
302
265
  }
303
266
  const length = arrayALength, index = 0;
304
267
  function next(index, ...nextArguments) {
305
268
  if (index === length) {
306
- const success = true, finalArguments = nextArguments; ///
307
- return continuation(success, ...finalArguments);
269
+ return forward(...nextArguments);
308
270
  }
309
271
  const elementA = arrayA[index], elementB = arrayB[index];
310
- return callback(elementA, elementB, ...nextArguments, (success, ...callbackArguments)=>{
311
- if (!success) {
312
- const finalArguments = initialArguments; ///
313
- return continuation(success, ...finalArguments);
314
- }
272
+ return callback(elementA, elementB, ...nextArguments, back, (...callbackArguments)=>{
315
273
  return next(index + 1, ...callbackArguments);
316
274
  });
317
275
  }
@@ -321,18 +279,16 @@ function resolve(arrayA, arrayB, callback, ...initialArguments) {
321
279
  arrayA = [
322
280
  ...arrayA
323
281
  ];
324
- const continuation = initialArguments.pop();
282
+ const forward = initialArguments.pop(), back = initialArguments.pop();
325
283
  function nextPass(...nextArguments) {
326
284
  const length = arrayA.length; ///
327
285
  if (length === 0) {
328
- const success = true, finalArguments = nextArguments; ///
329
- return continuation(success, ...finalArguments);
286
+ return forward(...nextArguments);
330
287
  }
331
288
  function nextElement(index, success, ...currentArguments) {
332
289
  if (index === length) {
333
290
  if (!success) {
334
- const finalArguments = initialArguments; ///
335
- return continuation(success, ...finalArguments);
291
+ return back();
336
292
  }
337
293
  arrayFilter(arrayA, (elementA)=>{
338
294
  const arrayBIncludesElementA = arrayB.includes(elementA);
@@ -343,13 +299,10 @@ function resolve(arrayA, arrayB, callback, ...initialArguments) {
343
299
  return nextPass(...currentArguments);
344
300
  }
345
301
  const elementA = arrayA[index];
346
- return callback(elementA, ...currentArguments, (passed, ...callbackArguments)=>{
347
- if (passed) {
348
- const elementB = elementA, success = true;
349
- arrayB.push(elementB);
350
- return nextElement(index + 1, success, ...callbackArguments);
351
- }
352
- return nextElement(index + 1, success, ...currentArguments);
302
+ return callback(elementA, ...currentArguments, ()=>nextElement(index + 1, success, ...currentArguments), (...callbackArguments)=>{
303
+ const elementB = elementA; ///
304
+ arrayB.push(elementB);
305
+ return nextElement(index + 1, true, ...callbackArguments);
353
306
  });
354
307
  }
355
308
  const index = 0, success = false;
@@ -387,4 +340,4 @@ const _default = {
387
340
  exists
388
341
  };
389
342
 
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gKGNvdW50ID09PSAxKSxcbiAgICAgICAgZmluYWxBcmd1ZW1udHMgPSBzdWNjZXNzID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXJndW1lbnRzIDogLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJndW1lbnRzOyAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VlbW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCAoc3VjY2VzcywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgIC8vL1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxldCBjb3VudCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29tZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gZmFsc2UsXG4gICAgICAgICAgICBmaW5hbEFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmluaXRpYWxBcmd1bWVudHMsIChzdWNjZXNzLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgLy9cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IChjb3VudCAhPT0gMCksXG4gICAgICAgIGZpbmFsQXJndW1lbnRzID0gc3VjY2VzcyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEFyZ3VtZW50cyA6IC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgKHN1Y2Nlc3MsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJ1ZSxcbiAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgKHN1Y2Nlc3MsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIHZhbHVlLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsdWUsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIHZhbHVlLCAuLi5uZXh0QXJndW1lbnRzLCAodmFsdWUsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIHZhbHVlLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgaW5pdGlhbFZhbHVlLCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBuZXh0QXJndW1lbnRzOyAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbiguLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJ1ZSxcbiAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgKHN1Y2Nlc3MsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFja3dhcmRzRXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJ1ZSxcbiAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgKHN1Y2Nlc3MsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBjb250aW51YXRpb24gPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IG5leHRBcmd1bWVudHM7IC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgZGVsZXRlZEVsZW1lbnRzID0gW10sXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBuZXh0QXJndW1lbnRzOyAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudHMsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICBkZWxldGVkRWxlbWVudHMudW5zaGlmdChkZWxldGVkRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaW5hbEFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50LCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCAocGFzc2VkLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4LCAvLy9cbiAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQsIC8vL1xuICAgICAgICAgICAgICBmaW5hbEFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAvLy9cblxuICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24oZGVsZXRlZEVsZW1lbnQsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaW5hbEFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50LCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCAocGFzc2VkLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudCwgLy8vXG4gICAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gY2FsbGJhY2tBcmd1bWVudHM7IC8vL1xuXG4gICAgICAgIGFycmF5LnNwbGljZShzdGFydEluZGV4LCBkZWxldGVDb3VudCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudCwgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dChpbmRleCArIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGFycmF5QUxlbmd0aCA9IGFycmF5QS5sZW5ndGgsXG4gICAgICAgIGFycmF5Qkxlbmd0aCA9IGFycmF5Qi5sZW5ndGg7XG5cbiAgaWYgKGFycmF5QUxlbmd0aCAhPT0gYXJyYXlCTGVuZ3RoKSB7XG4gICAgY29uc3Qgc3VjY2VzcyA9IGZhbHNlLFxuICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gIH1cblxuICBjb25zdCBsZW5ndGggPSBhcnJheUFMZW5ndGgsICAvLy9cbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRydWUsXG4gICAgICAgICAgICBmaW5hbEFyZ3VtZW50cyA9IG5leHRBcmd1bWVudHM7IC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50QSA9IGFycmF5QVtpbmRleF0sXG4gICAgICAgICAgZWxlbWVudEIgPSBhcnJheUJbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnRBLCBlbGVtZW50QiwgLi4ubmV4dEFyZ3VtZW50cywgKHN1Y2Nlc3MsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShhcnJheUEsIGFycmF5QiwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgYXJyYXlBID0gWyAgLy8vXG4gICAgLi4uYXJyYXlBXG4gIF07XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBmdW5jdGlvbiBuZXh0UGFzcyguLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyYXlBLmxlbmd0aDsgLy8vXG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJ1ZSxcbiAgICAgICAgICAgIGZpbmFsQXJndW1lbnRzID0gbmV4dEFyZ3VtZW50czsgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHRFbGVtZW50KGluZGV4LCBzdWNjZXNzLCAuLi5jdXJyZW50QXJndW1lbnRzKSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UGFzcyguLi5jdXJyZW50QXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudEEgPSBhcnJheUFbaW5kZXhdO1xuXG4gICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIC4uLmN1cnJlbnRBcmd1bWVudHMsIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50QiA9IGVsZW1lbnRBLCAgLy8vXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG5cbiAgICAgICAgICBhcnJheUIucHVzaChlbGVtZW50Qik7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQoaW5kZXggKyAxLCBzdWNjZXNzLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQoaW5kZXggKyAxLCBzdWNjZXNzLCAuLi5jdXJyZW50QXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gMCxcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICByZXR1cm4gbmV4dEVsZW1lbnQoaW5kZXgsIHN1Y2Nlc3MsIC4uLm5leHRBcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIG5leHRQYXNzKC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsKGNhbGxiYWNrcywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICByZXR1cm4gZXZlcnkoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBzb21lKGNhbGxiYWNrcywgKGNhbGxiYWNrLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayguLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gIH0sIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9uZSxcbiAgc29tZSxcbiAgZWFjaCxcbiAgZXZlcnksXG4gIHJlZHVjZSxcbiAgZm9yRWFjaCxcbiAgZm9yd2FyZHNFdmVyeSxcbiAgYmFja3dhcmRzRXZlcnksXG4gIGZvcndhcmRzRm9yRWFjaCxcbiAgYmFja3dhcmRzRm9yRWFjaCxcbiAgZmlsdGVyLFxuICBwcnVuZSxcbiAgZXh0cmFjdCxcbiAgbWF0Y2gsXG4gIHJlc29sdmUsXG4gIGFsbCxcbiAgZXhpc3RzXG59O1xuIl0sIm5hbWVzIjpbImFsbCIsImJhY2t3YXJkc0V2ZXJ5IiwiYmFja3dhcmRzRm9yRWFjaCIsImVhY2giLCJldmVyeSIsImV4aXN0cyIsImV4dHJhY3QiLCJmaWx0ZXIiLCJmb3JFYWNoIiwiZm9yd2FyZHNFdmVyeSIsImZvcndhcmRzRm9yRWFjaCIsIm1hdGNoIiwib25lIiwicHJ1bmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFycmF5RmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJhcnJheSIsImNhbGxiYWNrIiwiaW5pdGlhbEFyZ3VtZW50cyIsImNvbnRpbnVhdGlvbiIsInBvcCIsImxlbmd0aCIsImluZGV4IiwibmV4dCIsIm5leHRBcmd1bWVudHMiLCJzdWNjZXNzIiwiY291bnQiLCJmaW5hbEFyZ3VlbW50cyIsImVsZW1lbnQiLCJjYWxsYmFja0FyZ3VtZW50cyIsImZpbmFsQXJndW1lbnRzIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJkZWxldGVkRWxlbWVudHMiLCJwYXNzZWQiLCJzdGFydEluZGV4IiwiZGVsZXRlQ291bnQiLCJkZWxldGVkRWxlbWVudCIsInNwbGljZSIsInVuc2hpZnQiLCJ1bmRlZmluZWQiLCJhcnJheUEiLCJhcnJheUIiLCJhcnJheUFMZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJlbGVtZW50QSIsImVsZW1lbnRCIiwibmV4dFBhc3MiLCJuZXh0RWxlbWVudCIsImN1cnJlbnRBcmd1bWVudHMiLCJhcnJheUJJbmNsdWRlc0VsZW1lbnRBIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FsbGJhY2tzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7UUF1ZWdCQTtlQUFBQTs7UUFuUkFDO2VBQUFBOztRQW1EQUM7ZUFBQUE7O1FBNE9oQjtlQUFBOztRQXhhZ0JDO2VBQUFBOztRQW1DQUM7ZUFBQUE7O1FBK1hBQztlQUFBQTs7UUE3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
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiAoY291bnQgPT09IDEpID9cbiAgICAgICAgICAgICAgIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cykgOlxuICAgICAgICAgICAgICAgICBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCAoKSA9PiBuZXh0KGluZGV4ICsgMSwgLi4ubmV4dEFyZ3VtZW50cyksICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgY291bnQrKztcblxuICAgICAgaWYgKGNvdW50ID09PSAyKSB7XG4gICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb21lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCAoKSA9PiBuZXh0KGluZGV4ICsgMSksIGZvcndhcmQpO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKGNvdW50ICE9PSAwKSA/XG4gICAgICAgICAgICAgICBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpIDpcbiAgICAgICAgICAgICAgICAgYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjaywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb3VudCsrO1xuXG4gICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxldCBjb3VudCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2ssICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2UoYXJyYXksIGluaXRpYWxWYWx1ZSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCB2YWx1ZSwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCh2YWx1ZSwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCB2YWx1ZSwgLi4ubmV4dEFyZ3VtZW50cywgYmFjaywgKHZhbHVlLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCB2YWx1ZSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGluaXRpYWxWYWx1ZSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjaywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2ssICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2ssICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2ssICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBkZWxldGVkRWxlbWVudHMgPSBbXSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudHMsIC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjaywgKHBhc3NlZCwgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBlbGVtZW50OyAvLy9cblxuICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrLCAocGFzc2VkLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGluZGV4LCAvLy9cbiAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgIGFycmF5LnNwbGljZShzdGFydEluZGV4LCBkZWxldGVDb3VudCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2ssIChwYXNzZWQsIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBlbGVtZW50OyAvLy9cblxuICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICByZXR1cm4gYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXlBTGVuZ3RoLCAgLy8vXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XSxcbiAgICAgICAgICBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIGVsZW1lbnRCLCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShhcnJheUEsIGFycmF5QiwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgYXJyYXlBID0gWyAgLy8vXG4gICAgLi4uYXJyYXlBXG4gIF07XG5cbiAgY29uc3QgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpO1xuXG4gIGZ1bmN0aW9uIG5leHRQYXNzKC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheUEubGVuZ3RoOyAvLy9cblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHRFbGVtZW50KGluZGV4LCBzdWNjZXNzLCAuLi5jdXJyZW50QXJndW1lbnRzKSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlGaWx0ZXIoYXJyYXlBLCAoZWxlbWVudEEpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJJbmNsdWRlc0VsZW1lbnRBID0gYXJyYXlCLmluY2x1ZGVzKGVsZW1lbnRBKTtcblxuICAgICAgICAgIGlmICghYXJyYXlCSW5jbHVkZXNFbGVtZW50QSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV4dFBhc3MoLi4uY3VycmVudEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnRBLCAuLi5jdXJyZW50QXJndW1lbnRzLCAoKSA9PiBuZXh0RWxlbWVudChpbmRleCArIDEsIHN1Y2Nlc3MsIC4uLmN1cnJlbnRBcmd1bWVudHMpLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50QiA9IGVsZW1lbnRBOyAgLy8vXG5cbiAgICAgICAgICBhcnJheUIucHVzaChlbGVtZW50Qik7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQoaW5kZXggKyAxLCB0cnVlLCAuLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSAwLFxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIHJldHVybiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dEFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gbmV4dFBhc3MoLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBldmVyeShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhjYWxsYmFja3MsIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHNvbWUoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb25lLFxuICBzb21lLFxuICBlYWNoLFxuICBldmVyeSxcbiAgcmVkdWNlLFxuICBmb3JFYWNoLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBmaWx0ZXIsXG4gIHBydW5lLFxuICBleHRyYWN0LFxuICBtYXRjaCxcbiAgcmVzb2x2ZSxcbiAgYWxsLFxuICBleGlzdHNcbn07XG4iXSwibmFtZXMiOlsiYWxsIiwiYmFja3dhcmRzRXZlcnkiLCJiYWNrd2FyZHNGb3JFYWNoIiwiZWFjaCIsImV2ZXJ5IiwiZXhpc3RzIiwiZXh0cmFjdCIsImZpbHRlciIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwiZm9yd2FyZHNGb3JFYWNoIiwibWF0Y2giLCJvbmUiLCJwcnVuZSIsInJlZHVjZSIsInJlc29sdmUiLCJzb21lIiwiYXJyYXlGaWx0ZXIiLCJhcnJheVV0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJpbml0aWFsQXJndW1lbnRzIiwiZm9yd2FyZCIsInBvcCIsImJhY2siLCJsZW5ndGgiLCJpbmRleCIsIm5leHQiLCJuZXh0QXJndW1lbnRzIiwiY291bnQiLCJlbGVtZW50IiwiY2FsbGJhY2tBcmd1bWVudHMiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsInBhc3NlZCIsInN0YXJ0SW5kZXgiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImFycmF5QSIsImFycmF5QiIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsImVsZW1lbnRBIiwiZWxlbWVudEIiLCJuZXh0UGFzcyIsIm5leHRFbGVtZW50Iiwic3VjY2VzcyIsImN1cnJlbnRBcmd1bWVudHMiLCJhcnJheUJJbmNsdWRlc0VsZW1lbnRBIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FsbGJhY2tzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7UUEyWmdCQTtlQUFBQTs7UUFuUEFDO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBcU5oQjtlQUFBOztRQTlXZ0JDO2VBQUFBOztRQTJCQUM7ZUFBQUE7O1FBNlVBQztlQUFBQTs7UUF6SEFDO2VBQUFBOztRQWpFQUM7ZUFBQUE7O1FBekdBQztlQUFBQTs7UUFxQkFDO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBNElBQztlQUFBQTs7UUFuVUFDO2VBQUFBOztRQWlRQUM7ZUFBQUE7O1FBOUpBQztlQUFBQTs7UUE2UEFDO2VBQUFBOztRQWpVQUM7ZUFBQUE7OzsyQkFuQ2U7QUFFL0IsTUFBTSxFQUFFVCxRQUFRVSxXQUFXLEVBQUUsR0FBR0MseUJBQWM7QUFFdkMsU0FBU04sSUFBSU8sS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZ0JBQWdCO0lBQ3RELE1BQU1DLFVBQVVELGlCQUFpQkUsR0FBRyxJQUM5QkMsT0FBT0gsaUJBQWlCRSxHQUFHLElBQzNCRSxTQUFTTixNQUFNTSxNQUFNLEVBQ3JCQyxRQUFR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