@coreui/angular-pro 5.0.0-alpha.13 → 5.0.0-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/esm2022/lib/accordion/accordion/accordion.component.mjs +22 -16
  2. package/esm2022/lib/alert/alert.component.mjs +30 -38
  3. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +7 -6
  4. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +4 -4
  5. package/esm2022/lib/calendar/calendar/calendar.component.mjs +4 -4
  6. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +1 -1
  7. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +4 -9
  8. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +4 -4
  9. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +3 -4
  10. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +3 -4
  11. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +7 -8
  12. package/esm2022/lib/collapse/collapse.directive.mjs +30 -40
  13. package/esm2022/lib/date-picker/date-picker.component.mjs +5 -7
  14. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +5 -7
  15. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +26 -34
  16. package/esm2022/lib/element-cover/element-cover.component.mjs +4 -4
  17. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +10 -8
  18. package/esm2022/lib/loading-button/loading-button.component.mjs +15 -21
  19. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +2 -2
  20. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +8 -7
  21. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +6 -12
  22. package/esm2022/lib/placeholder/placeholder.directive.mjs +11 -18
  23. package/esm2022/lib/shared/theme.directive.mjs +3 -2
  24. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +34 -46
  25. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +4 -4
  26. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +4 -4
  27. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +17 -18
  28. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +6 -11
  29. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +20 -24
  30. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +4 -6
  31. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +4 -4
  32. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +7 -12
  33. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +3 -5
  34. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +7 -7
  35. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +12 -9
  36. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +5 -6
  37. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +9 -8
  38. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +9 -8
  39. package/esm2022/lib/time-picker/time-picker.component.mjs +5 -7
  40. package/esm2022/lib/time-picker/time-picker.module.mjs +2 -4
  41. package/esm2022/lib/toast/toast/toast.component.mjs +11 -9
  42. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +3 -4
  43. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +4 -4
  44. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +4 -4
  45. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +5 -5
  46. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +4 -4
  47. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +4 -4
  48. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +4 -4
  49. package/fesm2022/coreui-angular-pro.mjs +313 -363
  50. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  51. package/lib/accordion/accordion/accordion.component.d.ts +4 -6
  52. package/lib/alert/alert.component.d.ts +8 -12
  53. package/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.d.ts +1 -0
  54. package/lib/carousel/carousel-item/carousel-item.component.d.ts +1 -2
  55. package/lib/collapse/collapse.directive.d.ts +13 -13
  56. package/lib/dropdown/dropdown/dropdown.component.d.ts +8 -12
  57. package/lib/form/form-check/form-check-input.directive.d.ts +4 -3
  58. package/lib/loading-button/loading-button.component.d.ts +4 -5
  59. package/lib/multi-select/multi-select-native-select/multi-select-native-select.component.d.ts +3 -1
  60. package/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.d.ts +2 -5
  61. package/lib/placeholder/placeholder.directive.d.ts +3 -7
  62. package/lib/sidebar/sidebar/sidebar.component.d.ts +13 -11
  63. package/lib/smart-pagination/smart-pagination.component.d.ts +4 -8
  64. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +1 -0
  65. package/lib/tabs/tab-content/tab-content.component.d.ts +1 -0
  66. package/lib/tabs/tab-content-ref.directive.d.ts +4 -2
  67. package/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.d.ts +2 -0
  68. package/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.d.ts +2 -0
  69. package/lib/toast/toast/toast.component.d.ts +3 -2
  70. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { booleanAttribute, Component, computed, ContentChildren, EventEmitter, Input, numberAttribute, Output, signal } from '@angular/core';
2
- import { AsyncPipe, JsonPipe, NgClass, NgForOf, NgIf, NgStyle, NgTemplateOutlet } from '@angular/common';
2
+ import { AsyncPipe, JsonPipe, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  import { getClickedColumnName, getColumnGroups, getColumnKey, getColumnNames, getColumnNamesFromItems, getColumns, getTableDataCellClass, getTableDataCellProps, getTableDataCellStyles } from '../smart-table.utils';
5
5
  import { ButtonDirective } from '../../button';
@@ -416,16 +416,14 @@ export class SmartTableComponent {
416
416
  }
417
417
  }
418
418
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SmartTableComponent, deps: [{ token: i0.IterableDiffers }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
419
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.1.0", type: SmartTableComponent, isStandalone: true, selector: "c-smart-table", inputs: { activePage: ["activePage", "activePage", numberAttribute], cleaner: ["cleaner", "cleaner", booleanAttribute], clickableRows: ["clickableRows", "clickableRows", booleanAttribute], columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: ["footer", "footer", booleanAttribute], header: ["header", "header", booleanAttribute], items: "items", itemsPerPage: ["itemsPerPage", "itemsPerPage", numberAttribute], itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: ["pagination", "pagination", booleanAttribute], selectable: ["selectable", "selectable", booleanAttribute], selectAll: ["selectAll", "selectAll", booleanAttribute], sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [columnGroups]=\"columnGroups$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-column [ngForOf]=\"columns$()\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\" />\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n <td\n *ngIf=\"tdContent !== undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [cAlign]=\"cellProps?.align\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { kind: "directive", type: ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: FilterInputDirective, selector: "[cFilterInput]", inputs: ["delay", "onEvent", "value"], outputs: ["valueChange"], exportAs: ["cFilterInput"] }, { kind: "directive", type: FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid", "checked"] }, { kind: "directive", type: HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "component", type: SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { kind: "component", type: SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "sizing"] }, { kind: "component", type: SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "columnGroups", "selectable", "selectAll", "selectedAll", "showGroups", "sorterValue", "columnFilterTemplates", "columnLabelTemplates", "summaryRowTemplate"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { kind: "component", type: SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }, { kind: "directive", type: TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { kind: "directive", type: TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { kind: "directive", type: TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped", "stripedColumns"] }] }); }
419
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.0", type: SmartTableComponent, isStandalone: true, selector: "c-smart-table", inputs: { activePage: ["activePage", "activePage", numberAttribute], cleaner: ["cleaner", "cleaner", booleanAttribute], clickableRows: ["clickableRows", "clickableRows", booleanAttribute], columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: ["footer", "footer", booleanAttribute], header: ["header", "header", booleanAttribute], items: "items", itemsPerPage: ["itemsPerPage", "itemsPerPage", numberAttribute], itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: ["pagination", "pagination", booleanAttribute], selectable: ["selectable", "selectable", booleanAttribute], selectAll: ["selectAll", "selectAll", booleanAttribute], sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], usesOnChanges: true, ngImport: i0, template: "@if (itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']) {\n <div class=\"row my-2 mx-0\">\n @if (tableFilter) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n }\n @if (cleaner) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n }\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n @if (tableFilter) {\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n />\n }\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n @if (cleaner) {\n <button\n (click)=\"clean($event)\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n }\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n </div>\n}\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n cTable\n >\n @if (header) {\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnGroups]=\"columnGroups$()\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n }\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n @if (summaryRowTemplate && !footer) {\n <tfoot>\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n }\n @if (footer) {\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n }\n\n </table>\n @if (loading) {\n <c-element-cover\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n }\n</div>\n@if (pagination || itemsPerPageSelect) {\n <div class=\"row\">\n <div class=\"col\">\n @if (pagination && numberOfPages > 1) {\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n }\n </div>\n <div class=\"col-auto ms-auto\">\n @if (itemsPerPageSelect) {\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n }\n </div>\n </div>\n}\n<ng-template #tbodyDefaultTemplate>\n <tbody [cAlign]=\"tableBodyProps?.align\"\n [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n >\n @for (item of currentItems; track item; let i = $index, cnt = $count, isEven = $even, isOdd = $odd) {\n <tr (click)=\"handleRowClick({$event, item, i})\"\n [cAlign]=\"item._props?.align\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n [tabindex]=\"clickableRows ? 0 : -1\"\n >\n @if (selectable) {\n <td [cAlign]=\"item?.['_cellProps']?._all?.align\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n cFormCheckInput\n >\n </td>\n }\n @for (column of columns$(); track column; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\"\n />\n }\n </tr>\n @if (templates['tableDetails']) {\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" [ngStyle]=\"{borderBottomWidth: 0}\" class=\"p-0\" tabindex=\"-1\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" [ngStyle]=\"{border: 0}\" class=\"p-0\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n }\n }\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n @if (tdContent !== undefined) {\n <td [cAlign]=\"cellProps?.align\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{ tdContent }}\n </td>\n }\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n @if (!currentItems.length) {\n <tr>\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{ noItemsLabel }}</td>\n </tr>\n }\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg class=\"icon icon-custom-size\" pointer-events=\"none\" role=\"img\" viewBox=\"0 0 512 512\"\n width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\">\n </polygon>\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { kind: "directive", type: ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: FilterInputDirective, selector: "[cFilterInput]", inputs: ["delay", "onEvent", "value"], outputs: ["valueChange"], exportAs: ["cFilterInput"] }, { kind: "directive", type: FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid", "checked"] }, { kind: "directive", type: HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "component", type: SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { kind: "component", type: SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "sizing"] }, { kind: "component", type: SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "columnGroups", "selectable", "selectAll", "selectedAll", "showGroups", "sorterValue", "columnFilterTemplates", "columnLabelTemplates", "summaryRowTemplate"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { kind: "component", type: SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }, { kind: "directive", type: TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { kind: "directive", type: TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { kind: "directive", type: TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped", "stripedColumns"] }] }); }
420
420
  }
421
421
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SmartTableComponent, decorators: [{
422
422
  type: Component,
423
423
  args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', standalone: true, imports: [
424
424
  AsyncPipe,
425
- NgIf,
426
425
  NgTemplateOutlet,
427
426
  NgClass,
428
- NgForOf,
429
427
  NgStyle,
430
428
  AlignDirective,
431
429
  ButtonDirective,
@@ -441,7 +439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImpor
441
439
  TableColorDirective,
442
440
  TableDirective,
443
441
  JsonPipe
444
- ], template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [columnGroups]=\"columnGroups$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-column [ngForOf]=\"columns$()\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\" />\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n <td\n *ngIf=\"tdContent !== undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [cAlign]=\"cellProps?.align\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
442
+ ], template: "@if (itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']) {\n <div class=\"row my-2 mx-0\">\n @if (tableFilter) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\" />\n </div>\n }\n @if (cleaner) {\n <div class=\"col-auto p-0\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\" />\n </div>\n }\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\" />\n\n <ng-template #tableFilterTemplate>\n @if (tableFilter) {\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n />\n }\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n @if (cleaner) {\n <button\n (click)=\"clean($event)\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n cButton\n color=\"transparent\"\n tabindex=\"0\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\" />\n </button>\n }\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\" />\n </div>\n </ng-template>\n </div>\n}\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n cTable\n >\n @if (header) {\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableHeadProps?.align\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnFilter]=\"columnFilter\"\n [columnGroups]=\"columnGroups$()\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [showGroups]=\"showGroups$()\"\n [sorterValue]=\"sorterValue\"\n />\n }\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\" />\n\n @if (summaryRowTemplate && !footer) {\n <tfoot>\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\" />\n </tfoot>\n }\n @if (footer) {\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n [cAlign]=\"tableFootProps?.align\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [columnSorter]=\"columnSorter\"\n [columns]=\"columns$()\"\n [selectAll]=\"selectAll\"\n [selectable]=\"selectable\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [sorterValue]=\"sorterValue\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n component=\"tfoot\"\n />\n }\n\n </table>\n @if (loading) {\n <c-element-cover\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n />\n }\n</div>\n@if (pagination || itemsPerPageSelect) {\n <div class=\"row\">\n <div class=\"col\">\n @if (pagination && numberOfPages > 1) {\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\"\n />\n }\n </div>\n <div class=\"col-auto ms-auto\">\n @if (itemsPerPageSelect) {\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n />\n }\n </div>\n </div>\n}\n<ng-template #tbodyDefaultTemplate>\n <tbody [cAlign]=\"tableBodyProps?.align\"\n [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n >\n @for (item of currentItems; track item; let i = $index, cnt = $count, isEven = $even, isOdd = $odd) {\n <tr (click)=\"handleRowClick({$event, item, i})\"\n [cAlign]=\"item._props?.align\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n [tabindex]=\"clickableRows ? 0 : -1\"\n >\n @if (selectable) {\n <td [cAlign]=\"item?.['_cellProps']?._all?.align\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n cFormCheckInput\n >\n </td>\n }\n @for (column of columns$(); track column; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {column, item, columnName: getColumnKey(column), tdContent: item[column.key], cellProps: getTableDataCellProps(column, item) }\"\n />\n }\n </tr>\n @if (templates['tableDetails']) {\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" [ngStyle]=\"{borderBottomWidth: 0}\" class=\"p-0\" tabindex=\"-1\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" [ngStyle]=\"{border: 0}\" class=\"p-0\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\" />\n </td>\n </tr>\n }\n }\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\" />\n </tbody>\n</ng-template>\n\n<ng-template\n #columnDefaultTemplate\n let-cellProps=\"cellProps\"\n let-column=\"column\"\n let-columnName=\"columnName\"\n let-item=\"item\"\n let-tdContent=\"tdContent\"\n>\n @if (tdContent !== undefined) {\n <td [cAlign]=\"cellProps?.align\"\n [cHtmlAttr]=\"cellProps?.['_attributes'] ?? undefined\"\n [cTableActive]=\"cellProps?.['active']\"\n [cTableColor]=\"cellProps?.color ?? column[columnName]?._colProps?.color ?? undefined\"\n [ngClass]=\"getTableDataCellClass(column, item)\"\n [ngStyle]=\"getTableDataCellStyles(column, item)\"\n >\n {{ tdContent }}\n </td>\n }\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n @if (!currentItems.length) {\n <tr>\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{ noItemsLabel }}</td>\n </tr>\n }\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg class=\"icon icon-custom-size\" pointer-events=\"none\" role=\"img\" viewBox=\"0 0 512 512\"\n width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\">\n </polygon>\n <polygon\n class=\"ci-primary\"\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
445
443
  }], ctorParameters: () => [{ type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }], propDecorators: { activePage: [{
446
444
  type: Input,
447
445
  args: [{ transform: numberAttribute }]
@@ -527,4 +525,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImpor
527
525
  type: ContentChildren,
528
526
  args: [TemplateIdDirective]
529
527
  }] } });
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFLTCxlQUFlLEVBRWYsTUFBTSxFQUVOLE1BQU0sRUFLUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBbUJ2QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixZQUFZLEVBQ1osY0FBYyxFQUNkLHVCQUF1QixFQUN2QixVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUUs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c0JBQXBELGVBQWU7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcixcbiAgSXRlcmFibGVEaWZmZXJzLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFdyaXRhYmxlU2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBKc29uUGlwZSwgTmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSVRhYmxlIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUudHlwZSc7XG5pbXBvcnQge1xuICBJQ29sdW1uLFxuICBJQ29sdW1uRmlsdGVyLFxuICBJQ29sdW1uRmlsdGVyVmFsdWUsXG4gIElHcm91cCxcbiAgSUl0ZW0sXG4gIElJdGVtSW50ZXJuYWwsXG4gIElTbWFydFRhYmxlLFxuICBJU29ydGVyLFxuICBJU29ydGVyVmFsdWUsXG4gIElUYWJsZUZpbHRlcixcbiAgSVRhYmxlU2VjdGlvblByb3BzLFxuICBJdGVtc1BlclBhZ2VTZWxlY3QsXG4gIFNvcnRPcmRlclxufSBmcm9tICcuLi9zbWFydC10YWJsZS50eXBlJztcblxuaW1wb3J0IHtcbiAgZ2V0Q2xpY2tlZENvbHVtbk5hbWUsXG4gIGdldENvbHVtbkdyb3VwcyxcbiAgZ2V0Q29sdW1uS2V5LFxuICBnZXRDb2x1bW5OYW1lcyxcbiAgZ2V0Q29sdW1uTmFtZXNGcm9tSXRlbXMsXG4gIGdldENvbHVtbnMsXG4gIGdldFRhYmxlRGF0YUNlbGxDbGFzcyxcbiAgZ2V0VGFibGVEYXRhQ2VsbFByb3BzLFxuICBnZXRUYWJsZURhdGFDZWxsU3R5bGVzXG59IGZyb20gJy4uL3NtYXJ0LXRhYmxlLnV0aWxzJztcblxuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vYnV0dG9uJztcbmltcG9ydCB7IEZvcm1DaGVja0lucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZm9ybSc7XG5pbXBvcnQgeyBFbGVtZW50Q292ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbGVtZW50LWNvdmVyJztcbmltcG9ydCB7IEh0bWxBdHRyaWJ1dGVzRGlyZWN0aXZlLCBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IFNtYXJ0UGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NtYXJ0LXBhZ2luYXRpb24nO1xuaW1wb3J0IHsgVGFibGVBY3RpdmVEaXJlY3RpdmUsIFRhYmxlQ29sb3JEaXJlY3RpdmUsIFRhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vdGFibGUnO1xuaW1wb3J0IHsgQWxpZ25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgU21hcnRUYWJsZUZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL3NtYXJ0LXRhYmxlLWZpbHRlci9zbWFydC10YWJsZS1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbHRlcklucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vc21hcnQtdGFibGUtZmlsdGVyL2ZpbHRlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU21hcnRUYWJsZUhlYWRDb21wb25lbnQgfSBmcm9tICcuLi9zbWFydC10YWJsZS1oZWFkL3NtYXJ0LXRhYmxlLWhlYWQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFNtYXJ0VGFibGVJdGVtc1BlclBhZ2VTZWxlY3RvckNvbXBvbmVudFxufSBmcm9tICcuLi9zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3Rvci9zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3Rvci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLXNtYXJ0LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjU21hcnRUYWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdJZixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ2xhc3MsXG4gICAgTmdGb3JPZixcbiAgICBOZ1N0eWxlLFxuICAgIEFsaWduRGlyZWN0aXZlLFxuICAgIEJ1dHRvbkRpcmVjdGl2ZSxcbiAgICBFbGVtZW50Q292ZXJDb21wb25lbnQsXG4gICAgRmlsdGVySW5wdXREaXJlY3RpdmUsXG4gICAgRm9ybUNoZWNrSW5wdXREaXJlY3RpdmUsXG4gICAgSHRtbEF0dHJpYnV0ZXNEaXJlY3RpdmUsXG4gICAgU21hcnRQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIFNtYXJ0VGFibGVGaWx0ZXJDb21wb25lbnQsXG4gICAgU21hcnRUYWJsZUhlYWRDb21wb25lbnQsXG4gICAgU21hcnRUYWJsZUl0ZW1zUGVyUGFnZVNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFRhYmxlQWN0aXZlRGlyZWN0aXZlLFxuICAgIFRhYmxlQ29sb3JEaXJlY3RpdmUsXG4gICAgVGFibGVEaXJlY3RpdmUsXG4gICAgSnNvblBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgSVNtYXJ0VGFibGUsIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICBwcml2YXRlIGtleVZhbHVlRGlmZmVyczogS2V5VmFsdWVEaWZmZXJzXG4gICkge1xuICAgIHRoaXMuaXRlbXNEaWZmZXIgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuaXRlbXMpLmNyZWF0ZSgpO1xuICAgIHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5fY29sdW1uRmlsdGVyZWQpLmNyZWF0ZSgpO1xuICAgIHRoaXMuY29sdW1GaWx0ZXJWYWx1ZURpZmZlciA9IHRoaXMua2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSkuY3JlYXRlKCk7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZURpZmZlciA9IHRoaXMua2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5zb3J0ZXJWYWx1ZSkuY3JlYXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEFsbCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWFkb25seSBnZXRDb2x1bW5LZXkgPSBnZXRDb2x1bW5LZXk7XG4gIHJlYWRvbmx5IGdldFRhYmxlRGF0YUNlbGxDbGFzcyA9IGdldFRhYmxlRGF0YUNlbGxDbGFzcztcbiAgcmVhZG9ubHkgZ2V0VGFibGVEYXRhQ2VsbFByb3BzID0gZ2V0VGFibGVEYXRhQ2VsbFByb3BzO1xuICByZWFkb25seSBnZXRUYWJsZURhdGFDZWxsU3R5bGVzID0gZ2V0VGFibGVEYXRhQ2VsbFN0eWxlcztcblxuICByZWFkb25seSBzZWxlY3RlZEFsbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtc0ZpbHRlcmVkRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bUZpbHRlclZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxhbnksIGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNvcnRlclZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxhbnksIGFueT4gfCBudWxsO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHNldCBhY3RpdmVQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY3RpdmVQYWdlID0gdmFsdWUgfHwgMTtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVQYWdlID0gMTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYW5lciA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGlja2FibGVSb3dzID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbHVtbnModmFsdWU6IChzdHJpbmcgfCBJQ29sdW1uIHwgSUdyb3VwKVtdKSB7XG4gICAgY29uc3QgY29sT2JqZWN0cyA9IHZhbHVlLm1hcChjb2x1bW4gPT4gdHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycgPyB7IGtleTogY29sdW1uIH0gOiB7IC4uLmNvbHVtbiB9KTtcbiAgICBjb25zdCBjb2x1bW5zOiBJQ29sdW1uW10gPSBnZXRDb2x1bW5zKGNvbE9iamVjdHMpO1xuICAgIHRoaXMuY29sdW1ucyQuc2V0KGNvbHVtbnMpO1xuXG4gICAgLy8gdG9kbzogSW5wdXQgY29sdW1uR3JvdXBzIC0gc2VwYXJhdGlvbj9cbiAgICAvLyBjb25zb2xlLmxvZyhjb2x1bW5zKTtcbiAgICBjb25zb2xlLmxvZyhnZXRDb2x1bW5Hcm91cHMoY29sT2JqZWN0cyA/PyBbXSkpO1xuICAgIGNvbnN0IGdyb3VwcyA9IGdldENvbHVtbkdyb3Vwcyh2YWx1ZSA/PyBbXSk7XG4gICAgdGhpcy5jb2x1bW5Hcm91cHMkLnNldChncm91cHMpO1xuICB9XG5cbiAgZ2V0IGNvbHVtbnMoKTogSUNvbHVtbltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zJCgpO1xuICB9XG5cbiAgY29sdW1ucyQ6IFdyaXRhYmxlU2lnbmFsPElDb2x1bW5bXT4gPSBzaWduYWwoW10pO1xuICBjb2x1bW5Hcm91cHMkOiBXcml0YWJsZVNpZ25hbDxJR3JvdXBbXVtdPiA9IHNpZ25hbChbXSk7XG4gIHNob3dHcm91cHMkID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLmNvbHVtbkdyb3VwcyQoKS5sZW5ndGgpO1xuXG4gIEBJbnB1dCgpIGNvbHVtbkZpbHRlcj86IGJvb2xlYW4gfCBJQ29sdW1uRmlsdGVyO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5GaWx0ZXJWYWx1ZSh2YWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY29sdW1GaWx0ZXJWYWx1ZURpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuY29sdW1GaWx0ZXJWYWx1ZURpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkZpbHRlclZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgICAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmVtaXQoeyAuLi50aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSB9KTtcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcmVkOyAvLyBlbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBjb2x1bW5GaWx0ZXJWYWx1ZSgpOiBJQ29sdW1uRmlsdGVyVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbHVtbkZpbHRlclZhbHVlOiBJQ29sdW1uRmlsdGVyVmFsdWUgPSB7fTtcblxuICBASW5wdXQoKSBjb2x1bW5Tb3J0ZXI/OiBib29sZWFuIHwgSVNvcnRlcjtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZm9vdGVyID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhlYWRlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpdGVtcyh2YWx1ZTogSUl0ZW1bXSkge1xuICAgIGlmICh0aGlzLml0ZW1zRGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtc0RpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5zZXRJdGVtcyh2YWx1ZSkgYXMgQXJyYXk8VHlwZTxJSXRlbUludGVybmFsPj47XG4gICAgICAgIHRoaXMuaXRlbXMkLnNldCh0aGlzLl9pdGVtcyk7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGdldENvbHVtbk5hbWVzRnJvbUl0ZW1zKHRoaXMuaXRlbXMkKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIGl0ZW1zJCA9IHNpZ25hbChbXSBhcyBBcnJheTxJSXRlbUludGVybmFsPik7XG4gIHByaXZhdGUgX2l0ZW1zOiBJSXRlbUludGVybmFsW10gPSBbXSBhcyBBcnJheTxUeXBlPElJdGVtSW50ZXJuYWw+PjtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBzZXQgaXRlbXNQZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBpdGVtc1BlclBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcblxuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VMYWJlbDogc3RyaW5nID0gJ0l0ZW1zIHBlciBwYWdlOic7XG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyMCwgNTBdO1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VTZWxlY3Q/OiBib29sZWFuIHwgSXRlbXNQZXJQYWdlU2VsZWN0O1xuICBASW5wdXQoKSBsb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgbm9JdGVtc0xhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJ05vIGl0ZW1zIGZvdW5kJztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcGFnaW5hdGlvbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdGFibGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzZWxlY3RBbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzb3J0ZXJWYWx1ZSh2YWx1ZTogSVNvcnRlclZhbHVlKSB7XG4gICAgaWYgKHRoaXMuc29ydGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnNvcnRlclZhbHVlRGlmZmVyLmRpZmYodmFsdWUpO1xuICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5fc29ydGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3J0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNvcnRlclZhbHVlKCk6IElTb3J0ZXJWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc29ydGVyVmFsdWU6IElTb3J0ZXJWYWx1ZSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCB0YWJsZUZpbHRlcihmaWx0ZXIpIHtcbiAgICB0aGlzLl90YWJsZUZpbHRlciA9IGZpbHRlcjtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJMYWJlbCA9IHR5cGVvZiBmaWx0ZXIubGFiZWwgPT09ICdzdHJpbmcnID8gZmlsdGVyLmxhYmVsIDogdGhpcy50YWJsZUZpbHRlckxhYmVsO1xuICAgICAgdGhpcy50YWJsZUZpbHRlclBsYWNlaG9sZGVyID0gdHlwZW9mIGZpbHRlci5wbGFjZWhvbGRlciA9PT0gJ3N0cmluZycgPyBmaWx0ZXIucGxhY2Vob2xkZXIgOiB0aGlzLnRhYmxlRmlsdGVyUGxhY2Vob2xkZXI7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPSB0eXBlb2YgZmlsdGVyLnZhbHVlID09PSAnc3RyaW5nJyA/IGZpbHRlci52YWx1ZSA6IHRoaXMudGFibGVGaWx0ZXJWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlRmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVGaWx0ZXI/OiBib29sZWFuIHwgSVRhYmxlRmlsdGVyO1xuXG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyTGFiZWwgPSAnRmlsdGVyOic7XG4gIEBJbnB1dCgpIHRhYmxlRmlsdGVyUGxhY2Vob2xkZXIgPSAndHlwZSBzdHJpbmcuLi4nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCB0YWJsZUZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fdGFibGVGaWx0ZXJWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmxlRmlsdGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICB9XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUZpbHRlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVGaWx0ZXJWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgdGFibGVCb2R5UHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVGb290UHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVIZWFkUHJvcHM/OiBJVGFibGVTZWN0aW9uUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVQcm9wcz86IElUYWJsZSA9IHt9O1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUl0ZW1bXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElJdGVtW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzb3J0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElTb3J0ZXJWYWx1ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0ZXJWYWx1ZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZVBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBpdGVtc1BlclBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSByb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNvbHVtbkZpbHRlclZhbHVlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbkZpbHRlclZhbHVlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZmlsdGVyZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPElJdGVtSW50ZXJuYWxbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElJdGVtSW50ZXJuYWxbXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZUlkRGlyZWN0aXZlKSBjb2x1bW5UZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVJZERpcmVjdGl2ZT47XG4gIHRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiAoVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIH0gPSB7IHRhYmxlRGV0YWlsczogbnVsbCwgdGFibGVEYXRhOiBudWxsIH07XG4gIGNvbHVtbkZpbHRlclRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiAoVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIH0gPSB7fTtcbiAgY29sdW1uTGFiZWxUZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogKFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSB9ID0ge307XG4gIHN1bW1hcnlSb3dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMuZm9yRWFjaCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZC5zdGFydHNXaXRoKCdjb2x1bW5GaWx0ZXJfJykpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJUZW1wbGF0ZXNbY2hpbGQuaWRdID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZC5pZC5zdGFydHNXaXRoKCdjb2x1bW5MYWJlbF8nKSkge1xuICAgICAgICB0aGlzLmNvbHVtbkxhYmVsVGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuaWQgPT09ICd0YWJsZVN1bW1hcnlSb3cnKSB7XG4gICAgICAgIHRoaXMuc3VtbWFyeVJvd1RlbXBsYXRlID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgIH0pO1xuICAgIHRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlcyB9O1xuICAgIHRoaXMuY29sdW1uTGFiZWxUZW1wbGF0ZXMgPSB7IC4uLnRoaXMuY29sdW1uTGFiZWxUZW1wbGF0ZXMgfTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEFsbCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xuICAgIGNvbnN0IHVuc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSBmYWxzZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkICYmIHVuc2VsZWN0ZWQgPyAnaW5kZXRlcm1pbmF0ZScgOiBzZWxlY3RlZDtcbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlclN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPyB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgOiAnJztcbiAgfVxuXG4gIGdldCBjb2x1bW5GaWx0ZXJTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA/IHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgOiB7fTtcbiAgfVxuXG4gIGdldCBudW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZSA/IE1hdGguY2VpbCh0aGlzLnNvcnRlZEl0ZW1zLmxlbmd0aCAvIHRoaXMuX2l0ZW1zUGVyUGFnZSkgOiAxO1xuICB9XG5cbiAgZ2V0IGNvbHNwYW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZSA/IHRoaXMucmF3Q29sdW1uTmFtZXMkKCkubGVuZ3RoICsgMSA6IHRoaXMucmF3Q29sdW1uTmFtZXMkKCkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2UgPyAodGhpcy5fYWN0aXZlUGFnZSAtIDEpICogdGhpcy5faXRlbXNQZXJQYWdlIDogMDtcbiAgfVxuXG4gIGdldCBpdGVtc09uQWN0aXZlUGFnZSgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zLnNsaWNlKFxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCxcbiAgICAgIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXggKyB0aGlzLl9pdGVtc1BlclBhZ2VcbiAgICApO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRJdGVtcygpOiBJSXRlbUludGVybmFsW10ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlID8gdGhpcy5pdGVtc09uQWN0aXZlUGFnZSA6IHRoaXMuc29ydGVkSXRlbXMgPz8gW107XG4gIH1cblxuICByYXdDb2x1bW5OYW1lcyQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGdldENvbHVtbk5hbWVzKHRoaXMuY29sdW1ucyQoKSwgdGhpcy5pdGVtcyQoKSk7XG4gIH0pO1xuXG4gIGl0ZW1zRGF0YUNvbHVtbnMkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yYXdDb2x1bW5OYW1lcyQoKS5maWx0ZXIoKG5hbWUpID0+IGdldENvbHVtbk5hbWVzRnJvbUl0ZW1zKHRoaXMuaXRlbXMkKCkpLmluY2x1ZGVzKG5hbWUpKSk7XG5cbiAgZ2V0IHNvcnRlZEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgY29uc3QgY29sdW1uS2V5ID0gdGhpcy5zb3J0ZXJWYWx1ZS5jb2x1bW47XG4gICAgaWYgKFxuICAgICAgIWNvbHVtbktleSB8fFxuICAgICAgIXRoaXMuaXRlbXNEYXRhQ29sdW1ucyQoKS5pbmNsdWRlcyhjb2x1bW5LZXkpIHx8XG4gICAgICAodGhpcy5jb2x1bW5Tb3J0ZXIgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0aGlzLmNvbHVtblNvcnRlci5leHRlcm5hbClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQgPSBbLi4udGhpcy50YWJsZUZpbHRlcmVkXTtcblxuICAgIC8vIGlmIHZhbHVlcyBpbiBjb2x1bW4gYXJlIHRvIGJlIHNvcnRlZCBieSBudW1lcmljIHZhbHVlIHRoZXkgYWxsIGhhdmUgdG8gYmUgYSB0eXBlIG9mIG51bWJlclxuICAgIGNvbnN0IGZsaXAgPSB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnYXNjJyA/IDEgOiB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnZGVzYycgPyAtMSA6IDA7XG5cbiAgICBpZiAoZmxpcCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50Q29sdW1uPy5zb3J0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGN1cnJlbnRDb2x1bW4uc29ydGVyKTtcbiAgICAgIHJldHVybiBmbGlwIDwgMCA/IHNvcnRlZC5yZXZlcnNlKCkgOiBzb3J0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZUZuID0gKGl0ZW0xOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0sIGl0ZW0yOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IGl0ZW0xW2NvbHVtbktleV07XG4gICAgICBjb25zdCB2YWx1ZTIgPSBpdGVtMltjb2x1bW5LZXldO1xuICAgICAgY29uc3QgYSA9IHR5cGVvZiB2YWx1ZTEgPT09ICdudW1iZXInID8gdmFsdWUxIDogU3RyaW5nKHZhbHVlMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGIgPSB0eXBlb2YgdmFsdWUyID09PSAnbnVtYmVyJyA/IHZhbHVlMiA6IFN0cmluZyh2YWx1ZTIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gYSA+IGIgPyAxICogZmxpcCA6IGIgPiBhID8gLTEgKiBmbGlwIDogMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGNvbXBhcmVGbik7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJFdmVudCgpOiAnY2hhbmdlJyB8ICdpbnB1dCcge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIubGF6eSkgPyAnY2hhbmdlJyA6ICdpbnB1dCc7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29sdW1uRmlsdGVyZWQ6IElJdGVtSW50ZXJuYWxbXSA9IFtdO1xuXG4gIGdldCBjb2x1bW5GaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBfaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbHVtbkZpbHRlciAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29sdW1uRmlsdGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIuZXh0ZXJuYWxcbiAgICApIHtcbiAgICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgICAgcmV0dXJuIF9pdGVtcztcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHZhbHVlKGl0ZW1ba2V5XSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudENvbHVtbj8uZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICh0eXBlb2YgY3VycmVudENvbHVtbi5maWx0ZXIgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudENvbHVtbi5maWx0ZXIoaXRlbSwgdmFsdWUpKSA/PyAhdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlciA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjb2x1bW5GaWx0ZXIgJiYgdGhpcy5pdGVtc0RhdGFDb2x1bW5zJCgpLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgX2l0ZW1zID0gX2l0ZW1zLmZpbHRlcigoaXRlbSkgPT4gU3RyaW5nKGl0ZW1ba2V5XSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjb2x1bW5GaWx0ZXIpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgIHJldHVybiBfaXRlbXM7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBpdGVtcyA9IHRoaXMuY29sdW1uRmlsdGVyZWQ7XG4gICAgaWYgKFxuICAgICAgIXRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fFxuICAgICAgKHRoaXMudGFibGVGaWx0ZXIgJiYgdHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIuZXh0ZXJuYWwpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIuZGlmZihpdGVtcyk7XG4gICAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMudGFibGVGaWx0ZXJTdGF0ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZhbHVlQ29udGFpbkZpbHRlciA9ICh2YWw6IGFueSkgPT4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgICByZXR1cm4gISF0aGlzLml0ZW1zRGF0YUNvbHVtbnMkKCkuZmluZCgoa2V5KSA9PiB2YWx1ZUNvbnRhaW5GaWx0ZXIoaXRlbVtrZXldKSk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlci5kaWZmKGl0ZW1zKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgZ2V0IGlzRmlsdGVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fCB0aGlzLnNvcnRlclZhbHVlPy5jb2x1bW4gfHwgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbkZpbHRlclN0YXRlKS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbXMoaXRlbXM6IElJdGVtW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IElJdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9fX2lkOiBpdGVtWydfX19pZCddID8/IGluZGV4IH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIDxJSXRlbUludGVybmFsPltdO1xuICB9XG5cbiAgaGFuZGxlU29ydENoYW5nZSgkZXZlbnQ6IHsgY29sdW1uS2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXI7IG9yZGVyPzogU29ydE9yZGVyOyB9KSB7XG4gICAgdGhpcy5oYW5kbGVTb3J0ZXJDaGFuZ2UoJGV2ZW50LmNvbHVtbktleSwgJGV2ZW50LmluZGV4LCAkZXZlbnQub3JkZXIpO1xuICB9XG5cbiAgaXNTb3J0YWJsZShpOiBudW1iZXIpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0RhdGFDb2x1bW4gPSB0aGlzLml0ZW1zRGF0YUNvbHVtbnMkKCkuaW5jbHVkZXModGhpcy5yYXdDb2x1bW5OYW1lcyQoKVtpXSk7XG4gICAgbGV0IGNvbHVtbjtcbiAgICBpZiAodGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgY29sdW1uID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jb2x1bW5Tb3J0ZXIgJiZcbiAgICAgICghdGhpcy5jb2x1bW5zLmxlbmd0aCB8fFxuICAgICAgICB0eXBlb2YgY29sdW1uICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAodHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBjb2x1bW4uc29ydGVyID09PSAndW5kZWZpbmVkJyB8fCBjb2x1bW4uc29ydGVyKSlcbiAgICAgICkgJiYgaXNEYXRhQ29sdW1uXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRlckNoYW5nZShjb2x1bW46IHN0cmluZywgaW5kZXg6IG51bWJlciwgb3JkZXI/OiBTb3J0T3JkZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTb3J0YWJsZShpbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9pZiBjb2x1bW4gY2hhbmdlZCBvciBzb3J0IHdhcyBkZXNjZW5kaW5nIGNoYW5nZSBhc2MgdG8gdHJ1ZVxuICAgIGNvbnN0IHNvcnRlclN0YXRlID0geyAuLi50aGlzLnNvcnRlclZhbHVlIH07XG5cbiAgICBpZiAoc29ydGVyU3RhdGUuY29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIGNvbnN0IHJlc2V0dGFibGUgPSAodHlwZW9mIHRoaXMuY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLmNvbHVtblNvcnRlci5yZXNldGFibGUpO1xuICAgICAgY29uc3Qgc3RhdGUgPSBzb3J0ZXJTdGF0ZS5zdGF0ZTtcbiAgICAgIGlmIChvcmRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNvcnRlclN0YXRlLnN0YXRlID0gc3RhdGUgPT09IDAgPyAnYXNjJyA6IHN0YXRlID09PSAnYXNjJyA/ICdkZXNjJyA6IHJlc2V0dGFibGUgPyAwIDogJ2FzYyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3J0ZXJTdGF0ZS5zdGF0ZSA9IChvcmRlciA9PT0gMCAmJiAhcmVzZXR0YWJsZSkgPyBzdGF0ZSA6IG9yZGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0ZXJTdGF0ZS5jb2x1bW4gPSBjb2x1bW47XG4gICAgICBzb3J0ZXJTdGF0ZS5zdGF0ZSA9ICdhc2MnO1xuICAgIH1cbiAgICB0aGlzLnNvcnRlclZhbHVlID0geyAuLi5zb3J0ZXJTdGF0ZSB9O1xuICB9XG5cbiAgc2V0QWN0aXZlUGFnZSgkZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9ICRldmVudDtcbiAgfVxuXG4gIGhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgY29sdW1uLCB2YWx1ZSwgdHlwZSB9ID0gJGV2ZW50O1xuICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclZhbHVlLCBbYCR7Y29sdW1ufWBdOiB2YWx1ZSB9O1xuICB9XG5cbiAgaGFuZGxlVGFibGVGaWx0ZXJDaGFuZ2UoJGV2ZW50OiB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICBjb25zdCBpc0xhenkgPSB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5sYXp5ID09PSB0cnVlO1xuICAgIGlmICgoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpICYmIHZhbHVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBjbGVhbigkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0ge307XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHt9O1xuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy9lbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICB9XG5cbiAgaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSb3dDaGVja2VkKCRldmVudDogRXZlbnQsIGl0ZW06IElJdGVtSW50ZXJuYWwpIHtcbiAgICBpdGVtLl9zZWxlY3RlZCA9IGl0ZW0uX3NlbGVjdGFibGUgIT09IGZhbHNlICYmICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQodGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRBbGwpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5faXRlbXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogSUl0ZW1JbnRlcm5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgX3NlbGVjdGVkOiAoaXRlbS5fc2VsZWN0YWJsZSAhPT0gZmFsc2UgPyAkZXZlbnQgOiAhIWl0ZW0uX3NlbGVjdGVkKSB9O1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQoJGV2ZW50KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGhhbmRsZVJvd0NsaWNrKHBhcmFtOiB7ICRldmVudDogTW91c2VFdmVudDsgaXRlbTogSUl0ZW1JbnRlcm5hbDsgaTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCB7ICRldmVudCwgaXRlbSwgaSB9ID0geyAuLi5wYXJhbSB9O1xuICAgIGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IHRoaXMucmF3Q29sdW1uTmFtZXMkKCk7XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IHRoaXMuX3NlbGVjdGFibGU7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGdldENsaWNrZWRDb2x1bW5OYW1lKHRhcmdldCwgY29sdW1uTmFtZXMsIHNlbGVjdGFibGUpO1xuICAgIHRoaXMucm93Q2xpY2suZW1pdCh7IGl0ZW06IGl0ZW0sIGluZGV4OiBpICsgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCwgY29sdW1uTmFtZSwgZXZlbnQ6ICRldmVudCB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29sdW1uRmlsdGVyVmFsdWUnXSkge1xuICAgICAgY29uc3QgY29sdW1uRmlsdGVyVmFsdWVDaGFuZ2UgPSBjaGFuZ2VzWydjb2x1bW5GaWx0ZXJWYWx1ZSddO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY29sdW1uRmlsdGVyVmFsdWVDaGFuZ2UuY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50VmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGN1cnJlbnRWYWx1ZSA/PyB7fSkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RhYmxlRmlsdGVyVmFsdWUnXSkge1xuICAgICAgY29uc3QgdGFibGVGaWx0ZXJWYWx1ZUNoYW5nZSA9IGNoYW5nZXNbJ3RhYmxlRmlsdGVyVmFsdWUnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UuY3VycmVudFZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIml0ZW1zUGVyUGFnZVNlbGVjdCB8fCB0YWJsZUZpbHRlciB8fCBjbGVhbmVyIHx8IHRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXVwiIGNsYXNzPVwicm93IG15LTIgbXgtMFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCIgKm5nSWY9XCJ0YWJsZUZpbHRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUZpbHRlclRlbXBsYXRlXCIgLz5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBwLTBcIiAqbmdJZj1cImNsZWFuZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVDbGVhbmVyVGVtcGxhdGVcIiAvPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXSB8fCB0YWJsZUN1c3RvbUhlYWRlclRlbXBsYXRlXCIgLz5cblxuICA8bmctdGVtcGxhdGUgI3RhYmxlRmlsdGVyVGVtcGxhdGU+XG4gICAgPGMtc21hcnQtdGFibGUtZmlsdGVyXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlVGFibGVGaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cInRhYmxlRmlsdGVyXCJcbiAgICAgIFtkZWxheV09XCIzMDBcIlxuICAgICAgW2ZpbHRlckxhYmVsXT1cInRhYmxlRmlsdGVyTGFiZWxcIlxuICAgICAgW2ZpbHRlclBsYWNlaG9sZGVyXT1cInRhYmxlRmlsdGVyUGxhY2Vob2xkZXJcIlxuICAgICAgW29uRXZlbnRdPVwidGFibGVGaWx0ZXJFdmVudFwiXG4gICAgICBbdmFsdWVdPVwidGFibGVGaWx0ZXJTdGF0ZVwiXG4gICAgICBjRmlsdGVySW5wdXRcbiAgICA+XG4gICAgPC9jLXNtYXJ0LXRhYmxlLWZpbHRlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3RhYmxlQ2xlYW5lclRlbXBsYXRlPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJjbGVhbigkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiY2xlYW5lclwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzRmlsdGVyZWRcIlxuICAgICAgW25nQ2xhc3NdPVwieydtcy0xJzogdGFibGVGaWx0ZXJ9XCJcbiAgICAgIGNCdXR0b25cbiAgICAgIGNvbG9yPVwidHJhbnNwYXJlbnRcIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVySWNvblRlbXBsYXRlXCIgLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3RhYmxlQ3VzdG9tSGVhZGVyVGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMCBtcy1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY3VzdG9tSGVhZGVyXVwiIC8+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICA8dGFibGUgW2FsaWduXT1cInRhYmxlUHJvcHM/LmFsaWduXCJcbiAgICAgICAgIFtib3JkZXJDb2xvcl09XCJ0YWJsZVByb3BzPy5ib3JkZXJDb2xvclwiXG4gICAgICAgICBbYm9yZGVyZWRdPVwidGFibGVQcm9wcz8uYm9yZGVyZWQgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtib3JkZXJsZXNzXT1cInRhYmxlUHJvcHM/LmJvcmRlcmxlc3MgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtjYXB0aW9uXT1cInRhYmxlUHJvcHM/LmNhcHRpb25cIlxuICAgICAgICAgW2NvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtob3Zlcl09XCJ0YWJsZVByb3BzPy5ob3ZlciA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgW3Jlc3BvbnNpdmVdPVwidGFibGVQcm9wcz8ucmVzcG9uc2l2ZVwiXG4gICAgICAgICBbc21hbGxdPVwidGFibGVQcm9wcz8uc21hbGwgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtzdHJpcGVkXT1cInRhYmxlUHJvcHM/LnN0cmlwZWQgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVQcm9wcz8uYXR0cmlidXRlcyA/PyB7fVwiXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVQcm9wcz8uY29sb3JcIlxuICAgICAgICAgY1RhYmxlXG4gID5cbiAgICA8Yy1zbWFydC10YWJsZS1oZWFkXG4gICAgICAoY29sdW1uRmlsdGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlQ29sdW1uRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoc29ydGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlU29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiaGVhZGVyXCJcbiAgICAgIFtjQWxpZ25dPVwidGFibGVIZWFkUHJvcHM/LmFsaWduXCJcbiAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVIZWFkUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlSGVhZFByb3BzPy5jb2xvclwiXG4gICAgICBbY29sdW1uRmlsdGVyU3RhdGVdPVwiY29sdW1uRmlsdGVyU3RhdGVcIlxuICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgW2NvbHVtbkZpbHRlcl09XCJjb2x1bW5GaWx0ZXJcIlxuICAgICAgW2NvbHVtbkxhYmVsVGVtcGxhdGVzXT1cImNvbHVtbkxhYmVsVGVtcGxhdGVzXCJcbiAgICAgIFtjb2x1bW5Tb3J0ZXJdPVwiY29sdW1uU29ydGVyXCJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnMkKClcIlxuICAgICAgW2NvbHVtbkdyb3Vwc109XCJjb2x1bW5Hcm91cHMkKClcIlxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxuICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICBbc2hvd0dyb3Vwc109XCJzaG93R3JvdXBzJCgpXCJcbiAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXG4gICAgLz5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0Ym9keURlZmF1bHRUZW1wbGF0ZVwiIC8+XG5cbiAgICA8dGZvb3QgKm5nSWY9XCJzdW1tYXJ5Um93VGVtcGxhdGUgJiYgIWZvb3RlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1bW1hcnlSb3dUZW1wbGF0ZVwiIC8+XG4gICAgPC90Zm9vdD5cblxuICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNvcnRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImZvb3RlclwiXG4gICAgICBbY0FsaWduXT1cInRhYmxlRm9vdFByb3BzPy5hbGlnblwiXG4gICAgICBbY0h0bWxBdHRyXT1cInRhYmxlRm9vdFByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcbiAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUZvb3RQcm9wcz8uY29sb3JcIlxuICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgW2NvbHVtbkxhYmVsVGVtcGxhdGVzXT1cImNvbHVtbkxhYmVsVGVtcGxhdGVzXCJcbiAgICAgIFtjb2x1bW5Tb3J0ZXJdPVwiY29sdW1uU29ydGVyXCJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnMkKClcIlxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxuICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxuICAgICAgW3N1bW1hcnlSb3dUZW1wbGF0ZV09XCJzdW1tYXJ5Um93VGVtcGxhdGVcIlxuICAgICAgY29tcG9uZW50PVwidGZvb3RcIlxuICAgIC8+XG5cbiAgPC90YWJsZT5cbiAgPGMtZWxlbWVudC1jb3ZlclxuICAgICpuZ0lmPVwibG9hZGluZ1wiXG4gICAgW2JvdW5kYXJpZXNdPVwiW1xuICAgICAgeyBzaWRlczogWyd0b3AnXSwgcXVlcnk6ICd0ZCcgfSxcbiAgICAgIHsgc2lkZXM6IFsnYm90dG9tJ10sIHF1ZXJ5OiAndGJvZHknIH1cbiAgICBdXCJcbiAgLz5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhZ2luYXRpb24gfHwgaXRlbXNQZXJQYWdlU2VsZWN0XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICA8Yy1zbWFydC1wYWdpbmF0aW9uXG4gICAgICAgIChhY3RpdmVQYWdlQ2hhbmdlKT1cInNldEFjdGl2ZVBhZ2UoJGV2ZW50KVwiXG4gICAgICAgICpuZ0lmPVwicGFnaW5hdGlvbiAmJiBudW1iZXJPZlBhZ2VzID4gMVwiXG4gICAgICAgIFthY3RpdmVQYWdlXT1cImFjdGl2ZVBhZ2VcIlxuICAgICAgICBbcGFnZXNdPVwibnVtYmVyT2ZQYWdlc1wiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtcy1hdXRvXCI+XG4gICAgICA8Yy1zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3RvclxuICAgICAgICAoaXRlbXNQZXJQYWdlQ2hhbmdlKT1cImhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3RcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlTGFiZWxdPVwiaXRlbXNQZXJQYWdlTGFiZWxcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlT3B0aW9uc109XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Rib2R5RGVmYXVsdFRlbXBsYXRlPlxuICA8dGJvZHkgW2NIdG1sQXR0cl09XCJ0YWJsZUJvZHlQcm9wcz8uYXR0cmlidXRlcyA/PyB7fVwiXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVCb2R5UHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtjQWxpZ25dPVwidGFibGVCb2R5UHJvcHM/LmFsaWduXCJcbiAgPlxuICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiY3VycmVudEl0ZW1zXCIgbGV0LWNudD1cImNvdW50XCIgbGV0LWk9XCJpbmRleFwiIGxldC1pc0V2ZW49XCJldmVuXCIgbGV0LWlzT2RkPVwib2RkXCI+XG4gICAgPHRyIFt0YWJpbmRleF09XCJjbGlja2FibGVSb3dzID8gMCA6IC0xXCJcbiAgICAgICAgW25nU3R5bGVdPVwie2N1cnNvcjogY2xpY2thYmxlUm93cyA/ICdwb2ludGVyJyA6ICdhdXRvJ31cIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soeyRldmVudCwgaXRlbSwgaX0pXCJcbiAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtLl9wcm9wcz8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgIFtjVGFibGVDb2xvcl09XCJpdGVtLl9wcm9wcz8uY29sb3JcIlxuICAgICAgICBbY0FsaWduXT1cIml0ZW0uX3Byb3BzPy5hbGlnblwiXG4gICAgPlxuICAgICAgPHRkICpuZ0lmPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5jb2xvclwiXG4gICAgICAgICAgW2NBbGlnbl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWxpZ25cIlxuICAgICAgPlxuICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJoYW5kbGVSb3dDaGVja2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbS5fc2VsZWN0ZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgY0Zvcm1DaGVja0lucHV0XG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGl0ZW0/Ll9zZWxlY3RhYmxlID09PSBmYWxzZSkgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgPlxuICAgICAgPC90ZD5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sdW1uIFtuZ0Zvck9mXT1cImNvbHVtbnMkKClcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEYXRhJ10gfHwgY29sdW1uRGVmYXVsdFRlbXBsYXRlOyBjb250ZXh0OiB7Y29sdW1uLCBpdGVtLCBjb2x1bW5OYW1lOiBnZXRDb2x1bW5LZXkoY29sdW1uKSwgdGRDb250ZW50OiBpdGVtW2NvbHVtbi5rZXldLCBjZWxsUHJvcHM6IGdldFRhYmxlRGF0YUNlbGxQcm9wcyhjb2x1bW4sIGl0ZW0pIH1cIiAvPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3RyPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGV0YWlscyddXCI+XG4gICAgICA8IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0RldGFpbHNEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj4tLT5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCI+PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJwLTBcIj5cbiAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEZXRhaWxzJ107IGNvbnRleHQ6IHtpdGVtLCBpbmRleDogaX1cIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9JdGVtc0RlZmF1bHRUZW1wbGF0ZVwiIC8+XG4gIDwvdGJvZHk+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2NvbHVtbkRlZmF1bHRUZW1wbGF0ZVxuICBsZXQtY2VsbFByb3BzPVwiY2VsbFByb3BzXCJcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiXG4gIGxldC1jb2x1bW5OYW1lPVwiY29sdW1uTmFtZVwiXG4gIGxldC1pdGVtPVwiaXRlbVwiXG4gIGxldC10ZENvbnRlbnQ9XCJ0ZENvbnRlbnRcIlxuPlxuICA8dGRcbiAgICAqbmdJZj1cInRkQ29udGVudCAhPT0gdW5kZWZpbmVkXCJcbiAgICBbY1RhYmxlQWN0aXZlXT1cImNlbGxQcm9wcz8uWydhY3RpdmUnXVwiXG4gICAgW2NUYWJsZUNvbG9yXT1cImNlbGxQcm9wcz8uY29sb3IgPz8gY29sdW1uW2NvbHVtbk5hbWVdPy5fY29sUHJvcHM/LmNvbG9yID8/IHVuZGVmaW5lZFwiXG4gICAgW2NBbGlnbl09XCJjZWxsUHJvcHM/LmFsaWduXCJcbiAgICBbbmdDbGFzc109XCJnZXRUYWJsZURhdGFDZWxsQ2xhc3MoY29sdW1uLCBpdGVtKVwiXG4gICAgW2NIdG1sQXR0cl09XCJjZWxsUHJvcHM/LlsnX2F0dHJpYnV0ZXMnXSA/PyB1bmRlZmluZWRcIlxuICAgIFtuZ1N0eWxlXT1cImdldFRhYmxlRGF0YUNlbGxTdHlsZXMoY29sdW1uLCBpdGVtKVwiXG4gID5cbiAgICB7e3RkQ29udGVudH19XG4gIDwvdGQ+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tPG5nLXRlbXBsYXRlICNyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtIGxldC1pbmRleD4tLT5cbjwhLS0gIDx0cj48dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwicC0wXCIgdGFiaW5kZXg9XCItMVwiIFtuZ1N0eWxlXT1cIntib3JkZXJCb3R0b21XaWR0aDogMH1cIj48L3RkPjwvdHI+LS0+XG48IS0tICA8dHIgY2xhc3M9XCJwLTBcIj4tLT5cbjwhLS0gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+LS0+XG48IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlcz8udGFibGVEZXRhaWxzXCI+PC9uZy1jb250YWluZXI+LS0+XG48IS0tICAgIDwvdGQ+LS0+XG48IS0tICA8L3RyPi0tPlxuPCEtLTwvbmctdGVtcGxhdGU+LS0+XG5cbjxuZy10ZW1wbGF0ZSAjbm9JdGVtc0RlZmF1bHRUZW1wbGF0ZT5cbiAgPHRyICpuZ0lmPVwiIWN1cnJlbnRJdGVtcy5sZW5ndGhcIj5cbiAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7bm9JdGVtc0xhYmVsfX08L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLXRvZG86IGZpbHRlckljb25DdXN0b21UZW1wbGF0ZS0tPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJJY29uVGVtcGxhdGU+XG4gIDxzdmcgdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHBvaW50ZXItZXZlbnRzPVwibm9uZVwiIHJvbGU9XCJpbWdcIlxuICAgICAgIGNsYXNzPVwiaWNvbiBpY29uLWN1c3RvbS1zaXplXCIgd2lkdGg9XCIxOFwiPlxuICAgIDxwb2x5Z29uXG4gICAgICBmaWxsPVwidmFyKC0tY2ktcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKVwiXG4gICAgICBwb2ludHM9XCI0MCAxNiA0MCA1My44MjggMTA5LjAyNCAxMzYgMTUwLjgxNSAxMzYgNzYuODk2IDQ4IDQ1OS41MSA0OCAzMDQgMjQyLjM4OCAzMDQgNDAxLjM3MyAyNDEuMzczIDQ2NCAyNDAgNDY0IDI0MCAzNjggMjA4IDM2OCAyMDggNDk2IDI1NC42MjcgNDk2IDMzNiA0MTQuNjI3IDMzNiAyNTMuNjEyIDQ5NiA1My42MTIgNDk2IDE2IDQwIDE2XCJcbiAgICAgIGNsYXNzPVwiY2ktcHJpbWFyeVwiPlxuICAgIDwvcG9seWdvbj5cbiAgICA8cG9seWdvblxuICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxuICAgICAgcG9pbnRzPVwiMTY2LjQwMyAyNDguMjI1IDIyNi44NjQgMTg3Ljc2MyAyMDQuMjM3IDE2NS4xMzUgMTQzLjc3NSAyMjUuNTk3IDgzLjMxMyAxNjUuMTM1IDYwLjY4NyAxODcuNzYzIDEyMS4xNDggMjQ4LjIyNSA2MC42ODcgMzA4LjY4NyA4My4zMTMgMzMxLjMxNCAxNDMuNzc1IDI3MC44NTIgMjA0LjIzNyAzMzEuMzE0IDIyNi44NjQgMzA4LjY4NyAxNjYuNDAzIDI0OC4yMjVcIlxuICAgICAgY2xhc3M9XCJjaS1wcmltYXJ5XCI+XG4gICAgPC9wb2x5Z29uPlxuICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
528
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFLTCxlQUFlLEVBRWYsTUFBTSxFQUVOLE1BQU0sRUFLUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1CdkMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsWUFBWSxFQUNaLGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx3QkFBd0IsRUFB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bnRlbnRJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgc2lnbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgV3JpdGFibGVTaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIEpzb25QaXBlLCBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJVGFibGUgfSBmcm9tICcuLi8uLi90YWJsZS90YWJsZS50eXBlJztcbmltcG9ydCB7XG4gIElDb2x1bW4sXG4gIElDb2x1bW5GaWx0ZXIsXG4gIElDb2x1bW5GaWx0ZXJWYWx1ZSxcbiAgSUdyb3VwLFxuICBJSXRlbSxcbiAgSUl0ZW1JbnRlcm5hbCxcbiAgSVNtYXJ0VGFibGUsXG4gIElTb3J0ZXIsXG4gIElTb3J0ZXJWYWx1ZSxcbiAgSVRhYmxlRmlsdGVyLFxuICBJVGFibGVTZWN0aW9uUHJvcHMsXG4gIEl0ZW1zUGVyUGFnZVNlbGVjdCxcbiAgU29ydE9yZGVyXG59IGZyb20gJy4uL3NtYXJ0LXRhYmxlLnR5cGUnO1xuXG5pbXBvcnQge1xuICBnZXRDbGlja2VkQ29sdW1uTmFtZSxcbiAgZ2V0Q29sdW1uR3JvdXBzLFxuICBnZXRDb2x1bW5LZXksXG4gIGdldENvbHVtbk5hbWVzLFxuICBnZXRDb2x1bW5OYW1lc0Zyb21JdGVtcyxcbiAgZ2V0Q29sdW1ucyxcbiAgZ2V0VGFibGVEYXRhQ2VsbENsYXNzLFxuICBnZXRUYWJsZURhdGFDZWxsUHJvcHMsXG4gIGdldFRhYmxlRGF0YUNlbGxTdHlsZXNcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUudXRpbHMnO1xuXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9idXR0b24nO1xuaW1wb3J0IHsgRm9ybUNoZWNrSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9mb3JtJztcbmltcG9ydCB7IEVsZW1lbnRDb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnQtY292ZXInO1xuaW1wb3J0IHsgSHRtbEF0dHJpYnV0ZXNEaXJlY3RpdmUsIFRlbXBsYXRlSWREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgU21hcnRQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc21hcnQtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBUYWJsZUFjdGl2ZURpcmVjdGl2ZSwgVGFibGVDb2xvckRpcmVjdGl2ZSwgVGFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi90YWJsZSc7XG5pbXBvcnQgeyBBbGlnbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBTbWFydFRhYmxlRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtdGFibGUtZmlsdGVyL3NtYXJ0LXRhYmxlLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsdGVySW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9zbWFydC10YWJsZS1maWx0ZXIvZmlsdGVyLWlucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTbWFydFRhYmxlSGVhZENvbXBvbmVudCB9IGZyb20gJy4uL3NtYXJ0LXRhYmxlLWhlYWQvc21hcnQtdGFibGUtaGVhZC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgU21hcnRUYWJsZUl0ZW1zUGVyUGFnZVNlbGVjdG9yQ29tcG9uZW50XG59IGZyb20gJy4uL3NtYXJ0LXRhYmxlLWl0ZW1zLXBlci1wYWdlLXNlbGVjdG9yL3NtYXJ0LXRhYmxlLWl0ZW1zLXBlci1wYWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Mtc21hcnQtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zbWFydC10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NTbWFydFRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEFzeW5jUGlwZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBBbGlnbkRpcmVjdGl2ZSxcbiAgICBCdXR0b25EaXJlY3RpdmUsXG4gICAgRWxlbWVudENvdmVyQ29tcG9uZW50LFxuICAgIEZpbHRlcklucHV0RGlyZWN0aXZlLFxuICAgIEZvcm1DaGVja0lucHV0RGlyZWN0aXZlLFxuICAgIEh0bWxBdHRyaWJ1dGVzRGlyZWN0aXZlLFxuICAgIFNtYXJ0UGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICBTbWFydFRhYmxlRmlsdGVyQ29tcG9uZW50LFxuICAgIFNtYXJ0VGFibGVIZWFkQ29tcG9uZW50LFxuICAgIFNtYXJ0VGFibGVJdGVtc1BlclBhZ2VTZWxlY3RvckNvbXBvbmVudCxcbiAgICBUYWJsZUFjdGl2ZURpcmVjdGl2ZSxcbiAgICBUYWJsZUNvbG9yRGlyZWN0aXZlLFxuICAgIFRhYmxlRGlyZWN0aXZlLFxuICAgIEpzb25QaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU21hcnRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIElTbWFydFRhYmxlLCBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgcHJpdmF0ZSBrZXlWYWx1ZURpZmZlcnM6IEtleVZhbHVlRGlmZmVyc1xuICApIHtcbiAgICB0aGlzLml0ZW1zRGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLml0ZW1zKS5jcmVhdGUoKTtcbiAgICB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuX2NvbHVtbkZpbHRlcmVkKS5jcmVhdGUoKTtcbiAgICB0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIgPSB0aGlzLmtleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuY29sdW1uRmlsdGVyVmFsdWUpLmNyZWF0ZSgpO1xuICAgIHRoaXMuc29ydGVyVmFsdWVEaWZmZXIgPSB0aGlzLmtleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuc29ydGVyVmFsdWUpLmNyZWF0ZSgpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRBbGwpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVhZG9ubHkgZ2V0Q29sdW1uS2V5ID0gZ2V0Q29sdW1uS2V5O1xuICByZWFkb25seSBnZXRUYWJsZURhdGFDZWxsQ2xhc3MgPSBnZXRUYWJsZURhdGFDZWxsQ2xhc3M7XG4gIHJlYWRvbmx5IGdldFRhYmxlRGF0YUNlbGxQcm9wcyA9IGdldFRhYmxlRGF0YUNlbGxQcm9wcztcbiAgcmVhZG9ubHkgZ2V0VGFibGVEYXRhQ2VsbFN0eWxlcyA9IGdldFRhYmxlRGF0YUNlbGxTdHlsZXM7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRBbGxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuIHwgJ2luZGV0ZXJtaW5hdGUnPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtc0RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PiB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNGaWx0ZXJlZERpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PiB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sdW1GaWx0ZXJWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8YW55LCBhbnk+IHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3J0ZXJWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8YW55LCBhbnk+IHwgbnVsbDtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBzZXQgYWN0aXZlUGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWN0aXZlUGFnZSA9IHZhbHVlIHx8IDE7XG4gICAgdGhpcy5hY3RpdmVQYWdlQ2hhbmdlLmVtaXQodGhpcy5fYWN0aXZlUGFnZSk7XG4gIH1cblxuICBnZXQgYWN0aXZlUGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWN0aXZlUGFnZSA9IDE7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFuZXIgPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xpY2thYmxlUm93cyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5zKHZhbHVlOiAoc3RyaW5nIHwgSUNvbHVtbiB8IElHcm91cClbXSkge1xuICAgIGNvbnN0IGNvbE9iamVjdHMgPSB2YWx1ZS5tYXAoY29sdW1uID0+IHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnID8geyBrZXk6IGNvbHVtbiB9IDogeyAuLi5jb2x1bW4gfSk7XG4gICAgY29uc3QgY29sdW1uczogSUNvbHVtbltdID0gZ2V0Q29sdW1ucyhjb2xPYmplY3RzKTtcbiAgICB0aGlzLmNvbHVtbnMkLnNldChjb2x1bW5zKTtcblxuICAgIC8vIHRvZG86IElucHV0IGNvbHVtbkdyb3VwcyAtIHNlcGFyYXRpb24/XG4gICAgLy8gY29uc29sZS5sb2coY29sdW1ucyk7XG4gICAgY29uc29sZS5sb2coZ2V0Q29sdW1uR3JvdXBzKGNvbE9iamVjdHMgPz8gW10pKTtcbiAgICBjb25zdCBncm91cHMgPSBnZXRDb2x1bW5Hcm91cHModmFsdWUgPz8gW10pO1xuICAgIHRoaXMuY29sdW1uR3JvdXBzJC5zZXQoZ3JvdXBzKTtcbiAgfVxuXG4gIGdldCBjb2x1bW5zKCk6IElDb2x1bW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucyQoKTtcbiAgfVxuXG4gIGNvbHVtbnMkOiBXcml0YWJsZVNpZ25hbDxJQ29sdW1uW10+ID0gc2lnbmFsKFtdKTtcbiAgY29sdW1uR3JvdXBzJDogV3JpdGFibGVTaWduYWw8SUdyb3VwW11bXT4gPSBzaWduYWwoW10pO1xuICBzaG93R3JvdXBzJCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5jb2x1bW5Hcm91cHMkKCkubGVuZ3RoKTtcblxuICBASW5wdXQoKSBjb2x1bW5GaWx0ZXI/OiBib29sZWFuIHwgSUNvbHVtbkZpbHRlcjtcblxuICBASW5wdXQoKVxuICBzZXQgY29sdW1uRmlsdGVyVmFsdWUodmFsdWU6IElDb2x1bW5GaWx0ZXJWYWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udGhpcy5fY29sdW1uRmlsdGVyVmFsdWUgfSk7XG4gICAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uRmlsdGVyVmFsdWUoKTogSUNvbHVtbkZpbHRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5GaWx0ZXJWYWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlID0ge307XG5cbiAgQElucHV0KCkgY29sdW1uU29ydGVyPzogYm9vbGVhbiB8IElTb3J0ZXI7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGZvb3RlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBoZWFkZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaXRlbXModmFsdWU6IElJdGVtW10pIHtcbiAgICBpZiAodGhpcy5pdGVtc0RpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbXNEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9pdGVtcyA9IHRoaXMuc2V0SXRlbXModmFsdWUpIGFzIEFycmF5PFR5cGU8SUl0ZW1JbnRlcm5hbD4+O1xuICAgICAgICB0aGlzLml0ZW1zJC5zZXQodGhpcy5faXRlbXMpO1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBnZXRDb2x1bW5OYW1lc0Zyb21JdGVtcyh0aGlzLml0ZW1zJCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cblxuICBpdGVtcyQgPSBzaWduYWwoW10gYXMgQXJyYXk8SUl0ZW1JbnRlcm5hbD4pO1xuICBwcml2YXRlIF9pdGVtczogSUl0ZW1JbnRlcm5hbFtdID0gW10gYXMgQXJyYXk8VHlwZTxJSXRlbUludGVybmFsPj47XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgc2V0IGl0ZW1zUGVyUGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaXRlbXNQZXJQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG5cbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlTGFiZWw6IHN0cmluZyA9ICdJdGVtcyBwZXIgcGFnZTonO1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjAsIDUwXTtcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlU2VsZWN0PzogYm9vbGVhbiB8IEl0ZW1zUGVyUGFnZVNlbGVjdDtcbiAgQElucHV0KCkgbG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIG5vSXRlbXNMYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiA9ICdObyBpdGVtcyBmb3VuZCc7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHBhZ2luYXRpb24gPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc2V0IHNlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2VsZWN0QWxsID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgc29ydGVyVmFsdWUodmFsdWU6IElTb3J0ZXJWYWx1ZSkge1xuICAgIGlmICh0aGlzLnNvcnRlclZhbHVlRGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5zb3J0ZXJWYWx1ZURpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX3NvcnRlclZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc29ydGVyVmFsdWVDaGFuZ2UuZW1pdCh7IC4uLnZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzb3J0ZXJWYWx1ZSgpOiBJU29ydGVyVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9zb3J0ZXJWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRlclZhbHVlOiBJU29ydGVyVmFsdWUgPSB7fTtcblxuICBASW5wdXQoKVxuICBzZXQgdGFibGVGaWx0ZXIoZmlsdGVyKSB7XG4gICAgdGhpcy5fdGFibGVGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyTGFiZWwgPSB0eXBlb2YgZmlsdGVyLmxhYmVsID09PSAnc3RyaW5nJyA/IGZpbHRlci5sYWJlbCA6IHRoaXMudGFibGVGaWx0ZXJMYWJlbDtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJQbGFjZWhvbGRlciA9IHR5cGVvZiBmaWx0ZXIucGxhY2Vob2xkZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyLnBsYWNlaG9sZGVyIDogdGhpcy50YWJsZUZpbHRlclBsYWNlaG9sZGVyO1xuICAgICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gdHlwZW9mIGZpbHRlci52YWx1ZSA9PT0gJ3N0cmluZycgPyBmaWx0ZXIudmFsdWUgOiB0aGlzLnRhYmxlRmlsdGVyVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUZpbHRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlRmlsdGVyPzogYm9vbGVhbiB8IElUYWJsZUZpbHRlcjtcblxuICBASW5wdXQoKSB0YWJsZUZpbHRlckxhYmVsID0gJ0ZpbHRlcjonO1xuICBASW5wdXQoKSB0YWJsZUZpbHRlclBsYWNlaG9sZGVyID0gJ3R5cGUgc3RyaW5nLi4uJztcblxuICBASW5wdXQoKVxuICBzZXQgdGFibGVGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3RhYmxlRmlsdGVyVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyZWQ7IC8vIGVtaXRzIHRhYmxlRmlsdGVyZWQgY2hhbmdlXG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVGaWx0ZXJWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlRmlsdGVyVmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpIHRhYmxlQm9keVByb3BzPzogSVRhYmxlU2VjdGlvblByb3BzID0ge307XG4gIEBJbnB1dCgpIHRhYmxlRm9vdFByb3BzPzogSVRhYmxlU2VjdGlvblByb3BzID0ge307XG4gIEBJbnB1dCgpIHRhYmxlSGVhZFByb3BzPzogSVRhYmxlU2VjdGlvblByb3BzID0ge307XG4gIEBJbnB1dCgpIHRhYmxlUHJvcHM/OiBJVGFibGUgPSB7fTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPElJdGVtW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxJSXRlbVtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc29ydGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJU29ydGVyVmFsdWU+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGVyVmFsdWU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBhY3RpdmVQYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaXRlbXNQZXJQYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElDb2x1bW5GaWx0ZXJWYWx1ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5GaWx0ZXJWYWx1ZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGZpbHRlcmVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJSXRlbUludGVybmFsW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxJSXRlbUludGVybmFsW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVJZERpcmVjdGl2ZSkgY29sdW1uVGVtcGxhdGVzITogUXVlcnlMaXN0PFRlbXBsYXRlSWREaXJlY3RpdmU+O1xuICB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogKFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSB9ID0geyB0YWJsZURldGFpbHM6IG51bGwsIHRhYmxlRGF0YTogbnVsbCB9O1xuICBjb2x1bW5GaWx0ZXJUZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogKFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSB9ID0ge307XG4gIGNvbHVtbkxhYmVsVGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHt9O1xuICBzdW1tYXJ5Um93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICBpZiAoY2hpbGQuaWQuc3RhcnRzV2l0aCgnY29sdW1uRmlsdGVyXycpKSB7XG4gICAgICAgIHRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuaWQuc3RhcnRzV2l0aCgnY29sdW1uTGFiZWxfJykpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5MYWJlbFRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkLmlkID09PSAndGFibGVTdW1tYXJ5Um93Jykge1xuICAgICAgICB0aGlzLnN1bW1hcnlSb3dUZW1wbGF0ZSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICB9KTtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlcyA9IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJUZW1wbGF0ZXMgfTtcbiAgICB0aGlzLmNvbHVtbkxhYmVsVGVtcGxhdGVzID0geyAuLi50aGlzLmNvbHVtbkxhYmVsVGVtcGxhdGVzIH07XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRBbGwoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKTtcbiAgICBjb25zdCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtcy5zb21lKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZCAmJiB1bnNlbGVjdGVkID8gJ2luZGV0ZXJtaW5hdGUnIDogc2VsZWN0ZWQ7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUZpbHRlclZhbHVlID8gdGhpcy50YWJsZUZpbHRlclZhbHVlIDogJyc7XG4gIH1cblxuICBnZXQgY29sdW1uRmlsdGVyU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgPyB0aGlzLmNvbHVtbkZpbHRlclZhbHVlIDoge307XG4gIH1cblxuICBnZXQgbnVtYmVyT2ZQYWdlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc1BlclBhZ2UgPyBNYXRoLmNlaWwodGhpcy5zb3J0ZWRJdGVtcy5sZW5ndGggLyB0aGlzLl9pdGVtc1BlclBhZ2UpIDogMTtcbiAgfVxuXG4gIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGUgPyB0aGlzLnJhd0NvbHVtbk5hbWVzJCgpLmxlbmd0aCArIDEgOiB0aGlzLnJhd0NvbHVtbk5hbWVzJCgpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBmaXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlID8gKHRoaXMuX2FjdGl2ZVBhZ2UgLSAxKSAqIHRoaXMuX2l0ZW1zUGVyUGFnZSA6IDA7XG4gIH1cblxuICBnZXQgaXRlbXNPbkFjdGl2ZVBhZ2UoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcy5zbGljZShcbiAgICAgIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsXG4gICAgICB0aGlzLmZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4ICsgdGhpcy5faXRlbXNQZXJQYWdlXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50SXRlbXMoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUGFnZSA/IHRoaXMuaXRlbXNPbkFjdGl2ZVBhZ2UgOiB0aGlzLnNvcnRlZEl0ZW1zID8/IFtdO1xuICB9XG5cbiAgcmF3Q29sdW1uTmFtZXMkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBnZXRDb2x1bW5OYW1lcyh0aGlzLmNvbHVtbnMkKCksIHRoaXMuaXRlbXMkKCkpO1xuICB9KTtcblxuICBpdGVtc0RhdGFDb2x1bW5zJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmF3Q29sdW1uTmFtZXMkKCkuZmlsdGVyKChuYW1lKSA9PiBnZXRDb2x1bW5OYW1lc0Zyb21JdGVtcyh0aGlzLml0ZW1zJCgpKS5pbmNsdWRlcyhuYW1lKSkpO1xuXG4gIGdldCBzb3J0ZWRJdGVtcygpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGNvbnN0IGNvbHVtbktleSA9IHRoaXMuc29ydGVyVmFsdWUuY29sdW1uO1xuICAgIGlmIChcbiAgICAgICFjb2x1bW5LZXkgfHxcbiAgICAgICF0aGlzLml0ZW1zRGF0YUNvbHVtbnMkKCkuaW5jbHVkZXMoY29sdW1uS2V5KSB8fFxuICAgICAgKHRoaXMuY29sdW1uU29ydGVyICYmXG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbHVtblNvcnRlciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdGhpcy5jb2x1bW5Tb3J0ZXIuZXh0ZXJuYWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZUZpbHRlcmVkO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZUZpbHRlcmVkID0gWy4uLnRoaXMudGFibGVGaWx0ZXJlZF07XG5cbiAgICAvLyBpZiB2YWx1ZXMgaW4gY29sdW1uIGFyZSB0byBiZSBzb3J0ZWQgYnkgbnVtZXJpYyB2YWx1ZSB0aGV5IGFsbCBoYXZlIHRvIGJlIGEgdHlwZSBvZiBudW1iZXJcbiAgICBjb25zdCBmbGlwID0gdGhpcy5zb3J0ZXJWYWx1ZS5zdGF0ZSA9PT0gJ2FzYycgPyAxIDogdGhpcy5zb3J0ZXJWYWx1ZS5zdGF0ZSA9PT0gJ2Rlc2MnID8gLTEgOiAwO1xuXG4gICAgaWYgKGZsaXAgPT09IDApIHtcbiAgICAgIHJldHVybiB0YWJsZUZpbHRlcmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICh0eXBlb2YgY3VycmVudENvbHVtbj8uc29ydGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSB0YWJsZUZpbHRlcmVkLnNsaWNlKCkuc29ydChjdXJyZW50Q29sdW1uLnNvcnRlcik7XG4gICAgICByZXR1cm4gZmxpcCA8IDAgPyBzb3J0ZWQucmV2ZXJzZSgpIDogc29ydGVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBhcmVGbiA9IChpdGVtMTogeyBbeDogc3RyaW5nXTogYW55OyB9LCBpdGVtMjogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSBpdGVtMVtjb2x1bW5LZXldO1xuICAgICAgY29uc3QgdmFsdWUyID0gaXRlbTJbY29sdW1uS2V5XTtcbiAgICAgIGNvbnN0IGEgPSB0eXBlb2YgdmFsdWUxID09PSAnbnVtYmVyJyA/IHZhbHVlMSA6IFN0cmluZyh2YWx1ZTEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBiID0gdHlwZW9mIHZhbHVlMiA9PT0gJ251bWJlcicgPyB2YWx1ZTIgOiBTdHJpbmcodmFsdWUyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGEgPiBiID8gMSAqIGZsaXAgOiBiID4gYSA/IC0xICogZmxpcCA6IDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0YWJsZUZpbHRlcmVkLnNsaWNlKCkuc29ydChjb21wYXJlRm4pO1xuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyRXZlbnQoKTogJ2NoYW5nZScgfCAnaW5wdXQnIHtcbiAgICByZXR1cm4gKHR5cGVvZiB0aGlzLnRhYmxlRmlsdGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLnRhYmxlRmlsdGVyLmxhenkpID8gJ2NoYW5nZScgOiAnaW5wdXQnO1xuICB9O1xuXG4gIHByaXZhdGUgX2NvbHVtbkZpbHRlcmVkOiBJSXRlbUludGVybmFsW10gPSBbXTtcblxuICBnZXQgY29sdW1uRmlsdGVyZWQoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICBsZXQgX2l0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbHVtbkZpbHRlciA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHRoaXMuY29sdW1uRmlsdGVyLmV4dGVybmFsXG4gICAgKSB7XG4gICAgICB0aGlzLl9jb2x1bW5GaWx0ZXJlZCA9IF9pdGVtcztcbiAgICAgIHJldHVybiBfaXRlbXM7XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sdW1uRmlsdGVyU3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBfaXRlbXMgPSBfaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB2YWx1ZShpdGVtW2tleV0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRDb2x1bW4/LmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBfaXRlbXMgPSBfaXRlbXMuZmlsdGVyKChpdGVtKSA9PiAodHlwZW9mIGN1cnJlbnRDb2x1bW4uZmlsdGVyID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnRDb2x1bW4uZmlsdGVyKGl0ZW0sIHZhbHVlKSkgPz8gIXZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2x1bW5GaWx0ZXIgPSBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY29sdW1uRmlsdGVyICYmIHRoaXMuaXRlbXNEYXRhQ29sdW1ucyQoKS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IFN0cmluZyhpdGVtW2tleV0pLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29sdW1uRmlsdGVyKSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICB0aGlzLl9jb2x1bW5GaWx0ZXJlZCA9IF9pdGVtcztcbiAgICByZXR1cm4gX2l0ZW1zO1xuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyZWQoKTogSUl0ZW1JbnRlcm5hbFtdIHtcbiAgICBsZXQgaXRlbXMgPSB0aGlzLmNvbHVtbkZpbHRlcmVkO1xuICAgIGlmIChcbiAgICAgICF0aGlzLnRhYmxlRmlsdGVyU3RhdGUgfHxcbiAgICAgICh0aGlzLnRhYmxlRmlsdGVyICYmIHR5cGVvZiB0aGlzLnRhYmxlRmlsdGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLnRhYmxlRmlsdGVyLmV4dGVybmFsKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlcikge1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyLmRpZmYoaXRlbXMpO1xuICAgICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnRhYmxlRmlsdGVyU3RhdGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB2YWx1ZUNvbnRhaW5GaWx0ZXIgPSAodmFsOiBhbnkpID0+IFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5pdGVtc0RhdGFDb2x1bW5zJCgpLmZpbmQoKGtleSkgPT4gdmFsdWVDb250YWluRmlsdGVyKGl0ZW1ba2V5XSkpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIuZGlmZihpdGVtcyk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGdldCBpc0ZpbHRlcmVkKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyU3RhdGUgfHwgdGhpcy5zb3J0ZXJWYWx1ZT8uY29sdW1uIHx8IE9iamVjdC52YWx1ZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1zKGl0ZW1zOiBJSXRlbVtdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBJSXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBfX19pZDogaXRlbVsnX19faWQnXSA/PyBpbmRleCB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiA8SUl0ZW1JbnRlcm5hbD5bXTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50OiB7IGNvbHVtbktleTogc3RyaW5nOyBpbmRleDogbnVtYmVyOyBvcmRlcj86IFNvcnRPcmRlcjsgfSkge1xuICAgIHRoaXMuaGFuZGxlU29ydGVyQ2hhbmdlKCRldmVudC5jb2x1bW5LZXksICRldmVudC5pbmRleCwgJGV2ZW50Lm9yZGVyKTtcbiAgfVxuXG4gIGlzU29ydGFibGUoaTogbnVtYmVyKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNEYXRhQ29sdW1uID0gdGhpcy5pdGVtc0RhdGFDb2x1bW5zJCgpLmluY2x1ZGVzKHRoaXMucmF3Q29sdW1uTmFtZXMkKClbaV0pO1xuICAgIGxldCBjb2x1bW47XG4gICAgaWYgKHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29sdW1uU29ydGVyICYmXG4gICAgICAoIXRoaXMuY29sdW1ucy5sZW5ndGggfHxcbiAgICAgICAgdHlwZW9mIGNvbHVtbiAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgKHR5cGVvZiBjb2x1bW4gPT09ICdvYmplY3QnICYmICh0eXBlb2YgY29sdW1uLnNvcnRlciA9PT0gJ3VuZGVmaW5lZCcgfHwgY29sdW1uLnNvcnRlcikpXG4gICAgICApICYmIGlzRGF0YUNvbHVtblxuICAgICk7XG4gIH1cblxuICBoYW5kbGVTb3J0ZXJDaGFuZ2UoY29sdW1uOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG9yZGVyPzogU29ydE9yZGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU29ydGFibGUoaW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vaWYgY29sdW1uIGNoYW5nZWQgb3Igc29ydCB3YXMgZGVzY2VuZGluZyBjaGFuZ2UgYXNjIHRvIHRydWVcbiAgICBjb25zdCBzb3J0ZXJTdGF0ZSA9IHsgLi4udGhpcy5zb3J0ZXJWYWx1ZSB9O1xuXG4gICAgaWYgKHNvcnRlclN0YXRlLmNvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICBjb25zdCByZXNldHRhYmxlID0gKHR5cGVvZiB0aGlzLmNvbHVtblNvcnRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy5jb2x1bW5Tb3J0ZXIucmVzZXRhYmxlKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gc29ydGVyU3RhdGUuc3RhdGU7XG4gICAgICBpZiAob3JkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3J0ZXJTdGF0ZS5zdGF0ZSA9IHN0YXRlID09PSAwID8gJ2FzYycgOiBzdGF0ZSA9PT0gJ2FzYycgPyAnZGVzYycgOiByZXNldHRhYmxlID8gMCA6ICdhc2MnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ydGVyU3RhdGUuc3RhdGUgPSAob3JkZXIgPT09IDAgJiYgIXJlc2V0dGFibGUpID8gc3RhdGUgOiBvcmRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGVyU3RhdGUuY29sdW1uID0gY29sdW1uO1xuICAgICAgc29ydGVyU3RhdGUuc3RhdGUgPSAnYXNjJztcbiAgICB9XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHsgLi4uc29ydGVyU3RhdGUgfTtcbiAgfVxuXG4gIHNldEFjdGl2ZVBhZ2UoJGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSAkZXZlbnQ7XG4gIH1cblxuICBoYW5kbGVDb2x1bW5GaWx0ZXJDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IGNvbHVtbiwgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSwgW2Ake2NvbHVtbn1gXTogdmFsdWUgfTtcbiAgfVxuXG4gIGhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudDogeyB2YWx1ZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IH0pIHtcbiAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSAkZXZlbnQ7XG4gICAgY29uc3QgaXNMYXp5ID0gdHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoKChpc0xhenkgJiYgdHlwZSA9PT0gJ2lucHV0JykgfHwgKCFpc0xhenkgJiYgdHlwZSA9PT0gJ2NoYW5nZScpKSAmJiB2YWx1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgY2xlYW4oJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA9IHt9O1xuICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA9ICcnO1xuICAgIHRoaXMuc29ydGVyVmFsdWUgPSB7fTtcbiAgICB0aGlzLnRhYmxlRmlsdGVyZWQ7IC8vZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgfVxuXG4gIGhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9pdGVtc1BlclBhZ2UpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIHRoaXMuX2l0ZW1zUGVyUGFnZSA9IHZhbHVlO1xuICAgICAgdGhpcy5pdGVtc1BlclBhZ2VDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUm93Q2hlY2tlZCgkZXZlbnQ6IEV2ZW50LCBpdGVtOiBJSXRlbUludGVybmFsKSB7XG4gICAgaXRlbS5fc2VsZWN0ZWQgPSBpdGVtLl9zZWxlY3RhYmxlICE9PSBmYWxzZSAmJiAoJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSkpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGhhbmRsZVNlbGVjdEFsbENoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5pdGVtcy5tYXAoKGl0ZW06IElJdGVtSW50ZXJuYWwpID0+IHtcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9zZWxlY3RlZDogKGl0ZW0uX3NlbGVjdGFibGUgIT09IGZhbHNlID8gJGV2ZW50IDogISFpdGVtLl9zZWxlY3RlZCkgfTtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KCRldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCh0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEFsbCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBoYW5kbGVSb3dDbGljayhwYXJhbTogeyAkZXZlbnQ6IE1vdXNlRXZlbnQ7IGl0ZW06IElJdGVtSW50ZXJuYWw7IGk6IG51bWJlciB9KSB7XG4gICAgY29uc3QgeyAkZXZlbnQsIGl0ZW0sIGkgfSA9IHsgLi4ucGFyYW0gfTtcbiAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSB0aGlzLnJhd0NvbHVtbk5hbWVzJCgpO1xuICAgIGNvbnN0IHNlbGVjdGFibGUgPSB0aGlzLl9zZWxlY3RhYmxlO1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBnZXRDbGlja2VkQ29sdW1uTmFtZSh0YXJnZXQsIGNvbHVtbk5hbWVzLCBzZWxlY3RhYmxlKTtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbkZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlID0gY2hhbmdlc1snY29sdW1uRmlsdGVyVmFsdWUnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUgPz8ge30pLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UgPSBjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ107XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAoaXRlbXNQZXJQYWdlU2VsZWN0IHx8IHRhYmxlRmlsdGVyIHx8IGNsZWFuZXIgfHwgdGVtcGxhdGVzWyd0YWJsZUN1c3RvbUhlYWRlciddKSB7XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXktMiBteC0wXCI+XG4gICAgQGlmICh0YWJsZUZpbHRlcikge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVGaWx0ZXJUZW1wbGF0ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChjbGVhbmVyKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUNsZWFuZXJUZW1wbGF0ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXSB8fCB0YWJsZUN1c3RvbUhlYWRlclRlbXBsYXRlXCIgLz5cblxuICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVGaWx0ZXJUZW1wbGF0ZT5cbiAgICAgIEBpZiAodGFibGVGaWx0ZXIpIHtcbiAgICAgICAgPGMtc21hcnQtdGFibGUtZmlsdGVyXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtkZWxheV09XCIzMDBcIlxuICAgICAgICAgIFtmaWx0ZXJMYWJlbF09XCJ0YWJsZUZpbHRlckxhYmVsXCJcbiAgICAgICAgICBbZmlsdGVyUGxhY2Vob2xkZXJdPVwidGFibGVGaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgW29uRXZlbnRdPVwidGFibGVGaWx0ZXJFdmVudFwiXG4gICAgICAgICAgW3ZhbHVlXT1cInRhYmxlRmlsdGVyU3RhdGVcIlxuICAgICAgICAgIGNGaWx0ZXJJbnB1dFxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ2xlYW5lclRlbXBsYXRlPlxuICAgICAgQGlmIChjbGVhbmVyKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0ZpbHRlcmVkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J21zLTEnOiB0YWJsZUZpbHRlcn1cIlxuICAgICAgICAgIGNCdXR0b25cbiAgICAgICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlckljb25UZW1wbGF0ZVwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ3VzdG9tSGVhZGVyVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wIG1zLWF1dG9cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2N1c3RvbUhlYWRlcl1cIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG59XG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXG4gICAgICAgICBbYm9yZGVyQ29sb3JdPVwidGFibGVQcm9wcz8uYm9yZGVyQ29sb3JcIlxuICAgICAgICAgW2JvcmRlcmVkXT1cInRhYmxlUHJvcHM/LmJvcmRlcmVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbYm9yZGVybGVzc109XCJ0YWJsZVByb3BzPy5ib3JkZXJsZXNzID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtjYXB0aW9uXT1cInRhYmxlUHJvcHM/LmNhcHRpb25cIlxuICAgICAgICAgW2NvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtob3Zlcl09XCJ0YWJsZVByb3BzPy5ob3ZlciA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgW3Jlc3BvbnNpdmVdPVwidGFibGVQcm9wcz8ucmVzcG9uc2l2ZVwiXG4gICAgICAgICBbc21hbGxdPVwidGFibGVQcm9wcz8uc21hbGwgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtzdHJpcGVkXT1cInRhYmxlUHJvcHM/LnN0cmlwZWQgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIGNUYWJsZVxuICA+XG4gICAgQGlmIChoZWFkZXIpIHtcbiAgICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcbiAgICAgICAgKGNvbHVtbkZpbHRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzb3J0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICBbY0FsaWduXT1cInRhYmxlSGVhZFByb3BzPy5hbGlnblwiXG4gICAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVIZWFkUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVIZWFkUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgW2NvbHVtbkZpbHRlclN0YXRlXT1cImNvbHVtbkZpbHRlclN0YXRlXCJcbiAgICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgICBbY29sdW1uRmlsdGVyXT1cImNvbHVtbkZpbHRlclwiXG4gICAgICAgIFtjb2x1bW5Hcm91cHNdPVwiY29sdW1uR3JvdXBzJCgpXCJcbiAgICAgICAgW2NvbHVtbkxhYmVsVGVtcGxhdGVzXT1cImNvbHVtbkxhYmVsVGVtcGxhdGVzXCJcbiAgICAgICAgW2NvbHVtblNvcnRlcl09XCJjb2x1bW5Tb3J0ZXJcIlxuICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zJCgpXCJcbiAgICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxuICAgICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcbiAgICAgICAgW3NlbGVjdGVkQWxsXT1cIihzZWxlY3RlZEFsbFN1YmplY3QgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICBbc2hvd0dyb3Vwc109XCJzaG93R3JvdXBzJCgpXCJcbiAgICAgICAgW3NvcnRlclZhbHVlXT1cInNvcnRlclZhbHVlXCJcbiAgICAgIC8+XG4gICAgfVxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRib2R5RGVmYXVsdFRlbXBsYXRlXCIgLz5cblxuICAgIEBpZiAoc3VtbWFyeVJvd1RlbXBsYXRlICYmICFmb290ZXIpIHtcbiAgICAgIDx0Zm9vdD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdW1tYXJ5Um93VGVtcGxhdGVcIiAvPlxuICAgICAgPC90Zm9vdD5cbiAgICB9XG4gICAgQGlmIChmb290ZXIpIHtcbiAgICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcbiAgICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzb3J0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVTb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICBbY0FsaWduXT1cInRhYmxlRm9vdFByb3BzPy5hbGlnblwiXG4gICAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVGb290UHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVGb290UHJvcHM/LmNvbG9yXCJcbiAgICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgICBbY29sdW1uTGFiZWxUZW1wbGF0ZXNdPVwiY29sdW1uTGFiZWxUZW1wbGF0ZXNcIlxuICAgICAgICBbY29sdW1uU29ydGVyXT1cImNvbHVtblNvcnRlclwiXG4gICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnMkKClcIlxuICAgICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXG4gICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxuICAgICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXG4gICAgICAgIFtzdW1tYXJ5Um93VGVtcGxhdGVdPVwic3VtbWFyeVJvd1RlbXBsYXRlXCJcbiAgICAgICAgY29tcG9uZW50PVwidGZvb3RcIlxuICAgICAgLz5cbiAgICB9XG5cbiAgPC90YWJsZT5cbiAgQGlmIChsb2FkaW5nKSB7XG4gICAgPGMtZWxlbWVudC1jb3ZlclxuICAgICAgW2JvdW5kYXJpZXNdPVwiW1xuICAgICAgICB7IHNpZGVzOiBbJ3RvcCddLCBxdWVyeTogJ3RkJyB9LFxuICAgICAgICB7IHNpZGVzOiBbJ2JvdHRvbSddLCBxdWVyeTogJ3Rib2R5JyB9XG4gICAgICBdXCJcbiAgICAvPlxuICB9XG48L2Rpdj5cbkBpZiAocGFnaW5hdGlvbiB8fCBpdGVtc1BlclBhZ2VTZWxlY3QpIHtcbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgIEBpZiAocGFnaW5hdGlvbiAmJiBudW1iZXJPZlBhZ2VzID4gMSkge1xuICAgICAgICA8Yy1zbWFydC1wYWdpbmF0aW9uXG4gICAgICAgICAgKGFjdGl2ZVBhZ2VDaGFuZ2UpPVwic2V0QWN0aXZlUGFnZSgkZXZlbnQpXCJcbiAgICAgICAgICBbYWN0aXZlUGFnZV09XCJhY3RpdmVQYWdlXCJcbiAgICAgICAgICBbcGFnZXNdPVwibnVtYmVyT2ZQYWdlc1wiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG1zLWF1dG9cIj5cbiAgICAgIEBpZiAoaXRlbXNQZXJQYWdlU2VsZWN0KSB7XG4gICAgICAgIDxjLXNtYXJ0LXRhYmxlLWl0ZW1zLXBlci1wYWdlLXNlbGVjdG9yXG4gICAgICAgICAgKGl0ZW1zUGVyUGFnZUNoYW5nZSk9XCJoYW5kbGVJdGVtc1BlclBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zUGVyUGFnZUxhYmVsXT1cIml0ZW1zUGVyUGFnZUxhYmVsXCJcbiAgICAgICAgICBbaXRlbXNQZXJQYWdlT3B0aW9uc109XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgICBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuPG5nLXRlbXBsYXRlICN0Ym9keURlZmF1bHRUZW1wbGF0ZT5cbiAgPHRib2R5IFtjQWxpZ25dPVwidGFibGVCb2R5UHJvcHM/LmFsaWduXCJcbiAgICAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVCb2R5UHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlQm9keVByb3BzPy5jb2xvclwiXG4gID5cbiAgICBAZm9yIChpdGVtIG9mIGN1cnJlbnRJdGVtczsgdHJhY2sgaXRlbTsgbGV0IGkgPSAkaW5kZXgsIGNudCA9ICRjb3VudCwgaXNFdmVuID0gJGV2ZW4sIGlzT2RkID0gJG9kZCkge1xuICAgICAgPHRyIChjbGljayk9XCJoYW5kbGVSb3dDbGljayh7JGV2ZW50LCBpdGVtLCBpfSlcIlxuICAgICAgICAgIFtjQWxpZ25dPVwiaXRlbS5fcHJvcHM/LmFsaWduXCJcbiAgICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0uX3Byb3BzPy5hY3RpdmUgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICBbY1RhYmxlQ29sb3JdPVwiaXRlbS5fcHJvcHM/LmNvbG9yXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7Y3Vyc29yOiBjbGlja2FibGVSb3dzID8gJ3BvaW50ZXInIDogJ2F1dG8nfVwiXG4gICAgICAgICAgW3RhYmluZGV4XT1cImNsaWNrYWJsZVJvd3MgPyAwIDogLTFcIlxuICAgICAgPlxuICAgICAgICBAaWYgKHNlbGVjdGFibGUpIHtcbiAgICAgICAgICA8dGQgW2NBbGlnbl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWxpZ25cIlxuICAgICAgICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hY3RpdmUgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5jb2xvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwiaGFuZGxlUm93Q2hlY2tlZCgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpdGVtLl9zZWxlY3RlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIihpdGVtPy5fc2VsZWN0YWJsZSA9PT0gZmFsc2UpID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgIGNGb3JtQ2hlY2tJbnB1dFxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMkKCk7IHRyYWNrIGNvbHVtbjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEYXRhJ10gfHwgY29sdW1uRGVmYXVsdFRlbXBsYXRlOyBjb250ZXh0OiB7Y29sdW1uLCBpdGVtLCBjb2x1bW5OYW1lOiBnZXRDb2x1bW5LZXkoY29sdW1uKSwgdGRDb250ZW50OiBpdGVtW2NvbHVtbi5rZXldLCBjZWxsUHJvcHM6IGdldFRhYmxlRGF0YUNlbGxQcm9wcyhjb2x1bW4sIGl0ZW0pIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvdHI+XG4gICAgICBAaWYgKHRlbXBsYXRlc1sndGFibGVEZXRhaWxzJ10pIHtcbiAgICAgICAgPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIFtuZ1N0eWxlXT1cIntib3JkZXJCb3R0b21XaWR0aDogMH1cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJwLTBcIj5cbiAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCIgY2xhc3M9XCJwLTBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGV0YWlscyddOyBjb250ZXh0OiB7aXRlbSwgaW5kZXg6IGl9XCIgLz5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfVxuICAgIH1cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vSXRlbXNEZWZhdWx0VGVtcGxhdGVcIiAvPlxuICA8L3Rib2R5PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNjb2x1bW5EZWZhdWx0VGVtcGxhdGVcbiAgbGV0LWNlbGxQcm9wcz1cImNlbGxQcm9wc1wiXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIlxuICBsZXQtY29sdW1uTmFtZT1cImNvbHVtbk5hbWVcIlxuICBsZXQtaXRlbT1cIml0ZW1cIlxuICBsZXQtdGRDb250ZW50PVwidGRDb250ZW50XCJcbj5cbiAgQGlmICh0ZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIDx0ZCBbY0FsaWduXT1cImNlbGxQcm9wcz8uYWxpZ25cIlxuICAgICAgICBbY0h0bWxBdHRyXT1cImNlbGxQcm9wcz8uWydfYXR0cmlidXRlcyddID8/IHVuZGVmaW5lZFwiXG4gICAgICAgIFtjVGFibGVBY3RpdmVdPVwiY2VsbFByb3BzPy5bJ2FjdGl2ZSddXCJcbiAgICAgICAgW2NUYWJsZUNvbG9yXT1cImNlbGxQcm9wcz8uY29sb3IgPz8gY29sdW1uW2NvbHVtbk5hbWVdPy5fY29sUHJvcHM/LmNvbG9yID8/IHVuZGVmaW5lZFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldFRhYmxlRGF0YUNlbGxDbGFzcyhjb2x1bW4sIGl0ZW0pXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0VGFibGVEYXRhQ2VsbFN0eWxlcyhjb2x1bW4sIGl0ZW0pXCJcbiAgICA+XG4gICAgICB7eyB0ZENvbnRlbnQgfX1cbiAgICA8L3RkPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48IS0tPG5nLXRlbXBsYXRlICNyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtIGxldC1pbmRleD4tLT5cbjwhLS0gIDx0cj48dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwicC0wXCIgdGFiaW5kZXg9XCItMVwiIFtuZ1N0eWxlXT1cIntib3JkZXJCb3R0b21XaWR0aDogMH1cIj48L3RkPjwvdHI+LS0+XG48IS0tICA8dHIgY2xhc3M9XCJwLTBcIj4tLT5cbjwhLS0gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+LS0+XG48IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlcz8udGFibGVEZXRhaWxzXCI+PC9uZy1jb250YWluZXI+LS0+XG48IS0tICAgIDwvdGQ+LS0+XG48IS0tICA8L3RyPi0tPlxuPCEtLTwvbmctdGVtcGxhdGU+LS0+XG5cbjxuZy10ZW1wbGF0ZSAjbm9JdGVtc0RlZmF1bHRUZW1wbGF0ZT5cbiAgQGlmICghY3VycmVudEl0ZW1zLmxlbmd0aCkge1xuICAgIDx0cj5cbiAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+e3sgbm9JdGVtc0xhYmVsIH19PC90ZD5cbiAgICA8L3RyPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48IS0tdG9kbzogZmlsdGVySWNvbkN1c3RvbVRlbXBsYXRlLS0+XG48bmctdGVtcGxhdGUgI2ZpbHRlckljb25UZW1wbGF0ZT5cbiAgPHN2ZyBjbGFzcz1cImljb24gaWNvbi1jdXN0b20tc2l6ZVwiIHBvaW50ZXItZXZlbnRzPVwibm9uZVwiIHJvbGU9XCJpbWdcIiB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIlxuICAgICAgIHdpZHRoPVwiMThcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgPHBvbHlnb25cbiAgICAgIGNsYXNzPVwiY2ktcHJpbWFyeVwiXG4gICAgICBmaWxsPVwidmFyKC0tY2ktcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKVwiXG4gICAgICBwb2ludHM9XCI0MCAxNiA0MCA1My44MjggMTA5LjAyNCAxMzYgMTUwLjgxNSAxMzYgNzYuODk2IDQ4IDQ1OS41MSA0OCAzMDQgMjQyLjM4OCAzMDQgNDAxLjM3MyAyNDEuMzczIDQ2NCAyNDAgNDY0IDI0MCAzNjggMjA4IDM2OCAyMDggNDk2IDI1NC42MjcgNDk2IDMzNiA0MTQuNjI3IDMzNiAyNTMuNjEyIDQ5NiA1My42MTIgNDk2IDE2IDQwIDE2XCI+XG4gICAgPC9wb2x5Z29uPlxuICAgIDxwb2x5Z29uXG4gICAgICBjbGFzcz1cImNpLXByaW1hcnlcIlxuICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxuICAgICAgcG9pbnRzPVwiMTY2LjQwMyAyNDguMjI1IDIyNi44NjQgMTg3Ljc2MyAyMDQuMjM3IDE2NS4xMzUgMTQzLjc3NSAyMjUuNTk3IDgzLjMxMyAxNjUuMTM1IDYwLjY4NyAxODcuNzYzIDEyMS4xNDggMjQ4LjIyNSA2MC42ODcgMzA4LjY4NyA4My4zMTMgMzMxLjMxNCAxNDMuNzc1IDI3MC44NTIgMjA0LjIzNyAzMzEuMzE0IDIyNi44NjQgMzA4LjY4NyAxNjYuNDAzIDI0OC4yMjVcIj5cbiAgICA8L3BvbHlnb24+XG4gIDwvc3ZnPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, HostBinding, inject, Input } from '@angular/core';
2
- import { AsyncPipe, NgClass, NgIf } from '@angular/common';
2
+ import { AsyncPipe, NgClass } from '@angular/common';
3
3
  import { FormControlDirective, FormLabelDirective } from '../../form';
4
4
  import { FilterInputDirective } from './filter-input.directive';
5
5
  import * as i0 from "@angular/core";
@@ -25,11 +25,11 @@ export class SmartTableFilterComponent {
25
25
  }
26
26
  ;
27
27
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SmartTableFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: SmartTableFilterComponent, isStandalone: true, selector: "c-smart-table-filter", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", sizing: "sizing" }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "<label *ngIf=\"!!filterLabel\" [ngClass]=\"labelClasses\" cLabel=\"col\" class=\"col-auto\">\n {{ filterLabel }}\n</label>\n<div class=\"col-auto\">\n <input\n [placeholder]=\"filterPlaceholder\"\n [sizing]=\"sizing\"\n [value]=\"value$ | async\"\n autocomplete=\"off\"\n cFormControl\n size=\"10\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: FormControlDirective, selector: "input[cFormControl], textarea[cFormControl]", inputs: ["sizing", "valid", "type", "plaintext"] }, { kind: "directive", type: FormLabelDirective, selector: "[cLabel]", inputs: ["cLabel", "sizing"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.0", type: SmartTableFilterComponent, isStandalone: true, selector: "c-smart-table-filter", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", sizing: "sizing" }, host: { properties: { "class": "this.hostClasses" } }, ngImport: i0, template: "@if (!!filterLabel) {\n <label [ngClass]=\"labelClasses\" cLabel=\"col\" class=\"col-auto\">\n {{ filterLabel }}\n </label>\n}\n<div class=\"col-auto\">\n <input\n [placeholder]=\"filterPlaceholder\"\n [sizing]=\"sizing\"\n [value]=\"value$ | async\"\n autocomplete=\"off\"\n cFormControl\n size=\"10\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: FormControlDirective, selector: "input[cFormControl], textarea[cFormControl]", inputs: ["sizing", "valid", "type", "plaintext"] }, { kind: "directive", type: FormLabelDirective, selector: "[cLabel]", inputs: ["cLabel", "sizing"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29
29
  }
