@teselagen/react-table 6.10.9 → 6.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/ReactList.js DELETED
@@ -1,702 +0,0 @@
1
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
2
-
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4
-
5
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
6
-
7
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
8
-
9
- /* eslint-disable no-empty */
10
- /* eslint-disable no-cond-assign */
11
- /* eslint-disable no-cond-assign */
12
- /* eslint-disable default-case */
13
- /* eslint-disable default-case */
14
- /* eslint-disable no-cond-assign */
15
- // import module from 'module';
16
- import PropTypes from 'prop-types';
17
- import React from 'react';
18
-
19
- var CLIENT_SIZE_KEYS = { x: 'clientWidth', y: 'clientHeight' };
20
- var CLIENT_START_KEYS = { x: 'clientTop', y: 'clientLeft' };
21
- var INNER_SIZE_KEYS = { x: 'innerWidth', y: 'innerHeight' };
22
- var OFFSET_SIZE_KEYS = { x: 'offsetWidth', y: 'offsetHeight' };
23
- var OFFSET_START_KEYS = { x: 'offsetLeft', y: 'offsetTop' };
24
- var OVERFLOW_KEYS = { x: 'overflowX', y: 'overflowY' };
25
- var SCROLL_SIZE_KEYS = { x: 'scrollWidth', y: 'scrollHeight' };
26
- var SCROLL_START_KEYS = { x: 'scrollLeft', y: 'scrollTop' };
27
- var SIZE_KEYS = { x: 'minWidth', y: 'minHeight' };
28
-
29
- var NOOP = function NOOP() {};
30
-
31
- // If a browser doesn't support the `options` argument to
32
- // add/removeEventListener, we need to check, otherwise we will
33
- // accidentally set `capture` with a truthy value.
34
- var PASSIVE = function () {
35
- if (typeof window === 'undefined') return false;
36
- var hasSupport = false;
37
- try {
38
- document.createElement('div').addEventListener('test', NOOP, {
39
- get passive() {
40
- hasSupport = true;
41
- return false;
42
- }
43
- });
44
- } catch (e) {
45
- // noop
46
- }
47
- return hasSupport;
48
- }() ? { passive: true } : false;
49
-
50
- var UNSTABLE_MESSAGE = 'ReactList failed to reach a stable state.';
51
- var MAX_SYNC_UPDATES = 100;
52
-
53
- var isEqualSubset = function isEqualSubset(a, b) {
54
- for (var key in b) {
55
- if (a[key] !== b[key]) return false;
56
- }return true;
57
- };
58
-
59
- var ReactList = function (_React$Component) {
60
- _inherits(ReactList, _React$Component);
61
-
62
- function ReactList(props) {
63
- _classCallCheck(this, ReactList);
64
-
65
- var _this = _possibleConstructorReturn(this, (ReactList.__proto__ || Object.getPrototypeOf(ReactList)).call(this, props));
66
-
67
- var initialIndex = props.initialIndex;
68
-
69
- var itemsPerRow = 1;
70
-
71
- var _this$constrain = _this.constrain(initialIndex, 0, itemsPerRow, props),
72
- from = _this$constrain.from,
73
- size = _this$constrain.size;
74
-
75
- _this.state = { from: from, size: size, itemsPerRow: itemsPerRow };
76
- _this.cache = {};
77
- _this.prevPrevState = {};
78
- _this.unstable = false;
79
- _this.updateCounter = 0;
80
- return _this;
81
- }
82
-
83
- //tnr: commenting this out.. not sure if it is actually needed
84
- // UNSAFE_componentWillReceiveProps(nextProps) {
85
- // let { from, size, itemsPerRow } = this.state;
86
- // if (nextProps.clearCache) this.cache = {};
87
- // this.maybeSetState(
88
- // this.constrain(from, size, itemsPerRow, nextProps),
89
- // NOOP
90
- // );
91
- // }
92
-
93
- _createClass(ReactList, [{
94
- key: 'componentDidMount',
95
- value: function componentDidMount() {
96
- this.updateFrame = this.updateFrame.bind(this);
97
- window.addEventListener('resize', this.updateFrame);
98
- this.updateFrame(this.scrollTo.bind(this, this.props.initialIndex));
99
- }
100
- }, {
101
- key: 'componentDidUpdate',
102
- value: function componentDidUpdate() {
103
- var _this2 = this;
104
-
105
- // If the list has reached an unstable state, prevent an infinite loop.
106
- if (this.unstable) return;
107
-
108
- if (++this.updateCounter > MAX_SYNC_UPDATES) {
109
- this.unstable = true;
110
- return console.error(UNSTABLE_MESSAGE);
111
- }
112
-
113
- if (!this.updateCounterTimeoutId) {
114
- this.updateCounterTimeoutId = setTimeout(function () {
115
- _this2.updateCounter = 0;
116
- delete _this2.updateCounterTimeoutId;
117
- }, 0);
118
- }
119
- // this.dontUpdate = true;
120
- this.updateFrame();
121
-
122
- //TNR: extra code to 'fix' the scroll height when scrolling upwards
123
- //tnr commenting this out because we are now doing a better job of calculating row heights
124
- // if (this.rowToFixScroll) {
125
- // const { row, cache: previousSize } = this.rowToFixScroll;
126
- // const actualSize = this.cache[row];
127
- // if (actualSize && actualSize !== previousSize) {
128
- // this.getScrollParent().scrollBy({
129
- // top: -(
130
- // (previousSize || this.props.itemSizeEstimator(row, {})) - actualSize
131
- // )
132
- // });
133
- // this.rowToFixScroll = null;
134
- // }
135
- // }
136
- }
137
- // shouldComponentUpdate() {
138
- // if (this.dontUpdate) {
139
- // this.dontUpdate = false;
140
- // return false;
141
- // }
142
- // return true;
143
- // }
144
-
145
- }, {
146
- key: 'maybeSetState',
147
- value: function maybeSetState(b, cb) {
148
- if (isEqualSubset(this.state, b)) return cb();
149
-
150
- //TNR: extra code to 'fix' the scroll height when scrolling upwards
151
- if (this.state.from === b.from + 1) {
152
- this.rowToFixScroll = { row: b.from, cache: this.cache[b.from] };
153
- }
154
- this.setState(b, cb);
155
- }
156
- }, {
157
- key: 'componentWillUnmount',
158
- value: function componentWillUnmount() {
159
- window.removeEventListener('resize', this.updateFrame);
160
- this.scrollParent.removeEventListener('scroll', this.updateFrame, PASSIVE);
161
- this.scrollParent.removeEventListener('mousewheel', NOOP, PASSIVE);
162
- }
163
- }, {
164
- key: 'getOffset',
165
- value: function getOffset(el) {
166
- var axis = this.props.axis;
167
-
168
- var offset = el[CLIENT_START_KEYS[axis]] || 0;
169
- var offsetKey = OFFSET_START_KEYS[axis];
170
- do {
171
- offset += el[offsetKey] || 0;
172
- } while (el = el.offsetParent);
173
- return offset;
174
- }
175
- }, {
176
- key: 'getEl',
177
- value: function getEl() {
178
- return this.el || this.items;
179
- }
180
- }, {
181
- key: 'getScrollParent',
182
- value: function getScrollParent() {
183
- var _props = this.props,
184
- axis = _props.axis,
185
- scrollParentGetter = _props.scrollParentGetter;
186
-
187
- if (scrollParentGetter) return scrollParentGetter();
188
- var el = this.getEl();
189
- if (!el) return window;
190
- var overflowKey = OVERFLOW_KEYS[axis];
191
- while (el = el.parentElement) {
192
- switch (window.getComputedStyle(el)[overflowKey]) {
193
- case 'auto':
194
- case 'scroll':
195
- case 'overlay':
196
- return el;
197
- }
198
- }
199
- return window;
200
- }
201
- }, {
202
- key: 'getScrollPosition',
203
- value: function getScrollPosition() {
204
- var scrollParent = this.scrollParent;
205
- var axis = this.props.axis;
206
-
207
- var scrollKey = SCROLL_START_KEYS[axis];
208
- var actual = scrollParent === window ? // Firefox always returns document.body[scrollKey] as 0 and Chrome/Safari
209
- // always return document.documentElement[scrollKey] as 0, so take
210
- // whichever has a value.
211
- document.body[scrollKey] || document.documentElement[scrollKey] : scrollParent[scrollKey];
212
- var max = this.getScrollSize() - this.getViewportSize();
213
- var scroll = Math.max(0, Math.min(actual, max));
214
- var el = this.getEl();
215
- return this.getOffset(scrollParent) + scroll - this.getOffset(el);
216
- }
217
- }, {
218
- key: 'setScroll',
219
- value: function setScroll(offset) {
220
- var scrollParent = this.scrollParent;
221
- var axis = this.props.axis;
222
-
223
- offset += this.getOffset(this.getEl());
224
- if (scrollParent === window) return window.scrollTo(0, offset);
225
-
226
- offset -= this.getOffset(this.scrollParent);
227
- scrollParent[SCROLL_START_KEYS[axis]] = offset;
228
- }
229
- }, {
230
- key: 'getViewportSize',
231
- value: function getViewportSize() {
232
- var scrollParent = this.scrollParent;
233
- var axis = this.props.axis;
234
-
235
- return scrollParent === window ? window[INNER_SIZE_KEYS[axis]] : scrollParent[CLIENT_SIZE_KEYS[axis]];
236
- }
237
- }, {
238
- key: 'getScrollSize',
239
- value: function getScrollSize() {
240
- var scrollParent = this.scrollParent;
241
- var _document = document,
242
- body = _document.body,
243
- documentElement = _document.documentElement;
244
-
245
- var key = SCROLL_SIZE_KEYS[this.props.axis];
246
- return scrollParent === window ? Math.max(body[key], documentElement[key]) : scrollParent[key];
247
- }
248
- }, {
249
- key: 'hasDeterminateSize',
250
- value: function hasDeterminateSize() {
251
- var _props2 = this.props,
252
- itemSizeGetter = _props2.itemSizeGetter,
253
- type = _props2.type;
254
-
255
- return type === 'uniform' || itemSizeGetter;
256
- }
257
- }, {
258
- key: 'getStartAndEnd',
259
- value: function getStartAndEnd() {
260
- var threshold = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props.threshold;
261
-
262
- var scroll = this.getScrollPosition();
263
- var start = Math.max(0, scroll - threshold);
264
- var end = scroll + this.getViewportSize() + threshold;
265
- if (this.hasDeterminateSize()) {
266
- end = Math.min(end, this.getSpaceBefore(this.props.length));
267
- }
268
- return { start: start, end: end };
269
- }
270
- }, {
271
- key: 'getItemSizeAndItemsPerRow',
272
- value: function getItemSizeAndItemsPerRow() {
273
- var _props3 = this.props,
274
- axis = _props3.axis,
275
- useStaticSize = _props3.useStaticSize;
276
- var _state = this.state,
277
- itemSize = _state.itemSize,
278
- itemsPerRow = _state.itemsPerRow;
279
-
280
- if (useStaticSize && itemSize && itemsPerRow) {
281
- return { itemSize: itemSize, itemsPerRow: itemsPerRow };
282
- }
283
-
284
- var itemEls = this.items.children;
285
- if (!itemEls.length) return {};
286
-
287
- var firstEl = itemEls[0];
288
-
289
- // Firefox has a problem where it will return a *slightly* (less than
290
- // thousandths of a pixel) different size for the same element between
291
- // renders. This can cause an infinite render loop, so only change the
292
- // itemSize when it is significantly different.
293
- var firstElSize = firstEl[OFFSET_SIZE_KEYS[axis]];
294
- var delta = Math.abs(firstElSize - itemSize);
295
- if (isNaN(delta) || delta >= 1) itemSize = firstElSize;
296
-
297
- if (!itemSize) return {};
298
-
299
- var startKey = OFFSET_START_KEYS[axis];
300
- var firstStart = firstEl[startKey];
301
- itemsPerRow = 1;
302
- for (var item = itemEls[itemsPerRow]; item && item[startKey] === firstStart; item = itemEls[itemsPerRow]) {
303
- ++itemsPerRow;
304
- }
305
-
306
- return { itemSize: itemSize, itemsPerRow: itemsPerRow };
307
- }
308
- }, {
309
- key: 'updateFrame',
310
- value: function updateFrame(cb) {
311
- this.updateScrollParent();
312
- if (typeof cb !== 'function') cb = NOOP;
313
- switch (this.props.type) {
314
- case 'simple':
315
- return this.updateSimpleFrame(cb);
316
- case 'variable':
317
- return this.updateVariableFrame(cb);
318
- case 'uniform':
319
- return this.updateUniformFrame(cb);
320
- }
321
- }
322
- }, {
323
- key: 'updateScrollParent',
324
- value: function updateScrollParent() {
325
- var prev = this.scrollParent;
326
- if (prev) {
327
- return; //https://github.com/coderiety/react-list/pull/196
328
- }
329
- this.scrollParent = this.getScrollParent();
330
- if (prev === this.scrollParent) return;
331
- if (prev) {
332
- prev.removeEventListener('scroll', this.updateFrame);
333
- prev.removeEventListener('mousewheel', NOOP);
334
- }
335
- this.scrollParent.addEventListener('scroll', this.updateFrame, PASSIVE);
336
- this.scrollParent.addEventListener('mousewheel', NOOP, PASSIVE);
337
- }
338
- }, {
339
- key: 'updateSimpleFrame',
340
- value: function updateSimpleFrame(cb) {
341
- var _getStartAndEnd = this.getStartAndEnd(),
342
- end = _getStartAndEnd.end;
343
-
344
- var itemEls = this.items.children;
345
- var elEnd = 0;
346
-
347
- if (itemEls.length) {
348
- var axis = this.props.axis;
349
-
350
- var firstItemEl = itemEls[0];
351
- var lastItemEl = itemEls[itemEls.length - 1];
352
- elEnd = this.getOffset(lastItemEl) + lastItemEl[OFFSET_SIZE_KEYS[axis]] - this.getOffset(firstItemEl);
353
- }
354
-
355
- if (elEnd > end) return cb();
356
-
357
- var _props4 = this.props,
358
- pageSize = _props4.pageSize,
359
- length = _props4.length;
360
-
361
- var size = Math.min(this.state.size + pageSize, length);
362
- this.maybeSetState({ size: size }, cb);
363
- }
364
- }, {
365
- key: 'updateVariableFrame',
366
- value: function updateVariableFrame(cb) {
367
- if (!this.props.itemSizeGetter) this.cacheSizes();
368
-
369
- var _getStartAndEnd2 = this.getStartAndEnd(),
370
- start = _getStartAndEnd2.start,
371
- end = _getStartAndEnd2.end;
372
-
373
- var _props5 = this.props,
374
- length = _props5.length,
375
- pageSize = _props5.pageSize;
376
-
377
- var space = 0;
378
- var from = 0;
379
- var size = 0;
380
- var maxFrom = length - 1;
381
-
382
- while (from < maxFrom) {
383
- var itemSize = this.getSizeOfItem(from);
384
- if (itemSize == null || space + itemSize > start) break;
385
- space += itemSize;
386
- ++from;
387
- }
388
-
389
- var maxSize = length - from;
390
-
391
- while (size < maxSize && space < end) {
392
- var _itemSize = this.getSizeOfItem(from + size);
393
- if (_itemSize == null) {
394
- size = Math.min(size + pageSize, maxSize);
395
- break;
396
- }
397
- space += _itemSize;
398
- ++size;
399
- }
400
- this.maybeSetState({ from: from, size: size }, cb);
401
- }
402
- }, {
403
- key: 'updateUniformFrame',
404
- value: function updateUniformFrame(cb) {
405
- var _getItemSizeAndItemsP = this.getItemSizeAndItemsPerRow(),
406
- itemSize = _getItemSizeAndItemsP.itemSize,
407
- itemsPerRow = _getItemSizeAndItemsP.itemsPerRow;
408
-
409
- if (!itemSize || !itemsPerRow) return cb();
410
-
411
- var _getStartAndEnd3 = this.getStartAndEnd(),
412
- start = _getStartAndEnd3.start,
413
- end = _getStartAndEnd3.end;
414
-
415
- var _constrain = this.constrain(Math.floor(start / itemSize) * itemsPerRow, (Math.ceil((end - start) / itemSize) + 1) * itemsPerRow, itemsPerRow, this.props),
416
- from = _constrain.from,
417
- size = _constrain.size;
418
-
419
- return this.maybeSetState({ itemsPerRow: itemsPerRow, from: from, itemSize: itemSize, size: size }, cb);
420
- }
421
- }, {
422
- key: 'getSpaceBefore',
423
- value: function getSpaceBefore(index) {
424
- var cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
425
-
426
- if (cache[index] != null) return cache[index];
427
-
428
- // Try the static itemSize.
429
- var _state2 = this.state,
430
- itemSize = _state2.itemSize,
431
- itemsPerRow = _state2.itemsPerRow;
432
-
433
- if (itemSize) {
434
- return cache[index] = Math.floor(index / itemsPerRow) * itemSize;
435
- }
436
-
437
- // Find the closest space to index there is a cached value for.
438
- var from = index;
439
- while (from > 0 && cache[--from] == null) {}
440
-
441
- // Finally, accumulate sizes of items from - index.
442
- var space = cache[from] || 0;
443
- for (var i = from; i < index; ++i) {
444
- cache[i] = space;
445
- var _itemSize2 = this.getSizeOfItem(i);
446
- if (_itemSize2 == null) break;
447
- space += _itemSize2;
448
- }
449
-
450
- return cache[index] = space;
451
- }
452
- }, {
453
- key: 'cacheSizes',
454
- value: function cacheSizes() {
455
- var cache = this.cache;
456
- var from = this.state.from;
457
-
458
- if (!this.items) return;
459
- var itemEls = this.items.children;
460
- var sizeKey = OFFSET_SIZE_KEYS[this.props.axis];
461
- for (var i = 0, l = itemEls.length; i < l; ++i) {
462
- cache[from + i] = itemEls[i][sizeKey];
463
- }
464
- }
465
- }, {
466
- key: 'getSizeOfItem',
467
- value: function getSizeOfItem(index) {
468
- var cache = this.cache,
469
- items = this.items;
470
- var _props6 = this.props,
471
- axis = _props6.axis,
472
- itemSizeGetter = _props6.itemSizeGetter,
473
- itemSizeEstimator = _props6.itemSizeEstimator,
474
- type = _props6.type;
475
- var _state3 = this.state,
476
- from = _state3.from,
477
- itemSize = _state3.itemSize,
478
- size = _state3.size;
479
-
480
- // Try the static itemSize.
481
-
482
- if (itemSize) return itemSize;
483
-
484
- // Try the itemSizeGetter.
485
- if (itemSizeGetter) return itemSizeGetter(index);
486
-
487
- // Try the cache.
488
- if (index in cache) return cache[index];
489
-
490
- // Try the DOM.
491
- if (type === 'simple' && index >= from && index < from + size && items) {
492
- var itemEl = items.children[index - from];
493
- if (itemEl) return itemEl[OFFSET_SIZE_KEYS[axis]];
494
- }
495
-
496
- // Try the itemSizeEstimator.
497
- if (itemSizeEstimator) return itemSizeEstimator(index, cache);
498
- }
499
- }, {
500
- key: 'constrain',
501
- value: function constrain(from, size, itemsPerRow, _ref) {
502
- var length = _ref.length,
503
- minSize = _ref.minSize,
504
- type = _ref.type;
505
-
506
- size = Math.max(size, minSize);
507
- var mod = size % itemsPerRow;
508
- if (mod) size += itemsPerRow - mod;
509
- if (size > length) size = length;
510
- from = type === 'simple' || !from ? 0 : Math.max(Math.min(from, length - size), 0);
511
-
512
- if (mod = from % itemsPerRow) {
513
- from -= mod;
514
- size += mod;
515
- }
516
-
517
- return { from: from, size: size };
518
- }
519
- }, {
520
- key: 'scrollTo',
521
- value: function scrollTo(index) {
522
- if (index != null) this.setScroll(this.getSpaceBefore(index) - 100);
523
- }
524
- }, {
525
- key: 'scrollAround',
526
- value: function scrollAround(index) {
527
- var current = this.getScrollPosition();
528
- var bottom = this.getSpaceBefore(index);
529
- var top = bottom - this.getViewportSize() + this.getSizeOfItem(index);
530
- var min = Math.min(top, bottom);
531
- var max = Math.max(top, bottom);
532
- if (current <= min) return this.setScroll(min - this.getViewportSize());
533
- if (current > max) {
534
- return this.setScroll(max - this.getViewportSize() - 100);
535
- }
536
- }
537
- }, {
538
- key: 'getVisibleRange',
539
- value: function getVisibleRange() {
540
- var _state4 = this.state,
541
- from = _state4.from,
542
- size = _state4.size;
543
-
544
- var _getStartAndEnd4 = this.getStartAndEnd(0),
545
- start = _getStartAndEnd4.start,
546
- end = _getStartAndEnd4.end;
547
-
548
- var cache = {};
549
- var first = void 0,
550
- last = void 0;
551
- for (var i = from; i < from + size; ++i) {
552
- var itemStart = this.getSpaceBefore(i, cache);
553
- var itemEnd = itemStart + this.getSizeOfItem(i);
554
- if (first == null && itemEnd > start) first = i;
555
- if (first != null && itemStart < end) last = i;
556
- }
557
- return [first, last];
558
- }
559
- //this can be used as a static method via the react list ref
560
-
561
- }, {
562
- key: 'getFractionalVisibleRange',
563
- value: function getFractionalVisibleRange() {
564
- var _state5 = this.state,
565
- from = _state5.from,
566
- size = _state5.size;
567
-
568
- var _getStartAndEnd5 = this.getStartAndEnd(0),
569
- start = _getStartAndEnd5.start,
570
- end = _getStartAndEnd5.end;
571
-
572
- var cache = {};
573
- var first = void 0,
574
- last = void 0;
575
-
576
- for (var i = from; i < from + size; ++i) {
577
- var itemStart = this.getSpaceBefore(i, cache);
578
- var itemEnd = itemStart + this.getSizeOfItem(i);
579
- if (first == null && itemEnd > start) {
580
- first = i + 1 - (itemEnd - start) / (itemEnd - itemStart);
581
- }
582
- if (first != null && itemStart < end) {
583
- last = i - (itemEnd - end) / (itemEnd - itemStart);
584
- }
585
- }
586
- return [first, last];
587
- }
588
- }, {
589
- key: 'renderItems',
590
- value: function renderItems() {
591
- var _this3 = this;
592
-
593
- var _props7 = this.props,
594
- itemRenderer = _props7.itemRenderer,
595
- itemsRenderer = _props7.itemsRenderer;
596
- var _state6 = this.state,
597
- from = _state6.from,
598
- size = _state6.size;
599
-
600
- var items = [];
601
- for (var i = 0; i < size; ++i) {
602
- items.push(itemRenderer(from + i, i));
603
- }return itemsRenderer(items, function (c) {
604
- return _this3.items = c;
605
- });
606
- }
607
- }, {
608
- key: 'render',
609
- value: function render() {
610
- var _this4 = this;
611
-
612
- var _props8 = this.props,
613
- axis = _props8.axis,
614
- length = _props8.length,
615
- type = _props8.type;
616
- var _state7 = this.state,
617
- from = _state7.from,
618
- itemsPerRow = _state7.itemsPerRow;
619
-
620
- var items = this.renderItems();
621
- if (type === 'simple') return items;
622
-
623
- var style = { position: 'relative' };
624
- var cache = {};
625
- var bottom = Math.ceil(length / itemsPerRow) * itemsPerRow;
626
- var size = this.getSpaceBefore(bottom, cache);
627
- if (size) {
628
- style[SIZE_KEYS[axis]] = size;
629
- if (axis === 'x') style.overflowX = 'hidden';
630
- }
631
- var offset = this.getSpaceBefore(from, cache);
632
- var x = axis === 'x' ? offset : 0;
633
- var y = axis === 'y' ? offset : 0;
634
- var listStyle = {
635
- //tnr trying out: https://github.com/coderiety/react-list/pull/154
636
- position: 'relative',
637
- top: y,
638
- left: x
639
- };
640
- return React.createElement(
641
- 'div',
642
- {
643
- style: style,
644
- ref: function ref(c) {
645
- if (c) _this4.el = c;
646
- }
647
- },
648
- React.createElement(
649
- 'div',
650
- { style: listStyle },
651
- items
652
- )
653
- );
654
- }
655
- }]);
656
-
657
- return ReactList;
658
- }(React.Component);
659
-
660
- ReactList.displayName = 'ReactList';
661
- ReactList.propTypes = {
662
- axis: PropTypes.oneOf(['x', 'y']),
663
- initialIndex: PropTypes.number,
664
- itemRenderer: PropTypes.func,
665
- itemSizeEstimator: PropTypes.func,
666
- itemSizeGetter: PropTypes.func,
667
- itemsRenderer: PropTypes.func,
668
- length: PropTypes.number,
669
- minSize: PropTypes.number,
670
- pageSize: PropTypes.number,
671
- scrollParentGetter: PropTypes.func,
672
- threshold: PropTypes.number,
673
- type: PropTypes.oneOf(['simple', 'variable', 'uniform']),
674
- useStaticSize: PropTypes.bool,
675
- useTranslate3d: PropTypes.bool
676
- };
677
- ReactList.defaultProps = {
678
- axis: 'y',
679
- itemRenderer: function itemRenderer(index, key) {
680
- return React.createElement(
681
- 'div',
682
- { key: key },
683
- index
684
- );
685
- },
686
- itemsRenderer: function itemsRenderer(items, ref) {
687
- return React.createElement(
688
- 'div',
689
- { ref: ref },
690
- items
691
- );
692
- },
693
- length: 0,
694
- minSize: 1,
695
- pageSize: 10,
696
- threshold: 100,
697
- type: 'simple',
698
- useStaticSize: false,
699
- useTranslate3d: false
700
- };
701
- export default ReactList;
702
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZWFjdExpc3QuanMiXSwibmFtZXMiOlsiUHJvcFR5cGVzIiwiUmVhY3QiLCJDTElFTlRfU0laRV9LRVlTIiwieCIsInkiLCJDTElFTlRfU1RBUlRfS0VZUyIsIklOTkVSX1NJWkVfS0VZUyIsIk9GRlNFVF9TSVpFX0tFWVMiLCJPRkZTRVRfU1RBUlRfS0VZUyIsIk9WRVJGTE9XX0tFWVMiLCJTQ1JPTExfU0laRV9LRVlTIiwiU0NST0xMX1NUQVJUX0tFWVMiLCJTSVpFX0tFWVMiLCJOT09QIiwiUEFTU0lWRSIsIndpbmRvdyIsImhhc1N1cHBvcnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicGFzc2l2ZSIsImUiLCJVTlNUQUJMRV9NRVNTQUdFIiwiTUFYX1NZTkNfVVBEQVRFUyIsImlzRXF1YWxTdWJzZXQiLCJhIiwiYiIsImtleSIsIlJlYWN0TGlzdCIsInByb3BzIiwiaW5pdGlhbEluZGV4IiwiaXRlbXNQZXJSb3ciLCJjb25zdHJhaW4iLCJmcm9tIiwic2l6ZSIsInN0YXRlIiwiY2FjaGUiLCJwcmV2UHJldlN0YXRlIiwidW5zdGFibGUiLCJ1cGRhdGVDb3VudGVyIiwidXBkYXRlRnJhbWUiLCJiaW5kIiwic2Nyb2xsVG8iLCJjb25zb2xlIiwiZXJyb3IiLCJ1cGRhdGVDb3VudGVyVGltZW91dElkIiwic2V0VGltZW91dCIsImNiIiwicm93VG9GaXhTY3JvbGwiLCJyb3ciLCJzZXRTdGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzY3JvbGxQYXJlbnQiLCJlbCIsImF4aXMiLCJvZmZzZXQiLCJvZmZzZXRLZXkiLCJvZmZzZXRQYXJlbnQiLCJpdGVtcyIsInNjcm9sbFBhcmVudEdldHRlciIsImdldEVsIiwib3ZlcmZsb3dLZXkiLCJwYXJlbnRFbGVtZW50IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInNjcm9sbEtleSIsImFjdHVhbCIsImJvZHkiLCJkb2N1bWVudEVsZW1lbnQiLCJtYXgiLCJnZXRTY3JvbGxTaXplIiwiZ2V0Vmlld3BvcnRTaXplIiwic2Nyb2xsIiwiTWF0aCIsIm1pbiIsImdldE9mZnNldCIsIml0ZW1TaXplR2V0dGVyIiwidHlwZSIsInRocmVzaG9sZCIsImdldFNjcm9sbFBvc2l0aW9uIiwic3RhcnQiLCJlbmQiLCJoYXNEZXRlcm1pbmF0ZVNpemUiLCJnZXRTcGFjZUJlZm9yZSIsImxlbmd0aCIsInVzZVN0YXRpY1NpemUiLCJpdGVtU2l6ZSIsIml0ZW1FbHMiLCJjaGlsZHJlbiIsImZpcnN0RWwiLCJmaXJzdEVsU2l6ZSIsImRlbHRhIiwiYWJzIiwiaXNOYU4iLCJzdGFydEtleSIsImZpcnN0U3RhcnQiLCJpdGVtIiwidXBkYXRlU2Nyb2xsUGFyZW50IiwidXBkYXRlU2ltcGxlRnJhbWUiLCJ1cGRhdGVWYXJpYWJsZUZyYW1lIiwidXBkYXRlVW5pZm9ybUZyYW1lIiwicHJldiIsImdldFNjcm9sbFBhcmVudCIsImdldFN0YXJ0QW5kRW5kIiwiZWxFbmQiLCJmaXJzdEl0ZW1FbCIsImxhc3RJdGVtRWwiLCJwYWdlU2l6ZSIsIm1heWJlU2V0U3RhdGUiLCJjYWNoZVNpemVzIiwic3BhY2UiLCJtYXhGcm9tIiwiZ2V0U2l6ZU9mSXRlbSIsIm1heFNpemUiLCJnZXRJdGVtU2l6ZUFuZEl0ZW1zUGVyUm93IiwiZmxvb3IiLCJjZWlsIiwiaW5kZXgiLCJpIiwic2l6ZUtleSIsImwiLCJpdGVtU2l6ZUVzdGltYXRvciIsIml0ZW1FbCIsIm1pblNpemUiLCJtb2QiLCJzZXRTY3JvbGwiLCJjdXJyZW50IiwiYm90dG9tIiwidG9wIiwiZmlyc3QiLCJsYXN0IiwiaXRlbVN0YXJ0IiwiaXRlbUVuZCIsIml0ZW1SZW5kZXJlciIsIml0ZW1zUmVuZGVyZXIiLCJwdXNoIiwiYyIsInJlbmRlckl0ZW1zIiwic3R5bGUiLCJwb3NpdGlvbiIsIm92ZXJmbG93WCIsImxpc3RTdHlsZSIsImxlZnQiLCJDb21wb25lbnQiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIm9uZU9mIiwibnVtYmVy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InNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cbi8qIGVzbGludC1kaXNhYmxlIGRlZmF1bHQtY2FzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgZGVmYXVsdC1jYXNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuLy8gaW1wb3J0IG1vZHVsZSBmcm9tICdtb2R1bGUnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IENMSUVOVF9TSVpFX0tFWVMgPSB7IHg6ICdjbGllbnRXaWR0aCcsIHk6ICdjbGllbnRIZWlnaHQnIH07XG5jb25zdCBDTElFTlRfU1RBUlRfS0VZUyA9IHsgeDogJ2NsaWVudFRvcCcsIHk6ICdjbGllbnRMZWZ0JyB9O1xuY29uc3QgSU5ORVJfU0laRV9LRVlTID0geyB4OiAnaW5uZXJXaWR0aCcsIHk6ICdpbm5lckhlaWdodCcgfTtcbmNvbnN0IE9GRlNFVF9TSVpFX0tFWVMgPSB7IHg6ICdvZmZzZXRXaWR0aCcsIHk6ICdvZmZzZXRIZWlnaHQnIH07XG5jb25zdCBPRkZTRVRfU1RBUlRfS0VZUyA9IHsgeDogJ29mZnNldExlZnQnLCB5OiAnb2Zmc2V0VG9wJyB9O1xuY29uc3QgT1ZFUkZMT1dfS0VZUyA9IHsgeDogJ292ZXJmbG93WCcsIHk6ICdvdmVyZmxvd1knIH07XG5jb25zdCBTQ1JPTExfU0laRV9LRVlTID0geyB4OiAnc2Nyb2xsV2lkdGgnLCB5OiAnc2Nyb2xsSGVpZ2h0JyB9O1xuY29uc3QgU0NST0xMX1NUQVJUX0tFWVMgPSB7IHg6ICdzY3JvbGxMZWZ0JywgeTogJ3Njcm9sbFRvcCcgfTtcbmNvbnN0IFNJWkVfS0VZUyA9IHsgeDogJ21pbldpZHRoJywgeTogJ21pbkhlaWdodCcgfTtcblxuY29uc3QgTk9PUCA9ICgpID0+IHt9O1xuXG4vLyBJZiBhIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBgb3B0aW9uc2AgYXJndW1lbnQgdG9cbi8vIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLCB3ZSBuZWVkIHRvIGNoZWNrLCBvdGhlcndpc2Ugd2Ugd2lsbFxuLy8gYWNjaWRlbnRhbGx5IHNldCBgY2FwdHVyZWAgd2l0aCBhIHRydXRoeSB2YWx1ZS5cbmNvbnN0IFBBU1NJVkUgPSAoKCkgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcbiAgbGV0IGhhc1N1cHBvcnQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgTk9PUCwge1xuICAgICAgZ2V0IHBhc3NpdmUoKSB7XG4gICAgICAgIGhhc1N1cHBvcnQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBub29wXG4gIH1cbiAgcmV0dXJuIGhhc1N1cHBvcnQ7XG59KSgpXG4gID8geyBwYXNzaXZlOiB0cnVlIH1cbiAgOiBmYWxzZTtcblxuY29uc3QgVU5TVEFCTEVfTUVTU0FHRSA9ICdSZWFjdExpc3QgZmFpbGVkIHRvIHJlYWNoIGEgc3RhYmxlIHN0YXRlLic7XG5jb25zdCBNQVhfU1lOQ19VUERBVEVTID0gMTAwO1xuXG5jb25zdCBpc0VxdWFsU3Vic2V0ID0gKGEsIGIpID0+IHtcbiAgZm9yIChjb25zdCBrZXkgaW4gYikgaWYgKGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFjdExpc3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgZGlzcGxheU5hbWUgPSAnUmVhY3RMaXN0JztcblxuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGF4aXM6IFByb3BUeXBlcy5vbmVPZihbJ3gnLCAneSddKSxcbiAgICBpbml0aWFsSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaXRlbVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpdGVtU2l6ZUVzdGltYXRvcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaXRlbVNpemVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGl0ZW1zUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGxlbmd0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBtaW5TaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHBhZ2VTaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHNjcm9sbFBhcmVudEdldHRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgdGhyZXNob2xkOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHR5cGU6IFByb3BUeXBlcy5vbmVPZihbJ3NpbXBsZScsICd2YXJpYWJsZScsICd1bmlmb3JtJ10pLFxuICAgIHVzZVN0YXRpY1NpemU6IFByb3BUeXBlcy5ib29sLFxuICAgIHVzZVRyYW5zbGF0ZTNkOiBQcm9wVHlwZXMuYm9vbFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgYXhpczogJ3knLFxuICAgIGl0ZW1SZW5kZXJlcjogKGluZGV4LCBrZXkpID0+IDxkaXYga2V5PXtrZXl9PntpbmRleH08L2Rpdj4sXG4gICAgaXRlbXNSZW5kZXJlcjogKGl0ZW1zLCByZWYpID0+IDxkaXYgcmVmPXtyZWZ9PntpdGVtc308L2Rpdj4sXG4gICAgbGVuZ3RoOiAwLFxuICAgIG1pblNpemU6IDEsXG4gICAgcGFnZVNpemU6IDEwLFxuICAgIHRocmVzaG9sZDogMTAwLFxuICAgIHR5cGU6ICdzaW1wbGUnLFxuICAgIHVzZVN0YXRpY1NpemU6IGZhbHNlLFxuICAgIHVzZVRyYW5zbGF0ZTNkOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIGNvbnN0IHsgaW5pdGlhbEluZGV4IH0gPSBwcm9wcztcbiAgICBjb25zdCBpdGVtc1BlclJvdyA9IDE7XG4gICAgY29uc3QgeyBmcm9tLCBzaXplIH0gPSB0aGlzLmNvbnN0cmFpbihpbml0aWFsSW5kZXgsIDAsIGl0ZW1zUGVyUm93LCBwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHsgZnJvbSwgc2l6ZSwgaXRlbXNQZXJSb3cgfTtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5wcmV2UHJldlN0YXRlID0ge307XG4gICAgdGhpcy51bnN0YWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlQ291bnRlciA9IDA7XG4gIH1cblxuICAvL3RucjogY29tbWVudGluZyB0aGlzIG91dC4uIG5vdCBzdXJlIGlmIGl0IGlzIGFjdHVhbGx5IG5lZWRlZFxuICAvLyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgLy8gICBsZXQgeyBmcm9tLCBzaXplLCBpdGVtc1BlclJvdyB9ID0gdGhpcy5zdGF0ZTtcbiAgLy8gICBpZiAobmV4dFByb3BzLmNsZWFyQ2FjaGUpIHRoaXMuY2FjaGUgPSB7fTtcbiAgLy8gICB0aGlzLm1heWJlU2V0U3RhdGUoXG4gIC8vICAgICB0aGlzLmNvbnN0cmFpbihmcm9tLCBzaXplLCBpdGVtc1BlclJvdywgbmV4dFByb3BzKSxcbiAgLy8gICAgIE5PT1BcbiAgLy8gICApO1xuICAvLyB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy51cGRhdGVGcmFtZSA9IHRoaXMudXBkYXRlRnJhbWUuYmluZCh0aGlzKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy51cGRhdGVGcmFtZSk7XG4gICAgdGhpcy51cGRhdGVGcmFtZSh0aGlzLnNjcm9sbFRvLmJpbmQodGhpcywgdGhpcy5wcm9wcy5pbml0aWFsSW5kZXgpKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAvLyBJZiB0aGUgbGlzdCBoYXMgcmVhY2hlZCBhbiB1bnN0YWJsZSBzdGF0ZSwgcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLlxuICAgIGlmICh0aGlzLnVuc3RhYmxlKSByZXR1cm47XG5cbiAgICBpZiAoKyt0aGlzLnVwZGF0ZUNvdW50ZXIgPiBNQVhfU1lOQ19VUERBVEVTKSB7XG4gICAgICB0aGlzLnVuc3RhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFVOU1RBQkxFX01FU1NBR0UpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51cGRhdGVDb3VudGVyVGltZW91dElkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvdW50ZXJUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDb3VudGVyID0gMDtcbiAgICAgICAgZGVsZXRlIHRoaXMudXBkYXRlQ291bnRlclRpbWVvdXRJZDtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICAvLyB0aGlzLmRvbnRVcGRhdGUgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlRnJhbWUoKTtcblxuICAgIC8vVE5SOiBleHRyYSBjb2RlIHRvICdmaXgnIHRoZSBzY3JvbGwgaGVpZ2h0IHdoZW4gc2Nyb2xsaW5nIHVwd2FyZHNcbiAgICAvL3RuciBjb21tZW50aW5nIHRoaXMgb3V0IGJlY2F1c2Ugd2UgYXJlIG5vdyBkb2luZyBhIGJldHRlciBqb2Igb2YgY2FsY3VsYXRpbmcgcm93IGhlaWdodHNcbiAgICAvLyBpZiAodGhpcy5yb3dUb0ZpeFNjcm9sbCkge1xuICAgIC8vICAgY29uc3QgeyByb3csIGNhY2hlOiBwcmV2aW91c1NpemUgfSA9IHRoaXMucm93VG9GaXhTY3JvbGw7XG4gICAgLy8gICBjb25zdCBhY3R1YWxTaXplID0gdGhpcy5jYWNoZVtyb3ddO1xuICAgIC8vICAgaWYgKGFjdHVhbFNpemUgJiYgYWN0dWFsU2l6ZSAhPT0gcHJldmlvdXNTaXplKSB7XG4gICAgLy8gICAgIHRoaXMuZ2V0U2Nyb2xsUGFyZW50KCkuc2Nyb2xsQnkoe1xuICAgIC8vICAgICAgIHRvcDogLShcbiAgICAvLyAgICAgICAgIChwcmV2aW91c1NpemUgfHwgdGhpcy5wcm9wcy5pdGVtU2l6ZUVzdGltYXRvcihyb3csIHt9KSkgLSBhY3R1YWxTaXplXG4gICAgLy8gICAgICAgKVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgdGhpcy5yb3dUb0ZpeFNjcm9sbCA9IG51bGw7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG4gIC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgLy8gICBpZiAodGhpcy5kb250VXBkYXRlKSB7XG4gIC8vICAgICB0aGlzLmRvbnRVcGRhdGUgPSBmYWxzZTtcbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIHRydWU7XG4gIC8vIH1cbiAgbWF5YmVTZXRTdGF0ZShiLCBjYikge1xuICAgIGlmIChpc0VxdWFsU3Vic2V0KHRoaXMuc3RhdGUsIGIpKSByZXR1cm4gY2IoKTtcblxuICAgIC8vVE5SOiBleHRyYSBjb2RlIHRvICdmaXgnIHRoZSBzY3JvbGwgaGVpZ2h0IHdoZW4gc2Nyb2xsaW5nIHVwd2FyZHNcbiAgICBpZiAodGhpcy5zdGF0ZS5mcm9tID09PSBiLmZyb20gKyAxKSB7XG4gICAgICB0aGlzLnJvd1RvRml4U2Nyb2xsID0geyByb3c6IGIuZnJvbSwgY2FjaGU6IHRoaXMuY2FjaGVbYi5mcm9tXSB9O1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKGIsIGNiKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnVwZGF0ZUZyYW1lKTtcbiAgICB0aGlzLnNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnVwZGF0ZUZyYW1lLCBQQVNTSVZFKTtcbiAgICB0aGlzLnNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgTk9PUCwgUEFTU0lWRSk7XG4gIH1cblxuICBnZXRPZmZzZXQoZWwpIHtcbiAgICBjb25zdCB7IGF4aXMgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IG9mZnNldCA9IGVsW0NMSUVOVF9TVEFSVF9LRVlTW2F4aXNdXSB8fCAwO1xuICAgIGNvbnN0IG9mZnNldEtleSA9IE9GRlNFVF9TVEFSVF9LRVlTW2F4aXNdO1xuICAgIGRvIG9mZnNldCArPSBlbFtvZmZzZXRLZXldIHx8IDA7XG4gICAgd2hpbGUgKChlbCA9IGVsLm9mZnNldFBhcmVudCkpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cblxuICBnZXRFbCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbCB8fCB0aGlzLml0ZW1zO1xuICB9XG5cbiAgZ2V0U2Nyb2xsUGFyZW50KCkge1xuICAgIGNvbnN0IHsgYXhpcywgc2Nyb2xsUGFyZW50R2V0dGVyIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChzY3JvbGxQYXJlbnRHZXR0ZXIpIHJldHVybiBzY3JvbGxQYXJlbnRHZXR0ZXIoKTtcbiAgICBsZXQgZWwgPSB0aGlzLmdldEVsKCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuIHdpbmRvdztcbiAgICBjb25zdCBvdmVyZmxvd0tleSA9IE9WRVJGTE9XX0tFWVNbYXhpc107XG4gICAgd2hpbGUgKChlbCA9IGVsLnBhcmVudEVsZW1lbnQpKSB7XG4gICAgICBzd2l0Y2ggKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVtvdmVyZmxvd0tleV0pIHtcbiAgICAgICAgY2FzZSAnYXV0byc6XG4gICAgICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgICAgIGNhc2UgJ292ZXJsYXknOlxuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGdldFNjcm9sbFBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHsgc2Nyb2xsUGFyZW50IH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBzY3JvbGxLZXkgPSBTQ1JPTExfU1RBUlRfS0VZU1theGlzXTtcbiAgICBjb25zdCBhY3R1YWwgPVxuICAgICAgc2Nyb2xsUGFyZW50ID09PSB3aW5kb3dcbiAgICAgICAgPyAvLyBGaXJlZm94IGFsd2F5cyByZXR1cm5zIGRvY3VtZW50LmJvZHlbc2Nyb2xsS2V5XSBhcyAwIGFuZCBDaHJvbWUvU2FmYXJpXG4gICAgICAgICAgLy8gYWx3YXlzIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbc2Nyb2xsS2V5XSBhcyAwLCBzbyB0YWtlXG4gICAgICAgICAgLy8gd2hpY2hldmVyIGhhcyBhIHZhbHVlLlxuICAgICAgICAgIGRvY3VtZW50LmJvZHlbc2Nyb2xsS2V5XSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbc2Nyb2xsS2V5XVxuICAgICAgICA6IHNjcm9sbFBhcmVudFtzY3JvbGxLZXldO1xuICAgIGNvbnN0IG1heCA9IHRoaXMuZ2V0U2Nyb2xsU2l6ZSgpIC0gdGhpcy5nZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBzY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihhY3R1YWwsIG1heCkpO1xuICAgIGNvbnN0IGVsID0gdGhpcy5nZXRFbCgpO1xuICAgIHJldHVybiB0aGlzLmdldE9mZnNldChzY3JvbGxQYXJlbnQpICsgc2Nyb2xsIC0gdGhpcy5nZXRPZmZzZXQoZWwpO1xuICB9XG5cbiAgc2V0U2Nyb2xsKG9mZnNldCkge1xuICAgIGNvbnN0IHsgc2Nyb2xsUGFyZW50IH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgYXhpcyB9ID0gdGhpcy5wcm9wcztcbiAgICBvZmZzZXQgKz0gdGhpcy5nZXRPZmZzZXQodGhpcy5nZXRFbCgpKTtcbiAgICBpZiAoc2Nyb2xsUGFyZW50ID09PSB3aW5kb3cpIHJldHVybiB3aW5kb3cuc2Nyb2xsVG8oMCwgb2Zmc2V0KTtcblxuICAgIG9mZnNldCAtPSB0aGlzLmdldE9mZnNldCh0aGlzLnNjcm9sbFBhcmVudCk7XG4gICAgc2Nyb2xsUGFyZW50W1NDUk9MTF9TVEFSVF9LRVlTW2F4aXNdXSA9IG9mZnNldDtcbiAgfVxuXG4gIGdldFZpZXdwb3J0U2l6ZSgpIHtcbiAgICBjb25zdCB7IHNjcm9sbFBhcmVudCB9ID0gdGhpcztcbiAgICBjb25zdCB7IGF4aXMgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIHNjcm9sbFBhcmVudCA9PT0gd2luZG93XG4gICAgICA/IHdpbmRvd1tJTk5FUl9TSVpFX0tFWVNbYXhpc11dXG4gICAgICA6IHNjcm9sbFBhcmVudFtDTElFTlRfU0laRV9LRVlTW2F4aXNdXTtcbiAgfVxuXG4gIGdldFNjcm9sbFNpemUoKSB7XG4gICAgY29uc3QgeyBzY3JvbGxQYXJlbnQgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBib2R5LCBkb2N1bWVudEVsZW1lbnQgfSA9IGRvY3VtZW50O1xuICAgIGNvbnN0IGtleSA9IFNDUk9MTF9TSVpFX0tFWVNbdGhpcy5wcm9wcy5heGlzXTtcbiAgICByZXR1cm4gc2Nyb2xsUGFyZW50ID09PSB3aW5kb3dcbiAgICAgID8gTWF0aC5tYXgoYm9keVtrZXldLCBkb2N1bWVudEVsZW1lbnRba2V5XSlcbiAgICAgIDogc2Nyb2xsUGFyZW50W2tleV07XG4gIH1cblxuICBoYXNEZXRlcm1pbmF0ZVNpemUoKSB7XG4gICAgY29uc3QgeyBpdGVtU2l6ZUdldHRlciwgdHlwZSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gdHlwZSA9PT0gJ3VuaWZvcm0nIHx8IGl0ZW1TaXplR2V0dGVyO1xuICB9XG5cbiAgZ2V0U3RhcnRBbmRFbmQodGhyZXNob2xkID0gdGhpcy5wcm9wcy50aHJlc2hvbGQpIHtcbiAgICBjb25zdCBzY3JvbGwgPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBzY3JvbGwgLSB0aHJlc2hvbGQpO1xuICAgIGxldCBlbmQgPSBzY3JvbGwgKyB0aGlzLmdldFZpZXdwb3J0U2l6ZSgpICsgdGhyZXNob2xkO1xuICAgIGlmICh0aGlzLmhhc0RldGVybWluYXRlU2l6ZSgpKSB7XG4gICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIHRoaXMuZ2V0U3BhY2VCZWZvcmUodGhpcy5wcm9wcy5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICB9XG5cbiAgZ2V0SXRlbVNpemVBbmRJdGVtc1BlclJvdygpIHtcbiAgICBjb25zdCB7IGF4aXMsIHVzZVN0YXRpY1NpemUgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHsgaXRlbVNpemUsIGl0ZW1zUGVyUm93IH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh1c2VTdGF0aWNTaXplICYmIGl0ZW1TaXplICYmIGl0ZW1zUGVyUm93KSB7XG4gICAgICByZXR1cm4geyBpdGVtU2l6ZSwgaXRlbXNQZXJSb3cgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtRWxzID0gdGhpcy5pdGVtcy5jaGlsZHJlbjtcbiAgICBpZiAoIWl0ZW1FbHMubGVuZ3RoKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBmaXJzdEVsID0gaXRlbUVsc1swXTtcblxuICAgIC8vIEZpcmVmb3ggaGFzIGEgcHJvYmxlbSB3aGVyZSBpdCB3aWxsIHJldHVybiBhICpzbGlnaHRseSogKGxlc3MgdGhhblxuICAgIC8vIHRob3VzYW5kdGhzIG9mIGEgcGl4ZWwpIGRpZmZlcmVudCBzaXplIGZvciB0aGUgc2FtZSBlbGVtZW50IGJldHdlZW5cbiAgICAvLyByZW5kZXJzLiBUaGlzIGNhbiBjYXVzZSBhbiBpbmZpbml0ZSByZW5kZXIgbG9vcCwgc28gb25seSBjaGFuZ2UgdGhlXG4gICAgLy8gaXRlbVNpemUgd2hlbiBpdCBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudC5cbiAgICBjb25zdCBmaXJzdEVsU2l6ZSA9IGZpcnN0RWxbT0ZGU0VUX1NJWkVfS0VZU1theGlzXV07XG4gICAgY29uc3QgZGVsdGEgPSBNYXRoLmFicyhmaXJzdEVsU2l6ZSAtIGl0ZW1TaXplKTtcbiAgICBpZiAoaXNOYU4oZGVsdGEpIHx8IGRlbHRhID49IDEpIGl0ZW1TaXplID0gZmlyc3RFbFNpemU7XG5cbiAgICBpZiAoIWl0ZW1TaXplKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBzdGFydEtleSA9IE9GRlNFVF9TVEFSVF9LRVlTW2F4aXNdO1xuICAgIGNvbnN0IGZpcnN0U3RhcnQgPSBmaXJzdEVsW3N0YXJ0S2V5XTtcbiAgICBpdGVtc1BlclJvdyA9IDE7XG4gICAgZm9yIChcbiAgICAgIGxldCBpdGVtID0gaXRlbUVsc1tpdGVtc1BlclJvd107XG4gICAgICBpdGVtICYmIGl0ZW1bc3RhcnRLZXldID09PSBmaXJzdFN0YXJ0O1xuICAgICAgaXRlbSA9IGl0ZW1FbHNbaXRlbXNQZXJSb3ddXG4gICAgKSB7XG4gICAgICArK2l0ZW1zUGVyUm93O1xuICAgIH1cblxuICAgIHJldHVybiB7IGl0ZW1TaXplLCBpdGVtc1BlclJvdyB9O1xuICB9XG5cbiAgdXBkYXRlRnJhbWUoY2IpIHtcbiAgICB0aGlzLnVwZGF0ZVNjcm9sbFBhcmVudCgpO1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gTk9PUDtcbiAgICBzd2l0Y2ggKHRoaXMucHJvcHMudHlwZSkge1xuICAgICAgY2FzZSAnc2ltcGxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2ltcGxlRnJhbWUoY2IpO1xuICAgICAgY2FzZSAndmFyaWFibGUnOlxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVWYXJpYWJsZUZyYW1lKGNiKTtcbiAgICAgIGNhc2UgJ3VuaWZvcm0nOlxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVVbmlmb3JtRnJhbWUoY2IpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNjcm9sbFBhcmVudCgpIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5zY3JvbGxQYXJlbnQ7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHJldHVybjsgLy9odHRwczovL2dpdGh1Yi5jb20vY29kZXJpZXR5L3JlYWN0LWxpc3QvcHVsbC8xOTZcbiAgICB9XG4gICAgdGhpcy5zY3JvbGxQYXJlbnQgPSB0aGlzLmdldFNjcm9sbFBhcmVudCgpO1xuICAgIGlmIChwcmV2ID09PSB0aGlzLnNjcm9sbFBhcmVudCkgcmV0dXJuO1xuICAgIGlmIChwcmV2KSB7XG4gICAgICBwcmV2LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudXBkYXRlRnJhbWUpO1xuICAgICAgcHJldi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgTk9PUCk7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudXBkYXRlRnJhbWUsIFBBU1NJVkUpO1xuICAgIHRoaXMuc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBOT09QLCBQQVNTSVZFKTtcbiAgfVxuXG4gIHVwZGF0ZVNpbXBsZUZyYW1lKGNiKSB7XG4gICAgY29uc3QgeyBlbmQgfSA9IHRoaXMuZ2V0U3RhcnRBbmRFbmQoKTtcbiAgICBjb25zdCBpdGVtRWxzID0gdGhpcy5pdGVtcy5jaGlsZHJlbjtcbiAgICBsZXQgZWxFbmQgPSAwO1xuXG4gICAgaWYgKGl0ZW1FbHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IGF4aXMgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBmaXJzdEl0ZW1FbCA9IGl0ZW1FbHNbMF07XG4gICAgICBjb25zdCBsYXN0SXRlbUVsID0gaXRlbUVsc1tpdGVtRWxzLmxlbmd0aCAtIDFdO1xuICAgICAgZWxFbmQgPVxuICAgICAgICB0aGlzLmdldE9mZnNldChsYXN0SXRlbUVsKSArXG4gICAgICAgIGxhc3RJdGVtRWxbT0ZGU0VUX1NJWkVfS0VZU1theGlzXV0gLVxuICAgICAgICB0aGlzLmdldE9mZnNldChmaXJzdEl0ZW1FbCk7XG4gICAgfVxuXG4gICAgaWYgKGVsRW5kID4gZW5kKSByZXR1cm4gY2IoKTtcblxuICAgIGNvbnN0IHsgcGFnZVNpemUsIGxlbmd0aCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBzaXplID0gTWF0aC5taW4odGhpcy5zdGF0ZS5zaXplICsgcGFnZVNpemUsIGxlbmd0aCk7XG4gICAgdGhpcy5tYXliZVNldFN0YXRlKHsgc2l6ZSB9LCBjYik7XG4gIH1cblxuICB1cGRhdGVWYXJpYWJsZUZyYW1lKGNiKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLml0ZW1TaXplR2V0dGVyKSB0aGlzLmNhY2hlU2l6ZXMoKTtcblxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5nZXRTdGFydEFuZEVuZCgpO1xuICAgIGNvbnN0IHsgbGVuZ3RoLCBwYWdlU2l6ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgc3BhY2UgPSAwO1xuICAgIGxldCBmcm9tID0gMDtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgY29uc3QgbWF4RnJvbSA9IGxlbmd0aCAtIDE7XG5cbiAgICB3aGlsZSAoZnJvbSA8IG1heEZyb20pIHtcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdGhpcy5nZXRTaXplT2ZJdGVtKGZyb20pO1xuICAgICAgaWYgKGl0ZW1TaXplID09IG51bGwgfHwgc3BhY2UgKyBpdGVtU2l6ZSA+IHN0YXJ0KSBicmVhaztcbiAgICAgIHNwYWNlICs9IGl0ZW1TaXplO1xuICAgICAgKytmcm9tO1xuICAgIH1cblxuICAgIGNvbnN0IG1heFNpemUgPSBsZW5ndGggLSBmcm9tO1xuXG4gICAgd2hpbGUgKHNpemUgPCBtYXhTaXplICYmIHNwYWNlIDwgZW5kKSB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHRoaXMuZ2V0U2l6ZU9mSXRlbShmcm9tICsgc2l6ZSk7XG4gICAgICBpZiAoaXRlbVNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplID0gTWF0aC5taW4oc2l6ZSArIHBhZ2VTaXplLCBtYXhTaXplKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzcGFjZSArPSBpdGVtU2l6ZTtcbiAgICAgICsrc2l6ZTtcbiAgICB9XG4gICAgdGhpcy5tYXliZVNldFN0YXRlKHsgZnJvbSwgc2l6ZSB9LCBjYik7XG4gIH1cblxuICB1cGRhdGVVbmlmb3JtRnJhbWUoY2IpIHtcbiAgICBjb25zdCB7IGl0ZW1TaXplLCBpdGVtc1BlclJvdyB9ID0gdGhpcy5nZXRJdGVtU2l6ZUFuZEl0ZW1zUGVyUm93KCk7XG5cbiAgICBpZiAoIWl0ZW1TaXplIHx8ICFpdGVtc1BlclJvdykgcmV0dXJuIGNiKCk7XG5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMuZ2V0U3RhcnRBbmRFbmQoKTtcblxuICAgIGNvbnN0IHsgZnJvbSwgc2l6ZSB9ID0gdGhpcy5jb25zdHJhaW4oXG4gICAgICBNYXRoLmZsb29yKHN0YXJ0IC8gaXRlbVNpemUpICogaXRlbXNQZXJSb3csXG4gICAgICAoTWF0aC5jZWlsKChlbmQgLSBzdGFydCkgLyBpdGVtU2l6ZSkgKyAxKSAqIGl0ZW1zUGVyUm93LFxuICAgICAgaXRlbXNQZXJSb3csXG4gICAgICB0aGlzLnByb3BzXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLm1heWJlU2V0U3RhdGUoeyBpdGVtc1BlclJvdywgZnJvbSwgaXRlbVNpemUsIHNpemUgfSwgY2IpO1xuICB9XG5cbiAgZ2V0U3BhY2VCZWZvcmUoaW5kZXgsIGNhY2hlID0ge30pIHtcbiAgICBpZiAoY2FjaGVbaW5kZXhdICE9IG51bGwpIHJldHVybiBjYWNoZVtpbmRleF07XG5cbiAgICAvLyBUcnkgdGhlIHN0YXRpYyBpdGVtU2l6ZS5cbiAgICBjb25zdCB7IGl0ZW1TaXplLCBpdGVtc1BlclJvdyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoaXRlbVNpemUpIHtcbiAgICAgIHJldHVybiAoY2FjaGVbaW5kZXhdID0gTWF0aC5mbG9vcihpbmRleCAvIGl0ZW1zUGVyUm93KSAqIGl0ZW1TaXplKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IHNwYWNlIHRvIGluZGV4IHRoZXJlIGlzIGEgY2FjaGVkIHZhbHVlIGZvci5cbiAgICBsZXQgZnJvbSA9IGluZGV4O1xuICAgIHdoaWxlIChmcm9tID4gMCAmJiBjYWNoZVstLWZyb21dID09IG51bGwpO1xuXG4gICAgLy8gRmluYWxseSwgYWNjdW11bGF0ZSBzaXplcyBvZiBpdGVtcyBmcm9tIC0gaW5kZXguXG4gICAgbGV0IHNwYWNlID0gY2FjaGVbZnJvbV0gfHwgMDtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IGluZGV4OyArK2kpIHtcbiAgICAgIGNhY2hlW2ldID0gc3BhY2U7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHRoaXMuZ2V0U2l6ZU9mSXRlbShpKTtcbiAgICAgIGlmIChpdGVtU2l6ZSA9PSBudWxsKSBicmVhaztcbiAgICAgIHNwYWNlICs9IGl0ZW1TaXplO1xuICAgIH1cblxuICAgIHJldHVybiAoY2FjaGVbaW5kZXhdID0gc3BhY2UpO1xuICB9XG5cbiAgY2FjaGVTaXplcygpIHtcbiAgICBjb25zdCB7IGNhY2hlIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgZnJvbSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICBjb25zdCBpdGVtRWxzID0gdGhpcy5pdGVtcy5jaGlsZHJlbjtcbiAgICBjb25zdCBzaXplS2V5ID0gT0ZGU0VUX1NJWkVfS0VZU1t0aGlzLnByb3BzLmF4aXNdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gaXRlbUVscy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIGNhY2hlW2Zyb20gKyBpXSA9IGl0ZW1FbHNbaV1bc2l6ZUtleV07XG4gICAgfVxuICB9XG5cbiAgZ2V0U2l6ZU9mSXRlbShpbmRleCkge1xuICAgIGNvbnN0IHsgY2FjaGUsIGl0ZW1zIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgYXhpcywgaXRlbVNpemVHZXR0ZXIsIGl0ZW1TaXplRXN0aW1hdG9yLCB0eXBlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZnJvbSwgaXRlbVNpemUsIHNpemUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAvLyBUcnkgdGhlIHN0YXRpYyBpdGVtU2l6ZS5cbiAgICBpZiAoaXRlbVNpemUpIHJldHVybiBpdGVtU2l6ZTtcblxuICAgIC8vIFRyeSB0aGUgaXRlbVNpemVHZXR0ZXIuXG4gICAgaWYgKGl0ZW1TaXplR2V0dGVyKSByZXR1cm4gaXRlbVNpemVHZXR0ZXIoaW5kZXgpO1xuXG4gICAgLy8gVHJ5IHRoZSBjYWNoZS5cbiAgICBpZiAoaW5kZXggaW4gY2FjaGUpIHJldHVybiBjYWNoZVtpbmRleF07XG5cbiAgICAvLyBUcnkgdGhlIERPTS5cbiAgICBpZiAodHlwZSA9PT0gJ3NpbXBsZScgJiYgaW5kZXggPj0gZnJvbSAmJiBpbmRleCA8IGZyb20gKyBzaXplICYmIGl0ZW1zKSB7XG4gICAgICBjb25zdCBpdGVtRWwgPSBpdGVtcy5jaGlsZHJlbltpbmRleCAtIGZyb21dO1xuICAgICAgaWYgKGl0ZW1FbCkgcmV0dXJuIGl0ZW1FbFtPRkZTRVRfU0laRV9LRVlTW2F4aXNdXTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdGhlIGl0ZW1TaXplRXN0aW1hdG9yLlxuICAgIGlmIChpdGVtU2l6ZUVzdGltYXRvcikgcmV0dXJuIGl0ZW1TaXplRXN0aW1hdG9yKGluZGV4LCBjYWNoZSk7XG4gIH1cblxuICBjb25zdHJhaW4oZnJvbSwgc2l6ZSwgaXRlbXNQZXJSb3csIHsgbGVuZ3RoLCBtaW5TaXplLCB0eXBlIH0pIHtcbiAgICBzaXplID0gTWF0aC5tYXgoc2l6ZSwgbWluU2l6ZSk7XG4gICAgbGV0IG1vZCA9IHNpemUgJSBpdGVtc1BlclJvdztcbiAgICBpZiAobW9kKSBzaXplICs9IGl0ZW1zUGVyUm93IC0gbW9kO1xuICAgIGlmIChzaXplID4gbGVuZ3RoKSBzaXplID0gbGVuZ3RoO1xuICAgIGZyb20gPVxuICAgICAgdHlwZSA9PT0gJ3NpbXBsZScgfHwgIWZyb21cbiAgICAgICAgPyAwXG4gICAgICAgIDogTWF0aC5tYXgoTWF0aC5taW4oZnJvbSwgbGVuZ3RoIC0gc2l6ZSksIDApO1xuXG4gICAgaWYgKChtb2QgPSBmcm9tICUgaXRlbXNQZXJSb3cpKSB7XG4gICAgICBmcm9tIC09IG1vZDtcbiAgICAgIHNpemUgKz0gbW9kO1xuICAgIH1cblxuICAgIHJldHVybiB7IGZyb20sIHNpemUgfTtcbiAgfVxuXG4gIHNjcm9sbFRvKGluZGV4KSB7XG4gICAgaWYgKGluZGV4ICE9IG51bGwpIHRoaXMuc2V0U2Nyb2xsKHRoaXMuZ2V0U3BhY2VCZWZvcmUoaW5kZXgpIC0gMTAwKTtcbiAgfVxuXG4gIHNjcm9sbEFyb3VuZChpbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5nZXRTcGFjZUJlZm9yZShpbmRleCk7XG4gICAgY29uc3QgdG9wID0gYm90dG9tIC0gdGhpcy5nZXRWaWV3cG9ydFNpemUoKSArIHRoaXMuZ2V0U2l6ZU9mSXRlbShpbmRleCk7XG4gICAgY29uc3QgbWluID0gTWF0aC5taW4odG9wLCBib3R0b20pO1xuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHRvcCwgYm90dG9tKTtcbiAgICBpZiAoY3VycmVudCA8PSBtaW4pIHJldHVybiB0aGlzLnNldFNjcm9sbChtaW4gLSB0aGlzLmdldFZpZXdwb3J0U2l6ZSgpKTtcbiAgICBpZiAoY3VycmVudCA+IG1heCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U2Nyb2xsKG1heCAtIHRoaXMuZ2V0Vmlld3BvcnRTaXplKCkgLSAxMDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFZpc2libGVSYW5nZSgpIHtcbiAgICBjb25zdCB7IGZyb20sIHNpemUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kKDApO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgbGV0IGZpcnN0LCBsYXN0O1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7ICsraSkge1xuICAgICAgY29uc3QgaXRlbVN0YXJ0ID0gdGhpcy5nZXRTcGFjZUJlZm9yZShpLCBjYWNoZSk7XG4gICAgICBjb25zdCBpdGVtRW5kID0gaXRlbVN0YXJ0ICsgdGhpcy5nZXRTaXplT2ZJdGVtKGkpO1xuICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgaXRlbUVuZCA+IHN0YXJ0KSBmaXJzdCA9IGk7XG4gICAgICBpZiAoZmlyc3QgIT0gbnVsbCAmJiBpdGVtU3RhcnQgPCBlbmQpIGxhc3QgPSBpO1xuICAgIH1cbiAgICByZXR1cm4gW2ZpcnN0LCBsYXN0XTtcbiAgfVxuICAvL3RoaXMgY2FuIGJlIHVzZWQgYXMgYSBzdGF0aWMgbWV0aG9kIHZpYSB0aGUgcmVhY3QgbGlzdCByZWZcbiAgZ2V0RnJhY3Rpb25hbFZpc2libGVSYW5nZSgpIHtcbiAgICBjb25zdCB7IGZyb20sIHNpemUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kKDApO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgbGV0IGZpcnN0LCBsYXN0O1xuXG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgKytpKSB7XG4gICAgICBjb25zdCBpdGVtU3RhcnQgPSB0aGlzLmdldFNwYWNlQmVmb3JlKGksIGNhY2hlKTtcbiAgICAgIGNvbnN0IGl0ZW1FbmQgPSBpdGVtU3RhcnQgKyB0aGlzLmdldFNpemVPZkl0ZW0oaSk7XG4gICAgICBpZiAoZmlyc3QgPT0gbnVsbCAmJiBpdGVtRW5kID4gc3RhcnQpIHtcbiAgICAgICAgZmlyc3QgPSBpICsgMSAtIChpdGVtRW5kIC0gc3RhcnQpIC8gKGl0ZW1FbmQgLSBpdGVtU3RhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0ICE9IG51bGwgJiYgaXRlbVN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGxhc3QgPSBpIC0gKGl0ZW1FbmQgLSBlbmQpIC8gKGl0ZW1FbmQgLSBpdGVtU3RhcnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2ZpcnN0LCBsYXN0XTtcbiAgfVxuXG4gIHJlbmRlckl0ZW1zKCkge1xuICAgIGNvbnN0IHsgaXRlbVJlbmRlcmVyLCBpdGVtc1JlbmRlcmVyIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZnJvbSwgc2l6ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBpdGVtcy5wdXNoKGl0ZW1SZW5kZXJlcihmcm9tICsgaSwgaSkpO1xuICAgIHJldHVybiBpdGVtc1JlbmRlcmVyKGl0ZW1zLCBjID0+ICh0aGlzLml0ZW1zID0gYykpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgYXhpcywgbGVuZ3RoLCB0eXBlIC8qIHVzZVRyYW5zbGF0ZTNkICovIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZnJvbSwgaXRlbXNQZXJSb3cgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnJlbmRlckl0ZW1zKCk7XG4gICAgaWYgKHR5cGUgPT09ICdzaW1wbGUnKSByZXR1cm4gaXRlbXM7XG5cbiAgICBjb25zdCBzdHlsZSA9IHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfTtcbiAgICBjb25zdCBjYWNoZSA9IHt9O1xuICAgIGNvbnN0IGJvdHRvbSA9IE1hdGguY2VpbChsZW5ndGggLyBpdGVtc1BlclJvdykgKiBpdGVtc1BlclJvdztcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRTcGFjZUJlZm9yZShib3R0b20sIGNhY2hlKTtcbiAgICBpZiAoc2l6ZSkge1xuICAgICAgc3R5bGVbU0laRV9LRVlTW2F4aXNdXSA9IHNpemU7XG4gICAgICBpZiAoYXhpcyA9PT0gJ3gnKSBzdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5nZXRTcGFjZUJlZm9yZShmcm9tLCBjYWNoZSk7XG4gICAgY29uc3QgeCA9IGF4aXMgPT09ICd4JyA/IG9mZnNldCA6IDA7XG4gICAgY29uc3QgeSA9IGF4aXMgPT09ICd5JyA/IG9mZnNldCA6IDA7XG4gICAgY29uc3QgbGlzdFN0eWxlID0ge1xuICAgICAgLy90bnIgdHJ5aW5nIG91dDogaHR0cHM6Ly9naXRodWIuY29tL2NvZGVyaWV0eS9yZWFjdC1saXN0L3B1bGwvMTU0XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIHRvcDogeSxcbiAgICAgIGxlZnQ6IHhcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgcmVmPXtjID0+IHtcbiAgICAgICAgICBpZiAoYykgdGhpcy5lbCA9IGM7XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxkaXYgc3R5bGU9e2xpc3RTdHlsZX0+e2l0ZW1zfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuIl19