ngx-edu-sharing-ui 10.0.20 → 10.0.22

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.
Files changed (131) hide show
  1. package/assets/scss/material-theme.scss +3 -3
  2. package/assets/scss/mixins.scss +1 -1
  3. package/assets/scss/variables-root.scss +2 -0
  4. package/assets/scss/variables-scss.scss +3 -4
  5. package/assets/scss/variables.scss +1 -1
  6. package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
  7. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
  8. package/lib/index.d.ts +1 -0
  9. package/lib/list-items/list-widget.d.ts +1 -1
  10. package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
  11. package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
  12. package/package.json +8 -9
  13. package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
  14. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
  15. package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
  16. package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
  17. package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
  18. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
  19. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
  20. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
  21. package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
  22. package/esm2022/lib/directives/icon.directive.mjs +0 -184
  23. package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
  24. package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
  25. package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
  26. package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
  27. package/esm2022/lib/index.mjs +0 -96
  28. package/esm2022/lib/list-items/available-widgets.mjs +0 -27
  29. package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
  30. package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
  31. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
  32. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
  33. package/esm2022/lib/list-items/list-items.module.mjs +0 -50
  34. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
  35. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
  36. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
  37. package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
  38. package/esm2022/lib/list-items/list-widget.mjs +0 -49
  39. package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
  40. package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
  41. package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
  42. package/esm2022/lib/mds/mds.module.mjs +0 -16
  43. package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
  44. package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
  45. package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
  46. package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
  47. package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
  48. package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
  49. package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
  50. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
  51. package/esm2022/lib/node-entries/entries-model.mjs +0 -24
  52. package/esm2022/lib/node-entries/items-cap.mjs +0 -47
  53. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
  54. package/esm2022/lib/node-entries/node-cache.mjs +0 -73
  55. package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
  56. package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
  57. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
  58. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
  59. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
  60. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
  61. package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
  62. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
  63. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
  64. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
  65. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
  66. package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
  67. package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
  68. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
  69. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
  70. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
  71. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
  72. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
  73. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
  74. package/esm2022/lib/node-url/node-url.component.mjs +0 -132
  75. package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
  76. package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
  77. package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
  78. package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
  79. package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
  80. package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
  81. package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
  82. package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
  83. package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
  84. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
  85. package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
  86. package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
  87. package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
  88. package/esm2022/lib/services/abstract/app.service.mjs +0 -3
  89. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
  90. package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
  91. package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
  92. package/esm2022/lib/services/accessibility.service.mjs +0 -73
  93. package/esm2022/lib/services/app-container.service.mjs +0 -69
  94. package/esm2022/lib/services/local-events.service.mjs +0 -43
  95. package/esm2022/lib/services/node-entries.service.mjs +0 -201
  96. package/esm2022/lib/services/node-helper.service.mjs +0 -330
  97. package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
  98. package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
  99. package/esm2022/lib/services/render-helper.service.mjs +0 -114
  100. package/esm2022/lib/services/repo-url.service.mjs +0 -50
  101. package/esm2022/lib/services/search-helper.service.mjs +0 -52
  102. package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
  103. package/esm2022/lib/services/ui.service.mjs +0 -327
  104. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
  105. package/esm2022/lib/spinner/spinner.component.mjs +0 -19
  106. package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
  107. package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
  108. package/esm2022/lib/translations/translation-loader.mjs +0 -219
  109. package/esm2022/lib/translations/translation-source.mjs +0 -11
  110. package/esm2022/lib/translations/translations.module.mjs +0 -82
  111. package/esm2022/lib/translations/translations.service.mjs +0 -238
  112. package/esm2022/lib/types/accessibillity.mjs +0 -19
  113. package/esm2022/lib/types/api-models.mjs +0 -2
  114. package/esm2022/lib/types/drag-drop.mjs +0 -2
  115. package/esm2022/lib/types/injection-tokens.mjs +0 -31
  116. package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
  117. package/esm2022/lib/types/list-item.mjs +0 -41
  118. package/esm2022/lib/types/option-item.mjs +0 -192
  119. package/esm2022/lib/types/workflow.mjs +0 -25
  120. package/esm2022/lib/util/DateHelper.mjs +0 -200
  121. package/esm2022/lib/util/VCard.mjs +0 -278
  122. package/esm2022/lib/util/color-helper.mjs +0 -124
  123. package/esm2022/lib/util/duration-helper.mjs +0 -102
  124. package/esm2022/lib/util/functions.mjs +0 -13
  125. package/esm2022/lib/util/helper.mjs +0 -64
  126. package/esm2022/lib/util/isNumeric.mjs +0 -11
  127. package/esm2022/lib/util/rest-helper.mjs +0 -42
  128. package/esm2022/lib/util/ui-animation.mjs +0 -146
  129. package/esm2022/lib/util/ui-constants.mjs +0 -21
  130. package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
  131. package/esm2022/public-api.mjs +0 -2
@@ -1,329 +0,0 @@
1
- import { CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
2
- import { ChangeDetectionStrategy, Component, effect, ElementRef, HostBinding, Input, ViewChild, ViewChildren, } from '@angular/core';
3
- import { RestConstants } from 'ngx-edu-sharing-api';
4
- import * as rxjs from 'rxjs';
5
- import { BehaviorSubject, Subject } from 'rxjs';
6
- import { distinctUntilChanged, map, switchMap, take, takeUntil } from 'rxjs/operators';
7
- import { NodeEntriesDisplayType } from '../entries-model';
8
- import { ItemsCap } from '../items-cap';
9
- import { SortSelectPanelComponent } from '../sort-select-panel/sort-select-panel.component';
10
- import { CustomTemplatesDataSource } from '../custom-templates-data-source';
11
- import { Target } from '../../types/option-item';
12
- import { ListItemSort } from '../../types/list-item';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "../../services/node-entries.service";
15
- import * as i2 from "../node-entries-global.service";
16
- import * as i3 from "../node-entries-templates.service";
17
- import * as i4 from "../../services/node-helper.service";
18
- import * as i5 from "../../services/ui.service";
19
- import * as i6 from "@angular/common";
20
- import * as i7 from "@angular/cdk/overlay";
21
- import * as i8 from "@angular/cdk/drag-drop";
22
- import * as i9 from "../../directives/border-box-observer.directive";
23
- import * as i10 from "../../dropdown/dropdown.component";
24
- import * as i11 from "../../directives/icon.directive";
25
- import * as i12 from "../../directives/infinite-scroll.directive";
26
- import * as i13 from "../../spinner/spinner.component";
27
- import * as i14 from "@angular/material/button";
28
- import * as i15 from "@angular/material/badge";
29
- import * as i16 from "@angular/material/tooltip";
30
- import * as i17 from "../node-entries-table/column-chooser/column-chooser.component";
31
- import * as i18 from "../node-entries-card/node-entries-card.component";
32
- import * as i19 from "../node-entries-card-small/node-entries-card-small.component";
33
- import * as i20 from "../sort-select-panel/sort-select-panel.component";
34
- import * as i21 from "../../directives/drag-nodes/nodes-drag.directive";
35
- import * as i22 from "../../directives/drag-nodes/nodes-drop-target.directive";
36
- import * as i23 from "../node-entries-global-options/node-entries-global-options.component";
37
- import * as i24 from "@ngx-translate/core";
38
- let displayedWarnings = [];
39
- export class NodeEntriesCardGridComponent {
40
- set gridTop(value) {
41
- this.registerGridTop(value);
42
- }
43
- set sortPanel(value) {
44
- // if (this.entriesService.dataSource instanceof NodeDataSourceRemote) {
45
- setTimeout(() => {
46
- this.entriesService.dataSource.sortPanel = value;
47
- });
48
- // }
49
- }
50
- constructor(entriesService, entriesGlobalService, templatesService, nodeHelperService, ui, ngZone) {
51
- this.entriesService = entriesService;
52
- this.entriesGlobalService = entriesGlobalService;
53
- this.templatesService = templatesService;
54
- this.nodeHelperService = nodeHelperService;
55
- this.ui = ui;
56
- this.ngZone = ngZone;
57
- this.NodeEntriesDisplayType = NodeEntriesDisplayType;
58
- this.Target = Target;
59
- /**
60
- * relative scrolling when a scrolling arrow (left or right) is used
61
- * a value of 1 would mean to scroll the full width of the entire content
62
- */
63
- this.ScrollingOffsetPercentage = 0.4;
64
- this.columnChooserVisible$ = new BehaviorSubject(false);
65
- this.isDragging = false; // Drag-and-drop, not rearrange
66
- /**
67
- * Whether the number of shown items is limited by `gridConfig.maxRows`.
68
- *
69
- * A value of `true` does not mean, that there would be more items available.
70
- */
71
- this.visibleItemsLimited = false;
72
- /**
73
- * updates via boxObserver
74
- * and holds the information if scrolling in the direction is currently feasible
75
- */
76
- this.scroll = {
77
- left: false,
78
- right: false,
79
- };
80
- this.itemsPerRowSubject = new BehaviorSubject(null);
81
- this.itemsCap = new ItemsCap();
82
- this.destroyed = new Subject();
83
- this.canDropNodes = (dragData) => this.entriesService.dragDrop.dropAllowed?.(dragData);
84
- this.nodes$ = this.entriesService.dataSource$.pipe(switchMap((dataSource) => dataSource?.connect()));
85
- this.maxRows$ = this.entriesService.gridConfig$.pipe(map((gridConfig) => gridConfig?.maxRows || null), distinctUntilChanged());
86
- this.layout$ = this.entriesService.gridConfig$.pipe(map((gridConfig) => gridConfig?.layout || 'grid'), distinctUntilChanged());
87
- this.entriesService.dataSource$.pipe(takeUntil(this.destroyed)).subscribe(() => {
88
- this.updateScrollState();
89
- });
90
- effect(() => (this.scrollGradientColor = this.entriesService.scrollGradientColor()));
91
- }
92
- ngOnInit() {
93
- this.registerItemsCap();
94
- this.registerLayout();
95
- this.registerVisibleItemsLimited();
96
- }
97
- ngOnDestroy() {
98
- this.destroyed.next();
99
- this.destroyed.complete();
100
- }
101
- registerGridTop(gridTop) {
102
- setTimeout(() => {
103
- this.templatesService.entriesTopMatter = gridTop;
104
- });
105
- this.destroyed.subscribe(() => {
106
- if (this.templatesService.entriesTopMatter === gridTop) {
107
- setTimeout(() => {
108
- this.templatesService.entriesTopMatter = null;
109
- });
110
- }
111
- });
112
- }
113
- registerItemsCap() {
114
- this.entriesService.dataSource$
115
- .pipe(takeUntil(this.destroyed))
116
- .subscribe((dataSource) => (dataSource.itemsCap = this.itemsCap));
117
- rxjs.combineLatest([this.itemsPerRowSubject.pipe(distinctUntilChanged()), this.maxRows$])
118
- .pipe(map(([itemsPerRow, maxRows]) => maxRows > 0 && itemsPerRow !== null ? itemsPerRow * maxRows : null))
119
- .subscribe((cap) => (this.itemsCap.cap = cap));
120
- }
121
- registerLayout() {
122
- this.layout$.subscribe((layout) => (this.layout = layout));
123
- }
124
- onSortChange(sort) {
125
- this.entriesService.sort.active = sort.active;
126
- this.entriesService.sort.direction = sort.direction;
127
- this.entriesService.sortChange.emit(this.entriesService.sort);
128
- }
129
- loadData(source) {
130
- // @TODO: Maybe this is better handled in a more centraled service
131
- if (source === 'scroll') {
132
- // check if there is a footer
133
- const elements = document.getElementsByTagName('footer');
134
- if (elements.length && elements.item(0).innerHTML.trim()) {
135
- return;
136
- }
137
- }
138
- const couldLoadMore = this.entriesService.loadMore(source);
139
- if (couldLoadMore && source === 'button') {
140
- this.focusFirstNewItemWhenLoaded();
141
- }
142
- }
143
- onCustomSortingInProgressChange() {
144
- this.entriesService.sortChange.emit(this.entriesService.sort);
145
- setTimeout(() => {
146
- this.refreshDropLists();
147
- });
148
- }
149
- onRearrangeDragEntered($event) {
150
- moveItemInArray(this.entriesService.dataSource.getData(), $event.item.data, $event.container.data);
151
- // `CdkDrag` doesn't really want us to rearrange the items while dragging. Its cached
152
- // element positions get out of sync unless we update them manually.
153
- this.ngZone.runOutsideAngular(() => setTimeout(() => this.dropLists?.forEach((list) => list._dropListRef['_cacheItems']())));
154
- }
155
- onRearrangeDragStarted() {
156
- this.globalCursorStyle = document.createElement('style');
157
- document.body.appendChild(this.globalCursorStyle);
158
- this.globalCursorStyle.innerHTML = `* {cursor: grabbing !important; }`;
159
- }
160
- onRearrangeDragEnded() {
161
- document.body.removeChild(this.globalCursorStyle);
162
- this.globalCursorStyle = null;
163
- }
164
- getDragStartDelay() {
165
- if (this.ui.isMobile()) {
166
- return 500;
167
- }
168
- else {
169
- return null;
170
- }
171
- }
172
- registerVisibleItemsLimited() {
173
- this.maxRows$.subscribe((maxRows) => {
174
- this.visibleItemsLimited = maxRows > 0;
175
- });
176
- }
177
- refreshDropLists() {
178
- this.dropLists = this.dropListsQuery.toArray();
179
- }
180
- focusFirstNewItemWhenLoaded() {
181
- const oldLength = this.itemRefs.length;
182
- this.itemRefs.changes
183
- .pipe(take(1))
184
- .subscribe((items) => {
185
- if (items.length > oldLength) {
186
- this.focusOnce(items.get(oldLength).nativeElement);
187
- }
188
- });
189
- }
190
- focusOnce(element) {
191
- element.setAttribute('tabindex', '-1');
192
- element.focus();
193
- element.addEventListener('blur', () => element.removeAttribute('tabindex'), { once: true });
194
- }
195
- onGridSizeChanges() {
196
- const itemsPerRow = this.getItemsPerRow();
197
- this.itemsPerRowSubject.next(itemsPerRow);
198
- this.updateScrollState();
199
- }
200
- getItemsPerRow() {
201
- if (!this.gridRef?.nativeElement) {
202
- return null;
203
- }
204
- return getComputedStyle(this.gridRef.nativeElement)
205
- .getPropertyValue('grid-template-columns')
206
- .split(' ').length;
207
- }
208
- getSortColumns() {
209
- return this.entriesService.sort?.columns?.filter((c) => {
210
- const result = this.entriesService.columns
211
- .concat(new ListItemSort('NODE', 'score'), new ListItemSort('NODE', RestConstants.CCM_PROP_COLLECTION_ORDERED_POSITION), new ListItemSort('NODE', RestConstants.CM_PROP_TITLE), new ListItemSort('NODE', RestConstants.CM_NAME), new ListItemSort('NODE', RestConstants.CM_PROP_C_CREATED), new ListItemSort('NODE', RestConstants.CM_MODIFIED_DATE), new ListItemSort('NODE', RestConstants.CCM_PROP_REPLICATIONMODIFIED), new ListItemSort('NODE', RestConstants.CCM_PROP_REPLICATIONSOURCETIMESTAMP))
212
- .some((c2) => c.type === c2.type && c2.name === c.name);
213
- if (!result && !this.entriesService.configureColumns) {
214
- return this.entriesService.sort?.columns;
215
- /*
216
- const warning =
217
- 'Sort field ' +
218
- c.name +
219
- ' was specified but is not present as a column. ' +
220
- 'It will be ignored. Please also configure this field in the <lists> section';
221
- if (!displayedWarnings.includes(warning)) {
222
- console.warn(warning);
223
- displayedWarnings.push(warning);
224
- }*/
225
- }
226
- return result;
227
- });
228
- }
229
- onNodesDropped(dragData) {
230
- this.entriesService.dragDrop.dropped(dragData.target, {
231
- element: dragData.draggedNodes,
232
- mode: dragData.action,
233
- });
234
- }
235
- getDragEnabled() {
236
- return this.ui.isTouchSubject.pipe(map((touch) => !touch && this.entriesService.dragDrop?.dragAllowed));
237
- }
238
- getDragData(node) {
239
- const selection = this.entriesService.selection;
240
- if (selection.isSelected(node)) {
241
- return selection.selected;
242
- }
243
- else {
244
- return [node];
245
- }
246
- }
247
- onDragStarted(node) {
248
- if (!this.entriesService.selection.isSelected(node)) {
249
- this.entriesService.selection.clear();
250
- this.entriesService.selection.select(node);
251
- }
252
- this.isDragging = true;
253
- }
254
- onDragEnded() {
255
- this.isDragging = false;
256
- }
257
- canScroll(direction) {
258
- const element = this.gridRef?.nativeElement;
259
- if (element) {
260
- if (direction === 'left') {
261
- return element.scrollLeft > 0;
262
- }
263
- else if (direction === 'right') {
264
- /*
265
- use a small pixel buffer (10px) because scrolling aligns with the start of each card and
266
- it can cause slight alignment issues on the end of the container
267
- */
268
- return element.scrollLeft < element.scrollWidth - element.clientWidth - 10;
269
- }
270
- }
271
- return false;
272
- }
273
- updateScrollState() {
274
- if (this.layout === 'scroll') {
275
- this.scroll.left = this.canScroll('left');
276
- this.scroll.right = this.canScroll('right');
277
- }
278
- }
279
- doScroll(direction) {
280
- // 1 is enough because the browser will handle it via css snapping
281
- const leftScroll = this.gridRef?.nativeElement.scrollLeft;
282
- const rect = this.gridRef?.nativeElement.getBoundingClientRect();
283
- // using scroll because it works more reliable than scrollBy
284
- this.gridRef?.nativeElement.scroll({
285
- left: leftScroll +
286
- Math.max(250, rect.width * this.ScrollingOffsetPercentage) *
287
- (direction === 'right' ? 1 : -1),
288
- behavior: 'smooth',
289
- });
290
- }
291
- isCustomTemplate(node) {
292
- return (this.entriesService.dataSource instanceof CustomTemplatesDataSource ||
293
- node.elementRef);
294
- }
295
- isBlocked(node) {
296
- return (node.properties?.[RestConstants.CCM_PROP_IMPORT_BLOCKED]?.[0] === 'true' ||
297
- this.nodeHelperService.isNodeRevoked(node));
298
- }
299
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesCardGridComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeEntriesGlobalService }, { token: i3.NodeEntriesTemplatesService }, { token: i4.NodeHelperService }, { token: i5.UIService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
300
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: NodeEntriesCardGridComponent, selector: "es-node-entries-card-grid", inputs: { displayType: "displayType" }, host: { properties: { "style.--scroll-gradient-color": "this.scrollGradientColor" } }, viewQueries: [{ propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "gridTop", first: true, predicate: ["gridTop"], descendants: true, static: true }, { propertyName: "sortPanel", first: true, predicate: SortSelectPanelComponent, descendants: true }, { propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }, { propertyName: "dropListsQuery", predicate: CdkDropList, descendants: true }, { propertyName: "itemRefs", predicate: ["item"], descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate(node)\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate(node)\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"(getDragEnabled() | async) === false\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"(getDragEnabled() | async) === false\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== 'scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,#fff0 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i9.BorderBoxObserverDirective, selector: "[esBorderBoxObserver]", outputs: ["esBorderBoxObserver"], exportAs: ["borderBoxObserver"] }, { kind: "component", type: i10.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObjects", "showDisabled", "menuClass"] }, { kind: "directive", type: i11.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i12.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i13.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i15.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i17.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i18.NodeEntriesCardComponent, selector: "es-node-entries-card", inputs: ["dropdown", "node"] }, { kind: "component", type: i19.NodeEntriesCardSmallComponent, selector: "es-node-entries-card-small", inputs: ["node"] }, { kind: "component", type: i20.SortSelectPanelComponent, selector: "es-sort-select-panel", inputs: ["active", "direction", "columns", "customSortingInProgress"], outputs: ["sortChange", "customSortingInProgressChange"] }, { kind: "directive", type: i21.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i22.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i23.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
301
- }
302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesCardGridComponent, decorators: [{
303
- type: Component,
304
- args: [{ selector: 'es-node-entries-card-grid', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate(node)\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate(node)\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"(getDragEnabled() | async) === false\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"(getDragEnabled() | async) === false\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== 'scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,#fff0 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\n"] }]
305
- }], ctorParameters: () => [{ type: i1.NodeEntriesService }, { type: i2.NodeEntriesGlobalService }, { type: i3.NodeEntriesTemplatesService }, { type: i4.NodeHelperService }, { type: i5.UIService }, { type: i0.NgZone }], propDecorators: { columnChooserTrigger: [{
306
- type: ViewChild,
307
- args: ['columnChooserTrigger']
308
- }], gridTop: [{
309
- type: ViewChild,
310
- args: ['gridTop', { static: true }]
311
- }], sortPanel: [{
312
- type: ViewChild,
313
- args: [SortSelectPanelComponent]
314
- }], dropListsQuery: [{
315
- type: ViewChildren,
316
- args: [CdkDropList]
317
- }], gridRef: [{
318
- type: ViewChild,
319
- args: ['grid']
320
- }], itemRefs: [{
321
- type: ViewChildren,
322
- args: ['item', { read: ElementRef }]
323
- }], displayType: [{
324
- type: Input
325
- }], scrollGradientColor: [{
326
- type: HostBinding,
327
- args: ['style.--scroll-gradient-color']
328
- }] } });
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9ub2RlLWVudHJpZXMtY2FyZC1ncmlkL25vZGUtZW50cmllcy1jYXJkLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC9ub2RlLWVudHJpZXMtY2FyZC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBUSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUFjLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUs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Q2xFLElBQVksQ0FBQyxVQUFVLENBQzNCLENBQUM7SUFDTixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVU7UUFDaEIsT0FBTyxDQUNILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU07WUFDeEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FDN0MsQ0FBQztJQUNOLENBQUM7K0dBcFZRLDRCQUE0QjttR0FBNUIsNEJBQTRCLDZiQWMxQix3QkFBd0Isc0pBUXJCLFdBQVcsaUdBRUssVUFBVSw2QkNuRTVDLHM5UUFpT0E7OzRGRHRMYSw0QkFBNEI7a0JBTnhDLFNBQVM7K0JBQ0ksMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNO3FQQVlaLG9CQUFvQjtzQkFBdEQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBQ1csT0FBTztzQkFBbEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUlsQyxTQUFTO3NCQURaLFNBQVM7dUJBQUMsd0JBQXdCO2dCQVFSLGNBQWM7c0JBQXhDLFlBQVk7dUJBQUMsV0FBVztnQkFDTixPQUFPO3NCQUF6QixTQUFTO3VCQUFDLE1BQU07Z0JBQzJCLFFBQVE7c0JBQW5ELFlBQVk7dUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDakMsV0FBVztzQkFBbkIsS0FBSztnQkEyQndDLG1CQUFtQjtzQkFBaEUsV0FBVzt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRW50ZXIsIENka0Ryb3BMaXN0LCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGVmZmVjdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE5vZGUsIFJlc3RDb25zdGFudHMgfSBmcm9tICduZ3gtZWR1LXNoYXJpbmctYXBpJztcbmltcG9ydCAqIGFzIHJ4anMgZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgR3JpZExheW91dCwgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSB9IGZyb20gJy4uL2VudHJpZXMtbW9kZWwnO1xuaW1wb3J0IHsgSXRlbXNDYXAgfSBmcm9tICcuLi9pdGVtcy1jYXAnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzLWdsb2JhbC5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBTb3J0U2VsZWN0UGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9zb3J0LXNlbGVjdC1wYW5lbC9zb3J0LXNlbGVjdC1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzRGF0YVNvdXJjZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1lbnRyaWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdWkuc2VydmljZSc7XG5pbXBvcnQgeyBMaXN0SXRlbVNvcnQgfSBmcm9tICcuLi8uLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgRHJhZ0RhdGEgfSBmcm9tICcuLi8uLi90eXBlcy9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ2RrT3ZlcmxheU9yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE5vZGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZSc7XG5cbmxldCBkaXNwbGF5ZWRXYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtY2FyZC1ncmlkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ25vZGUtZW50cmllcy1jYXJkLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydub2RlLWVudHJpZXMtY2FyZC1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzQ2FyZEdyaWRDb21wb25lbnQ8VCBleHRlbmRzIE5vZGU+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHJlYWRvbmx5IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUgPSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuICAgIHJlYWRvbmx5IFRhcmdldCA9IFRhcmdldDtcbiAgICAvKipcbiAgICAgKiByZWxhdGl2ZSBzY3JvbGxpbmcgd2hlbiBhIHNjcm9sbGluZyBhcnJvdyAobGVmdCBvciByaWdodCkgaXMgdXNlZFxuICAgICAqIGEgdmFsdWUgb2YgMSB3b3VsZCBtZWFuIHRvIHNjcm9sbCB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgZW50aXJlIGNvbnRlbnRcbiAgICAgKi9cbiAgICByZWFkb25seSBTY3JvbGxpbmdPZmZzZXRQZXJjZW50YWdlID0gMC40O1xuXG4gICAgY29sdW1uQ2hvb3NlclZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgQFZpZXdDaGlsZCgnY29sdW1uQ2hvb3NlclRyaWdnZXInKSBjb2x1bW5DaG9vc2VyVHJpZ2dlcjogQ2RrT3ZlcmxheU9yaWdpbjtcbiAgICBAVmlld0NoaWxkKCdncmlkVG9wJywgeyBzdGF0aWM6IHRydWUgfSkgc2V0IGdyaWRUb3AodmFsdWU6IFRlbXBsYXRlUmVmPHVua25vd24+KSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJHcmlkVG9wKHZhbHVlKTtcbiAgICB9XG4gICAgQFZpZXdDaGlsZChTb3J0U2VsZWN0UGFuZWxDb21wb25lbnQpXG4gICAgc2V0IHNvcnRQYW5lbCh2YWx1ZTogU29ydFNlbGVjdFBhbmVsQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIGlmICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZVJlbW90ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgYXMgYW55KS5zb3J0UGFuZWwgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgQFZpZXdDaGlsZHJlbihDZGtEcm9wTGlzdCkgZHJvcExpc3RzUXVlcnk6IFF1ZXJ5TGlzdDxDZGtEcm9wTGlzdD47XG4gICAgQFZpZXdDaGlsZCgnZ3JpZCcpIGdyaWRSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZHJlbignaXRlbScsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBpdGVtUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcbiAgICBASW5wdXQoKSBkaXNwbGF5VHlwZTogTm9kZUVudHJpZXNEaXNwbGF5VHlwZTtcblxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gRHJhZy1hbmQtZHJvcCwgbm90IHJlYXJyYW5nZVxuICAgIGRyb3BMaXN0czogQ2RrRHJvcExpc3RbXTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBudW1iZXIgb2Ygc2hvd24gaXRlbXMgaXMgbGltaXRlZCBieSBgZ3JpZENvbmZpZy5tYXhSb3dzYC5cbiAgICAgKlxuICAgICAqIEEgdmFsdWUgb2YgYHRydWVgIGRvZXMgbm90IG1lYW4sIHRoYXQgdGhlcmUgd291bGQgYmUgbW9yZSBpdGVtcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgdmlzaWJsZUl0ZW1zTGltaXRlZCA9IGZhbHNlO1xuICAgIGxheW91dDogR3JpZExheW91dDtcbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHZpYSBib3hPYnNlcnZlclxuICAgICAqIGFuZCBob2xkcyB0aGUgaW5mb3JtYXRpb24gaWYgc2Nyb2xsaW5nIGluIHRoZSBkaXJlY3Rpb24gaXMgY3VycmVudGx5IGZlYXNpYmxlXG4gICAgICovXG4gICAgc2Nyb2xsID0ge1xuICAgICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgICAgcmlnaHQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICByZWFkb25seSBub2RlcyQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhSb3dzJDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dCQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpdGVtc1BlclJvd1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAgIHJlYWRvbmx5IGl0ZW1zQ2FwID0gbmV3IEl0ZW1zQ2FwPFQ+KCk7XG4gICAgcHJpdmF0ZSBnbG9iYWxDdXJzb3JTdHlsZTogSFRNTFN0eWxlRWxlbWVudDtcbiAgICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLXNjcm9sbC1ncmFkaWVudC1jb2xvcicpIHNjcm9sbEdyYWRpZW50Q29sb3I6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIGVudHJpZXNHbG9iYWxTZXJ2aWNlOiBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyB0ZW1wbGF0ZXNTZXJ2aWNlOiBOb2RlRW50cmllc1RlbXBsYXRlc1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBub2RlSGVscGVyU2VydmljZTogTm9kZUhlbHBlclNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyB1aTogVUlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICkge1xuICAgICAgICB0aGlzLm5vZGVzJCA9IHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSQucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZGF0YVNvdXJjZSkgPT4gZGF0YVNvdXJjZT8uY29ubmVjdCgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tYXhSb3dzJCA9IHRoaXMuZW50cmllc1NlcnZpY2UuZ3JpZENvbmZpZyQucGlwZShcbiAgICAgICAgICAgIG1hcCgoZ3JpZENvbmZpZykgPT4gZ3JpZENvbmZpZz8ubWF4Um93cyB8fCBudWxsKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGF5b3V0JCA9IHRoaXMuZW50cmllc1NlcnZpY2UuZ3JpZENvbmZpZyQucGlwZShcbiAgICAgICAgICAgIG1hcCgoZ3JpZENvbmZpZykgPT4gZ3JpZENvbmZpZz8ubGF5b3V0IHx8ICdncmlkJyksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVmZmVjdCgoKSA9PiAodGhpcy5zY3JvbGxHcmFkaWVudENvbG9yID0gdGhpcy5lbnRyaWVzU2VydmljZS5zY3JvbGxHcmFkaWVudENvbG9yKCkpKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlckl0ZW1zQ2FwKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMYXlvdXQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpc2libGVJdGVtc0xpbWl0ZWQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJHcmlkVG9wKGdyaWRUb3A6IFRlbXBsYXRlUmVmPHVua25vd24+KTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmVudHJpZXNUb3BNYXR0ZXIgPSBncmlkVG9wO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlc1NlcnZpY2UuZW50cmllc1RvcE1hdHRlciA9PT0gZ3JpZFRvcCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1NlcnZpY2UuZW50cmllc1RvcE1hdHRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJJdGVtc0NhcCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2UpID0+IChkYXRhU291cmNlLml0ZW1zQ2FwID0gdGhpcy5pdGVtc0NhcCkpO1xuICAgICAgICByeGpzLmNvbWJpbmVMYXRlc3QoW3RoaXMuaXRlbXNQZXJSb3dTdWJqZWN0LnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksIHRoaXMubWF4Um93cyRdKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChbaXRlbXNQZXJSb3csIG1heFJvd3NdKSA9PlxuICAgICAgICAgICAgICAgICAgICBtYXhSb3dzID4gMCAmJiBpdGVtc1BlclJvdyAhPT0gbnVsbCA/IGl0ZW1zUGVyUm93ICogbWF4Um93cyA6IG51bGwsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNhcCkgPT4gKHRoaXMuaXRlbXNDYXAuY2FwID0gY2FwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckxheW91dCgpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQkLnN1YnNjcmliZSgobGF5b3V0KSA9PiAodGhpcy5sYXlvdXQgPSBsYXlvdXQpKTtcbiAgICB9XG5cbiAgICBvblNvcnRDaGFuZ2Uoc29ydDogU29ydCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydC5kaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Q2hhbmdlLmVtaXQodGhpcy5lbnRyaWVzU2VydmljZS5zb3J0KTtcbiAgICB9XG5cbiAgICBsb2FkRGF0YShzb3VyY2U6ICdzY3JvbGwnIHwgJ2J1dHRvbicpIHtcbiAgICAgICAgLy8gQFRPRE86IE1heWJlIHRoaXMgaXMgYmV0dGVyIGhhbmRsZWQgaW4gYSBtb3JlIGNlbnRyYWxlZCBzZXJ2aWNlXG4gICAgICAgIGlmIChzb3VyY2UgPT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIGZvb3RlclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZm9vdGVyJyk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoICYmIGVsZW1lbnRzLml0ZW0oMCkuaW5uZXJIVE1MLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3VsZExvYWRNb3JlID0gdGhpcy5lbnRyaWVzU2VydmljZS5sb2FkTW9yZShzb3VyY2UpO1xuICAgICAgICBpZiAoY291bGRMb2FkTW9yZSAmJiBzb3VyY2UgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3ROZXdJdGVtV2hlbkxvYWRlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Q2hhbmdlLmVtaXQodGhpcy5lbnRyaWVzU2VydmljZS5zb3J0KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEcm9wTGlzdHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25SZWFycmFuZ2VEcmFnRW50ZXJlZCgkZXZlbnQ6IENka0RyYWdFbnRlcikge1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLFxuICAgICAgICAgICAgJGV2ZW50Lml0ZW0uZGF0YSxcbiAgICAgICAgICAgICRldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gYENka0RyYWdgIGRvZXNuJ3QgcmVhbGx5IHdhbnQgdXMgdG8gcmVhcnJhbmdlIHRoZSBpdGVtcyB3aGlsZSBkcmFnZ2luZy4gSXRzIGNhY2hlZFxuICAgICAgICAvLyBlbGVtZW50IHBvc2l0aW9ucyBnZXQgb3V0IG9mIHN5bmMgdW5sZXNzIHdlIHVwZGF0ZSB0aGVtIG1hbnVhbGx5LlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcExpc3RzPy5mb3JFYWNoKChsaXN0KSA9PiAobGlzdC5fZHJvcExpc3RSZWYgYXMgYW55KVsnX2NhY2hlSXRlbXMnXSgpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25SZWFycmFuZ2VEcmFnU3RhcnRlZCgpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxDdXJzb3JTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5nbG9iYWxDdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ3Vyc29yU3R5bGUuaW5uZXJIVE1MID0gYCoge2N1cnNvcjogZ3JhYmJpbmcgIWltcG9ydGFudDsgfWA7XG4gICAgfVxuXG4gICAgb25SZWFycmFuZ2VEcmFnRW5kZWQoKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5nbG9iYWxDdXJzb3JTdHlsZSk7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ3Vyc29yU3R5bGUgPSBudWxsO1xuICAgIH1cblxuICAgIGdldERyYWdTdGFydERlbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnVpLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiA1MDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJWaXNpYmxlSXRlbXNMaW1pdGVkKCkge1xuICAgICAgICB0aGlzLm1heFJvd3MkLnN1YnNjcmliZSgobWF4Um93cykgPT4ge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlSXRlbXNMaW1pdGVkID0gbWF4Um93cyA+IDA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaERyb3BMaXN0cygpIHtcbiAgICAgICAgdGhpcy5kcm9wTGlzdHMgPSB0aGlzLmRyb3BMaXN0c1F1ZXJ5LnRvQXJyYXkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzRmlyc3ROZXdJdGVtV2hlbkxvYWRlZCgpIHtcbiAgICAgICAgY29uc3Qgb2xkTGVuZ3RoID0gdGhpcy5pdGVtUmVmcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuaXRlbVJlZnMuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGl0ZW1zOiBOb2RlRW50cmllc0NhcmRHcmlkQ29tcG9uZW50PFQ+WydpdGVtUmVmcyddKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IG9sZExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzT25jZShpdGVtcy5nZXQob2xkTGVuZ3RoKS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzT25jZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIG9uR3JpZFNpemVDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtc1BlclJvdyA9IHRoaXMuZ2V0SXRlbXNQZXJSb3coKTtcbiAgICAgICAgdGhpcy5pdGVtc1BlclJvd1N1YmplY3QubmV4dChpdGVtc1BlclJvdyk7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEl0ZW1zUGVyUm93KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5ncmlkUmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJylcbiAgICAgICAgICAgIC5zcGxpdCgnICcpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTb3J0Q29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uY29sdW1ucz8uZmlsdGVyKChjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgJ3Njb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX0NPTExFQ1RJT05fT1JERVJFRF9QT1NJVElPTiksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNNX1BST1BfVElUTEUpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DTV9OQU1FKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ01fUFJPUF9DX0NSRUFURUQpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DTV9NT0RJRklFRF9EQVRFKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ0NNX1BST1BfUkVQTElDQVRJT05NT0RJRklFRCksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX1JFUExJQ0FUSU9OU09VUkNFVElNRVNUQU1QKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnNvbWUoKGMyKSA9PiBjLnR5cGUgPT09IGMyLnR5cGUgJiYgYzIubmFtZSA9PT0gYy5uYW1lKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0ICYmICF0aGlzLmVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5jb2x1bW5zO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgJ1NvcnQgZmllbGQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBjLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyB3YXMgc3BlY2lmaWVkIGJ1dCBpcyBub3QgcHJlc2VudCBhcyBhIGNvbHVtbi4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSXQgd2lsbCBiZSBpZ25vcmVkLiBQbGVhc2UgYWxzbyBjb25maWd1cmUgdGhpcyBmaWVsZCBpbiB0aGUgPGxpc3RzPiBzZWN0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXNwbGF5ZWRXYXJuaW5ncy5pbmNsdWRlcyh3YXJuaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkV2FybmluZ3MucHVzaCh3YXJuaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfSovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjYW5Ecm9wTm9kZXMgPSAoZHJhZ0RhdGE6IERyYWdEYXRhPFQ+KSA9PiB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BBbGxvd2VkPy4oZHJhZ0RhdGEpO1xuXG4gICAgb25Ob2Rlc0Ryb3BwZWQoZHJhZ0RhdGE6IERyYWdEYXRhPE5vZGU+KSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3AuZHJvcHBlZChkcmFnRGF0YS50YXJnZXQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRyYWdEYXRhLmRyYWdnZWROb2RlcyxcbiAgICAgICAgICAgIG1vZGU6IGRyYWdEYXRhLmFjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RHJhZ0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVpLmlzVG91Y2hTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBtYXAoKHRvdWNoKSA9PiAhdG91Y2ggJiYgdGhpcy5lbnRyaWVzU2VydmljZS5kcmFnRHJvcD8uZHJhZ0FsbG93ZWQpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldERyYWdEYXRhKG5vZGU6IFQpOiBUW10ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtub2RlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0ZWQobm9kZTogVCkge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkRyYWdFbmRlZCgpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5TY3JvbGwoZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zY3JvbGxMZWZ0ID4gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgdXNlIGEgc21hbGwgcGl4ZWwgYnVmZmVyICgxMHB4KSBiZWNhdXNlIHNjcm9sbGluZyBhbGlnbnMgd2l0aCB0aGUgc3RhcnQgb2YgZWFjaCBjYXJkIGFuZFxuICAgICAgICAgICAgICAgICBpdCBjYW4gY2F1c2Ugc2xpZ2h0IGFsaWdubWVudCBpc3N1ZXMgb24gdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc2Nyb2xsTGVmdCA8IGVsZW1lbnQuc2Nyb2xsV2lkdGggLSBlbGVtZW50LmNsaWVudFdpZHRoIC0gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVwZGF0ZVNjcm9sbFN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbC5sZWZ0ID0gdGhpcy5jYW5TY3JvbGwoJ2xlZnQnKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsLnJpZ2h0ID0gdGhpcy5jYW5TY3JvbGwoJ3JpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkb1Njcm9sbChkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICAgICAgLy8gMSBpcyBlbm91Z2ggYmVjYXVzZSB0aGUgYnJvd3NlciB3aWxsIGhhbmRsZSBpdCB2aWEgY3NzIHNuYXBwaW5nXG4gICAgICAgIGNvbnN0IGxlZnRTY3JvbGwgPSB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZ3JpZFJlZj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgLy8gdXNpbmcgc2Nyb2xsIGJlY2F1c2UgaXQgd29ya3MgbW9yZSByZWxpYWJsZSB0aGFuIHNjcm9sbEJ5XG4gICAgICAgIHRoaXMuZ3JpZFJlZj8ubmF0aXZlRWxlbWVudC5zY3JvbGwoe1xuICAgICAgICAgICAgbGVmdDpcbiAgICAgICAgICAgICAgICBsZWZ0U2Nyb2xsICtcbiAgICAgICAgICAgICAgICBNYXRoLm1heCgyNTAsIHJlY3Qud2lkdGggKiB0aGlzLlNjcm9sbGluZ09mZnNldFBlcmNlbnRhZ2UpICpcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IDEgOiAtMSksXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzQ3VzdG9tVGVtcGxhdGUobm9kZTogVCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlIGluc3RhbmNlb2YgQ3VzdG9tVGVtcGxhdGVzRGF0YVNvdXJjZSB8fFxuICAgICAgICAgICAgKG5vZGUgYXMgYW55KS5lbGVtZW50UmVmXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNCbG9ja2VkKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUucHJvcGVydGllcz8uW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfSU1QT1JUX0JMT0NLRURdPy5bMF0gPT09ICd0cnVlJyB8fFxuICAgICAgICAgICAgdGhpcy5ub2RlSGVscGVyU2VydmljZS5pc05vZGVSZXZva2VkKG5vZGUpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNncmlkVG9wPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5jb25maWd1cmVDb2x1bW5zXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwiY29sdW1uQ2hvb3NlclZpc2libGUkLm5leHQoIWNvbHVtbkNob29zZXJWaXNpYmxlJC52YWx1ZSlcIlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjY29sdW1uQ2hvb3NlclRyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBbbWF0VG9vbHRpcF09XCInTElTVF9UQUJMRS5DT05GSUdVUkVfQ09MVU1OUycgfCB0cmFuc2xhdGVcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0xJU1RfVEFCTEUuQ09ORklHVVJFX0NPTFVNTlMnIHwgdHJhbnNsYXRlXCJcbiAgPlxuICAgIDxpIGVzSWNvbj1cInNldHRpbmdzXCI+PC9pPlxuICA8L2J1dHRvbj5cbiAgPGVzLXNvcnQtc2VsZWN0LXBhbmVsXG4gICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5zb3J0Py5hbGxvd2VkXCJcbiAgICBjbGFzcz1cIm9yZGVyLXBhbmVsXCJcbiAgICBbYWN0aXZlXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQuYWN0aXZlXCJcbiAgICBbZGlyZWN0aW9uXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQuZGlyZWN0aW9uXCJcbiAgICBbY29sdW1uc109XCJnZXRTb3J0Q29sdW1ucygpXCJcbiAgICAoc29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgWyhjdXN0b21Tb3J0aW5nSW5Qcm9ncmVzcyldPVwiZW50cmllc1NlcnZpY2Uuc29ydC5jdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc1wiXG4gICAgKGN1c3RvbVNvcnRpbmdJblByb2dyZXNzQ2hhbmdlKT1cIm9uQ3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NDaGFuZ2UoKVwiXG4gID48L2VzLXNvcnQtc2VsZWN0LXBhbmVsPlxuPC9uZy10ZW1wbGF0ZT5cbjxlcy1jb2x1bW4tY2hvb3NlclxuICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnNcIlxuICBbKGNvbHVtbnMpXT1cImVudHJpZXNTZXJ2aWNlLmNvbHVtbnNcIlxuICBbY29sdW1uQ2hvb3NlclZpc2libGVdPVwiY29sdW1uQ2hvb3NlclZpc2libGUkIHwgYXN5bmNcIlxuICBbb3JpZ2luXT1cImNvbHVtbkNob29zZXJUcmlnZ2VyXCJcbiAgKGNvbHVtbkNob29zZXJWaXNpYmxlQ2hhbmdlKT1cImNvbHVtbkNob29zZXJWaXNpYmxlJC5uZXh0KCRldmVudClcIlxuPjwvZXMtY29sdW1uLWNob29zZXI+XG48ZXMtZHJvcGRvd24gI2Ryb3Bkb3duIFtvcHRpb25zXT1cImVudHJpZXNTZXJ2aWNlLm9wdGlvbnM/LltUYXJnZXQuTGlzdERyb3Bkb3duXVwiPjwvZXMtZHJvcGRvd24+XG5cbjwhLS0gRG8gbm90IHJlbmRlciB0aGUgbGlzdCBlbGVtZW50IChgcm9sZT1cImxpc3RcImAgb3IgYGxpYCkgd2hlbiB0aGVyZSBhcmUgbm8gbGlzdCBpdGVtcy4gLS0+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiKG5vZGVzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMCB8fCAoZW50cmllc1NlcnZpY2UuZ2xvYmFsT3B0aW9uc1N1YmplY3QgfCBhc3luYyk/Lmxlbmd0aCA+IDBcIlxuPlxuICA8IS0tIEZJWE1FOiBJZGVhbGx5LCB3ZSB3b3VsZCB1c2UgbmF0aXZlIGB1bGAgYW5kIGBsaWAgZWxlbWVudHMsIGJ1dCB0aGVzZSBoYXZlIGEgc3RyaWN0IG1vZGVsLFxuICB0aGF0IG9ubHkgYWxsb3dzIGBsaWAgZWxlbWVudHMgYXMgZGlyZWN0IGNoaWxkcmVuIG9mIGB1bGAgZWxlbWVudHMuIFNvIHdlIHdvdWxkIG5lZWQgdG8gdXNlIHRoZVxuICBuYXRpdmUgZWxlbWVudHMgYXQgYWxsIHBsYWNlcyB3aXRob3V0IGFueSBlbGVtZW50cyBiZXR3ZWVuIGB1bGAgYW5kIGBsaWAuIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5zb3J0Py5jdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc1wiXG4gICAgcm9sZT1cImxpc3RcIlxuICAgIGNsYXNzPVwiY2FyZC1ncmlkIGNhcmQtZ3JpZC1yZW9yZGVyXCJcbiAgICBjZGtEcm9wTGlzdEdyb3VwXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZXMkIHwgYXN5bmMgYXMgbm9kZXNcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjYXJkLWdyaWQtb3JkZXItd3JhcHBlclwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIG5vZGVzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbY2RrRHJvcExpc3RDb25uZWN0ZWRUb109XCJkcm9wTGlzdHNcIlxuICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cImlcIlxuICAgICAgPlxuICAgICAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmRcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLkdyaWRcIlxuICAgICAgICAgICNpdGVtXG4gICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImlcIlxuICAgICAgICAgIFtjZGtEcmFnU3RhcnREZWxheV09XCJnZXREcmFnU3RhcnREZWxheSgpXCJcbiAgICAgICAgICBjZGtEcmFnUHJldmlld0NsYXNzPVwiZXMtY2FyZC1ncmlkLXJlYXJyYW5nZS1kcmFnLXByZXZpZXdcIlxuICAgICAgICAgIChjZGtEcmFnRW50ZXJlZCk9XCJvblJlYXJyYW5nZURyYWdFbnRlcmVkKCRldmVudClcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvblJlYXJyYW5nZURyYWdTdGFydGVkKClcIlxuICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25SZWFycmFuZ2VEcmFnRW5kZWQoKVwiXG4gICAgICAgID48L2VzLW5vZGUtZW50cmllcy1jYXJkPlxuICAgICAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmQtc21hbGxcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZFwiXG4gICAgICAgICAgI2l0ZW1cbiAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICByb2xlPVwibGlzdGl0ZW1cIlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaVwiXG4gICAgICAgICAgW2Nka0RyYWdTdGFydERlbGF5XT1cImdldERyYWdTdGFydERlbGF5KClcIlxuICAgICAgICAgIGNka0RyYWdQcmV2aWV3Q2xhc3M9XCJlcy1jYXJkLWdyaWQtcmVhcnJhbmdlLWRyYWctcHJldmlld1wiXG4gICAgICAgICAgKGNka0RyYWdFbnRlcmVkKT1cIm9uUmVhcnJhbmdlRHJhZ0VudGVyZWQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uUmVhcnJhbmdlRHJhZ1N0YXJ0ZWQoKVwiXG4gICAgICAgICAgKGNka0RyYWdFbmRlZCk9XCJvblJlYXJyYW5nZURyYWdFbmRlZCgpXCJcbiAgICAgICAgPjwvZXMtbm9kZS1lbnRyaWVzLWNhcmQtc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWQtd3JhcHBlclwiICpuZ0lmPVwiIWVudHJpZXNTZXJ2aWNlLnNvcnQ/LmN1c3RvbVNvcnRpbmdJblByb2dyZXNzXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNjcm9sbEhlbHBlclwiPjwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJsaXN0XCJcbiAgICAgIGNsYXNzPVwiY2FyZC1ncmlkIGNhcmQtZ3JpZC1sYXlvdXQte3sgbGF5b3V0IH19XCJcbiAgICAgICNncmlkXG4gICAgICAoZXNCb3JkZXJCb3hPYnNlcnZlcik9XCJvbkdyaWRTaXplQ2hhbmdlcygpXCJcbiAgICAgIGVzSW5maW5pdGVTY3JvbGxcbiAgICAgIChzY3JvbGwpPVwidXBkYXRlU2Nyb2xsU3RhdGUoKVwiXG4gICAgICAoc2Nyb2xsZWQpPVwiIXZpc2libGVJdGVtc0xpbWl0ZWQgJiYgbG9hZERhdGEoJ3Njcm9sbCcpXCJcbiAgICA+XG4gICAgICA8ZXMtbm9kZS1lbnRyaWVzLWdsb2JhbC1vcHRpb25zXG4gICAgICAgICpuZ0lmPVwiKGVudHJpZXNTZXJ2aWNlLmdsb2JhbE9wdGlvbnNTdWJqZWN0IHwgYXN5bmMpPy5sZW5ndGhcIlxuICAgICAgICBbZGlzcGxheVR5cGVdPVwiZGlzcGxheVR5cGVcIlxuICAgICAgPlxuICAgICAgPC9lcy1ub2RlLWVudHJpZXMtZ2xvYmFsLW9wdGlvbnM+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZXMkIHwgYXN5bmMgYXMgbm9kZXNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY2FyZC1ncmlkLWRyYWctd3JhcHBlclwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2Ygbm9kZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICBbZXNOb2Rlc0Ryb3BUYXJnZXRdPVwibm9kZVwiXG4gICAgICAgICAgW2NhbkRyb3BOb2Rlc109XCJjYW5Ecm9wTm9kZXNcIlxuICAgICAgICAgIChub2RlRHJvcHBlZCk9XCJvbk5vZGVzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAjZHJvcFRhcmdldD1cImVzTm9kZXNEcm9wVGFyZ2V0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0N1c3RvbVRlbXBsYXRlKG5vZGUpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShub2RlKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDdXN0b21UZW1wbGF0ZShub2RlKVwiPlxuICAgICAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZFwiXG4gICAgICAgICAgICAgICNpdGVtXG4gICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICBbZHJvcGRvd25dPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICByb2xlPVwibGlzdGl0ZW1cIlxuICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiKGdldERyYWdFbmFibGVkKCkgfCBhc3luYykgPT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImdldERyYWdEYXRhKG5vZGUpXCJcbiAgICAgICAgICAgICAgZXNOb2Rlc0RyYWdcbiAgICAgICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQobm9kZSlcIlxuICAgICAgICAgICAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uRHJhZ0VuZGVkKClcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2FyZC1pbXBvcnQtYmxvY2tlZF09XCJpc0Jsb2NrZWQobm9kZSlcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWQtd2hlbi1kcmFnZ2luZ109XCJcbiAgICAgICAgICAgICAgICBpc0RyYWdnaW5nICYmIGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgIDxlcy1ub2RlLWVudHJpZXMtY2FyZFxuICAgICAgICAgICAgICAgICAgKmNka0RyYWdQcmV2aWV3XG4gICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICA/IGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtZHJhZy1wcmV2aWV3XCJcbiAgICAgICAgICAgICAgICA+PC9lcy1ub2RlLWVudHJpZXMtY2FyZD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2VzLW5vZGUtZW50cmllcy1jYXJkPlxuICAgICAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUuU21hbGxHcmlkXCJcbiAgICAgICAgICAgICAgI2l0ZW1cbiAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiXG4gICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIoZ2V0RHJhZ0VuYWJsZWQoKSB8IGFzeW5jKSA9PT0gZmFsc2VcIlxuICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiW25vZGVdXCJcbiAgICAgICAgICAgICAgZXNOb2Rlc0RyYWdcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZXMtbm9kZS1lbnRyaWVzLWNhcmQtc21hbGw+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJkcm9wVGFyZ2V0LmFjdGl2ZT8uY2FuRHJvcD8uZGVueUV4cGxpY2l0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ncmlkLWRyb3AtYmxvY2tlZC1jb250YWluZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGVzSWNvbj1cImNhbmNlbFwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcFRhcmdldC5hY3RpdmU/LmNhbkRyb3A/LmFjY2VwdFwiIGNsYXNzPVwiY2FyZC1ncmlkLWRyb3AtYWxsb3dlZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtlc0ljb25dPVwiZHJvcFRhcmdldC5hY3RpdmUuYWN0aW9uID09PSAnY29weScgPyAnYWRkX2NpcmNsZV9vdXRsaW5lJyA6ICdhcmNoaXZlJ1wiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIlxuICAgICFlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyAmJlxuICAgIGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaGFzTW9yZSgpICYmXG4gICAgIXZpc2libGVJdGVtc0xpbWl0ZWQgJiZcbiAgICBlbnRyaWVzU2VydmljZS5wYWdpbmF0aW9uU3RyYXRlZ3kgPT09ICdpbmZpbml0ZS1zY3JvbGwnICYmXG4gICAgbGF5b3V0ICE9PSAnc2Nyb2xsJ1xuICBcIlxuPlxuICA8ZGl2IGNsYXNzPVwibG9hZC1tb3JlXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJsb2FkRGF0YSgnYnV0dG9uJylcIj5cbiAgICAgIDxpIGVzSWNvbj1cInJlZnJlc2hcIj48L2k+XG4gICAgICA8c3Bhbj57eyAnTE9BRF9NT1JFJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJcbiAgICBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyA9PT0gdHJ1ZSB8fFxuICAgIGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nID09PSAnaW5pdGlhbCcgfHxcbiAgICAoZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmcgPT09ICdwYWdlJyAmJlxuICAgICAgZW50cmllc1NlcnZpY2UucGFnaW5hdGlvblN0cmF0ZWd5ID09PSAnaW5maW5pdGUtc2Nyb2xsJylcbiAgXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxlcy1zcGlubmVyPjwvZXMtc3Bpbm5lcj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3Njcm9sbEhlbHBlcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dCA9PT0gJ3Njcm9sbCdcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNjcm9sbC1oZWxwZXItbGVmdFwiXG4gICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgIChjbGljayk9XCJkb1Njcm9sbCgnbGVmdCcpXCJcbiAgICAgICpuZ0lmPVwic2Nyb2xsLmxlZnRcIlxuICAgID5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGRvU2Nyb2xsKCdsZWZ0JylcIj5cbiAgICAgICAgPGkgZXNJY29uPVwia2V5Ym9hcmRfYXJyb3dfbGVmdFwiIFthcmlhXT1cInRydWVcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNjcm9sbC1oZWxwZXItcmlnaHRcIlxuICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAoY2xpY2spPVwiZG9TY3JvbGwoJ3JpZ2h0JylcIlxuICAgICAgKm5nSWY9XCJzY3JvbGwucmlnaHRcIlxuICAgID5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGRvU2Nyb2xsKCdyaWdodCcpXCI+XG4gICAgICAgIDxpIGVzSWNvbj1cImtleWJvYXJkX2Fycm93X3JpZ2h0XCIgW2FyaWFdPVwidHJ1ZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -1,44 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { Target } from '../../types/option-item';
3
- import { ClickSource, InteractionType } from '../entries-model';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../services/node-entries.service";
6
- import * as i2 from "../../services/node-helper.service";
7
- import * as i3 from "../node-entries-templates.service";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "../../directives/focus-state.directive";
10
- import * as i6 from "../../directives/icon.directive";
11
- import * as i7 from "../../node-url/node-url.component";
12
- import * as i8 from "../../list-items/list-base/list-base.component";
13
- import * as i9 from "../preview-image/preview-image.component";
14
- export class NodeEntriesCardSmallComponent {
15
- constructor(entriesService, nodeHelper, templatesService) {
16
- this.entriesService = entriesService;
17
- this.nodeHelper = nodeHelper;
18
- this.templatesService = templatesService;
19
- this.ClickSource = ClickSource;
20
- this.InteractionType = InteractionType;
21
- this.Target = Target;
22
- }
23
- optionsOnCard() {
24
- const options = this.entriesService.options[Target.List];
25
- const always = options.filter((o) => o.showAlways);
26
- if (always.some((o) => o.showCallback([this.node]))) {
27
- return always;
28
- }
29
- return options.filter((o) => o.showAsAction && o.showCallback([this.node])).slice(0, 3);
30
- }
31
- openContextmenu(event) {
32
- event.preventDefault();
33
- event.stopPropagation();
34
- }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesCardSmallComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeHelperService }, { token: i3.NodeEntriesTemplatesService }], target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: NodeEntriesCardSmallComponent, selector: "es-node-entries-card-small", inputs: { node: "node" }, ngImport: i0, template: "<div\n [class]=\"\n 'grid-card' +\n (nodeHelper.isNodeCollection(node)\n ? ' grid-card-collection grid-card-collection-scope-' +\n node.collection.scope +\n ' grid-card-collection-type-' +\n node.collection.type\n : '') +\n ($any(node).virtual ? ' grid-card-virtual' : '') +\n ' ' +\n (entriesService.singleClickHint === 'dynamic' ? ' dynamic-single-click' : '')\n \"\n [style.background-color]=\"nodeHelper.isNodeCollection(node) ? node.collection.color : null\"\n (contextmenu)=\"openContextmenu($event)\"\n (keydown.ContextMenu)=\"openContextmenu($event)\"\n>\n <div\n *ngIf=\"templatesService.overlay\"\n class=\"card-overlay\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Overlay,\n })\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templatesService.overlay; context: { element: node }\"\n ></ng-container>\n </div>\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n mode=\"wrapper\"\n [node]=\"node\"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </es-node-url>\n <ng-container *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <ng-container *ngTemplateOutlet=\"image\"></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </ng-container>\n</div>\n<ng-template #image let-playAnimation=\"playAnimation\">\n <div\n class=\"card-image-area\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Preview,\n })\n \"\n >\n <div *ngIf=\"nodeHelper.isNodeCollection(node) && node.collection.pinned\" class=\"collection-pin\">\n <i esIcon=\"edu-pin\"></i>\n </div>\n <es-preview-image\n *ngIf=\"!(nodeHelper.isNodeCollection(node) && node.preview.isIcon)\"\n [node]=\"node\"\n [playAnimation]=\"playAnimation\"\n ></es-preview-image>\n <div\n *ngIf=\"nodeHelper.isNodeCollection(node) && node.preview.isIcon\"\n class=\"card-collection-image\"\n >\n <i esIcon=\"layers\"></i>\n </div>\n </div>\n</ng-template>\n<ng-template #meta>\n <div\n class=\"card-meta\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n })\n \"\n >\n <div\n *ngFor=\"let displayPart of entriesService.columns; let first = first\"\n class=\"card-meta-row\"\n >\n <ng-container *ngIf=\"first\">\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n [node]=\"node\"\n #link\n >\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </es-node-url>\n <div *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!first\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </ng-container>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"templatesService.actionArea; context: { element: node }\"\n ></ng-container>\n</ng-template>\n", styles: [".grid-card{transition:all var(--transitionNormal);overflow:hidden;background-color:#fff;box-shadow:0 3px 3px #0000001a;display:grid;height:100%;grid-template-columns:auto}:host-context(body.es-contrast-mode) .grid-card{border:1px solid rgba(0,0,0,.42)}.grid-card.selected{background-color:rgb(var(--palette-primary-50))}.grid-card .dropdown-dummy{position:fixed}.grid-card .card-options{display:grid;grid-template-columns:1fr auto;grid-column-gap:10px}.grid-card .card-options .card-rating-area{display:flex;align-items:center;height:100%;padding-left:10px}.grid-card .card-options .card-options-area{display:flex}.grid-card .card-options .card-options-area es-option-button,.grid-card .card-options .card-options-area button{transition:all var(--transitionNormal);margin:0 2px;border-radius:50%}.grid-card .card-options .card-options-area es-option-button:hover,.grid-card .card-options .card-options-area es-option-button:focus,.grid-card .card-options .card-options-area button:hover,.grid-card .card-options .card-options-area button:focus{background-color:#fff}.grid-card:not(.grid-card-collection) .card-top-bar{background-color:var(--palette-primary-200)}.grid-card.grid-card-virtual{outline:2px dashed var(--nodeVirtualColor)}.grid-card .card-top-bar{height:40px;display:flex;gap:15px;align-items:center;padding:0 15px;position:relative}.grid-card .card-top-bar .card-top-bar-collection-color{position:absolute;background-color:#ffffff80;inset:0}.grid-card .card-top-bar .card-top-bar-flag{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:50%;background-color:#fff;padding:5px;position:relative;z-index:1;box-shadow:0 0 5px #0000004d}.grid-card .card-top-bar .card-top-bar-flag i{font-size:18px;color:#333}.grid-card .card-top-bar .card-top-bar-flag img{width:18px;height:18px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox{margin-right:-5px;position:relative;top:-1.3px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator{outline:none}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator:after{content:\"\";position:absolute;inset:2px;outline:none;border:2px solid var(--palette-primary-300);border-color:#fff}.grid-card .card-top-bar .card-top-bar-empty{width:0;flex-grow:1}.grid-card .card-image-area{height:100px;padding:0;display:flex}.grid-card .card-image-area es-preview-image{flex-grow:1}.grid-card .card-image-area .card-collection-image{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.grid-card .card-image-area .card-collection-image i{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;color:#000000bf;background-color:#ffffff80;padding:25px;font-size:25px;border-radius:50%}.grid-card .card-meta{padding:8px 15px 0;display:grid;flex-direction:row}.grid-card .card-meta .card-meta-row{display:flex;flex-direction:row;align-items:center;min-height:2.8em;gap:5px}.grid-card .card-meta .card-meta-row:not(:first-child)>label{cursor:inherit;color:var(--textLight);font-size:85%}.grid-card .card-meta .card-meta-row:not(:first-child)>es-list-base{color:#000;flex-grow:1;margin:5px 0;display:flex;justify-content:flex-end;text-align:end;word-break:break-word}.grid-card .card-meta .card-meta-row:first-child{font-size:120%}.grid-card .card-meta .card-meta-row:first-child>es-list-base,.grid-card .card-meta .card-meta-row:first-child>es-node-url{width:100%;font-size:120%;color:var(--textMain);height:2.8em;text-align:left;word-break:break-word}.grid-card.dynamic-single-click:hover{box-shadow:0 0 25px #0003;background-color:rgb(var(--palette-primary-50))}.grid-card.dynamic-single-click.grid-card-collection:hover .card-meta{background-color:#ffffffe6}.grid-card.grid-card-collection .card-meta{background-color:#fffc}.grid-card.grid-card-collection .card-options{background-color:#ffffffe6}.grid-card .card-options{border-top:1px solid #ddd}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.4em;max-height:2.8em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text{word-break:break-word}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text span,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text span{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.4em;max-height:2.8em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row es-node-url a{color:var(--textMain)}:host ::ng-deep .grid-card .card-meta-row es-node-url a.cdk-keyboard-focused{display:inline-flex;outline:none;outline:2px solid var(--palette-primary-300);outline-offset:2px}:host ::ng-deep .card-meta es-list-base img{max-width:100px;max-height:20px}:host ::ng-deep .card-meta es-list-base es-list-node-license img{height:20px}:host ::ng-deep .card-meta es-list-base es-list-collection-info{display:flex;align-items:center}:host ::ng-deep .card-meta es-list-base es-list-collection-info i{font-size:12pt;margin:0 6px}:host ::ng-deep .grid-card-collection es-node-url a.cdk-keyboard-focused .card-meta{background-color:#fff}.card-overlay{position:absolute;z-index:2;inset:0;pointer-events:none}.card-overlay ::ng-deep>*{pointer-events:auto}.collection-pin{background:#ffffff80;border-radius:50px;position:absolute;z-index:1;right:10px;top:10px;width:25px;height:25px;display:flex;align-items:center;justify-content:center;box-shadow:0 3px 3px #0000001a}.collection-pin>i{font-size:12px}.grid-card .card-meta-row ::ng-deep es-node-url a.cdk-keyboard-focused{outline-color:var(--palette-primary-400)}.grid-card{cursor:pointer}.grid-card.grid-card-collection{background-color:rgb(var(--palette-primary-200))}.grid-card .card-meta{background-color:#fffc;padding-bottom:8px}.grid-card .card-meta .card-meta-row:nth-child(1){grid-column:1/3}.grid-card .card-meta .card-meta-row:nth-child(2){justify-self:flex-start}.grid-card .card-meta .card-meta-row:nth-child(2),.grid-card .card-meta .card-meta-row:nth-child(3){grid-row:2;font-size:var(--fontSizeXSmall)}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.FocusStateDirective, selector: "[esFocusState]", exportAs: ["esFocusState"] }, { kind: "directive", type: i6.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "component", type: i7.NodeUrlComponent, selector: "es-node-url", inputs: ["node", "nodes", "target", "scope", "queryParams", "mode", "disabled", "alwaysRipple", "aria-describedby", "aria-label"], outputs: ["buttonClick"] }, { kind: "component", type: i8.ListBaseComponent, selector: "es-list-base", inputs: ["forceText"] }, { kind: "component", type: i9.PreviewImageComponent, selector: "es-preview-image", inputs: ["node", "playAnimation"] }] }); }
37
- }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesCardSmallComponent, decorators: [{
39
- type: Component,
40
- args: [{ selector: 'es-node-entries-card-small', template: "<div\n [class]=\"\n 'grid-card' +\n (nodeHelper.isNodeCollection(node)\n ? ' grid-card-collection grid-card-collection-scope-' +\n node.collection.scope +\n ' grid-card-collection-type-' +\n node.collection.type\n : '') +\n ($any(node).virtual ? ' grid-card-virtual' : '') +\n ' ' +\n (entriesService.singleClickHint === 'dynamic' ? ' dynamic-single-click' : '')\n \"\n [style.background-color]=\"nodeHelper.isNodeCollection(node) ? node.collection.color : null\"\n (contextmenu)=\"openContextmenu($event)\"\n (keydown.ContextMenu)=\"openContextmenu($event)\"\n>\n <div\n *ngIf=\"templatesService.overlay\"\n class=\"card-overlay\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Overlay,\n })\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templatesService.overlay; context: { element: node }\"\n ></ng-container>\n </div>\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n mode=\"wrapper\"\n [node]=\"node\"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </es-node-url>\n <ng-container *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <ng-container *ngTemplateOutlet=\"image\"></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </ng-container>\n</div>\n<ng-template #image let-playAnimation=\"playAnimation\">\n <div\n class=\"card-image-area\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Preview,\n })\n \"\n >\n <div *ngIf=\"nodeHelper.isNodeCollection(node) && node.collection.pinned\" class=\"collection-pin\">\n <i esIcon=\"edu-pin\"></i>\n </div>\n <es-preview-image\n *ngIf=\"!(nodeHelper.isNodeCollection(node) && node.preview.isIcon)\"\n [node]=\"node\"\n [playAnimation]=\"playAnimation\"\n ></es-preview-image>\n <div\n *ngIf=\"nodeHelper.isNodeCollection(node) && node.preview.isIcon\"\n class=\"card-collection-image\"\n >\n <i esIcon=\"layers\"></i>\n </div>\n </div>\n</ng-template>\n<ng-template #meta>\n <div\n class=\"card-meta\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n })\n \"\n >\n <div\n *ngFor=\"let displayPart of entriesService.columns; let first = first\"\n class=\"card-meta-row\"\n >\n <ng-container *ngIf=\"first\">\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n [node]=\"node\"\n #link\n >\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </es-node-url>\n <div *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!first\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </ng-container>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"templatesService.actionArea; context: { element: node }\"\n ></ng-container>\n</ng-template>\n", styles: [".grid-card{transition:all var(--transitionNormal);overflow:hidden;background-color:#fff;box-shadow:0 3px 3px #0000001a;display:grid;height:100%;grid-template-columns:auto}:host-context(body.es-contrast-mode) .grid-card{border:1px solid rgba(0,0,0,.42)}.grid-card.selected{background-color:rgb(var(--palette-primary-50))}.grid-card .dropdown-dummy{position:fixed}.grid-card .card-options{display:grid;grid-template-columns:1fr auto;grid-column-gap:10px}.grid-card .card-options .card-rating-area{display:flex;align-items:center;height:100%;padding-left:10px}.grid-card .card-options .card-options-area{display:flex}.grid-card .card-options .card-options-area es-option-button,.grid-card .card-options .card-options-area button{transition:all var(--transitionNormal);margin:0 2px;border-radius:50%}.grid-card .card-options .card-options-area es-option-button:hover,.grid-card .card-options .card-options-area es-option-button:focus,.grid-card .card-options .card-options-area button:hover,.grid-card .card-options .card-options-area button:focus{background-color:#fff}.grid-card:not(.grid-card-collection) .card-top-bar{background-color:var(--palette-primary-200)}.grid-card.grid-card-virtual{outline:2px dashed var(--nodeVirtualColor)}.grid-card .card-top-bar{height:40px;display:flex;gap:15px;align-items:center;padding:0 15px;position:relative}.grid-card .card-top-bar .card-top-bar-collection-color{position:absolute;background-color:#ffffff80;inset:0}.grid-card .card-top-bar .card-top-bar-flag{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:50%;background-color:#fff;padding:5px;position:relative;z-index:1;box-shadow:0 0 5px #0000004d}.grid-card .card-top-bar .card-top-bar-flag i{font-size:18px;color:#333}.grid-card .card-top-bar .card-top-bar-flag img{width:18px;height:18px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox{margin-right:-5px;position:relative;top:-1.3px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator{outline:none}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator:after{content:\"\";position:absolute;inset:2px;outline:none;border:2px solid var(--palette-primary-300);border-color:#fff}.grid-card .card-top-bar .card-top-bar-empty{width:0;flex-grow:1}.grid-card .card-image-area{height:100px;padding:0;display:flex}.grid-card .card-image-area es-preview-image{flex-grow:1}.grid-card .card-image-area .card-collection-image{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.grid-card .card-image-area .card-collection-image i{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;color:#000000bf;background-color:#ffffff80;padding:25px;font-size:25px;border-radius:50%}.grid-card .card-meta{padding:8px 15px 0;display:grid;flex-direction:row}.grid-card .card-meta .card-meta-row{display:flex;flex-direction:row;align-items:center;min-height:2.8em;gap:5px}.grid-card .card-meta .card-meta-row:not(:first-child)>label{cursor:inherit;color:var(--textLight);font-size:85%}.grid-card .card-meta .card-meta-row:not(:first-child)>es-list-base{color:#000;flex-grow:1;margin:5px 0;display:flex;justify-content:flex-end;text-align:end;word-break:break-word}.grid-card .card-meta .card-meta-row:first-child{font-size:120%}.grid-card .card-meta .card-meta-row:first-child>es-list-base,.grid-card .card-meta .card-meta-row:first-child>es-node-url{width:100%;font-size:120%;color:var(--textMain);height:2.8em;text-align:left;word-break:break-word}.grid-card.dynamic-single-click:hover{box-shadow:0 0 25px #0003;background-color:rgb(var(--palette-primary-50))}.grid-card.dynamic-single-click.grid-card-collection:hover .card-meta{background-color:#ffffffe6}.grid-card.grid-card-collection .card-meta{background-color:#fffc}.grid-card.grid-card-collection .card-options{background-color:#ffffffe6}.grid-card .card-options{border-top:1px solid #ddd}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.4em;max-height:2.8em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text{word-break:break-word}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text span,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text span{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.4em;max-height:2.8em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row es-node-url a{color:var(--textMain)}:host ::ng-deep .grid-card .card-meta-row es-node-url a.cdk-keyboard-focused{display:inline-flex;outline:none;outline:2px solid var(--palette-primary-300);outline-offset:2px}:host ::ng-deep .card-meta es-list-base img{max-width:100px;max-height:20px}:host ::ng-deep .card-meta es-list-base es-list-node-license img{height:20px}:host ::ng-deep .card-meta es-list-base es-list-collection-info{display:flex;align-items:center}:host ::ng-deep .card-meta es-list-base es-list-collection-info i{font-size:12pt;margin:0 6px}:host ::ng-deep .grid-card-collection es-node-url a.cdk-keyboard-focused .card-meta{background-color:#fff}.card-overlay{position:absolute;z-index:2;inset:0;pointer-events:none}.card-overlay ::ng-deep>*{pointer-events:auto}.collection-pin{background:#ffffff80;border-radius:50px;position:absolute;z-index:1;right:10px;top:10px;width:25px;height:25px;display:flex;align-items:center;justify-content:center;box-shadow:0 3px 3px #0000001a}.collection-pin>i{font-size:12px}.grid-card .card-meta-row ::ng-deep es-node-url a.cdk-keyboard-focused{outline-color:var(--palette-primary-400)}.grid-card{cursor:pointer}.grid-card.grid-card-collection{background-color:rgb(var(--palette-primary-200))}.grid-card .card-meta{background-color:#fffc;padding-bottom:8px}.grid-card .card-meta .card-meta-row:nth-child(1){grid-column:1/3}.grid-card .card-meta .card-meta-row:nth-child(2){justify-self:flex-start}.grid-card .card-meta .card-meta-row:nth-child(2),.grid-card .card-meta .card-meta-row:nth-child(3){grid-row:2;font-size:var(--fontSizeXSmall)}\n"] }]
41
- }], ctorParameters: () => [{ type: i1.NodeEntriesService }, { type: i2.NodeHelperService }, { type: i3.NodeEntriesTemplatesService }], propDecorators: { node: [{
42
- type: Input
43
- }] } });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLWNhcmQtc21hbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQtc21hbGwvbm9kZS1lbnRyaWVzLWNhcmQtc21hbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQtc21hbGwvbm9kZS1lbnRyaWVzLWNhcmQtc21hbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7O0FBWWhFLE1BQU0sT0FBTyw2QkFBNkI7SUFLdEMsWUFDVyxjQUFxQyxFQUNyQyxVQUE2QixFQUM3QixnQkFBNkM7UUFGN0MsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNkI7UUFQL0MsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFDMUIsb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFDbEMsV0FBTSxHQUFHLE1BQU0sQ0FBQztJQU10QixDQUFDO0lBRUosYUFBYTtRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQXlCO1FBQ3JDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQzsrR0F2QlEsNkJBQTZCO21HQUE3Qiw2QkFBNkIsNEZDZDFDLDhuSEFnSEE7OzRGRGxHYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0ksNEJBQTRCO2lLQVE3QixJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBDbGlja1NvdXJjZSwgSW50ZXJhY3Rpb25UeXBlIH0gZnJvbSAnLi4vZW50cmllcy1tb2RlbCc7XG5cbmltcG9ydCB7IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsJyxcbiAgICB0ZW1wbGF0ZVVybDogJ25vZGUtZW50cmllcy1jYXJkLXNtYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnbm9kZS1lbnRyaWVzLWNhcmQtc21hbGwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUVudHJpZXNDYXJkU21hbGxDb21wb25lbnQ8VCBleHRlbmRzIE5vZGU+IHtcbiAgICByZWFkb25seSBDbGlja1NvdXJjZSA9IENsaWNrU291cmNlO1xuICAgIHJlYWRvbmx5IEludGVyYWN0aW9uVHlwZSA9IEludGVyYWN0aW9uVHlwZTtcbiAgICByZWFkb25seSBUYXJnZXQgPSBUYXJnZXQ7XG4gICAgQElucHV0KCkgbm9kZTogVDtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVudHJpZXNTZXJ2aWNlOiBOb2RlRW50cmllc1NlcnZpY2U8VD4sXG4gICAgICAgIHB1YmxpYyBub2RlSGVscGVyOiBOb2RlSGVscGVyU2VydmljZSxcbiAgICAgICAgcHVibGljIHRlbXBsYXRlc1NlcnZpY2U6IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSxcbiAgICApIHt9XG5cbiAgICBvcHRpb25zT25DYXJkKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lbnRyaWVzU2VydmljZS5vcHRpb25zW1RhcmdldC5MaXN0XTtcbiAgICAgICAgY29uc3QgYWx3YXlzID0gb3B0aW9ucy5maWx0ZXIoKG8pID0+IG8uc2hvd0Fsd2F5cyk7XG4gICAgICAgIGlmIChhbHdheXMuc29tZSgobykgPT4gby5zaG93Q2FsbGJhY2soW3RoaXMubm9kZV0pKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsd2F5cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoKG8pID0+IG8uc2hvd0FzQWN0aW9uICYmIG8uc2hvd0NhbGxiYWNrKFt0aGlzLm5vZGVdKSkuc2xpY2UoMCwgMyk7XG4gICAgfVxuXG4gICAgb3BlbkNvbnRleHRtZW51KGV2ZW50OiBNb3VzZUV2ZW50IHwgRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICBbY2xhc3NdPVwiXG4gICAgJ2dyaWQtY2FyZCcgK1xuICAgIChub2RlSGVscGVyLmlzTm9kZUNvbGxlY3Rpb24obm9kZSlcbiAgICAgID8gJyBncmlkLWNhcmQtY29sbGVjdGlvbiBncmlkLWNhcmQtY29sbGVjdGlvbi1zY29wZS0nICtcbiAgICAgICAgbm9kZS5jb2xsZWN0aW9uLnNjb3BlICtcbiAgICAgICAgJyBncmlkLWNhcmQtY29sbGVjdGlvbi10eXBlLScgK1xuICAgICAgICBub2RlLmNvbGxlY3Rpb24udHlwZVxuICAgICAgOiAnJykgK1xuICAgICgkYW55KG5vZGUpLnZpcnR1YWwgPyAnIGdyaWQtY2FyZC12aXJ0dWFsJyA6ICcnKSArXG4gICAgJyAnICtcbiAgICAoZW50cmllc1NlcnZpY2Uuc2luZ2xlQ2xpY2tIaW50ID09PSAnZHluYW1pYycgPyAnIGR5bmFtaWMtc2luZ2xlLWNsaWNrJyA6ICcnKVxuICBcIlxuICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJub2RlSGVscGVyLmlzTm9kZUNvbGxlY3Rpb24obm9kZSkgPyBub2RlLmNvbGxlY3Rpb24uY29sb3IgOiBudWxsXCJcbiAgKGNvbnRleHRtZW51KT1cIm9wZW5Db250ZXh0bWVudSgkZXZlbnQpXCJcbiAgKGtleWRvd24uQ29udGV4dE1lbnUpPVwib3BlbkNvbnRleHRtZW51KCRldmVudClcIlxuPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ0ZW1wbGF0ZXNTZXJ2aWNlLm92ZXJsYXlcIlxuICAgIGNsYXNzPVwiY2FyZC1vdmVybGF5XCJcbiAgICAoY2xpY2spPVwiXG4gICAgICBlbnRyaWVzU2VydmljZS5jbGlja0l0ZW0uZW1pdCh7XG4gICAgICAgIGVsZW1lbnQ6IG5vZGUsXG4gICAgICAgIHNvdXJjZTogQ2xpY2tTb3VyY2UuT3ZlcmxheSxcbiAgICAgIH0pXG4gICAgXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzU2VydmljZS5vdmVybGF5OyBjb250ZXh0OiB7IGVsZW1lbnQ6IG5vZGUgfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGVzLW5vZGUtdXJsXG4gICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbmtcIlxuICAgIG1vZGU9XCJ3cmFwcGVyXCJcbiAgICBbbm9kZV09XCJub2RlXCJcbiAgICBlc0ZvY3VzU3RhdGVcbiAgICAjY2FyZEZvY3VzU3RhdGU9XCJlc0ZvY3VzU3RhdGVcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgaW1hZ2U7XG4gICAgICAgIGNvbnRleHQ6IHsgcGxheUFuaW1hdGlvbjogY2FyZEZvY3VzU3RhdGUuaG92ZXJpbmcgfHwgY2FyZEZvY3VzU3RhdGUuaGFzRm9jdXMgfVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1ldGFcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9lcy1ub2RlLXVybD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmVsZW1lbnRJbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGlua1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbWFnZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXRhXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2ltYWdlIGxldC1wbGF5QW5pbWF0aW9uPVwicGxheUFuaW1hdGlvblwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjYXJkLWltYWdlLWFyZWFcIlxuICAgIChjbGljayk9XCJcbiAgICAgIGVudHJpZXNTZXJ2aWNlLmNsaWNrSXRlbS5lbWl0KHtcbiAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgc291cmNlOiBDbGlja1NvdXJjZS5QcmV2aWV3LFxuICAgICAgfSlcbiAgICBcIlxuICA+XG4gICAgPGRpdiAqbmdJZj1cIm5vZGVIZWxwZXIuaXNOb2RlQ29sbGVjdGlvbihub2RlKSAmJiBub2RlLmNvbGxlY3Rpb24ucGlubmVkXCIgY2xhc3M9XCJjb2xsZWN0aW9uLXBpblwiPlxuICAgICAgPGkgZXNJY29uPVwiZWR1LXBpblwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZXMtcHJldmlldy1pbWFnZVxuICAgICAgKm5nSWY9XCIhKG5vZGVIZWxwZXIuaXNOb2RlQ29sbGVjdGlvbihub2RlKSAmJiBub2RlLnByZXZpZXcuaXNJY29uKVwiXG4gICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgIFtwbGF5QW5pbWF0aW9uXT1cInBsYXlBbmltYXRpb25cIlxuICAgID48L2VzLXByZXZpZXctaW1hZ2U+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJub2RlSGVscGVyLmlzTm9kZUNvbGxlY3Rpb24obm9kZSkgJiYgbm9kZS5wcmV2aWV3LmlzSWNvblwiXG4gICAgICBjbGFzcz1cImNhcmQtY29sbGVjdGlvbi1pbWFnZVwiXG4gICAgPlxuICAgICAgPGkgZXNJY29uPVwibGF5ZXJzXCI+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI21ldGE+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNhcmQtbWV0YVwiXG4gICAgKGNsaWNrKT1cIlxuICAgICAgZW50cmllc1NlcnZpY2UuY2xpY2tJdGVtLmVtaXQoe1xuICAgICAgICBlbGVtZW50OiBub2RlLFxuICAgICAgICBzb3VyY2U6IENsaWNrU291cmNlLk1ldGFkYXRhLFxuICAgICAgfSlcbiAgICBcIlxuICA+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IGRpc3BsYXlQYXJ0IG9mIGVudHJpZXNTZXJ2aWNlLmNvbHVtbnM7IGxldCBmaXJzdCA9IGZpcnN0XCJcbiAgICAgIGNsYXNzPVwiY2FyZC1tZXRhLXJvd1wiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpcnN0XCI+XG4gICAgICAgIDxlcy1ub2RlLXVybFxuICAgICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAjbGlua1xuICAgICAgICA+XG4gICAgICAgICAgPGVzLWxpc3QtYmFzZSBbaXRlbV09XCJkaXNwbGF5UGFydFwiIFtub2RlXT1cIm5vZGVcIiBbcHJvdmlkZUxhYmVsXT1cImZhbHNlXCI+IDwvZXMtbGlzdC1iYXNlPlxuICAgICAgICA8L2VzLW5vZGUtdXJsPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCI+XG4gICAgICAgICAgPGVzLWxpc3QtYmFzZSBbaXRlbV09XCJkaXNwbGF5UGFydFwiIFtub2RlXT1cIm5vZGVcIiBbcHJvdmlkZUxhYmVsXT1cImZhbHNlXCI+IDwvZXMtbGlzdC1iYXNlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaXJzdFwiPlxuICAgICAgICA8ZXMtbGlzdC1iYXNlIFtpdGVtXT1cImRpc3BsYXlQYXJ0XCIgW25vZGVdPVwibm9kZVwiIFtwcm92aWRlTGFiZWxdPVwiZmFsc2VcIj4gPC9lcy1saXN0LWJhc2U+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1NlcnZpY2UuYWN0aW9uQXJlYTsgY29udGV4dDogeyBlbGVtZW50OiBub2RlIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19