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