30
30
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SmartTableFilterComponent, decorators: [{
31
31
  type: Component,
32
- args: [{ selector: 'c-smart-table-filter', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormControlDirective, FormLabelDirective, NgClass, NgIf, AsyncPipe], template: "<label *ngIf=\"!!filterLabel\" [ngClass]=\"labelClasses\" cLabel=\"col\" class=\"col-auto\">\n {{ filterLabel }}\n</label>\n<div class=\"col-auto\">\n <input\n [placeholder]=\"filterPlaceholder\"\n [sizing]=\"sizing\"\n [value]=\"value$ | async\"\n autocomplete=\"off\"\n cFormControl\n size=\"10\"\n />\n</div>\n" }]
32
+ args: [{ selector: 'c-smart-table-filter', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormControlDirective, FormLabelDirective, NgClass, AsyncPipe], template: "@if (!!filterLabel) {\n <label [ngClass]=\"labelClasses\" cLabel=\"col\" class=\"col-auto\">\n {{ filterLabel }}\n </label>\n}\n<div class=\"col-auto\">\n <input\n [placeholder]=\"filterPlaceholder\"\n [sizing]=\"sizing\"\n [value]=\"value$ | async\"\n autocomplete=\"off\"\n cFormControl\n size=\"10\"\n />\n</div>\n" }]
33
33
  }], ctorParameters: () => [], propDecorators: { filterLabel: [{
34
34
  type: Input
35
35
  }], filterPlaceholder: [{
@@ -40,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImpor
40
40
  type: HostBinding,
41
41
  args: ['class']
42
42
  }] } });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvc21hcnQtdGFibGUvc21hcnQtdGFibGUtZmlsdGVyL3NtYXJ0LXRhYmxlLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLWZpbHRlci9zbWFydC10YWJsZS1maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBZ0JoRSxNQUFNLE9BQU8seUJBQXlCO0lBRXBDO1FBRVMsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckQsV0FBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFFM0MsZ0JBQVcsR0FBVyxTQUFTLENBQUM7UUFDaEMsc0JBQWlCLEdBQVcsUUFBUSxDQUFDO0lBTi9CLENBQUM7SUFFUCxxQkFBcUIsQ0FBZ0M7SUFPOUQsSUFDSSxXQUFXO1FBQ2IsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJO1lBQ1QsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU87WUFDTCxnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLENBQUMsa0JBQWtCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTTtTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUFBLENBQUM7OEdBeEJTLHlCQUF5QjtrR0FBekIseUJBQXlCLHlPQ3BCdEMsZ1ZBYUEsNENERlksb0JBQW9CLDBJQUFFLGtCQUFrQixtRkFBRSxPQUFPLG9GQUFFLElBQUksd0ZBQUUsU0FBUzs7MkZBU2pFLHlCQUF5QjtrQkFkckMsU0FBUzsrQkFDRSxzQkFBc0IsbUJBRWYsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQzt3REFnQnBFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFHRixXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBGb3JtQ29udHJvbERpcmVjdGl2ZSwgRm9ybUxhYmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZm9ybSc7XG5pbXBvcnQgeyBGaWx0ZXJJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vZmlsdGVyLWlucHV0LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Mtc21hcnQtdGFibGUtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LXRhYmxlLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRm9ybUNvbnRyb2xEaXJlY3RpdmUsIEZvcm1MYWJlbERpcmVjdGl2ZSwgTmdDbGFzcywgTmdJZiwgQXN5bmNQaXBlXVxuICAvLyBob3N0RGlyZWN0aXZlczogW1xuICAvLyAgIHtcbiAgLy8gICAgIGRpcmVjdGl2ZTogRmlsdGVySW5wdXREaXJlY3RpdmUsXG4gIC8vICAgICBpbnB1dHM6IFsndmFsdWUnLCAnZGVsYXknLCAnb25FdmVudCddLFxuICAvLyAgICAgb3V0cHV0czogWyd2YWx1ZUNoYW5nZSddXG4gIC8vICAgfVxuICAvLyBdXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0VGFibGVGaWx0ZXJDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICByZWFkb25seSAjZmlsdGVySW5wdXREaXJlY3RpdmUgPSBpbmplY3QoRmlsdGVySW5wdXREaXJlY3RpdmUpO1xuICByZWFkb25seSB2YWx1ZSQgPSB0aGlzLiNmaWx0ZXJJbnB1dERpcmVjdGl2ZS52YWx1ZSQ7XG5cbiAgQElucHV0KCkgZmlsdGVyTGFiZWw6IHN0cmluZyA9ICdGaWx0ZXI6JztcbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBzaXppbmc/OiAnc20nIHwgJ2xnJztcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdzogdHJ1ZSxcbiAgICAgICdtYi0yJzogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBnZXQgbGFiZWxDbGFzc2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnY29sLWZvcm0tbGFiZWwnOiB0cnVlLFxuICAgICAgW2Bjb2wtZm9ybS1sYWJlbC0ke3RoaXMuc2l6aW5nfWBdOiAhIXRoaXMuc2l6aW5nXG4gICAgfTtcbiAgfTtcbn1cbiIsIjxsYWJlbCAqbmdJZj1cIiEhZmlsdGVyTGFiZWxcIiBbbmdDbGFzc109XCJsYWJlbENsYXNzZXNcIiBjTGFiZWw9XCJjb2xcIiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gIHt7IGZpbHRlckxhYmVsIH19XG48L2xhYmVsPlxuPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gIDxpbnB1dFxuICAgIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgW3NpemluZ109XCJzaXppbmdcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZSQgfCBhc3luY1wiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICBjRm9ybUNvbnRyb2xcbiAgICBzaXplPVwiMTBcIlxuICAvPlxuPC9kaXY+XG4iXX0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvc21hcnQtdGFibGUvc21hcnQtdGFibGUtZmlsdGVyL3NtYXJ0LXRhYmxlLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLWZpbHRlci9zbWFydC10YWJsZS1maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFnQmhFLE1BQU0sT0FBTyx5QkFBeUI7SUFFcEM7UUFFUywwQkFBcUIsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxXQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztRQUUzQyxnQkFBVyxHQUFXLFNBQVMsQ0FBQztRQUNoQyxzQkFBaUIsR0FBVyxRQUFRLENBQUM7SUFOL0IsQ0FBQztJQUVQLHFCQUFxQixDQUFnQztJQU85RCxJQUNJLFdBQVc7UUFDYixPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTztZQUNMLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO1NBQ2pELENBQUM7SUFDSixDQUFDO0lBQUEsQ0FBQzs4R0F4QlMseUJBQXlCO2tHQUF6Qix5QkFBeUIseU9DcEJ0Qyx3VkFlQSw0Q0RKWSxvQkFBb0IsMElBQUUsa0JBQWtCLG1GQUFFLE9BQU8sK0VBQUUsU0FBUzs7MkZBUzNELHlCQUF5QjtrQkFkckMsU0FBUzsrQkFDRSxzQkFBc0IsbUJBRWYsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO3dEQWdCOUQsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdGLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIGluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IEZvcm1Db250cm9sRGlyZWN0aXZlLCBGb3JtTGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9mb3JtJztcbmltcG9ydCB7IEZpbHRlcklucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9maWx0ZXItaW5wdXQuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1zbWFydC10YWJsZS1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtdGFibGUtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtGb3JtQ29udHJvbERpcmVjdGl2ZSwgRm9ybUxhYmVsRGlyZWN0aXZlLCBOZ0NsYXNzLCBBc3luY1BpcGVdXG4gIC8vIGhvc3REaXJlY3RpdmVzOiBbXG4gIC8vICAge1xuICAvLyAgICAgZGlyZWN0aXZlOiBGaWx0ZXJJbnB1dERpcmVjdGl2ZSxcbiAgLy8gICAgIGlucHV0czogWyd2YWx1ZScsICdkZWxheScsICdvbkV2ZW50J10sXG4gIC8vICAgICBvdXRwdXRzOiBbJ3ZhbHVlQ2hhbmdlJ11cbiAgLy8gICB9XG4gIC8vIF1cbn0pXG5leHBvcnQgY2xhc3MgU21hcnRUYWJsZUZpbHRlckNvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHJlYWRvbmx5ICNmaWx0ZXJJbnB1dERpcmVjdGl2ZSA9IGluamVjdChGaWx0ZXJJbnB1dERpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IHZhbHVlJCA9IHRoaXMuI2ZpbHRlcklucHV0RGlyZWN0aXZlLnZhbHVlJDtcblxuICBASW5wdXQoKSBmaWx0ZXJMYWJlbDogc3RyaW5nID0gJ0ZpbHRlcjonO1xuICBASW5wdXQoKSBmaWx0ZXJQbGFjZWhvbGRlcjogc3RyaW5nID0gJ0ZpbHRlcic7XG4gIEBJbnB1dCgpIHNpemluZz86ICdzbScgfCAnbGcnO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgcm93OiB0cnVlLFxuICAgICAgJ21iLTInOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIGdldCBsYWJlbENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdjb2wtZm9ybS1sYWJlbCc6IHRydWUsXG4gICAgICBbYGNvbC1mb3JtLWxhYmVsLSR7dGhpcy5zaXppbmd9YF06ICEhdGhpcy5zaXppbmdcbiAgICB9O1xuICB9O1xufVxuIiwiQGlmICghIWZpbHRlckxhYmVsKSB7XG4gIDxsYWJlbCBbbmdDbGFzc109XCJsYWJlbENsYXNzZXNcIiBjTGFiZWw9XCJjb2xcIiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAge3sgZmlsdGVyTGFiZWwgfX1cbiAgPC9sYWJlbD5cbn1cbjxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxuICA8aW5wdXRcbiAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyUGxhY2Vob2xkZXJcIlxuICAgIFtzaXppbmddPVwic2l6aW5nXCJcbiAgICBbdmFsdWVdPVwidmFsdWUkIHwgYXN5bmNcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgY0Zvcm1Db250cm9sXG4gICAgc2l6ZT1cIjEwXCJcbiAgLz5cbjwvZGl2PlxuIl19