verben-ng-ui 1.3.3 → 1.3.4

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.
@@ -53,7 +53,7 @@ export class DataColumnsComponent {
53
53
  const temp = this.visibleColumns[fromIndex];
54
54
  this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];
55
55
  this.visibleColumns[toIndex] = temp;
56
- this.emitUpdatedColumns();
56
+ // Staged only — applied/emitted when the user clicks Save (see template).
57
57
  }
58
58
  // Column Selection functionality
59
59
  toggleSelectAll() {
@@ -62,13 +62,13 @@ export class DataColumnsComponent {
62
62
  this.visibleColumns.forEach((column) => {
63
63
  this.columnVisibility.set(column.id, newValue);
64
64
  });
65
- this.emitUpdatedColumns();
65
+ // Staged only — applied/emitted when the user clicks Save (see template).
66
66
  }
67
67
  toggleColumnVisibility(columnId) {
68
68
  const currentValue = this.columnVisibility.get(columnId);
69
69
  this.columnVisibility.set(columnId, !currentValue);
70
70
  this.updateSelectAllStatus();
71
- this.emitUpdatedColumns();
71
+ // Staged only — applied/emitted when the user clicks Save (see template).
72
72
  }
73
73
  isColumnVisible(columnId) {
74
74
  return this.columnVisibility.get(columnId) ?? false;
@@ -108,4 +108,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
108
108
  }], columnsUpdated: [{
109
109
  type: Output
110
110
  }] } });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1jb2x1bW5zL2RhdGEtY29sdW1ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtY29sdW1ucy9kYXRhLWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVUvRSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3RCLE9BQU8sQ0FBeUI7SUFDaEMsaUJBQWlCLEdBQVksSUFBSSxDQUFDO0lBQ2xDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDM0IsY0FBYyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0lBRXJFLGNBQWMsR0FBMEIsRUFBRSxDQUFDO0lBQzNDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixnQkFBZ0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVuRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMs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Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWNvbHVtbnMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFDb2x1bW5zQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29sdW1ucyE6IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQElucHV0KCkgZW5hYmxlRHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtYXhWaXNpYmxlSXRlbXM6IG51bWJlciA9IDU7XG4gIEBPdXRwdXQoKSBjb2x1bW5zVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uRGVmaW5pdGlvbjxUPltdPigpO1xuXG4gIHZpc2libGVDb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10gPSBbXTtcbiAgc2hvd0FsbENvbHVtbnMgPSBmYWxzZTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbHVtblZpc2liaWxpdHk6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnNdO1xuICAgIC8vIEluaXRpYWxpemUgdmlzaWJpbGl0eSBtYXAgd2l0aCBjdXJyZW50IGNvbHVtbiBzdGF0ZXNcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW4uaWQsIHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdHVzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uc1RvU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ29sdW1uc1xuICAgICAgPyB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICA6IHRoaXMudmlzaWJsZUNvbHVtbnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgLy8gRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5XG4gIG9uRHJhZ1N0YXJ0KGluZGV4OiBudW1iZXIsIGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YSgndGV4dC9wbGFpbicsIFN0cmluZyhpbmRleCkpO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uRHJvcChpbmRleDogbnVtYmVyLCBldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnZ2VkSW5kZXggIT09IGluZGV4KSB7XG4gICAgICB0aGlzLnN3YXBDb2x1bW5zKHRoaXMuZHJhZ2dlZEluZGV4LCBpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dhcENvbHVtbnMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbXAgPSB0aGlzLnZpc2libGVDb2x1bW5zW2Zyb21JbmRleF07XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc1tmcm9tSW5kZXhdID0gdGhpcy52aXNpYmxlQ29sdW1uc1t0b0luZGV4XTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zW3RvSW5kZXhdID0gdGVtcDtcbiAgICB0aGlzLmVtaXRVcGRhdGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLy8gQ29sdW1uIFNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5XG4gIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNlbGVjdEFsbCA9ICF0aGlzLnNlbGVjdEFsbDtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc2VsZWN0QWxsO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbi5pZCwgbmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdFVwZGF0ZWRDb2x1bW5zKCk7XG4gIH1cblxuICB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKTtcbiAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbklkLCAhY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdEFsbFN0YXR1cygpO1xuICAgIHRoaXMuZW1pdFVwZGF0ZWRDb2x1bW5zKCk7XG4gIH1cblxuICBpc0NvbHVtblZpc2libGUoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0QWxsU3RhdHVzKCkge1xuICAgIHRoaXMuc2VsZWN0QWxsID0gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmV2ZXJ5KFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBnZXRDb2x1bW5IZWFkZXIoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgID8gY29sdW1uLmhlYWRlcih7fSlcbiAgICAgIDogY29sdW1uLmhlYWRlcjtcbiAgfVxuXG4gIHJlc2V0Q29sdW1ucygpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5zKCk7XG4gICAgdGhpcy5lbWl0VXBkYXRlZENvbHVtbnMoKTtcbiAgfVxuXG4gIGVtaXRVcGRhdGVkQ29sdW1ucygpIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+XG4gICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbi5pZClcbiAgICApO1xuICAgIHRoaXMuY29sdW1uc1VwZGF0ZWQuZW1pdCh1cGRhdGVkQ29sdW1ucyk7XG4gIH1cblxuICBnZXQgYWN0aXZlQ29sdW1uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKVxuICAgICAgLmxlbmd0aDtcbiAgfVxufVxuIiwiPHZlcmJlbi1jYXJkIHdpZHRoPVwiMjRyZW1cIiBib3JkZXJSYWRpdXM9XCIxcmVtXCIgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIiBiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpXCI+XG4gICAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgICA8aDQgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Db2x1bW4gPHN1cD4oe3sgYWN0aXZlQ29sdW1uQ291bnQgfX0pPC9zdXA+PC9oND5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJyZXNldC1idXR0b25cIiAoY2xpY2spPVwicmVzZXRDb2x1bW5zKClcIj5SZXNldDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNhcmQtYm9keSBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgPCEtLSBDb2x1bW4gT3B0aW9ucyAtLT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+UHJvcGVydGllczwvaDM+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImluZm9cIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICA8IS0tIFNlbGVjdCBBbGwgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYWxsLXdyYXBwZXJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3QtYWxsXCI+XG4gICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNUb1Nob3c7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1vcHRpb25cIlxuICAgICAgICAgICAgW2F0dHIuZHJhZ2dhYmxlXT1cImVuYWJsZURyYWdBbmREcm9wXCJcbiAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxuICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRpbmRleCwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICBAaWYgKGVuYWJsZURyYWdBbmREcm9wKSB7XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgIGljb249XCJzcXVhcmUtZG90XCJcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShjb2x1bW4uaWQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0Q29sdW1uSGVhZGVyKGNvbHVtbikgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICBcbiAgICAgICAgQGlmICh2aXNpYmxlQ29sdW1ucy5sZW5ndGggPiBtYXhWaXNpYmxlSXRlbXMpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dBbGxDb2x1bW5zID0gIXNob3dBbGxDb2x1bW5zXCJcbiAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57eyBzaG93QWxsQ29sdW1ucyA/IFwiU2hvdyBMZXNzXCIgOiBcIlNob3cgTW9yZVwiIH19PC9zcGFuPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvblwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiOFwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjZcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgICBzdHJva2U9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2FyZC1mb290ZXIgY2xhc3M9XCJjYXJkLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCIgKGNsaWNrKT1cImVtaXRVcGRhdGVkQ29sdW1ucygpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L3ZlcmJlbi1jYXJkPiJdfQ==
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1jb2x1bW5zL2RhdGEtY29sdW1ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtY29sdW1ucy9kYXRhLWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVUvRSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3RCLE9BQU8sQ0FBeUI7SUFDaEMsaUJBQWlCLEdBQVksSUFBSSxDQUFDO0lBQ2xDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDM0IsY0FBYyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0lBRXJFLGNBQWMsR0FBMEIsRUFBRSxDQUFDO0lBQzNDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixnQkFBZ0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVuRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMs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dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWNvbHVtbnMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFDb2x1bW5zQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29sdW1ucyE6IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQElucHV0KCkgZW5hYmxlRHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtYXhWaXNpYmxlSXRlbXM6IG51bWJlciA9IDU7XG4gIEBPdXRwdXQoKSBjb2x1bW5zVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uRGVmaW5pdGlvbjxUPltdPigpO1xuXG4gIHZpc2libGVDb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10gPSBbXTtcbiAgc2hvd0FsbENvbHVtbnMgPSBmYWxzZTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbHVtblZpc2liaWxpdHk6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnNdO1xuICAgIC8vIEluaXRpYWxpemUgdmlzaWJpbGl0eSBtYXAgd2l0aCBjdXJyZW50IGNvbHVtbiBzdGF0ZXNcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW4uaWQsIHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdHVzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uc1RvU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ29sdW1uc1xuICAgICAgPyB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICA6IHRoaXMudmlzaWJsZUNvbHVtbnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgLy8gRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5XG4gIG9uRHJhZ1N0YXJ0KGluZGV4OiBudW1iZXIsIGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YSgndGV4dC9wbGFpbicsIFN0cmluZyhpbmRleCkpO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uRHJvcChpbmRleDogbnVtYmVyLCBldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnZ2VkSW5kZXggIT09IGluZGV4KSB7XG4gICAgICB0aGlzLnN3YXBDb2x1bW5zKHRoaXMuZHJhZ2dlZEluZGV4LCBpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dhcENvbHVtbnMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbXAgPSB0aGlzLnZpc2libGVDb2x1bW5zW2Zyb21JbmRleF07XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc1tmcm9tSW5kZXhdID0gdGhpcy52aXNpYmxlQ29sdW1uc1t0b0luZGV4XTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zW3RvSW5kZXhdID0gdGVtcDtcbiAgICAvLyBTdGFnZWQgb25seSDigJQgYXBwbGllZC9lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmUgKHNlZSB0ZW1wbGF0ZSkuXG4gIH1cblxuICAvLyBDb2x1bW4gU2VsZWN0aW9uIGZ1bmN0aW9uYWxpdHlcbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIHRoaXMuc2VsZWN0QWxsID0gIXRoaXMuc2VsZWN0QWxsO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zZWxlY3RBbGw7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5zZXQoY29sdW1uLmlkLCBuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgLy8gU3RhZ2VkIG9ubHkg4oCUIGFwcGxpZWQvZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBTYXZlIChzZWUgdGVtcGxhdGUpLlxuICB9XG5cbiAgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5jb2x1bW5WaXNpYmlsaXR5LmdldChjb2x1bW5JZCk7XG4gICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW5JZCwgIWN1cnJlbnRWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0dXMoKTtcbiAgICAvLyBTdGFnZWQgb25seSDigJQgYXBwbGllZC9lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmUgKHNlZSB0ZW1wbGF0ZSkuXG4gIH1cblxuICBpc0NvbHVtblZpc2libGUoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0QWxsU3RhdHVzKCkge1xuICAgIHRoaXMuc2VsZWN0QWxsID0gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmV2ZXJ5KFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBnZXRDb2x1bW5IZWFkZXIoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgID8gY29sdW1uLmhlYWRlcih7fSlcbiAgICAgIDogY29sdW1uLmhlYWRlcjtcbiAgfVxuXG4gIHJlc2V0Q29sdW1ucygpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5zKCk7XG4gICAgdGhpcy5lbWl0VXBkYXRlZENvbHVtbnMoKTtcbiAgfVxuXG4gIGVtaXRVcGRhdGVkQ29sdW1ucygpIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+XG4gICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbi5pZClcbiAgICApO1xuICAgIHRoaXMuY29sdW1uc1VwZGF0ZWQuZW1pdCh1cGRhdGVkQ29sdW1ucyk7XG4gIH1cblxuICBnZXQgYWN0aXZlQ29sdW1uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKVxuICAgICAgLmxlbmd0aDtcbiAgfVxufVxuIiwiPHZlcmJlbi1jYXJkIHdpZHRoPVwiMjRyZW1cIiBib3JkZXJSYWRpdXM9XCIxcmVtXCIgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIiBiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpXCI+XG4gICAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgICA8aDQgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Db2x1bW4gPHN1cD4oe3sgYWN0aXZlQ29sdW1uQ291bnQgfX0pPC9zdXA+PC9oND5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJyZXNldC1idXR0b25cIiAoY2xpY2spPVwicmVzZXRDb2x1bW5zKClcIj5SZXNldDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNhcmQtYm9keSBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgPCEtLSBDb2x1bW4gT3B0aW9ucyAtLT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+UHJvcGVydGllczwvaDM+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImluZm9cIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICA8IS0tIFNlbGVjdCBBbGwgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYWxsLXdyYXBwZXJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3QtYWxsXCI+XG4gICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNUb1Nob3c7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1vcHRpb25cIlxuICAgICAgICAgICAgW2F0dHIuZHJhZ2dhYmxlXT1cImVuYWJsZURyYWdBbmREcm9wXCJcbiAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxuICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRpbmRleCwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICBAaWYgKGVuYWJsZURyYWdBbmREcm9wKSB7XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgIGljb249XCJzcXVhcmUtZG90XCJcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShjb2x1bW4uaWQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0Q29sdW1uSGVhZGVyKGNvbHVtbikgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICBcbiAgICAgICAgQGlmICh2aXNpYmxlQ29sdW1ucy5sZW5ndGggPiBtYXhWaXNpYmxlSXRlbXMpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dBbGxDb2x1bW5zID0gIXNob3dBbGxDb2x1bW5zXCJcbiAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57eyBzaG93QWxsQ29sdW1ucyA/IFwiU2hvdyBMZXNzXCIgOiBcIlNob3cgTW9yZVwiIH19PC9zcGFuPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvblwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiOFwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjZcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgICBzdHJva2U9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2FyZC1mb290ZXIgY2xhc3M9XCJjYXJkLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCIgKGNsaWNrKT1cImVtaXRVcGRhdGVkQ29sdW1ucygpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L3ZlcmJlbi1jYXJkPiJdfQ==
@@ -55,6 +55,9 @@ export class DataImportComponent {
55
55
  invalidIndexSet = new Map();
56
56
  headers;
57
57
  _ext = 'xlsx';
58
+ static nextFileInputId = 0;
59
+ /** Unique per instance so several import cards can coexist on one page. */
60
+ fileInputId = `vbn-data-import-file-${DataImportComponent.nextFileInputId++}`;
58
61
  files = [];
59
62
  isDragging = false;
60
63
  showPreview = false;
@@ -174,10 +177,10 @@ export class DataImportComponent {
174
177
  // this.exportTemplateEvent.emit(this.headers());
175
178
  }
176
179
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataImportComponent, deps: [{ token: i1.DataImportService }], target: i0.ɵɵFactoryTarget.Component });
177
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataImportComponent, selector: "lib-data-import", inputs: { previewColumns: { classPropertyName: "previewColumns", publicName: "previewColumns", isSignal: true, isRequired: true, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columnTemplates: { classPropertyName: "columnTemplates", publicName: "columnTemplates", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, previewData: { classPropertyName: "previewData", publicName: "previewData", isSignal: true, isRequired: false, transformFunction: null }, onImportComplete: { classPropertyName: "onImportComplete", publicName: "onImportComplete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportTemplateEvent: "exportTemplateEvent", importEvent: "importEvent", importEventData: "importEventData", rowSave: "rowSave" }, providers: [DataImportService], ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label for=\"fileInput\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label for=\"fileInput\" [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n id=\"fileInput\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i5.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i5.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataImportComponent, selector: "lib-data-import", inputs: { previewColumns: { classPropertyName: "previewColumns", publicName: "previewColumns", isSignal: true, isRequired: true, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columnTemplates: { classPropertyName: "columnTemplates", publicName: "columnTemplates", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, previewData: { classPropertyName: "previewData", publicName: "previewData", isSignal: true, isRequired: false, transformFunction: null }, onImportComplete: { classPropertyName: "onImportComplete", publicName: "onImportComplete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportTemplateEvent: "exportTemplateEvent", importEvent: "importEvent", importEventData: "importEventData", rowSave: "rowSave" }, providers: [DataImportService], ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label [attr.for]=\"fileInputId\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label\n [attr.for]=\"fileInputId\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n [attr.id]=\"fileInputId\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i5.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i5.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
178
181
  }
179
182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataImportComponent, decorators: [{
180
183
  type: Component,
181
- args: [{ selector: 'lib-data-import', providers: [DataImportService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label for=\"fileInput\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label for=\"fileInput\" [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n id=\"fileInput\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\n"] }]
184
+ args: [{ selector: 'lib-data-import', providers: [DataImportService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label [attr.for]=\"fileInputId\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label\n [attr.for]=\"fileInputId\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n [attr.id]=\"fileInputId\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\n"] }]
182
185
  }], ctorParameters: () => [{ type: i1.DataImportService }] });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWltcG9ydC9kYXRhLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtaW1wb3J0L2RhdGEtaW1wb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFNBQVMsRUFFVixNQUFNLGdCQUFnQixDQUFDO0FBTXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7O0FBUzFELE1BQU0sT0FBTyxtQkFBbUI7SUE0RFg7SUEzRG5CLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF5QixDQUFDO0lBQ3pELGVBQWUsR0FBRyxLQUFLLEVBSXBCLENBQUM7SUFDSjs7T0FFRztJQUNILE1BQU0sR0FBRyxLQUFLLEVBQVksQ0FBQztJQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFTLGlCQUFpQixDQUFDLENBQUM7SUFDekMsZUFBZSxHQUFHLEtBQUssQ0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDeEQsTUFBTSxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUM5Qzs7T0FFRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQU8sQ0FBQztJQUMzQjs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLEVBQTRDLENBQUM7SUFDckU7O09BRUc7SUFDSCxtQkFBbUIsR0FBRyxNQUFNLEVBQVksQ0FBQztJQUN6Qzs7T0FFRztJQUNILFdBQVcsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUM3Qjs7T0FFRztJQUNILGVBQWUsR0FBRyxNQUFNLEVBQWdCLENBQUM7SUFDekM7O09BRUc7SUFDSCxPQUFPLEdBQUcsTUFBTSxFQUlaLENBQUM7SUFFTCxrREFBa0Q7SUFDbEQsa0JBQWtCLENBQWdDO0lBQ2xELEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBWSxFQUFFLENBQUMsQ0FBQztJQUNyQyxpQkFBaUIsR0FBNkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELHFEQUFxRDtJQUNyRCxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3RDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBeUMsQ0FBQztJQUVuRSxPQUFPLENBQW1CO0lBRWxCLElBQUksR0FBMkIsTUFBTSxDQUFDO0lBRTlDLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXBCLFlBQW1CLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDViw2Q0FBNkM7WUFFN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNqRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO2dCQUVELFVBQVU7Z0JBQ1YsNERBQTREO2dCQUM1RCwyQkFBMkI7Z0JBQzNCLGdFQUFnRTtnQkFDaEUsNEJBQTRCO2dCQUM1QixlQUFlO2dCQUNmLGtDQUFrQztnQkFDbEMsaURBQWlEO2dCQUNqRCxjQUFjO2dCQUNkLCtCQUErQjtnQkFDL0IsWUFBWTtnQkFDWixvQkFBb0I7Z0JBQ3BCLFdBQVc7Z0JBQ1gsV0FBVztnQkFDWCxTQUFTO2dCQUVULHNDQUFzQztnQkFDdEMsb0RBQW9EO2dCQUNwRCxRQUFRO2dCQUNSLFFBQVE7WUFDVixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFO2lCQUN6QixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2lCQUNyRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDZCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQ2xELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQ2hDLENBQUM7Z0JBQ0YsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixPQUFPO3dCQUNMLEdBQUcsTUFBTTt3QkFDVCxpQ0FBaUM7d0JBQ2pDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZO3dCQUMzQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxnQkFBZ0I7d0JBQ25ELGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjO3dCQUMvQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsY0FBYztxQkFDaEQsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUM7Z0JBQ047b0JBQ0UsRUFBRSxFQUFFLFNBQVM7b0JBQ2IsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2FBQ0YsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsT0FBTyxDQUNMLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUFFO3FCQUN0QixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztxQkFDOUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ3ZDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBZ0I7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNiLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUN6QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQ2QsQ0FBQztRQUNGLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDZCxDQUFDO1FBRUYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRXhCLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUk7UUFDRix3REFBd0Q7UUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsUUFBUSxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRSxpREFBaUQ7SUFDbkQsQ0FBQzt3R0F6TVUsbUJBQW1COzRGQUFuQixtQkFBbUIsa3hDQUhuQixDQUFDLGlCQUFpQixDQUFDLDBCQzNCaEMsNGhMQWdNQTs7NEZEbEthLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxpQkFBaUIsYUFHaEIsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtR3JvdXBcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgQ29sdW1uRGlyZWN0aXZlLFxuICBGb3JtR3JvdXBDb25maWcsXG59IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyBEYXRhSW1wb3J0U2VydmljZSB9IGZyb20gJy4vZGF0YS1pbXBvcnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kYXRhLWltcG9ydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWltcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWltcG9ydC5jb21wb25lbnQuY3NzJyxcbiAgcHJvdmlkZXJzOiBbRGF0YUltcG9ydFNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUltcG9ydENvbXBvbmVudDxUIGV4dGVuZHMge30+IHtcbiAgcHJldmlld0NvbHVtbnMgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+KCk7XG4gIGZvcm1Hcm91cENvbmZpZyA9IGlucHV0PFxuICAgIEZvcm1Hcm91cENvbmZpZzx7XG4gICAgICBbSyBpbiBrZXlvZiBUXTogQWJzdHJhY3RDb250cm9sO1xuICAgIH0+XG4gID4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBpbXBvcnRLZXkgb2YgcHJldmlld0NvbHVtbnMgaW5zdGVhZFxuICAgKi9cbiAgZmllbGRzID0gaW5wdXQ8c3RyaW5nW10+KCk7XG4gIHRpdGxlID0gaW5wdXQ8c3RyaW5nPignZXhwb3J0LXRlbXBsYXRlJyk7XG4gIGNvbHVtblRlbXBsYXRlcyA9IGlucHV0PHJlYWRvbmx5IENvbHVtbkRpcmVjdGl2ZVtdPihbXSk7XG4gIHBhcnNlciA9IGlucHV0PChkYXRhOiBhbnkpID0+IFBhcnRpYWw8VD5bXT4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSByZW1vdmUsIG5vdyBoYW5kbGVkIGludGVybmFsbHlcbiAgICovXG4gIHByZXZpZXdEYXRhID0gaW5wdXQ8VFtdPigpO1xuICAvKipcbiAgICogUGFzcyB0aGUgbWV0aG9kIHRvIHVzZSB0aGUgaW1wb3J0ZWQgZGF0YSxcbiAgICogYW5kIGV2ZW50dWFsbHkgcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWxseSB1c2VkXG4gICAqL1xuICBvbkltcG9ydENvbXBsZXRlID0gaW5wdXQ8KGRhdGE6IFBhcnRpYWw8VD5bXSkgPT4gUHJvbWlzZTxib29sZWFuPj4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSByZW1vdmUsIG5vdyBoYW5kbGVkIGludGVybmFsbHlcbiAgICovXG4gIGV4cG9ydFRlbXBsYXRlRXZlbnQgPSBvdXRwdXQ8c3RyaW5nW10+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgcmVtb3ZlLCBub3cgaGFuZGxlZCBpbnRlcm5hbGx5XG4gICAqL1xuICBpbXBvcnRFdmVudCA9IG91dHB1dDxGaWxlPigpO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbkltcG9ydENvbXBsZXRlIGlucHV0IGluc3RlYWRcbiAgICovXG4gIGltcG9ydEV2ZW50RGF0YSA9IG91dHB1dDxQYXJ0aWFsPFQ+W10+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgcmVtb3ZlLCBub3cgaGFuZGxlZCBpbnRlcm5hbGx5XG4gICAqL1xuICByb3dTYXZlID0gb3V0cHV0PHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyIHwgc3RyaW5nO1xuICAgIGRhdGE6IFBhcnRpYWw8VD47XG4gIH0+KCk7XG5cbiAgLy8gZGF0YTogU2lnbmFsPChUICYgeyBpc0R1cGxpY2F0ZTogYm9vbGVhbiB9KVtdPjtcbiAgcHJldmlld0NvbHVtbnNMaXN0OiBTaWduYWw8Q29sdW1uRGVmaW5pdGlvbjxUPltdPjtcbiAgZm9ybXMgPSBuZXcgRm9ybUFycmF5PEZvcm1Hcm91cD4oW10pO1xuICB1bmlxdWVJZGVudGlmaWVyczogV3JpdGFibGVTaWduYWw8c3RyaW5nW10+ID0gc2lnbmFsKFtdKTtcbiAgLy8gZHVwbGljYXRlRGF0YU1hcDogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgZHVwbGljYXRlSW5kZXhTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgaW52YWxpZEluZGV4U2V0ID0gbmV3IE1hcDxudW1iZXIsIENvbHVtbkRpcmVjdGl2ZVsnY29sdW1uSWQnXVtdPigpO1xuXG4gIGhlYWRlcnM6IFNpZ25hbDxzdHJpbmdbXT47XG5cbiAgcHJpdmF0ZSBfZXh0OiAneGxzeCcgfCAneGxzJyB8ICdjc3YnID0gJ3hsc3gnO1xuXG4gIGZpbGVzOiBGaWxlW10gPSBbXTtcbiAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICBzaG93UHJldmlldyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOiBEYXRhSW1wb3J0U2VydmljZTxUPikge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBjb25zdCBjb2x1bW5zID0gdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKTtcblxuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSB0aGlzLnVuaXF1ZUlkZW50aWZpZXJzKCk7XG5cbiAgICAgIHRoaXMuc2VydmljZS5pbXBvcnRlZERhdGEoKT8uZm9yRWFjaCgoZCwgaSwgYXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXJ2aWNlLmlzRHVwbGljYXRlKGQsIGFyciwgaWRlbnRpZmllcnMpKSB7XG4gICAgICAgICAgdGhpcy5kdXBsaWNhdGVJbmRleFNldC5hZGQoaSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2x1bW5zXG4gICAgICAgIC8vICAgLmZpbHRlcigoeyB2YWxpZGF0b3JGbiB9KSA9PiB2YWxpZGF0b3JGbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBPYmplY3QuZW50cmllcyhkKS5yZWR1Y2U8c3RyaW5nW10+KFxuICAgICAgICAvLyAgICAgICAoZiwgW2ssIHZdLCBpKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgaWYgKFxuICAgICAgICAvLyAgICAgICAgICAgY29sdW1uLnZhbGlkYXRvckZuICYmXG4gICAgICAgIC8vICAgICAgICAgICAhY29sdW1uLnZhbGlkYXRvckZuKHYgYXMgVFtrZXlvZiBUXSlcbiAgICAgICAgLy8gICAgICAgICApIHtcbiAgICAgICAgLy8gICAgICAgICAgIGYucHVzaChjb2x1bW4uaWQpO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgLy8gICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgW11cbiAgICAgICAgLy8gICAgICk7XG5cbiAgICAgICAgLy8gICAgIGlmIChpbnZhbGlkRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gICAgICAgdGhpcy5pbnZhbGlkSW5kZXhTZXQuc2V0KGksIGludmFsaWRGaWVsZHMpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByZXZpZXdDb2x1bW5zTGlzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZpZXdDb2x1bW5zKClcbiAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuaW1wb3J0S2V5IHx8IGNvbC5pbXBvcnRCeSB8fCBjb2wuZm9ybUNvbnRyb2xOYW1lKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gdGhpcy5jb2x1bW5UZW1wbGF0ZXMoKS5maW5kKFxuICAgICAgICAgICAgKHQpID0+IHQuY29sdW1uSWQgPT09IGNvbHVtbi5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gYWNjZXNzb3JLZXk6IGNvbHVtbi5pbXBvcnRLZXksXG4gICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsVGVtcGxhdGUsXG4gICAgICAgICAgICAgIGNlbGxFZGl0VGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbEVkaXRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICAgIGZvb3RlclRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmZvb3RlclRlbXBsYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSlcbiAgICAgICAgLmNvbmNhdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdhY3Rpb25zJyxcbiAgICAgICAgICAgIGhlYWRlcjogJ0FjdGlvbnMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5oZWFkZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5maWVsZHMoKSA/P1xuICAgICAgICB0aGlzLnByZXZpZXdDb2x1bW5zTGlzdCgpXG4gICAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuaW1wb3J0S2V5IHx8IGNvbC5pbXBvcnRCeSlcbiAgICAgICAgICAubWFwKChjb2wpID0+IGNvbC5oZWFkZXIudG9TdHJpbmcoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gIH1cblxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmZpbGVzID0gQXJyYXkuZnJvbShldmVudC5kYXRhVHJhbnNmZXIhLmZpbGVzKTtcblxuICAgIHRoaXMuc2VydmljZS5oYW5kbGVJbXBvcnQoXG4gICAgICB0aGlzLmZpbGVzWzBdLFxuICAgICAgdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKSxcbiAgICAgIHRoaXMucGFyc2VyKClcbiAgICApO1xuICAgIC8vIHRoaXMuaW1wb3J0RXZlbnQuZW1pdCh0aGlzLmZpbGVzWzBdKTtcbiAgICB0aGlzLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVzID0gQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMuc2VydmljZS5oYW5kbGVJbXBvcnQoXG4gICAgICB0aGlzLmZpbGVzWzBdLFxuICAgICAgdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKSxcbiAgICAgIHRoaXMucGFyc2VyKClcbiAgICApO1xuXG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG5cbiAgICAvLyB0aGlzLmltcG9ydEV2ZW50LmVtaXQodGhpcy5maWxlc1swXSk7XG4gICAgdGhpcy5zaG93UHJldmlldyA9IHRydWU7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgIHRoaXMuc2VydmljZS5jbGVhckRhdGEoKTtcbiAgfVxuXG4gIHNhdmUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ1BSRVZEQVRBJywgdGhpcy5zZXJ2aWNlLmltcG9ydGVkRGF0YSgpKTtcbiAgICBjb25zdCBvbkNvbXBsZXRlID0gdGhpcy5vbkltcG9ydENvbXBsZXRlKCk7XG4gICAgaWYgKG9uQ29tcGxldGUpIHtcbiAgICAgIG9uQ29tcGxldGUodGhpcy5zZXJ2aWNlLmltcG9ydGVkRGF0YSgpKS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbXBvcnRFdmVudERhdGEuZW1pdCh0aGlzLnNlcnZpY2UuaW1wb3J0ZWREYXRhKCkgfHwgW10pO1xuICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbnRyb2xOYW1lcygpIHtcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuZm9ybUdyb3VwQ29uZmlnKCk/LmNvbnRyb2xzO1xuICAgIGlmIChjb250cm9scykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaGFuZGxlVGVtcGxhdGVFeHBvcnQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmhhbmRsZVRlbXBsYXRlRXhwb3J0KHRoaXMuaGVhZGVycygpLCB0aGlzLnRpdGxlKCkpO1xuICAgIC8vIHRoaXMuZXhwb3J0VGVtcGxhdGVFdmVudC5lbWl0KHRoaXMuaGVhZGVycygpKTtcbiAgfVxuXG4gIC8vIGdldEZvcm1Db250cm9sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcpIHtcbiAgLy8gICBjb25zdCBjb250cm9sID0gdGhpcy4uZ2V0KGluZGV4KT8uZ2V0KGZpZWxkKSBhcyBGb3JtQ29udHJvbDxhbnk+O1xuICAvLyAgIGNvbnNvbGUubG9nKGNvbnRyb2wpO1xuICAvLyAgIHJldHVybiBjb250cm9sO1xuICAvLyB9XG59XG4iLCI8dmVyYmVuLWNhcmRcbiAgd2lkdGg9XCIyNHJlbVwiXG4gIGJvcmRlclJhZGl1cz1cIjFyZW1cIlxuICBbYm9yZGVyXT1cIicxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLXByaW1hcnkpJ1wiXG4gIGJnQ29sb3I9XCJ2YXIoLS12Ym4tY29sb3Itc3VyZmFjZSlcIlxuICBjbGFzcz1cImV4cG9ydC1jYXJkXCJcbj5cbiAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgPGg0IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+SW1wb3J0PC9oND5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpJ1wiXG4gICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJ25vbmUnXCJcbiAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgIFtzdHlsZS5mb250LXNpemVdPVwiJzEycHgnXCJcbiAgICAgIChjbGljayk9XCJyZXNldCgpXCJcbiAgICA+XG4gICAgICBSZXNldFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjYXJkLWJvZHkgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtYnV0dG9uXCIgKGNsaWNrKT1cImhhbmRsZVRlbXBsYXRlRXhwb3J0KClcIj5cbiAgICAgICAgRG93bmxvYWQgVGVtcGxhdGVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGxhYmVsIGZvcj1cImZpbGVJbnB1dFwiIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiPlVwbG9hZCBGaWxlPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8aHIgY2xhc3M9XCJkaXZpZGVyXCIgLz5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wLWFyZWFcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8cD5cbiAgICAgICAgICBEcmFnIGFuZCBkcm9wIGZpbGVzIGhlcmUgb3JcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsZUlucHV0XCIgW3N0eWxlLmNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItYm9yZGVyLWZvY3VzKSdcIlxuICAgICAgICAgICAgPmNsaWNrIHRvIGJyb3dzZTwvbGFiZWxcbiAgICAgICAgICA+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgIGlkPVwiZmlsZUlucHV0XCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gICAgICAgICAgYWNjZXB0PVwiLmNzdiwgYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQsIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbFwiXG4gICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImZpbGVzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGgzPlVwbG9hZGVkIEZpbGVzOjwvaDM+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZXNcIj57eyBmaWxlLm5hbWUgfX08L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjYXJkLWZvb3RlciBjbGFzcz1cImNhcmQtZm9vdGVyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cInNlcnZpY2UuaW1wb3J0ZWREYXRhKCkubGVuZ3RoIDwgMVwiXG4gICAgICBjbGFzcz1cImV4cG9ydC1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgPlxuICAgICAgSW1wb3J0XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC92ZXJiZW4tY2FyZD5cblxuPCEtLSBNb2RhbCBDb21wb25lbnQgLS0+XG48dmVyYmVuLWRpYWxvZ3VlXG4gIFtzaG93Q2xvc2VJY29uXT1cInRydWVcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJ0cnVlXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwidHJ1ZVwiXG4gIFtzaXplXT1cIidsYXJnZSdcIlxuICBbbW9kZV09XCInZGlhbG9ndWUnXCJcbiAgW2N1c3RvbUNsYXNzXT1cIidteS1tb2RhbC1jdXN0b20tY2xhc3MnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwiZmFsc2VcIlxuICBbbW9kYWxEYXRhXT1cIlt7IGRhdGE6IHt9IH1dXCJcbiAgW2lzVmlzaWJsZV09XCJzaG93UHJldmlld1wiXG4gIFtoZWFkZXJUZW1wbGF0ZV09XCJoZWFkZXJUZW1wbGF0ZVwiXG4gIFtib2R5VGVtcGxhdGVdPVwiYm9keVRlbXBsYXRlXCJcbiAgW2Zvb3RlclRlbXBsYXRlXT1cImZvb3RlclRlbXBsYXRlXCJcbiAgZGlhbG9ndWVXaWR0aD1cIjg1JVwiXG4+XG4gIDxhIGRvd25sb2FkPVwiXCI+PC9hPlxuPC92ZXJiZW4tZGlhbG9ndWU+XG5cbjwhLS0gRGVmaW5lIHRlbXBsYXRlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGU+XG4gIDxoMj5VcGxvYWQgUHJldmlldzwvaDI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JvZHlUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBteS00XCI+XG4gICAgPHAgY2xhc3M9XCJcIj5Ub3RhbCBJdGVtczoge3sgc2VydmljZS5pbXBvcnRlZERhdGEoKS5sZW5ndGggfX08L3A+XG5cbiAgICA8cCBjbGFzcz1cIlwiPkR1cGxpY2F0ZXM6IHt7IGR1cGxpY2F0ZUluZGV4U2V0LnNpemUgfX08L3A+XG5cbiAgICA8cCBjbGFzcz1cIlwiPkludmFsaWQgSXRlbXM6IHt7IGludmFsaWRJbmRleFNldC5zaXplIH19PC9wPlxuXG4gICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgIFttdWx0aXNlbGVjdF09XCJ0cnVlXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRmluZCBkdXBsaWNhdGVzIGJ5XCJcbiAgICAgIFtvcHRpb25zXT1cImhlYWRlcnMoKVwiXG4gICAgICBbbmdNb2RlbF09XCJ1bmlxdWVJZGVudGlmaWVycygpXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVuaXF1ZUlkZW50aWZpZXJzLnNldCgkZXZlbnQpXCJcbiAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1heC1oZWlnaHQ6IG1pbig3NXZoLCA3ODBweCk7IG92ZXJmbG93OiBhdXRvXCI+XG4gICAgPGxpYi1kYXRhLXRhYmxlXG4gICAgICBbZGF0YV09XCJzZXJ2aWNlLmltcG9ydGVkRGF0YSgpXCJcbiAgICAgIFtjb2x1bW5zXT1cInByZXZpZXdDb2x1bW5zTGlzdCgpXCJcbiAgICAgIFtmb3JtR3JvdXBDb25maWddPVwiZm9ybUdyb3VwQ29uZmlnKClcIlxuICAgICAgW3VzZVZpcnR1YWxTY3JvbGxdPVwidHJ1ZVwiXG4gICAgICAocm93U2F2ZSk9XCJzZXJ2aWNlLmFkZFJvdygkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2NlbGxcbiAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICBsZXQtZGVsZXRlUm93PVwiZGVsZXRlUm93XCJcbiAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImVkaXRcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuXG4gICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICBpY29uPVwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICBsZXQtZGVsZXRlUm93PVwiZGVsZXRlUm93XCJcbiAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpXCJcbiAgICAgICAgICAgICAgaWNvbj1cInRpY2tcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuXG4gICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICBpY29uPVwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbGliLWRhdGEtdGFibGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNmb290ZXJUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZvb3Rlci1idXR0b25zIGZsZXggZ2FwLTQgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBteS00XCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBjYW5jZWwtYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJzaG93UHJldmlldyA9IGZhbHNlXCJcbiAgICA+XG4gICAgICBDYW5jZWxcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGV4cG9ydC1idXR0b25cIiAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgICBDb21wbGV0ZVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWltcG9ydC9kYXRhLWltcG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtaW1wb3J0L2RhdGEtaW1wb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFNBQVMsRUFFVixNQUFNLGdCQUFnQixDQUFDO0FBTXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7O0FBUzFELE1BQU0sT0FBTyxtQkFBbUI7SUFnRVg7SUEvRG5CLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF5QixDQUFDO0lBQ3pELGVBQWUsR0FBRyxLQUFLLEVBSXBCLENBQUM7SUFDSjs7T0FFRztJQUNILE1BQU0sR0FBRyxLQUFLLEVBQVksQ0FBQztJQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFTLGlCQUFpQixDQUFDLENBQUM7SUFDekMsZUFBZSxHQUFHLEtBQUssQ0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDeEQsTUFBTSxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUM5Qzs7T0FFRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQU8sQ0FBQztJQUMzQjs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLEVBQTRDLENBQUM7SUFDckU7O09BRUc7SUFDSCxtQkFBbUIsR0FBRyxNQUFNLEVBQVksQ0FBQztJQUN6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QUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLENBQUM7UUFDbEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLGlEQUFpRDtJQUNuRCxDQUFDO3dHQTdNVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixreENBSG5CLENBQUMsaUJBQWlCLENBQUMsMEJDM0JoQyxpbExBa01BOzs0RkRwS2EsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGlCQUFpQixhQUdoQixDQUFDLGlCQUFpQixDQUFDLG1CQUNiLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBTaWduYWwsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQXJyYXksXG4gIEZvcm1Hcm91cFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb2x1bW5EZWZpbml0aW9uLFxuICBDb2x1bW5EaXJlY3RpdmUsXG4gIEZvcm1Hcm91cENvbmZpZyxcbn0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlJztcbmltcG9ydCB7IERhdGFJbXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWltcG9ydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRhdGEtaW1wb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtaW1wb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtaW1wb3J0LmNvbXBvbmVudC5jc3MnLFxuICBwcm92aWRlcnM6IFtEYXRhSW1wb3J0U2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhSW1wb3J0Q29tcG9uZW50PFQgZXh0ZW5kcyB7fT4ge1xuICBwcmV2aWV3Q29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPENvbHVtbkRlZmluaXRpb248VD5bXT4oKTtcbiAgZm9ybUdyb3VwQ29uZmlnID0gaW5wdXQ8XG4gICAgRm9ybUdyb3VwQ29uZmlnPHtcbiAgICAgIFtLIGluIGtleW9mIFRdOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgfT5cbiAgPigpO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGltcG9ydEtleSBvZiBwcmV2aWV3Q29sdW1ucyBpbnN0ZWFkXG4gICAqL1xuICBmaWVsZHMgPSBpbnB1dDxzdHJpbmdbXT4oKTtcbiAgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCdleHBvcnQtdGVtcGxhdGUnKTtcbiAgY29sdW1uVGVtcGxhdGVzID0gaW5wdXQ8cmVhZG9ubHkgQ29sdW1uRGlyZWN0aXZlW10+KFtdKTtcbiAgcGFyc2VyID0gaW5wdXQ8KGRhdGE6IGFueSkgPT4gUGFydGlhbDxUPltdPigpO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHJlbW92ZSwgbm93IGhhbmRsZWQgaW50ZXJuYWxseVxuICAgKi9cbiAgcHJldmlld0RhdGEgPSBpbnB1dDxUW10+KCk7XG4gIC8qKlxuICAgKiBQYXNzIHRoZSBtZXRob2QgdG8gdXNlIHRoZSBpbXBvcnRlZCBkYXRhLFxuICAgKiBhbmQgZXZlbnR1YWxseSByZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IHVzZWRcbiAgICovXG4gIG9uSW1wb3J0Q29tcGxldGUgPSBpbnB1dDwoZGF0YTogUGFydGlhbDxUPltdKSA9PiBQcm9taXNlPGJvb2xlYW4+PigpO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHJlbW92ZSwgbm93IGhhbmRsZWQgaW50ZXJuYWxseVxuICAgKi9cbiAgZXhwb3J0VGVtcGxhdGVFdmVudCA9IG91dHB1dDxzdHJpbmdbXT4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSByZW1vdmUsIG5vdyBoYW5kbGVkIGludGVybmFsbHlcbiAgICovXG4gIGltcG9ydEV2ZW50ID0gb3V0cHV0PEZpbGU+KCk7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uSW1wb3J0Q29tcGxldGUgaW5wdXQgaW5zdGVhZFxuICAgKi9cbiAgaW1wb3J0RXZlbnREYXRhID0gb3V0cHV0PFBhcnRpYWw8VD5bXT4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSByZW1vdmUsIG5vdyBoYW5kbGVkIGludGVybmFsbHlcbiAgICovXG4gIHJvd1NhdmUgPSBvdXRwdXQ8e1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAga2V5OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgZGF0YTogUGFydGlhbDxUPjtcbiAgfT4oKTtcblxuICAvLyBkYXRhOiBTaWduYWw8KFQgJiB7IGlzRHVwbGljYXRlOiBib29sZWFuIH0pW10+O1xuICBwcmV2aWV3Q29sdW1uc0xpc3Q6IFNpZ25hbDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+O1xuICBmb3JtcyA9IG5ldyBGb3JtQXJyYXk8Rm9ybUdyb3VwPihbXSk7XG4gIHVuaXF1ZUlkZW50aWZpZXJzOiBXcml0YWJsZVNpZ25hbDxzdHJpbmdbXT4gPSBzaWduYWwoW10pO1xuICAvLyBkdXBsaWNhdGVEYXRhTWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICBkdXBsaWNhdGVJbmRleFNldCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBpbnZhbGlkSW5kZXhTZXQgPSBuZXcgTWFwPG51bWJlciwgQ29sdW1uRGlyZWN0aXZlWydjb2x1bW5JZCddW10+KCk7XG5cbiAgaGVhZGVyczogU2lnbmFsPHN0cmluZ1tdPjtcblxuICBwcml2YXRlIF9leHQ6ICd4bHN4JyB8ICd4bHMnIHwgJ2NzdicgPSAneGxzeCc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbmV4dEZpbGVJbnB1dElkID0gMDtcbiAgLyoqIFVuaXF1ZSBwZXIgaW5zdGFuY2Ugc28gc2V2ZXJhbCBpbXBvcnQgY2FyZHMgY2FuIGNvZXhpc3Qgb24gb25lIHBhZ2UuICovXG4gIHJlYWRvbmx5IGZpbGVJbnB1dElkID0gYHZibi1kYXRhLWltcG9ydC1maWxlLSR7RGF0YUltcG9ydENvbXBvbmVudC5uZXh0RmlsZUlucHV0SWQrK31gO1xuXG4gIGZpbGVzOiBGaWxlW10gPSBbXTtcbiAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICBzaG93UHJldmlldyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOiBEYXRhSW1wb3J0U2VydmljZTxUPikge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBjb25zdCBjb2x1bW5zID0gdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKTtcblxuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSB0aGlzLnVuaXF1ZUlkZW50aWZpZXJzKCk7XG5cbiAgICAgIHRoaXMuc2VydmljZS5pbXBvcnRlZERhdGEoKT8uZm9yRWFjaCgoZCwgaSwgYXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXJ2aWNlLmlzRHVwbGljYXRlKGQsIGFyciwgaWRlbnRpZmllcnMpKSB7XG4gICAgICAgICAgdGhpcy5kdXBsaWNhdGVJbmRleFNldC5hZGQoaSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2x1bW5zXG4gICAgICAgIC8vICAgLmZpbHRlcigoeyB2YWxpZGF0b3JGbiB9KSA9PiB2YWxpZGF0b3JGbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBPYmplY3QuZW50cmllcyhkKS5yZWR1Y2U8c3RyaW5nW10+KFxuICAgICAgICAvLyAgICAgICAoZiwgW2ssIHZdLCBpKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgaWYgKFxuICAgICAgICAvLyAgICAgICAgICAgY29sdW1uLnZhbGlkYXRvckZuICYmXG4gICAgICAgIC8vICAgICAgICAgICAhY29sdW1uLnZhbGlkYXRvckZuKHYgYXMgVFtrZXlvZiBUXSlcbiAgICAgICAgLy8gICAgICAgICApIHtcbiAgICAgICAgLy8gICAgICAgICAgIGYucHVzaChjb2x1bW4uaWQpO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgLy8gICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgW11cbiAgICAgICAgLy8gICAgICk7XG5cbiAgICAgICAgLy8gICAgIGlmIChpbnZhbGlkRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gICAgICAgdGhpcy5pbnZhbGlkSW5kZXhTZXQuc2V0KGksIGludmFsaWRGaWVsZHMpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByZXZpZXdDb2x1bW5zTGlzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZpZXdDb2x1bW5zKClcbiAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuaW1wb3J0S2V5IHx8IGNvbC5pbXBvcnRCeSB8fCBjb2wuZm9ybUNvbnRyb2xOYW1lKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gdGhpcy5jb2x1bW5UZW1wbGF0ZXMoKS5maW5kKFxuICAgICAgICAgICAgKHQpID0+IHQuY29sdW1uSWQgPT09IGNvbHVtbi5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gYWNjZXNzb3JLZXk6IGNvbHVtbi5pbXBvcnRLZXksXG4gICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsVGVtcGxhdGUsXG4gICAgICAgICAgICAgIGNlbGxFZGl0VGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbEVkaXRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICAgIGZvb3RlclRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmZvb3RlclRlbXBsYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSlcbiAgICAgICAgLmNvbmNhdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdhY3Rpb25zJyxcbiAgICAgICAgICAgIGhlYWRlcjogJ0FjdGlvbnMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5oZWFkZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5maWVsZHMoKSA/P1xuICAgICAgICB0aGlzLnByZXZpZXdDb2x1bW5zTGlzdCgpXG4gICAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuaW1wb3J0S2V5IHx8IGNvbC5pbXBvcnRCeSlcbiAgICAgICAgICAubWFwKChjb2wpID0+IGNvbC5oZWFkZXIudG9TdHJpbmcoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gIH1cblxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmZpbGVzID0gQXJyYXkuZnJvbShldmVudC5kYXRhVHJhbnNmZXIhLmZpbGVzKTtcblxuICAgIHRoaXMuc2VydmljZS5oYW5kbGVJbXBvcnQoXG4gICAgICB0aGlzLmZpbGVzWzBdLFxuICAgICAgdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKSxcbiAgICAgIHRoaXMucGFyc2VyKClcbiAgICApO1xuICAgIC8vIHRoaXMuaW1wb3J0RXZlbnQuZW1pdCh0aGlzLmZpbGVzWzBdKTtcbiAgICB0aGlzLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVzID0gQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMuc2VydmljZS5oYW5kbGVJbXBvcnQoXG4gICAgICB0aGlzLmZpbGVzWzBdLFxuICAgICAgdGhpcy5wcmV2aWV3Q29sdW1uc0xpc3QoKSxcbiAgICAgIHRoaXMucGFyc2VyKClcbiAgICApO1xuXG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG5cbiAgICAvLyB0aGlzLmltcG9ydEV2ZW50LmVtaXQodGhpcy5maWxlc1swXSk7XG4gICAgdGhpcy5zaG93UHJldmlldyA9IHRydWU7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgIHRoaXMuc2VydmljZS5jbGVhckRhdGEoKTtcbiAgfVxuXG4gIHNhdmUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ1BSRVZEQVRBJywgdGhpcy5zZXJ2aWNlLmltcG9ydGVkRGF0YSgpKTtcbiAgICBjb25zdCBvbkNvbXBsZXRlID0gdGhpcy5vbkltcG9ydENvbXBsZXRlKCk7XG4gICAgaWYgKG9uQ29tcGxldGUpIHtcbiAgICAgIG9uQ29tcGxldGUodGhpcy5zZXJ2aWNlLmltcG9ydGVkRGF0YSgpKS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbXBvcnRFdmVudERhdGEuZW1pdCh0aGlzLnNlcnZpY2UuaW1wb3J0ZWREYXRhKCkgfHwgW10pO1xuICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbnRyb2xOYW1lcygpIHtcbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuZm9ybUdyb3VwQ29uZmlnKCk/LmNvbnRyb2xzO1xuICAgIGlmIChjb250cm9scykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaGFuZGxlVGVtcGxhdGVFeHBvcnQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmhhbmRsZVRlbXBsYXRlRXhwb3J0KHRoaXMuaGVhZGVycygpLCB0aGlzLnRpdGxlKCkpO1xuICAgIC8vIHRoaXMuZXhwb3J0VGVtcGxhdGVFdmVudC5lbWl0KHRoaXMuaGVhZGVycygpKTtcbiAgfVxuXG4gIC8vIGdldEZvcm1Db250cm9sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcpIHtcbiAgLy8gICBjb25zdCBjb250cm9sID0gdGhpcy4uZ2V0KGluZGV4KT8uZ2V0KGZpZWxkKSBhcyBGb3JtQ29udHJvbDxhbnk+O1xuICAvLyAgIGNvbnNvbGUubG9nKGNvbnRyb2wpO1xuICAvLyAgIHJldHVybiBjb250cm9sO1xuICAvLyB9XG59XG4iLCI8dmVyYmVuLWNhcmRcbiAgd2lkdGg9XCIyNHJlbVwiXG4gIGJvcmRlclJhZGl1cz1cIjFyZW1cIlxuICBbYm9yZGVyXT1cIicxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLXByaW1hcnkpJ1wiXG4gIGJnQ29sb3I9XCJ2YXIoLS12Ym4tY29sb3Itc3VyZmFjZSlcIlxuICBjbGFzcz1cImV4cG9ydC1jYXJkXCJcbj5cbiAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgPGg0IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+SW1wb3J0PC9oND5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpJ1wiXG4gICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJ25vbmUnXCJcbiAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgIFtzdHlsZS5mb250LXNpemVdPVwiJzEycHgnXCJcbiAgICAgIChjbGljayk9XCJyZXNldCgpXCJcbiAgICA+XG4gICAgICBSZXNldFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjYXJkLWJvZHkgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtYnV0dG9uXCIgKGNsaWNrKT1cImhhbmRsZVRlbXBsYXRlRXhwb3J0KClcIj5cbiAgICAgICAgRG93bmxvYWQgVGVtcGxhdGVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGxhYmVsIFthdHRyLmZvcl09XCJmaWxlSW5wdXRJZFwiIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiPlVwbG9hZCBGaWxlPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8aHIgY2xhc3M9XCJkaXZpZGVyXCIgLz5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wLWFyZWFcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8cD5cbiAgICAgICAgICBEcmFnIGFuZCBkcm9wIGZpbGVzIGhlcmUgb3JcbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIFthdHRyLmZvcl09XCJmaWxlSW5wdXRJZFwiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpJ1wiXG4gICAgICAgICAgICA+Y2xpY2sgdG8gYnJvd3NlPC9sYWJlbFxuICAgICAgICAgID5cbiAgICAgICAgPC9wPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgW2F0dHIuaWRdPVwiZmlsZUlucHV0SWRcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcbiAgICAgICAgICBhY2NlcHQ9XCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJcbiAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmlsZXMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8aDM+VXBsb2FkZWQgRmlsZXM6PC9oMz5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZmlsZSBvZiBmaWxlc1wiPnt7IGZpbGUubmFtZSB9fTwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NlY3Rpb24+XG4gIDwvZGl2PlxuICA8ZGl2IGNhcmQtZm9vdGVyIGNsYXNzPVwiY2FyZC1mb290ZXJcIj5cbiAgICA8YnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwic2VydmljZS5pbXBvcnRlZERhdGEoKS5sZW5ndGggPCAxXCJcbiAgICAgIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICA+XG4gICAgICBJbXBvcnRcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3ZlcmJlbi1jYXJkPlxuXG48IS0tIE1vZGFsIENvbXBvbmVudCAtLT5cbjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwidHJ1ZVwiXG4gIFtkaXNtaXNzT3V0c2lkZUNsaWNrXT1cInRydWVcIlxuICBbY2xvc2VPbkVzY2FwZV09XCJ0cnVlXCJcbiAgW3NpemVdPVwiJ2xhcmdlJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ215LW1vZGFsLWN1c3RvbS1jbGFzcydcIlxuICBbZGlzYWJsZUZvb3Rlcl09XCJmYWxzZVwiXG4gIFttb2RhbERhdGFdPVwiW3sgZGF0YToge30gfV1cIlxuICBbaXNWaXNpYmxlXT1cInNob3dQcmV2aWV3XCJcbiAgW2hlYWRlclRlbXBsYXRlXT1cImhlYWRlclRlbXBsYXRlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxuICBbZm9vdGVyVGVtcGxhdGVdPVwiZm9vdGVyVGVtcGxhdGVcIlxuICBkaWFsb2d1ZVdpZHRoPVwiODUlXCJcbj5cbiAgPGEgZG93bmxvYWQ9XCJcIj48L2E+XG48L3ZlcmJlbi1kaWFsb2d1ZT5cblxuPCEtLSBEZWZpbmUgdGVtcGxhdGVzIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkZXJUZW1wbGF0ZT5cbiAgPGgyPlVwbG9hZCBQcmV2aWV3PC9oMj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG15LTRcIj5cbiAgICA8cCBjbGFzcz1cIlwiPlRvdGFsIEl0ZW1zOiB7eyBzZXJ2aWNlLmltcG9ydGVkRGF0YSgpLmxlbmd0aCB9fTwvcD5cblxuICAgIDxwIGNsYXNzPVwiXCI+RHVwbGljYXRlczoge3sgZHVwbGljYXRlSW5kZXhTZXQuc2l6ZSB9fTwvcD5cblxuICAgIDxwIGNsYXNzPVwiXCI+SW52YWxpZCBJdGVtczoge3sgaW52YWxpZEluZGV4U2V0LnNpemUgfX08L3A+XG5cbiAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgW211bHRpc2VsZWN0XT1cInRydWVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJGaW5kIGR1cGxpY2F0ZXMgYnlcIlxuICAgICAgW29wdGlvbnNdPVwiaGVhZGVycygpXCJcbiAgICAgIFtuZ01vZGVsXT1cInVuaXF1ZUlkZW50aWZpZXJzKClcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidW5pcXVlSWRlbnRpZmllcnMuc2V0KCRldmVudClcIlxuICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG4gIDwvZGl2PlxuICA8ZGl2IHN0eWxlPVwibWF4LWhlaWdodDogbWluKDc1dmgsIDc4MHB4KTsgb3ZlcmZsb3c6IGF1dG9cIj5cbiAgICA8bGliLWRhdGEtdGFibGVcbiAgICAgIFtkYXRhXT1cInNlcnZpY2UuaW1wb3J0ZWREYXRhKClcIlxuICAgICAgW2NvbHVtbnNdPVwicHJldmlld0NvbHVtbnNMaXN0KClcIlxuICAgICAgW2Zvcm1Hcm91cENvbmZpZ109XCJmb3JtR3JvdXBDb25maWcoKVwiXG4gICAgICBbdXNlVmlydHVhbFNjcm9sbF09XCJ0cnVlXCJcbiAgICAgIChyb3dTYXZlKT1cInNlcnZpY2UuYWRkUm93KCRldmVudClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjY2VsbFxuICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgIGxldC1kZWxldGVSb3c9XCJkZWxldGVSb3dcIlxuICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIlxuICAgICAgICAgICAgICBpY29uPVwiZWRpdFwiXG4gICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdygpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICNjZWxsRWRpdFxuICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgIGxldC1kZWxldGVSb3c9XCJkZWxldGVSb3dcIlxuICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgIGxldC10b2dnbGVSb3dFZGl0PVwidG9nZ2xlUm93RWRpdFwiXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIlxuICAgICAgICAgICAgICBpY29uPVwidGlja1wiXG4gICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdygpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9saWItZGF0YS10YWJsZT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJ1dHRvbnMgZmxleCBnYXAtNCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG15LTRcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGNhbmNlbC1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cInNob3dQcmV2aWV3ID0gZmFsc2VcIlxuICAgID5cbiAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgZXhwb3J0LWJ1dHRvblwiIChjbGljayk9XCJzYXZlKClcIj5cbiAgICAgIENvbXBsZXRlXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -4,6 +4,29 @@ import * as i0 from "@angular/core";
