occam-languages 2.2.16 → 2.2.19

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.
@@ -7,18 +7,24 @@ const { filter: arrayFilter } = arrayUtilities,
7
7
  forwardsForEach: asynchronousForwardsForEach,
8
8
  backwardsForEach: asynchronousBackwardsForEach } = asynchronousUtilities;
9
9
 
10
- export function one(array, callback, ...remainingArguments) {
11
- let found = false;
10
+ export function one(array, callback, ...initialArguments) {
11
+ let success = false;
12
+
13
+ const continuation = initialArguments.pop();
12
14
 
13
- const continuation = remainingArguments.pop();
15
+ let intermediateArguments = initialArguments; ///
14
16
 
15
17
  return asynchronousForEach(array, (element, next, done) => {
16
- return callback(element, ...remainingArguments, (passed) => {
18
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
19
+ const passed = callbackArguments.shift();
20
+
21
+ intermediateArguments = callbackArguments; ///
22
+
17
23
  if (passed) {
18
- if (!found) {
19
- found = true;
24
+ if (!success) {
25
+ success = true;
20
26
  } else {
21
- found = false;
27
+ success = false;
22
28
 
23
29
  done();
24
30
 
@@ -29,17 +35,25 @@ export function one(array, callback, ...remainingArguments) {
29
35
  next();
30
36
  });
31
37
  }, () => {
32
- return continuation(found, ...remainingArguments);
38
+ const finalArguments = intermediateArguments; ///
39
+
40
+ return continuation(success, ...finalArguments);
33
41
  });
34
42
  }
35
43
 
36
- export function some(array, callback, ...remainingArguments) {
44
+ export function some(array, callback, ...initialArguments) {
37
45
  let success = false;
38
46
 
39
- const continuation = remainingArguments.pop();
47
+ const continuation = initialArguments.pop();
48
+
49
+ let intermediateArguments = initialArguments; ///
40
50
 
41
51
  return asynchronousForEach(array, (element, next, done) => {
42
- return callback(element, ...remainingArguments, (passed) => {
52
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
53
+ const passed = callbackArguments.shift();
54
+
55
+ intermediateArguments = callbackArguments; ///
56
+
43
57
  if (passed) {
44
58
  success = true;
45
59
 
@@ -51,21 +65,29 @@ export function some(array, callback, ...remainingArguments) {
51
65
  next();
52
66
  });
53
67
  }, () => {
54
- return continuation(success, ...remainingArguments);
68
+ const finalArguments = intermediateArguments; ///
69
+
70
+ return continuation(success, ...finalArguments);
55
71
  });
56
72
  }
57
73
 
58
- export function each(array, callback, ...remainingArguments) {
59
- let found = false;
74
+ export function each(array, callback, ...initialArguments) {
75
+ let success = false;
76
+
77
+ const continuation = initialArguments.pop();
60
78
 
61
- const continuation = remainingArguments.pop();
79
+ let intermediateArguments = initialArguments; ///
62
80
 
63
81
  return asynchronousForEach(array, (element, next, done) => {
64
- return callback(element, ...remainingArguments, (passed) => {
82
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
83
+ const passed = callbackArguments.shift();
84
+
85
+ intermediateArguments = callbackArguments; ///
86
+
65
87
  if (passed) {
66
- found = true;
88
+ success = true;
67
89
  } else {
68
- found = false;
90
+ success = false;
69
91
 
70
92
  done();
71
93
 
@@ -75,17 +97,25 @@ export function each(array, callback, ...remainingArguments) {
75
97
  next();
76
98
  });
77
99
  }, () => {
78
- return continuation(found, ...remainingArguments);
100
+ const finalArguments = intermediateArguments; ///
101
+
102
+ return continuation(success, ...finalArguments);
79
103
  });
80
104
  }
81
105
 
82
- export function every(array, callback, ...remainingArguments) {
106
+ export function every(array, callback, ...initialArguments) {
83
107
  let success = true;
84
108
 
85
- const continuation = remainingArguments.pop();
109
+ const continuation = initialArguments.pop();
110
+
111
+ let intermediateArguments = initialArguments; ///
86
112
 
87
113
  return asynchronousForEach(array, (element, next, done) => {
88
- return callback(element, ...remainingArguments, (passed) => {
114
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
115
+ const passed = callbackArguments.shift();
116
+
117
+ intermediateArguments = callbackArguments; ///
118
+
89
119
  if (!passed) {
90
120
  success = false;
91
121
 
@@ -97,71 +127,67 @@ export function every(array, callback, ...remainingArguments) {
97
127
  next();
98
128
  });
99
129
  }, () => {
100
- return continuation(success, ...remainingArguments);
101
- });
102
- }
103
-
104
- export function match(arrayA, arrayB, callback, ...remainingArguments) {
105
- const continuation = remainingArguments.pop(),
106
- arrayALength = arrayA.length,
107
- arrayBLength = arrayB.length;
108
-
109
- if (arrayALength !== arrayBLength) {
110
- const matches = false;
111
-
112
- return continuation(matches, ...remainingArguments);
113
- }
114
-
115
- let index = -1;
116
-
117
- return every(arrayA, (elementA, continuation) => {
118
- index++;
130
+ const finalArguments = intermediateArguments; ///
119
131
 
120
- const elementB = arrayB[index];
121
-
122
- return callback(elementA, elementB, ...remainingArguments, continuation);
123
- }, (success) => {
124
- const matches = success; ///
125
-
126
- return continuation(matches, ...remainingArguments);
132
+ return continuation(success, ...finalArguments);
127
133
  });
128
134
  }
129
135
 
130
- export function reduce(array, initialValue, callback, ...remainingArguments) {
136
+ export function reduce(array, initialValue, callback, ...initialArguments) {
131
137
  let value = initialValue; ///
132
138
 
133
- const continuation = remainingArguments.pop();
139
+ const continuation = initialArguments.pop();
140
+
141
+ let intermediateArguments = initialArguments; ///
134
142
 
135
143
  return asynchronousForEach(array, (element, next, done) => {
136
- return callback(value, element, ...remainingArguments, (currentValue) => {
144
+ return callback(value, element, ...intermediateArguments, (...callbackArguments) => {
145
+ const currentValue = callbackArguments.shift();
146
+
147
+ intermediateArguments = callbackArguments; ///
148
+
137
149
  value = currentValue; ///
138
150
 
139
151
  next();
140
152
  });
141
153
  }, () => {
142
- return continuation(value, ...remainingArguments);
154
+ const finalArguments = intermediateArguments; ///
155
+
156
+ return continuation(value, ...finalArguments);
143
157
  });
144
158
  }
145
159
 
146
- export function forEach(array, callback, ...remainingArguments) {
147
- const continuation = remainingArguments.pop();
160
+ export function forEach(array, callback, ...initialArguments) {
161
+ const continuation = initialArguments.pop();
162
+
163
+ let intermediateArguments = initialArguments; ///
148
164
 
149
165
  return asynchronousForEach(array, (element, next, done) => {
150
- return callback(element, ...remainingArguments, () => {
166
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
167
+ intermediateArguments = callbackArguments; ///
168
+
151
169
  next();
152
170
  });
153
171
  }, () => {
154
- return continuation(...remainingArguments);
172
+ const finalArguments = intermediateArguments; ///
173
+
174
+ return continuation(...finalArguments);
155
175
  });
156
176
  }
157
177
 
158
- export function forwardsEvery(array, callback, ...remainingArguments) {
178
+ export function forwardsEvery(array, callback, ...initialArguments) {
159
179
  let success = true;
160
180
 
161
- const continuation = remainingArguments.pop();
181
+ const continuation = initialArguments.pop();
182
+
183
+ let intermediateArguments = initialArguments; ///
162
184
 
163
185
  return asynchronousForwardsForEach(array, (element, next, done) => {
164
- return callback(element, ...remainingArguments, (passed) => {
186
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
187
+ const passed = callbackArguments.shift();
188
+
189
+ intermediateArguments = callbackArguments; ///
190
+
165
191
  if (!passed) {
166
192
  success = false;
167
193
 
@@ -173,17 +199,25 @@ export function forwardsEvery(array, callback, ...remainingArguments) {
173
199
  next();
174
200
  });
175
201
  }, () => {
176
- return continuation(success, ...remainingArguments);
202
+ const finalArguments = intermediateArguments; ///
203
+
204
+ return continuation(success, ...finalArguments);
177
205
  });
178
206
  }
179
207
 
180
- export function backwardsEvery(array, callback, ...remainingArguments) {
208
+ export function backwardsEvery(array, callback, ...initialArguments) {
181
209
  let success = true;
182
210
 
183
- const continuation = remainingArguments.pop();
211
+ const continuation = initialArguments.pop();
212
+
213
+ let intermediateArguments = initialArguments; ///
184
214
 
185
215
  return asynchronousBackwardsForEach(array, (element, next, done) => {
186
- return callback(element, ...remainingArguments, (passed) => {
216
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
217
+ const passed = callbackArguments.shift();
218
+
219
+ intermediateArguments = callbackArguments; ///
220
+
187
221
  if (!passed) {
188
222
  success = false;
189
223
 
@@ -195,45 +229,65 @@ export function backwardsEvery(array, callback, ...remainingArguments) {
195
229
  next();
196
230
  });
197
231
  }, () => {
198
- return continuation(success, ...remainingArguments);
232
+ const finalArguments = intermediateArguments; ///
233
+
234
+ return continuation(success, ...finalArguments);
199
235
  });
200
236
  }
201
237
 
202
- export function forwardsForEach(array, callback, ...remainingArguments) {
203
- const continuation = remainingArguments.pop();
238
+ export function forwardsForEach(array, callback, ...initialArguments) {
239
+ const continuation = initialArguments.pop();
240
+
241
+ let intermediateArguments = initialArguments; ///
204
242
 
205
243
  return asynchronousForwardsForEach(array, (element, next, done) => {
206
- return callback(element, ...remainingArguments, () => {
244
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
245
+ intermediateArguments = callbackArguments; ///
246
+
207
247
  next();
208
248
  });
209
249
  }, () => {
210
- return continuation(...remainingArguments);
250
+ const finalArguments = intermediateArguments; ///
251
+
252
+ return continuation(...finalArguments);
211
253
  });
212
254
  }
213
255
 
214
- export function backwardsForEach(array, callback, ...remainingArguments) {
215
- const continuation = remainingArguments.pop();
256
+ export function backwardsForEach(array, callback, ...initialArguments) {
257
+ const continuation = initialArguments.pop();
258
+
259
+ let intermediateArguments = initialArguments; ///
216
260
 
217
261
  return asynchronousBackwardsForEach(array, (element, next, done) => {
218
- return callback(element, ...remainingArguments, () => {
262
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
263
+ intermediateArguments = callbackArguments; ///
264
+
219
265
  next();
220
266
  });
221
267
  }, () => {
222
- return continuation(...remainingArguments);
268
+ const finalArguments = intermediateArguments; ///
269
+
270
+ return continuation(...finalArguments);
223
271
  });
224
272
  }
225
273
 
226
- export function filter(array, callback, ...remainingArguments) {
274
+ export function filter(array, callback, ...initialArguments) {
227
275
  const deletedElements = [];
228
276
 
229
- const continuation = remainingArguments.pop();
277
+ const continuation = initialArguments.pop();
278
+
279
+ let intermediateArguments = initialArguments; ///
230
280
 
231
281
  let index = array.length;
232
282
 
233
- return backwardsForEach(array, (element, continuation) => {
283
+ return asynchronousBackwardsForEach(array, (element, next, done) => {
234
284
  index--;
235
285
 
236
- return callback(element, ...remainingArguments, (passed) => {
286
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
287
+ const passed = callbackArguments.shift();
288
+
289
+ intermediateArguments = callbackArguments; ///
290
+
237
291
  if (!passed) {
238
292
  const start = index, ///
239
293
  deleteCount = 1,
@@ -242,93 +296,170 @@ export function filter(array, callback, ...remainingArguments) {
242
296
  deletedElements.unshift(deletedElement); ///
243
297
  }
244
298
 
245
- return continuation();
299
+ next();
246
300
  });
247
301
  }, () => {
248
- return continuation(deletedElements, ...remainingArguments);
302
+ const finalArguments = intermediateArguments; ///
303
+
304
+ return continuation(deletedElements, ...finalArguments);
249
305
  });
250
306
  }
251
307
 
252
- export function prune(array, callback, ...remainingArguments) {
308
+ export function prune(array, callback, ...initialArguments) {
253
309
  let deletedElement = undefined; ///
254
310
 
255
- const continuation = remainingArguments.pop();
311
+ const continuation = initialArguments.pop();
312
+
313
+ let intermediateArguments = initialArguments; ///
256
314
 
257
315
  let index = -1;
258
316
 
259
- return some(array, (element, continuation) => {
317
+ return asynchronousForEach(array, (element, next, done) => {
260
318
  index++;
261
319
 
262
- return callback(element, ...remainingArguments, (passed) => {
320
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
321
+ const passed = callbackArguments.shift();
322
+
323
+ intermediateArguments = callbackArguments; ///
324
+
263
325
  if (!passed) {
264
326
  const start = index, ///
265
327
  deleteCount = 1;
266
328
 
267
- deletedElement = array.splice(start, deleteCount).pop() ///
329
+ deletedElement = array.splice(start, deleteCount).pop(); ///
330
+
331
+ done();
332
+
333
+ return;
268
334
  }
269
335
 
270
- return continuation(passed);
336
+ next();
271
337
  });
272
338
  }, () => {
273
- return continuation(deletedElement, ...remainingArguments);
339
+ const finalArguments = intermediateArguments; ///
340
+
341
+ return continuation(deletedElement, ...finalArguments);
274
342
  });
275
343
  }
276
344
 
277
- export function extract(array, callback, ...remainingArguments) {
345
+ export function extract(array, callback, ...initialArguments) {
278
346
  let deletedElement = undefined; ///
279
347
 
280
- const continuation = remainingArguments.pop();
348
+ const continuation = initialArguments.pop();
349
+
350
+ let intermediateArguments = initialArguments; ///
281
351
 
282
352
  let index = -1;
283
353
 
284
- return some(array, (element, continuation) => {
354
+ return asynchronousForEach(array, (element, next, done) => {
285
355
  index++;
286
356
 
287
- return callback(element, ...remainingArguments, (passed) => {
357
+ return callback(element, ...intermediateArguments, (...callbackArguments) => {
358
+ const passed = callbackArguments.shift();
359
+
360
+ intermediateArguments = callbackArguments; ///
361
+
288
362
  if (passed) {
289
363
  const start = index, ///
290
364
  deleteCount = 1;
291
365
 
292
- deletedElement = array.splice(start, deleteCount).pop() ///
366
+ deletedElement = array.splice(start, deleteCount).pop(); ///
367
+
368
+ done();
369
+
370
+ return;
293
371
  }
294
372
 
295
- return continuation(passed);
373
+ next();
296
374
  });
297
375
  }, () => {
298
- return continuation(deletedElement, ...remainingArguments);
376
+ const finalArguments = intermediateArguments; ///
377
+
378
+ return continuation(deletedElement, ...finalArguments);
299
379
  });
300
380
  }
301
381
 
302
- export function resolve(arrayA, arrayB, callback, ...remainingArguments) {
382
+ export function match(arrayA, arrayB, callback, ...initialArguments) {
383
+ let success = true;
384
+
385
+ const continuation = initialArguments.pop();
386
+
387
+ const arrayALength = arrayA.length,
388
+ arrayBLength = arrayB.length;
389
+
390
+ if (arrayALength !== arrayBLength) {
391
+ success = false;
392
+
393
+ return continuation(success, ...initialArguments);
394
+ }
395
+
396
+ let index = -1;
397
+
398
+ let intermediateArguments = initialArguments; ///
399
+
400
+ return asynchronousForEach(arrayA, (elementA, next, done) => {
401
+ index++;
402
+
403
+ const elementB = arrayB[index];
404
+
405
+ return callback(elementA, elementB, ...intermediateArguments, (...callbackArguments) => {
406
+ const passed = callbackArguments.shift();
407
+
408
+ intermediateArguments = callbackArguments; ///
409
+
410
+ if (!passed) {
411
+ success = false;
412
+
413
+ done();
414
+
415
+ return;
416
+ }
417
+
418
+ next();
419
+ });
420
+ }, () => {
421
+ const finalArguments = intermediateArguments; ///
422
+
423
+ return continuation(success, ...finalArguments);
424
+ });
425
+ }
426
+
427
+ export function resolve(arrayA, arrayB, callback, ...initialArguments) {
303
428
  arrayA = [ ///
304
429
  ...arrayA
305
430
  ];
306
431
 
307
- const continuation = remainingArguments.pop();
432
+ const continuation = initialArguments.pop();
433
+
434
+ let intermediateArguments = initialArguments; ///
308
435
 
309
436
  function nextPass() {
437
+ let success = false;
438
+
310
439
  const arrayALength = arrayA.length;
311
440
 
312
441
  if (arrayALength === 0) {
313
- const success = true; ///
442
+ success = true;
314
443
 
315
- return continuation(success, ...remainingArguments);
316
- }
444
+ const finalArguments = intermediateArguments; ///
317
445
 
318
- let success = false;
446
+ return continuation(success, ...finalArguments);
447
+ }
319
448
 
320
- let count = -1;
449
+ let index = -1;
321
450
 
322
451
  function nextElement() {
323
- count++;
452
+ index++;
324
453
 
325
- const terminate = (count === arrayALength);
454
+ const terminate = (index === arrayALength);
326
455
 
327
456
  if (terminate) {
328
457
  if (!success) {
329
- const success = false; ///
458
+ success = false;
330
459
 
331
- return continuation(success, ...remainingArguments);
460
+ const finalArguments = intermediateArguments; ///
461
+
462
+ return continuation(success, ...finalArguments);
332
463
  }
333
464
 
334
465
  arrayFilter(arrayA, (elementA) => {
@@ -341,10 +472,13 @@ export function resolve(arrayA, arrayB, callback, ...remainingArguments) {
341
472
 
342
473
  nextPass();
343
474
  } else {
344
- const index = count, ///
345
- elementA = arrayA[index];
475
+ const elementA = arrayA[index];
476
+
477
+ return callback(elementA, ...intermediateArguments, (...callbackArguments) => {
478
+ const passed = callbackArguments.shift();
479
+
480
+ intermediateArguments = callbackArguments; ///
346
481
 
347
- return callback(elementA, ...remainingArguments, (passed) => {
348
482
  if (passed) {
349
483
  const elementB = elementA; ///
350
484
 
@@ -369,7 +503,6 @@ export default {
369
503
  some,
370
504
  each,
371
505
  every,
372
- match,
373
506
  reduce,
374
507
  forEach,
375
508
  forwardsEvery,
@@ -379,5 +512,6 @@ export default {
379
512
  filter,
380
513
  prune,
381
514
  extract,
515
+ match,
382
516
  resolve
383
517
  };
@@ -1,88 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return EquivalencePass;
9
- }
10
- });
11
- const _pass = require("../utilities/pass");
12
- class EquivalencePass {
13
- run(leftNode, rightNode, ...remainingArguments) {
14
- let success;
15
- const visited = this.visitNode(leftNode, rightNode, ...remainingArguments);
16
- success = visited; ///
17
- return success;
18
- }
19
- descend(leftChildNodes, rightChildNodes, ...remainingArguments) {
20
- let descended = false;
21
- const childNodesCongruent = (0, _pass.areChildNodesCongruent)(leftChildNodes, rightChildNodes);
22
- if (childNodesCongruent) {
23
- const visited = leftChildNodes.every((leftChildNode, index)=>{
24
- const rightChildNode = rightChildNodes[index], leftNode = leftChildNode, rightNode = rightChildNode, visited = this.visitNode(leftNode, rightNode, ...remainingArguments);
25
- if (visited) {
26
- return true;
27
- }
28
- });
29
- if (visited) {
30
- descended = true;
31
- }
32
- }
33
- return descended;
34
- }
35
- visitNode(leftNode, rightNode, ...remainingArguments) {
36
- let visited = false;
37
- const leftNodeTerminalNode = leftNode.isTerminalNode(), rightNodeTerminalNode = rightNode.isTerminalNode(), leftNodeNonTerminalNode = leftNode.isNonTerminalNode(), rightNodeNonTerminalNode = rightNode.isNonTerminalNode();
38
- if (false) {
39
- ///
40
- } else if (leftNodeTerminalNode && rightNodeTerminalNode) {
41
- const leftTerminalNode = leftNode, rightTerminalNode = rightNode; ///
42
- visited = this.visitTerminalNode(leftTerminalNode, rightTerminalNode, ...remainingArguments);
43
- } else if (leftNodeNonTerminalNode && rightNodeNonTerminalNode) {
44
- const leftNonTerminalNode = leftNode, rightNonTerminalNode = rightNode; ///
45
- visited = this.visitNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, ...remainingArguments);
46
- }
47
- return visited;
48
- }
49
- visitTerminalNode(leftTerminalNode, rightTerminalNode, ...remainingArguments) {
50
- let visited;
51
- visited = true;
52
- return visited;
53
- }
54
- visitNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, ...remainingArguments) {
55
- let visited = false;
56
- let { maps } = this.constructor;
57
- maps = [
58
- ...maps,
59
- {
60
- leftNodeQuery: _pass.nonTerminalNodeQuery,
61
- rightNodeQuery: _pass.nonTerminalNodeQuery,
62
- run: (leftNode, rightNode, ...remainingArguments)=>{
63
- let visited = false;
64
- const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(), rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName(); ///
65
- if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
66
- const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(), rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(), leftChildNodes = leftNonTerminalNodeChildNodes, rightChildNodes = rightNonTerminalNodeChildNodes, descended = this.descend(leftChildNodes, rightChildNodes, ...remainingArguments);
67
- if (descended) {
68
- visited = true;
69
- }
70
- }
71
- return visited;
72
- }
73
- }
74
- ];
75
- maps.some((map)=>{
76
- const { leftNodeQuery, rightNodeQuery, run } = map;
77
- const leftNode = leftNodeQuery(leftNonTerminalNode), rightNode = rightNodeQuery(rightNonTerminalNode); ///
78
- if (leftNode !== null && rightNode !== null) {
79
- const success = run(leftNode, rightNode, ...remainingArguments);
80
- visited = success; ///
81
- return true;
82
- }
83
- });
84
- return visited;
85
- }
86
- }
87
-
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXNzL2VxdWl2YWxlbmNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBub25UZXJtaW5hbE5vZGVRdWVyeSwgYXJlQ2hpbGROb2Rlc0NvbmdydWVudCB9IGZyb20gXCIuLi91dGlsaXRpZXMvcGFzc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcXVpdmFsZW5jZVBhc3Mge1xuICBydW4obGVmdE5vZGUsIHJpZ2h0Tm9kZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gICAgbGV0IHN1Y2Nlc3M7XG5cbiAgICBjb25zdCB2aXNpdGVkID0gdGhpcy52aXNpdE5vZGUobGVmdE5vZGUsIHJpZ2h0Tm9kZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcblxuICAgIHN1Y2Nlc3MgPSB2aXNpdGVkOyAgLy8vXG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIGRlc2NlbmQobGVmdENoaWxkTm9kZXMsIHJpZ2h0Q2hpbGROb2RlcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gICAgbGV0IGRlc2NlbmRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2hpbGROb2Rlc0NvbmdydWVudCA9IGFyZUNoaWxkTm9kZXNDb25ncnVlbnQobGVmdENoaWxkTm9kZXMsIHJpZ2h0Q2hpbGROb2Rlcyk7XG5cbiAgICBpZiAoY2hpbGROb2Rlc0NvbmdydWVudCkge1xuICAgICAgY29uc3QgdmlzaXRlZCA9IGxlZnRDaGlsZE5vZGVzLmV2ZXJ5KChsZWZ0Q2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCByaWdodENoaWxkTm9kZSA9IHJpZ2h0Q2hpbGROb2Rlc1tpbmRleF0sXG4gICAgICAgICAgICAgIGxlZnROb2RlID0gbGVmdENoaWxkTm9kZSwgLy8vXG4gICAgICAgICAgICAgIHJpZ2h0Tm9kZSA9IHJpZ2h0Q2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgICAgdmlzaXRlZCA9IHRoaXMudmlzaXROb2RlKGxlZnROb2RlLCByaWdodE5vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKHZpc2l0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh2aXNpdGVkKSB7XG4gICAgICAgIGRlc2NlbmRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc2NlbmRlZDtcbiAgfVxuXG4gIHZpc2l0Tm9kZShsZWZ0Tm9kZSwgcmlnaHROb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgICBsZXQgdmlzaXRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbGVmdE5vZGVUZXJtaW5hbE5vZGUgPSBsZWZ0Tm9kZS5pc1Rlcm1pbmFsTm9kZSgpLFxuICAgICAgICAgIHJpZ2h0Tm9kZVRlcm1pbmFsTm9kZSA9IHJpZ2h0Tm9kZS5pc1Rlcm1pbmFsTm9kZSgpLFxuICAgICAgICAgIGxlZnROb2RlTm9uVGVybWluYWxOb2RlID0gbGVmdE5vZGUuaXNOb25UZXJtaW5hbE5vZGUoKSxcbiAgICAgICAgICByaWdodE5vZGVOb25UZXJtaW5hbE5vZGUgPSByaWdodE5vZGUuaXNOb25UZXJtaW5hbE5vZGUoKTtcblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgLy8vXG4gICAgfSBlbHNlIGlmIChsZWZ0Tm9kZVRlcm1pbmFsTm9kZSAmJiByaWdodE5vZGVUZXJtaW5hbE5vZGUpIHtcbiAgICAgIGNvbnN0IGxlZnRUZXJtaW5hbE5vZGUgPSBsZWZ0Tm9kZSwgIC8vL1xuICAgICAgICAgICAgcmlnaHRUZXJtaW5hbE5vZGUgPSByaWdodE5vZGU7ICAvLy9cblxuICAgICAgdmlzaXRlZCA9IHRoaXMudmlzaXRUZXJtaW5hbE5vZGUobGVmdFRlcm1pbmFsTm9kZSwgcmlnaHRUZXJtaW5hbE5vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gICAgfSBlbHNlIGlmIChsZWZ0Tm9kZU5vblRlcm1pbmFsTm9kZSAmJiByaWdodE5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICAgIGNvbnN0IGxlZnROb25UZXJtaW5hbE5vZGUgPSBsZWZ0Tm9kZSwgIC8vL1xuICAgICAgICAgICAgcmlnaHROb25UZXJtaW5hbE5vZGUgPSByaWdodE5vZGU7IC8vL1xuXG4gICAgICB2aXNpdGVkID0gdGhpcy52aXNpdE5vblRlcm1pbmFsTm9kZShsZWZ0Tm9uVGVybWluYWxOb2RlLCByaWdodE5vblRlcm1pbmFsTm9kZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRlZDtcbiAgfVxuXG4gIHZpc2l0VGVybWluYWxOb2RlKGxlZnRUZXJtaW5hbE5vZGUsIHJpZ2h0VGVybWluYWxOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHsgLy8vXG4gICAgbGV0IHZpc2l0ZWQ7XG5cbiAgICB2aXNpdGVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB2aXNpdGVkO1xuICB9XG5cbiAgdmlzaXROb25UZXJtaW5hbE5vZGUobGVmdE5vblRlcm1pbmFsTm9kZSwgcmlnaHROb25UZXJtaW5hbE5vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICAgIGxldCB2aXNpdGVkID0gZmFsc2U7XG5cbiAgICBsZXQgeyBtYXBzIH0gPSB0aGlzLmNvbnN0cnVjdG9yO1xuXG4gICAgbWFwcyA9IFsgLy8vXG4gICAgICAuLi5tYXBzLFxuICAgICAge1xuICAgICAgICBsZWZ0Tm9kZVF1ZXJ5OiBub25UZXJtaW5hbE5vZGVRdWVyeSxcbiAgICAgICAgcmlnaHROb2RlUXVlcnk6IG5vblRlcm1pbmFsTm9kZVF1ZXJ5LFxuICAgICAgICBydW46IChsZWZ0Tm9kZSwgcmlnaHROb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpID0+IHtcbiAgICAgICAgICBsZXQgdmlzaXRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3QgbGVmdE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID0gbGVmdE5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLCAvLy9cbiAgICAgICAgICAgICAgICByaWdodE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID0gcmlnaHROb25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKTsgLy8vXG5cbiAgICAgICAgICBpZiAobGVmdE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID09PSByaWdodE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Tm9uVGVybWluYWxOb2RlQ2hpbGROb2RlcyA9IGxlZnROb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgICAgcmlnaHROb25UZXJtaW5hbE5vZGVDaGlsZE5vZGVzID0gcmlnaHROb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgICAgbGVmdENoaWxkTm9kZXMgPSBsZWZ0Tm9uVGVybWluYWxOb2RlQ2hpbGROb2RlcywgLy8vXG4gICAgICAgICAgICAgICAgICByaWdodENoaWxkTm9kZXMgPSByaWdodE5vblRlcm1pbmFsTm9kZUNoaWxkTm9kZXMsIC8vL1xuICAgICAgICAgICAgICAgICAgZGVzY2VuZGVkID0gdGhpcy5kZXNjZW5kKGxlZnRDaGlsZE5vZGVzLCByaWdodENoaWxkTm9kZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIGlmIChkZXNjZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmlzaXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZpc2l0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG5cbiAgICBtYXBzLnNvbWUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgeyBsZWZ0Tm9kZVF1ZXJ5LCByaWdodE5vZGVRdWVyeSwgcnVuIH0gPSBtYXA7XG5cbiAgICAgIGNvbnN0IGxlZnROb2RlID0gbGVmdE5vZGVRdWVyeShsZWZ0Tm9uVGVybWluYWxOb2RlKSwgIC8vL1xuICAgICAgICAgICAgcmlnaHROb2RlID0gcmlnaHROb2RlUXVlcnkocmlnaHROb25UZXJtaW5hbE5vZGUpOyAgLy8vXG5cbiAgICAgIGlmICgobGVmdE5vZGUgIT09IG51bGwpICYmIChyaWdodE5vZGUgIT09IG51bGwpKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBydW4obGVmdE5vZGUsIHJpZ2h0Tm9kZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcblxuICAgICAgICB2aXNpdGVkID0gc3VjY2VzczsgIC8vL1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZpc2l0ZWQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJFcXVpdmFsZW5jZVBhc3MiLCJydW4iLCJsZWZ0Tm9kZSIsInJpZ2h0Tm9kZSIsInJlbWFpbmluZ0FyZ3VtZW50cyIsInN1Y2Nlc3MiLCJ2aXNpdGVkIiwidmlzaXROb2RlIiwiZGVzY2VuZCIsImxlZnRDaGlsZE5vZGVzIiwicmlnaHRDaGlsZE5vZGVzIiwiZGVzY2VuZGVkIiwiY2hpbGROb2Rlc0NvbmdydWVudCIsImFyZUNoaWxkTm9kZXNDb25ncnVlbnQiLCJldmVyeSIsImxlZnRDaGlsZE5vZGUiLCJpbmRleCIsInJpZ2h0Q2hpbGROb2RlIiwibGVmdE5vZGVUZXJtaW5hbE5vZGUiLCJpc1Rlcm1pbmFsTm9kZSIsInJpZ2h0Tm9kZVRlcm1pbmFsTm9kZSIsImxlZnROb2RlTm9uVGVybWluYWxOb2RlIiwiaXNOb25UZXJtaW5hbE5vZGUiLCJyaWdodE5vZGVOb25UZXJtaW5hbE5vZGUiLCJsZWZ0VGVybWluYWxOb2RlIiwicmlnaHRUZXJtaW5hbE5vZGUiLCJ2aXNpdFRlcm1pbmFsTm9kZSIsImxlZnROb25UZXJtaW5hbE5vZGUiLCJyaWdodE5vblRlcm1pbmFsTm9kZSIsInZpc2l0Tm9uVGVybWluYWxOb2RlIiwibWFwcyIsImxlZnROb2RlUXVlcnkiLCJub25UZXJtaW5hbE5vZGVRdWVyeSIsInJpZ2h0Tm9kZVF1ZXJ5IiwibGVmdE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lIiwiZ2V0UnVsZU5hbWUiLCJyaWdodE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lIiwibGVmdE5vblRlcm1pbmFsTm9kZUNoaWxkTm9kZXMiLCJnZXRDaGlsZE5vZGVzIiwicmlnaHROb25UZXJtaW5hbE5vZGVDaGlsZE5vZGVzIiwic29tZSIsIm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBSUE7OztlQUFxQkE7OztzQkFGd0M7QUFFOUMsTUFBTUE7SUFDbkJDLElBQUlDLFFBQVEsRUFBRUMsU0FBUyxFQUFFLEdBQUdDLGtCQUFrQixFQUFFO1FBQzlDLElBQUlDO1FBRUosTUFBTUMsVUFBVSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0wsVUFBVUMsY0FBY0M7UUFFdkRDLFVBQVVDLFNBQVUsR0FBRztRQUV2QixPQUFPRDtJQUNUO0lBRUFHLFFBQVFDLGNBQWMsRUFBRUMsZUFBZSxFQUFFLEdBQUdOLGtCQUFrQixFQUFFO1FBQzlELElBQUlPLFlBQVk7UUFFaEIsTUFBTUMsc0JBQXNCQyxJQUFBQSw0QkFBc0IsRUFBQ0osZ0JBQWdCQztRQUVuRSxJQUFJRSxxQkFBcUI7WUFDdkIsTUFBTU4sVUFBVUcsZUFBZUssS0FBSyxDQUFDLENBQUNDLGVBQWVDO2dCQUNuRCxNQUFNQyxpQkFBaUJQLGVBQWUsQ0FBQ00sTUFBTSxFQUN2Q2QsV0FBV2EsZUFDWFosWUFBWWMsZ0JBQ1pYLFVBQVUsSUFBSSxDQUFDQyxTQUFTLENBQUNMLFVBQVVDLGNBQWNDO2dCQUV2RCxJQUFJRSxTQUFTO29CQUNYLE9BQU87Z0JBQ1Q7WUFDRjtZQUVBLElBQUlBLFNBQVM7Z0JBQ1hLLFlBQVk7WUFDZDtRQUNGO1FBRUEsT0FBT0E7SUFDVDtJQUVBSixVQUFVTCxRQUFRLEVBQUVDLFNBQVMsRUFBRSxHQUFHQyxrQkFBa0IsRUFBRTtRQUNwRCxJQUFJRSxVQUFVO1FBRWQsTUFBTVksdUJBQXVCaEIsU0FBU2lCLGNBQWMsSUFDOUNDLHdCQUF3QmpCLFVBQVVnQixjQUFjLElBQ2hERSwwQkFBMEJuQixTQUFTb0IsaUJBQWlCLElBQ3BEQywyQkFBMkJwQixVQUFVbUIsaUJBQWlCO1FBRTVELElBQUksT0FBTztRQUNULEdBQUc7UUFDTCxPQUFPLElBQUlKLHdCQUF3QkUsdUJBQXVCO1lBQ3hELE1BQU1JLG1CQUFtQnRCLFVBQ25CdUIsb0JBQW9CdEIsV0FBWSxHQUFHO1lBRXpDRyxVQUFVLElBQUksQ0FBQ29CLGlCQUFpQixDQUFDRixrQkFBa0JDLHNCQUFzQnJCO1FBQzNFLE9BQU8sSUFBSWlCLDJCQUEyQkUsMEJBQTBCO1lBQzlELE1BQU1JLHNCQUFzQnpCLFVBQ3RCMEIsdUJBQXVCekIsV0FBVyxHQUFHO1lBRTNDRyxVQUFVLElBQUksQ0FBQ3VCLG9CQUFvQixDQUFDRixxQkFBcUJDLHlCQUF5QnhCO1FBQ3BGO1FBRUEsT0FBT0U7SUFDVDtJQUVBb0Isa0JBQWtCRixnQkFBZ0IsRUFBRUMsaUJBQWlCLEVBQUUsR0FBR3JCLGtCQUFrQixFQUFFO1FBQzVFLElBQUlFO1FBRUpBLFVBQVU7UUFFVixPQUFPQTtJQUNUO0lBRUF1QixxQkFBcUJGLG1CQUFtQixFQUFFQyxvQkFBb0IsRUFBRSxHQUFHeEIsa0JBQWtCLEVBQUU7UUFDckYsSUFBSUUsVUFBVTtRQUVkLElBQUksRUFBRXdCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXO1FBRS9CQSxPQUFPO2VBQ0ZBO1lBQ0g7Z0JBQ0VDLGVBQWVDLDBCQUFvQjtnQkFDbkNDLGdCQUFnQkQsMEJBQW9CO2dCQUNwQy9CLEtBQUssQ0FBQ0MsVUFBVUMsV0FBVyxHQUFHQztvQkFDNUIsSUFBSUUsVUFBVTtvQkFFZCxNQUFNNEIsOEJBQThCUCxvQkFBb0JRLFdBQVcsSUFDN0RDLCtCQUErQlIscUJBQXFCTyxXQUFXLElBQUksR0FBRztvQkFFNUUsSUFBSUQsZ0NBQWdDRSw4QkFBOEI7d0JBQ2hFLE1BQU1DLGdDQUFnQ1Ysb0JBQW9CVyxhQUFhLElBQ2pFQyxpQ0FBaUNYLHFCQUFxQlUsYUFBYSxJQUNuRTdCLGlCQUFpQjRCLCtCQUNqQjNCLGtCQUFrQjZCLGdDQUNsQjVCLFlBQVksSUFBSSxDQUFDSCxPQUFPLENBQUNDLGdCQUFnQkMsb0JBQW9CTjt3QkFFbkUsSUFBSU8sV0FBVzs0QkFDYkwsVUFBVTt3QkFDWjtvQkFDRjtvQkFFQSxPQUFPQTtnQkFDVDtZQUNGO1NBQ0Q7UUFFRHdCLEtBQUtVLElBQUksQ0FBQyxDQUFDQztZQUNULE1BQU0sRUFBRVYsYUFBYSxFQUFFRSxjQUFjLEVBQUVoQyxHQUFHLEVBQUUsR0FBR3dDO1lBRS9DLE1BQU12QyxXQUFXNkIsY0FBY0osc0JBQ3pCeEIsWUFBWThCLGVBQWVMLHVCQUF3QixHQUFHO1lBRTVELElBQUksQUFBQzFCLGFBQWEsUUFBVUMsY0FBYyxNQUFPO2dCQUMvQyxNQUFNRSxVQUFVSixJQUFJQyxVQUFVQyxjQUFjQztnQkFFNUNFLFVBQVVELFNBQVUsR0FBRztnQkFFdkIsT0FBTztZQUNUO1FBQ0Y7UUFFQSxPQUFPQztJQUNUO0FBQ0YifQ==