@sapphire-ion/framework 1.2.57 → 1.2.58

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 (83) hide show
  1. package/esm2022/lib/components/carousel/carousel-image/carousel-image.component.mjs +3 -3
  2. package/esm2022/lib/components/carousel/carousel-item/carousel-item.component.mjs +3 -3
  3. package/esm2022/lib/components/carousel/carousel.component.mjs +3 -3
  4. package/esm2022/lib/components/carousel/carousel.module.mjs +4 -4
  5. package/esm2022/lib/components/carousel/i-carousel-item.component.mjs +3 -3
  6. package/esm2022/lib/components/content-block/content-block.component.mjs +3 -3
  7. package/esm2022/lib/components/default/default-list/abstract-list.mjs +3 -3
  8. package/esm2022/lib/components/default/default-list/default-list.component.mjs +3 -3
  9. package/esm2022/lib/components/default/default-list/header-list/header-list.component.mjs +3 -3
  10. package/esm2022/lib/components/default/default-list/list.mjs +3 -3
  11. package/esm2022/lib/components/default/default-pagination/default-pagination.component.mjs +3 -3
  12. package/esm2022/lib/components/default/default-table/default-table.component.mjs +5 -5
  13. package/esm2022/lib/components/default/default-table/th-filter/th-filter.component.mjs +3 -3
  14. package/esm2022/lib/components/default/default-view/abstract-view.mjs +3 -3
  15. package/esm2022/lib/components/default/default-view/default-view.component.mjs +3 -3
  16. package/esm2022/lib/components/default/default-view/header-view/header-view.component.mjs +3 -3
  17. package/esm2022/lib/components/default/default-view/view.mjs +3 -3
  18. package/esm2022/lib/components/default/default.module.mjs +4 -4
  19. package/esm2022/lib/components/default-page/default.page.mjs +3 -3
  20. package/esm2022/lib/components/drag-drop-file/drag-drop-file.directive.mjs +3 -3
  21. package/esm2022/lib/components/drag-drop-file/drag-drop-file.module.mjs +4 -4
  22. package/esm2022/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.mjs +3 -3
  23. package/esm2022/lib/components/drawer/default-drawer-end/default-drawer-end.component.mjs +3 -3
  24. package/esm2022/lib/components/drawer/drawer-group/drawer-group.component.mjs +3 -3
  25. package/esm2022/lib/components/drawer/drawer.component.mjs +3 -3
  26. package/esm2022/lib/components/filter/filter.component.mjs +3 -3
  27. package/esm2022/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.mjs +3 -3
  28. package/esm2022/lib/components/image/image.component.mjs +3 -3
  29. package/esm2022/lib/components/info-popover/info-popover.component.mjs +3 -3
  30. package/esm2022/lib/components/inputs/custom-input.mjs +3 -3
  31. package/esm2022/lib/components/inputs/input-bool/input-bool.component.mjs +3 -3
  32. package/esm2022/lib/components/inputs/input-cep/input-cep.component.mjs +3 -3
  33. package/esm2022/lib/components/inputs/input-color/input-color.component.mjs +3 -3
  34. package/esm2022/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.mjs +3 -3
  35. package/esm2022/lib/components/inputs/input-date/input-date.component.mjs +3 -3
  36. package/esm2022/lib/components/inputs/input-decimal/input-decimal.component.mjs +3 -3
  37. package/esm2022/lib/components/inputs/input-file/download-button/download-button.component.mjs +3 -3
  38. package/esm2022/lib/components/inputs/input-file/input-file.component.mjs +3 -3
  39. package/esm2022/lib/components/inputs/input-icon/input-icon.component.mjs +3 -3
  40. package/esm2022/lib/components/inputs/input-select/directives/sion-label-template.directive.mjs +3 -3
  41. package/esm2022/lib/components/inputs/input-select/directives/sion-option-template.directive.mjs +3 -3
  42. package/esm2022/lib/components/inputs/input-select/directives/sion-placeholder-template.directive.mjs +3 -3
  43. package/esm2022/lib/components/inputs/input-select/input-select.component.mjs +3 -3
  44. package/esm2022/lib/components/inputs/input-string/input-string.component.mjs +3 -3
  45. package/esm2022/lib/components/inputs/input-telefone/input-telefone.component.mjs +3 -3
  46. package/esm2022/lib/components/inputs/input-textarea/input-textarea.component.mjs +3 -3
  47. package/esm2022/lib/components/inputs/inputs.module.mjs +4 -4
  48. package/esm2022/lib/components/loading/loading.component.mjs +3 -3
  49. package/esm2022/lib/components/login/login-admin/login-admin.component.mjs +3 -3
  50. package/esm2022/lib/components/login/login.component.mjs +3 -3
  51. package/esm2022/lib/components/main-content/main-content.component.mjs +3 -3
  52. package/esm2022/lib/components/popover/sion-popover/sion-popover.component.mjs +3 -3
  53. package/esm2022/lib/components/popover/sion-popover.module.mjs +4 -4
  54. package/esm2022/lib/components/sion-card/sion-card.component.mjs +3 -3
  55. package/esm2022/lib/components/stepper/step/step.component.mjs +3 -3
  56. package/esm2022/lib/components/stepper/stepper.component.mjs +3 -3
  57. package/esm2022/lib/components/stepper/stepper.module.mjs +4 -4
  58. package/esm2022/lib/components/tabs/tab/tab.component.mjs +3 -3
  59. package/esm2022/lib/components/tabs/tabs/tabs.component.mjs +3 -3
  60. package/esm2022/lib/components/tabs/tabs.module.mjs +4 -4
  61. package/esm2022/lib/components/text-tooltip/text-tooltip.component.mjs +3 -3
  62. package/esm2022/lib/components/tooltip/tooltip.component.mjs +3 -3
  63. package/esm2022/lib/core.module.mjs +4 -4
  64. package/esm2022/lib/directives/ng-var.directive.mjs +3 -3
  65. package/esm2022/lib/guards/auth.guard.mjs +3 -3
  66. package/esm2022/lib/guards/error.interceptor.mjs +3 -3
  67. package/esm2022/lib/guards/token.interceptor.mjs +3 -3
  68. package/esm2022/lib/pipes/secure.pipe.mjs +3 -3
  69. package/esm2022/lib/services/auth.service.mjs +3 -3
  70. package/esm2022/lib/services/environment.service.mjs +3 -3
  71. package/esm2022/lib/services/generic.service.mjs +3 -3
  72. package/esm2022/lib/services/modal-focus-trap.service.mjs +3 -3
  73. package/esm2022/lib/services/popover-focus-trap.service.mjs +3 -3
  74. package/esm2022/lib/services/route/route.provider.service.mjs +3 -3
  75. package/esm2022/lib/services/usuario.service.mjs +3 -3
  76. package/esm2022/lib/services/utils.service.mjs +3 -3
  77. package/esm2022/lib/services/web/api-url-provider.service.mjs +3 -3
  78. package/esm2022/lib/services/web/http.ativo.service.mjs +3 -3
  79. package/esm2022/lib/services/web/http.service.mjs +3 -3
  80. package/esm2022/lib/services/web/storage.service.mjs +3 -3
  81. package/fesm2022/sapphire-ion-framework.mjs +249 -249
  82. package/fesm2022/sapphire-ion-framework.mjs.map +1 -1
  83. package/package.json +1 -1