4
4
  export class DataImportService {
5
5
  importedData = signal([]);
6
6
  constructor() { }
7
+ /**
8
+ * A value carries no information if it is nullish, an empty/whitespace string,
9
+ * an invalid date, or a collection whose every member is itself blank.
10
+ * Numbers (including 0) and booleans (including false) are never blank.
11
+ */
12
+ isBlankValue(value) {
13
+ if (value === null || value === undefined)
14
+ return true;
15
+ if (typeof value === 'string')
16
+ return value.trim() === '';
17
+ if (value instanceof Date)
18
+ return Number.isNaN(value.getTime());
19
+ if (Array.isArray(value))
20
+ return value.every((v) => this.isBlankValue(v));
21
+ if (typeof value === 'object') {
22
+ return Object.values(value).every((v) => this.isBlankValue(v));
23
+ }
24
+ return false;
25
+ }
26
+ isBlankRow(row) {
27
+ const values = Object.values(row);
28
+ return values.length === 0 || values.every((v) => this.isBlankValue(v));
29
+ }
7
30
  // Function to transform imported data to match your model structure
8
31
  transformImportData(importedData, columnDefinitions) {
9
32
  // Create mappings from header to importKey and importBy
@@ -23,8 +46,12 @@ export class DataImportService {
23
46
  headerToImportByMap.set(header, col.importBy);
24
47
  }
25
48
  });
