@libs-ui/components-drag-drop 0.2.30

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.
@@ -0,0 +1,470 @@
1
+ import { Directive, effect, input, model, output, signal, untracked } from "@angular/core";
2
+ import { checkMouseOverInContainer, cloneDeep, get, set, uuid } from "@libs-ui/utils";
3
+ import { debounceTime, filter, takeUntil } from "rxjs";
4
+ import { styleContainer } from "./defines/css.define";
5
+ import { LibsUiComponentsDragScrollDirective } from "./drag-scroll.directive";
6
+ import * as i0 from "@angular/core";
7
+ export class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective {
8
+ /* PROPERTY */
9
+ groupID = signal(uuid());
10
+ isDragOver = signal(false);
11
+ /* INPUT */
12
+ disableDragContainer = input();
13
+ mode = input('move', { transform: value => value ?? 'move' });
14
+ directionDrag = input();
15
+ viewEncapsulation = input('emulated', { transform: value => value ?? 'emulated' });
16
+ acceptDragSameGroup = input(false, { transform: value => value ?? false });
17
+ placeholder = input(true, { transform: value => value ?? true });
18
+ groupName = input('groupDragAndDropDefault', { transform: value => value ?? 'groupDragAndDropDefault' }); // nếu các group có tên trùng nhau sẽ được drop
19
+ dropToGroupName = input(null); // nếu item trong các group A được drop vào group B nhưng group B không được drop vào group A
20
+ items = model.required();
21
+ stylesOverride = input();
22
+ /* OUTPUT */
23
+ outDragStartContainer = output();
24
+ outDragOverContainer = output();
25
+ outDragLeaveContainer = output();
26
+ outDragEndContainer = output();
27
+ outDroppedContainer = output();
28
+ outDroppedContainerEmpty = output();
29
+ outFunctionControl = output();
30
+ constructor() {
31
+ super();
32
+ const element = this.elementRef.nativeElement;
33
+ const container = { element };
34
+ this.dragDropService.Container.update(data => {
35
+ data.set(this.groupID(), container);
36
+ return data;
37
+ });
38
+ effect(() => {
39
+ if (!this.rootElementScroll()) {
40
+ return;
41
+ }
42
+ untracked(() => {
43
+ set(container, 'elementScroll', this.rootElementScroll());
44
+ this.dragDropService.Container.update(containerMap => new Map(containerMap));
45
+ });
46
+ });
47
+ effect(() => {
48
+ if (this.directionDrag() && this.elementRef.nativeElement) {
49
+ this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
50
+ }
51
+ });
52
+ effect(() => {
53
+ if (this.disableDragContainer() && this.elementRef.nativeElement) {
54
+ this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
55
+ }
56
+ });
57
+ }
58
+ ngAfterViewInit() {
59
+ this.outFunctionControl.emit({ setAttributeElementAndItemDrag: () => this.setAttributeElementAndItemDrag(this.elementRef.nativeElement) });
60
+ this.outDroppedContainer.subscribe(eventDropped => {
61
+ this.dragDropService.OnDropContainer.next(eventDropped);
62
+ });
63
+ const sub = this.onDestroy.subscribe(() => {
64
+ if (indexSpliceListTo > -1) {
65
+ this.items.update(items => {
66
+ items.splice(indexSpliceListTo, 1);
67
+ return [...items];
68
+ });
69
+ }
70
+ this.dragDropService.Container().delete(this.groupID());
71
+ sub.unsubscribe();
72
+ });
73
+ const elementContainer = this.elementRef.nativeElement;
74
+ this.initStyleAndAttribute(elementContainer, true);
75
+ this.dragDropService.OnItemInit.pipe(debounceTime(250), filter(groupName => groupName === this.groupName()), takeUntil(this.onDestroy)).subscribe(() => this.initStyleAndAttribute(elementContainer));
76
+ const styleTag = document.createElement("style");
77
+ styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());
78
+ elementContainer.appendChild(styleTag);
79
+ elementContainer.classList.add(this.dragDropService.ClassContainerDefine);
80
+ const handlerDragStart = (eventDragStart) => {
81
+ this.setAttributeElementAndItemDrag(elementContainer, true);
82
+ if (this.groupID() === eventDragStart.elementDrag.getAttribute('groupID')) {
83
+ this.outDragStartContainer.emit({ ...eventDragStart, itemDragInfo: this.dragDropService.ItemDragInfo });
84
+ }
85
+ };
86
+ const storeIndex = { indexDrag: -1, indexDragOver: -1 };
87
+ let indexSpliceListTo = -1;
88
+ const handlerDragOver = (eventDragOver) => {
89
+ const { elementDrag, elementDragOver } = eventDragOver;
90
+ if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
91
+ return;
92
+ }
93
+ const indexDrag = Number(elementDrag.getAttribute('index')).valueOf();
94
+ const indexDragOver = Number(elementDragOver.getAttribute('index')).valueOf();
95
+ const idGroupElementDrag = elementDrag.getAttribute('groupID');
96
+ const idGroupElementDragOver = elementDragOver.getAttribute('groupID');
97
+ if ((this.groupID() !== idGroupElementDrag) || (idGroupElementDrag !== idGroupElementDragOver)) { // xử lý cho item drag over qua 1 item khác container
98
+ if (idGroupElementDragOver === this.groupID() && this.placeholder()) {
99
+ const item = this.mode() === 'deepCopy' ? cloneDeep(this.dragDropService.ItemDragInfo?.item) : this.dragDropService.ItemDragInfo?.item;
100
+ if (indexSpliceListTo >= 0) {
101
+ this.items.update(items => {
102
+ items.splice(indexSpliceListTo, 1);
103
+ return [...items];
104
+ });
105
+ }
106
+ this.items.update(items => {
107
+ items.splice(indexDragOver, 0, item);
108
+ return [...items];
109
+ });
110
+ indexSpliceListTo = indexDragOver;
111
+ this.setAttributeElementAndItemDrag(elementContainer, false, indexSpliceListTo);
112
+ }
113
+ return;
114
+ }
115
+ if (!this.acceptDragSameGroup() || indexDrag < 0 || indexDragOver < 0 || !this.items().length || indexDrag > this.items().length || indexDragOver > this.items().length || (storeIndex.indexDrag === indexDrag && storeIndex.indexDragOver === indexDragOver)) {
116
+ return;
117
+ }
118
+ // xử lý cho item drag over qua 1 item cùng container
119
+ const itemDrag = this.items()[indexDrag];
120
+ this.setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver);
121
+ storeIndex.indexDrag = indexDrag;
122
+ storeIndex.indexDragOver = indexDragOver;
123
+ this.items.update(items => {
124
+ items.splice(indexDrag, 1);
125
+ return [...items];
126
+ });
127
+ this.items.update(items => {
128
+ items.splice(indexDragOver, 0, itemDrag);
129
+ return [...items];
130
+ });
131
+ elementDrag.setAttribute('index', indexDragOver.toString());
132
+ this.setAttributeElementAndItemDrag(elementContainer);
133
+ };
134
+ const removePlaceholderDrag = (eventDrag, isDragging) => {
135
+ clearInterval(this.intervalScrollToElement());
136
+ storeIndex.indexDrag = -1;
137
+ storeIndex.indexDragOver = -1;
138
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
139
+ if (!checkMouseOverInContainer(eventDrag.mousePosition, (this.rootElementScroll() || elementContainer))) {
140
+ const childElementIndex = Array.from(childrenElement).findIndex((child) => child.classList.contains('libs-ui-drag-drop-item-drop-placeholder'));
141
+ if (childElementIndex >= 0 && this.groupID() !== eventDrag.elementDrag.getAttribute('groupID')) {
142
+ this.items.update(items => {
143
+ items.splice(childElementIndex, 1);
144
+ return [...items];
145
+ });
146
+ }
147
+ indexSpliceListTo = -1;
148
+ this.removeAttributes(elementContainer, isDragging);
149
+ this.setIndexElement(elementContainer);
150
+ return;
151
+ }
152
+ if (indexSpliceListTo >= 0) {
153
+ this.items.update(items => {
154
+ items.splice(indexSpliceListTo, 1);
155
+ return [...items];
156
+ });
157
+ }
158
+ indexSpliceListTo = -1;
159
+ };
160
+ const handlerDragging = (eventDragging) => {
161
+ this.setAttributeElementAndItemDrag(elementContainer);
162
+ const { elementDrag } = eventDragging;
163
+ const fieldIdItem = elementDrag.getAttribute('field_id');
164
+ const idItemDrag = elementDrag.getAttribute('item_id');
165
+ if (fieldIdItem && idItemDrag && this.items().find(item => get(item, fieldIdItem) === idItemDrag)) {
166
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
167
+ const childElement = Array.from(childrenElement).find((child) => child.getAttribute('item_id') === idItemDrag);
168
+ if (this.items() === eventDragging.itemDragInfo?.itemsDrag() && childElement && !childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder') && !childElement.getAttribute(this.dragDropService.TargetItemDragFlag)) {
169
+ childElement.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');
170
+ this.groupID.set(elementDrag.getAttribute('groupID') || '');
171
+ styleTag.remove();
172
+ styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());
173
+ elementContainer.appendChild(styleTag);
174
+ this.setAttributeElementAndItemDrag(elementContainer, true);
175
+ }
176
+ }
177
+ if (this.disableDragContainer()) {
178
+ return;
179
+ }
180
+ if (this.groupID() === elementDrag.getAttribute('groupID') && !this.acceptDragSameGroup()) {
181
+ this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll() || !this.acceptDragSameGroup());
182
+ return;
183
+ }
184
+ if (!checkMouseOverInContainer(eventDragging.mousePosition, (this.rootElementScroll() || elementContainer))) {
185
+ if (this.isDragOver()) {
186
+ this.isDragOver.set(false);
187
+ this.outDragLeaveContainer.emit({ ...eventDragging, elementDragLeave: elementContainer });
188
+ }
189
+ return removePlaceholderDrag(eventDragging, true);
190
+ }
191
+ this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll());
192
+ // Đoạn code xử lý cho việc kéo một element vào 1 container nhưng container không có item hoặc item drag không over qua item trong container
193
+ if (!this.isDragOver()) {
194
+ elementContainer.classList.add('libs-ui-drag-drop-container-dragover');
195
+ this.isDragOver.set(true);
196
+ this.outDragOverContainer.emit({ ...eventDragging, elementDragOver: elementContainer });
197
+ }
198
+ const eventDragOver = { ...eventDragging, elementDragOver: elementContainer };
199
+ if (!this.items().length) {
200
+ eventDragOver.elementDragOver = {
201
+ getAttribute: (name) => {
202
+ if (name === 'groupID') {
203
+ return this.groupID();
204
+ }
205
+ if (name !== 'index') {
206
+ return null;
207
+ }
208
+ return 0;
209
+ }
210
+ };
211
+ this.dragDropService.OnDragOver.next(eventDragOver);
212
+ return;
213
+ }
214
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
215
+ let childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(eventDragging.mousePosition, child));
216
+ if (childElement) { // nếu tìm thấy thì sẽ nhận qua sự kiện của drag-item.directive emit
217
+ return;
218
+ }
219
+ childElement = Array.from(childrenElement).pop();
220
+ if (childElement) {
221
+ eventDragOver.elementDragOver = childElement;
222
+ this.dragDropService.OnDragOver.next(eventDragOver);
223
+ }
224
+ };
225
+ const handlerDragEnd = (eventDragEnd) => {
226
+ if (this.disableDragContainer()) {
227
+ return;
228
+ }
229
+ let rect = undefined;
230
+ if (this.rootElementScroll() || elementContainer) {
231
+ rect = (this.rootElementScroll() || elementContainer)?.getBoundingClientRect();
232
+ }
233
+ removePlaceholderDrag(eventDragEnd);
234
+ const { elementDrag, mousePosition, itemDragInfo } = eventDragEnd;
235
+ if (this.groupID() === elementDrag.getAttribute('groupID')) {
236
+ this.outDragEndContainer.emit({ ...eventDragEnd });
237
+ }
238
+ if (!checkMouseOverInContainer(mousePosition, this.rootElementScroll() || elementContainer, rect)) {
239
+ return;
240
+ }
241
+ const eventDrop = { elementDrag: elementDrag, elementDrop: elementContainer, itemDragInfo: itemDragInfo };
242
+ if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
243
+ return;
244
+ }
245
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
246
+ const childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(mousePosition, child));
247
+ if (childElement) {
248
+ eventDrop.elementDrop = childElement;
249
+ this.dragDropService.OnDrop.next(eventDrop);
250
+ return;
251
+ }
252
+ eventDrop.elementDrop = {
253
+ getAttribute: (name) => {
254
+ if (name === 'dropContainer') {
255
+ return true;
256
+ }
257
+ if (name === 'groupID') {
258
+ return this.groupID();
259
+ }
260
+ if (name !== 'index') {
261
+ return null;
262
+ }
263
+ return childrenElement.length;
264
+ }
265
+ };
266
+ this.dragDropService.OnDrop.next(eventDrop);
267
+ };
268
+ const handlerDrop = (eventDrop) => {
269
+ if (this.disableDragContainer()) {
270
+ return;
271
+ }
272
+ const { elementDrag, elementDrop, itemDragInfo } = eventDrop;
273
+ if (this.groupID() === elementDrag.getAttribute('groupID') && this.groupID() === elementDrop.getAttribute('groupID')) {
274
+ if (itemDragInfo) {
275
+ itemDragInfo.indexDrop = Number(elementDrop.getAttribute('index')).valueOf();
276
+ itemDragInfo.itemsDrop = this.items;
277
+ itemDragInfo.containerDrop = elementContainer;
278
+ }
279
+ if (this.acceptDragSameGroup()) {
280
+ this.removeAttributes(elementContainer);
281
+ this.setIndexElement(elementContainer);
282
+ }
283
+ return;
284
+ }
285
+ if (this.groupID() !== elementDrop.getAttribute('groupID') || elementDrag.getAttribute('groupID') === elementDrop.getAttribute('groupID')) {
286
+ return;
287
+ }
288
+ const indexDragOver = Number(elementDrop.getAttribute('index')).valueOf() - (elementDrop.getAttribute('dropContainer') ? 0 : 1);
289
+ const item = this.mode() === 'deepCopy' ? cloneDeep(itemDragInfo?.item) : itemDragInfo?.item;
290
+ if (itemDragInfo) {
291
+ itemDragInfo.indexDrop = indexDragOver;
292
+ itemDragInfo.itemsDrop = this.items;
293
+ itemDragInfo.containerDrop = elementContainer;
294
+ }
295
+ if (!this.items().length) {
296
+ this.outDroppedContainerEmpty.emit(eventDrop);
297
+ }
298
+ this.items.update(items => {
299
+ items.splice(indexDragOver, 0, item);
300
+ return [...items];
301
+ });
302
+ if (itemDragInfo && itemDragInfo.itemsMove && itemDragInfo.itemsMove()) {
303
+ itemDragInfo.itemsDrag.set([...itemDragInfo.itemsMove()]);
304
+ this.setAttributeElementAndItemDrag(elementContainer);
305
+ }
306
+ this.outDroppedContainer.emit(eventDrop);
307
+ this.removeAttributes(elementContainer);
308
+ this.setIndexElement(elementContainer);
309
+ };
310
+ [{
311
+ name: 'OnDragStart',
312
+ event: this.dragDropService.OnDragStart,
313
+ functionCall: handlerDragStart
314
+ }, {
315
+ name: 'OnDragOver',
316
+ event: this.dragDropService.OnDragOver,
317
+ functionCall: handlerDragOver
318
+ }, {
319
+ name: 'OnDragging',
320
+ event: this.dragDropService.OnDragging,
321
+ functionCall: handlerDragging
322
+ }, {
323
+ name: 'OnDragEnd',
324
+ event: this.dragDropService.OnDragEnd,
325
+ functionCall: handlerDragEnd
326
+ }, {
327
+ name: 'OnDrop',
328
+ event: this.dragDropService.OnDrop,
329
+ functionCall: handlerDrop
330
+ }].forEach((item) => (item.event.pipe(takeUntil(this.onDestroy)).subscribe(item.functionCall)));
331
+ }
332
+ /* */
333
+ async setAttributeElementAndItemDrag(elementContainer, setItemDrag, indexInsert) {
334
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
335
+ let index = -1;
336
+ elementContainer.setAttribute('groupID', this.groupID());
337
+ elementContainer.removeAttribute('disableDragContainer');
338
+ if (this.disableDragContainer()) {
339
+ elementContainer.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
340
+ }
341
+ if (this.groupName()) {
342
+ elementContainer.setAttribute('groupName', this.groupName() || '');
343
+ }
344
+ Array.from(childrenElement).forEach((childElement) => {
345
+ if (!childElement.hasAttribute('groupName') || childElement.getAttribute('groupName') === this.groupName()) {
346
+ childElement.setAttribute('groupID', this.groupID());
347
+ }
348
+ if (childElement.getAttribute('groupID') !== this.groupID()) {
349
+ return;
350
+ }
351
+ index += 1;
352
+ childElement.setAttribute('index', `${index}`);
353
+ childElement.removeAttribute('disableDragContainer');
354
+ if (this.disableDragContainer()) {
355
+ childElement.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
356
+ }
357
+ if (this.groupName() && !childElement.hasAttribute('groupName')) {
358
+ childElement.setAttribute('groupName', this.groupName() || '');
359
+ }
360
+ if (this.placeholder()) {
361
+ childElement.setAttribute('placeholder', `${this.placeholder()}`);
362
+ }
363
+ if (this.dropToGroupName()) {
364
+ childElement.setAttribute('dropToGroupName', `${this.dropToGroupName()?.join(';')}`);
365
+ }
366
+ if (indexInsert === index && this.placeholder()) {
367
+ if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
368
+ childElement.classList.add('libs-ui-drag-drop-item-placeholder');
369
+ }
370
+ if (!childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder')) {
371
+ childElement.classList.add('libs-ui-drag-drop-item-drop-placeholder');
372
+ }
373
+ }
374
+ if (setItemDrag && childElement.getAttribute(this.dragDropService.TargetItemDragFlag) && this.items().length >= index) {
375
+ if (this.placeholder()) {
376
+ if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
377
+ childElement.classList.add('libs-ui-drag-drop-item-placeholder');
378
+ }
379
+ if (!childElement.classList.contains('libs-ui-drag-drop-item-origin-placeholder')) {
380
+ childElement.classList.add('libs-ui-drag-drop-item-origin-placeholder');
381
+ }
382
+ }
383
+ this.dragDropService.ItemDragInfo = { item: this.items()[index], indexDrag: index, itemsDrag: this.items, containerDrag: elementContainer, itemsMove: signal([...this.items()]) };
384
+ if (this.mode() === 'move') {
385
+ this.dragDropService.ItemDragInfo.itemsMove?.update(items => {
386
+ items.splice(index, 1);
387
+ return [...items];
388
+ });
389
+ }
390
+ }
391
+ });
392
+ }
393
+ initStyleAndAttribute(elementContainer, hasRemoveAttribute = false) {
394
+ this.setAttributeElementAndItemDrag(elementContainer);
395
+ if (hasRemoveAttribute) {
396
+ this.removeAttributes(elementContainer);
397
+ }
398
+ this.setIndexElement(elementContainer);
399
+ }
400
+ ;
401
+ setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver) {
402
+ if (!this.directionDrag() || !elementDragOver) {
403
+ return;
404
+ }
405
+ if (this.directionDrag() === 'vertical') {
406
+ elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-bottom');
407
+ elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-top');
408
+ if (indexDrag > indexDragOver) {
409
+ elementDragOver.classList.add('libs-ui-drag-drop-item-translate-bottom');
410
+ }
411
+ if (indexDrag < indexDragOver) {
412
+ elementDragOver.classList.add('libs-ui-drag-drop-item-translate-top');
413
+ }
414
+ return;
415
+ }
416
+ elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-left');
417
+ elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-right');
418
+ if (indexDrag > indexDragOver) {
419
+ elementDragOver.classList.add('libs-ui-drag-drop-item-translate-right');
420
+ }
421
+ if (indexDrag < indexDragOver) {
422
+ elementDragOver.classList.add('libs-ui-drag-drop-item-translate-left');
423
+ }
424
+ }
425
+ setIndexElement(elementContainer) {
426
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
427
+ let index = -1;
428
+ Array.from(childrenElement).forEach((childElement) => {
429
+ if (childElement.getAttribute('groupID') !== this.groupID()) {
430
+ return;
431
+ }
432
+ index += 1;
433
+ childElement.setAttribute('index', `${index}`);
434
+ });
435
+ }
436
+ removeAttributes(elementContainer, ignoreRemoveClassItemOriginPlaceholder) {
437
+ const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
438
+ elementContainer.classList.remove('libs-ui-drag-drop-container-dragover');
439
+ Array.from(childrenElement).forEach((childElement) => {
440
+ if (childElement.getAttribute('groupID') !== this.groupID()) {
441
+ return;
442
+ }
443
+ childElement.removeAttribute('index');
444
+ if (!this.dropToGroupName() || !this.dropToGroupName()?.length) {
445
+ childElement.removeAttribute('dropToGroupName');
446
+ }
447
+ if (!this.placeholder()) {
448
+ childElement.removeAttribute('placeholder');
449
+ }
450
+ if (this.placeholder()) {
451
+ childElement.classList.remove('libs-ui-drag-drop-item-placeholder');
452
+ if (!ignoreRemoveClassItemOriginPlaceholder) {
453
+ childElement.classList.remove('libs-ui-drag-drop-item-origin-placeholder');
454
+ }
455
+ childElement.classList.remove('libs-ui-drag-drop-item-drop-placeholder');
456
+ }
457
+ });
458
+ }
459
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDragContainerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
460
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsDragContainerDirective, isStandalone: true, selector: "[LibsUiComponentsDragContainerDirective]", inputs: { disableDragContainer: { classPropertyName: "disableDragContainer", publicName: "disableDragContainer", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, directionDrag: { classPropertyName: "directionDrag", publicName: "directionDrag", isSignal: true, isRequired: false, transformFunction: null }, viewEncapsulation: { classPropertyName: "viewEncapsulation", publicName: "viewEncapsulation", isSignal: true, isRequired: false, transformFunction: null }, acceptDragSameGroup: { classPropertyName: "acceptDragSameGroup", publicName: "acceptDragSameGroup", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, groupName: { classPropertyName: "groupName", publicName: "groupName", isSignal: true, isRequired: false, transformFunction: null }, dropToGroupName: { classPropertyName: "dropToGroupName", publicName: "dropToGroupName", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, stylesOverride: { classPropertyName: "stylesOverride", publicName: "stylesOverride", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", outDragStartContainer: "outDragStartContainer", outDragOverContainer: "outDragOverContainer", outDragLeaveContainer: "outDragLeaveContainer", outDragEndContainer: "outDragEndContainer", outDroppedContainer: "outDroppedContainer", outDroppedContainerEmpty: "outDroppedContainerEmpty", outFunctionControl: "outFunctionControl" }, usesInheritance: true, ngImport: i0 });
461
+ }
462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDragContainerDirective, decorators: [{
463
+ type: Directive,
464
+ args: [{
465
+ // eslint-disable-next-line @angular-eslint/directive-selector
466
+ selector: "[LibsUiComponentsDragContainerDirective]",
467
+ standalone: true,
468
+ }]
469
+ }], ctorParameters: () => [] });
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWEsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTzlFLE1BQU0sT0FBTyxzQ0FBdUMsU0FBUSxtQ0FBbUM7SUFDN0YsY0FBYztJQUNOLE9BQU8sR0FBRyxNQUFNLENBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqQyxVQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTVDLFdBQVc7SUFDRixvQkFBb0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUF1QyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRyxhQUFhLEdBQUcsS0FBSyxFQUE2QixDQUFDO0lBQ25ELGlCQUFpQixHQUFHLEtBQUssQ0FBdUQsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLFVB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SUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7b0JBRTVDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUMzRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO3dHQWpoQlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0M7OzRGQUF0QyxzQ0FBc0M7a0JBTGxELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMENBQTBDO29CQUNwRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIE9uRGVzdHJveSwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgY2xvbmVEZWVwLCBnZXQsIHNldCwgdXVpZCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBzdHlsZUNvbnRhaW5lciB9IGZyb20gXCIuL2RlZmluZXMvY3NzLmRlZmluZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0RyYWdTY3JvbGxEaXJlY3RpdmUgfSBmcm9tIFwiLi9kcmFnLXNjcm9sbC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRHJhZ0VuZCwgSURyYWdMZWF2ZSwgSURyYWdPdmVyLCBJRHJhZ1N0YXJ0LCBJRHJhZ2dpbmcsIElEcm9wIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9ldmVudC5pbnRlcmZhY2VcIjtcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogXCJbTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmVdXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0RyYWdTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcml2YXRlIGdyb3VwSUQgPSBzaWduYWw8c3RyaW5nPih1dWlkKCkpO1xuICBwcml2YXRlIGlzRHJhZ092ZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5IGRpc2FibGVEcmFnQ29udGFpbmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PHN0cmluZywgJ21vdmUnIHwgJ2NvcHknIHwgJ2RlZXBDb3B5Jz4oJ21vdmUnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ21vdmUnIH0pO1xuICByZWFkb25seSBkaXJlY3Rpb25EcmFnID0gaW5wdXQ8J2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJz4oKTtcbiAgcmVhZG9ubHkgdmlld0VuY2Fwc3VsYXRpb24gPSBpbnB1dDwnZW11bGF0ZWQnIHwgJ25vbmUnLCAnZW11bGF0ZWQnIHwgJ25vbmUnIHwgdW5kZWZpbmVkPignZW11bGF0ZWQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2VtdWxhdGVkJyB9KTtcbiAgcmVhZG9ubHkgYWNjZXB0RHJhZ1NhbWVHcm91cCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/IHRydWUgfSk7XG4gIHJlYWRvbmx5IGdyb3VwTmFtZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2dyb3VwRHJhZ0FuZERyb3BEZWZhdWx0JyB9KTsgLy8gbuG6v3UgY8OhYyBncm91cCBjw7MgdMOqbiB0csO5bmcgbmhhdSBz4bq9IMSRxrDhu6NjIGRyb3BcbiAgcmVhZG9ubHkgZHJvcFRvR3JvdXBOYW1lID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiB8IG51bGw+KG51bGwpOyAvLyBu4bq/dSBpdGVtIHRyb25nIGPDoWMgZ3JvdXAgQSDEkcaw4bujYyBkcm9wIHbDoG8gZ3JvdXAgQiBuaMawbmcgZ3JvdXAgQiBraMO0bmcgxJHGsOG7o2MgZHJvcCB2w6BvIGdyb3VwIEFcbiAgcmVhZG9ubHkgaXRlbXMgPSBtb2RlbC5yZXF1aXJlZDxBcnJheTx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgc3R5bGVzT3ZlcnJpZGUgPSBpbnB1dDxBcnJheTx7IGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZXM6IHN0cmluZyB9Pj4oKTtcblxuICAvKiBPVVRQVVQgKi9cbiAgcmVhZG9ubHkgb3V0RHJhZ1N0YXJ0Q29udGFpbmVyID0gb3V0cHV0PElEcmFnU3RhcnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdPdmVyQ29udGFpbmVyID0gb3V0cHV0PElEcmFnT3Zlcj4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ0xlYXZlQ29udGFpbmVyID0gb3V0cHV0PElEcmFnTGVhdmU+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdFbmRDb250YWluZXIgPSBvdXRwdXQ8SURyYWdFbmQ+KCk7XG4gIHJlYWRvbmx5IG91dERyb3BwZWRDb250YWluZXIgPSBvdXRwdXQ8SURyb3A+KCk7XG4gIHJlYWRvbmx5IG91dERyb3BwZWRDb250YWluZXJFbXB0eSA9IG91dHB1dDxJRHJvcD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3QgY29udGFpbmVyID0geyBlbGVtZW50IH07XG5cbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Db250YWluZXIudXBkYXRlKGRhdGEgPT4ge1xuICAgICAgZGF0YS5zZXQodGhpcy5ncm91cElEKCksIGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBzZXQoY29udGFpbmVyLCAnZWxlbWVudFNjcm9sbCcsIHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSk7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lci51cGRhdGUoY29udGFpbmVyTWFwID0+IG5ldyBNYXAoY29udGFpbmVyTWFwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb25EcmFnKCkgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHsgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnOiAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkgfSk7XG5cbiAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXIuc3Vic2NyaWJlKGV2ZW50RHJvcHBlZCA9PiB7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3BDb250YWluZXIubmV4dChldmVudERyb3BwZWQpO1xuICAgIH0pO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMub25EZXN0cm95LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoaW5kZXhTcGxpY2VMaXN0VG8gPiAtMSkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lcigpLmRlbGV0ZSh0aGlzLmdyb3VwSUQoKSk7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICBjb25zdCBlbGVtZW50Q29udGFpbmVyID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICB0aGlzLmluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyLCB0cnVlKTtcbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Pbkl0ZW1Jbml0LnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIGZpbHRlcihncm91cE5hbWUgPT4gZ3JvdXBOYW1lID09PSB0aGlzLmdyb3VwTmFtZSgpKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaW5pdFN0eWxlQW5kQXR0cmlidXRlKGVsZW1lbnRDb250YWluZXIpKTtcbiAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblxuICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gc3R5bGVDb250YWluZXIoKHRoaXMuc3R5bGVzT3ZlcnJpZGUoKSB8fCBbXSksIHRoaXMudmlld0VuY2Fwc3VsYXRpb24oKSwgdGhpcy5ncm91cElEKCkpO1xuICAgIGVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgIGVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0NvbnRhaW5lckRlZmluZSk7XG5cbiAgICBjb25zdCBoYW5kbGVyRHJhZ1N0YXJ0ID0gKGV2ZW50RHJhZ1N0YXJ0OiBJRHJhZ1N0YXJ0KSA9PiB7XG5cbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBldmVudERyYWdTdGFydC5lbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICB0aGlzLm91dERyYWdTdGFydENvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnU3RhcnQsIGl0ZW1EcmFnSW5mbzogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzdG9yZUluZGV4ID0geyBpbmRleERyYWc6IC0xLCBpbmRleERyYWdPdmVyOiAtMSB9O1xuICAgIGxldCBpbmRleFNwbGljZUxpc3RUbyA9IC0xO1xuICAgIGNvbnN0IGhhbmRsZXJEcmFnT3ZlciA9IChldmVudERyYWdPdmVyOiBJRHJhZ092ZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIGVsZW1lbnREcmFnT3ZlciB9ID0gZXZlbnREcmFnT3ZlcjtcblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSB8fCAhdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2hlY2tFbGVtZW50T3ZlckFjY2VwdEVsZW1lbnREcmFnKHRoaXMuZ3JvdXBOYW1lKCksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJyksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4RHJhZyA9IE51bWJlcihlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKTtcbiAgICAgIGNvbnN0IGluZGV4RHJhZ092ZXIgPSBOdW1iZXIoZWxlbWVudERyYWdPdmVyLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpO1xuICAgICAgY29uc3QgaWRHcm91cEVsZW1lbnREcmFnID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJyk7XG4gICAgICBjb25zdCBpZEdyb3VwRWxlbWVudERyYWdPdmVyID0gZWxlbWVudERyYWdPdmVyLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpO1xuXG4gICAgICBpZiAoKHRoaXMuZ3JvdXBJRCgpICE9PSBpZEdyb3VwRWxlbWVudERyYWcpIHx8IChpZEdyb3VwRWxlbWVudERyYWcgIT09IGlkR3JvdXBFbGVtZW50RHJhZ092ZXIpKSB7IC8vIHjhu60gbMO9IGNobyBpdGVtIGRyYWcgb3ZlciBxdWEgMSBpdGVtIGtow6FjIGNvbnRhaW5lclxuICAgICAgICBpZiAoaWRHcm91cEVsZW1lbnREcmFnT3ZlciA9PT0gdGhpcy5ncm91cElEKCkgJiYgdGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZSgpID09PSAnZGVlcENvcHknID8gY2xvbmVEZWVwKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbz8uaXRlbSkgOiB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8/Lml0ZW07XG5cbiAgICAgICAgICBpZiAoaW5kZXhTcGxpY2VMaXN0VG8gPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhTcGxpY2VMaXN0VG8sIDEpO1xuICAgICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZGV4U3BsaWNlTGlzdFRvID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyLCBmYWxzZSwgaW5kZXhTcGxpY2VMaXN0VG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpIHx8IGluZGV4RHJhZyA8IDAgfHwgaW5kZXhEcmFnT3ZlciA8IDAgfHwgIXRoaXMuaXRlbXMoKS5sZW5ndGggfHwgaW5kZXhEcmFnID4gdGhpcy5pdGVtcygpLmxlbmd0aCB8fCBpbmRleERyYWdPdmVyID4gdGhpcy5pdGVtcygpLmxlbmd0aCB8fCAoc3RvcmVJbmRleC5pbmRleERyYWcgPT09IGluZGV4RHJhZyAmJiBzdG9yZUluZGV4LmluZGV4RHJhZ092ZXIgPT09IGluZGV4RHJhZ092ZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIHjhu60gbMO9IGNobyBpdGVtIGRyYWcgb3ZlciBxdWEgMSBpdGVtIGPDuW5nIGNvbnRhaW5lclxuICAgICAgY29uc3QgaXRlbURyYWcgPSB0aGlzLml0ZW1zKClbaW5kZXhEcmFnXTtcblxuICAgICAgdGhpcy5zZXRBbmltYXRpb25FbGVtZW50RHJhZ092ZXIoaW5kZXhEcmFnLCBpbmRleERyYWdPdmVyLCBlbGVtZW50RHJhZ092ZXIpO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWcgPSBpbmRleERyYWc7XG4gICAgICBzdG9yZUluZGV4LmluZGV4RHJhZ092ZXIgPSBpbmRleERyYWdPdmVyO1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnLCAxKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZ092ZXIsIDAsIGl0ZW1EcmFnKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcblxuICAgICAgZWxlbWVudERyYWcuc2V0QXR0cmlidXRlKCdpbmRleCcsIGluZGV4RHJhZ092ZXIudG9TdHJpbmcoKSk7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVtb3ZlUGxhY2Vob2xkZXJEcmFnID0gKGV2ZW50RHJhZzogSURyYWdFbmQsIGlzRHJhZ2dpbmc/OiBib29sZWFuKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxTY3JvbGxUb0VsZW1lbnQoKSk7XG4gICAgICBzdG9yZUluZGV4LmluZGV4RHJhZyA9IC0xO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID0gLTE7XG4gICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcblxuICAgICAgaWYgKCFjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50RHJhZy5tb3VzZVBvc2l0aW9uLCAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpKSkge1xuICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnRJbmRleCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZEluZGV4KChjaGlsZCkgPT4gY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKSk7XG5cbiAgICAgICAgaWYgKGNoaWxkRWxlbWVudEluZGV4ID49IDAgJiYgdGhpcy5ncm91cElEKCkgIT09IGV2ZW50RHJhZy5lbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShjaGlsZEVsZW1lbnRJbmRleCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleFNwbGljZUxpc3RUbyA9IC0xO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyLCBpc0RyYWdnaW5nKTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID49IDApIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleFNwbGljZUxpc3RUbywgMSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdnaW5nID0gKGV2ZW50RHJhZ2dpbmc6IElEcmFnZ2luZykgPT4ge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnIH0gPSBldmVudERyYWdnaW5nO1xuICAgICAgY29uc3QgZmllbGRJZEl0ZW0gPSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2ZpZWxkX2lkJyk7XG4gICAgICBjb25zdCBpZEl0ZW1EcmFnID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJyk7XG5cbiAgICAgIGlmIChmaWVsZElkSXRlbSAmJiBpZEl0ZW1EcmFnICYmIHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gZ2V0KGl0ZW0sIGZpZWxkSWRJdGVtKSA9PT0gaWRJdGVtRHJhZykpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZCgoY2hpbGQpID0+IGNoaWxkLmdldEF0dHJpYnV0ZSgnaXRlbV9pZCcpID09PSBpZEl0ZW1EcmFnKTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtcygpID09PSBldmVudERyYWdnaW5nLml0ZW1EcmFnSW5mbz8uaXRlbXNEcmFnKCkgJiYgY2hpbGRFbGVtZW50ICYmICFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKSAmJiAhY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcpKSB7XG4gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcsICd0cnVlJyk7XG4gICAgICAgICAgdGhpcy5ncm91cElELnNldChlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSB8fCAnJyk7XG4gICAgICAgICAgc3R5bGVUYWcucmVtb3ZlKCk7XG4gICAgICAgICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBzdHlsZUNvbnRhaW5lcigodGhpcy5zdHlsZXNPdmVycmlkZSgpIHx8IFtdKSwgdGhpcy52aWV3RW5jYXBzdWxhdGlvbigpLCB0aGlzLmdyb3VwSUQoKSk7XG4gICAgICAgICAgZWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgJiYgIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRTY3JvbGxFbGVtZW50VG9Qb3NpdGlvbihldmVudERyYWdnaW5nLCB0aGlzLmlnbm9yZUF1dG9TY3JvbGwoKSB8fCAhdGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWdnaW5nLm1vdXNlUG9zaXRpb24sICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcikpKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ092ZXIoKSkge1xuICAgICAgICAgIHRoaXMuaXNEcmFnT3Zlci5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMub3V0RHJhZ0xlYXZlQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ0xlYXZlOiBlbGVtZW50Q29udGFpbmVyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbW92ZVBsYWNlaG9sZGVyRHJhZyhldmVudERyYWdnaW5nLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tBbmRTY3JvbGxFbGVtZW50VG9Qb3NpdGlvbihldmVudERyYWdnaW5nLCB0aGlzLmlnbm9yZUF1dG9TY3JvbGwoKSk7XG5cbiAgICAgIC8vIMSQb+G6oW4gY29kZSB44butIGzDvSBjaG8gdmnhu4djIGvDqW8gbeG7mXQgZWxlbWVudCB2w6BvIDEgY29udGFpbmVyIG5oxrBuZyBjb250YWluZXIga2jDtG5nIGPDsyBpdGVtIGhv4bq3YyBpdGVtIGRyYWcga2jDtG5nIG92ZXIgcXVhIGl0ZW0gdHJvbmcgY29udGFpbmVyXG4gICAgICBpZiAoIXRoaXMuaXNEcmFnT3ZlcigpKSB7XG4gICAgICAgIGVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtY29udGFpbmVyLWRyYWdvdmVyJyk7XG4gICAgICAgIHRoaXMuaXNEcmFnT3Zlci5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMub3V0RHJhZ092ZXJDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnT3ZlcjogZWxlbWVudENvbnRhaW5lciB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RHJhZ092ZXIgPSB7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnT3ZlcjogZWxlbWVudENvbnRhaW5lciB9O1xuXG4gICAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgZXZlbnREcmFnT3Zlci5lbGVtZW50RHJhZ092ZXIgPSB7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwSUQnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3VwSUQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSAnaW5kZXgnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3Zlci5uZXh0KGV2ZW50RHJhZ092ZXIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICBsZXQgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kKChjaGlsZCkgPT4gY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWdnaW5nLm1vdXNlUG9zaXRpb24sIGNoaWxkKSk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHsgLy8gbuG6v3UgdMOsbSB0aOG6pXkgdGjDrCBz4bq9IG5o4bqtbiBxdWEgc+G7sSBraeG7h24gY+G7p2EgZHJhZy1pdGVtLmRpcmVjdGl2ZSBlbWl0XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkucG9wKCk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHtcbiAgICAgICAgZXZlbnREcmFnT3Zlci5lbGVtZW50RHJhZ092ZXIgPSBjaGlsZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIubmV4dChldmVudERyYWdPdmVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdFbmQgPSAoZXZlbnREcmFnRW5kOiBJRHJhZ0VuZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgcmVjdCA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSB7XG4gICAgICAgIHJlY3QgPSAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIH1cbiAgICAgIHJlbW92ZVBsYWNlaG9sZGVyRHJhZyhldmVudERyYWdFbmQpO1xuICAgICAgY29uc3QgeyBlbGVtZW50RHJhZywgbW91c2VQb3NpdGlvbiwgaXRlbURyYWdJbmZvIH0gPSBldmVudERyYWdFbmQ7XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgdGhpcy5vdXREcmFnRW5kQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdFbmQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VQb3NpdGlvbiwgdGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIsIHJlY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RHJvcCA9IHsgZWxlbWVudERyYWc6IGVsZW1lbnREcmFnLCBlbGVtZW50RHJvcDogZWxlbWVudENvbnRhaW5lciwgaXRlbURyYWdJbmZvOiBpdGVtRHJhZ0luZm8gfTtcblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSB8fCAhdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2hlY2tFbGVtZW50T3ZlckFjY2VwdEVsZW1lbnREcmFnKHRoaXMuZ3JvdXBOYW1lKCksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJyksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmQoKGNoaWxkKSA9PiBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKG1vdXNlUG9zaXRpb24sIGNoaWxkKSk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHtcbiAgICAgICAgZXZlbnREcm9wLmVsZW1lbnREcm9wID0gY2hpbGRFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AubmV4dChldmVudERyb3ApO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50RHJvcC5lbGVtZW50RHJvcCA9IHtcbiAgICAgICAgZ2V0QXR0cmlidXRlOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKG5hbWUgPT09ICdkcm9wQ29udGFpbmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuYW1lID09PSAnZ3JvdXBJRCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3VwSUQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5hbWUgIT09ICdpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGlsZHJlbkVsZW1lbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AubmV4dChldmVudERyb3ApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJvcCA9IChldmVudERyb3A6IElEcm9wKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIGVsZW1lbnREcm9wLCBpdGVtRHJhZ0luZm8gfSA9IGV2ZW50RHJvcDtcblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAmJiB0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgaWYgKGl0ZW1EcmFnSW5mbykge1xuICAgICAgICAgIGl0ZW1EcmFnSW5mby5pbmRleERyb3AgPSBOdW1iZXIoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJvcCA9IHRoaXMuaXRlbXM7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLmNvbnRhaW5lckRyb3AgPSBlbGVtZW50Q29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgICAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgIT09IGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpID09PSBlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleERyYWdPdmVyID0gTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpIC0gKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZHJvcENvbnRhaW5lcicpID8gMCA6IDEpO1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZSgpID09PSAnZGVlcENvcHknID8gY2xvbmVEZWVwKGl0ZW1EcmFnSW5mbz8uaXRlbSkgOiBpdGVtRHJhZ0luZm8/Lml0ZW07XG5cbiAgICAgIGlmIChpdGVtRHJhZ0luZm8pIHtcbiAgICAgICAgaXRlbURyYWdJbmZvLmluZGV4RHJvcCA9IGluZGV4RHJhZ092ZXI7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5pdGVtc0Ryb3AgPSB0aGlzLml0ZW1zO1xuICAgICAgICBpdGVtRHJhZ0luZm8uY29udGFpbmVyRHJvcCA9IGVsZW1lbnRDb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXJFbXB0eS5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZ092ZXIsIDAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbURyYWdJbmZvICYmIGl0ZW1EcmFnSW5mby5pdGVtc01vdmUgJiYgaXRlbURyYWdJbmZvLml0ZW1zTW92ZSgpKSB7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5pdGVtc0RyYWcuc2V0KFsuLi5pdGVtRHJhZ0luZm8uaXRlbXNNb3ZlKCldKTtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lci5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgW3tcbiAgICAgIG5hbWU6ICdPbkRyYWdTdGFydCcsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnU3RhcnQsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnU3RhcnRcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnT25EcmFnT3ZlcicsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3ZlcixcbiAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdPdmVyXG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJhZ2dpbmcnLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ2dpbmcsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnZ2luZ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdPbkRyYWdFbmQnLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ0VuZCxcbiAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdFbmRcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnT25Ecm9wJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcm9wXG4gICAgfV0uZm9yRWFjaCgoaXRlbTogeyBuYW1lOiBzdHJpbmc7IGV2ZW50OiBPYnNlcnZhYmxlPHVua25vd24+OyBmdW5jdGlvbkNhbGw6IG9iamVjdCB9KSA9PiAoaXRlbS5ldmVudC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShpdGVtLmZ1bmN0aW9uQ2FsbCkpKTtcblxuICB9XG5cbiAgLyogKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNldEl0ZW1EcmFnPzogYm9vbGVhbiwgaW5kZXhJbnNlcnQ/OiBudW1iZXIpIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdncm91cElEJywgdGhpcy5ncm91cElEKCkpO1xuICAgIGVsZW1lbnRDb250YWluZXIucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicpO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgZWxlbWVudENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVEcmFnQ29udGFpbmVyJywgYCR7dGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpfWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncm91cE5hbWUoKSkge1xuICAgICAgZWxlbWVudENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScsIHRoaXMuZ3JvdXBOYW1lKCkgfHwgJycpO1xuICAgIH1cbiAgICBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZvckVhY2goKGNoaWxkRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuaGFzQXR0cmlidXRlKCdncm91cE5hbWUnKSB8fCBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cE5hbWUnKSA9PT0gdGhpcy5ncm91cE5hbWUoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdncm91cElEJywgdGhpcy5ncm91cElEKCkpO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAhPT0gdGhpcy5ncm91cElEKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2luZGV4JywgYCR7aW5kZXh9YCk7XG4gICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicpO1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicsIGAke3RoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3VwTmFtZSgpICYmICFjaGlsZEVsZW1lbnQuaGFzQXR0cmlidXRlKCdncm91cE5hbWUnKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdncm91cE5hbWUnLCB0aGlzLmdyb3VwTmFtZSgpIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBgJHt0aGlzLnBsYWNlaG9sZGVyKCl9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcm9wVG9Hcm91cE5hbWUoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnLCBgJHt0aGlzLmRyb3BUb0dyb3VwTmFtZSgpPy5qb2luKCc7Jyl9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhJbnNlcnQgPT09IGluZGV4ICYmIHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0SXRlbURyYWcgJiYgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcpICYmIHRoaXMuaXRlbXMoKS5sZW5ndGggPj0gaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgIGlmICghY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tb3JpZ2luLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyA9IHsgaXRlbTogdGhpcy5pdGVtcygpW2luZGV4XSBhcyBvYmplY3QsIGluZGV4RHJhZzogaW5kZXgsIGl0ZW1zRHJhZzogdGhpcy5pdGVtcywgY29udGFpbmVyRHJhZzogZWxlbWVudENvbnRhaW5lciwgaXRlbXNNb3ZlOiBzaWduYWwoWy4uLnRoaXMuaXRlbXMoKV0pIH07XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vdmUnKSB7XG4gICAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvLml0ZW1zTW92ZT8udXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCwgaGFzUmVtb3ZlQXR0cmlidXRlID0gZmFsc2UsKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgaWYgKGhhc1JlbW92ZUF0dHJpYnV0ZSkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwcml2YXRlIHNldEFuaW1hdGlvbkVsZW1lbnREcmFnT3ZlcihpbmRleERyYWc6IG51bWJlciwgaW5kZXhEcmFnT3ZlcjogbnVtYmVyLCBlbGVtZW50RHJhZ092ZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmRpcmVjdGlvbkRyYWcoKSB8fCAhZWxlbWVudERyYWdPdmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRpcmVjdGlvbkRyYWcoKSA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWJvdHRvbScpO1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXRvcCcpO1xuICAgICAgaWYgKGluZGV4RHJhZyA+IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWJvdHRvbScpO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4RHJhZyA8IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXRvcCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWxlZnQnKTtcbiAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtcmlnaHQnKTtcbiAgICBpZiAoaW5kZXhEcmFnID4gaW5kZXhEcmFnT3Zlcikge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXJpZ2h0Jyk7XG4gICAgfVxuICAgIGlmIChpbmRleERyYWcgPCBpbmRleERyYWdPdmVyKSB7XG4gICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtbGVmdCcpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBgJHtpbmRleH1gKTtcbiAgICB9KTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBpZ25vcmVSZW1vdmVDbGFzc0l0ZW1PcmlnaW5QbGFjZWhvbGRlcj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcblxuICAgIGVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtY29udGFpbmVyLWRyYWdvdmVyJyk7XG4gICAgQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgIT09IHRoaXMuZ3JvdXBJRCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2luZGV4Jyk7XG4gICAgICBpZiAoIXRoaXMuZHJvcFRvR3JvdXBOYW1lKCkgfHwgIXRoaXMuZHJvcFRvR3JvdXBOYW1lKCk/Lmxlbmd0aCkge1xuICAgICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIGlmICghaWdub3JlUmVtb3ZlQ2xhc3NJdGVtT3JpZ2luUGxhY2Vob2xkZXIpIHtcblxuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG59XG4iXX0=