@@ -6,10 +6,10 @@ import * as i2 from "../../image/image.component";
6
6
  export class CarouselImageComponent extends ICarouselItem {
7
7
  constructor() { super(); }
8
8
  ngOnInit() { }
9
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CarouselImageComponent, selector: "carousel-image", inputs: { src: "src" }, providers: [{ provide: ICarouselItem, useExisting: CarouselImageComponent }], usesInheritance: true, ngImport: i0, template: "<image class=\"absolute top-0 left-0 block size-full default-transition rounded-xl\" fill=\"clear\" \r\n [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\" \r\n [src]=\"src\"\r\n></image>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }] }); }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CarouselImageComponent, selector: "carousel-image", inputs: { src: "src" }, providers: [{ provide: ICarouselItem, useExisting: CarouselImageComponent }], usesInheritance: true, ngImport: i0, template: "<image class=\"absolute top-0 left-0 block size-full default-transition rounded-xl\" fill=\"clear\" \r\n [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\" \r\n [src]=\"src\"\r\n></image>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }] }); }
11
11
  }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselImageComponent, decorators: [{
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselImageComponent, decorators: [{
13
13
  type: Component,
14
14
  args: [{ selector: 'carousel-image', providers: [{ provide: ICarouselItem, useExisting: CarouselImageComponent }], template: "<image class=\"absolute top-0 left-0 block size-full default-transition rounded-xl\" fill=\"clear\" \r\n [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\" \r\n [src]=\"src\"\r\n></image>" }]
15
15
  }], ctorParameters: () => [], propDecorators: { src: [{
@@ -5,10 +5,10 @@ import * as i1 from "@angular/common";
5
5
  export class CarouselItemComponent extends ICarouselItem {
6
6
  constructor() { super(); }
7
7
  ngOnInit() { }
8
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CarouselItemComponent, selector: "carousel-item", providers: [{ provide: ICarouselItem, useExisting: CarouselItemComponent }], usesInheritance: true, ngImport: i0, template: "<div class=\"absolute top-0 left-0 size-full default-transition rounded-xl\" [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\">\r\n <ng-content></ng-content>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CarouselItemComponent, selector: "carousel-item", providers: [{ provide: ICarouselItem, useExisting: CarouselItemComponent }], usesInheritance: true, ngImport: i0, template: "<div class=\"absolute top-0 left-0 size-full default-transition rounded-xl\" [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\">\r\n <ng-content></ng-content>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
10
10
  }
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselItemComponent, decorators: [{
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselItemComponent, decorators: [{
12
12
  type: Component,
13
13
  args: [{ selector: 'carousel-item', providers: [{ provide: ICarouselItem, useExisting: CarouselItemComponent }], template: "<div class=\"absolute top-0 left-0 size-full default-transition rounded-xl\" [ngClass]=\"{'opacity-20 -translate-x-full': carouselIndex() > index(), 'opacity-20 translate-x-full': carouselIndex() < index() }\">\r\n <ng-content></ng-content>\r\n</div>" }]
14
14
  }], ctorParameters: () => [] });
@@ -61,13 +61,13 @@ export class CarouselComponent {
61
61
  propagateChange(obj) { this.onChange(obj); this.change.emit(obj); ; }
62
62
  registerOnChange(fn) { this.onChange = fn; }
63
63
  registerOnTouched(fn) { this.onTouch = fn; }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CarouselComponent, selector: "carousel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { blur: "blur", change: "change" }, providers: [{ provide: NG_VALUE_ACCESSOR,
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CarouselComponent, selector: "carousel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { blur: "blur", change: "change" }, providers: [{ provide: NG_VALUE_ACCESSOR,
66
66
  useExisting: forwardRef(() => CarouselComponent),
67
67
  multi: true
68
68
  }], queries: [{ propertyName: "lst", predicate: ICarouselItem, isSignal: true }, { propertyName: "components", predicate: ICarouselItem }], ngImport: i0, template: "<ion-card class=\"size-full m-0\">\r\n <ion-card-content class=\"size-full p-0 relative\">\r\n <ng-content></ng-content>\r\n\r\n <ion-button color=\"dark\" size=\"small\" class=\"absolute backdrop-blur-sm w-3 h-10 top-0 bottom-0 my-auto left-0 ml-2 default-transition\" [disabled]=\"index() == 0\" [ngClass]=\"{'opacity-0': index() == 0}\" style=\"--border-radius: .5rem;\" (click)=\"IndexDown()\">\r\n <ion-icon slot=\"icon-only\" name=\"chevron-back\"></ion-icon>\r\n </ion-button>\r\n <ion-button color=\"dark\" size=\"small\" class=\"absolute backdrop-blur-sm w-3 h-10 top-0 bottom-0 my-auto right-0 mr-2 default-transition\" [disabled]=\" index() >= lst().length - 1\" [ngClass]=\"{'opacity-0': index() >= lst().length - 1}\" style=\"--border-radius: .5rem;\" (click)=\"IndexUp()\">\r\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\"></ion-icon>\r\n </ion-button>\r\n\r\n @if(lst().length){\r\n <div class=\"absolute left-0 bottom-0 h-8 w-full flex items-center justify-center\">\r\n <div class=\"bg-dark/50 h-3 rounded-full flex items-center justify-center default-transition gap-0.5 p-0.5\">\r\n @for (item of lst(); track $index) {\r\n <div class=\"bg-light cursor-pointer border border-light/40 h-full aspect-square rounded-full backdrop-blur-sm default-transition\" (click)=\"SetIndex($index)\" [ngClass]=\"{'bg-dark': $index != index()}\"></div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ion-card-content>\r\n</ion-card>", styles: ["ion-button::part(native){background:color-mix(in srgb,var(--ion-color-dark) 30%,transparent)}ion-button::part(native):after{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}ion-button::part(native):after:hover{background:color-mix(in srgb,var(--ion-color-dark) 50%,transparent)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
69
69
  }
70
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselComponent, decorators: [{
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, decorators: [{
71
71
  type: Component,
72
72
  args: [{ selector: 'carousel', providers: [{ provide: NG_VALUE_ACCESSOR,
73
73
  useExisting: forwardRef(() => CarouselComponent),
@@ -8,15 +8,15 @@ import { ImageComponent } from '../image/image.component';
8
8
  import * as i0 from "@angular/core";
9
9
  const lstComponents = [CarouselComponent, CarouselImageComponent, CarouselItemComponent];
10
10
  export class CarouselModule {
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: CarouselModule, declarations: [CarouselComponent, CarouselImageComponent, CarouselItemComponent], imports: [CommonModule,
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: CarouselModule, declarations: [CarouselComponent, CarouselImageComponent, CarouselItemComponent], imports: [CommonModule,
13
13
  IonicModule,
14
14
  ImageComponent], exports: [CarouselComponent, CarouselImageComponent, CarouselItemComponent] }); }
15
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselModule, imports: [CommonModule,
15
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselModule, imports: [CommonModule,
16
16
  IonicModule,
17
17
  ImageComponent] }); }
18
18
  }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CarouselModule, decorators: [{
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselModule, decorators: [{
20
20
  type: NgModule,
21
21
  args: [{
22
22
  declarations: [...lstComponents],
@@ -6,10 +6,10 @@ export class ICarouselItem {
6
6
  this.carouselIndex = signal(0);
7
7
  this.value = model(undefined);
8
8
  }
9
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ICarouselItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ICarouselItem, selector: "ng-component", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: '', isInline: true }); }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ICarouselItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: ICarouselItem, selector: "ng-component", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: '', isInline: true }); }
11
11
  }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ICarouselItem, decorators: [{
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ICarouselItem, decorators: [{
13
13
  type: Component,
14
14
  args: [{ template: '' }]
15
15
  }] });
@@ -13,10 +13,10 @@ export class ContentBlockComponent {
13
13
  this.value = true;
14
14
  }
15
15
  ngOnInit() { }
16
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ContentBlockComponent, isStandalone: true, selector: "content-block", inputs: { text: "text", value: "value" }, ngImport: i0, template: "<div class=\"absolute top-0 left-0 size-full opacity-0 -z-50 default-transition -translate-y-12 flex items-center justify-center !translucid-background\" \r\n [ngClass]=\"{'!z-20 !opacity-100 !translate-y-0': value}\">\r\n <div class=\"w-full text-center h-16 flex items-center justify-center\">\r\n {{text}}\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContentBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ContentBlockComponent, isStandalone: true, selector: "content-block", inputs: { text: "text", value: "value" }, ngImport: i0, template: "<div class=\"absolute top-0 left-0 size-full opacity-0 -z-50 default-transition -translate-y-12 flex items-center justify-center !translucid-background\" \r\n [ngClass]=\"{'!z-20 !opacity-100 !translate-y-0': value}\">\r\n <div class=\"w-full text-center h-16 flex items-center justify-center\">\r\n {{text}}\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
18
18
  }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentBlockComponent, decorators: [{
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContentBlockComponent, decorators: [{
20
20
  type: Component,
21
21
  args: [{ standalone: true, imports: [CommonModule], selector: 'content-block', template: "<div class=\"absolute top-0 left-0 size-full opacity-0 -z-50 default-transition -translate-y-12 flex items-center justify-center !translucid-background\" \r\n [ngClass]=\"{'!z-20 !opacity-100 !translate-y-0': value}\">\r\n <div class=\"w-full text-center h-16 flex items-center justify-center\">\r\n {{text}}\r\n </div>\r\n</div>" }]
22
22
  }], ctorParameters: () => [], propDecorators: { text: [{
@@ -36,10 +36,10 @@ export class AbstractList {
36
36
  ];
37
37
  this.genericService.PresentAlert("Atenção!", "Tem certeza que deseja excluir o dado?", buttons);
38
38
  }
39
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AbstractList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AbstractList, selector: "ng-component", viewQueries: [{ propertyName: "DefaultList", first: true, predicate: ["defList"], descendants: true }], ngImport: i0, template: '', isInline: true, styles: [""] }); }
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AbstractList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AbstractList, selector: "ng-component", viewQueries: [{ propertyName: "DefaultList", first: true, predicate: ["defList"], descendants: true }], ngImport: i0, template: '', isInline: true, styles: [""] }); }
41
41
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AbstractList, decorators: [{
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AbstractList, decorators: [{
43
43
  type: Component,
44
44
  args: [{ template: '' }]
45
45
  }], propDecorators: { DefaultList: [{
@@ -61,10 +61,10 @@ export class DefaultListComponent extends List {
61
61
  async ngOnInit() {
62
62
  await super.ngOnInit();
63
63
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultListComponent, deps: [{ token: i0.ElementRef }, { token: i1.ActivatedRoute }, { token: i2.GenericService }], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DefaultListComponent, selector: "default-list", inputs: { noNew: "noNew", noPage: "noPage", noSearch: "noSearch", columnClass: "columnClass", columnStyle: "columnStyle", overrideNew: "overrideNew", noPagination: "noPagination", noBreadcrumbs: "noBreadcrumbs", itemPath: "itemPath" }, outputs: { onNewEmitter: "onNew", itemClick: "itemClick" }, queries: [{ propertyName: "acoesTemplate", first: true, predicate: ["tmpAcoes"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ion-content class=\"bg-transparent\">\r\n <div class=\"wrapper\" [ngClass]=\"{'!p-0 translucid-primary-background': nested}\">\r\n @if (!noBreadcrumbs) {\r\n <ion-breadcrumbs>\r\n <ion-breadcrumb [routerLink]=\"[service ? service.route : '']\" [replaceUrl]=\"true\">{{service.title}}</ion-breadcrumb>\r\n </ion-breadcrumbs>\r\n }\r\n <ion-card>\r\n <ion-card-header [ngClass]=\"{'!px-0 !pb-0': noNew && noPage && noSearch}\">\r\n <header-list \r\n [(limit)]=\"frm.limit\"\r\n [(search)]=\"frm.search\" \r\n [(page)]=\"frm.page\" \r\n [loading]=\"loading\" \r\n (refresh)=\"Refresh()\"\r\n [noNew]=\"noNew\"\r\n [noPage]=\"noPage\"\r\n [noSearch]=\"noSearch\"\r\n [overrideNew]=\"overrideNew\"\r\n (onNew)=\"onNewEmitter.emit()\"\r\n > \r\n <ng-content slot=\"start\" select=\"[slot=header-start]\"></ng-content>\r\n <ng-content slot=\"end\" select=\"[slot=header-end]\"></ng-content>\r\n </header-list>\r\n </ion-card-header>\r\n <ion-card-content>\r\n <ion-refresher slot=\"fixed\" class=\"z-20\" (ionRefresh)=\"Refresh($event)\">\r\n <ion-refresher-content></ion-refresher-content>\r\n </ion-refresher>\r\n <div class=\"size-full ion-content-scroll-host\">\r\n @if(frm){\r\n <default-table \r\n class=\"block size-full relative\" \r\n [ngClass]=\"{ 'translate-y-0' : !loading }\"\r\n [loading]=\"loading\"\r\n [items]=\"lstDados\" \r\n [total]=\"total\"\r\n [(limit)]=\"frm.limit\"\r\n [(page)]=\"frm.page\"\r\n [(ascending)]=\"frm.ascending\"\r\n [(orderByProperty)]=\"frm.orderByProperty\"\r\n [(filter)]=\"frm.filter\"\r\n (itemClick)=\"itemClick.emit($event)\"\r\n [itemPath]=\"itemPath\"\r\n [columnClass]=\"columnClass\"\r\n [columnStyle]=\"columnStyle\"\r\n [service]=\"service\"\r\n [acoesTemplate]=\"acoesTemplate\"\r\n (refresh)=\"Refresh();\"\r\n (ativar)=\"Ativar($event)\"\r\n [lstTableFields]=\"lstTableFields\"\r\n [noPagination]=\"noPagination\"\r\n >\r\n </default-table>\r\n }\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n </div>\r\n</ion-content>", styles: [""], dependencies: [{ kind: "component", type: i3.IonBreadcrumb, selector: "ion-breadcrumb", inputs: ["active", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "separator", "target"] }, { kind: "component", type: i3.IonBreadcrumbs, selector: "ion-breadcrumbs", inputs: ["color", "itemsAfterCollapse", "itemsBeforeCollapse", "maxItems", "mode"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "directive", type: i3.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.HeaderListComponent, selector: "header-list", inputs: ["limit", "page", "search", "loading", "link", "noNew", "noPage", "noSearch", "overrideNew"], outputs: ["limitChange", "pageChange", "searchChange", "refresh", "onNew"] }, { kind: "component", type: i6.DefaultTableComponent, selector: "default-table", inputs: ["acoesTemplate", "service", "total", "limit", "page", "orderByProperty", "ascending", "filter", "loading", "items", "lstTableFields", "noFilters", "columnClass", "columnStyle", "noPagination", "itemPath"], outputs: ["totalChange", "limitChange", "pageChange", "orderByPropertyChange", "ascendingChange", "filterChange", "ativar", "refresh", "loadingChange", "itemsChange", "lstTableFieldsChange", "itemClick"] }] }); }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultListComponent, deps: [{ token: i0.ElementRef }, { token: i1.ActivatedRoute }, { token: i2.GenericService }], target: i0.ɵɵFactoryTarget.Component }); }
65
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DefaultListComponent, selector: "default-list", inputs: { noNew: "noNew", noPage: "noPage", noSearch: "noSearch", columnClass: "columnClass", columnStyle: "columnStyle", overrideNew: "overrideNew", noPagination: "noPagination", noBreadcrumbs: "noBreadcrumbs", itemPath: "itemPath" }, outputs: { onNewEmitter: "onNew", itemClick: "itemClick" }, queries: [{ propertyName: "acoesTemplate", first: true, predicate: ["tmpAcoes"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ion-content class=\"bg-transparent\">\r\n <div class=\"wrapper\" [ngClass]=\"{'!p-0 translucid-primary-background': nested}\">\r\n @if (!noBreadcrumbs) {\r\n <ion-breadcrumbs>\r\n <ion-breadcrumb [routerLink]=\"[service ? service.route : '']\" [replaceUrl]=\"true\">{{service.title}}</ion-breadcrumb>\r\n </ion-breadcrumbs>\r\n }\r\n <ion-card>\r\n <ion-card-header [ngClass]=\"{'!px-0 !pb-0': noNew && noPage && noSearch}\">\r\n <header-list \r\n [(limit)]=\"frm.limit\"\r\n [(search)]=\"frm.search\" \r\n [(page)]=\"frm.page\" \r\n [loading]=\"loading\" \r\n (refresh)=\"Refresh()\"\r\n [noNew]=\"noNew\"\r\n [noPage]=\"noPage\"\r\n [noSearch]=\"noSearch\"\r\n [overrideNew]=\"overrideNew\"\r\n (onNew)=\"onNewEmitter.emit()\"\r\n > \r\n <ng-content slot=\"start\" select=\"[slot=header-start]\"></ng-content>\r\n <ng-content slot=\"end\" select=\"[slot=header-end]\"></ng-content>\r\n </header-list>\r\n </ion-card-header>\r\n <ion-card-content>\r\n <ion-refresher slot=\"fixed\" class=\"z-20\" (ionRefresh)=\"Refresh($event)\">\r\n <ion-refresher-content></ion-refresher-content>\r\n </ion-refresher>\r\n <div class=\"size-full ion-content-scroll-host\">\r\n @if(frm){\r\n <default-table \r\n class=\"block size-full relative\" \r\n [ngClass]=\"{ 'translate-y-0' : !loading }\"\r\n [loading]=\"loading\"\r\n [items]=\"lstDados\" \r\n [total]=\"total\"\r\n [(limit)]=\"frm.limit\"\r\n [(page)]=\"frm.page\"\r\n [(ascending)]=\"frm.ascending\"\r\n [(orderByProperty)]=\"frm.orderByProperty\"\r\n [(filter)]=\"frm.filter\"\r\n (itemClick)=\"itemClick.emit($event)\"\r\n [itemPath]=\"itemPath\"\r\n [columnClass]=\"columnClass\"\r\n [columnStyle]=\"columnStyle\"\r\n [service]=\"service\"\r\n [acoesTemplate]=\"acoesTemplate\"\r\n (refresh)=\"Refresh();\"\r\n (ativar)=\"Ativar($event)\"\r\n [lstTableFields]=\"lstTableFields\"\r\n [noPagination]=\"noPagination\"\r\n >\r\n </default-table>\r\n }\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n </div>\r\n</ion-content>", styles: [""], dependencies: [{ kind: "component", type: i3.IonBreadcrumb, selector: "ion-breadcrumb", inputs: ["active", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "separator", "target"] }, { kind: "component", type: i3.IonBreadcrumbs, selector: "ion-breadcrumbs", inputs: ["color", "itemsAfterCollapse", "itemsBeforeCollapse", "maxItems", "mode"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "directive", type: i3.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.HeaderListComponent, selector: "header-list", inputs: ["limit", "page", "search", "loading", "link", "noNew", "noPage", "noSearch", "overrideNew"], outputs: ["limitChange", "pageChange", "searchChange", "refresh", "onNew"] }, { kind: "component", type: i6.DefaultTableComponent, selector: "default-table", inputs: ["acoesTemplate", "service", "total", "limit", "page", "orderByProperty", "ascending", "filter", "loading", "items", "lstTableFields", "noFilters", "columnClass", "columnStyle", "noPagination", "itemPath"], outputs: ["totalChange", "limitChange", "pageChange", "orderByPropertyChange", "ascendingChange", "filterChange", "ativar", "refresh", "loadingChange", "itemsChange", "lstTableFieldsChange", "itemClick"] }] }); }
66
66
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultListComponent, decorators: [{
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultListComponent, decorators: [{
68
68
  type: Component,
69
69
  args: [{ selector: 'default-list', template: "<ion-content class=\"bg-transparent\">\r\n <div class=\"wrapper\" [ngClass]=\"{'!p-0 translucid-primary-background': nested}\">\r\n @if (!noBreadcrumbs) {\r\n <ion-breadcrumbs>\r\n <ion-breadcrumb [routerLink]=\"[service ? service.route : '']\" [replaceUrl]=\"true\">{{service.title}}</ion-breadcrumb>\r\n </ion-breadcrumbs>\r\n }\r\n <ion-card>\r\n <ion-card-header [ngClass]=\"{'!px-0 !pb-0': noNew && noPage && noSearch}\">\r\n <header-list \r\n [(limit)]=\"frm.limit\"\r\n [(search)]=\"frm.search\" \r\n [(page)]=\"frm.page\" \r\n [loading]=\"loading\" \r\n (refresh)=\"Refresh()\"\r\n [noNew]=\"noNew\"\r\n [noPage]=\"noPage\"\r\n [noSearch]=\"noSearch\"\r\n [overrideNew]=\"overrideNew\"\r\n (onNew)=\"onNewEmitter.emit()\"\r\n > \r\n <ng-content slot=\"start\" select=\"[slot=header-start]\"></ng-content>\r\n <ng-content slot=\"end\" select=\"[slot=header-end]\"></ng-content>\r\n </header-list>\r\n </ion-card-header>\r\n <ion-card-content>\r\n <ion-refresher slot=\"fixed\" class=\"z-20\" (ionRefresh)=\"Refresh($event)\">\r\n <ion-refresher-content></ion-refresher-content>\r\n </ion-refresher>\r\n <div class=\"size-full ion-content-scroll-host\">\r\n @if(frm){\r\n <default-table \r\n class=\"block size-full relative\" \r\n [ngClass]=\"{ 'translate-y-0' : !loading }\"\r\n [loading]=\"loading\"\r\n [items]=\"lstDados\" \r\n [total]=\"total\"\r\n [(limit)]=\"frm.limit\"\r\n [(page)]=\"frm.page\"\r\n [(ascending)]=\"frm.ascending\"\r\n [(orderByProperty)]=\"frm.orderByProperty\"\r\n [(filter)]=\"frm.filter\"\r\n (itemClick)=\"itemClick.emit($event)\"\r\n [itemPath]=\"itemPath\"\r\n [columnClass]=\"columnClass\"\r\n [columnStyle]=\"columnStyle\"\r\n [service]=\"service\"\r\n [acoesTemplate]=\"acoesTemplate\"\r\n (refresh)=\"Refresh();\"\r\n (ativar)=\"Ativar($event)\"\r\n [lstTableFields]=\"lstTableFields\"\r\n [noPagination]=\"noPagination\"\r\n >\r\n </default-table>\r\n }\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n </div>\r\n</ion-content>" }]
70
70
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ActivatedRoute }, { type: i2.GenericService }], propDecorators: { noNew: [{
@@ -55,10 +55,10 @@ export class HeaderListComponent {
55
55
  $event.preventDefault();
56
56
  }
57
57
  }
58
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HeaderListComponent, deps: [{ token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
59
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HeaderListComponent, selector: "header-list", inputs: { limit: "limit", page: "page", search: "search", loading: "loading", link: "link", noNew: "noNew", noPage: "noPage", noSearch: "noSearch", overrideNew: "overrideNew" }, outputs: { limitChange: "limitChange", pageChange: "pageChange", searchChange: "searchChange", refreshEmitter: "refresh", onNewEmitter: "onNew" }, host: { listeners: { "window:keydown": "onKeyPress($event)" } }, ngImport: i0, template: "<div class=\"flex flex-wrap w-full gap-2\">\r\n @if (!noPage) {\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:w-48 portrait:order-1\">\r\n <ion-item class=\"rounded-2xl w-full h-full translucid-border\" lines=\"full\" style=\"--border-radius: 1rem !important; --background: transparent\" >\r\n <ion-select [disabled]=\"loading\" [(ngModel)]=\"limit\" (ionChange)=\"EmitLimit()\" interface=\"popover\">\r\n @for (limit of lstLimits; track limit) {\r\n <ion-select-option [value]=\"limit.value\">{{limit.label}}</ion-select-option>\r\n }\r\n </ion-select>\r\n </ion-item>\r\n </div>\r\n }\r\n \r\n <ng-content select=\"[slot=start]\"></ng-content>\r\n\r\n @if(!noSearch) {\r\n <div class=\"portrait:basis-full portrait:order-3 grow flex items-center justify-center\">\r\n <ion-searchbar class=\"w-full min-h-0 p-0 m-0\" [debounce]=\"500\" [(ngModel)]=\"search\" (ionInput)=\"this.EmitSearch()\" [animated]=\"true\" placeholder=\"Pesquisar...\"></ion-searchbar>\r\n </div>\r\n }\r\n\r\n <ng-content select=\"[slot=end]\"></ng-content>\r\n\r\n @if(!noNew){\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:basis-24 portrait:order-2\">\r\n <ion-button [routerLink]=\"overrideNew ? null : [link]\" (click)=\"onNew()\" class=\"size-full m-0 rounded-2xl text-base\" size=\"small\" fill=\"clear\">\r\n <ion-icon name=\"add\" slot=\"start\"></ion-icon>\r\n <ion-text class=\"text-base\">Novo</ion-text>\r\n </ion-button>\r\n </div>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i2.IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "required", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: i2.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderListComponent, deps: [{ token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
59
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HeaderListComponent, selector: "header-list", inputs: { limit: "limit", page: "page", search: "search", loading: "loading", link: "link", noNew: "noNew", noPage: "noPage", noSearch: "noSearch", overrideNew: "overrideNew" }, outputs: { limitChange: "limitChange", pageChange: "pageChange", searchChange: "searchChange", refreshEmitter: "refresh", onNewEmitter: "onNew" }, host: { listeners: { "window:keydown": "onKeyPress($event)" } }, ngImport: i0, template: "<div class=\"flex flex-wrap w-full gap-2\">\r\n @if (!noPage) {\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:w-48 portrait:order-1\">\r\n <ion-item class=\"rounded-2xl w-full h-full translucid-border\" lines=\"full\" style=\"--border-radius: 1rem !important; --background: transparent\" >\r\n <ion-select [disabled]=\"loading\" [(ngModel)]=\"limit\" (ionChange)=\"EmitLimit()\" interface=\"popover\">\r\n @for (limit of lstLimits; track limit) {\r\n <ion-select-option [value]=\"limit.value\">{{limit.label}}</ion-select-option>\r\n }\r\n </ion-select>\r\n </ion-item>\r\n </div>\r\n }\r\n \r\n <ng-content select=\"[slot=start]\"></ng-content>\r\n\r\n @if(!noSearch) {\r\n <div class=\"portrait:basis-full portrait:order-3 grow flex items-center justify-center\">\r\n <ion-searchbar class=\"w-full min-h-0 p-0 m-0\" [debounce]=\"500\" [(ngModel)]=\"search\" (ionInput)=\"this.EmitSearch()\" [animated]=\"true\" placeholder=\"Pesquisar...\"></ion-searchbar>\r\n </div>\r\n }\r\n\r\n <ng-content select=\"[slot=end]\"></ng-content>\r\n\r\n @if(!noNew){\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:basis-24 portrait:order-2\">\r\n <ion-button [routerLink]=\"overrideNew ? null : [link]\" (click)=\"onNew()\" class=\"size-full m-0 rounded-2xl text-base\" size=\"small\" fill=\"clear\">\r\n <ion-icon name=\"add\" slot=\"start\"></ion-icon>\r\n <ion-text class=\"text-base\">Novo</ion-text>\r\n </ion-button>\r\n </div>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i2.IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "required", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: i2.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
60
60
  }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HeaderListComponent, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderListComponent, decorators: [{
62
62
  type: Component,
63
63
  args: [{ selector: 'header-list', template: "<div class=\"flex flex-wrap w-full gap-2\">\r\n @if (!noPage) {\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:w-48 portrait:order-1\">\r\n <ion-item class=\"rounded-2xl w-full h-full translucid-border\" lines=\"full\" style=\"--border-radius: 1rem !important; --background: transparent\" >\r\n <ion-select [disabled]=\"loading\" [(ngModel)]=\"limit\" (ionChange)=\"EmitLimit()\" interface=\"popover\">\r\n @for (limit of lstLimits; track limit) {\r\n <ion-select-option [value]=\"limit.value\">{{limit.label}}</ion-select-option>\r\n }\r\n </ion-select>\r\n </ion-item>\r\n </div>\r\n }\r\n \r\n <ng-content select=\"[slot=start]\"></ng-content>\r\n\r\n @if(!noSearch) {\r\n <div class=\"portrait:basis-full portrait:order-3 grow flex items-center justify-center\">\r\n <ion-searchbar class=\"w-full min-h-0 p-0 m-0\" [debounce]=\"500\" [(ngModel)]=\"search\" (ionInput)=\"this.EmitSearch()\" [animated]=\"true\" placeholder=\"Pesquisar...\"></ion-searchbar>\r\n </div>\r\n }\r\n\r\n <ng-content select=\"[slot=end]\"></ng-content>\r\n\r\n @if(!noNew){\r\n <div class=\"portrait:basis-[calc(50%-0.25rem)] landscape:basis-24 portrait:order-2\">\r\n <ion-button [routerLink]=\"overrideNew ? null : [link]\" (click)=\"onNew()\" class=\"size-full m-0 rounded-2xl text-base\" size=\"small\" fill=\"clear\">\r\n <ion-icon name=\"add\" slot=\"start\"></ion-icon>\r\n <ion-text class=\"text-base\">Novo</ion-text>\r\n </ion-button>\r\n </div>\r\n }\r\n</div>" }]
64
64
  }], ctorParameters: () => [{ type: i1.EnvironmentService }], propDecorators: { limit: [{
@@ -96,10 +96,10 @@ export class List {
96
96
  finally { }
97
97
  return;
98
98
  }
99
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: List, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: List, selector: "ng-component", inputs: { service: { classPropertyName: "service", publicName: "service", isSignal: false, isRequired: false, transformFunction: null }, preloadFilter: { classPropertyName: "preloadFilter", publicName: "preloadFilter", isSignal: true, isRequired: false, transformFunction: null }, loadFrom: { classPropertyName: "loadFrom", publicName: "loadFrom", isSignal: false, isRequired: false, transformFunction: null }, frm: { classPropertyName: "frm", publicName: "frm", isSignal: false, isRequired: false, transformFunction: null }, lstTableFields: { classPropertyName: "lstTableFields", publicName: "lstTableFields", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { preloadFilter: "preloadFilterChange", WillRefresh: "WillRefresh", DidRefresh: "DidRefresh" }, ngImport: i0, template: '', isInline: true, styles: [""] }); }
99
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: List, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
100
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: List, selector: "ng-component", inputs: { service: { classPropertyName: "service", publicName: "service", isSignal: false, isRequired: false, transformFunction: null }, preloadFilter: { classPropertyName: "preloadFilter", publicName: "preloadFilter", isSignal: true, isRequired: false, transformFunction: null }, loadFrom: { classPropertyName: "loadFrom", publicName: "loadFrom", isSignal: false, isRequired: false, transformFunction: null }, frm: { classPropertyName: "frm", publicName: "frm", isSignal: false, isRequired: false, transformFunction: null }, lstTableFields: { classPropertyName: "lstTableFields", publicName: "lstTableFields", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { preloadFilter: "preloadFilterChange", WillRefresh: "WillRefresh", DidRefresh: "DidRefresh" }, ngImport: i0, template: '', isInline: true, styles: [""] }); }
101
101
  }
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: List, decorators: [{
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: List, decorators: [{
103
103
  type: Component,
104
104
  args: [{ template: '' }]
105
105
  }], ctorParameters: () => [], propDecorators: { service: [{
@@ -96,10 +96,10 @@ export class DefaultPaginationComponent {
96
96
  EmitChange() {
97
97
  this.changeEmitter.emit();
98
98
  }
99
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultPaginationComponent, deps: [{ token: i1.GenericService }], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DefaultPaginationComponent, selector: "default-pagination", inputs: { _total: ["total", "_total"], _limit: ["limit", "_limit"], length: "length", loading: "loading", page: "page" }, outputs: { pageChange: "pageChange", changeEmitter: "change" }, ngImport: i0, template: "<div id=\"pagination\" class=\"flex items-center rounded-b-2xl p-2 portrait:flex-col\">\r\n <div class=\"w-full h-full items-center justify-start flex portrait:justify-center\">\r\n <ion-spinner [hidden]=\"!(loading && lstPages.length == 0)\"></ion-spinner>\r\n <ion-text [hidden]=\"loading && lstPages.length == 0\">\r\n <div class=\"flex\">\r\n Mostrando &nbsp;\r\n <ion-skeleton-text *ngIf=\"loading\" [animated]=\"true\" style=\"width: 2ch\"></ion-skeleton-text>\r\n <b *ngIf=\"!loading\">{{limit * page - limit + length}}</b> &nbsp;\r\n de \r\n @if (total != null) {\r\n <b>&nbsp; {{total}} &nbsp;</b> itens\r\n }\r\n @else{\r\n <b>&nbsp; - &nbsp; </b> itens\r\n }\r\n </div>\r\n </ion-text>\r\n </div>\r\n <div class=\"w-full h-full items-center justify-end flex portrait:justify-center\" *ngIf=\"total != null\">\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageSub()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == 1}\" name=\"chevron-back\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n <ion-spinner *ngIf=\"loading && lstPages.length == 0\"></ion-spinner>\r\n\r\n <button [disabled]=\"loading\" class=\"page\" *ngFor=\"let item of lstPages\" [ngClass]=\"{ 'selected' : page == item }\" (click)=\"SetPage(item)\"> {{item}} </button>\r\n\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageAdd()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == TotalPages }\" name=\"chevron-forward\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n @if (TotalPages > 5) {\r\n <button [disabled]=\"loading\" class=\"page\" [id]=\"pop_id\"><ion-icon name=\"search\"></ion-icon></button>\r\n <ion-popover [trigger]=\"pop_id\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content>\r\n <div class=\"grid grid-cols-10 pl-3\">\r\n <div class=\"col-span-8 pb-2\">\r\n <ion-input class=\"number-class\" [(ngModel)]=\"_page\" type=\"Number\" labelPlacement=\"stacked\" label=\"P\u00E1gina [Max. {{TotalPages}}]\"></ion-input>\r\n </div>\r\n <div class=\"col-span-2\">\r\n <ion-button [disabled]=\"loading\" class=\"size-full\" size=\"small\" (click)=\"SetPageManual()\" style=\"--border-radius: 0rem\">\r\n <ion-icon class=\"w-4 aspect-square\" slot=\"icon-only\" name=\"checkmark-circle\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n }\r\n </div>\r\n</div>", styles: ["#pagination{background-color:color-mix(in srgb,var(--ion-color-dark) 10%,var(--ion-color-light));color:var(--ion-color-step-700)}button.page{margin-left:.25rem;margin-right:.25rem;display:flex;height:1.5rem;min-width:1.5rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.375rem;border-width:1px;padding-left:.25rem;padding-right:.25rem;text-align:center;border:var(--ion-color-dark) solid 1px;color:var(--ion-color-dark);transition:all .25s}button.page:disabled{opacity:.75}button.page.selected{background-color:var(--ion-color-dark);color:var(--ion-color-dark-contrast)!important}\n"], dependencies: [{ kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.NumericValueAccessor, selector: "ion-input[type=number],ion-input-otp:not([type=text]),ion-range" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
99
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultPaginationComponent, deps: [{ token: i1.GenericService }], target: i0.ɵɵFactoryTarget.Component }); }
100
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DefaultPaginationComponent, selector: "default-pagination", inputs: { _total: ["total", "_total"], _limit: ["limit", "_limit"], length: "length", loading: "loading", page: "page" }, outputs: { pageChange: "pageChange", changeEmitter: "change" }, ngImport: i0, template: "<div id=\"pagination\" class=\"flex items-center rounded-b-2xl p-2 portrait:flex-col\">\r\n <div class=\"w-full h-full items-center justify-start flex portrait:justify-center\">\r\n <ion-spinner [hidden]=\"!(loading && lstPages.length == 0)\"></ion-spinner>\r\n <ion-text [hidden]=\"loading && lstPages.length == 0\">\r\n <div class=\"flex\">\r\n Mostrando &nbsp;\r\n <ion-skeleton-text *ngIf=\"loading\" [animated]=\"true\" style=\"width: 2ch\"></ion-skeleton-text>\r\n <b *ngIf=\"!loading\">{{limit * page - limit + length}}</b> &nbsp;\r\n de \r\n @if (total != null) {\r\n <b>&nbsp; {{total}} &nbsp;</b> itens\r\n }\r\n @else{\r\n <b>&nbsp; - &nbsp; </b> itens\r\n }\r\n </div>\r\n </ion-text>\r\n </div>\r\n <div class=\"w-full h-full items-center justify-end flex portrait:justify-center\" *ngIf=\"total != null\">\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageSub()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == 1}\" name=\"chevron-back\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n <ion-spinner *ngIf=\"loading && lstPages.length == 0\"></ion-spinner>\r\n\r\n <button [disabled]=\"loading\" class=\"page\" *ngFor=\"let item of lstPages\" [ngClass]=\"{ 'selected' : page == item }\" (click)=\"SetPage(item)\"> {{item}} </button>\r\n\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageAdd()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == TotalPages }\" name=\"chevron-forward\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n @if (TotalPages > 5) {\r\n <button [disabled]=\"loading\" class=\"page\" [id]=\"pop_id\"><ion-icon name=\"search\"></ion-icon></button>\r\n <ion-popover [trigger]=\"pop_id\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content>\r\n <div class=\"grid grid-cols-10 pl-3\">\r\n <div class=\"col-span-8 pb-2\">\r\n <ion-input class=\"number-class\" [(ngModel)]=\"_page\" type=\"Number\" labelPlacement=\"stacked\" label=\"P\u00E1gina [Max. {{TotalPages}}]\"></ion-input>\r\n </div>\r\n <div class=\"col-span-2\">\r\n <ion-button [disabled]=\"loading\" class=\"size-full\" size=\"small\" (click)=\"SetPageManual()\" style=\"--border-radius: 0rem\">\r\n <ion-icon class=\"w-4 aspect-square\" slot=\"icon-only\" name=\"checkmark-circle\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n }\r\n </div>\r\n</div>", styles: ["#pagination{background-color:color-mix(in srgb,var(--ion-color-dark) 10%,var(--ion-color-light));color:var(--ion-color-step-700)}button.page{margin-left:.25rem;margin-right:.25rem;display:flex;height:1.5rem;min-width:1.5rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.375rem;border-width:1px;padding-left:.25rem;padding-right:.25rem;text-align:center;border:var(--ion-color-dark) solid 1px;color:var(--ion-color-dark);transition:all .25s}button.page:disabled{opacity:.75}button.page.selected{background-color:var(--ion-color-dark);color:var(--ion-color-dark-contrast)!important}\n"], dependencies: [{ kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.NumericValueAccessor, selector: "ion-input[type=number],ion-input-otp:not([type=text]),ion-range" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
101
101
  }
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultPaginationComponent, decorators: [{
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultPaginationComponent, decorators: [{
103
103
  type: Component,
104
104
  args: [{ selector: 'default-pagination', template: "<div id=\"pagination\" class=\"flex items-center rounded-b-2xl p-2 portrait:flex-col\">\r\n <div class=\"w-full h-full items-center justify-start flex portrait:justify-center\">\r\n <ion-spinner [hidden]=\"!(loading && lstPages.length == 0)\"></ion-spinner>\r\n <ion-text [hidden]=\"loading && lstPages.length == 0\">\r\n <div class=\"flex\">\r\n Mostrando &nbsp;\r\n <ion-skeleton-text *ngIf=\"loading\" [animated]=\"true\" style=\"width: 2ch\"></ion-skeleton-text>\r\n <b *ngIf=\"!loading\">{{limit * page - limit + length}}</b> &nbsp;\r\n de \r\n @if (total != null) {\r\n <b>&nbsp; {{total}} &nbsp;</b> itens\r\n }\r\n @else{\r\n <b>&nbsp; - &nbsp; </b> itens\r\n }\r\n </div>\r\n </ion-text>\r\n </div>\r\n <div class=\"w-full h-full items-center justify-end flex portrait:justify-center\" *ngIf=\"total != null\">\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageSub()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == 1}\" name=\"chevron-back\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n <ion-spinner *ngIf=\"loading && lstPages.length == 0\"></ion-spinner>\r\n\r\n <button [disabled]=\"loading\" class=\"page\" *ngFor=\"let item of lstPages\" [ngClass]=\"{ 'selected' : page == item }\" (click)=\"SetPage(item)\"> {{item}} </button>\r\n\r\n <button class=\"flex items-center\" [disabled]=\"loading\" (click)=\"PageAdd()\">\r\n <ion-icon [ngClass]=\"{'opacity-20': page == TotalPages }\" name=\"chevron-forward\" class=\"cursor-pointer default transition\"></ion-icon>\r\n </button>\r\n\r\n @if (TotalPages > 5) {\r\n <button [disabled]=\"loading\" class=\"page\" [id]=\"pop_id\"><ion-icon name=\"search\"></ion-icon></button>\r\n <ion-popover [trigger]=\"pop_id\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content>\r\n <div class=\"grid grid-cols-10 pl-3\">\r\n <div class=\"col-span-8 pb-2\">\r\n <ion-input class=\"number-class\" [(ngModel)]=\"_page\" type=\"Number\" labelPlacement=\"stacked\" label=\"P\u00E1gina [Max. {{TotalPages}}]\"></ion-input>\r\n </div>\r\n <div class=\"col-span-2\">\r\n <ion-button [disabled]=\"loading\" class=\"size-full\" size=\"small\" (click)=\"SetPageManual()\" style=\"--border-radius: 0rem\">\r\n <ion-icon class=\"w-4 aspect-square\" slot=\"icon-only\" name=\"checkmark-circle\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n </div>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n }\r\n </div>\r\n</div>", styles: ["#pagination{background-color:color-mix(in srgb,var(--ion-color-dark) 10%,var(--ion-color-light));color:var(--ion-color-step-700)}button.page{margin-left:.25rem;margin-right:.25rem;display:flex;height:1.5rem;min-width:1.5rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.375rem;border-width:1px;padding-left:.25rem;padding-right:.25rem;text-align:center;border:var(--ion-color-dark) solid 1px;color:var(--ion-color-dark);transition:all .25s}button.page:disabled{opacity:.75}button.page.selected{background-color:var(--ion-color-dark);color:var(--ion-color-dark-contrast)!important}\n"] }]
105
105
  }], ctorParameters: () => [{ type: i1.GenericService }], propDecorators: { _total: [{
@@ -93,7 +93,7 @@ export class DefaultTableComponent {
93
93
  }
94
94
  SetLstRows() {
95
95
  this.lstRows = this.items().map(item => {
96
- return new DefaultTableRow(item, item['id'], this.GetColumns(item), this.columnClass() ? this.columnClass()('acoes', item) : '', this.columnStyle() ? this.columnStyle()('acoes', item) : '');
96
+ return new DefaultTableRow(item, item['id'], this.GetColumns(item), '', '');
97
97
  });
98
98
  }
99
99
  GetColumns(item) {
@@ -179,10 +179,10 @@ export class DefaultTableComponent {
179
179
  Ativar(id) {
180
180
  this.ativar.emit(id);
181
181
  }
182
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultTableComponent, deps: [{ token: i1.StorageService }, { token: i2.ActivatedRoute }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DefaultTableComponent, selector: "default-table", inputs: { acoesTemplate: { classPropertyName: "acoesTemplate", publicName: "acoesTemplate", isSignal: false, isRequired: false, transformFunction: null }, service: { classPropertyName: "service", publicName: "service", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, orderByProperty: { classPropertyName: "orderByProperty", publicName: "orderByProperty", isSignal: true, isRequired: false, transformFunction: null }, ascending: { classPropertyName: "ascending", publicName: "ascending", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, lstTableFields: { classPropertyName: "lstTableFields", publicName: "lstTableFields", isSignal: true, isRequired: false, transformFunction: null }, noFilters: { classPropertyName: "noFilters", publicName: "noFilters", isSignal: true, isRequired: false, transformFunction: null }, columnClass: { classPropertyName: "columnClass", publicName: "columnClass", isSignal: true, isRequired: false, transformFunction: null }, columnStyle: { classPropertyName: "columnStyle", publicName: "columnStyle", isSignal: true, isRequired: false, transformFunction: null }, noPagination: { classPropertyName: "noPagination", publicName: "noPagination", isSignal: true, isRequired: false, transformFunction: null }, itemPath: { classPropertyName: "itemPath", publicName: "itemPath", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { total: "totalChange", limit: "limitChange", page: "pageChange", orderByProperty: "orderByPropertyChange", ascending: "ascendingChange", filter: "filterChange", ativar: "ativar", refresh: "refresh", loading: "loadingChange", items: "itemsChange", lstTableFields: "lstTableFieldsChange", itemClick: "itemClick" }, ngImport: i0, template: "<div class=\"size-full rounded-xl flex flex-col overflow-hidden relative\">\r\n <loading [type]=\"3\" [loading]=\"loading()\"></loading>\r\n <content-block text=\"Sem Dados\" [value]=\"!(items.length != 0 || loading)\"></content-block>\r\n\r\n <div class=\"size-full shrink relative overflow-y-auto\">\r\n <table>\r\n <thead>\r\n <tr>\r\n @if(acoesTemplate){\r\n <th scope=\"col\" class=\"p-2\"> \r\n A\u00E7\u00F5es \r\n </th>\r\n }\r\n\r\n @for (tfa of lstTableFieldsAvailable(); track tfa.tf.index) {\r\n <th scope=\"col\" class=\"p-2\"> \r\n <div class=\"flex gap-2 items-center justify-start th\">\r\n @if(!noFilters()){\r\n <th-filter class=\"!text-base\" style=\"text-transform: none !important\" \r\n *ngIf=\"((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters())\"\r\n [field]=\"tfa.tf\"\r\n (change)=\"ChangeFilter()\"\r\n ></th-filter>\r\n }\r\n\r\n {{tfa.tf.header}} \r\n\r\n @if((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters()){\r\n <a [ngClass]=\"{ 'bg-light/10 !opacity-100': tfa.ascending || tfa.descending }\"\r\n class=\"order h-4 w-5 relative cursor-pointer rounded-lg opacity-0 default-transition\" \r\n (click)=\"SwitchOrder(tfa.tf)\"\r\n >\r\n <ion-icon \r\n [class.text-primary]=\"tfa.ascending\"\r\n class=\"absolute left-0 top-0\" \r\n name=\"arrow-up\"\r\n ></ion-icon> \r\n <ion-icon \r\n [class.text-primary]=\"tfa.descending\"\r\n class=\"absolute right-0 bottom-0\" \r\n name=\"arrow-down\"\r\n ></ion-icon> \r\n </a>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of lstRows; track row.id || $index) {\r\n <tr [hidden]=\"loading()\">\r\n @if(acoesTemplate){\r\n <td (click)=\"Redirect(undefined, row.item)\" class=\"whitespace-nowrap py-1 px-3 {{row.acoesClass}}\" [style]=\"row.acoesStyle\" >\r\n <ng-container *ngTemplateOutlet=\"acoesTemplate; context: { $implicit: row.item }\"></ng-container>\r\n </td>\r\n }\r\n\r\n @for (col of row.lstColumns; track col.tf.index) {\r\n <td class=\"{{col.class}} p-2 cursor-pointer\" (click)=\"Redirect(col.tf, row.item)\" [style]=\"'white-space: var(--ion-table-row-wrap);' + col.style\">\r\n @if(col.tf.index == 'ativo') {\r\n <div class=\"size-full flex items-center justify-start\" [routerLink]=\"null\">\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"loading()\" (ionChange)=\"Ativar(row.id)\" ></ion-toggle>\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.Bool){\r\n <div class=\"h-full flex items-center justify-start\">\r\n @if(col.tf.configuration.type == 'toggle') {\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"true\"></ion-toggle>\r\n }\r\n @else {\r\n <ion-checkbox [checked]=\"col.value\" [disabled]=\"true\"></ion-checkbox>\r\n }\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.File) {\r\n <download-button [(ngModel)]=\"col.value\" [configuration]=\"col.tf.configuration\"></download-button>\r\n }\r\n @else if (col.loading){\r\n <ion-spinner name=\"dots\"></ion-spinner>\r\n } @else {\r\n <span [ngClass]=\"col.class\">{{ col.label }}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n <ng-content select=\"[slot=item-end]\"></ng-content>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n @if(!noPagination()){\r\n <div class=\"shrink-0 z-[100]\">\r\n <default-pagination\r\n [page]=\"page()\"\r\n (pageChange)=\"page.set($event); refresh.emit()\"\r\n [total]=\"total()\"\r\n [limit]=\"limit()\"\r\n [length]=\"items().length\"\r\n [loading]=\"loading()\"\r\n ></default-pagination>\r\n </div>\r\n }\r\n</div>", styles: [".th:hover>.order{opacity:1;background-color:color-mix(in srgb,var(--ion-color-light) 10%,transparent)}\n"], dependencies: [{ kind: "component", type: i3.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "required", "value"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i3.IonToggle, selector: "ion-toggle", inputs: ["alignment", "checked", "color", "disabled", "enableOnOffLabels", "errorText", "helperText", "justify", "labelPlacement", "mode", "name", "required", "value"] }, { kind: "directive", type: i3.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i3.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.DownloadButtonComponent, selector: "download-button", inputs: ["expand", "value", "size", "color", "params", "disabled", "post", "configuration", "customLabel", "label", "fileName"], outputs: ["valueChange"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: i8.ContentBlockComponent, selector: "content-block", inputs: ["text", "value"] }, { kind: "component", type: i9.DefaultPaginationComponent, selector: "default-pagination", inputs: ["total", "limit", "length", "loading", "page"], outputs: ["pageChange", "change"] }, { kind: "component", type: i10.ThFilterComponent, selector: "th-filter", inputs: ["field"], outputs: ["change"] }] }); }
182
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultTableComponent, deps: [{ token: i1.StorageService }, { token: i2.ActivatedRoute }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
183
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DefaultTableComponent, selector: "default-table", inputs: { acoesTemplate: { classPropertyName: "acoesTemplate", publicName: "acoesTemplate", isSignal: false, isRequired: false, transformFunction: null }, service: { classPropertyName: "service", publicName: "service", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, orderByProperty: { classPropertyName: "orderByProperty", publicName: "orderByProperty", isSignal: true, isRequired: false, transformFunction: null }, ascending: { classPropertyName: "ascending", publicName: "ascending", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, lstTableFields: { classPropertyName: "lstTableFields", publicName: "lstTableFields", isSignal: true, isRequired: false, transformFunction: null }, noFilters: { classPropertyName: "noFilters", publicName: "noFilters", isSignal: true, isRequired: false, transformFunction: null }, columnClass: { classPropertyName: "columnClass", publicName: "columnClass", isSignal: true, isRequired: false, transformFunction: null }, columnStyle: { classPropertyName: "columnStyle", publicName: "columnStyle", isSignal: true, isRequired: false, transformFunction: null }, noPagination: { classPropertyName: "noPagination", publicName: "noPagination", isSignal: true, isRequired: false, transformFunction: null }, itemPath: { classPropertyName: "itemPath", publicName: "itemPath", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { total: "totalChange", limit: "limitChange", page: "pageChange", orderByProperty: "orderByPropertyChange", ascending: "ascendingChange", filter: "filterChange", ativar: "ativar", refresh: "refresh", loading: "loadingChange", items: "itemsChange", lstTableFields: "lstTableFieldsChange", itemClick: "itemClick" }, ngImport: i0, template: "<div class=\"size-full rounded-xl flex flex-col overflow-hidden relative\">\r\n <loading [type]=\"3\" [loading]=\"loading()\"></loading>\r\n <content-block text=\"Sem Dados\" [value]=\"!(items.length != 0 || loading)\"></content-block>\r\n\r\n <div class=\"size-full shrink relative overflow-y-auto\">\r\n <table>\r\n <thead>\r\n <tr>\r\n @if(acoesTemplate){\r\n <th scope=\"col\" class=\"p-2\"> \r\n A\u00E7\u00F5es \r\n </th>\r\n }\r\n\r\n @for (tfa of lstTableFieldsAvailable(); track tfa.tf.index) {\r\n <th scope=\"col\" class=\"p-2\"> \r\n <div class=\"flex gap-2 items-center justify-start th\">\r\n @if(!noFilters()){\r\n <th-filter class=\"!text-base\" style=\"text-transform: none !important\" \r\n *ngIf=\"((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters())\"\r\n [field]=\"tfa.tf\"\r\n (change)=\"ChangeFilter()\"\r\n ></th-filter>\r\n }\r\n\r\n {{tfa.tf.header}} \r\n\r\n @if((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters()){\r\n <a [ngClass]=\"{ 'bg-light/10 !opacity-100': tfa.ascending || tfa.descending }\"\r\n class=\"order h-4 w-5 relative cursor-pointer rounded-lg opacity-0 default-transition\" \r\n (click)=\"SwitchOrder(tfa.tf)\"\r\n >\r\n <ion-icon \r\n [class.text-primary]=\"tfa.ascending\"\r\n class=\"absolute left-0 top-0\" \r\n name=\"arrow-up\"\r\n ></ion-icon> \r\n <ion-icon \r\n [class.text-primary]=\"tfa.descending\"\r\n class=\"absolute right-0 bottom-0\" \r\n name=\"arrow-down\"\r\n ></ion-icon> \r\n </a>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of lstRows; track row.id || $index) {\r\n <tr [hidden]=\"loading()\">\r\n @if(acoesTemplate){\r\n <td (click)=\"Redirect(undefined, row.item)\" class=\"whitespace-nowrap py-1 px-3 {{row.acoesClass}}\" [style]=\"row.acoesStyle\" >\r\n <ng-container *ngTemplateOutlet=\"acoesTemplate; context: { $implicit: row.item }\"></ng-container>\r\n </td>\r\n }\r\n\r\n @for (col of row.lstColumns; track col.tf.index) {\r\n <td class=\"{{col.class}} p-2 cursor-pointer\" (click)=\"Redirect(col.tf, row.item)\" [style]=\"'white-space: var(--ion-table-row-wrap);' + col.style\">\r\n @if(col.tf.index == 'ativo') {\r\n <div class=\"size-full flex items-center justify-start\" [routerLink]=\"null\">\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"loading()\" (ionChange)=\"Ativar(row.id)\" ></ion-toggle>\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.Bool){\r\n <div class=\"h-full flex items-center justify-start\">\r\n @if(col.tf.configuration.type == 'toggle') {\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"true\"></ion-toggle>\r\n }\r\n @else {\r\n <ion-checkbox [checked]=\"col.value\" [disabled]=\"true\"></ion-checkbox>\r\n }\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.File) {\r\n <download-button [(ngModel)]=\"col.value\" [configuration]=\"col.tf.configuration\"></download-button>\r\n }\r\n @else if (col.loading){\r\n <ion-spinner name=\"dots\"></ion-spinner>\r\n } @else {\r\n <span [ngClass]=\"col.class\">{{ col.label }}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n <ng-content select=\"[slot=item-end]\"></ng-content>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n @if(!noPagination()){\r\n <div class=\"shrink-0 z-[100]\">\r\n <default-pagination\r\n [page]=\"page()\"\r\n (pageChange)=\"page.set($event); refresh.emit()\"\r\n [total]=\"total()\"\r\n [limit]=\"limit()\"\r\n [length]=\"items().length\"\r\n [loading]=\"loading()\"\r\n ></default-pagination>\r\n </div>\r\n }\r\n</div>", styles: [".th:hover>.order{opacity:1;background-color:color-mix(in srgb,var(--ion-color-light) 10%,transparent)}\n"], dependencies: [{ kind: "component", type: i3.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "required", "value"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i3.IonToggle, selector: "ion-toggle", inputs: ["alignment", "checked", "color", "disabled", "enableOnOffLabels", "errorText", "helperText", "justify", "labelPlacement", "mode", "name", "required", "value"] }, { kind: "directive", type: i3.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i3.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.DownloadButtonComponent, selector: "download-button", inputs: ["expand", "value", "size", "color", "params", "disabled", "post", "configuration", "customLabel", "label", "fileName"], outputs: ["valueChange"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: i8.ContentBlockComponent, selector: "content-block", inputs: ["text", "value"] }, { kind: "component", type: i9.DefaultPaginationComponent, selector: "default-pagination", inputs: ["total", "limit", "length", "loading", "page"], outputs: ["pageChange", "change"] }, { kind: "component", type: i10.ThFilterComponent, selector: "th-filter", inputs: ["field"], outputs: ["change"] }] }); }
184
184
  }
185
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DefaultTableComponent, decorators: [{
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultTableComponent, decorators: [{
186
186
  type: Component,
187
187
  args: [{ selector: 'default-table', template: "<div class=\"size-full rounded-xl flex flex-col overflow-hidden relative\">\r\n <loading [type]=\"3\" [loading]=\"loading()\"></loading>\r\n <content-block text=\"Sem Dados\" [value]=\"!(items.length != 0 || loading)\"></content-block>\r\n\r\n <div class=\"size-full shrink relative overflow-y-auto\">\r\n <table>\r\n <thead>\r\n <tr>\r\n @if(acoesTemplate){\r\n <th scope=\"col\" class=\"p-2\"> \r\n A\u00E7\u00F5es \r\n </th>\r\n }\r\n\r\n @for (tfa of lstTableFieldsAvailable(); track tfa.tf.index) {\r\n <th scope=\"col\" class=\"p-2\"> \r\n <div class=\"flex gap-2 items-center justify-start th\">\r\n @if(!noFilters()){\r\n <th-filter class=\"!text-base\" style=\"text-transform: none !important\" \r\n *ngIf=\"((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters())\"\r\n [field]=\"tfa.tf\"\r\n (change)=\"ChangeFilter()\"\r\n ></th-filter>\r\n }\r\n\r\n {{tfa.tf.header}} \r\n\r\n @if((tfa.tf.type != InputType.File || (tfa.tf.filter && tfa.tf.disabledChange())) && !noFilters()){\r\n <a [ngClass]=\"{ 'bg-light/10 !opacity-100': tfa.ascending || tfa.descending }\"\r\n class=\"order h-4 w-5 relative cursor-pointer rounded-lg opacity-0 default-transition\" \r\n (click)=\"SwitchOrder(tfa.tf)\"\r\n >\r\n <ion-icon \r\n [class.text-primary]=\"tfa.ascending\"\r\n class=\"absolute left-0 top-0\" \r\n name=\"arrow-up\"\r\n ></ion-icon> \r\n <ion-icon \r\n [class.text-primary]=\"tfa.descending\"\r\n class=\"absolute right-0 bottom-0\" \r\n name=\"arrow-down\"\r\n ></ion-icon> \r\n </a>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of lstRows; track row.id || $index) {\r\n <tr [hidden]=\"loading()\">\r\n @if(acoesTemplate){\r\n <td (click)=\"Redirect(undefined, row.item)\" class=\"whitespace-nowrap py-1 px-3 {{row.acoesClass}}\" [style]=\"row.acoesStyle\" >\r\n <ng-container *ngTemplateOutlet=\"acoesTemplate; context: { $implicit: row.item }\"></ng-container>\r\n </td>\r\n }\r\n\r\n @for (col of row.lstColumns; track col.tf.index) {\r\n <td class=\"{{col.class}} p-2 cursor-pointer\" (click)=\"Redirect(col.tf, row.item)\" [style]=\"'white-space: var(--ion-table-row-wrap);' + col.style\">\r\n @if(col.tf.index == 'ativo') {\r\n <div class=\"size-full flex items-center justify-start\" [routerLink]=\"null\">\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"loading()\" (ionChange)=\"Ativar(row.id)\" ></ion-toggle>\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.Bool){\r\n <div class=\"h-full flex items-center justify-start\">\r\n @if(col.tf.configuration.type == 'toggle') {\r\n <ion-toggle [checked]=\"col.value\" [disabled]=\"true\"></ion-toggle>\r\n }\r\n @else {\r\n <ion-checkbox [checked]=\"col.value\" [disabled]=\"true\"></ion-checkbox>\r\n }\r\n </div>\r\n }\r\n @else if (col.tf.type == InputType.File) {\r\n <download-button [(ngModel)]=\"col.value\" [configuration]=\"col.tf.configuration\"></download-button>\r\n }\r\n @else if (col.loading){\r\n <ion-spinner name=\"dots\"></ion-spinner>\r\n } @else {\r\n <span [ngClass]=\"col.class\">{{ col.label }}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n <ng-content select=\"[slot=item-end]\"></ng-content>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n @if(!noPagination()){\r\n <div class=\"shrink-0 z-[100]\">\r\n <default-pagination\r\n [page]=\"page()\"\r\n (pageChange)=\"page.set($event); refresh.emit()\"\r\n [total]=\"total()\"\r\n [limit]=\"limit()\"\r\n [length]=\"items().length\"\r\n [loading]=\"loading()\"\r\n ></default-pagination>\r\n </div>\r\n }\r\n</div>", styles: [".th:hover>.order{opacity:1;background-color:color-mix(in srgb,var(--ion-color-light) 10%,transparent)}\n"] }]
188
188
  }], ctorParameters: () => [{ type: i1.StorageService }, { type: i2.ActivatedRoute }, { type: i2.Router }], propDecorators: { acoesTemplate: [{
@@ -213,4 +213,4 @@ class AvailableTableField {
213
213
  this.descending = descending;
214
214
  }
215
215
  }
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGVmYXVsdC9kZWZhdWx0LXRhYmxlL2RlZmF1bHQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RlZmF1bHQvZGVmYXVsdC10YWJsZS9kZWZhdWx0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBZSxLQUFLLEVBQXVCLE1BQU0sRUFBdUMsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdLLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJekQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUdyRixPQUFPLEVBQWMsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBU3hELE1BQU0sT0FBTyxxQkFBcUI7SUFvRWhDLFlBQ1MsY0FBK0IsRUFDOUIsY0FBOEIsRUFDOUIsTUFBc0I7UUFGdkIsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBQzlC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TUFBTSxDQUFDLEVBQVU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDOytHQXpNVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiw0N0VDdkJsQyxrOExBdUdNOzs0RkRoRk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7cUlBTWhCLGFBQWE7c0JBQXJCLEtBQUs7O0FBME1SLE1BQU0sZUFBZTtJQUNuQixZQUNTLElBQU8sRUFDUCxFQUFzQixFQUN0QixVQUFnQyxFQUNoQyxhQUFxQixFQUFFLEVBQ3ZCLGFBQXFCLEVBQUU7UUFKdkIsU0FBSSxHQUFKLElBQUksQ0FBRztRQUNQLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDdkIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtJQUM5QixDQUFDO0NBQ0o7QUFFRCxNQUFNLGtCQUFrQjtJQUt0QixZQUNTLFFBQWEsSUFBSSxFQUNqQixFQUFjO1FBRGQsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBTGhCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixVQUFLLEdBQVcsRUFBRSxDQUFDO0lBSXhCLENBQUM7Q0FDSjtBQUVELE1BQU0sbUJBQW1CO0lBQ3ZCLFlBQ1MsRUFBYyxFQUNkLFNBQWtCLEVBQ2xCLFVBQW1CO1FBRm5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQVM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0TnVtYmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBJbnB1dCwgaW5wdXQsIElucHV0U2lnbmFsLCBtb2RlbCwgTW9kZWxTaWduYWwsIE9uSW5pdCwgb3V0cHV0LCBPdXRwdXRFbWl0dGVyUmVmLCBPdXRwdXRSZWYsIFNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBJbnB1dERlY2ltYWxDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LWRlY2ltYWwvaW5wdXQtZGVjaW1hbC5jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LXNlbGVjdC9pbnB1dC5zZWxlY3QuY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEZvcm1hdFRlbGVmb25lQ2VsdWxhciB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC10ZWxlZm9uZS9pbnB1dC10ZWxlZm9uZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3dlYi9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtYXRDcGZDbnBqIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LWNwZi1jbnBqL2lucHV0LWNwZi1jbnBqLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvd2ViL2h0dHAuc2VydmljZSdcclxuaW1wb3J0IHsgVGFibGVGaWVsZCB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvaW5wdXRzL3RhYmxlLWZpZWxkJztcclxuaW1wb3J0IHsgQ29tcGFyaXNvbiwgQ29tcGlsZUxzdFRhYmxlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBhcmlzb24vY29tcGFyaXNvbic7XHJcbmltcG9ydCB7IEZvcm1hdENlcCB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC1jZXAvaW5wdXQtY2VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC10eXBlJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy5zZXJ2aWNlJztcclxuXHJcbnR5cGUgQ1NTU3R5bGVTdHJpbmdHZW5lcmF0b3IgPSAoaW5kZXg6IHN0cmluZywgb2JqZWN0OiBhbnkpID0+IHN0cmluZztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGVmYXVsdC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RlZmF1bHQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RlZmF1bHQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERlZmF1bHRUYWJsZUNvbXBvbmVudDxTZXJ2aWNlIGV4dGVuZHMgSHR0cFNlcnZpY2UsIFQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgYWNvZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAvKiogVGVtcGxhdGUgZGUgYcOnw7VlcywgZGV2ZSBzZXIgdW0gZWxlbWVudG8gYGBgPG5nLXRlbXBsYXRlPmBgYCAqL1xyXG4gIC8vIGFjb2VzVGVtcGxhdGU6IElucHV0U2lnbmFsPFRlbXBsYXRlUmVmPGFueT4+ID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLyoqIFNlcnZpY2UgYSBzZXIgdXRpbGl6YWRvIG5hIGxpc3RhZ2VtICovXHJcbiAgc2VydmljZTogSW5wdXRTaWduYWw8U2VydmljZT4gPSBpbnB1dDxTZXJ2aWNlPigpO1xyXG5cclxuICB0b3RhbDogTW9kZWxTaWduYWw8bnVtYmVyPiA9IG1vZGVsPG51bWJlcj4oMCk7XHJcblxyXG4gIC8qKiBOw7ptZXJvIGRlIGl0ZW1zIG3DoXhpbW8gKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi9cclxuICBsaW1pdDogTW9kZWxTaWduYWw8bnVtYmVyPiA9IG1vZGVsPG51bWJlcj4oKTtcclxuXHJcbiAgLyoqIFZhbG9yIGRhIHBhZ2luYSwgc2V0YWRvID0gMSBxdWFuZG8gdHJvY2Etc2UgbyB2YWxvciBkZSBsaW1pdGUgZGUgcGFnaW5hcyAodXNhbmRvIHR3byB3YXkgZGF0YSBiaW5kaW5nKSAqL1xyXG4gIHBhZ2U6IE1vZGVsU2lnbmFsPG51bWJlcj4gPSBtb2RlbDxudW1iZXI+KDEpO1xyXG5cclxuICAvKiogUHJvcHJpZWRhZGUgZGUgb3JkZW5hw6fDo28gKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi9cclxuICBvcmRlckJ5UHJvcGVydHk6IE1vZGVsU2lnbmFsPHN0cmluZyB8IG51bGw+ID0gbW9kZWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICBcclxuICAvKiogUHJvcHJpZWRhZGUgZGUgb3JkZW5hw6fDo29cclxuICAgKiBTZSA9IHRydWUgIE9yZGVuYXLDoSBkZSBtZW5vciBhbyBtYWlvciBcclxuICAgKiBTZSA9IGZhbHNlIE9yZGVuYXLDoSBkZSBtYWlvciBhbyBtZW5vciAodXNhbmRvIHR3byB3YXkgZGF0YSBiaW5kaW5nKSAqL1xyXG4gIGFzY2VuZGluZzogTW9kZWxTaWduYWw8Ym9vbGVhbj4gPSBtb2RlbDxib29sZWFuPih0cnVlKTtcclxuXHJcbiAgLyoqIEZpbHRyb3MgKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi8gXHJcbiAgZmlsdGVyOiBNb2RlbFNpZ25hbDxDb21wYXJpc29uW10+ID0gbW9kZWw8Q29tcGFyaXNvbltdPihbXSk7XHJcblxyXG4gIC8qKiBFdmVudG8gZW1pdGlkbyBxdWFuZG8gdW0gZG9zIGRhZG9zIMOpIGF0aXZhZG8uIEVtaXRlIG8gaWQgZG8gZGFkbyAqLyAgXHJcbiAgYXRpdmFyIDogT3V0cHV0RW1pdHRlclJlZjxudW1iZXI+ID0gb3V0cHV0PG51bWJlcj4oKTtcclxuICByZWZyZXNoOiBPdXRwdXRFbWl0dGVyUmVmPHZvaWQ+ID0gb3V0cHV0PHZvaWQ+KCk7XHJcblxyXG5cclxuICBsb2FkaW5nOiBNb2RlbFNpZ25hbDxib29sZWFuPiA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgLyoqIExpc3RhIGRlIGRhZG9zIGEgc2VyIGV4aWJpZG9zICovXHJcbiAgaXRlbXM6IE1vZGVsU2lnbmFsPFRbXT4gPSBtb2RlbDxUW10+KFtdKTtcclxuXHJcbiAgLyoqIExpc3RhIGRlIGNhbXBvcyBhIHNlciBleGliaWRvcyAqL1xyXG4gIGxzdFRhYmxlRmllbGRzOiBNb2RlbFNpZ25hbDxUYWJsZUZpZWxkW10+ID0gbW9kZWw8VGFibGVGaWVsZFtdPihbXSk7XHJcbiAgbHN0VGFibGVGaWVsZHNBdmFpbGFibGU6IFNpZ25hbDxBdmFpbGFibGVUYWJsZUZpZWxkW10+ID0gY29tcHV0ZWQ8QXZhaWxhYmxlVGFibGVGaWVsZFtdPigoKSA9PiB7IFxyXG4gICAgcmV0dXJuIHRoaXMubHN0VGFibGVGaWVsZHMoKS5maWx0ZXIocCA9PiAhcC5oaWRkZW4pLm1hcCh0ZiA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgQXZhaWxhYmxlVGFibGVGaWVsZChcclxuICAgICAgICB0ZiwgXHJcbiAgICAgICAgdGhpcy5hc2NlbmRpbmcoKSAmJiB0aGlzLm9yZGVyQnlQcm9wZXJ0eSgpID09IHRmLmluZGV4LCBcclxuICAgICAgICAhdGhpcy5hc2NlbmRpbmcoKSAmJiB0aGlzLm9yZGVyQnlQcm9wZXJ0eSgpID09IHRmLmluZGV4XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgLyoqIFJlbW92ZSBvcyBmaWx0cm9zIG5vIGNhYmXDp2FsaG8gZGEgdGFiZWxhICAqL1xyXG4gIG5vRmlsdGVyczogSW5wdXRTaWduYWw8Ym9vbGVhbj4gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBBcGxpY2EgY2xhc3NlcyBkZSBDU1MgbmEgY29sdW5hIGRlIGFjaXJkbyBjb20gbyByZXRvcm5vIGRhIGZ1bsOnw6NvIHBhc3NhZGEgY29tbyBwYXJhbWV0cm8gICovXHJcbiAgY29sdW1uQ2xhc3M6IElucHV0U2lnbmFsPENTU1N0eWxlU3RyaW5nR2VuZXJhdG9yIHwgbnVsbD4gPSBpbnB1dDxDU1NTdHlsZVN0cmluZ0dlbmVyYXRvciB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvKiogQXBsaWNhIHN0eWxlIGRlIENTUyBuYSBjb2x1bmEgZGUgYWNpcmNvIGNvbSBvIHJldG9ybm8gZGEgZnVuw6fDo28gcGFzc2FkYSBjb21vIHBhcmFtZXRybyAgKi9cclxuICBjb2x1bW5TdHlsZTogSW5wdXRTaWduYWw8Q1NTU3R5bGVTdHJpbmdHZW5lcmF0b3IgfCBudWxsPiA9IGlucHV0PENTU1N0eWxlU3RyaW5nR2VuZXJhdG9yIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKiBSZW1vdmUgYSBwYWdpbmHDp8OjbyBkYSBsaXN0YWdlbSAqL1xyXG4gIG5vUGFnaW5hdGlvbjogSW5wdXRTaWduYWw8Ym9vbGVhbj4gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBDYW1pbmhvIGRlIHJlZGlyZWNpb25hbWVudG8gZG8gaXRlbSAqL1xyXG4gIGl0ZW1QYXRoOiBJbnB1dFNpZ25hbDxzdHJpbmc+ID0gaW5wdXQ8c3RyaW5nPigndmlldy86aWQnKTtcclxuICBpdGVtQ2xpY2s6IE91dHB1dEVtaXR0ZXJSZWY8e2l0ZW06IFQsIGZpZWxkOiBUYWJsZUZpZWxkfT4gPSBvdXRwdXQ8e2l0ZW06IFQsIGZpZWxkOiBUYWJsZUZpZWxkfT4oKTtcclxuXHJcbiAgSW5wdXRUeXBlID0gSW5wdXRUeXBlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBzdG9yYWdlU2VydmljZSA6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlciAgICAgICAgOiBSb3V0ZXIsXHJcbiAgKSB7IFxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgZm9yIChjb25zdCB0ZiBvZiB0aGlzLmxzdFRhYmxlRmllbGRzKCkuZmlsdGVyKHAgPT4gcC50eXBlID09IElucHV0VHlwZS5TZWxlY3QpKSB7XHJcbiAgICAgICAgKHRmLmNvbmZpZ3VyYXRpb24gYXMgSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKS5sb2FkZXIuUmVmcmVzaCgpLnRoZW4oKCkgPT4gdGhpcy5TZXRMc3RSb3dzKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuU2V0THN0Um93cygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBSZWRpcmVjdChmaWVsZDogVGFibGVGaWVsZCB8IHVuZGVmaW5lZCwgaXRlbTogVCk6IHZvaWR7XHJcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KHtpdGVtLCBmaWVsZH0pO1xyXG4gICAgaWYoIWZpZWxkKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICBpZihmaWVsZC5pbmRleCA9PSAnYXRpdm8nKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfWVsc2VcclxuICAgIGlmKGZpZWxkLnR5cGUgID09ICdGaWxlJyl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1lbHNlXHJcbiAgICBpZih0aGlzLml0ZW1QYXRoKCkpe1xyXG4gICAgICBjb25zdCBpZCA9IGl0ZW1bJ2lkJ107IFxyXG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5pdGVtUGF0aCgpLnJlcGxhY2UoXCI6aWRcIiwgaWQudG9TdHJpbmcoKSk7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLi8ke3BhdGh9YF0sIHsgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgU2V0THN0Um93cygpeyBcclxuICAgIHRoaXMubHN0Um93cyA9IHRoaXMuaXRlbXMoKS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgRGVmYXVsdFRhYmxlUm93PFQ+KFxyXG4gICAgICAgIGl0ZW0sIFxyXG4gICAgICAgIGl0ZW1bJ2lkJ10sXHJcbiAgICAgICAgdGhpcy5HZXRDb2x1bW5zKGl0ZW0pLFxyXG4gICAgICAgIHRoaXMuY29sdW1uQ2xhc3MoKSA/IHRoaXMuY29sdW1uQ2xhc3MoKSgnYWNvZXMnLCBpdGVtKSA6ICcnLFxyXG4gICAgICAgIHRoaXMuY29sdW1uU3R5bGUoKSA/IHRoaXMuY29sdW1uU3R5bGUoKSgnYWNvZXMnLCBpdGVtKSA6ICcnLFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIGxzdFJvd3M6IERlZmF1bHRUYWJsZVJvdzxUPltdID0gW107IFxyXG5cclxuICBHZXRDb2x1bW5zKGl0ZW06IFQpOiBEZWZhdWx0VGFibGVDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5sc3RUYWJsZUZpZWxkcygpLmZpbHRlcihwID0+ICFwLmhpZGRlbikubWFwKHRmID0+IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW3RmLmluZGV4XTtcclxuICAgICAgY29uc3QgY29sdW1uID0gbmV3IERlZmF1bHRUYWJsZUNvbHVtbih2YWx1ZSwgdGYpO1xyXG4gICAgICBjb2x1bW4uY2xhc3MgPSB0aGlzLmNvbHVtbkNsYXNzKCkgPyB0aGlzLmNvbHVtbkNsYXNzKCkodGYuaW5kZXgsIGl0ZW0pIDogJyc7XHJcbiAgICAgIGNvbHVtbi5zdHlsZSA9IHRoaXMuY29sdW1uU3R5bGUoKSA/IHRoaXMuY29sdW1uU3R5bGUoKSh0Zi5pbmRleCwgaXRlbSkgOiAnJztcclxuICAgICAgXHJcbiAgICAgIGlmKCF2YWx1ZSl7IFxyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9ICctJyBcclxuICAgICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5Cb29sKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBcIjxib29sPlwiXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5DZXApe1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9IEZvcm1hdENlcCh2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5Db2xvcil7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gdmFsdWU7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZihbSW5wdXRUeXBlLkNwZiwgSW5wdXRUeXBlLkNucGosIElucHV0VHlwZS5DcGZDbnBqXS5pbmNsdWRlcyh0Zi50eXBlKSl7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gRm9ybWF0Q3BmQ25waih2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5EYXRlVGltZSl7XHJcbiAgICAgICAgY29sdW1uLmNsYXNzICs9ICcgZm9udC1tb25vJztcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBVdGlscy5EYXRlSVNPVG9ERE1NWVlZWUhITU0odmFsdWUpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYodGYudHlwZSA9PSBJbnB1dFR5cGUuRGF0ZSl7XHJcbiAgICAgICAgY29sdW1uLmNsYXNzICs9ICcgZm9udC1tb25vJztcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBVdGlscy5EYXRlSVNPVG9ERE1NWVlZWSh2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5UaW1lKXtcclxuICAgICAgICBjb2x1bW4uY2xhc3MgKz0gJyBmb250LW1vbm8nO1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYoW0lucHV0VHlwZS5EZWNpbWFsLCBJbnB1dFR5cGUuRGVjaW1hbCwgSW5wdXRUeXBlLkN1cnJlbmN5LCBJbnB1dFR5cGUuTnVtYmVyXS5pbmNsdWRlcyh0Zi50eXBlKSl7XHJcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbjogSW5wdXREZWNpbWFsQ29uZmlndXJhdGlvbiA9IHRmLmNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gW1xyXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5wcmVmaXgsIFxyXG4gICAgICAgICAgZm9ybWF0TnVtYmVyKHZhbHVlIGFzIG51bWJlciwgJ3B0LUJSJywgYDEuJHtjb25maWd1cmF0aW9uLnByZWNpc2lvbn0tJHtjb25maWd1cmF0aW9uLnByZWNpc2lvbn1gKSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc3VmaXgsIFxyXG4gICAgICAgIF0uam9pbignICcpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYodGYudHlwZSA9PSBJbnB1dFR5cGUuRmlsZSl7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gJzxmaWxlPic7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5JY29uKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSAnaWNvbic7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5TZWxlY3Qpe1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9ICh0Zi5jb25maWd1cmF0aW9uIGFzIElucHV0U2VsZWN0Q29uZmlndXJhdGlvbikubG9hZGVyLkdldExhYmVsKHZhbHVlKTtcclxuICAgICAgICBjb2x1bW4ubG9hZGluZyA9ICEodGYuY29uZmlndXJhdGlvbiBhcyBJbnB1dFNlbGVjdENvbmZpZ3VyYXRpb24pLmxvYWRlci5pc0xvYWRlZDtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgIGlmKFtJbnB1dFR5cGUuU3RyaW5nLCBJbnB1dFR5cGUuVGV4dEFyZWFdLmluY2x1ZGVzKHRmLnR5cGUpKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSB2YWx1ZVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYoW0lucHV0VHlwZS5UZWxlZm9uZSwgSW5wdXRUeXBlLkNlbHVsYXIsIElucHV0VHlwZS5UZWxlZm9uZUNlbHVsYXJdLmluY2x1ZGVzKHRmLnR5cGUpKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBGb3JtYXRUZWxlZm9uZUNlbHVsYXIodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHsgdGhpcy5TZXRMc3RSb3dzKCk7IH1cclxuXHJcbiAgU3dpdGNoT3JkZXIodGY6IFRhYmxlRmllbGQpOiB2b2lke1xyXG4gICAgaWYodGhpcy5vcmRlckJ5UHJvcGVydHkoKSAhPSB0Zi5pbmRleCl7XHJcbiAgICAgIHRoaXMub3JkZXJCeVByb3BlcnR5LnNldCh0Zi5pbmRleCk7XHJcbiAgICAgIHRoaXMuYXNjZW5kaW5nLnNldCh0cnVlKTtcclxuICAgIH0gZWxzZSBcclxuICAgIGlmKHRoaXMuYXNjZW5kaW5nKCkpe1xyXG4gICAgICB0aGlzLmFzY2VuZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgfSBlbHNleyBcclxuICAgICAgdGhpcy5vcmRlckJ5UHJvcGVydHkuc2V0KG51bGwpOyBcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBDaGFuZ2VGaWx0ZXIoKTogdm9pZHtcclxuICAgIHRoaXMuZmlsdGVyLnNldChDb21waWxlTHN0VGFibGVGaWVsZCh0aGlzLmxzdFRhYmxlRmllbGRzKCkpKTtcclxuICAgIHRoaXMucGFnZS5zZXQoMSk7XHJcbiAgICB0aGlzLnJlZnJlc2guZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgQXRpdmFyKGlkOiBudW1iZXIpOiB2b2lke1xyXG4gICAgdGhpcy5hdGl2YXIuZW1pdChpZCk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBEZWZhdWx0VGFibGVSb3c8VD57XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaXRlbTogVCxcclxuICAgIHB1YmxpYyBpZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgcHVibGljIGxzdENvbHVtbnM6IERlZmF1bHRUYWJsZUNvbHVtbltdLFxyXG4gICAgcHVibGljIGFjb2VzQ2xhc3M6IHN0cmluZyA9ICcnLFxyXG4gICAgcHVibGljIGFjb2VzU3R5bGU6IHN0cmluZyA9ICcnLFxyXG4gICl7fVxyXG59IFxyXG5cclxuY2xhc3MgRGVmYXVsdFRhYmxlQ29sdW1ue1xyXG4gIHB1YmxpYyBsYWJlbDogc3RyaW5nIHwgbnVsbFxyXG4gIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNsYXNzOiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgc3R5bGU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZhbHVlOiBhbnkgPSBudWxsLFxyXG4gICAgcHVibGljIHRmOiBUYWJsZUZpZWxkLFxyXG4gICl7fVxyXG59XHJcblxyXG5jbGFzcyBBdmFpbGFibGVUYWJsZUZpZWxke1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHRmOiBUYWJsZUZpZWxkLFxyXG4gICAgcHVibGljIGFzY2VuZGluZzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBkZXNjZW5kaW5nOiBib29sZWFuLFxyXG4gICl7fVxyXG59IiwiPGRpdiBjbGFzcz1cInNpemUtZnVsbCByb3VuZGVkLXhsIGZsZXggZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuIHJlbGF0aXZlXCI+XHJcbiAgICA8bG9hZGluZyBbdHlwZV09XCIzXCIgW2xvYWRpbmddPVwibG9hZGluZygpXCI+PC9sb2FkaW5nPlxyXG4gICAgPGNvbnRlbnQtYmxvY2sgdGV4dD1cIlNlbSBEYWRvc1wiIFt2YWx1ZV09XCIhKGl0ZW1zLmxlbmd0aCAhPSAwIHx8IGxvYWRpbmcpXCI+PC9jb250ZW50LWJsb2NrPlxyXG5cclxuICAgICA8ZGl2IGNsYXNzPVwic2l6ZS1mdWxsIHNocmluayByZWxhdGl2ZSBvdmVyZmxvdy15LWF1dG9cIj5cclxuICAgICAgICA8dGFibGU+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoYWNvZXNUZW1wbGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwicC0yXCI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQcOnw7VlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHRmYSBvZiBsc3RUYWJsZUZpZWxkc0F2YWlsYWJsZSgpOyB0cmFjayB0ZmEudGYuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJwLTJcIj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCB0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighbm9GaWx0ZXJzKCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGgtZmlsdGVyIGNsYXNzPVwiIXRleHQtYmFzZVwiIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIigodGZhLnRmLnR5cGUgIT0gSW5wdXRUeXBlLkZpbGUgfHwgKHRmYS50Zi5maWx0ZXIgJiYgdGZhLnRmLmRpc2FibGVkQ2hhbmdlKCkpKSAmJiAhbm9GaWx0ZXJzKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJ0ZmEudGZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJDaGFuZ2VGaWx0ZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3RoLWZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGZhLnRmLmhlYWRlcn19IFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoKHRmYS50Zi50eXBlICE9IElucHV0VHlwZS5GaWxlIHx8ICh0ZmEudGYuZmlsdGVyICYmIHRmYS50Zi5kaXNhYmxlZENoYW5nZSgpKSkgJiYgIW5vRmlsdGVycygpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwieyAnYmctbGlnaHQvMTAgIW9wYWNpdHktMTAwJzogdGZhLmFzY2VuZGluZyB8fCB0ZmEuZGVzY2VuZGluZyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib3JkZXIgaC00IHctNSByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLWxnIG9wYWNpdHktMCBkZWZhdWx0LXRyYW5zaXRpb25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJTd2l0Y2hPcmRlcih0ZmEudGYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXByaW1hcnldPVwidGZhLmFzY2VuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTBcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW9uLWljb24+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXByaW1hcnldPVwidGZhLmRlc2NlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBib3R0b20tMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJhcnJvdy1kb3duXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2lvbi1pY29uPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBsc3RSb3dzOyB0cmFjayByb3cuaWQgfHwgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtoaWRkZW5dPVwibG9hZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihhY29lc1RlbXBsYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwiUmVkaXJlY3QodW5kZWZpbmVkLCByb3cuaXRlbSlcIiBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIHB5LTEgcHgtMyB7e3Jvdy5hY29lc0NsYXNzfX1cIiBbc3R5bGVdPVwicm93LmFjb2VzU3R5bGVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjb2VzVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3cuaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygcm93LmxzdENvbHVtbnM7IHRyYWNrIGNvbC50Zi5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwie3tjb2wuY2xhc3N9fSBwLTIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiUmVkaXJlY3QoY29sLnRmLCByb3cuaXRlbSlcIiBbc3R5bGVdPVwiJ3doaXRlLXNwYWNlOiB2YXIoLS1pb24tdGFibGUtcm93LXdyYXApOycgKyBjb2wuc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29sLnRmLmluZGV4ID09ICdhdGl2bycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpemUtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0XCIgW3JvdXRlckxpbmtdPVwibnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgW2NoZWNrZWRdPVwiY29sLnZhbHVlXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcoKVwiIChpb25DaGFuZ2UpPVwiQXRpdmFyKHJvdy5pZClcIiA+PC9pb24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbC50Zi50eXBlID09IElucHV0VHlwZS5Cb29sKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29sLnRmLmNvbmZpZ3VyYXRpb24udHlwZSA9PSAndG9nZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIFtjaGVja2VkXT1cImNvbC52YWx1ZVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+PC9pb24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY2hlY2tib3ggW2NoZWNrZWRdPVwiY29sLnZhbHVlXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2lvbi1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIGlmIChjb2wudGYudHlwZSA9PSBJbnB1dFR5cGUuRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWQtYnV0dG9uIFsobmdNb2RlbCldPVwiY29sLnZhbHVlXCIgW2NvbmZpZ3VyYXRpb25dPVwiY29sLnRmLmNvbmZpZ3VyYXRpb25cIj48L2Rvd25sb2FkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbC5sb2FkaW5nKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJkb3RzXCI+PC9pb24tc3Bpbm5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+e3sgY29sLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbG90PWl0ZW0tZW5kXVwiPjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgIDwvZGl2PlxyXG4gICAgIEBpZighbm9QYWdpbmF0aW9uKCkpe1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaHJpbmstMCB6LVsxMDBdXCI+XHJcbiAgICAgICAgICAgIDxkZWZhdWx0LXBhZ2luYXRpb25cclxuICAgICAgICAgICAgICAgIFtwYWdlXT1cInBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJwYWdlLnNldCgkZXZlbnQpOyByZWZyZXNoLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBbdG90YWxdPVwidG90YWwoKVwiXHJcbiAgICAgICAgICAgICAgICBbbGltaXRdPVwibGltaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cIml0ZW1zKCkubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmcoKVwiXHJcbiAgICAgICAgICAgID48L2RlZmF1bHQtcGFnaW5hdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuPC9kaXY+Il19
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGVmYXVsdC9kZWZhdWx0LXRhYmxlL2RlZmF1bHQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RlZmF1bHQvZGVmYXVsdC10YWJsZS9kZWZhdWx0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBZSxLQUFLLEVBQXVCLE1BQU0sRUFBdUMsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdLLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJekQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUdyRixPQUFPLEVBQWMsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBU3hELE1BQU0sT0FBTyxxQkFBcUI7SUFvRWhDLFlBQ1MsY0FBK0IsRUFDOUIsY0FBOEIsRUFDOUIsTUFBc0I7UUFGdkIsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBQzlC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QU0sZUFBZTtJQUNuQixZQUNTLElBQU8sRUFDUCxFQUFzQixFQUN0QixVQUFnQyxFQUNoQyxhQUFxQixFQUFFLEVBQ3ZCLGFBQXFCLEVBQUU7UUFKdkIsU0FBSSxHQUFKLElBQUksQ0FBRztRQUNQLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDdkIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtJQUM5QixDQUFDO0NBQ0o7QUFFRCxNQUFNLGtCQUFrQjtJQUt0QixZQUNTLFFBQWEsSUFBSSxFQUNqQixFQUFjO1FBRGQsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBTGhCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixVQUFLLEdBQVcsRUFBRSxDQUFDO0lBSXhCLENBQUM7Q0FDSjtBQUVELE1BQU0sbUJBQW1CO0lBQ3ZCLFlBQ1MsRUFBYyxFQUNkLFNBQWtCLEVBQ2xCLFVBQW1CO1FBRm5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQVM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0TnVtYmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBJbnB1dCwgaW5wdXQsIElucHV0U2lnbmFsLCBtb2RlbCwgTW9kZWxTaWduYWwsIE9uSW5pdCwgb3V0cHV0LCBPdXRwdXRFbWl0dGVyUmVmLCBPdXRwdXRSZWYsIFNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBJbnB1dERlY2ltYWxDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LWRlY2ltYWwvaW5wdXQtZGVjaW1hbC5jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LXNlbGVjdC9pbnB1dC5zZWxlY3QuY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEZvcm1hdFRlbGVmb25lQ2VsdWxhciB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC10ZWxlZm9uZS9pbnB1dC10ZWxlZm9uZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3dlYi9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtYXRDcGZDbnBqIH0gZnJvbSAnLi4vLi4vaW5wdXRzL2lucHV0LWNwZi1jbnBqL2lucHV0LWNwZi1jbnBqLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvd2ViL2h0dHAuc2VydmljZSdcclxuaW1wb3J0IHsgVGFibGVGaWVsZCB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvaW5wdXRzL3RhYmxlLWZpZWxkJztcclxuaW1wb3J0IHsgQ29tcGFyaXNvbiwgQ29tcGlsZUxzdFRhYmxlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBhcmlzb24vY29tcGFyaXNvbic7XHJcbmltcG9ydCB7IEZvcm1hdENlcCB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC1jZXAvaW5wdXQtY2VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uLy4uL2lucHV0cy9pbnB1dC10eXBlJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy5zZXJ2aWNlJztcclxuXHJcbnR5cGUgQ1NTU3R5bGVTdHJpbmdHZW5lcmF0b3IgPSAoaW5kZXg6IHN0cmluZywgb2JqZWN0OiBhbnkpID0+IHN0cmluZztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGVmYXVsdC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RlZmF1bHQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RlZmF1bHQtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERlZmF1bHRUYWJsZUNvbXBvbmVudDxTZXJ2aWNlIGV4dGVuZHMgSHR0cFNlcnZpY2UsIFQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgYWNvZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAvKiogVGVtcGxhdGUgZGUgYcOnw7VlcywgZGV2ZSBzZXIgdW0gZWxlbWVudG8gYGBgPG5nLXRlbXBsYXRlPmBgYCAqL1xyXG4gIC8vIGFjb2VzVGVtcGxhdGU6IElucHV0U2lnbmFsPFRlbXBsYXRlUmVmPGFueT4+ID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLyoqIFNlcnZpY2UgYSBzZXIgdXRpbGl6YWRvIG5hIGxpc3RhZ2VtICovXHJcbiAgc2VydmljZTogSW5wdXRTaWduYWw8U2VydmljZT4gPSBpbnB1dDxTZXJ2aWNlPigpO1xyXG5cclxuICB0b3RhbDogTW9kZWxTaWduYWw8bnVtYmVyPiA9IG1vZGVsPG51bWJlcj4oMCk7XHJcblxyXG4gIC8qKiBOw7ptZXJvIGRlIGl0ZW1zIG3DoXhpbW8gKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi9cclxuICBsaW1pdDogTW9kZWxTaWduYWw8bnVtYmVyPiA9IG1vZGVsPG51bWJlcj4oKTtcclxuXHJcbiAgLyoqIFZhbG9yIGRhIHBhZ2luYSwgc2V0YWRvID0gMSBxdWFuZG8gdHJvY2Etc2UgbyB2YWxvciBkZSBsaW1pdGUgZGUgcGFnaW5hcyAodXNhbmRvIHR3byB3YXkgZGF0YSBiaW5kaW5nKSAqL1xyXG4gIHBhZ2U6IE1vZGVsU2lnbmFsPG51bWJlcj4gPSBtb2RlbDxudW1iZXI+KDEpO1xyXG5cclxuICAvKiogUHJvcHJpZWRhZGUgZGUgb3JkZW5hw6fDo28gKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi9cclxuICBvcmRlckJ5UHJvcGVydHk6IE1vZGVsU2lnbmFsPHN0cmluZyB8IG51bGw+ID0gbW9kZWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICBcclxuICAvKiogUHJvcHJpZWRhZGUgZGUgb3JkZW5hw6fDo29cclxuICAgKiBTZSA9IHRydWUgIE9yZGVuYXLDoSBkZSBtZW5vciBhbyBtYWlvciBcclxuICAgKiBTZSA9IGZhbHNlIE9yZGVuYXLDoSBkZSBtYWlvciBhbyBtZW5vciAodXNhbmRvIHR3byB3YXkgZGF0YSBiaW5kaW5nKSAqL1xyXG4gIGFzY2VuZGluZzogTW9kZWxTaWduYWw8Ym9vbGVhbj4gPSBtb2RlbDxib29sZWFuPih0cnVlKTtcclxuXHJcbiAgLyoqIEZpbHRyb3MgKHVzYW5kbyB0d28gd2F5IGRhdGEgYmluZGluZykgKi8gXHJcbiAgZmlsdGVyOiBNb2RlbFNpZ25hbDxDb21wYXJpc29uW10+ID0gbW9kZWw8Q29tcGFyaXNvbltdPihbXSk7XHJcblxyXG4gIC8qKiBFdmVudG8gZW1pdGlkbyBxdWFuZG8gdW0gZG9zIGRhZG9zIMOpIGF0aXZhZG8uIEVtaXRlIG8gaWQgZG8gZGFkbyAqLyAgXHJcbiAgYXRpdmFyIDogT3V0cHV0RW1pdHRlclJlZjxudW1iZXI+ID0gb3V0cHV0PG51bWJlcj4oKTtcclxuICByZWZyZXNoOiBPdXRwdXRFbWl0dGVyUmVmPHZvaWQ+ID0gb3V0cHV0PHZvaWQ+KCk7XHJcblxyXG5cclxuICBsb2FkaW5nOiBNb2RlbFNpZ25hbDxib29sZWFuPiA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgLyoqIExpc3RhIGRlIGRhZG9zIGEgc2VyIGV4aWJpZG9zICovXHJcbiAgaXRlbXM6IE1vZGVsU2lnbmFsPFRbXT4gPSBtb2RlbDxUW10+KFtdKTtcclxuXHJcbiAgLyoqIExpc3RhIGRlIGNhbXBvcyBhIHNlciBleGliaWRvcyAqL1xyXG4gIGxzdFRhYmxlRmllbGRzOiBNb2RlbFNpZ25hbDxUYWJsZUZpZWxkW10+ID0gbW9kZWw8VGFibGVGaWVsZFtdPihbXSk7XHJcbiAgbHN0VGFibGVGaWVsZHNBdmFpbGFibGU6IFNpZ25hbDxBdmFpbGFibGVUYWJsZUZpZWxkW10+ID0gY29tcHV0ZWQ8QXZhaWxhYmxlVGFibGVGaWVsZFtdPigoKSA9PiB7IFxyXG4gICAgcmV0dXJuIHRoaXMubHN0VGFibGVGaWVsZHMoKS5maWx0ZXIocCA9PiAhcC5oaWRkZW4pLm1hcCh0ZiA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgQXZhaWxhYmxlVGFibGVGaWVsZChcclxuICAgICAgICB0ZiwgXHJcbiAgICAgICAgdGhpcy5hc2NlbmRpbmcoKSAmJiB0aGlzLm9yZGVyQnlQcm9wZXJ0eSgpID09IHRmLmluZGV4LCBcclxuICAgICAgICAhdGhpcy5hc2NlbmRpbmcoKSAmJiB0aGlzLm9yZGVyQnlQcm9wZXJ0eSgpID09IHRmLmluZGV4XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgLyoqIFJlbW92ZSBvcyBmaWx0cm9zIG5vIGNhYmXDp2FsaG8gZGEgdGFiZWxhICAqL1xyXG4gIG5vRmlsdGVyczogSW5wdXRTaWduYWw8Ym9vbGVhbj4gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBBcGxpY2EgY2xhc3NlcyBkZSBDU1MgbmEgY29sdW5hIGRlIGFjaXJkbyBjb20gbyByZXRvcm5vIGRhIGZ1bsOnw6NvIHBhc3NhZGEgY29tbyBwYXJhbWV0cm8gICovXHJcbiAgY29sdW1uQ2xhc3M6IElucHV0U2lnbmFsPENTU1N0eWxlU3RyaW5nR2VuZXJhdG9yIHwgbnVsbD4gPSBpbnB1dDxDU1NTdHlsZVN0cmluZ0dlbmVyYXRvciB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvKiogQXBsaWNhIHN0eWxlIGRlIENTUyBuYSBjb2x1bmEgZGUgYWNpcmNvIGNvbSBvIHJldG9ybm8gZGEgZnVuw6fDo28gcGFzc2FkYSBjb21vIHBhcmFtZXRybyAgKi9cclxuICBjb2x1bW5TdHlsZTogSW5wdXRTaWduYWw8Q1NTU3R5bGVTdHJpbmdHZW5lcmF0b3IgfCBudWxsPiA9IGlucHV0PENTU1N0eWxlU3RyaW5nR2VuZXJhdG9yIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKiBSZW1vdmUgYSBwYWdpbmHDp8OjbyBkYSBsaXN0YWdlbSAqL1xyXG4gIG5vUGFnaW5hdGlvbjogSW5wdXRTaWduYWw8Ym9vbGVhbj4gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBDYW1pbmhvIGRlIHJlZGlyZWNpb25hbWVudG8gZG8gaXRlbSAqL1xyXG4gIGl0ZW1QYXRoOiBJbnB1dFNpZ25hbDxzdHJpbmc+ID0gaW5wdXQ8c3RyaW5nPigndmlldy86aWQnKTtcclxuICBpdGVtQ2xpY2s6IE91dHB1dEVtaXR0ZXJSZWY8e2l0ZW06IFQsIGZpZWxkOiBUYWJsZUZpZWxkfT4gPSBvdXRwdXQ8e2l0ZW06IFQsIGZpZWxkOiBUYWJsZUZpZWxkfT4oKTtcclxuXHJcbiAgSW5wdXRUeXBlID0gSW5wdXRUeXBlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBzdG9yYWdlU2VydmljZSA6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlciAgICAgICAgOiBSb3V0ZXIsXHJcbiAgKSB7IFxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgZm9yIChjb25zdCB0ZiBvZiB0aGlzLmxzdFRhYmxlRmllbGRzKCkuZmlsdGVyKHAgPT4gcC50eXBlID09IElucHV0VHlwZS5TZWxlY3QpKSB7XHJcbiAgICAgICAgKHRmLmNvbmZpZ3VyYXRpb24gYXMgSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKS5sb2FkZXIuUmVmcmVzaCgpLnRoZW4oKCkgPT4gdGhpcy5TZXRMc3RSb3dzKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuU2V0THN0Um93cygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBSZWRpcmVjdChmaWVsZDogVGFibGVGaWVsZCB8IHVuZGVmaW5lZCwgaXRlbTogVCk6IHZvaWR7XHJcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KHtpdGVtLCBmaWVsZH0pO1xyXG4gICAgaWYoIWZpZWxkKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICBpZihmaWVsZC5pbmRleCA9PSAnYXRpdm8nKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfWVsc2VcclxuICAgIGlmKGZpZWxkLnR5cGUgID09ICdGaWxlJyl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1lbHNlXHJcbiAgICBpZih0aGlzLml0ZW1QYXRoKCkpe1xyXG4gICAgICBjb25zdCBpZCA9IGl0ZW1bJ2lkJ107IFxyXG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5pdGVtUGF0aCgpLnJlcGxhY2UoXCI6aWRcIiwgaWQudG9TdHJpbmcoKSk7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLi8ke3BhdGh9YF0sIHsgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgU2V0THN0Um93cygpeyBcclxuICAgIHRoaXMubHN0Um93cyA9IHRoaXMuaXRlbXMoKS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgRGVmYXVsdFRhYmxlUm93PFQ+KFxyXG4gICAgICAgIGl0ZW0sIFxyXG4gICAgICAgIGl0ZW1bJ2lkJ10sXHJcbiAgICAgICAgdGhpcy5HZXRDb2x1bW5zKGl0ZW0pLFxyXG4gICAgICAgICcnLFxyXG4gICAgICAgICcnLFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIGxzdFJvd3M6IERlZmF1bHRUYWJsZVJvdzxUPltdID0gW107IFxyXG5cclxuICBHZXRDb2x1bW5zKGl0ZW06IFQpOiBEZWZhdWx0VGFibGVDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5sc3RUYWJsZUZpZWxkcygpLmZpbHRlcihwID0+ICFwLmhpZGRlbikubWFwKHRmID0+IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW3RmLmluZGV4XTtcclxuICAgICAgY29uc3QgY29sdW1uID0gbmV3IERlZmF1bHRUYWJsZUNvbHVtbih2YWx1ZSwgdGYpO1xyXG4gICAgICBjb2x1bW4uY2xhc3MgPSB0aGlzLmNvbHVtbkNsYXNzKCkgPyB0aGlzLmNvbHVtbkNsYXNzKCkodGYuaW5kZXgsIGl0ZW0pIDogJyc7XHJcbiAgICAgIGNvbHVtbi5zdHlsZSA9IHRoaXMuY29sdW1uU3R5bGUoKSA/IHRoaXMuY29sdW1uU3R5bGUoKSh0Zi5pbmRleCwgaXRlbSkgOiAnJztcclxuICAgICAgXHJcbiAgICAgIGlmKCF2YWx1ZSl7IFxyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9ICctJyBcclxuICAgICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5Cb29sKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBcIjxib29sPlwiXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5DZXApe1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9IEZvcm1hdENlcCh2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5Db2xvcil7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gdmFsdWU7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZihbSW5wdXRUeXBlLkNwZiwgSW5wdXRUeXBlLkNucGosIElucHV0VHlwZS5DcGZDbnBqXS5pbmNsdWRlcyh0Zi50eXBlKSl7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gRm9ybWF0Q3BmQ25waih2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5EYXRlVGltZSl7XHJcbiAgICAgICAgY29sdW1uLmNsYXNzICs9ICcgZm9udC1tb25vJztcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBVdGlscy5EYXRlSVNPVG9ERE1NWVlZWUhITU0odmFsdWUpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYodGYudHlwZSA9PSBJbnB1dFR5cGUuRGF0ZSl7XHJcbiAgICAgICAgY29sdW1uLmNsYXNzICs9ICcgZm9udC1tb25vJztcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBVdGlscy5EYXRlSVNPVG9ERE1NWVlZWSh2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5UaW1lKXtcclxuICAgICAgICBjb2x1bW4uY2xhc3MgKz0gJyBmb250LW1vbm8nO1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYoW0lucHV0VHlwZS5EZWNpbWFsLCBJbnB1dFR5cGUuRGVjaW1hbCwgSW5wdXRUeXBlLkN1cnJlbmN5LCBJbnB1dFR5cGUuTnVtYmVyXS5pbmNsdWRlcyh0Zi50eXBlKSl7XHJcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvbjogSW5wdXREZWNpbWFsQ29uZmlndXJhdGlvbiA9IHRmLmNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gW1xyXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5wcmVmaXgsIFxyXG4gICAgICAgICAgZm9ybWF0TnVtYmVyKHZhbHVlIGFzIG51bWJlciwgJ3B0LUJSJywgYDEuJHtjb25maWd1cmF0aW9uLnByZWNpc2lvbn0tJHtjb25maWd1cmF0aW9uLnByZWNpc2lvbn1gKSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc3VmaXgsIFxyXG4gICAgICAgIF0uam9pbignICcpO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYodGYudHlwZSA9PSBJbnB1dFR5cGUuRmlsZSl7XHJcbiAgICAgICAgY29sdW1uLmxhYmVsID0gJzxmaWxlPic7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5JY29uKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSAnaWNvbic7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICBpZih0Zi50eXBlID09IElucHV0VHlwZS5TZWxlY3Qpe1xyXG4gICAgICAgIGNvbHVtbi5sYWJlbCA9ICh0Zi5jb25maWd1cmF0aW9uIGFzIElucHV0U2VsZWN0Q29uZmlndXJhdGlvbikubG9hZGVyLkdldExhYmVsKHZhbHVlKTtcclxuICAgICAgICBjb2x1bW4ubG9hZGluZyA9ICEodGYuY29uZmlndXJhdGlvbiBhcyBJbnB1dFNlbGVjdENvbmZpZ3VyYXRpb24pLmxvYWRlci5pc0xvYWRlZDtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgIGlmKFtJbnB1dFR5cGUuU3RyaW5nLCBJbnB1dFR5cGUuVGV4dEFyZWFdLmluY2x1ZGVzKHRmLnR5cGUpKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSB2YWx1ZVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYoW0lucHV0VHlwZS5UZWxlZm9uZSwgSW5wdXRUeXBlLkNlbHVsYXIsIElucHV0VHlwZS5UZWxlZm9uZUNlbHVsYXJdLmluY2x1ZGVzKHRmLnR5cGUpKXtcclxuICAgICAgICBjb2x1bW4ubGFiZWwgPSBGb3JtYXRUZWxlZm9uZUNlbHVsYXIodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY29sdW1uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHsgdGhpcy5TZXRMc3RSb3dzKCk7IH1cclxuXHJcbiAgU3dpdGNoT3JkZXIodGY6IFRhYmxlRmllbGQpOiB2b2lke1xyXG4gICAgaWYodGhpcy5vcmRlckJ5UHJvcGVydHkoKSAhPSB0Zi5pbmRleCl7XHJcbiAgICAgIHRoaXMub3JkZXJCeVByb3BlcnR5LnNldCh0Zi5pbmRleCk7XHJcbiAgICAgIHRoaXMuYXNjZW5kaW5nLnNldCh0cnVlKTtcclxuICAgIH0gZWxzZSBcclxuICAgIGlmKHRoaXMuYXNjZW5kaW5nKCkpe1xyXG4gICAgICB0aGlzLmFzY2VuZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgfSBlbHNleyBcclxuICAgICAgdGhpcy5vcmRlckJ5UHJvcGVydHkuc2V0KG51bGwpOyBcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBDaGFuZ2VGaWx0ZXIoKTogdm9pZHtcclxuICAgIHRoaXMuZmlsdGVyLnNldChDb21waWxlTHN0VGFibGVGaWVsZCh0aGlzLmxzdFRhYmxlRmllbGRzKCkpKTtcclxuICAgIHRoaXMucGFnZS5zZXQoMSk7XHJcbiAgICB0aGlzLnJlZnJlc2guZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgQXRpdmFyKGlkOiBudW1iZXIpOiB2b2lke1xyXG4gICAgdGhpcy5hdGl2YXIuZW1pdChpZCk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBEZWZhdWx0VGFibGVSb3c8VD57XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaXRlbTogVCxcclxuICAgIHB1YmxpYyBpZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgcHVibGljIGxzdENvbHVtbnM6IERlZmF1bHRUYWJsZUNvbHVtbltdLFxyXG4gICAgcHVibGljIGFjb2VzQ2xhc3M6IHN0cmluZyA9ICcnLFxyXG4gICAgcHVibGljIGFjb2VzU3R5bGU6IHN0cmluZyA9ICcnLFxyXG4gICl7fVxyXG59IFxyXG5cclxuY2xhc3MgRGVmYXVsdFRhYmxlQ29sdW1ue1xyXG4gIHB1YmxpYyBsYWJlbDogc3RyaW5nIHwgbnVsbFxyXG4gIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNsYXNzOiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgc3R5bGU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZhbHVlOiBhbnkgPSBudWxsLFxyXG4gICAgcHVibGljIHRmOiBUYWJsZUZpZWxkLFxyXG4gICl7fVxyXG59XHJcblxyXG5jbGFzcyBBdmFpbGFibGVUYWJsZUZpZWxke1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHRmOiBUYWJsZUZpZWxkLFxyXG4gICAgcHVibGljIGFzY2VuZGluZzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBkZXNjZW5kaW5nOiBib29sZWFuLFxyXG4gICl7fVxyXG59IiwiPGRpdiBjbGFzcz1cInNpemUtZnVsbCByb3VuZGVkLXhsIGZsZXggZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuIHJlbGF0aXZlXCI+XHJcbiAgICA8bG9hZGluZyBbdHlwZV09XCIzXCIgW2xvYWRpbmddPVwibG9hZGluZygpXCI+PC9sb2FkaW5nPlxyXG4gICAgPGNvbnRlbnQtYmxvY2sgdGV4dD1cIlNlbSBEYWRvc1wiIFt2YWx1ZV09XCIhKGl0ZW1zLmxlbmd0aCAhPSAwIHx8IGxvYWRpbmcpXCI+PC9jb250ZW50LWJsb2NrPlxyXG5cclxuICAgICA8ZGl2IGNsYXNzPVwic2l6ZS1mdWxsIHNocmluayByZWxhdGl2ZSBvdmVyZmxvdy15LWF1dG9cIj5cclxuICAgICAgICA8dGFibGU+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoYWNvZXNUZW1wbGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwicC0yXCI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQcOnw7VlcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHRmYSBvZiBsc3RUYWJsZUZpZWxkc0F2YWlsYWJsZSgpOyB0cmFjayB0ZmEudGYuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJwLTJcIj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCB0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZighbm9GaWx0ZXJzKCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGgtZmlsdGVyIGNsYXNzPVwiIXRleHQtYmFzZVwiIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIigodGZhLnRmLnR5cGUgIT0gSW5wdXRUeXBlLkZpbGUgfHwgKHRmYS50Zi5maWx0ZXIgJiYgdGZhLnRmLmRpc2FibGVkQ2hhbmdlKCkpKSAmJiAhbm9GaWx0ZXJzKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJ0ZmEudGZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJDaGFuZ2VGaWx0ZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3RoLWZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGZhLnRmLmhlYWRlcn19IFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoKHRmYS50Zi50eXBlICE9IElucHV0VHlwZS5GaWxlIHx8ICh0ZmEudGYuZmlsdGVyICYmIHRmYS50Zi5kaXNhYmxlZENoYW5nZSgpKSkgJiYgIW5vRmlsdGVycygpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwieyAnYmctbGlnaHQvMTAgIW9wYWNpdHktMTAwJzogdGZhLmFzY2VuZGluZyB8fCB0ZmEuZGVzY2VuZGluZyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib3JkZXIgaC00IHctNSByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLWxnIG9wYWNpdHktMCBkZWZhdWx0LXRyYW5zaXRpb25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJTd2l0Y2hPcmRlcih0ZmEudGYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXByaW1hcnldPVwidGZhLmFzY2VuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTBcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW9uLWljb24+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXByaW1hcnldPVwidGZhLmRlc2NlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBib3R0b20tMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJhcnJvdy1kb3duXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2lvbi1pY29uPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBsc3RSb3dzOyB0cmFjayByb3cuaWQgfHwgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtoaWRkZW5dPVwibG9hZGluZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihhY29lc1RlbXBsYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwiUmVkaXJlY3QodW5kZWZpbmVkLCByb3cuaXRlbSlcIiBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIHB5LTEgcHgtMyB7e3Jvdy5hY29lc0NsYXNzfX1cIiBbc3R5bGVdPVwicm93LmFjb2VzU3R5bGVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjb2VzVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3cuaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygcm93LmxzdENvbHVtbnM7IHRyYWNrIGNvbC50Zi5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwie3tjb2wuY2xhc3N9fSBwLTIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiUmVkaXJlY3QoY29sLnRmLCByb3cuaXRlbSlcIiBbc3R5bGVdPVwiJ3doaXRlLXNwYWNlOiB2YXIoLS1pb24tdGFibGUtcm93LXdyYXApOycgKyBjb2wuc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29sLnRmLmluZGV4ID09ICdhdGl2bycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpemUtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0XCIgW3JvdXRlckxpbmtdPVwibnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgW2NoZWNrZWRdPVwiY29sLnZhbHVlXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcoKVwiIChpb25DaGFuZ2UpPVwiQXRpdmFyKHJvdy5pZClcIiA+PC9pb24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbC50Zi50eXBlID09IElucHV0VHlwZS5Cb29sKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29sLnRmLmNvbmZpZ3VyYXRpb24udHlwZSA9PSAndG9nZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIFtjaGVja2VkXT1cImNvbC52YWx1ZVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+PC9pb24tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY2hlY2tib3ggW2NoZWNrZWRdPVwiY29sLnZhbHVlXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2lvbi1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIGlmIChjb2wudGYudHlwZSA9PSBJbnB1dFR5cGUuRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWQtYnV0dG9uIFsobmdNb2RlbCldPVwiY29sLnZhbHVlXCIgW2NvbmZpZ3VyYXRpb25dPVwiY29sLnRmLmNvbmZpZ3VyYXRpb25cIj48L2Rvd25sb2FkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbC5sb2FkaW5nKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJkb3RzXCI+PC9pb24tc3Bpbm5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiY29sLmNsYXNzXCI+e3sgY29sLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbG90PWl0ZW0tZW5kXVwiPjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgIDwvZGl2PlxyXG4gICAgIEBpZighbm9QYWdpbmF0aW9uKCkpe1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaHJpbmstMCB6LVsxMDBdXCI+XHJcbiAgICAgICAgICAgIDxkZWZhdWx0LXBhZ2luYXRpb25cclxuICAgICAgICAgICAgICAgIFtwYWdlXT1cInBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJwYWdlLnNldCgkZXZlbnQpOyByZWZyZXNoLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBbdG90YWxdPVwidG90YWwoKVwiXHJcbiAgICAgICAgICAgICAgICBbbGltaXRdPVwibGltaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cIml0ZW1zKCkubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmcoKVwiXHJcbiAgICAgICAgICAgID48L2RlZmF1bHQtcGFnaW5hdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuPC9kaXY+Il19