26
- // Transform each row in the imported data
27
- return importedData.map((row) => {
49
+ // Transform each row in the imported data. Rows the sheet still reports but
50
+ // that hold nothing (whitespace, leftover formatting) are dropped up front so
51
+ // importBy never fabricates values out of them.
52
+ return importedData
53
+ .filter((row) => !this.isBlankRow(row))
54
+ .map((row) => {
28
55
  const transformedRow = {};
29
56
  // Process each key in the row
30
57
  Object.entries(row).forEach(([key, value]) => {
@@ -52,7 +79,10 @@ export class DataImportService {
52
79
  }
53
80
  });
54
81
  return transformedRow;
55
- });
82
+ })
83
+ // A row can still end up empty here when none of its populated cells map to
84
+ // an importable column.
85
+ .filter((row) => !this.isBlankRow(row));
56
86
  }
57
87
  handleImport(file,
58
88
  // previewer?: (data: any[]) => void,
@@ -73,6 +103,7 @@ export class DataImportService {
73
103
  if (sheets.length) {
74
104
  const rows = utils.sheet_to_json(wb.Sheets[sheets[0]], {
75
105
  defval: null,
106
+ blankrows: false,
76
107
  });
77
108
  imported = this.transformImportData(rows, columnDefinitions);
78
109
  // console.log('TRANSFORMED', imported);
@@ -126,4 +157,4 @@ export class DataImportService {
126
157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataImportService, decorators: [{
127
158
  type: Injectable
128
159
  }], ctorParameters: () => [] });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1pbXBvcnQvZGF0YS1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUc5QyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQVksR0FBd0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLGdCQUFlLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLG1CQUFtQixDQUNqQixZQUFtQyxFQUNuQyxpQkFBd0M7UUFFeEMsd0RBQXdEO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7UUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFHaEMsQ0FBQztRQUVKLDJGQUEyRjtRQUMzRixpQkFBaUI7YUFDZCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUM5QyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNmLE1BQU0sTUFBTSxHQUNWLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUM1QixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ1osQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFaEMsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxNQUFN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SUFDdEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQixFQUFFLEtBQW1CLEVBQUUsV0FBcUI7UUFDdkUsT0FBTyxDQUNMLEtBQUssQ0FBQyxNQUFNLENBQ1YsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN0QixXQUFXLENBQUMsS0FBSyxDQUNmLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDYixLQUFLLENBQUMsVUFBcUIsQ0FBQztnQkFDNUIsS0FBSyxDQUFDLFVBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsVUFBcUIsQ0FBQyxDQUM5RCxDQUNKLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO3dHQXRKVSxpQkFBaUI7NEdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuaW1wb3J0IHsgcmVhZCwgdXRpbHMsIHdyaXRlRmlsZSB9IGZyb20gJ3hsc3gnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0YUltcG9ydFNlcnZpY2U8VD4ge1xuICBpbXBvcnRlZERhdGE6IFdyaXRhYmxlU2lnbmFsPFRbXT4gPSBzaWduYWwoW10pO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvLyBGdW5jdGlvbiB0byB0cmFuc2Zvcm0gaW1wb3J0ZWQgZGF0YSB0byBtYXRjaCB5b3VyIG1vZGVsIHN0cnVjdHVyZVxuICB0cmFuc2Zvcm1JbXBvcnREYXRhPFQ+KFxuICAgIGltcG9ydGVkRGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIGNvbHVtbkRlZmluaXRpb25zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10sXG4gICk6IFBhcnRpYWw8VD5bXSB7XG4gICAgLy8gQ3JlYXRlIG1hcHBpbmdzIGZyb20gaGVhZGVyIHRvIGltcG9ydEtleSBhbmQgaW1wb3J0QnlcbiAgICBjb25zdCBoZWFkZXJUb0ltcG9ydEtleU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBrZXlvZiBUPigpO1xuICAgIGNvbnN0IGhlYWRlclRvSW1wb3J0QnlNYXAgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAga2V5b2YgVCB8ICgoaW1wb3J0ZWRSb3c6IGFueSkgPT4gVFtrZXlvZiBUXSlcbiAgICA+KCk7XG5cbiAgICAvLyBGaWx0ZXIgY29sdW1uIGRlZmluaXRpb25zIHRvIG9ubHkgdGhvc2Ugd2l0aCBpbXBvcnRLZXkgb3IgaW1wb3J0QnkgYW5kIHBvcHVsYXRlIHRoZSBtYXBzXG4gICAgY29sdW1uRGVmaW5pdGlvbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLmltcG9ydEtleSB8fCBjb2wuaW1wb3J0QnkpXG4gICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICAgICAgdHlwZW9mIGNvbC5oZWFkZXIgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGNvbC5oZWFkZXJcbiAgICAgICAgICAgIDogY29sLmhlYWRlcih7fSkudG9TdHJpbmcoKTtcblxuICAgICAgICBpZiAoY29sLmltcG9ydEtleSkge1xuICAgICAgICAgIGhlYWRlclRvSW1wb3J0S2V5TWFwLnNldChoZWFkZXIsIGNvbC5pbXBvcnRLZXkgYXMga2V5b2YgVCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLmltcG9ydEJ5KSB7XG4gICAgICAgICAgaGVhZGVyVG9JbXBvcnRCeU1hcC5zZXQoaGVhZGVyLCBjb2wuaW1wb3J0QnkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFRyYW5zZm9ybSBlYWNoIHJvdyBpbiB0aGUgaW1wb3J0ZWQgZGF0YVxuICAgIHJldHVybiBpbXBvcnRlZERhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUm93OiBQYXJ0aWFsPFQ+ID0ge307XG5cbiAgICAgIC8vIFByb2Nlc3MgZWFjaCBrZXkgaW4gdGhlIHJvd1xuICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBpbXBvcnRCeSB0cmFuc2Zvcm1hdGlvbiBmaXJzdCAodGFrZXMgcHJpb3JpdHkpXG4gICAgICAgIGNvbnN0IGltcG9ydEJ5ID0gaGVhZGVyVG9JbXBvcnRCeU1hcC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoaW1wb3J0QnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydEJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGltcG9ydEJ5IGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgZW50aXJlIGltcG9ydGVkIHJvd1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0S2V5ID0gaGVhZGVyVG9JbXBvcnRLZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaW1wb3J0S2V5KSB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkUm93W2ltcG9ydEtleV0gPSBpbXBvcnRCeShyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbXBvcnRCeSBpcyBhIGRpcmVjdCBrZXkgcmVmZXJlbmNlXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZFJvd1tpbXBvcnRCeV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGltcG9ydEtleSBpZiBubyBpbXBvcnRCeSBpcyBkZWZpbmVkXG4gICAgICAgICAgY29uc3QgaW1wb3J0S2V5ID0gaGVhZGVyVG9JbXBvcnRLZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgaWYgKGltcG9ydEtleSkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZWRSb3dbaW1wb3J0S2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJvdztcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUltcG9ydChcbiAgICBmaWxlOiBGaWxlLFxuICAgIC8vIHByZXZpZXdlcj86IChkYXRhOiBhbnlbXSkgPT4gdm9pZCxcbiAgICBjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uRGVmaW5pdGlvbjxUPltdLFxuICAgIHBhcnNlSW1wb3J0PzogKGRhdGE6IGFueSkgPT4gUGFydGlhbDxUPltdLFxuICApIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgLy8gY29uc3Qgd2IgPSByZWFkKGV2ZW50LnRhcmdldC5yZXN1bHQsIHtcbiAgICAgIC8vICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAvLyAgIHJhdzogdHJ1ZSxcbiAgICAgIC8vICAgY2VsbFRleHQ6IHRydWUsXG4gICAgICAvLyAgIGNlbGxGb3JtdWxhOiBmYWxzZSxcbiAgICAgIC8vICAgY2VsbE5GOiBmYWxzZSxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gY29uc29sZS50aW1lKCdCZWdpbicpO1xuICAgICAgbGV0IGltcG9ydGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3Qgd2IgPSByZWFkKGV2ZW50LnRhcmdldC5yZXN1bHQsIHsgY2VsbERhdGVzOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc2hlZXRzID0gd2IuU2hlZXROYW1lcztcbiAgICAgIGlmIChzaGVldHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB1dGlscy5zaGVldF90b19qc29uKHdiLlNoZWV0c1tzaGVldHNbMF1dLCB7XG4gICAgICAgICAgZGVmdmFsOiBudWxsLFxuICAgICAgICB9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG5cbiAgICAgICAgaW1wb3J0ZWQgPSB0aGlzLnRyYW5zZm9ybUltcG9ydERhdGEocm93cywgY29sdW1uRGVmaW5pdGlvbnMpIGFzIFRbXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1RSQU5TRk9STUVEJywgaW1wb3J0ZWQpO1xuXG4gICAgICAgIGlmIChwYXJzZUltcG9ydCkge1xuICAgICAgICAgIGltcG9ydGVkID0gcGFyc2VJbXBvcnQoaW1wb3J0ZWQpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdQQVJTRUQnLCBpbXBvcnRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJldmlld2VyKGltcG9ydGVkKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdJbXBvcnRlZCBkYXRhOicsIEpTT04uc3RyaW5naWZ5KGltcG9ydGVkLCBudWxsLCAyKSk7XG4gICAgICAvLyBjb25zb2xlLnRpbWUoJ1N0YXJ0IFByb2Nlc3MnKTtcbiAgICAgIHRoaXMuaW1wb3J0ZWREYXRhLnNldChpbXBvcnRlZCk7XG4gICAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ0JlZ2luJyk7XG4gICAgICByZXR1cm4gaW1wb3J0ZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICB9XG5cbiAgaGFuZGxlVGVtcGxhdGVFeHBvcnQoZmllbGRzOiBzdHJpbmdbXSwgdGl0bGU6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKGZpZWxkcyk7XG4gICAgY29uc3Qgd2IgPSB1dGlscy5ib29rX25ldygpO1xuICAgIGNvbnN0IHdzOiBhbnkgPSB1dGlscy5qc29uX3RvX3NoZWV0KFtdKTtcbiAgICB1dGlscy5zaGVldF9hZGRfYW9hKHdzLCBbZmllbGRzXSk7XG4gICAgLy8gdXRpbHMuc2hlZXRfYWRkX2pzb24od3MsIHRoaXMuX2RhdGEsIHsgb3JpZ2luOiAnQTInLCBza2lwSGVhZGVyOiB0cnVlIH0pO1xuICAgIHV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdiLCB3cywgdGl0bGUpO1xuICAgIHdyaXRlRmlsZSh3YiwgdGl0bGUgKyAnLXRlbXBsYXRlLicgKyAneGxzeCcpO1xuICB9XG5cbiAgYWRkUm93KGV2ZW50OiB7IGluZGV4OiBudW1iZXI7IGtleTogc3RyaW5nIHwgbnVtYmVyOyBkYXRhOiBQYXJ0aWFsPFQ+IH0pIHtcbiAgICAvLyBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgdGhpcy5pbXBvcnRlZERhdGEudXBkYXRlKChkYXQpID0+IHtcbiAgICAgIC8vIGRhdFtldmVudC5pbmRleF0gPSB7IC4uLmRhdFtldmVudC5pbmRleF0sIC4uLmV2ZW50LmRhdGEgfTtcbiAgICAgIHJldHVybiBkYXQubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID09PSBldmVudC5pbmRleCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLmQsIC4uLmV2ZW50LmRhdGEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaW1wb3J0ZWREYXRhKCkpO1xuICB9XG5cbiAgaXNEdXBsaWNhdGUoZGF0dW06IFBhcnRpYWw8VD4sIGFycmF5OiBQYXJ0aWFsPFQ+W10sIGlkZW50aWZpZXJzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiAoXG4gICAgICBhcnJheS5maWx0ZXIoXG4gICAgICAgIChkYXQpID0+XG4gICAgICAgICAgaWRlbnRpZmllcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIGlkZW50aWZpZXJzLmV2ZXJ5KFxuICAgICAgICAgICAgKGlkZW50aWZpZXIpID0+XG4gICAgICAgICAgICAgIGRhdHVtW2lkZW50aWZpZXIgYXMga2V5b2YgVF0gJiZcbiAgICAgICAgICAgICAgZGF0dW1baWRlbnRpZmllciBhcyBrZXlvZiBUXSA9PT0gZGF0W2lkZW50aWZpZXIgYXMga2V5b2YgVF0sXG4gICAgICAgICAgKSxcbiAgICAgICkubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBjbGVhckRhdGEoKSB7XG4gICAgdGhpcy5pbXBvcnRlZERhdGEuc2V0KFtdKTtcbiAgfVxufVxuIl19
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1pbXBvcnQvZGF0YS1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUc5QyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQVksR0FBd0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLGdCQUFlLENBQUM7SUFFaEI7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxLQUFjO1FBQ2pDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEtBQUssWUFBWSxJQUFJO1lBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QztvQkFDdEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqQyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILG9DQUFvQztJQUN0QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCLEVBQUUsS0FBbUIsRUFBRSxXQUFxQjtRQUN2RSxPQUFPLENBQ0wsS0FBSyxDQUFDLE1BQU0sQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3RCLFdBQVcsQ0FBQyxLQUFLLENBQ2YsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUNiLEtBQUssQ0FBQyxVQUFxQixDQUFDO2dCQUM1QixLQUFLLENBQUMsVUFBcUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFxQixDQUFDLENBQzlELENBQ0osQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUNiLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7d0dBbkxVLGlCQUFpQjs0R0FBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyByZWFkLCB1dGlscywgd3JpdGVGaWxlIH0gZnJvbSAneGxzeCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhSW1wb3J0U2VydmljZTxUPiB7XG4gIGltcG9ydGVkRGF0YTogV3JpdGFibGVTaWduYWw8VFtdPiA9IHNpZ25hbChbXSk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBBIHZhbHVlIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gaWYgaXQgaXMgbnVsbGlzaCwgYW4gZW1wdHkvd2hpdGVzcGFjZSBzdHJpbmcsXG4gICAqIGFuIGludmFsaWQgZGF0ZSwgb3IgYSBjb2xsZWN0aW9uIHdob3NlIGV2ZXJ5IG1lbWJlciBpcyBpdHNlbGYgYmxhbmsuXG4gICAqIE51bWJlcnMgKGluY2x1ZGluZyAwKSBhbmQgYm9vbGVhbnMgKGluY2x1ZGluZyBmYWxzZSkgYXJlIG5ldmVyIGJsYW5rLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0JsYW5rVmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS50cmltKCkgPT09ICcnO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5ldmVyeSgodikgPT4gdGhpcy5pc0JsYW5rVmFsdWUodikpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWx1ZSBhcyBvYmplY3QpLmV2ZXJ5KCh2KSA9PiB0aGlzLmlzQmxhbmtWYWx1ZSh2KSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNCbGFua1Jvdyhyb3c6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocm93KTtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMCB8fCB2YWx1ZXMuZXZlcnkoKHYpID0+IHRoaXMuaXNCbGFua1ZhbHVlKHYpKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIHRyYW5zZm9ybSBpbXBvcnRlZCBkYXRhIHRvIG1hdGNoIHlvdXIgbW9kZWwgc3RydWN0dXJlXG4gIHRyYW5zZm9ybUltcG9ydERhdGE8VD4oXG4gICAgaW1wb3J0ZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgY29sdW1uRGVmaW5pdGlvbnM6IENvbHVtbkRlZmluaXRpb248VD5bXSxcbiAgKTogUGFydGlhbDxUPltdIHtcbiAgICAvLyBDcmVhdGUgbWFwcGluZ3MgZnJvbSBoZWFkZXIgdG8gaW1wb3J0S2V5IGFuZCBpbXBvcnRCeVxuICAgIGNvbnN0IGhlYWRlclRvSW1wb3J0S2V5TWFwID0gbmV3IE1hcDxzdHJpbmcsIGtleW9mIFQ+KCk7XG4gICAgY29uc3QgaGVhZGVyVG9JbXBvcnRCeU1hcCA9IG5ldyBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBrZXlvZiBUIHwgKChpbXBvcnRlZFJvdzogYW55KSA9PiBUW2tleW9mIFRdKVxuICAgID4oKTtcblxuICAgIC8vIEZpbHRlciBjb2x1bW4gZGVmaW5pdGlvbnMgdG8gb25seSB0aG9zZSB3aXRoIGltcG9ydEtleSBvciBpbXBvcnRCeSBhbmQgcG9wdWxhdGUgdGhlIG1hcHNcbiAgICBjb2x1bW5EZWZpbml0aW9uc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuaW1wb3J0S2V5IHx8IGNvbC5pbXBvcnRCeSlcbiAgICAgIC5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyID1cbiAgICAgICAgICB0eXBlb2YgY29sLmhlYWRlciA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gY29sLmhlYWRlclxuICAgICAgICAgICAgOiBjb2wuaGVhZGVyKHt9KS50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChjb2wuaW1wb3J0S2V5KSB7XG4gICAgICAgICAgaGVhZGVyVG9JbXBvcnRLZXlNYXAuc2V0KGhlYWRlciwgY29sLmltcG9ydEtleSBhcyBrZXlvZiBUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2wuaW1wb3J0QnkpIHtcbiAgICAgICAgICBoZWFkZXJUb0ltcG9ydEJ5TWFwLnNldChoZWFkZXIsIGNvbC5pbXBvcnRCeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIGVhY2ggcm93IGluIHRoZSBpbXBvcnRlZCBkYXRhLiBSb3dzIHRoZSBzaGVldCBzdGlsbCByZXBvcnRzIGJ1dFxuICAgIC8vIHRoYXQgaG9sZCBub3RoaW5nICh3aGl0ZXNwYWNlLCBsZWZ0b3ZlciBmb3JtYXR0aW5nKSBhcmUgZHJvcHBlZCB1cCBmcm9udCBzb1xuICAgIC8vIGltcG9ydEJ5IG5ldmVyIGZhYnJpY2F0ZXMgdmFsdWVzIG91dCBvZiB0aGVtLlxuICAgIHJldHVybiBpbXBvcnRlZERhdGFcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNCbGFua1Jvdyhyb3cpKVxuICAgICAgLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUm93OiBQYXJ0aWFsPFQ+ID0ge307XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGtleSBpbiB0aGUgcm93XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBpbXBvcnRCeSB0cmFuc2Zvcm1hdGlvbiBmaXJzdCAodGFrZXMgcHJpb3JpdHkpXG4gICAgICAgICAgY29uc3QgaW1wb3J0QnkgPSBoZWFkZXJUb0ltcG9ydEJ5TWFwLmdldChrZXkpO1xuXG4gICAgICAgICAgaWYgKGltcG9ydEJ5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydEJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIC8vIFVzZSB0aGUgaW1wb3J0QnkgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBlbnRpcmUgaW1wb3J0ZWQgcm93XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydEtleSA9IGhlYWRlclRvSW1wb3J0S2V5TWFwLmdldChrZXkpO1xuICAgICAgICAgICAgICBpZiAoaW1wb3J0S2V5KSB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSb3dbaW1wb3J0S2V5XSA9IGltcG9ydEJ5KHJvdyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGltcG9ydEJ5IGlzIGEgZGlyZWN0IGtleSByZWZlcmVuY2VcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRSb3dbaW1wb3J0QnldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBpbXBvcnRLZXkgaWYgbm8gaW1wb3J0QnkgaXMgZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgaW1wb3J0S2V5ID0gaGVhZGVyVG9JbXBvcnRLZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaW1wb3J0S2V5KSB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVkUm93W2ltcG9ydEtleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJvdztcbiAgICAgIH0pXG4gICAgICAvLyBBIHJvdyBjYW4gc3RpbGwgZW5kIHVwIGVtcHR5IGhlcmUgd2hlbiBub25lIG9mIGl0cyBwb3B1bGF0ZWQgY2VsbHMgbWFwIHRvXG4gICAgICAvLyBhbiBpbXBvcnRhYmxlIGNvbHVtbi5cbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNCbGFua1Jvdyhyb3cpKTtcbiAgfVxuXG4gIGhhbmRsZUltcG9ydChcbiAgICBmaWxlOiBGaWxlLFxuICAgIC8vIHByZXZpZXdlcj86IChkYXRhOiBhbnlbXSkgPT4gdm9pZCxcbiAgICBjb2x1bW5EZWZpbml0aW9uczogQ29sdW1uRGVmaW5pdGlvbjxUPltdLFxuICAgIHBhcnNlSW1wb3J0PzogKGRhdGE6IGFueSkgPT4gUGFydGlhbDxUPltdLFxuICApIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgLy8gY29uc3Qgd2IgPSByZWFkKGV2ZW50LnRhcmdldC5yZXN1bHQsIHtcbiAgICAgIC8vICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAvLyAgIHJhdzogdHJ1ZSxcbiAgICAgIC8vICAgY2VsbFRleHQ6IHRydWUsXG4gICAgICAvLyAgIGNlbGxGb3JtdWxhOiBmYWxzZSxcbiAgICAgIC8vICAgY2VsbE5GOiBmYWxzZSxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gY29uc29sZS50aW1lKCdCZWdpbicpO1xuICAgICAgbGV0IGltcG9ydGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3Qgd2IgPSByZWFkKGV2ZW50LnRhcmdldC5yZXN1bHQsIHsgY2VsbERhdGVzOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc2hlZXRzID0gd2IuU2hlZXROYW1lcztcbiAgICAgIGlmIChzaGVldHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB1dGlscy5zaGVldF90b19qc29uKHdiLlNoZWV0c1tzaGVldHNbMF1dLCB7XG4gICAgICAgICAgZGVmdmFsOiBudWxsLFxuICAgICAgICAgIGJsYW5rcm93czogZmFsc2UsXG4gICAgICAgIH0pIGFzIFJlY29yZDxzdHJpbmcsIGFueT5bXTtcblxuICAgICAgICBpbXBvcnRlZCA9IHRoaXMudHJhbnNmb3JtSW1wb3J0RGF0YShyb3dzLCBjb2x1bW5EZWZpbml0aW9ucykgYXMgVFtdO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnVFJBTlNGT1JNRUQnLCBpbXBvcnRlZCk7XG5cbiAgICAgICAgaWYgKHBhcnNlSW1wb3J0KSB7XG4gICAgICAgICAgaW1wb3J0ZWQgPSBwYXJzZUltcG9ydChpbXBvcnRlZCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBUlNFRCcsIGltcG9ydGVkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcmV2aWV3ZXIoaW1wb3J0ZWQpO1xuICAgICAgfVxuICAgICAgLy8gY29uc29sZS5sb2coJ0ltcG9ydGVkIGRhdGE6JywgSlNPTi5zdHJpbmdpZnkoaW1wb3J0ZWQsIG51bGwsIDIpKTtcbiAgICAgIC8vIGNvbnNvbGUudGltZSgnU3RhcnQgUHJvY2VzcycpO1xuICAgICAgdGhpcy5pbXBvcnRlZERhdGEuc2V0KGltcG9ydGVkKTtcbiAgICAgIC8vIGNvbnNvbGUudGltZUVuZCgnQmVnaW4nKTtcbiAgICAgIHJldHVybiBpbXBvcnRlZDtcbiAgICB9O1xuICAgIHJldHVybiByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gIH1cblxuICBoYW5kbGVUZW1wbGF0ZUV4cG9ydChmaWVsZHM6IHN0cmluZ1tdLCB0aXRsZTogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coZmllbGRzKTtcbiAgICBjb25zdCB3YiA9IHV0aWxzLmJvb2tfbmV3KCk7XG4gICAgY29uc3Qgd3M6IGFueSA9IHV0aWxzLmpzb25fdG9fc2hlZXQoW10pO1xuICAgIHV0aWxzLnNoZWV0X2FkZF9hb2Eod3MsIFtmaWVsZHNdKTtcbiAgICAvLyB1dGlscy5zaGVldF9hZGRfanNvbih3cywgdGhpcy5fZGF0YSwgeyBvcmlnaW46ICdBMicsIHNraXBIZWFkZXI6IHRydWUgfSk7XG4gICAgdXRpbHMuYm9va19hcHBlbmRfc2hlZXQod2IsIHdzLCB0aXRsZSk7XG4gICAgd3JpdGVGaWxlKHdiLCB0aXRsZSArICctdGVtcGxhdGUuJyArICd4bHN4Jyk7XG4gIH1cblxuICBhZGRSb3coZXZlbnQ6IHsgaW5kZXg6IG51bWJlcjsga2V5OiBzdHJpbmcgfCBudW1iZXI7IGRhdGE6IFBhcnRpYWw8VD4gfSkge1xuICAgIC8vIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgICB0aGlzLmltcG9ydGVkRGF0YS51cGRhdGUoKGRhdCkgPT4ge1xuICAgICAgLy8gZGF0W2V2ZW50LmluZGV4XSA9IHsgLi4uZGF0W2V2ZW50LmluZGV4XSwgLi4uZXZlbnQuZGF0YSB9O1xuICAgICAgcmV0dXJuIGRhdC5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgPT09IGV2ZW50LmluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZCwgLi4uZXZlbnQuZGF0YSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5pbXBvcnRlZERhdGEoKSk7XG4gIH1cblxuICBpc0R1cGxpY2F0ZShkYXR1bTogUGFydGlhbDxUPiwgYXJyYXk6IFBhcnRpYWw8VD5bXSwgaWRlbnRpZmllcnM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFycmF5LmZpbHRlcihcbiAgICAgICAgKGRhdCkgPT5cbiAgICAgICAgICBpZGVudGlmaWVycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgaWRlbnRpZmllcnMuZXZlcnkoXG4gICAgICAgICAgICAoaWRlbnRpZmllcikgPT5cbiAgICAgICAgICAgICAgZGF0dW1baWRlbnRpZmllciBhcyBrZXlvZiBUXSAmJlxuICAgICAgICAgICAgICBkYXR1bVtpZGVudGlmaWVyIGFzIGtleW9mIFRdID09PSBkYXRbaWRlbnRpZmllciBhcyBrZXlvZiBUXSxcbiAgICAgICAgICApLFxuICAgICAgKS5sZW5ndGggPiAxXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyRGF0YSgpIHtcbiAgICB0aGlzLmltcG9ydGVkRGF0YS5zZXQoW10pO1xuICB9XG59XG4iXX0=
@@ -59,7 +59,7 @@ class DataColumnsComponent {
59
59
  const temp = this.visibleColumns[fromIndex];
60
60
  this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];
61
61
  this.visibleColumns[toIndex] = temp;
62
- this.emitUpdatedColumns();
62
+ // Staged only — applied/emitted when the user clicks Save (see template).
63
63
  }
64
64
  // Column Selection functionality
65
65
  toggleSelectAll() {
@@ -68,13 +68,13 @@ class DataColumnsComponent {
68
68
  this.visibleColumns.forEach((column) => {
69
69
  this.columnVisibility.set(column.id, newValue);
70
70
  });
71
- this.emitUpdatedColumns();
71
+ // Staged only — applied/emitted when the user clicks Save (see template).
72
72
  }
73
73
  toggleColumnVisibility(columnId) {
74
74
  const currentValue = this.columnVisibility.get(columnId);
75
75
  this.columnVisibility.set(columnId, !currentValue);
76
76
  this.updateSelectAllStatus();
77
- this.emitUpdatedColumns();
77
+ // Staged only — applied/emitted when the user clicks Save (see template).
78
78
  }
79
79
  isColumnVisible(columnId) {
80
80
  return this.columnVisibility.get(columnId) ?? false;
@@ -1 +1 @@
1
- {"version":3,"file":"verben-ng-ui-src-lib-components-data-columns.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.component.html","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.service.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/verben-ng-ui-src-lib-components-data-columns.ts"],"sourcesContent":["import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { ColumnDefinition } from 'verben-ng-ui/src/lib/components/data-table';\n\n@Component({\n selector: 'lib-data-columns',\n templateUrl: './data-columns.component.html',\n styleUrl: './data-columns.component.css',\n})\nexport class DataColumnsComponent<T> implements OnInit {\n @Input() columns!: ColumnDefinition<T>[];\n @Input() enableDragAndDrop: boolean = true;\n @Input() maxVisibleItems: number = 5;\n @Output() columnsUpdated = new EventEmitter<ColumnDefinition<T>[]>();\n\n visibleColumns: ColumnDefinition<T>[] = [];\n showAllColumns = false;\n draggedIndex: number | null = null;\n selectAll: boolean = false;\n columnVisibility: Map<string, boolean> = new Map();\n\n ngOnInit() {\n this.initializeColumns();\n }\n\n private initializeColumns() {\n this.visibleColumns = [...this.columns];\n // Initialize visibility map with current column states\n this.visibleColumns.forEach((column) => {\n this.columnVisibility.set(column.id, true);\n });\n this.updateSelectAllStatus();\n }\n\n get columnsToShow() {\n return this.showAllColumns\n ? this.visibleColumns\n : this.visibleColumns.slice(0, this.maxVisibleItems);\n }\n\n // Drag and Drop functionality\n onDragStart(index: number, event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n this.draggedIndex = index;\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n onDragOver(event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n event.preventDefault();\n }\n\n onDrop(index: number, event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n event.preventDefault();\n if (this.draggedIndex !== null && this.draggedIndex !== index) {\n this.swapColumns(this.draggedIndex, index);\n }\n this.draggedIndex = null;\n }\n\n private swapColumns(fromIndex: number, toIndex: number) {\n const temp = this.visibleColumns[fromIndex];\n this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];\n this.visibleColumns[toIndex] = temp;\n this.emitUpdatedColumns();\n }\n\n // Column Selection functionality\n toggleSelectAll() {\n this.selectAll = !this.selectAll;\n const newValue = this.selectAll;\n this.visibleColumns.forEach((column) => {\n this.columnVisibility.set(column.id, newValue);\n });\n this.emitUpdatedColumns();\n }\n\n toggleColumnVisibility(columnId: string) {\n const currentValue = this.columnVisibility.get(columnId);\n this.columnVisibility.set(columnId, !currentValue);\n this.updateSelectAllStatus();\n this.emitUpdatedColumns();\n }\n\n isColumnVisible(columnId: string): boolean {\n return this.columnVisibility.get(columnId) ?? false;\n }\n\n private updateSelectAllStatus() {\n this.selectAll = Array.from(this.columnVisibility.values()).every(\n (value) => value\n );\n }\n\n getColumnHeader(column: ColumnDefinition<T>): string {\n return typeof column.header === 'function'\n ? column.header({})\n : column.header;\n }\n\n resetColumns() {\n this.initializeColumns();\n this.emitUpdatedColumns();\n }\n\n emitUpdatedColumns() {\n const updatedColumns = this.visibleColumns.filter((column) =>\n this.columnVisibility.get(column.id)\n );\n this.columnsUpdated.emit(updatedColumns);\n }\n\n get activeColumnCount(): number {\n return Array.from(this.columnVisibility.values()).filter((value) => value)\n .length;\n }\n}\n","<verben-card width=\"24rem\" borderRadius=\"1rem\" [border]=\"'1px solid var(--vbn-color-primary)'\" bgColor=\"var(--vbn-color-surface)\">\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Column <sup>({{ activeColumnCount }})</sup></h4>\n <button class=\"reset-button\" (click)=\"resetColumns()\">Reset</button>\n </div>\n \n <div card-body class=\"card-body\">\n <!-- Column Options -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg icon=\"info\" [width]=\"15\" [height]=\"15\" fill=\"var(--vbn-color-text-muted)\"></verben-svg>\n </div>\n \n <!-- Select All -->\n <div class=\"select-all-wrapper\">\n <label class=\"select-all\">\n <input \n type=\"checkbox\" \n [checked]=\"selectAll\"\n (change)=\"toggleSelectAll()\"\n />\n <span>Select All</span>\n </label>\n </div>\n \n @for (column of columnsToShow; track column.id) {\n <div \n class=\"column-option\"\n [attr.draggable]=\"enableDragAndDrop\"\n (dragstart)=\"onDragStart($index, $event)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($index, $event)\"\n >\n <div class=\"column-option-content\">\n @if (enableDragAndDrop) {\n <verben-svg\n icon=\"square-dot\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text)\"\n class=\"drag-handle\"\n ></verben-svg>\n }\n <input \n type=\"checkbox\" \n [checked]=\"isColumnVisible(column.id)\"\n (change)=\"toggleColumnVisibility(column.id)\"\n />\n <span>{{ getColumnHeader(column) }}</span>\n </div>\n </div>\n }\n \n @if (visibleColumns.length > maxVisibleItems) {\n <button\n (click)=\"showAllColumns = !showAllColumns\"\n class=\"show-more\"\n >\n <span>{{ showAllColumns ? \"Show Less\" : \"Show More\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n }\n </section>\n </div>\n \n <div card-footer class=\"card-footer\">\n <button class=\"save-button\" (click)=\"emitUpdatedColumns()\">Save</button>\n </div>\n </verben-card>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DataColumnsComponent } from './data-columns.component';\nimport { SvgModule } from 'verben-ng-ui/src/lib/components/svg';\nimport { CardModule } from 'verben-ng-ui/src/lib/components/card';\nimport { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';\nimport { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';\n\n@NgModule({\n declarations: [DataColumnsComponent],\n imports: [CommonModule, SvgModule, CardModule, DropDownModule, TooltipModule],\n exports: [DataColumnsComponent],\n})\nexport class DataColumnsModule {}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataColumnsService {\n\n constructor() { }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verben-ng-ui-src-lib-components-data-columns.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.component.html","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/data-columns.service.ts","../../../projects/verben-ng-ui/src/lib/components/data-columns/verben-ng-ui-src-lib-components-data-columns.ts"],"sourcesContent":["import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { ColumnDefinition } from 'verben-ng-ui/src/lib/components/data-table';\n\n@Component({\n selector: 'lib-data-columns',\n templateUrl: './data-columns.component.html',\n styleUrl: './data-columns.component.css',\n})\nexport class DataColumnsComponent<T> implements OnInit {\n @Input() columns!: ColumnDefinition<T>[];\n @Input() enableDragAndDrop: boolean = true;\n @Input() maxVisibleItems: number = 5;\n @Output() columnsUpdated = new EventEmitter<ColumnDefinition<T>[]>();\n\n visibleColumns: ColumnDefinition<T>[] = [];\n showAllColumns = false;\n draggedIndex: number | null = null;\n selectAll: boolean = false;\n columnVisibility: Map<string, boolean> = new Map();\n\n ngOnInit() {\n this.initializeColumns();\n }\n\n private initializeColumns() {\n this.visibleColumns = [...this.columns];\n // Initialize visibility map with current column states\n this.visibleColumns.forEach((column) => {\n this.columnVisibility.set(column.id, true);\n });\n this.updateSelectAllStatus();\n }\n\n get columnsToShow() {\n return this.showAllColumns\n ? this.visibleColumns\n : this.visibleColumns.slice(0, this.maxVisibleItems);\n }\n\n // Drag and Drop functionality\n onDragStart(index: number, event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n this.draggedIndex = index;\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n onDragOver(event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n event.preventDefault();\n }\n\n onDrop(index: number, event: DragEvent) {\n if (!this.enableDragAndDrop) return;\n event.preventDefault();\n if (this.draggedIndex !== null && this.draggedIndex !== index) {\n this.swapColumns(this.draggedIndex, index);\n }\n this.draggedIndex = null;\n }\n\n private swapColumns(fromIndex: number, toIndex: number) {\n const temp = this.visibleColumns[fromIndex];\n this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];\n this.visibleColumns[toIndex] = temp;\n // Staged only — applied/emitted when the user clicks Save (see template).\n }\n\n // Column Selection functionality\n toggleSelectAll() {\n this.selectAll = !this.selectAll;\n const newValue = this.selectAll;\n this.visibleColumns.forEach((column) => {\n this.columnVisibility.set(column.id, newValue);\n });\n // Staged only — applied/emitted when the user clicks Save (see template).\n }\n\n toggleColumnVisibility(columnId: string) {\n const currentValue = this.columnVisibility.get(columnId);\n this.columnVisibility.set(columnId, !currentValue);\n this.updateSelectAllStatus();\n // Staged only — applied/emitted when the user clicks Save (see template).\n }\n\n isColumnVisible(columnId: string): boolean {\n return this.columnVisibility.get(columnId) ?? false;\n }\n\n private updateSelectAllStatus() {\n this.selectAll = Array.from(this.columnVisibility.values()).every(\n (value) => value\n );\n }\n\n getColumnHeader(column: ColumnDefinition<T>): string {\n return typeof column.header === 'function'\n ? column.header({})\n : column.header;\n }\n\n resetColumns() {\n this.initializeColumns();\n this.emitUpdatedColumns();\n }\n\n emitUpdatedColumns() {\n const updatedColumns = this.visibleColumns.filter((column) =>\n this.columnVisibility.get(column.id)\n );\n this.columnsUpdated.emit(updatedColumns);\n }\n\n get activeColumnCount(): number {\n return Array.from(this.columnVisibility.values()).filter((value) => value)\n .length;\n }\n}\n","<verben-card width=\"24rem\" borderRadius=\"1rem\" [border]=\"'1px solid var(--vbn-color-primary)'\" bgColor=\"var(--vbn-color-surface)\">\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Column <sup>({{ activeColumnCount }})</sup></h4>\n <button class=\"reset-button\" (click)=\"resetColumns()\">Reset</button>\n </div>\n \n <div card-body class=\"card-body\">\n <!-- Column Options -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg icon=\"info\" [width]=\"15\" [height]=\"15\" fill=\"var(--vbn-color-text-muted)\"></verben-svg>\n </div>\n \n <!-- Select All -->\n <div class=\"select-all-wrapper\">\n <label class=\"select-all\">\n <input \n type=\"checkbox\" \n [checked]=\"selectAll\"\n (change)=\"toggleSelectAll()\"\n />\n <span>Select All</span>\n </label>\n </div>\n \n @for (column of columnsToShow; track column.id) {\n <div \n class=\"column-option\"\n [attr.draggable]=\"enableDragAndDrop\"\n (dragstart)=\"onDragStart($index, $event)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($index, $event)\"\n >\n <div class=\"column-option-content\">\n @if (enableDragAndDrop) {\n <verben-svg\n icon=\"square-dot\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text)\"\n class=\"drag-handle\"\n ></verben-svg>\n }\n <input \n type=\"checkbox\" \n [checked]=\"isColumnVisible(column.id)\"\n (change)=\"toggleColumnVisibility(column.id)\"\n />\n <span>{{ getColumnHeader(column) }}</span>\n </div>\n </div>\n }\n \n @if (visibleColumns.length > maxVisibleItems) {\n <button\n (click)=\"showAllColumns = !showAllColumns\"\n class=\"show-more\"\n >\n <span>{{ showAllColumns ? \"Show Less\" : \"Show More\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n }\n </section>\n </div>\n \n <div card-footer class=\"card-footer\">\n <button class=\"save-button\" (click)=\"emitUpdatedColumns()\">Save</button>\n </div>\n </verben-card>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DataColumnsComponent } from './data-columns.component';\nimport { SvgModule } from 'verben-ng-ui/src/lib/components/svg';\nimport { CardModule } from 'verben-ng-ui/src/lib/components/card';\nimport { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';\nimport { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';\n\n@NgModule({\n declarations: [DataColumnsComponent],\n imports: [CommonModule, SvgModule, CardModule, DropDownModule, TooltipModule],\n exports: [DataColumnsComponent],\n})\nexport class DataColumnsModule {}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DataColumnsService {\n\n constructor() { }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}