@libs-ui/components-inputs-quill 0.2.350-0 → 0.2.351-0

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.
@@ -1,499 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
3
- import { decodeEscapeHtml, set, setStylesElement } from '@libs-ui/utils';
4
- import ResizeModule from '@ssumo/quill-resize-module';
5
- import Quill2x from 'quill2x';
6
- import { fromEvent, lastValueFrom, timer } from 'rxjs';
7
- import { CustomImage2xBlot, QuillMention2xBlot } from '../blots-custom/index2x';
8
- import { convertHtmlToDivBlocks, fontSizeWhiteList, iconList } from './quill.define';
9
- let quill2x = null;
10
- let timeout = undefined;
11
- let timeout1 = undefined;
12
- let startCell = null;
13
- let endCell = null;
14
- let isSelecting = false;
15
- //region Function Table
16
- export const createTableSelector = (quill, anchorEl, translate) => {
17
- // Đóng popup cũ nếu còn tồn tại
18
- document.querySelectorAll('.manual-table-creator').forEach((el) => el.parentElement?.removeChild(el));
19
- const popup = document.createElement('div');
20
- popup.className = 'manual-table-creator';
21
- popup.style.position = 'absolute';
22
- popup.style.background = '#fff';
23
- popup.style.border = '1px solid #ddd';
24
- popup.style.borderRadius = '6px';
25
- popup.style.boxShadow = '0 6px 16px rgba(0,0,0,0.12)';
26
- popup.style.padding = '12px';
27
- popup.style.zIndex = '10000';
28
- popup.style.minWidth = '200px';
29
- setStylesElement(popup, {
30
- position: 'absolute',
31
- background: '#fff',
32
- border: '1px solid #ddd',
33
- borderRadius: '6px',
34
- boxShadow: '0 6px 16px rgba(0,0,0,0.12)',
35
- padding: '12px',
36
- zIndex: '10000',
37
- minWidth: '200px',
38
- });
39
- const info = document.createElement('div');
40
- info.textContent = translate.instant('i18n_select_cell');
41
- setStylesElement(info, {
42
- fontSize: '12px',
43
- color: '#333',
44
- marginBottom: '10px',
45
- textAlign: 'center',
46
- fontWeight: '600',
47
- });
48
- popup.appendChild(info);
49
- const grid = document.createElement('div');
50
- setStylesElement(grid, {
51
- display: 'grid',
52
- gridTemplateColumns: 'repeat(8, 18px)',
53
- gap: '4px',
54
- });
55
- const max = 8;
56
- for (let row = 1; row <= max; row++) {
57
- for (let col = 1; col <= max; col++) {
58
- const cell = document.createElement('div');
59
- cell.style.width = '18px';
60
- cell.style.height = '18px';
61
- cell.style.border = '1px solid #e5e7eb';
62
- cell.style.background = '#fff';
63
- cell.style.cursor = 'pointer';
64
- cell.addEventListener('mouseenter', () => {
65
- info.textContent = `${row} × ${col}`;
66
- Array.from(grid.children).forEach((el, idx) => {
67
- const rr = Math.floor(idx / max) + 1;
68
- const cc = (idx % max) + 1;
69
- el.style.background = rr <= row && cc <= col ? '#dbeafe' : '#fff';
70
- el.style.borderColor = rr <= row && cc <= col ? '#93c5fd' : '#e5e7eb';
71
- });
72
- });
73
- cell.addEventListener('click', () => {
74
- try {
75
- quill.focus();
76
- const tableModule = quill.getModule('table');
77
- if (tableModule && typeof tableModule.insertTable === 'function') {
78
- tableModule.insertTable(row, col);
79
- getAllTablesWithSpan(quill);
80
- }
81
- }
82
- finally {
83
- if (document.body.contains(popup)) {
84
- document.body.removeChild(popup);
85
- }
86
- document.removeEventListener('click', onOutsideClick, true);
87
- }
88
- });
89
- grid.appendChild(cell);
90
- }
91
- }
92
- popup.appendChild(grid);
93
- const placePopup = () => {
94
- const rect = anchorEl?.getBoundingClientRect();
95
- const top = rect ? rect.bottom + window.scrollY + 6 : 100;
96
- const left = rect ? rect.left + window.scrollX : 100;
97
- popup.style.top = `${top}px`;
98
- popup.style.left = `${left}px`;
99
- };
100
- const onOutsideClick = (ev) => {
101
- if (!popup.contains(ev.target)) {
102
- if (document.body.contains(popup)) {
103
- document.body.removeChild(popup);
104
- }
105
- document.removeEventListener('click', onOutsideClick, true);
106
- }
107
- };
108
- document.body.appendChild(popup);
109
- placePopup();
110
- setTimeout(() => document.addEventListener('click', onOutsideClick, true));
111
- };
112
- export const createContextMenuOptionTable = (quill, translate) => {
113
- let lastContextIndex = null;
114
- const closeAnyMenu = () => {
115
- document.querySelectorAll('.manual-table-menu').forEach((el) => el.parentElement?.removeChild(el));
116
- };
117
- const runWithSelection = (fn) => {
118
- try {
119
- quill.focus();
120
- if (typeof lastContextIndex === 'number') {
121
- quill.setSelection(lastContextIndex, 0, 'silent');
122
- }
123
- }
124
- catch {
125
- /* no-op: giữ yên nếu không thể set selection */
126
- }
127
- fn();
128
- };
129
- const createMenuItem = (label, onClick) => {
130
- const item = document.createElement('div');
131
- item.textContent = label;
132
- item.style.padding = '6px 12px';
133
- item.style.cursor = 'pointer';
134
- item.addEventListener('click', () => {
135
- runWithSelection(onClick);
136
- closeAnyMenu();
137
- });
138
- item.addEventListener('mouseenter', () => {
139
- item.style.background = '#f5f5f5';
140
- });
141
- item.addEventListener('mouseleave', () => {
142
- item.style.background = 'transparent';
143
- });
144
- return item;
145
- };
146
- const openContextMenu = (pageX, pageY) => {
147
- closeAnyMenu();
148
- const menu = document.createElement('div');
149
- menu.className = 'manual-table-menu';
150
- menu.style.position = 'absolute';
151
- menu.style.top = `${pageY}px`;
152
- menu.style.left = `${pageX}px`;
153
- menu.style.background = '#fff';
154
- menu.style.border = '1px solid #ccc';
155
- menu.style.borderRadius = '4px';
156
- menu.style.boxShadow = '0 4px 12px rgba(0,0,0,0.2)';
157
- menu.style.zIndex = '10001';
158
- menu.style.padding = '4px';
159
- menu.style.minWidth = '180px';
160
- const tableModule = quill.getModule('table');
161
- const safeCall = (method, ...args) => {
162
- if (method === 'mergeCells') {
163
- const [startCell, endCell] = args;
164
- mergeCells(startCell, endCell);
165
- closeAnyMenu();
166
- return;
167
- }
168
- if (method === 'splitCells') {
169
- const [startCell] = args;
170
- splitCells(startCell);
171
- closeAnyMenu();
172
- return;
173
- }
174
- if (tableModule && typeof tableModule[method] === 'function') {
175
- tableModule[method](...args);
176
- getAllTablesWithSpan(quill);
177
- }
178
- };
179
- menu.appendChild(createMenuItem(translate.instant('i18n_add_new_row_above'), () => safeCall('insertRowAbove')));
180
- menu.appendChild(createMenuItem(translate.instant('i18n_add_new_row_below'), () => safeCall('insertRowBelow')));
181
- menu.appendChild(createMenuItem(translate.instant('i18n_add_new_column_left'), () => safeCall('insertColumnLeft')));
182
- menu.appendChild(createMenuItem(translate.instant('i18n_add_new_column_right'), () => safeCall('insertColumnRight')));
183
- const divider = document.createElement('div');
184
- divider.style.height = '1px';
185
- divider.style.background = '#eee';
186
- divider.style.margin = '4px 0';
187
- menu.appendChild(divider);
188
- if (startCell && endCell) {
189
- const startCellStore = startCell;
190
- const endCellStore = endCell;
191
- const colspan = parseInt(startCellStore.getAttribute('colspan') || '1', 10);
192
- const rowspan = parseInt(startCellStore.getAttribute('rowspan') || '1', 10);
193
- let totalMenu = 0;
194
- if (startCell !== endCell) {
195
- menu.appendChild(createMenuItem(translate.instant('i18n_merge_cells'), () => safeCall('mergeCells', startCellStore, endCellStore)));
196
- totalMenu++;
197
- }
198
- if (startCell === endCell && (colspan > 1 || rowspan > 1)) {
199
- menu.appendChild(createMenuItem(translate.instant('i18n_split_cells'), () => safeCall('splitCells', startCellStore)));
200
- totalMenu++;
201
- }
202
- if (totalMenu > 0) {
203
- const divider2 = document.createElement('div');
204
- divider2.style.height = '1px';
205
- divider2.style.background = '#eee';
206
- divider2.style.margin = '4px 0';
207
- menu.appendChild(divider2);
208
- }
209
- }
210
- menu.appendChild(createMenuItem(translate.instant('i18n_delete_row'), () => safeCall('deleteRow')));
211
- menu.appendChild(createMenuItem(translate.instant('i18n_delete_column'), () => safeCall('deleteColumn')));
212
- menu.appendChild(createMenuItem(translate.instant('i18n_delete_table'), () => safeCall('deleteTable')));
213
- document.body.appendChild(menu);
214
- const onOutside = (ev) => {
215
- if (!menu.contains(ev.target) || ev.target.getElementsByTagName('table').length < 0) {
216
- closeAnyMenu();
217
- document.removeEventListener('click', onOutside, true);
218
- }
219
- };
220
- setTimeout(() => document.addEventListener('click', onOutside, true));
221
- const onScroll = () => {
222
- closeAnyMenu();
223
- window.removeEventListener('scroll', onScroll, true);
224
- window.removeEventListener('resize', onScroll, true);
225
- };
226
- window.addEventListener('scroll', onScroll, true);
227
- window.addEventListener('resize', onScroll, true);
228
- };
229
- fromEvent(quill.root, 'contextmenu').subscribe((ev) => {
230
- const target = ev.target;
231
- const isCell = !!target.closest('td,th,table,.ql-table');
232
- if (!isCell)
233
- return;
234
- ev.preventDefault();
235
- try {
236
- // Ưu tiên lấy index từ blot tương ứng node
237
- const QuillAny = Quill2x;
238
- const blot = QuillAny?.find?.(target);
239
- if (blot && typeof blot.offset === 'function') {
240
- lastContextIndex = blot.offset(quill.scroll);
241
- }
242
- else {
243
- // Fallback: đặt selection hiện tại nếu không xác định được
244
- const sel = quill.getSelection(true);
245
- lastContextIndex = sel ? sel.index : 0;
246
- }
247
- }
248
- catch {
249
- const sel = quill.getSelection(true);
250
- lastContextIndex = sel ? sel.index : 0;
251
- }
252
- quill.focus();
253
- openContextMenu(ev.pageX, ev.pageY);
254
- });
255
- };
256
- // ===============================
257
- // Utils: clear và select cells
258
- // ===============================
259
- const clearSelection = () => {
260
- document.querySelectorAll('.selected-cell').forEach((c) => {
261
- c.classList.remove('selected-cell');
262
- });
263
- };
264
- const selectRangeCells = (start, end) => {
265
- clearSelection();
266
- const table = start.closest('table');
267
- if (!table || table !== end.closest('table'))
268
- return;
269
- const rows = Array.from(table.querySelectorAll('tr'));
270
- const startRow = rows.indexOf(start.parentElement);
271
- const endRow = rows.indexOf(end.parentElement);
272
- const minRow = Math.min(startRow, endRow);
273
- const maxRow = Math.max(startRow, endRow);
274
- const startCol = Array.from(start.parentElement.children).indexOf(start);
275
- const endCol = Array.from(end.parentElement.children).indexOf(end);
276
- const minCol = Math.min(startCol, endCol);
277
- const maxCol = Math.max(startCol, endCol);
278
- for (let r = minRow; r <= maxRow; r++) {
279
- const row = rows[r];
280
- const cells = Array.from(row.children);
281
- for (let c = minCol; c <= maxCol; c++) {
282
- cells[c].classList.add('selected-cell');
283
- }
284
- }
285
- };
286
- // ===============================
287
- // Enable selection trên table
288
- // ===============================
289
- export function enableTableSelection(container) {
290
- container.addEventListener('mousedown', (e) => {
291
- const target = e.target;
292
- if ((target.tagName === 'TD' && e.button !== 2) || (e.button === 2 && !target.classList.contains('selected-cell'))) {
293
- clearSelection();
294
- isSelecting = true;
295
- startCell = target;
296
- endCell = target;
297
- selectRangeCells(startCell, endCell);
298
- }
299
- });
300
- container.addEventListener('mousemove', (e) => {
301
- if (!isSelecting)
302
- return;
303
- const target = e.target;
304
- if (target.tagName === 'TD' && startCell) {
305
- endCell = target;
306
- selectRangeCells(startCell, endCell);
307
- }
308
- });
309
- container.addEventListener('mouseup', () => {
310
- isSelecting = false;
311
- });
312
- }
313
- const onOutside = (ev) => {
314
- const target = ev.target;
315
- if (target.tagName !== 'TD' && target.tagName !== 'TR' && target.tagName !== 'TBODY' && target.tagName !== 'THEAD' && target.tagName !== 'TABLE') {
316
- isSelecting = false;
317
- startCell = null;
318
- endCell = null;
319
- clearSelection();
320
- }
321
- };
322
- document.addEventListener('click', onOutside, true);
323
- // ===============================
324
- // Merge cells
325
- // ===============================
326
- export const mergeCells = (startCell, endCell) => {
327
- const startCellIndex = startCell.getAttribute('index');
328
- const endCellIndex = endCell.getAttribute('index');
329
- const startCellRow = parseInt(startCellIndex?.split('-')[0] || '0', 10);
330
- const endCellRow = parseInt(endCellIndex?.split('-')[0] || '0', 10);
331
- const startCellCol = parseInt(startCellIndex?.split('-')[1] || '0', 10);
332
- const endCellCol = parseInt(endCellIndex?.split('-')[1] || '0', 10);
333
- const minRow = Math.min(startCellRow, endCellRow);
334
- const maxRow = Math.max(startCellRow, endCellRow);
335
- const minCol = Math.min(startCellCol, endCellCol);
336
- const maxCol = Math.max(startCellCol, endCellCol);
337
- const rows = startCell.closest('table')?.querySelectorAll('tr');
338
- rows?.forEach((rowEl, rowIndex) => {
339
- if (rowIndex < minRow || rowIndex > maxRow)
340
- return;
341
- const cells = rowEl.querySelectorAll('td, th');
342
- cells.forEach((cellEl, colIndex) => {
343
- if (colIndex < minCol || colIndex > maxCol)
344
- return;
345
- if (rowIndex === minRow && colIndex === minCol) {
346
- cellEl.setAttribute('colspan', String(maxCol - minCol + 1));
347
- cellEl.setAttribute('rowspan', String(maxRow - minRow + 1));
348
- return;
349
- }
350
- cellEl.classList.add('hidden');
351
- });
352
- });
353
- };
354
- // ===============================
355
- // Split cells
356
- // ===============================
357
- export function splitCells(cellSplit) {
358
- const index = cellSplit.getAttribute('index');
359
- let colSpan = parseInt(cellSplit.getAttribute('colspan') || '1', 10);
360
- let rowSpan = parseInt(cellSplit.getAttribute('rowspan') || '1', 10);
361
- const totalCellSplit = rowSpan * colSpan;
362
- let countCellSplit = 0;
363
- const rowStart = parseInt(index?.split('-')[0] || '0', 10);
364
- const colStart = parseInt(index?.split('-')[1] || '0', 10);
365
- const colIncrement = new Set();
366
- const rowIncrement = new Set();
367
- const rows = cellSplit.closest('table')?.querySelectorAll('tr');
368
- rows?.forEach((rowEl, rowIndex) => {
369
- if (rowIndex < rowStart)
370
- return;
371
- const cells = rowEl.querySelectorAll('td, th');
372
- cells.forEach((cellEl, colIndex) => {
373
- if (rowIndex < rowStart || colIndex < colStart || rowStart + rowSpan < rowIndex || colStart + colSpan < colIndex || countCellSplit >= totalCellSplit)
374
- return;
375
- if (rowIndex === rowStart && colIndex === colStart) {
376
- countCellSplit++;
377
- cellEl.setAttribute('colspan', '1');
378
- cellEl.setAttribute('rowspan', '1');
379
- return;
380
- }
381
- if (!cellEl.classList.contains('hidden')) {
382
- if (!rowIncrement.has(rowIndex)) {
383
- rowSpan++;
384
- }
385
- if (!colIncrement.has(colIndex)) {
386
- colSpan++;
387
- }
388
- rowIncrement.add(rowIndex);
389
- colIncrement.add(colIndex);
390
- return;
391
- }
392
- cellEl.classList.remove('hidden');
393
- countCellSplit++;
394
- });
395
- });
396
- }
397
- export const getAllTablesWithSpan = (quill) => {
398
- const root = quill.root;
399
- // Tìm tất cả table trong quill
400
- const tableEls = root.querySelectorAll('table');
401
- tableEls.forEach((tableEl) => {
402
- const rows = tableEl.querySelectorAll('tr');
403
- rows.forEach((rowEl, rIndex) => {
404
- rowEl.setAttribute('index', `${rIndex}`);
405
- const cells = rowEl.querySelectorAll('td, th');
406
- cells.forEach((cellEl, cIndex) => {
407
- cellEl.setAttribute('index', `${rIndex}-${cIndex}`);
408
- const rowspan = parseInt(cellEl.getAttribute('rowspan') || '1', 10);
409
- const colspan = parseInt(cellEl.getAttribute('colspan') || '1', 10);
410
- cellEl.setAttribute('rowspan', String(rowspan));
411
- cellEl.setAttribute('colspan', String(colspan));
412
- });
413
- });
414
- });
415
- };
416
- //-------------------------------------------
417
- let register = false;
418
- export const registerQuill2x = () => {
419
- if (register)
420
- return;
421
- register = true;
422
- const Quill = Quill2x;
423
- const size = Quill.import('attributors/style/size');
424
- const alignStyle = Quill.import('attributors/style/align');
425
- const italic = Quill.import('formats/italic');
426
- const bold = Quill.import('formats/bold');
427
- const icons = Quill.import('ui/icons');
428
- size.whitelist = fontSizeWhiteList();
429
- italic.tagName = 'i';
430
- bold.tagName = 'b';
431
- Quill.register(bold, true);
432
- Quill.register(italic, true);
433
- Quill.register(size, true);
434
- Quill.register(alignStyle, true);
435
- Quill.register(QuillMention2xBlot, true);
436
- Quill.register(CustomImage2xBlot, true);
437
- Quill.register('modules/resize', ResizeModule);
438
- [...iconList()].forEach((element) => set(icons, element.key, `<span class="${element.icon} ${element.key === 'unLink' ? 'hover:text-[#ee2d41] ' : 'hover:text-[var(--libs-ui-color-light-1)]'} text-[16px] text-[#6a7383]"></span>`));
439
- };
440
- export const isEmptyQuill2x = (quill) => {
441
- const rootElement = quill?.root;
442
- if (!rootElement)
443
- return true;
444
- const html = rootElement.innerHTML.trim();
445
- return html === '<p><br></p>' || html === '<p></p>' || html === '' || html === '<p><span class="ql-cursor"></span><br></p>' || rootElement.classList.contains('ql-blank');
446
- };
447
- export const getHTMLFromDeltaOfQuill2x = (delta, options) => {
448
- if (!delta || !delta.ops || !delta.ops.length) {
449
- return '';
450
- }
451
- if (!quill2x) {
452
- quill2x = new Quill2x(document.createElement('div'));
453
- }
454
- const { replaceNewLineTo = '<br>', replaceTagBRTo, replaceTags, replaceBrToDiv } = options || {};
455
- if (options?.functionReplaceDelta) {
456
- options.functionReplaceDelta(delta);
457
- }
458
- delta.ops.forEach((op) => {
459
- if (op.insert) {
460
- if (typeof op.insert === 'string') {
461
- if (replaceNewLineTo) {
462
- op.insert = op.insert.replace(/\n/g, replaceNewLineTo);
463
- }
464
- if (replaceTagBRTo) {
465
- op.insert = op.insert.replace(/<br>/g, replaceTagBRTo);
466
- }
467
- if (replaceTags?.length) {
468
- for (const tag of replaceTags) {
469
- op.insert = op.insert.replace(new RegExp(`<${tag.tag}>`, 'g'), `<${tag.replaceTo}>`);
470
- op.insert = op.insert.replace(new RegExp(`</${tag.tag}>`, 'g'), `</${tag.replaceTo}>`);
471
- }
472
- }
473
- }
474
- }
475
- });
476
- quill2x.setContents(delta);
477
- let htmlText = options?.getRootHtml ? quill2x.root.innerHTML : quill2x.root.firstElementChild?.innerHTML;
478
- if (replaceBrToDiv) {
479
- htmlText = convertHtmlToDivBlocks(htmlText || '');
480
- }
481
- clearTimeout(timeout);
482
- timeout = setTimeout(() => {
483
- quill2x = null;
484
- }, 10000);
485
- return decodeEscapeHtml(htmlText || '');
486
- };
487
- export const getDeltaOfQuill2xFromHTML = async (html) => {
488
- if (!quill2x) {
489
- quill2x = new Quill2x(document.createElement('div'));
490
- }
491
- quill2x.root.innerHTML = html;
492
- await lastValueFrom(timer(1000));
493
- clearTimeout(timeout1);
494
- timeout1 = setTimeout(() => {
495
- quill2x = null;
496
- }, 10000);
497
- return quill2x.getContents();
498
- };
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwyeC5kZWZpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3F1aWxsL3NyYy91dGlscy9xdWlsbDJ4LmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixJQUFJLE9BQU8sR0FBbUIsSUFBSSxDQUFDO0FBQ25DLElBQUksT0FBTyxHQUF1QixTQUFTLENBQUM7QUFDNUMsSUFBSSxRQUFRLEdBQXVCLFNBQVMsQ0FBQztBQUM3QyxJQUFJLFNBQVMsR0FBdUIsSUFBSSxDQUFDO0FBQ3pDLElBQUksT0FBTyxHQUF1QixJQUFJLENBQUM7QUFDdkMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBRXhCLHVCQUF1QjtBQUN2QixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWMsRUFBRSxRQUE0QixFQUFFLFNBQTJCLEVBQUUsRUFBRTtJQUMvRyxnQ0FBZ0M7SUFDaEMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFB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S0FBSyxFQUFFLElBQVksRUFBa0IsRUFBRTtJQUM5RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFOUIsTUFBTSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZCLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDakIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1YsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqL1xuaW1wb3J0IHsgZGVjb2RlRXNjYXBlSHRtbCwgc2V0LCBzZXRTdHlsZXNFbGVtZW50IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IFJlc2l6ZU1vZHVsZSBmcm9tICdAc3N1bW8vcXVpbGwtcmVzaXplLW1vZHVsZSc7XG5pbXBvcnQgRGVsdGEgZnJvbSAncXVpbGwtZGVsdGEnO1xuaW1wb3J0IFF1aWxsMnggZnJvbSAncXVpbGwyeCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIGxhc3RWYWx1ZUZyb20sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21JbWFnZTJ4QmxvdCwgUXVpbGxNZW50aW9uMnhCbG90IH0gZnJvbSAnLi4vYmxvdHMtY3VzdG9tL2luZGV4MngnO1xuaW1wb3J0IHsgY29udmVydEh0bWxUb0RpdkJsb2NrcywgZm9udFNpemVXaGl0ZUxpc3QsIGljb25MaXN0IH0gZnJvbSAnLi9xdWlsbC5kZWZpbmUnO1xubGV0IHF1aWxsMng6IFF1aWxsMnggfCBudWxsID0gbnVsbDtcbmxldCB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5sZXQgdGltZW91dDE6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmxldCBzdGFydENlbGw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5sZXQgZW5kQ2VsbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbmxldCBpc1NlbGVjdGluZyA9IGZhbHNlO1xuXG4vL3JlZ2lvbiBGdW5jdGlvbiBUYWJsZVxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRhYmxlU2VsZWN0b3IgPSAocXVpbGw6IFF1aWxsMngsIGFuY2hvckVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkgPT4ge1xuICAvLyDEkMOzbmcgcG9wdXAgY8WpIG7hur91IGPDsm4gdOG7k24gdOG6oWlcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hbnVhbC10YWJsZS1jcmVhdG9yJykuZm9yRWFjaCgoZWwpID0+IGVsLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKGVsKSk7XG5cbiAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcG9wdXAuY2xhc3NOYW1lID0gJ21hbnVhbC10YWJsZS1jcmVhdG9yJztcbiAgcG9wdXAuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmYnO1xuICBwb3B1cC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNkZGQnO1xuICBwb3B1cC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNnB4JztcbiAgcG9wdXAuc3R5bGUuYm94U2hhZG93ID0gJzAgNnB4IDE2cHggcmdiYSgwLDAsMCwwLjEyKSc7XG4gIHBvcHVwLnN0eWxlLnBhZGRpbmcgPSAnMTJweCc7XG4gIHBvcHVwLnN0eWxlLnpJbmRleCA9ICcxMDAwMCc7XG4gIHBvcHVwLnN0eWxlLm1pbldpZHRoID0gJzIwMHB4JztcbiAgc2V0U3R5bGVzRWxlbWVudChwb3B1cCwge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICBib3JkZXI6ICcxcHggc29saWQgI2RkZCcsXG4gICAgYm9yZGVyUmFkaXVzOiAnNnB4JyxcbiAgICBib3hTaGFkb3c6ICcwIDZweCAxNnB4IHJnYmEoMCwwLDAsMC4xMiknLFxuICAgIHBhZGRpbmc6ICcxMnB4JyxcbiAgICB6SW5kZXg6ICcxMDAwMCcsXG4gICAgbWluV2lkdGg6ICcyMDBweCcsXG4gIH0pO1xuXG4gIGNvbnN0IGluZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaW5mby50ZXh0Q29udGVudCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX3NlbGVjdF9jZWxsJyk7XG4gIHNldFN0eWxlc0VsZW1lbnQoaW5mbywge1xuICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICBtYXJnaW5Cb3R0b206ICcxMHB4JyxcbiAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgIGZvbnRXZWlnaHQ6ICc2MDAnLFxuICB9KTtcbiAgcG9wdXAuYXBwZW5kQ2hpbGQoaW5mbyk7XG5cbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBzZXRTdHlsZXNFbGVtZW50KGdyaWQsIHtcbiAgICBkaXNwbGF5OiAnZ3JpZCcsXG4gICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogJ3JlcGVhdCg4LCAxOHB4KScsXG4gICAgZ2FwOiAnNHB4JyxcbiAgfSk7XG5cbiAgY29uc3QgbWF4ID0gODtcbiAgZm9yIChsZXQgcm93ID0gMTsgcm93IDw9IG1heDsgcm93KyspIHtcbiAgICBmb3IgKGxldCBjb2wgPSAxOyBjb2wgPD0gbWF4OyBjb2wrKykge1xuICAgICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2VsbC5zdHlsZS53aWR0aCA9ICcxOHB4JztcbiAgICAgIGNlbGwuc3R5bGUuaGVpZ2h0ID0gJzE4cHgnO1xuICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNlNWU3ZWInO1xuICAgICAgY2VsbC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmYnO1xuICAgICAgY2VsbC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cbiAgICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgaW5mby50ZXh0Q29udGVudCA9IGAke3Jvd30gw5cgJHtjb2x9YDtcbiAgICAgICAgQXJyYXkuZnJvbShncmlkLmNoaWxkcmVuKS5mb3JFYWNoKChlbCwgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgcnIgPSBNYXRoLmZsb29yKGlkeCAvIG1heCkgKyAxO1xuICAgICAgICAgIGNvbnN0IGNjID0gKGlkeCAlIG1heCkgKyAxO1xuICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZCA9IHJyIDw9IHJvdyAmJiBjYyA8PSBjb2wgPyAnI2RiZWFmZScgOiAnI2ZmZic7XG4gICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5ib3JkZXJDb2xvciA9IHJyIDw9IHJvdyAmJiBjYyA8PSBjb2wgPyAnIzkzYzVmZCcgOiAnI2U1ZTdlYic7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcXVpbGwuZm9jdXMoKTtcbiAgICAgICAgICBjb25zdCB0YWJsZU1vZHVsZSA9IHF1aWxsLmdldE1vZHVsZSgndGFibGUnKSBhcyBhbnk7XG4gICAgICAgICAgaWYgKHRhYmxlTW9kdWxlICYmIHR5cGVvZiB0YWJsZU1vZHVsZS5pbnNlcnRUYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFibGVNb2R1bGUuaW5zZXJ0VGFibGUocm93LCBjb2wpO1xuICAgICAgICAgICAgZ2V0QWxsVGFibGVzV2l0aFNwYW4ocXVpbGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhwb3B1cCkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgfVxuICB9XG4gIHBvcHVwLmFwcGVuZENoaWxkKGdyaWQpO1xuXG4gIGNvbnN0IHBsYWNlUG9wdXAgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVjdCA9IGFuY2hvckVsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b3AgPSByZWN0ID8gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDYgOiAxMDA7XG4gICAgY29uc3QgbGVmdCA9IHJlY3QgPyByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCA6IDEwMDtcbiAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgfTtcblxuICBjb25zdCBvbk91dHNpZGVDbGljayA9IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICghcG9wdXAuY29udGFpbnMoZXYudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhwb3B1cCkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwb3B1cCk7XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3B1cCk7XG4gIHBsYWNlUG9wdXAoKTtcbiAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uT3V0c2lkZUNsaWNrLCB0cnVlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dE1lbnVPcHRpb25UYWJsZSA9IChxdWlsbDogUXVpbGwyeCwgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSA9PiB7XG4gIGxldCBsYXN0Q29udGV4dEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBjbG9zZUFueU1lbnUgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hbnVhbC10YWJsZS1tZW51JykuZm9yRWFjaCgoZWwpID0+IGVsLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKGVsKSk7XG4gIH07XG5cbiAgY29uc3QgcnVuV2l0aFNlbGVjdGlvbiA9IChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBxdWlsbC5mb2N1cygpO1xuICAgICAgaWYgKHR5cGVvZiBsYXN0Q29udGV4dEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBxdWlsbC5zZXRTZWxlY3Rpb24obGFzdENvbnRleHRJbmRleCwgMCwgJ3NpbGVudCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogbm8tb3A6IGdp4buvIHnDqm4gbuG6v3Uga2jDtG5nIHRo4buDIHNldCBzZWxlY3Rpb24gKi9cbiAgICB9XG4gICAgZm4oKTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVNZW51SXRlbSA9IChsYWJlbDogc3RyaW5nLCBvbkNsaWNrOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGl0ZW0udGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICBpdGVtLnN0eWxlLnBhZGRpbmcgPSAnNnB4IDEycHgnO1xuICAgIGl0ZW0uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBydW5XaXRoU2VsZWN0aW9uKG9uQ2xpY2spO1xuICAgICAgY2xvc2VBbnlNZW51KCk7XG4gICAgfSk7XG4gICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNWY1ZjUnO1xuICAgIH0pO1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cbiAgY29uc3Qgb3BlbkNvbnRleHRNZW51ID0gKHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpID0+IHtcbiAgICBjbG9zZUFueU1lbnUoKTtcblxuICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBtZW51LmNsYXNzTmFtZSA9ICdtYW51YWwtdGFibGUtbWVudSc7XG4gICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgbWVudS5zdHlsZS50b3AgPSBgJHtwYWdlWX1weGA7XG4gICAgbWVudS5zdHlsZS5sZWZ0ID0gYCR7cGFnZVh9cHhgO1xuICAgIG1lbnUuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgICBtZW51LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgbWVudS5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICBtZW51LnN0eWxlLmJveFNoYWRvdyA9ICcwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4yKSc7XG4gICAgbWVudS5zdHlsZS56SW5kZXggPSAnMTAwMDEnO1xuICAgIG1lbnUuc3R5bGUucGFkZGluZyA9ICc0cHgnO1xuICAgIG1lbnUuc3R5bGUubWluV2lkdGggPSAnMTgwcHgnO1xuXG4gICAgY29uc3QgdGFibGVNb2R1bGUgPSBxdWlsbC5nZXRNb2R1bGUoJ3RhYmxlJykgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw7XG4gICAgY29uc3Qgc2FmZUNhbGwgPSAobWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSAnbWVyZ2VDZWxscycpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0Q2VsbCwgZW5kQ2VsbF0gPSBhcmdzO1xuICAgICAgICBtZXJnZUNlbGxzKHN0YXJ0Q2VsbCwgZW5kQ2VsbCk7XG4gICAgICAgIGNsb3NlQW55TWVudSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSAnc3BsaXRDZWxscycpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0Q2VsbF0gPSBhcmdzO1xuICAgICAgICBzcGxpdENlbGxzKHN0YXJ0Q2VsbCk7XG4gICAgICAgIGNsb3NlQW55TWVudSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGFibGVNb2R1bGUgJiYgdHlwZW9mIHRhYmxlTW9kdWxlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFibGVNb2R1bGVbbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgZ2V0QWxsVGFibGVzV2l0aFNwYW4ocXVpbGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBtZW51LmFwcGVuZENoaWxkKGNyZWF0ZU1lbnVJdGVtKHRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX2FkZF9uZXdfcm93X2Fib3ZlJyksICgpID0+IHNhZmVDYWxsKCdpbnNlcnRSb3dBYm92ZScpKSk7XG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSh0cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9hZGRfbmV3X3Jvd19iZWxvdycpLCAoKSA9PiBzYWZlQ2FsbCgnaW5zZXJ0Um93QmVsb3cnKSkpO1xuICAgIG1lbnUuYXBwZW5kQ2hpbGQoY3JlYXRlTWVudUl0ZW0odHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5fYWRkX25ld19jb2x1bW5fbGVmdCcpLCAoKSA9PiBzYWZlQ2FsbCgnaW5zZXJ0Q29sdW1uTGVmdCcpKSk7XG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSh0cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9hZGRfbmV3X2NvbHVtbl9yaWdodCcpLCAoKSA9PiBzYWZlQ2FsbCgnaW5zZXJ0Q29sdW1uUmlnaHQnKSkpO1xuICAgIGNvbnN0IGRpdmlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXZpZGVyLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgIGRpdmlkZXIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWVlJztcbiAgICBkaXZpZGVyLnN0eWxlLm1hcmdpbiA9ICc0cHggMCc7XG4gICAgbWVudS5hcHBlbmRDaGlsZChkaXZpZGVyKTtcbiAgICBpZiAoc3RhcnRDZWxsICYmIGVuZENlbGwpIHtcbiAgICAgIGNvbnN0IHN0YXJ0Q2VsbFN0b3JlID0gc3RhcnRDZWxsO1xuICAgICAgY29uc3QgZW5kQ2VsbFN0b3JlID0gZW5kQ2VsbDtcbiAgICAgIGNvbnN0IGNvbHNwYW4gPSBwYXJzZUludChzdGFydENlbGxTdG9yZS5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSB8fCAnMScsIDEwKTtcbiAgICAgIGNvbnN0IHJvd3NwYW4gPSBwYXJzZUludChzdGFydENlbGxTdG9yZS5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSB8fCAnMScsIDEwKTtcbiAgICAgIGxldCB0b3RhbE1lbnUgPSAwO1xuICAgICAgaWYgKHN0YXJ0Q2VsbCAhPT0gZW5kQ2VsbCkge1xuICAgICAgICBtZW51LmFwcGVuZENoaWxkKGNyZWF0ZU1lbnVJdGVtKHRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX21lcmdlX2NlbGxzJyksICgpID0+IHNhZmVDYWxsKCdtZXJnZUNlbGxzJywgc3RhcnRDZWxsU3RvcmUsIGVuZENlbGxTdG9yZSkpKTtcbiAgICAgICAgdG90YWxNZW51Kys7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnRDZWxsID09PSBlbmRDZWxsICYmIChjb2xzcGFuID4gMSB8fCByb3dzcGFuID4gMSkpIHtcbiAgICAgICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSh0cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9zcGxpdF9jZWxscycpLCAoKSA9PiBzYWZlQ2FsbCgnc3BsaXRDZWxscycsIHN0YXJ0Q2VsbFN0b3JlKSkpO1xuICAgICAgICB0b3RhbE1lbnUrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsTWVudSA+IDApIHtcbiAgICAgICAgY29uc3QgZGl2aWRlcjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2aWRlcjIuc3R5bGUuaGVpZ2h0ID0gJzFweCc7XG4gICAgICAgIGRpdmlkZXIyLnN0eWxlLmJhY2tncm91bmQgPSAnI2VlZSc7XG4gICAgICAgIGRpdmlkZXIyLnN0eWxlLm1hcmdpbiA9ICc0cHggMCc7XG4gICAgICAgIG1lbnUuYXBwZW5kQ2hpbGQoZGl2aWRlcjIpO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW51LmFwcGVuZENoaWxkKGNyZWF0ZU1lbnVJdGVtKHRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX2RlbGV0ZV9yb3cnKSwgKCkgPT4gc2FmZUNhbGwoJ2RlbGV0ZVJvdycpKSk7XG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSh0cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9kZWxldGVfY29sdW1uJyksICgpID0+IHNhZmVDYWxsKCdkZWxldGVDb2x1bW4nKSkpO1xuICAgIG1lbnUuYXBwZW5kQ2hpbGQoY3JlYXRlTWVudUl0ZW0odHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5fZGVsZXRlX3RhYmxlJyksICgpID0+IHNhZmVDYWxsKCdkZWxldGVUYWJsZScpKSk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpO1xuXG4gICAgY29uc3Qgb25PdXRzaWRlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIW1lbnUuY29udGFpbnMoZXYudGFyZ2V0IGFzIE5vZGUpIHx8IChldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0YWJsZScpLmxlbmd0aCA8IDApIHtcbiAgICAgICAgY2xvc2VBbnlNZW51KCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbk91dHNpZGUsIHRydWUpKTtcblxuICAgIGNvbnN0IG9uU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgY2xvc2VBbnlNZW51KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHRydWUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uU2Nyb2xsLCB0cnVlKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCwgdHJ1ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uU2Nyb2xsLCB0cnVlKTtcbiAgfTtcblxuICBmcm9tRXZlbnQ8TW91c2VFdmVudD4ocXVpbGwucm9vdCwgJ2NvbnRleHRtZW51Jykuc3Vic2NyaWJlKChldjogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpc0NlbGwgPSAhIXRhcmdldC5jbG9zZXN0KCd0ZCx0aCx0YWJsZSwucWwtdGFibGUnKTtcbiAgICBpZiAoIWlzQ2VsbCkgcmV0dXJuO1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIMavdSB0acOqbiBs4bqleSBpbmRleCB04burIGJsb3QgdMawxqFuZyDhu6luZyBub2RlXG4gICAgICBjb25zdCBRdWlsbEFueSA9IFF1aWxsMnggYXMgYW55O1xuICAgICAgY29uc3QgYmxvdCA9IFF1aWxsQW55Py5maW5kPy4odGFyZ2V0KTtcbiAgICAgIGlmIChibG90ICYmIHR5cGVvZiBibG90Lm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsYXN0Q29udGV4dEluZGV4ID0gYmxvdC5vZmZzZXQocXVpbGwuc2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiDEkeG6t3Qgc2VsZWN0aW9uIGhp4buHbiB04bqhaSBu4bq/dSBraMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjXG4gICAgICAgIGNvbnN0IHNlbCA9IHF1aWxsLmdldFNlbGVjdGlvbih0cnVlKTtcbiAgICAgICAgbGFzdENvbnRleHRJbmRleCA9IHNlbCA/IHNlbC5pbmRleCA6IDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCBzZWwgPSBxdWlsbC5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICBsYXN0Q29udGV4dEluZGV4ID0gc2VsID8gc2VsLmluZGV4IDogMDtcbiAgICB9XG4gICAgcXVpbGwuZm9jdXMoKTtcbiAgICBvcGVuQ29udGV4dE1lbnUoZXYucGFnZVgsIGV2LnBhZ2VZKTtcbiAgfSk7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVdGlsczogY2xlYXIgdsOgIHNlbGVjdCBjZWxsc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBjbGVhclNlbGVjdGlvbiA9ICgpID0+IHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkLWNlbGwnKS5mb3JFYWNoKChjKSA9PiB7XG4gICAgYy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZC1jZWxsJyk7XG4gIH0pO1xufTtcblxuY29uc3Qgc2VsZWN0UmFuZ2VDZWxscyA9IChzdGFydDogSFRNTEVsZW1lbnQsIGVuZDogSFRNTEVsZW1lbnQpID0+IHtcbiAgY2xlYXJTZWxlY3Rpb24oKTtcbiAgY29uc3QgdGFibGUgPSBzdGFydC5jbG9zZXN0KCd0YWJsZScpO1xuICBpZiAoIXRhYmxlIHx8IHRhYmxlICE9PSBlbmQuY2xvc2VzdCgndGFibGUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpO1xuICBjb25zdCBzdGFydFJvdyA9IHJvd3MuaW5kZXhPZihzdGFydC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQpO1xuICBjb25zdCBlbmRSb3cgPSByb3dzLmluZGV4T2YoZW5kLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCk7XG5cbiAgY29uc3QgbWluUm93ID0gTWF0aC5taW4oc3RhcnRSb3csIGVuZFJvdyk7XG4gIGNvbnN0IG1heFJvdyA9IE1hdGgubWF4KHN0YXJ0Um93LCBlbmRSb3cpO1xuXG4gIGNvbnN0IHN0YXJ0Q29sID0gQXJyYXkuZnJvbShzdGFydC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihzdGFydCk7XG4gIGNvbnN0IGVuZENvbCA9IEFycmF5LmZyb20oZW5kLnBhcmVudEVsZW1lbnQhLmNoaWxkcmVuKS5pbmRleE9mKGVuZCk7XG5cbiAgY29uc3QgbWluQ29sID0gTWF0aC5taW4oc3RhcnRDb2wsIGVuZENvbCk7XG4gIGNvbnN0IG1heENvbCA9IE1hdGgubWF4KHN0YXJ0Q29sLCBlbmRDb2wpO1xuXG4gIGZvciAobGV0IHIgPSBtaW5Sb3c7IHIgPD0gbWF4Um93OyByKyspIHtcbiAgICBjb25zdCByb3cgPSByb3dzW3JdO1xuICAgIGNvbnN0IGNlbGxzID0gQXJyYXkuZnJvbShyb3cuY2hpbGRyZW4pO1xuICAgIGZvciAobGV0IGMgPSBtaW5Db2w7IGMgPD0gbWF4Q29sOyBjKyspIHtcbiAgICAgIChjZWxsc1tjXSBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQtY2VsbCcpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5hYmxlIHNlbGVjdGlvbiB0csOqbiB0YWJsZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVRhYmxlU2VsZWN0aW9uKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCh0YXJnZXQudGFnTmFtZSA9PT0gJ1REJyAmJiBlLmJ1dHRvbiAhPT0gMikgfHwgKGUuYnV0dG9uID09PSAyICYmICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1jZWxsJykpKSB7XG4gICAgICBjbGVhclNlbGVjdGlvbigpO1xuICAgICAgaXNTZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgc3RhcnRDZWxsID0gdGFyZ2V0O1xuICAgICAgZW5kQ2VsbCA9IHRhcmdldDtcbiAgICAgIHNlbGVjdFJhbmdlQ2VsbHMoc3RhcnRDZWxsLCBlbmRDZWxsKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgIGlmICghaXNTZWxlY3RpbmcpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdURCcgJiYgc3RhcnRDZWxsKSB7XG4gICAgICBlbmRDZWxsID0gdGFyZ2V0O1xuICAgICAgc2VsZWN0UmFuZ2VDZWxscyhzdGFydENlbGwsIGVuZENlbGwpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7XG4gICAgaXNTZWxlY3RpbmcgPSBmYWxzZTtcbiAgfSk7XG59XG5jb25zdCBvbk91dHNpZGUgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICBpZiAodGFyZ2V0LnRhZ05hbWUgIT09ICdURCcgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdUUicgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdUQk9EWScgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdUSEVBRCcgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdUQUJMRScpIHtcbiAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xuICAgIHN0YXJ0Q2VsbCA9IG51bGw7XG4gICAgZW5kQ2VsbCA9IG51bGw7XG4gICAgY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxufTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlLCB0cnVlKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWVyZ2UgY2VsbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBjb25zdCBtZXJnZUNlbGxzID0gKHN0YXJ0Q2VsbDogSFRNTEVsZW1lbnQsIGVuZENlbGw6IEhUTUxFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHN0YXJ0Q2VsbEluZGV4ID0gc3RhcnRDZWxsLmdldEF0dHJpYnV0ZSgnaW5kZXgnKTtcbiAgY29uc3QgZW5kQ2VsbEluZGV4ID0gZW5kQ2VsbC5nZXRBdHRyaWJ1dGUoJ2luZGV4Jyk7XG4gIGNvbnN0IHN0YXJ0Q2VsbFJvdyA9IHBhcnNlSW50KHN0YXJ0Q2VsbEluZGV4Py5zcGxpdCgnLScpWzBdIHx8ICcwJywgMTApO1xuICBjb25zdCBlbmRDZWxsUm93ID0gcGFyc2VJbnQoZW5kQ2VsbEluZGV4Py5zcGxpdCgnLScpWzBdIHx8ICcwJywgMTApO1xuICBjb25zdCBzdGFydENlbGxDb2wgPSBwYXJzZUludChzdGFydENlbGxJbmRleD8uc3BsaXQoJy0nKVsxXSB8fCAnMCcsIDEwKTtcbiAgY29uc3QgZW5kQ2VsbENvbCA9IHBhcnNlSW50KGVuZENlbGxJbmRleD8uc3BsaXQoJy0nKVsxXSB8fCAnMCcsIDEwKTtcbiAgY29uc3QgbWluUm93ID0gTWF0aC5taW4oc3RhcnRDZWxsUm93LCBlbmRDZWxsUm93KTtcbiAgY29uc3QgbWF4Um93ID0gTWF0aC5tYXgoc3RhcnRDZWxsUm93LCBlbmRDZWxsUm93KTtcbiAgY29uc3QgbWluQ29sID0gTWF0aC5taW4oc3RhcnRDZWxsQ29sLCBlbmRDZWxsQ29sKTtcbiAgY29uc3QgbWF4Q29sID0gTWF0aC5tYXgoc3RhcnRDZWxsQ29sLCBlbmRDZWxsQ29sKTtcblxuICBjb25zdCByb3dzID0gc3RhcnRDZWxsLmNsb3Nlc3QoJ3RhYmxlJyk/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJyk7XG4gIHJvd3M/LmZvckVhY2goKHJvd0VsLCByb3dJbmRleCkgPT4ge1xuICAgIGlmIChyb3dJbmRleCA8IG1pblJvdyB8fCByb3dJbmRleCA+IG1heFJvdykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2VsbHMgPSByb3dFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCwgdGgnKTtcbiAgICBjZWxscy5mb3JFYWNoKChjZWxsRWwsIGNvbEluZGV4KSA9PiB7XG4gICAgICBpZiAoY29sSW5kZXggPCBtaW5Db2wgfHwgY29sSW5kZXggPiBtYXhDb2wpIHJldHVybjtcbiAgICAgIGlmIChyb3dJbmRleCA9PT0gbWluUm93ICYmIGNvbEluZGV4ID09PSBtaW5Db2wpIHtcbiAgICAgICAgY2VsbEVsLnNldEF0dHJpYnV0ZSgnY29sc3BhbicsIFN0cmluZyhtYXhDb2wgLSBtaW5Db2wgKyAxKSk7XG4gICAgICAgIGNlbGxFbC5zZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nLCBTdHJpbmcobWF4Um93IC0gbWluUm93ICsgMSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjZWxsRWwuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3BsaXQgY2VsbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdENlbGxzKGNlbGxTcGxpdDogSFRNTEVsZW1lbnQpIHtcbiAgY29uc3QgaW5kZXggPSBjZWxsU3BsaXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpO1xuICBsZXQgY29sU3BhbiA9IHBhcnNlSW50KGNlbGxTcGxpdC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSB8fCAnMScsIDEwKTtcbiAgbGV0IHJvd1NwYW4gPSBwYXJzZUludChjZWxsU3BsaXQuZ2V0QXR0cmlidXRlKCdyb3dzcGFuJykgfHwgJzEnLCAxMCk7XG4gIGNvbnN0IHRvdGFsQ2VsbFNwbGl0ID0gcm93U3BhbiAqIGNvbFNwYW47XG4gIGxldCBjb3VudENlbGxTcGxpdCA9IDA7XG4gIGNvbnN0IHJvd1N0YXJ0ID0gcGFyc2VJbnQoaW5kZXg/LnNwbGl0KCctJylbMF0gfHwgJzAnLCAxMCk7XG4gIGNvbnN0IGNvbFN0YXJ0ID0gcGFyc2VJbnQoaW5kZXg/LnNwbGl0KCctJylbMV0gfHwgJzAnLCAxMCk7XG4gIGNvbnN0IGNvbEluY3JlbWVudCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBjb25zdCByb3dJbmNyZW1lbnQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCByb3dzID0gY2VsbFNwbGl0LmNsb3Nlc3QoJ3RhYmxlJyk/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJyk7XG4gIHJvd3M/LmZvckVhY2goKHJvd0VsLCByb3dJbmRleCkgPT4ge1xuICAgIGlmIChyb3dJbmRleCA8IHJvd1N0YXJ0KSByZXR1cm47XG5cbiAgICBjb25zdCBjZWxscyA9IHJvd0VsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLCB0aCcpO1xuICAgIGNlbGxzLmZvckVhY2goKGNlbGxFbCwgY29sSW5kZXgpID0+IHtcbiAgICAgIGlmIChyb3dJbmRleCA8IHJvd1N0YXJ0IHx8IGNvbEluZGV4IDwgY29sU3RhcnQgfHwgcm93U3RhcnQgKyByb3dTcGFuIDwgcm93SW5kZXggfHwgY29sU3RhcnQgKyBjb2xTcGFuIDwgY29sSW5kZXggfHwgY291bnRDZWxsU3BsaXQgPj0gdG90YWxDZWxsU3BsaXQpIHJldHVybjtcbiAgICAgIGlmIChyb3dJbmRleCA9PT0gcm93U3RhcnQgJiYgY29sSW5kZXggPT09IGNvbFN0YXJ0KSB7XG4gICAgICAgIGNvdW50Q2VsbFNwbGl0Kys7XG4gICAgICAgIGNlbGxFbC5zZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nLCAnMScpO1xuICAgICAgICBjZWxsRWwuc2V0QXR0cmlidXRlKCdyb3dzcGFuJywgJzEnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjZWxsRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSkge1xuICAgICAgICBpZiAoIXJvd0luY3JlbWVudC5oYXMocm93SW5kZXgpKSB7XG4gICAgICAgICAgcm93U3BhbisrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29sSW5jcmVtZW50Lmhhcyhjb2xJbmRleCkpIHtcbiAgICAgICAgICBjb2xTcGFuKys7XG4gICAgICAgIH1cbiAgICAgICAgcm93SW5jcmVtZW50LmFkZChyb3dJbmRleCk7XG4gICAgICAgIGNvbEluY3JlbWVudC5hZGQoY29sSW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjZWxsRWwuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICBjb3VudENlbGxTcGxpdCsrO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEFsbFRhYmxlc1dpdGhTcGFuID0gKHF1aWxsOiBhbnkpID0+IHtcbiAgY29uc3Qgcm9vdCA9IHF1aWxsLnJvb3Q7XG5cbiAgLy8gVMOsbSB04bqldCBj4bqjIHRhYmxlIHRyb25nIHF1aWxsXG4gIGNvbnN0IHRhYmxlRWxzID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpO1xuXG4gIHRhYmxlRWxzLmZvckVhY2goKHRhYmxlRWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlRWwucXVlcnlTZWxlY3RvckFsbCgndHInKTtcbiAgICByb3dzLmZvckVhY2goKHJvd0VsLCBySW5kZXgpID0+IHtcbiAgICAgIHJvd0VsLnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBgJHtySW5kZXh9YCk7XG4gICAgICBjb25zdCBjZWxscyA9IHJvd0VsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLCB0aCcpO1xuICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbEVsLCBjSW5kZXgpID0+IHtcbiAgICAgICAgY2VsbEVsLnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBgJHtySW5kZXh9LSR7Y0luZGV4fWApO1xuICAgICAgICBjb25zdCByb3dzcGFuID0gcGFyc2VJbnQoY2VsbEVsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpIHx8ICcxJywgMTApO1xuICAgICAgICBjb25zdCBjb2xzcGFuID0gcGFyc2VJbnQoY2VsbEVsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpIHx8ICcxJywgMTApO1xuXG4gICAgICAgIGNlbGxFbC5zZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nLCBTdHJpbmcocm93c3BhbikpO1xuICAgICAgICBjZWxsRWwuc2V0QXR0cmlidXRlKCdjb2xzcGFuJywgU3RyaW5nKGNvbHNwYW4pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgcmVnaXN0ZXIgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCByZWdpc3RlclF1aWxsMnggPSAoKSA9PiB7XG4gIGlmIChyZWdpc3RlcikgcmV0dXJuO1xuICByZWdpc3RlciA9IHRydWU7XG5cbiAgY29uc3QgUXVpbGwgPSBRdWlsbDJ4IGFzIGFueTtcblxuICBjb25zdCBzaXplID0gUXVpbGwuaW1wb3J0KCdhdHRyaWJ1dG9ycy9zdHlsZS9zaXplJyk7XG4gIGNvbnN0IGFsaWduU3R5bGUgPSBRdWlsbC5pbXBvcnQoJ2F0dHJpYnV0b3JzL3N0eWxlL2FsaWduJyk7XG4gIGNvbnN0IGl0YWxpYyA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9pdGFsaWMnKTtcbiAgY29uc3QgYm9sZCA9IFF1aWxsLmltcG9ydCgnZm9ybWF0cy9ib2xkJyk7XG4gIGNvbnN0IGljb25zID0gUXVpbGwuaW1wb3J0KCd1aS9pY29ucycpO1xuICBzaXplLndoaXRlbGlzdCA9IGZvbnRTaXplV2hpdGVMaXN0KCk7XG5cbiAgaXRhbGljLnRhZ05hbWUgPSAnaSc7XG4gIGJvbGQudGFnTmFtZSA9ICdiJztcblxuICBRdWlsbC5yZWdpc3Rlcihib2xkLCB0cnVlKTtcbiAgUXVpbGwucmVnaXN0ZXIoaXRhbGljLCB0cnVlKTtcbiAgUXVpbGwucmVnaXN0ZXIoc2l6ZSwgdHJ1ZSk7XG4gIFF1aWxsLnJlZ2lzdGVyKGFsaWduU3R5bGUsIHRydWUpO1xuICBRdWlsbC5yZWdpc3RlcihRdWlsbE1lbnRpb24yeEJsb3QsIHRydWUpO1xuICBRdWlsbC5yZWdpc3RlcihDdXN0b21JbWFnZTJ4QmxvdCwgdHJ1ZSk7XG4gIFF1aWxsLnJlZ2lzdGVyKCdtb2R1bGVzL3Jlc2l6ZScsIFJlc2l6ZU1vZHVsZSk7XG4gIFsuLi5pY29uTGlzdCgpXS5mb3JFYWNoKChlbGVtZW50KSA9PiBzZXQoaWNvbnMsIGVsZW1lbnQua2V5LCBgPHNwYW4gY2xhc3M9XCIke2VsZW1lbnQuaWNvbn0gJHtlbGVtZW50LmtleSA9PT0gJ3VuTGluaycgPyAnaG92ZXI6dGV4dC1bI2VlMmQ0MV0gJyA6ICdob3Zlcjp0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEpXSd9IHRleHQtWzE2cHhdIHRleHQtWyM2YTczODNdXCI+PC9zcGFuPmApKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5UXVpbGwyeCA9IChxdWlsbDogUXVpbGwyeCB8IG51bGwpID0+IHtcbiAgY29uc3Qgcm9vdEVsZW1lbnQgPSBxdWlsbD8ucm9vdDtcbiAgaWYgKCFyb290RWxlbWVudCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGh0bWwgPSByb290RWxlbWVudC5pbm5lckhUTUwudHJpbSgpO1xuICByZXR1cm4gaHRtbCA9PT0gJzxwPjxicj48L3A+JyB8fCBodG1sID09PSAnPHA+PC9wPicgfHwgaHRtbCA9PT0gJycgfHwgaHRtbCA9PT0gJzxwPjxzcGFuIGNsYXNzPVwicWwtY3Vyc29yXCI+PC9zcGFuPjxicj48L3A+JyB8fCByb290RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3FsLWJsYW5rJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SFRNTEZyb21EZWx0YU9mUXVpbGwyeCA9IChcbiAgZGVsdGE6IERlbHRhLFxuICBvcHRpb25zPzoge1xuICAgIGdldFJvb3RIdG1sPzogYm9vbGVhbjtcbiAgICByZXBsYWNlTmV3TGluZVRvPzogc3RyaW5nO1xuICAgIHJlcGxhY2VUYWdCUlRvPzogc3RyaW5nO1xuICAgIHJlcGxhY2VCclRvRGl2PzogYm9vbGVhbjtcbiAgICBmdW5jdGlvblJlcGxhY2VEZWx0YT86IChvcDogRGVsdGEpID0+IHZvaWQ7XG4gICAgcmVwbGFjZVRhZ3M/OiB7XG4gICAgICB0YWc6IHN0cmluZztcbiAgICAgIHJlcGxhY2VUbzogc3RyaW5nO1xuICAgIH1bXTtcbiAgfVxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFkZWx0YSB8fCAhZGVsdGEub3BzIHx8ICFkZWx0YS5vcHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGlmICghcXVpbGwyeCkge1xuICAgIHF1aWxsMnggPSBuZXcgUXVpbGwyeChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gIH1cbiAgY29uc3QgeyByZXBsYWNlTmV3TGluZVRvID0gJzxicj4nLCByZXBsYWNlVGFnQlJUbywgcmVwbGFjZVRhZ3MsIHJlcGxhY2VCclRvRGl2IH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChvcHRpb25zPy5mdW5jdGlvblJlcGxhY2VEZWx0YSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25SZXBsYWNlRGVsdGEoZGVsdGEpO1xuICB9XG5cbiAgZGVsdGEub3BzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgaWYgKG9wLmluc2VydCkge1xuICAgICAgaWYgKHR5cGVvZiBvcC5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChyZXBsYWNlTmV3TGluZVRvKSB7XG4gICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UoL1xcbi9nLCByZXBsYWNlTmV3TGluZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVwbGFjZVRhZ0JSVG8pIHtcbiAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZSgvPGJyPi9nLCByZXBsYWNlVGFnQlJUbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVwbGFjZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHJlcGxhY2VUYWdzKSB7XG4gICAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZShuZXcgUmVnRXhwKGA8JHt0YWcudGFnfT5gLCAnZycpLCBgPCR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UobmV3IFJlZ0V4cChgPC8ke3RhZy50YWd9PmAsICdnJyksIGA8LyR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHF1aWxsMnguc2V0Q29udGVudHMoZGVsdGEpO1xuICBsZXQgaHRtbFRleHQgPSBvcHRpb25zPy5nZXRSb290SHRtbCA/IHF1aWxsMngucm9vdC5pbm5lckhUTUwgOiBxdWlsbDJ4LnJvb3QuZmlyc3RFbGVtZW50Q2hpbGQ/LmlubmVySFRNTDtcbiAgaWYgKHJlcGxhY2VCclRvRGl2KSB7XG4gICAgaHRtbFRleHQgPSBjb252ZXJ0SHRtbFRvRGl2QmxvY2tzKGh0bWxUZXh0IHx8ICcnKTtcbiAgfVxuICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBxdWlsbDJ4ID0gbnVsbDtcbiAgfSwgMTAwMDApO1xuICByZXR1cm4gZGVjb2RlRXNjYXBlSHRtbChodG1sVGV4dCB8fCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVsdGFPZlF1aWxsMnhGcm9tSFRNTCA9IGFzeW5jIChodG1sOiBzdHJpbmcpOiBQcm9taXNlPERlbHRhPiA9PiB7XG4gIGlmICghcXVpbGwyeCkge1xuICAgIHF1aWxsMnggPSBuZXcgUXVpbGwyeChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gIH1cbiAgcXVpbGwyeC5yb290LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgYXdhaXQgbGFzdFZhbHVlRnJvbSh0aW1lcigxMDAwKSk7XG4gIGNsZWFyVGltZW91dCh0aW1lb3V0MSk7XG4gIHRpbWVvdXQxID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgcXVpbGwyeCA9IG51bGw7XG4gIH0sIDEwMDAwKTtcbiAgcmV0dXJuIHF1aWxsMnguZ2V0Q29udGVudHMoKTtcbn07XG4iXX0=