appproject-components 1.0.47 → 1.0.48

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 (153) hide show
  1. package/esm2022/appproject-components.mjs +5 -0
  2. package/esm2022/lib/appproject-components.component.mjs +22 -0
  3. package/esm2022/lib/appproject-components.module.mjs +159 -0
  4. package/esm2022/lib/appproject-components.service.mjs +14 -0
  5. package/esm2022/lib/baseInputComponent.mjs +69 -0
  6. package/esm2022/lib/buttons/baseBtnComponent.mjs +63 -0
  7. package/esm2022/lib/buttons/btn-action/btn-action.component.mjs +55 -0
  8. package/esm2022/lib/buttons/btn-cancelar/btn-cancelar.component.mjs +25 -0
  9. package/esm2022/lib/buttons/btn-excluir/btn-excluir.component.mjs +29 -0
  10. package/esm2022/lib/buttons/btn-novo/btn-novo.component.mjs +33 -0
  11. package/esm2022/lib/buttons/btn-salvar/btn-salvar.component.mjs +19 -0
  12. package/esm2022/lib/entity-edit/entity-edit.component.mjs +53 -0
  13. package/esm2022/lib/grid-view/grid-view.component.mjs +275 -0
  14. package/esm2022/lib/input-area/input-area.component.mjs +72 -0
  15. package/esm2022/lib/input-arquivo/input-arquivo.component.mjs +154 -0
  16. package/esm2022/lib/input-cep/input-cep.component.mjs +180 -0
  17. package/esm2022/lib/input-checkbox/input-checkbox.component.mjs +51 -0
  18. package/esm2022/lib/input-format/input-format.component.mjs +138 -0
  19. package/esm2022/lib/input-pesquisa/input-pesquisa.component.mjs +557 -0
  20. package/esm2022/lib/input-radio/input-radio.component.mjs +58 -0
  21. package/esm2022/lib/input-select/input-select.component.mjs +110 -0
  22. package/esm2022/lib/input-text/input-text.component.mjs +88 -0
  23. package/esm2022/lib/input-valor/input-valor.component.mjs +161 -0
  24. package/esm2022/lib/lib-config.mjs +2 -0
  25. package/esm2022/lib/model-treeview/model-treeview.component.mjs +126 -0
  26. package/esm2022/lib/tree-view/tree-view.component.mjs +104 -0
  27. package/esm2022/lib/tree-view-nivel/tree-view-nivel.component.mjs +50 -0
  28. package/esm2022/public-api.mjs +30 -0
  29. package/fesm2022/appproject-components.mjs +2531 -0
  30. package/fesm2022/appproject-components.mjs.map +1 -0
  31. package/index.d.ts +5 -0
  32. package/lib/appproject-components.component.d.ts +8 -0
  33. package/lib/appproject-components.module.d.ts +36 -0
  34. package/lib/appproject-components.service.d.ts +6 -0
  35. package/lib/baseInputComponent.d.ts +28 -0
  36. package/lib/buttons/baseBtnComponent.d.ts +19 -0
  37. package/lib/buttons/btn-action/btn-action.component.d.ts +21 -0
  38. package/lib/buttons/btn-cancelar/btn-cancelar.component.d.ts +10 -0
  39. package/lib/buttons/btn-excluir/btn-excluir.component.d.ts +12 -0
  40. package/lib/buttons/btn-novo/btn-novo.component.d.ts +13 -0
  41. package/lib/buttons/btn-salvar/btn-salvar.component.d.ts +9 -0
  42. package/lib/entity-edit/entity-edit.component.d.ts +22 -0
  43. package/lib/grid-view/grid-view.component.d.ts +52 -0
  44. package/lib/input-area/input-area.component.d.ts +24 -0
  45. package/lib/input-arquivo/input-arquivo.component.d.ts +43 -0
  46. package/lib/input-cep/input-cep.component.d.ts +29 -0
  47. package/lib/input-checkbox/input-checkbox.component.d.ts +21 -0
  48. package/lib/input-format/input-format.component.d.ts +27 -0
  49. package/lib/input-pesquisa/input-pesquisa.component.d.ts +69 -0
  50. package/lib/input-radio/input-radio.component.d.ts +23 -0
  51. package/lib/input-select/input-select.component.d.ts +32 -0
  52. package/lib/input-text/input-text.component.d.ts +33 -0
  53. package/lib/input-valor/input-valor.component.d.ts +29 -0
  54. package/{src/lib/lib-config.ts → lib/lib-config.d.ts} +3 -4
  55. package/lib/model-treeview/model-treeview.component.d.ts +39 -0
  56. package/lib/tree-view/tree-view.component.d.ts +23 -0
  57. package/lib/tree-view-nivel/tree-view-nivel.component.d.ts +17 -0
  58. package/package.json +26 -15
  59. package/{src/public-api.ts → public-api.d.ts} +24 -30
  60. package/karma.conf.js +0 -44
  61. package/ng-package.json +0 -7
  62. package/src/lib/appproject-components.component.spec.ts +0 -23
  63. package/src/lib/appproject-components.component.ts +0 -20
  64. package/src/lib/appproject-components.module.ts +0 -106
  65. package/src/lib/appproject-components.service.spec.ts +0 -16
  66. package/src/lib/appproject-components.service.ts +0 -9
  67. package/src/lib/baseComponent.scss +0 -162
  68. package/src/lib/baseInputComponent.ts +0 -35
  69. package/src/lib/buttons/baseBtnComponent.ts +0 -38
  70. package/src/lib/buttons/btn-action/btn-action.component.html +0 -11
  71. package/src/lib/buttons/btn-action/btn-action.component.scss +0 -7
  72. package/src/lib/buttons/btn-action/btn-action.component.spec.ts +0 -24
  73. package/src/lib/buttons/btn-action/btn-action.component.ts +0 -31
  74. package/src/lib/buttons/btn-cancelar/btn-cancelar.component.html +0 -14
  75. package/src/lib/buttons/btn-cancelar/btn-cancelar.component.scss +0 -5
  76. package/src/lib/buttons/btn-cancelar/btn-cancelar.component.spec.ts +0 -24
  77. package/src/lib/buttons/btn-cancelar/btn-cancelar.component.ts +0 -19
  78. package/src/lib/buttons/btn-excluir/btn-excluir.component.html +0 -6
  79. package/src/lib/buttons/btn-excluir/btn-excluir.component.scss +0 -5
  80. package/src/lib/buttons/btn-excluir/btn-excluir.component.spec.ts +0 -24
  81. package/src/lib/buttons/btn-excluir/btn-excluir.component.ts +0 -18
  82. package/src/lib/buttons/btn-novo/btn-novo.component.html +0 -14
  83. package/src/lib/buttons/btn-novo/btn-novo.component.scss +0 -8
  84. package/src/lib/buttons/btn-novo/btn-novo.component.spec.ts +0 -24
  85. package/src/lib/buttons/btn-novo/btn-novo.component.ts +0 -20
  86. package/src/lib/buttons/btn-salvar/btn-salvar.component.html +0 -8
  87. package/src/lib/buttons/btn-salvar/btn-salvar.component.scss +0 -5
  88. package/src/lib/buttons/btn-salvar/btn-salvar.component.spec.ts +0 -24
  89. package/src/lib/buttons/btn-salvar/btn-salvar.component.ts +0 -16
  90. package/src/lib/entity-edit/entity-edit.component.html +0 -143
  91. package/src/lib/entity-edit/entity-edit.component.scss +0 -4
  92. package/src/lib/entity-edit/entity-edit.component.spec.ts +0 -23
  93. package/src/lib/entity-edit/entity-edit.component.ts +0 -43
  94. package/src/lib/grid-view/grid-view.component.html +0 -116
  95. package/src/lib/grid-view/grid-view.component.scss +0 -47
  96. package/src/lib/grid-view/grid-view.component.spec.ts +0 -23
  97. package/src/lib/grid-view/grid-view.component.ts +0 -292
  98. package/src/lib/input-area/input-area.component.html +0 -30
  99. package/src/lib/input-area/input-area.component.scss +0 -68
  100. package/src/lib/input-area/input-area.component.spec.ts +0 -23
  101. package/src/lib/input-area/input-area.component.ts +0 -69
  102. package/src/lib/input-arquivo/input-arquivo.component.html +0 -11
  103. package/src/lib/input-arquivo/input-arquivo.component.scss +0 -0
  104. package/src/lib/input-arquivo/input-arquivo.component.spec.ts +0 -23
  105. package/src/lib/input-arquivo/input-arquivo.component.ts +0 -140
  106. package/src/lib/input-cep/input-cep.component.html +0 -38
  107. package/src/lib/input-cep/input-cep.component.scss +0 -0
  108. package/src/lib/input-cep/input-cep.component.spec.ts +0 -23
  109. package/src/lib/input-cep/input-cep.component.ts +0 -186
  110. package/src/lib/input-checkbox/input-checkbox.component.html +0 -12
  111. package/src/lib/input-checkbox/input-checkbox.component.scss +0 -11
  112. package/src/lib/input-checkbox/input-checkbox.component.spec.ts +0 -23
  113. package/src/lib/input-checkbox/input-checkbox.component.ts +0 -48
  114. package/src/lib/input-format/input-format.component.html +0 -32
  115. package/src/lib/input-format/input-format.component.scss +0 -47
  116. package/src/lib/input-format/input-format.component.spec.ts +0 -23
  117. package/src/lib/input-format/input-format.component.ts +0 -139
  118. package/src/lib/input-pesquisa/input-pesquisa.component.html +0 -77
  119. package/src/lib/input-pesquisa/input-pesquisa.component.scss +0 -127
  120. package/src/lib/input-pesquisa/input-pesquisa.component.spec.ts +0 -23
  121. package/src/lib/input-pesquisa/input-pesquisa.component.ts +0 -558
  122. package/src/lib/input-radio/input-radio.component.html +0 -21
  123. package/src/lib/input-radio/input-radio.component.scss +0 -3
  124. package/src/lib/input-radio/input-radio.component.spec.ts +0 -23
  125. package/src/lib/input-radio/input-radio.component.ts +0 -49
  126. package/src/lib/input-select/input-select.component.html +0 -29
  127. package/src/lib/input-select/input-select.component.scss +0 -62
  128. package/src/lib/input-select/input-select.component.spec.ts +0 -23
  129. package/src/lib/input-select/input-select.component.ts +0 -96
  130. package/src/lib/input-text/input-text.component.html +0 -48
  131. package/src/lib/input-text/input-text.component.scss +0 -63
  132. package/src/lib/input-text/input-text.component.spec.ts +0 -23
  133. package/src/lib/input-text/input-text.component.ts +0 -78
  134. package/src/lib/input-valor/input-valor.component.html +0 -32
  135. package/src/lib/input-valor/input-valor.component.scss +0 -47
  136. package/src/lib/input-valor/input-valor.component.spec.ts +0 -23
  137. package/src/lib/input-valor/input-valor.component.ts +0 -164
  138. package/src/lib/model-treeview/model-treeview.component.html +0 -20
  139. package/src/lib/model-treeview/model-treeview.component.scss +0 -0
  140. package/src/lib/model-treeview/model-treeview.component.spec.ts +0 -23
  141. package/src/lib/model-treeview/model-treeview.component.ts +0 -152
  142. package/src/lib/tree-view/tree-view.component.html +0 -96
  143. package/src/lib/tree-view/tree-view.component.scss +0 -50
  144. package/src/lib/tree-view/tree-view.component.spec.ts +0 -23
  145. package/src/lib/tree-view/tree-view.component.ts +0 -92
  146. package/src/lib/tree-view-nivel/tree-view-nivel.component.html +0 -17
  147. package/src/lib/tree-view-nivel/tree-view-nivel.component.scss +0 -8
  148. package/src/lib/tree-view-nivel/tree-view-nivel.component.spec.ts +0 -23
  149. package/src/lib/tree-view-nivel/tree-view-nivel.component.ts +0 -43
  150. package/src/test.ts +0 -15
  151. package/tsconfig.lib.json +0 -15
  152. package/tsconfig.lib.prod.json +0 -10
  153. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,53 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@ionic/angular";
5
+ import * as i3 from "@angular/forms";
6
+ import * as i4 from "../input-text/input-text.component";
7
+ import * as i5 from "../input-format/input-format.component";
8
+ import * as i6 from "../input-select/input-select.component";
9
+ import * as i7 from "../input-pesquisa/input-pesquisa.component";
10
+ import * as i8 from "../input-valor/input-valor.component";
11
+ import * as i9 from "../input-area/input-area.component";
12
+ import * as i10 from "../input-cep/input-cep.component";
13
+ import * as i11 from "../input-checkbox/input-checkbox.component";
14
+ import * as i12 from "../input-radio/input-radio.component";
15
+ export class EntityEditComponent {
16
+ constructor(ngZone) {
17
+ this.ngZone = ngZone;
18
+ this.itemClass = "";
19
+ this.rowClass = "";
20
+ }
21
+ ngOnInit() {
22
+ //this.getEntidadeCampos();
23
+ }
24
+ getEntidadeCampos() {
25
+ //this.entidade = new this.entidadeTipo();
26
+ // console.log(this.entidade);
27
+ // this.ngZone.run(() =>
28
+ // this.campos = this.entidade.getHtmlForm()
29
+ // );
30
+ // console.log(this.campos);
31
+ }
32
+ emptyHandler() {
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: EntityEditComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: EntityEditComponent, selector: "kb-entity-edit", inputs: { entidade: "entidade", campos: "campos", entidadeForm: "entidadeForm", validation_messages: "validation_messages", itemClass: "itemClass", rowClass: "rowClass" }, ngImport: i0, template: "<form *ngIf=\"campos && campos.length\" [formGroup]=\"entidadeForm\" style=\"width: 100%;\">\n\n\n <ion-row *ngFor=\"let linha of campos\" [class]=\"rowClass\">\n <ng-container *ngFor=\"let campo of linha.Linha\">\n <!-- {{ campo.Nome }} {{ campo.Tipo }} -->\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-text'\">\n <kb-input-text label=\"{{campo.Label ?? campo.Nome}}\" [placeholder]=\"campo.PlaceHolderVisivel ? (campo.Label ?? campo.Nome + '...') : ''\"\n [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n [formControlName]=\"campo.Nome\" [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" \n [type]=\"campo.TipoInput ?? 'text'\" \n [showSeePassword]=\"campo.TipoInput == 'password'\"\n [showCustomAction]=\"campo.InputAction\"\n [customActionIcon]=\"campo.InputActionIcon ?? 'search-outline'\"\n (customActionClick)=\"campo.click ? campo.click($event) : emptyHandler()\"\n\n [itemClass]=\"itemClass\">\n </kb-input-text>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-area'\">\n <kb-input-area label=\"{{campo.Label ?? campo.Nome}}\" [placeholder]=\"campo.PlaceHolderVisivel ? (campo.Label ?? campo.Nome + '...') : ''\"\n [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n [formControlName]=\"campo.Nome\" [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" [linhas]=\"campo.Linhas ?? 5\"\n [itemClass]=\"itemClass\">\n </kb-input-area>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-cep'\">\n <kb-input-cep label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\"\n (getResultados)=\"campo.change ? campo.change($event) : emptyHandler()\"\n >\n </kb-input-cep>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-valor'\">\n <kb-input-valor label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-valor>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-format'\">\n <kb-input-format label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" [formato]=\"campo.Formato ?? ''\"\n [itemClass]=\"itemClass\">\n </kb-input-format>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-checkbox'\">\n <kb-input-checkbox label=\"{{ campo.Label }}\" [form]=\"entidadeForm\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" \n [itemClass]=\"itemClass\"\n [labelColor]=\"campo.BtnColor\">\n\n </kb-input-checkbox>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-select'\">\n <kb-input-select [label]=\"campo.Label ?? campo.Nome\" [placeholder]=\"'Selecionar...'\"\n [formControlName]=\"campo.Nome\" [form]=\"entidadeForm\" [itens]=\"campo.Itens\" [itemId]=\"campo.ItemId ?? 'Id'\"\n [itemNome]=\"campo.ItemNome ?? 'Nome'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n (selectChangeEntity)=\"campo.change ? campo.change($event) : emptyHandler()\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-select>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-radio'\">\n <kb-input-radio [label]=\"campo.Label ?? campo.Nome\" [formControlName]=\"campo.Nome\" [form]=\"entidadeForm\"\n [itens]=\"campo.Itens\" [itemId]=\"campo.ItemId\" [itemNome]=\"campo.ItemNome\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-radio>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-pesquisa'\">\n <kb-input-pesquisa #pesquisaCentroCustoPai \n [label]=\"campo.Label ?? campo.Nome\" \n [campoId]=\"campo.ItemId\"\n [focusField]=\"campo.focusField\"\n [formControlName]=\"campo.Nome\" \n placeholder=\"Pesquisar...\" \n [campoDisplay]=\"campo.ItemNome ?? 'Nome'\" \n [form]=\"entidadeForm\"\n [tipo]=\"campo.TipoPesquisa\" \n [urlItem]=\"campo.UrlItem\" \n [max]=\"campo.Tamanho ?? '50'\" \n [url]=\"campo.UrlPesquisa\" \n [readonly]=\"campo.ReadOnly\"\n (pesquisaChange)=\"campo.change ? campo.change($event) : emptyHandler()\"\n [itemClass]=\"itemClass\">\n </kb-input-pesquisa>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-button'\">\n <!-- \n <kb-btn-action [title]=\"campo.Label\" [icon]=\"campo.Icon\" [iconSrc]=\"campo.IconSrc\" [color]=\"campo.BtnColor ?? 'light'\" \n [expand]=\"campo.BtnExpand ?? 'block'\" style=\"margin-top: var(--btn-action-margin-top, auto);\">\n </kb-btn-action>\n -->\n <ion-button [expand]=\"campo.BtnExpand ?? 'block'\" [color]=\"campo.BtnColor ?? 'light'\"\n (click)=\"campo.click ? campo.click($event) : emptyHandler()\" [size]=\"campo.BtnSize ?? 'default'\"\n [disabled]=\"campo.ReadOnly\">\n <ion-icon *ngIf=\"campo.Icon || campo.IconSrc\" [name]=\"campo.Icon\" [src]=\"campo.IconSrc\"></ion-icon>\n {{ campo.Label }}\n </ion-button>\n </ion-col>\n\n <ion-col *ngIf=\"campo.Tipo == 'col'\" size-md=\"1\" size-xs=\"0\">\n\n </ion-col>\n\n <ion-col *ngIf=\"campo.Tipo == 'sub-titulo'\" size=\"12\">\n <ion-list lines=\"none\" class=\"ion-no-padding\">\n <ion-list-header color=\"primary\" [style]=\"campo.CampoStyle ?? ''\"> \n <ion-label [style]=\"campo.LabelStyle ?? ''\">{{ campo.Label }}</ion-label>\n </ion-list-header>\n </ion-list>\n </ion-col>\n </ng-container>\n </ion-row>\n\n <!--\n <ion-col class=\"select ion-no-margin ion-no-padding\">\n <ion-item lines=\"none\">\n <ion-label>Totalizador</ion-label>\n <ion-checkbox slot=\"start\" formControlName=\"Totalizador\"></ion-checkbox>\n </ion-item>\n </ion-col>\n <ion-col class=\"select ion-no-margin ion-no-padding\">\n <ion-item lines=\"none\">\n <ion-label>Inativo</ion-label>\n <ion-checkbox slot=\"start\" formControlName=\"Inativo\"></ion-checkbox>\n </ion-item>\n </ion-col>\n -->\n</form>", styles: ["ion-list-header{text-align:center;font-size:large}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.InputTextComponent, selector: "kb-input-text", inputs: ["iconInput", "inputSpanAfter", "campoFoco", "showCustomAction", "customActionIcon"], outputs: ["customActionClick"] }, { kind: "component", type: i5.InputFormatComponent, selector: "kb-input-format", inputs: ["formato", "keyEnter"] }, { kind: "component", type: i6.InputSelectComponent, selector: "kb-input-select", inputs: ["itens", "itemId", "itemNome", "showNovo", "itemNull", "opcaoDefault"], outputs: ["selectChange", "selectChangeEntity"] }, { kind: "component", type: i7.InputPesquisaComponent, selector: "kb-input-pesquisa", inputs: ["textoPesquisa", "max", "filterFunction", "selectId", "campoId", "campoPaiId", "campoDisplay", "tipo", "pesquisaChange", "pesquisaAction", "limpar", "url", "urlItem", "urlTree", "empresa", "loadInit", "treeTitulo"] }, { kind: "component", type: i8.InputValorComponent, selector: "kb-input-valor", inputs: ["maxValor"] }, { kind: "component", type: i9.InputAreaComponent, selector: "kb-input-area", inputs: ["linhas"] }, { kind: "component", type: i10.InputCepComponent, selector: "kb-input-cep", inputs: ["formato", "keyEnter"], outputs: ["getResultados"] }, { kind: "component", type: i11.InputCheckboxComponent, selector: "kb-input-checkbox", inputs: ["justify", "labelPlacement"] }, { kind: "component", type: i12.InputRadioComponent, selector: "kb-input-radio", inputs: ["itens", "itemId", "itemNome", "color"] }] }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: EntityEditComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ selector: 'kb-entity-edit', template: "<form *ngIf=\"campos && campos.length\" [formGroup]=\"entidadeForm\" style=\"width: 100%;\">\n\n\n <ion-row *ngFor=\"let linha of campos\" [class]=\"rowClass\">\n <ng-container *ngFor=\"let campo of linha.Linha\">\n <!-- {{ campo.Nome }} {{ campo.Tipo }} -->\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-text'\">\n <kb-input-text label=\"{{campo.Label ?? campo.Nome}}\" [placeholder]=\"campo.PlaceHolderVisivel ? (campo.Label ?? campo.Nome + '...') : ''\"\n [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n [formControlName]=\"campo.Nome\" [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" \n [type]=\"campo.TipoInput ?? 'text'\" \n [showSeePassword]=\"campo.TipoInput == 'password'\"\n [showCustomAction]=\"campo.InputAction\"\n [customActionIcon]=\"campo.InputActionIcon ?? 'search-outline'\"\n (customActionClick)=\"campo.click ? campo.click($event) : emptyHandler()\"\n\n [itemClass]=\"itemClass\">\n </kb-input-text>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-area'\">\n <kb-input-area label=\"{{campo.Label ?? campo.Nome}}\" [placeholder]=\"campo.PlaceHolderVisivel ? (campo.Label ?? campo.Nome + '...') : ''\"\n [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n [formControlName]=\"campo.Nome\" [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" [linhas]=\"campo.Linhas ?? 5\"\n [itemClass]=\"itemClass\">\n </kb-input-area>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-cep'\">\n <kb-input-cep label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\"\n (getResultados)=\"campo.change ? campo.change($event) : emptyHandler()\"\n >\n </kb-input-cep>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-valor'\">\n <kb-input-valor label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-valor>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-format'\">\n <kb-input-format label=\"{{campo.Label ?? campo.Nome}}\" [form]=\"entidadeForm\" [max]=\"campo.Tamanho ?? '50'\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" [formato]=\"campo.Formato ?? ''\"\n [itemClass]=\"itemClass\">\n </kb-input-format>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-checkbox'\">\n <kb-input-checkbox label=\"{{ campo.Label }}\" [form]=\"entidadeForm\"\n [validation_messages]=\"validation_messages[campo.Nome]\" [formControlName]=\"campo.Nome\"\n [campoFoco]=\"campo.CampoFoco\" [readonly]=\"campo.ReadOnly\" \n [itemClass]=\"itemClass\"\n [labelColor]=\"campo.BtnColor\">\n\n </kb-input-checkbox>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-select'\">\n <kb-input-select [label]=\"campo.Label ?? campo.Nome\" [placeholder]=\"'Selecionar...'\"\n [formControlName]=\"campo.Nome\" [form]=\"entidadeForm\" [itens]=\"campo.Itens\" [itemId]=\"campo.ItemId ?? 'Id'\"\n [itemNome]=\"campo.ItemNome ?? 'Nome'\" [validation_messages]=\"validation_messages[campo.Nome]\"\n (selectChangeEntity)=\"campo.change ? campo.change($event) : emptyHandler()\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-select>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-radio'\">\n <kb-input-radio [label]=\"campo.Label ?? campo.Nome\" [formControlName]=\"campo.Nome\" [form]=\"entidadeForm\"\n [itens]=\"campo.Itens\" [itemId]=\"campo.ItemId\" [itemNome]=\"campo.ItemNome\" [readonly]=\"campo.ReadOnly\"\n [itemClass]=\"itemClass\">\n </kb-input-radio>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-pesquisa'\">\n <kb-input-pesquisa #pesquisaCentroCustoPai \n [label]=\"campo.Label ?? campo.Nome\" \n [campoId]=\"campo.ItemId\"\n [focusField]=\"campo.focusField\"\n [formControlName]=\"campo.Nome\" \n placeholder=\"Pesquisar...\" \n [campoDisplay]=\"campo.ItemNome ?? 'Nome'\" \n [form]=\"entidadeForm\"\n [tipo]=\"campo.TipoPesquisa\" \n [urlItem]=\"campo.UrlItem\" \n [max]=\"campo.Tamanho ?? '50'\" \n [url]=\"campo.UrlPesquisa\" \n [readonly]=\"campo.ReadOnly\"\n (pesquisaChange)=\"campo.change ? campo.change($event) : emptyHandler()\"\n [itemClass]=\"itemClass\">\n </kb-input-pesquisa>\n </ion-col>\n\n <ion-col [sizeMd]=\"campo.Size\" *ngIf=\"campo.Tipo == 'input-button'\">\n <!-- \n <kb-btn-action [title]=\"campo.Label\" [icon]=\"campo.Icon\" [iconSrc]=\"campo.IconSrc\" [color]=\"campo.BtnColor ?? 'light'\" \n [expand]=\"campo.BtnExpand ?? 'block'\" style=\"margin-top: var(--btn-action-margin-top, auto);\">\n </kb-btn-action>\n -->\n <ion-button [expand]=\"campo.BtnExpand ?? 'block'\" [color]=\"campo.BtnColor ?? 'light'\"\n (click)=\"campo.click ? campo.click($event) : emptyHandler()\" [size]=\"campo.BtnSize ?? 'default'\"\n [disabled]=\"campo.ReadOnly\">\n <ion-icon *ngIf=\"campo.Icon || campo.IconSrc\" [name]=\"campo.Icon\" [src]=\"campo.IconSrc\"></ion-icon>\n {{ campo.Label }}\n </ion-button>\n </ion-col>\n\n <ion-col *ngIf=\"campo.Tipo == 'col'\" size-md=\"1\" size-xs=\"0\">\n\n </ion-col>\n\n <ion-col *ngIf=\"campo.Tipo == 'sub-titulo'\" size=\"12\">\n <ion-list lines=\"none\" class=\"ion-no-padding\">\n <ion-list-header color=\"primary\" [style]=\"campo.CampoStyle ?? ''\"> \n <ion-label [style]=\"campo.LabelStyle ?? ''\">{{ campo.Label }}</ion-label>\n </ion-list-header>\n </ion-list>\n </ion-col>\n </ng-container>\n </ion-row>\n\n <!--\n <ion-col class=\"select ion-no-margin ion-no-padding\">\n <ion-item lines=\"none\">\n <ion-label>Totalizador</ion-label>\n <ion-checkbox slot=\"start\" formControlName=\"Totalizador\"></ion-checkbox>\n </ion-item>\n </ion-col>\n <ion-col class=\"select ion-no-margin ion-no-padding\">\n <ion-item lines=\"none\">\n <ion-label>Inativo</ion-label>\n <ion-checkbox slot=\"start\" formControlName=\"Inativo\"></ion-checkbox>\n </ion-item>\n </ion-col>\n -->\n</form>", styles: ["ion-list-header{text-align:center;font-size:large}\n"] }]
40
+ }], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { entidade: [{
41
+ type: Input
42
+ }], campos: [{
43
+ type: Input
44
+ }], entidadeForm: [{
45
+ type: Input
46
+ }], validation_messages: [{
47
+ type: Input
48
+ }], itemClass: [{
49
+ type: Input
50
+ }], rowClass: [{
51
+ type: Input
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvZW50aXR5LWVkaXQvZW50aXR5LWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvZW50aXR5LWVkaXQvZW50aXR5LWVkaXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWtCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVVqRSxNQUFNLE9BQU8sbUJBQW1CO0lBVzlCLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRnpCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsYUFBUSxHQUFXLEVBQUUsQ0FBQztJQUcvQixDQUFDO0lBRUQsUUFBUTtRQUNOLDJCQUEyQjtJQUM3QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsMENBQTBDO1FBRTFDLDhCQUE4QjtRQUM5Qix5QkFBeUI7UUFDekIsOENBQThDO1FBQzlDLEtBQUs7UUFDTCw0QkFBNEI7SUFDOUIsQ0FBQztJQUVELFlBQVk7SUFFWixDQUFDOzhHQS9CVSxtQkFBbUI7a0dBQW5CLG1CQUFtQixrT0NWaEMsa3RPQThJTzs7MkZEcElNLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxnQkFBZ0I7MkVBTWpCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE5nWm9uZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYXNlTW9kZWwsIEh0bWxSb3cgfSBmcm9tICdhcHBwcm9qZWN0LWxpYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tiLWVudGl0eS1lZGl0JyxcbiAgLy9zdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZW50aXR5LWVkaXQuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEVudGl0eUVkaXRDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VNb2RlbD4gaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBlbnRpZGFkZTogVCB8IG51bGw7XG4gIC8vZW50aWRhZGU6IGFueTtcbiAgLyoqXG4gICAqIFZhaSByZWNlYmVyIG1vbnRhZG8gZG8gYmFzZSBjYWRhc3Ryb1xuICAgKi9cbiAgQElucHV0KCkgY2FtcG9zOiBIdG1sUm93W107XG4gIEBJbnB1dCgpIGVudGlkYWRlRm9ybTogRm9ybUdyb3VwO1xuICBASW5wdXQoKSB2YWxpZGF0aW9uX21lc3NhZ2VzOiBhbnk7XG4gIEBJbnB1dCgpIGl0ZW1DbGFzczogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgcm93Q2xhc3M6IHN0cmluZyA9IFwiXCI7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy90aGlzLmdldEVudGlkYWRlQ2FtcG9zKCk7XG4gIH1cblxuICBnZXRFbnRpZGFkZUNhbXBvcygpIHtcbiAgICAvL3RoaXMuZW50aWRhZGUgPSBuZXcgdGhpcy5lbnRpZGFkZVRpcG8oKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZW50aWRhZGUpO1xuICAgIC8vIHRoaXMubmdab25lLnJ1bigoKSA9PiBcbiAgICAvLyAgIHRoaXMuY2FtcG9zID0gdGhpcy5lbnRpZGFkZS5nZXRIdG1sRm9ybSgpXG4gICAgLy8gKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmNhbXBvcyk7XG4gIH1cblxuICBlbXB0eUhhbmRsZXIoKSB7XG5cbiAgfVxufVxuIiwiPGZvcm0gKm5nSWY9XCJjYW1wb3MgJiYgY2FtcG9zLmxlbmd0aFwiIFtmb3JtR3JvdXBdPVwiZW50aWRhZGVGb3JtXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cblxuXG4gIDxpb24tcm93ICpuZ0Zvcj1cImxldCBsaW5oYSBvZiBjYW1wb3NcIiBbY2xhc3NdPVwicm93Q2xhc3NcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYW1wbyBvZiBsaW5oYS5MaW5oYVwiPlxuICAgICAgPCEtLSB7eyBjYW1wby5Ob21lIH19IHt7IGNhbXBvLlRpcG8gfX0gLS0+XG5cbiAgICAgIDxpb24tY29sIFtzaXplTWRdPVwiY2FtcG8uU2l6ZVwiICpuZ0lmPVwiY2FtcG8uVGlwbyA9PSAnaW5wdXQtdGV4dCdcIj5cbiAgICAgICAgPGtiLWlucHV0LXRleHQgbGFiZWw9XCJ7e2NhbXBvLkxhYmVsID8/IGNhbXBvLk5vbWV9fVwiIFtwbGFjZWhvbGRlcl09XCJjYW1wby5QbGFjZUhvbGRlclZpc2l2ZWwgPyAoY2FtcG8uTGFiZWwgPz8gY2FtcG8uTm9tZSArICcuLi4nKSA6ICcnXCJcbiAgICAgICAgICBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIiBbbWF4XT1cImNhbXBvLlRhbWFuaG8gPz8gJzUwJ1wiIFt2YWxpZGF0aW9uX21lc3NhZ2VzXT1cInZhbGlkYXRpb25fbWVzc2FnZXNbY2FtcG8uTm9tZV1cIlxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY2FtcG8uTm9tZVwiIFtjYW1wb0ZvY29dPVwiY2FtcG8uQ2FtcG9Gb2NvXCIgW3JlYWRvbmx5XT1cImNhbXBvLlJlYWRPbmx5XCIgICAgICAgICAgXG4gICAgICAgICAgW3R5cGVdPVwiY2FtcG8uVGlwb0lucHV0ID8/ICd0ZXh0J1wiIFxuICAgICAgICAgIFtzaG93U2VlUGFzc3dvcmRdPVwiY2FtcG8uVGlwb0lucHV0ID09ICdwYXNzd29yZCdcIlxuICAgICAgICAgIFtzaG93Q3VzdG9tQWN0aW9uXT1cImNhbXBvLklucHV0QWN0aW9uXCJcbiAgICAgICAgICBbY3VzdG9tQWN0aW9uSWNvbl09XCJjYW1wby5JbnB1dEFjdGlvbkljb24gPz8gJ3NlYXJjaC1vdXRsaW5lJ1wiXG4gICAgICAgICAgKGN1c3RvbUFjdGlvbkNsaWNrKT1cImNhbXBvLmNsaWNrID8gY2FtcG8uY2xpY2soJGV2ZW50KSA6IGVtcHR5SGFuZGxlcigpXCJcblxuICAgICAgICAgIFtpdGVtQ2xhc3NdPVwiaXRlbUNsYXNzXCI+XG4gICAgICAgIDwva2ItaW5wdXQtdGV4dD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1hcmVhJ1wiPlxuICAgICAgICA8a2ItaW5wdXQtYXJlYSBsYWJlbD1cInt7Y2FtcG8uTGFiZWwgPz8gY2FtcG8uTm9tZX19XCIgW3BsYWNlaG9sZGVyXT1cImNhbXBvLlBsYWNlSG9sZGVyVmlzaXZlbCA/IChjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lICsgJy4uLicpIDogJydcIlxuICAgICAgICAgIFtmb3JtXT1cImVudGlkYWRlRm9ybVwiIFttYXhdPVwiY2FtcG8uVGFtYW5obyA/PyAnNTAnXCIgW3ZhbGlkYXRpb25fbWVzc2FnZXNdPVwidmFsaWRhdGlvbl9tZXNzYWdlc1tjYW1wby5Ob21lXVwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjYW1wby5Ob21lXCIgW2NhbXBvRm9jb109XCJjYW1wby5DYW1wb0ZvY29cIiBbcmVhZG9ubHldPVwiY2FtcG8uUmVhZE9ubHlcIiBbbGluaGFzXT1cImNhbXBvLkxpbmhhcyA/PyA1XCJcbiAgICAgICAgICBbaXRlbUNsYXNzXT1cIml0ZW1DbGFzc1wiPlxuICAgICAgICA8L2tiLWlucHV0LWFyZWE+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDxpb24tY29sIFtzaXplTWRdPVwiY2FtcG8uU2l6ZVwiICpuZ0lmPVwiY2FtcG8uVGlwbyA9PSAnaW5wdXQtY2VwJ1wiPlxuICAgICAgICA8a2ItaW5wdXQtY2VwIGxhYmVsPVwie3tjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lfX1cIiBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIlxuICAgICAgICAgIFt2YWxpZGF0aW9uX21lc3NhZ2VzXT1cInZhbGlkYXRpb25fbWVzc2FnZXNbY2FtcG8uTm9tZV1cIiBbZm9ybUNvbnRyb2xOYW1lXT1cImNhbXBvLk5vbWVcIlxuICAgICAgICAgIFtjYW1wb0ZvY29dPVwiY2FtcG8uQ2FtcG9Gb2NvXCIgW3JlYWRvbmx5XT1cImNhbXBvLlJlYWRPbmx5XCJcbiAgICAgICAgICBbaXRlbUNsYXNzXT1cIml0ZW1DbGFzc1wiXG4gICAgICAgICAgKGdldFJlc3VsdGFkb3MpPVwiY2FtcG8uY2hhbmdlID8gY2FtcG8uY2hhbmdlKCRldmVudCkgOiBlbXB0eUhhbmRsZXIoKVwiXG4gICAgICAgICAgPlxuICAgICAgICA8L2tiLWlucHV0LWNlcD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC12YWxvcidcIj5cbiAgICAgICAgPGtiLWlucHV0LXZhbG9yIGxhYmVsPVwie3tjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lfX1cIiBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIiBbbWF4XT1cImNhbXBvLlRhbWFuaG8gPz8gJzUwJ1wiXG4gICAgICAgICAgW3ZhbGlkYXRpb25fbWVzc2FnZXNdPVwidmFsaWRhdGlvbl9tZXNzYWdlc1tjYW1wby5Ob21lXVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiY2FtcG8uTm9tZVwiXG4gICAgICAgICAgW2NhbXBvRm9jb109XCJjYW1wby5DYW1wb0ZvY29cIiBbcmVhZG9ubHldPVwiY2FtcG8uUmVhZE9ubHlcIlxuICAgICAgICAgIFtpdGVtQ2xhc3NdPVwiaXRlbUNsYXNzXCI+XG4gICAgICAgIDwva2ItaW5wdXQtdmFsb3I+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDxpb24tY29sIFtzaXplTWRdPVwiY2FtcG8uU2l6ZVwiICpuZ0lmPVwiY2FtcG8uVGlwbyA9PSAnaW5wdXQtZm9ybWF0J1wiPlxuICAgICAgICA8a2ItaW5wdXQtZm9ybWF0IGxhYmVsPVwie3tjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lfX1cIiBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIiBbbWF4XT1cImNhbXBvLlRhbWFuaG8gPz8gJzUwJ1wiXG4gICAgICAgICAgW3ZhbGlkYXRpb25fbWVzc2FnZXNdPVwidmFsaWRhdGlvbl9tZXNzYWdlc1tjYW1wby5Ob21lXVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiY2FtcG8uTm9tZVwiXG4gICAgICAgICAgW2NhbXBvRm9jb109XCJjYW1wby5DYW1wb0ZvY29cIiBbcmVhZG9ubHldPVwiY2FtcG8uUmVhZE9ubHlcIiBbZm9ybWF0b109XCJjYW1wby5Gb3JtYXRvID8/ICcnXCJcbiAgICAgICAgICBbaXRlbUNsYXNzXT1cIml0ZW1DbGFzc1wiPlxuICAgICAgICA8L2tiLWlucHV0LWZvcm1hdD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1jaGVja2JveCdcIj5cbiAgICAgICAgPGtiLWlucHV0LWNoZWNrYm94IGxhYmVsPVwie3sgY2FtcG8uTGFiZWwgfX1cIiBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIlxuICAgICAgICAgIFt2YWxpZGF0aW9uX21lc3NhZ2VzXT1cInZhbGlkYXRpb25fbWVzc2FnZXNbY2FtcG8uTm9tZV1cIiBbZm9ybUNvbnRyb2xOYW1lXT1cImNhbXBvLk5vbWVcIlxuICAgICAgICAgIFtjYW1wb0ZvY29dPVwiY2FtcG8uQ2FtcG9Gb2NvXCIgW3JlYWRvbmx5XT1cImNhbXBvLlJlYWRPbmx5XCIgXG4gICAgICAgICAgW2l0ZW1DbGFzc109XCJpdGVtQ2xhc3NcIlxuICAgICAgICAgIFtsYWJlbENvbG9yXT1cImNhbXBvLkJ0bkNvbG9yXCI+XG5cbiAgICAgICAgPC9rYi1pbnB1dC1jaGVja2JveD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1zZWxlY3QnXCI+XG4gICAgICAgIDxrYi1pbnB1dC1zZWxlY3QgW2xhYmVsXT1cImNhbXBvLkxhYmVsID8/IGNhbXBvLk5vbWVcIiBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjaW9uYXIuLi4nXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNhbXBvLk5vbWVcIiBbZm9ybV09XCJlbnRpZGFkZUZvcm1cIiBbaXRlbnNdPVwiY2FtcG8uSXRlbnNcIiBbaXRlbUlkXT1cImNhbXBvLkl0ZW1JZCA/PyAnSWQnXCJcbiAgICAgICAgICBbaXRlbU5vbWVdPVwiY2FtcG8uSXRlbU5vbWUgPz8gJ05vbWUnXCIgW3ZhbGlkYXRpb25fbWVzc2FnZXNdPVwidmFsaWRhdGlvbl9tZXNzYWdlc1tjYW1wby5Ob21lXVwiXG4gICAgICAgICAgKHNlbGVjdENoYW5nZUVudGl0eSk9XCJjYW1wby5jaGFuZ2UgPyBjYW1wby5jaGFuZ2UoJGV2ZW50KSA6IGVtcHR5SGFuZGxlcigpXCIgW3JlYWRvbmx5XT1cImNhbXBvLlJlYWRPbmx5XCJcbiAgICAgICAgICBbaXRlbUNsYXNzXT1cIml0ZW1DbGFzc1wiPlxuICAgICAgICA8L2tiLWlucHV0LXNlbGVjdD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1yYWRpbydcIj5cbiAgICAgICAgPGtiLWlucHV0LXJhZGlvIFtsYWJlbF09XCJjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lXCIgW2Zvcm1Db250cm9sTmFtZV09XCJjYW1wby5Ob21lXCIgW2Zvcm1dPVwiZW50aWRhZGVGb3JtXCJcbiAgICAgICAgICBbaXRlbnNdPVwiY2FtcG8uSXRlbnNcIiBbaXRlbUlkXT1cImNhbXBvLkl0ZW1JZFwiIFtpdGVtTm9tZV09XCJjYW1wby5JdGVtTm9tZVwiIFtyZWFkb25seV09XCJjYW1wby5SZWFkT25seVwiXG4gICAgICAgICAgW2l0ZW1DbGFzc109XCJpdGVtQ2xhc3NcIj5cbiAgICAgICAgPC9rYi1pbnB1dC1yYWRpbz5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1wZXNxdWlzYSdcIj5cbiAgICAgICAgPGtiLWlucHV0LXBlc3F1aXNhICNwZXNxdWlzYUNlbnRyb0N1c3RvUGFpIFxuICAgICAgICAgIFtsYWJlbF09XCJjYW1wby5MYWJlbCA/PyBjYW1wby5Ob21lXCIgXG4gICAgICAgICAgW2NhbXBvSWRdPVwiY2FtcG8uSXRlbUlkXCJcbiAgICAgICAgICBbZm9jdXNGaWVsZF09XCJjYW1wby5mb2N1c0ZpZWxkXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNhbXBvLk5vbWVcIiBcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBlc3F1aXNhci4uLlwiIFxuICAgICAgICAgIFtjYW1wb0Rpc3BsYXldPVwiY2FtcG8uSXRlbU5vbWUgPz8gJ05vbWUnXCIgXG4gICAgICAgICAgW2Zvcm1dPVwiZW50aWRhZGVGb3JtXCJcbiAgICAgICAgICBbdGlwb109XCJjYW1wby5UaXBvUGVzcXVpc2FcIiBcbiAgICAgICAgICBbdXJsSXRlbV09XCJjYW1wby5VcmxJdGVtXCIgXG4gICAgICAgICAgW21heF09XCJjYW1wby5UYW1hbmhvID8/ICc1MCdcIiBcbiAgICAgICAgICBbdXJsXT1cImNhbXBvLlVybFBlc3F1aXNhXCIgXG4gICAgICAgICAgW3JlYWRvbmx5XT1cImNhbXBvLlJlYWRPbmx5XCJcbiAgICAgICAgICAocGVzcXVpc2FDaGFuZ2UpPVwiY2FtcG8uY2hhbmdlID8gY2FtcG8uY2hhbmdlKCRldmVudCkgOiBlbXB0eUhhbmRsZXIoKVwiXG4gICAgICAgICAgW2l0ZW1DbGFzc109XCJpdGVtQ2xhc3NcIj5cbiAgICAgICAgPC9rYi1pbnB1dC1wZXNxdWlzYT5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgW3NpemVNZF09XCJjYW1wby5TaXplXCIgKm5nSWY9XCJjYW1wby5UaXBvID09ICdpbnB1dC1idXR0b24nXCI+XG4gICAgICAgIDwhLS0gXG4gICAgICAgIDxrYi1idG4tYWN0aW9uIFt0aXRsZV09XCJjYW1wby5MYWJlbFwiIFtpY29uXT1cImNhbXBvLkljb25cIiBbaWNvblNyY109XCJjYW1wby5JY29uU3JjXCIgW2NvbG9yXT1cImNhbXBvLkJ0bkNvbG9yID8/ICdsaWdodCdcIiBcbiAgICAgICAgICBbZXhwYW5kXT1cImNhbXBvLkJ0bkV4cGFuZCA/PyAnYmxvY2snXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiB2YXIoLS1idG4tYWN0aW9uLW1hcmdpbi10b3AsIGF1dG8pO1wiPlxuICAgICAgICA8L2tiLWJ0bi1hY3Rpb24+XG4gICAgICAtLT5cbiAgICAgICAgPGlvbi1idXR0b24gW2V4cGFuZF09XCJjYW1wby5CdG5FeHBhbmQgPz8gJ2Jsb2NrJ1wiIFtjb2xvcl09XCJjYW1wby5CdG5Db2xvciA/PyAnbGlnaHQnXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FtcG8uY2xpY2sgPyBjYW1wby5jbGljaygkZXZlbnQpIDogZW1wdHlIYW5kbGVyKClcIiBbc2l6ZV09XCJjYW1wby5CdG5TaXplID8/ICdkZWZhdWx0J1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImNhbXBvLlJlYWRPbmx5XCI+XG4gICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiY2FtcG8uSWNvbiB8fCBjYW1wby5JY29uU3JjXCIgW25hbWVdPVwiY2FtcG8uSWNvblwiIFtzcmNdPVwiY2FtcG8uSWNvblNyY1wiPjwvaW9uLWljb24+XG4gICAgICAgICAge3sgY2FtcG8uTGFiZWwgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8aW9uLWNvbCAqbmdJZj1cImNhbXBvLlRpcG8gPT0gJ2NvbCdcIiBzaXplLW1kPVwiMVwiIHNpemUteHM9XCIwXCI+XG5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgKm5nSWY9XCJjYW1wby5UaXBvID09ICdzdWItdGl0dWxvJ1wiIHNpemU9XCIxMlwiPlxuICAgICAgICA8aW9uLWxpc3QgbGluZXM9XCJub25lXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXIgY29sb3I9XCJwcmltYXJ5XCIgW3N0eWxlXT1cImNhbXBvLkNhbXBvU3R5bGUgPz8gJydcIj4gXG4gICAgICAgICAgICA8aW9uLWxhYmVsIFtzdHlsZV09XCJjYW1wby5MYWJlbFN0eWxlID8/ICcnXCI+e3sgY2FtcG8uTGFiZWwgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tcm93PlxuXG4gIDwhLS1cbiAgICA8aW9uLWNvbCBjbGFzcz1cInNlbGVjdCBpb24tbm8tbWFyZ2luIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XG4gICAgICAgIDxpb24tbGFiZWw+VG90YWxpemFkb3I8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1jaGVja2JveCBzbG90PVwic3RhcnRcIiBmb3JtQ29udHJvbE5hbWU9XCJUb3RhbGl6YWRvclwiPjwvaW9uLWNoZWNrYm94PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L2lvbi1jb2w+XG4gICAgPGlvbi1jb2wgY2xhc3M9XCJzZWxlY3QgaW9uLW5vLW1hcmdpbiBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiPlxuICAgICAgICA8aW9uLWxhYmVsPkluYXRpdm88L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1jaGVja2JveCBzbG90PVwic3RhcnRcIiBmb3JtQ29udHJvbE5hbWU9XCJJbmF0aXZvXCI+PC9pb24tY2hlY2tib3g+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvaW9uLWNvbD5cbiAgICAtLT5cbjwvZm9ybT4iXX0=
@@ -0,0 +1,275 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { GridTabela, LibService } from 'appproject-lib';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@ionic/angular";
6
+ import * as i3 from "@angular/forms";
7
+ import * as i4 from "appproject-lib";
8
+ export class GridViewComponent {
9
+ constructor() {
10
+ this.minHeight = '400px';
11
+ this.inMemoryPagination = false;
12
+ this.selecionarItem = new EventEmitter();
13
+ this.excluirItem = new EventEmitter();
14
+ this.selecionarChecked = new EventEmitter();
15
+ //inputs = inject(new InjectionToken<any>('title inputs'));
16
+ this.grupos = [{ Coluna: '', Tabela: null, Dados: null, Nivel: 0 }];
17
+ // tabelaCampos = {
18
+ // Selecionar: false,
19
+ // Exportar: true,
20
+ // Colunas: [
21
+ // { Campo: 'Id', Titulo: 'Id', Tamanho: '10%', Ordem: true, Grupo: false, Filtrar: true, OrdemStatus: 0, Tipo: 'number', Valores: [], FiltroOperador: '=', FiltroValor: '', FiltroVisivel: false },
22
+ // { Campo: 'Marca', Titulo: 'Marca', Tamanho: '25%', Ordem: true, Grupo: true, Filtrar: true, OrdemStatus: 0, Tipo: 'string', Valores: [], FiltroOperador: '=', FiltroValor: '', FiltroVisivel: false },
23
+ // { Campo: 'Descricao', Titulo: 'Descrição', Tamanho: '25%', Ordem: true, Grupo: true, Filtrar: true, OrdemStatus: 0, Tipo: 'string', Valores: [], FiltroOperador: '=', FiltroValor: '', FiltroVisivel: false },
24
+ // { Campo: 'Data', Titulo: 'Data', Tamanho: '20%', Ordem: true, Grupo: true, Filtrar: true, OrdemStatus: 0, Tipo: 'date', Valores: [], FiltroOperador: '=', FiltroValor: '', FiltroVisivel: false },
25
+ // { Campo: 'Valor', Titulo: 'Valor', Tamanho: '20%', Ordem: true, Grupo: false, Filtrar: true, OrdemStatus: 0, Tipo: 'number', Valores: [], FiltroOperador: '=', FiltroValor: '', FiltroVisivel: false },
26
+ // ]
27
+ // }
28
+ // dataSet: Array<any> = [
29
+ // { Id: 1, Marca: 'Apple', Descricao: 'IPhone 14', Data: '2023-05-01', Valor: 7899.99 },
30
+ // { Id: 2, Marca: 'Apple', Descricao: 'MacBook Pro', Data: '2023-06-01', Valor: 17999.99 },
31
+ // { Id: 3, Marca: 'Samsung', Descricao: 'Galaxy S23', Data: '2023-05-01', Valor: 6899.99 },
32
+ // { Id: 4, Marca: 'Sony', Descricao: 'PS 5', Data: '2023-06-01', Valor: 4899.99 },
33
+ // { Id: 5, Marca: 'Samsung', Descricao: 'Watch 23', Data: '2023-05-01', Valor: 1899.99 },
34
+ // ]
35
+ this.groups = [];
36
+ this.filteredDataSet = [];
37
+ this.pageDataSet = [];
38
+ //array com os campos filtrados para display
39
+ this.camposDisplay = [];
40
+ //filtro
41
+ this.isFiltroOpen = false;
42
+ this.todosSelecionados = false;
43
+ //pagination
44
+ //página atual
45
+ this.page = 1;
46
+ //registros por página
47
+ this.pageOffset = 20;
48
+ }
49
+ valoresFiltro() {
50
+ this.tabelaCampos.Colunas.forEach(c => {
51
+ if (c.Filtrar) {
52
+ //projetar a coluna
53
+ let initial = [];
54
+ let valores = this.dataSet.map(d => d[c.Campo]);
55
+ c.Valores = valores.filter((value, index, self) => {
56
+ return self.indexOf(value) === index;
57
+ }).map(v => { return { Selecionado: false, Valor: v }; });
58
+ // console.log(c.Campo, valores);
59
+ // console.log(c.Valores)
60
+ }
61
+ });
62
+ }
63
+ ngOnInit() {
64
+ //this.inicializaGrupo();
65
+ //this.agrupar('Marca');
66
+ //console.log('inputs', this.inputs);
67
+ //console.log('Input empresa', this.empresaId);
68
+ GridTabela.init(this.tabelaCampos);
69
+ this.valoresFiltro();
70
+ this.filteredDataSet = this.dataSet;
71
+ console.log('Init Tabela campos', this.tabelaCampos);
72
+ }
73
+ ngOnChanges(changes) {
74
+ console.log('On changes Tabela campos', this.tabelaCampos);
75
+ //evento chamado quando o dataset for atualizado
76
+ //inicializar vars de paginação
77
+ this.initPage();
78
+ this.todosSelecionados = false;
79
+ }
80
+ initPage() {
81
+ this.page = 1;
82
+ this.totalRec = this.filteredDataSet.length;
83
+ this.totalPages = Math.ceil(this.totalRec / this.pageOffset);
84
+ if (this.inMemoryPagination === true) {
85
+ this.getRegistrosPage();
86
+ }
87
+ else {
88
+ this.pageDataSet = this.filteredDataSet;
89
+ }
90
+ }
91
+ getRegistrosPage() {
92
+ this.start = (this.page - 1) * this.pageOffset;
93
+ console.log('dataset', this.filteredDataSet);
94
+ console.log('start', this.start);
95
+ console.log('offset', this.pageOffset);
96
+ this.pageDataSet = this.filteredDataSet.slice(this.start, (this.start + this.pageOffset));
97
+ console.log('page dataset', this.pageDataSet);
98
+ }
99
+ proximo() {
100
+ if (this.page < this.totalPages) {
101
+ this.page++;
102
+ this.getRegistrosPage();
103
+ this.gerarArrayPags();
104
+ }
105
+ }
106
+ anterior() {
107
+ if (this.page > 1) {
108
+ this.page--;
109
+ this.getRegistrosPage();
110
+ this.gerarArrayPags();
111
+ }
112
+ }
113
+ gerarArrayPags() {
114
+ }
115
+ inicializaGrupo() {
116
+ //inicializar o primeiro grupo 'default'
117
+ this.camposDisplay = this.tabelaCampos.Colunas;
118
+ this.grupos[0].Tabela = this.camposDisplay;
119
+ this.grupos[0].Dados = this.dataSet;
120
+ }
121
+ agrupar(campo) {
122
+ this.groups.push(campo);
123
+ let level = 0;
124
+ for (let g in this.groups) {
125
+ console.log(g);
126
+ //filtrar os dados
127
+ let result = this.dataSet.reduce((group, data) => {
128
+ const { g } = data;
129
+ group[g] = group[campo] ?? [];
130
+ group[g].push(data);
131
+ return group;
132
+ }, {});
133
+ console.log(result);
134
+ }
135
+ }
136
+ filtrarCampos(coluna = '') {
137
+ if (coluna != '') {
138
+ }
139
+ else {
140
+ }
141
+ }
142
+ filtrar(col) {
143
+ //console.log('filtrar', col);
144
+ if (col.Valores && col.Valores.find(v => v.Selecionado) != null) {
145
+ const valores = col.Valores.filter(v => v.Selecionado).map(v => v.Valor);
146
+ //filtrar por valores selecionados
147
+ this.filteredDataSet = this.dataSet.filter(d => valores.indexOf(d[col.Campo]) > -1);
148
+ }
149
+ else if (col.FiltroOperador && col.FiltroValor) {
150
+ //console.log(col.FiltroOperador, col.FiltroValor)
151
+ try {
152
+ this.filteredDataSet = this.dataSet.filter(d => {
153
+ switch (col.FiltroOperador) {
154
+ case "=":
155
+ return d[col.Campo] == col.FiltroValor;
156
+ case ">=":
157
+ if (col.Tipo == 'number') {
158
+ return LibService.stringToDecimal(d[col.Campo], true) >= LibService.stringToDecimal(col.FiltroValor, true);
159
+ }
160
+ else if (col.Tipo == 'data') {
161
+ return new Date(this.dataToString(d[col.Campo])) >= new Date(this.dataToString(col.FiltroValor));
162
+ }
163
+ else
164
+ return d[col.Campo] >= col.FiltroValor;
165
+ case "<=":
166
+ if (col.Tipo == 'number') {
167
+ return LibService.stringToDecimal(d[col.Campo], true) <= LibService.stringToDecimal(col.FiltroValor, true);
168
+ }
169
+ else
170
+ return d[col.Campo] <= col.FiltroValor;
171
+ case "tem":
172
+ return d[col.Campo].toString().toLowerCase().indexOf(col.FiltroValor.toLowerCase()) > -1;
173
+ default:
174
+ return true;
175
+ }
176
+ });
177
+ }
178
+ catch (ex) {
179
+ console.log(ex);
180
+ this.filteredDataSet = this.dataSet;
181
+ }
182
+ }
183
+ col.FiltroVisivel = false;
184
+ this.initPage();
185
+ }
186
+ getPage() {
187
+ }
188
+ limpar() {
189
+ this.filteredDataSet = this.dataSet;
190
+ }
191
+ dataToString(data) {
192
+ if (data) {
193
+ return data.split('/').reverse().join('-');
194
+ }
195
+ else {
196
+ return "";
197
+ }
198
+ }
199
+ ordenar(col) {
200
+ if (col.OrdemStatus == 0 || col.OrdemStatus == -1) {
201
+ if (col.Tipo == 'data') {
202
+ this.filteredDataSet.sort((a, b) => this.dataToString(a[col.Campo]) > this.dataToString(b[col.Campo]) ? 1 : (this.dataToString(a[col.Campo]) < this.dataToString(b[col.Campo]) ? -1 : 0));
203
+ }
204
+ else if (col.Tipo == 'number') {
205
+ this.filteredDataSet.sort((a, b) => LibService.stringToDecimal(a[col.Campo]) > LibService.stringToDecimal(b[col.Campo]) ? 1 : (LibService.stringToDecimal(a[col.Campo]) < LibService.stringToDecimal(b[col.Campo]) ? -1 : 0));
206
+ }
207
+ else
208
+ this.filteredDataSet.sort((a, b) => a[col.Campo] > b[col.Campo] ? 1 : (a[col.Campo] < b[col.Campo] ? -1 : 0));
209
+ col.OrdemStatus = 1; //asc
210
+ }
211
+ else {
212
+ if (col.Tipo == 'data') {
213
+ this.filteredDataSet.sort((a, b) => this.dataToString(a[col.Campo]) < this.dataToString(b[col.Campo]) ? 1 : (this.dataToString(a[col.Campo]) > this.dataToString(b[col.Campo]) ? -1 : 0));
214
+ }
215
+ else if (col.Tipo == 'number') {
216
+ this.filteredDataSet.sort((a, b) => LibService.stringToDecimal(a[col.Campo], true) < LibService.stringToDecimal(b[col.Campo], true) ? 1 : (LibService.stringToDecimal(a[col.Campo], true) > LibService.stringToDecimal(b[col.Campo], true) ? -1 : 0));
217
+ }
218
+ else
219
+ this.filteredDataSet.sort((a, b) => a[col.Campo] < b[col.Campo] ? 1 : (a[col.Campo] > b[col.Campo] ? -1 : 0));
220
+ col.OrdemStatus = -1; //desc
221
+ }
222
+ }
223
+ setFiltroOpen(col) {
224
+ col.FiltroVisivel = !col.FiltroVisivel;
225
+ if (col.FiltroVisivel) {
226
+ this.selectedColuna = col;
227
+ //console.log(this.selectedColuna);
228
+ }
229
+ }
230
+ selecionarTodos() {
231
+ //this.todosSelecionados = !this.todosSelecionados;
232
+ this.filteredDataSet.forEach(item => {
233
+ item[this.tabelaCampos.CampoSelecionar] = this.todosSelecionados;
234
+ });
235
+ this.selecionarChecked.emit();
236
+ }
237
+ selecionarLinha(item) {
238
+ this.selecionarItem.emit(item);
239
+ this.selectedItem = item;
240
+ }
241
+ excluirLinha(item) {
242
+ this.excluirItem.emit(item);
243
+ }
244
+ //check
245
+ selecionadoChecked() {
246
+ this.selecionarChecked.emit();
247
+ }
248
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
249
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: GridViewComponent, selector: "kb-grid-view", inputs: { empresaId: "empresaId", tabelaCampos: "tabelaCampos", dataSet: "dataSet", minHeight: "minHeight", inMemoryPagination: "inMemoryPagination", filteredDataSet: "filteredDataSet", pageOffset: "pageOffset" }, outputs: { selecionarItem: "selecionarItem", excluirItem: "excluirItem", selecionarChecked: "selecionarChecked" }, usesOnChanges: true, ngImport: i0, template: "<div style=\"font-size: 14px;\">\n <div id=\"painelExportacao\">\n <ion-row *ngIf=\"inMemoryPagination\">\n <!--\n <ion-col size=\"2\">\n <ion-button *ngIf=\"tabelaCampos.Selecionar === true\" size=\"small\" fill=\"outline\" color=\"medium\"\n (click)=\"selecionarTodos()\">Selecionar Todos</ion-button>\n </ion-col>\n -->\n <ion-col size=\"3\">\n <ion-button *ngIf=\"inMemoryPagination === true\" size=\"small\" fill=\"outline\" color=\"bluetool\"\n (click)=\"anterior()\">\n <ion-icon name=\"chevron-back-outline\" slot=\"start\"></ion-icon>\n Anterior\n </ion-button>\n <ion-button *ngIf=\"inMemoryPagination === true\" size=\"small\" fill=\"outline\" color=\"bluetool\"\n (click)=\"proximo()\">\n Pr\u00F3ximo\n <ion-icon name=\"chevron-forward-outline\" slot=\"end\"></ion-icon>\n </ion-button> \n </ion-col>\n <ion-col size=\"2\">\n <span style=\"display: block; margin-top: 10px;\" *ngIf=\"inMemoryPagination && totalRec > 0\">Exibindo {{ start + 1 }} - {{ (start + pageOffset) < totalRec ? (start + pageOffset) : totalRec }} total de {{ totalRec }} \n </span> \n </ion-col>\n </ion-row>\n </div>\n <div style=\"width: 100%;\" [style.min-height]=\"minHeight\">\n <table class=\"grid\">\n <thead>\n <tr style=\"background-color: var(--ion-color-bluetool); color: white;\">\n <td *ngIf=\"tabelaCampos.Selecionar === true\" style=\"width: 3%; text-align: center;\">\n <input type=\"checkbox\" [(ngModel)]=\"todosSelecionados\" (change)=\"selecionarTodos()\">\n </td>\n <td *ngFor=\"let col of tabelaCampos.Colunas\" [style.width]=\"col.Tamanho\">\n <div style=\"position: relative;\">\n <div style=\"display: flex; justify-content: space-between; align-items: end;\">\n <strong>{{ col.Titulo }}</strong>\n <div>\n <ion-icon *ngIf=\"col.Ordem\" slot=\"end\" (click)=\"ordenar(col)\" style=\"cursor: pointer;\"\n [name]=\"col.OrdemStatus == 0 ? 'swap-vertical' : (col.OrdemStatus == 1 ? 'arrow-up': 'arrow-down')\"></ion-icon>\n \n <ion-icon *ngIf=\"col.Filtrar\" name=\"funnel\" (click)=\"setFiltroOpen(col)\" slot=\"end\"></ion-icon>\n </div>\n </div>\n \n \n <div class=\"caixaGrande\" [hidden]=\"!col.FiltroVisivel\" tabindex=\"-1\"\n style=\"color: black; display: block; position: absolute; z-index: 800; width: 210px; right: 0px; opacity: 0.9;\">\n Filtrar:\n <div>\n <div style=\"display: flex; justify-content: space-between; align-items: start;\">\n <select style=\"width: 80px;\" [(ngModel)]=\"col.FiltroOperador\">\n <option>=</option>\n <option>&gt;=</option>\n <option>&lt;=</option>\n <option>tem</option>\n </select>\n <input style=\"width: 100px;\" type=\"text\" [(ngModel)]=\"col.FiltroValor\">\n </div>\n <ion-button size=\"small\" color=\"medium\" expand=\"block\" (click)=\"filtrar(col)\">Filtrar</ion-button>\n <ion-button size=\"small\" color=\"light\" expand=\"block\" (click)=\"limpar()\">Limpar</ion-button>\n </div>\n <div *ngIf=\"col.Valores\" class=\"scroll-container\" style=\"height: 200px; overflow-y: scroll;\">\n <div *ngFor=\"let valor of col.Valores\">\n <input type=\"checkbox\" [(ngModel)]=\"valor.Selecionado\">\n <span>{{ valor.Valor }}</span>\n </div>\n </div>\n </div>\n \n </div>\n </td>\n <td *ngIf=\"tabelaCampos.Excluir === true\">\n \n </td>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of pageDataSet\" [class]=\"item == selectedItem ? 'item-selecionado' : '' \">\n <td *ngIf=\"tabelaCampos.Selecionar === true\" style=\"text-align: center; cursor: auto;\">\n <input type=\"checkbox\" [(ngModel)]=\"item[tabelaCampos.CampoSelecionar]\" (change)=\"selecionadoChecked()\">\n </td>\n <td class=\"col\" *ngFor=\"let col of tabelaCampos.Colunas\" [style.width]=\"col.Tamanho\"\n [style.text-align]=\"col.Tipo == 'number' ? 'right' : (col.Alinhamento ?? 'left')\"\n (click)=\"col.ClickFunction ? col.ClickFunction(item) : selecionarLinha(item)\">\n <span *ngIf=\"col.Pipe == 'date'\">{{ item[col.Campo] | date: 'dd/MM/yyyy' }}</span> \n <span *ngIf=\"col.Pipe == 'valor'\">{{ item[col.Campo] | valorFormat }}</span>\n <span *ngIf=\"col.RenderFunction\" [innerHtml]=\"col.RenderFunction(item) | safeHtml\"></span>\n <span *ngIf=\"!col.Pipe && !col.RenderFunction\">{{ item[col.Campo] ?? col.Default }}</span>\n </td>\n <td *ngIf=\"tabelaCampos.Excluir === true\" style=\"padding: 0px; text-align: center;\">\n <ion-button size=\"small\" color=\"danger\" fill=\"outline\" style=\"transform: scale(0.85);\" (click)=\"excluirLinha(item)\">\n <ion-icon name=\"trash\"></ion-icon>\n </ion-button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n \n <ion-modal [isOpen]=\"isFiltroOpen\" (didDismiss)=\"isFiltroOpen = false;\">\n <ng-template>\n <ion-content class=\"ion-padding\">\n <div class=\"caixaGrande\">\n Filtrar:\n <div *ngIf=\"selectedColuna.Valores\">\n <div *ngFor=\"let valor of selectedColuna.Valores\">\n <span>{{ valor }}</span>\n </div>\n </div>\n </div>\n </ion-content>\n </ng-template>\n </ion-modal>\n </div>", styles: [".grid{width:100%}.grid thead td{border:1px solid gray;padding:4px;color:#000!important}.grid tbody td{border:1px solid gray;padding:2px 4px}.grid tbody tr{cursor:pointer}.grid tbody tr:hover{background-color:#699ccc80;transition-duration:.5s}.grid tbody tr.item-selecionado{background-color:#699ccc33}[hidden]{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "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.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonModal, selector: "ion-modal", inputs: ["animated", "keepContentsMounted", "backdropBreakpoint", "backdropDismiss", "breakpoints", "canDismiss", "cssClass", "enterAnimation", "event", "handle", "handleBehavior", "initialBreakpoint", "isOpen", "keyboardClose", "leaveAnimation", "mode", "presentingElement", "showBackdrop", "translucent", "trigger"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i4.ValorFormatPipe, name: "valorFormat" }, { kind: "pipe", type: i4.SafeHtmlPipe, name: "safeHtml" }] }); }
250
+ }
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GridViewComponent, decorators: [{
252
+ type: Component,
253
+ args: [{ selector: 'kb-grid-view', template: "<div style=\"font-size: 14px;\">\n <div id=\"painelExportacao\">\n <ion-row *ngIf=\"inMemoryPagination\">\n <!--\n <ion-col size=\"2\">\n <ion-button *ngIf=\"tabelaCampos.Selecionar === true\" size=\"small\" fill=\"outline\" color=\"medium\"\n (click)=\"selecionarTodos()\">Selecionar Todos</ion-button>\n </ion-col>\n -->\n <ion-col size=\"3\">\n <ion-button *ngIf=\"inMemoryPagination === true\" size=\"small\" fill=\"outline\" color=\"bluetool\"\n (click)=\"anterior()\">\n <ion-icon name=\"chevron-back-outline\" slot=\"start\"></ion-icon>\n Anterior\n </ion-button>\n <ion-button *ngIf=\"inMemoryPagination === true\" size=\"small\" fill=\"outline\" color=\"bluetool\"\n (click)=\"proximo()\">\n Pr\u00F3ximo\n <ion-icon name=\"chevron-forward-outline\" slot=\"end\"></ion-icon>\n </ion-button> \n </ion-col>\n <ion-col size=\"2\">\n <span style=\"display: block; margin-top: 10px;\" *ngIf=\"inMemoryPagination && totalRec > 0\">Exibindo {{ start + 1 }} - {{ (start + pageOffset) < totalRec ? (start + pageOffset) : totalRec }} total de {{ totalRec }} \n </span> \n </ion-col>\n </ion-row>\n </div>\n <div style=\"width: 100%;\" [style.min-height]=\"minHeight\">\n <table class=\"grid\">\n <thead>\n <tr style=\"background-color: var(--ion-color-bluetool); color: white;\">\n <td *ngIf=\"tabelaCampos.Selecionar === true\" style=\"width: 3%; text-align: center;\">\n <input type=\"checkbox\" [(ngModel)]=\"todosSelecionados\" (change)=\"selecionarTodos()\">\n </td>\n <td *ngFor=\"let col of tabelaCampos.Colunas\" [style.width]=\"col.Tamanho\">\n <div style=\"position: relative;\">\n <div style=\"display: flex; justify-content: space-between; align-items: end;\">\n <strong>{{ col.Titulo }}</strong>\n <div>\n <ion-icon *ngIf=\"col.Ordem\" slot=\"end\" (click)=\"ordenar(col)\" style=\"cursor: pointer;\"\n [name]=\"col.OrdemStatus == 0 ? 'swap-vertical' : (col.OrdemStatus == 1 ? 'arrow-up': 'arrow-down')\"></ion-icon>\n \n <ion-icon *ngIf=\"col.Filtrar\" name=\"funnel\" (click)=\"setFiltroOpen(col)\" slot=\"end\"></ion-icon>\n </div>\n </div>\n \n \n <div class=\"caixaGrande\" [hidden]=\"!col.FiltroVisivel\" tabindex=\"-1\"\n style=\"color: black; display: block; position: absolute; z-index: 800; width: 210px; right: 0px; opacity: 0.9;\">\n Filtrar:\n <div>\n <div style=\"display: flex; justify-content: space-between; align-items: start;\">\n <select style=\"width: 80px;\" [(ngModel)]=\"col.FiltroOperador\">\n <option>=</option>\n <option>&gt;=</option>\n <option>&lt;=</option>\n <option>tem</option>\n </select>\n <input style=\"width: 100px;\" type=\"text\" [(ngModel)]=\"col.FiltroValor\">\n </div>\n <ion-button size=\"small\" color=\"medium\" expand=\"block\" (click)=\"filtrar(col)\">Filtrar</ion-button>\n <ion-button size=\"small\" color=\"light\" expand=\"block\" (click)=\"limpar()\">Limpar</ion-button>\n </div>\n <div *ngIf=\"col.Valores\" class=\"scroll-container\" style=\"height: 200px; overflow-y: scroll;\">\n <div *ngFor=\"let valor of col.Valores\">\n <input type=\"checkbox\" [(ngModel)]=\"valor.Selecionado\">\n <span>{{ valor.Valor }}</span>\n </div>\n </div>\n </div>\n \n </div>\n </td>\n <td *ngIf=\"tabelaCampos.Excluir === true\">\n \n </td>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of pageDataSet\" [class]=\"item == selectedItem ? 'item-selecionado' : '' \">\n <td *ngIf=\"tabelaCampos.Selecionar === true\" style=\"text-align: center; cursor: auto;\">\n <input type=\"checkbox\" [(ngModel)]=\"item[tabelaCampos.CampoSelecionar]\" (change)=\"selecionadoChecked()\">\n </td>\n <td class=\"col\" *ngFor=\"let col of tabelaCampos.Colunas\" [style.width]=\"col.Tamanho\"\n [style.text-align]=\"col.Tipo == 'number' ? 'right' : (col.Alinhamento ?? 'left')\"\n (click)=\"col.ClickFunction ? col.ClickFunction(item) : selecionarLinha(item)\">\n <span *ngIf=\"col.Pipe == 'date'\">{{ item[col.Campo] | date: 'dd/MM/yyyy' }}</span> \n <span *ngIf=\"col.Pipe == 'valor'\">{{ item[col.Campo] | valorFormat }}</span>\n <span *ngIf=\"col.RenderFunction\" [innerHtml]=\"col.RenderFunction(item) | safeHtml\"></span>\n <span *ngIf=\"!col.Pipe && !col.RenderFunction\">{{ item[col.Campo] ?? col.Default }}</span>\n </td>\n <td *ngIf=\"tabelaCampos.Excluir === true\" style=\"padding: 0px; text-align: center;\">\n <ion-button size=\"small\" color=\"danger\" fill=\"outline\" style=\"transform: scale(0.85);\" (click)=\"excluirLinha(item)\">\n <ion-icon name=\"trash\"></ion-icon>\n </ion-button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n \n <ion-modal [isOpen]=\"isFiltroOpen\" (didDismiss)=\"isFiltroOpen = false;\">\n <ng-template>\n <ion-content class=\"ion-padding\">\n <div class=\"caixaGrande\">\n Filtrar:\n <div *ngIf=\"selectedColuna.Valores\">\n <div *ngFor=\"let valor of selectedColuna.Valores\">\n <span>{{ valor }}</span>\n </div>\n </div>\n </div>\n </ion-content>\n </ng-template>\n </ion-modal>\n </div>", styles: [".grid{width:100%}.grid thead td{border:1px solid gray;padding:4px;color:#000!important}.grid tbody td{border:1px solid gray;padding:2px 4px}.grid tbody tr{cursor:pointer}.grid tbody tr:hover{background-color:#699ccc80;transition-duration:.5s}.grid tbody tr.item-selecionado{background-color:#699ccc33}[hidden]{display:none!important}\n"] }]
254
+ }], ctorParameters: () => [], propDecorators: { empresaId: [{
255
+ type: Input
256
+ }], tabelaCampos: [{
257
+ type: Input
258
+ }], dataSet: [{
259
+ type: Input
260
+ }], minHeight: [{
261
+ type: Input
262
+ }], inMemoryPagination: [{
263
+ type: Input
264
+ }], selecionarItem: [{
265
+ type: Output
266
+ }], excluirItem: [{
267
+ type: Output
268
+ }], selecionarChecked: [{
269
+ type: Output
270
+ }], filteredDataSet: [{
271
+ type: Input
272
+ }], pageOffset: [{
273
+ type: Input
274
+ }] } });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FwcHByb2plY3QtY29tcG9uZW50cy9zcmMvbGliL2dyaWQtdmlldy9ncmlkLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvZ3JpZC12aWV3L2dyaWQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBT3BFLE1BQU0sT0FBTyxpQkFBaUI7SUFnRTVCO1FBNURTLGNBQVMsR0FBVyxPQUFPLENBQUM7UUFDNUIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRW5DLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdqRCwyREFBMkQ7UUFDM0QsV0FBTSxHQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0RSxtQkFBbUI7UUFDbkIsdUJBQXVCO1FBQ3ZCLG9CQUFvQjtRQUNwQixlQUFlO1FBQ2Ysd01BQXdNO1FBQ3hNLDZNQUE2TTtRQUM3TSxxTkFBcU47UUFDck4seU1BQXlNO1FBQ3pNLDhNQUE4TTtRQUM5TSxNQUFNO1FBQ04sSUFBSTtRQUVKLDBCQUEwQjtRQUMxQiwyRkFBMkY7UUFDM0YsOEZB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QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9OOztnQkFDQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEgsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO1NBQzNCO2FBQU07WUFDTCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNMO2lCQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZQOztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUcsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDN0I7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVE7UUFDcEIsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUE7UUFDdEMsSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1lBQzFCLG1DQUFtQztTQUNwQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPO0lBQ1Asa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDOzhHQTFSVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixrWkNSOUIsK2tNQW1IUTs7MkZEM0dLLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxjQUFjO3dEQUtmLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkE2QkUsZUFBZTtzQkFBdkIsS0FBSztnQkFnQkcsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR3JpZENvbHVuYSwgR3JpZFRhYmVsYSwgTGliU2VydmljZSB9IGZyb20gJ2FwcHByb2plY3QtbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2ItZ3JpZC12aWV3JywgICAgXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ3JpZC12aWV3LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBHcmlkVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZW1wcmVzYUlkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRhYmVsYUNhbXBvczogR3JpZFRhYmVsYTtcbiAgQElucHV0KCkgZGF0YVNldDogQXJyYXk8YW55PjtcbiAgQElucHV0KCkgbWluSGVpZ2h0OiBzdHJpbmcgPSAnNDAwcHgnO1xuICBASW5wdXQoKSBpbk1lbW9yeVBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgc2VsZWNpb25hckl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBleGNsdWlySXRlbSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjaW9uYXJDaGVja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNlbGVjdGVkSXRlbTogYW55O1xuICAvL2lucHV0cyA9IGluamVjdChuZXcgSW5qZWN0aW9uVG9rZW48YW55PigndGl0bGUgaW5wdXRzJykpO1xuICBncnVwb3M6IGFueVtdID0gW3sgQ29sdW5hOiAnJywgVGFiZWxhOiBudWxsLCBEYWRvczogbnVsbCwgTml2ZWw6IDAgfV07XG5cbiAgLy8gdGFiZWxhQ2FtcG9zID0ge1xuICAvLyAgIFNlbGVjaW9uYXI6IGZhbHNlLFxuICAvLyAgIEV4cG9ydGFyOiB0cnVlLFxuICAvLyAgIENvbHVuYXM6IFtcbiAgLy8gICAgIHsgQ2FtcG86ICdJZCcsIFRpdHVsbzogJ0lkJywgVGFtYW5obzogJzEwJScsIE9yZGVtOiB0cnVlLCBHcnVwbzogZmFsc2UsIEZpbHRyYXI6IHRydWUsIE9yZGVtU3RhdHVzOiAwLCBUaXBvOiAnbnVtYmVyJywgVmFsb3JlczogW10sIEZpbHRyb09wZXJhZG9yOiAnPScsIEZpbHRyb1ZhbG9yOiAnJywgRmlsdHJvVmlzaXZlbDogZmFsc2UgfSxcbiAgLy8gICAgIHsgQ2FtcG86ICdNYXJjYScsIFRpdHVsbzogJ01hcmNhJywgVGFtYW5obzogJzI1JScsIE9yZGVtOiB0cnVlLCBHcnVwbzogdHJ1ZSwgRmlsdHJhcjogdHJ1ZSwgT3JkZW1TdGF0dXM6IDAsIFRpcG86ICdzdHJpbmcnLCBWYWxvcmVzOiBbXSwgRmlsdHJvT3BlcmFkb3I6ICc9JywgRmlsdHJvVmFsb3I6ICcnLCBGaWx0cm9WaXNpdmVsOiBmYWxzZSB9LFxuICAvLyAgICAgeyBDYW1wbzogJ0Rlc2NyaWNhbycsIFRpdHVsbzogJ0Rlc2NyacOnw6NvJywgVGFtYW5obzogJzI1JScsIE9yZGVtOiB0cnVlLCBHcnVwbzogdHJ1ZSwgRmlsdHJhcjogdHJ1ZSwgT3JkZW1TdGF0dXM6IDAsIFRpcG86ICdzdHJpbmcnLCBWYWxvcmVzOiBbXSwgRmlsdHJvT3BlcmFkb3I6ICc9JywgRmlsdHJvVmFsb3I6ICcnLCBGaWx0cm9WaXNpdmVsOiBmYWxzZSB9LFxuICAvLyAgICAgeyBDYW1wbzogJ0RhdGEnLCBUaXR1bG86ICdEYXRhJywgVGFtYW5obzogJzIwJScsIE9yZGVtOiB0cnVlLCBHcnVwbzogdHJ1ZSwgRmlsdHJhcjogdHJ1ZSwgT3JkZW1TdGF0dXM6IDAsIFRpcG86ICdkYXRlJywgVmFsb3JlczogW10sIEZpbHRyb09wZXJhZG9yOiAnPScsIEZpbHRyb1ZhbG9yOiAnJywgRmlsdHJvVmlzaXZlbDogZmFsc2UgfSxcbiAgLy8gICAgIHsgQ2FtcG86ICdWYWxvcicsIFRpdHVsbzogJ1ZhbG9yJywgVGFtYW5obzogJzIwJScsIE9yZGVtOiB0cnVlLCBHcnVwbzogZmFsc2UsIEZpbHRyYXI6IHRydWUsIE9yZGVtU3RhdHVzOiAwLCBUaXBvOiAnbnVtYmVyJywgVmFsb3JlczogW10sIEZpbHRyb09wZXJhZG9yOiAnPScsIEZpbHRyb1ZhbG9yOiAnJywgRmlsdHJvVmlzaXZlbDogZmFsc2UgfSxcbiAgLy8gICBdXG4gIC8vIH1cblxuICAvLyBkYXRhU2V0OiBBcnJheTxhbnk+ID0gW1xuICAvLyAgIHsgSWQ6IDEsIE1hcmNhOiAnQXBwbGUnLCBEZXNjcmljYW86ICdJUGhvbmUgMTQnLCBEYXRhOiAnMjAyMy0wNS0wMScsIFZhbG9yOiA3ODk5Ljk5IH0sXG4gIC8vICAgeyBJZDogMiwgTWFyY2E6ICdBcHBsZScsIERlc2NyaWNhbzogJ01hY0Jvb2sgUHJvJywgRGF0YTogJzIwMjMtMDYtMDEnLCBWYWxvcjogMTc5OTkuOTkgfSxcbiAgLy8gICB7IElkOiAzLCBNYXJjYTogJ1NhbXN1bmcnLCBEZXNjcmljYW86ICdHYWxheHkgUzIzJywgRGF0YTogJzIwMjMtMDUtMDEnLCBWYWxvcjogNjg5OS45OSB9LFxuICAvLyAgIHsgSWQ6IDQsIE1hcmNhOiAnU29ueScsIERlc2NyaWNhbzogJ1BTIDUnLCBEYXRhOiAnMjAyMy0wNi0wMScsIFZhbG9yOiA0ODk5Ljk5IH0sXG4gIC8vICAgeyBJZDogNSwgTWFyY2E6ICdTYW1zdW5nJywgRGVzY3JpY2FvOiAnV2F0Y2ggMjMnLCBEYXRhOiAnMjAyMy0wNS0wMScsIFZhbG9yOiAxODk5Ljk5IH0sXG4gIC8vIF1cblxuXG5cbiAgZ3JvdXBzID0gW11cbiAgQElucHV0KCkgZmlsdGVyZWREYXRhU2V0ID0gW107XG4gIHBhZ2VEYXRhU2V0ID0gW107XG5cblxuICAvL2FycmF5IGNvbSBvcyBjYW1wb3MgZmlsdHJhZG9zIHBhcmEgZGlzcGxheVxuICBjYW1wb3NEaXNwbGF5ID0gW107XG5cbiAgLy9maWx0cm9cbiAgaXNGaWx0cm9PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkQ29sdW5hOiBhbnk7XG4gIHRvZG9zU2VsZWNpb25hZG9zOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy9wYWdpbmF0aW9uXG4gIC8vcMOhZ2luYSBhdHVhbFxuICBwYWdlOiBudW1iZXIgPSAxO1xuICAvL3JlZ2lzdHJvcyBwb3IgcMOhZ2luYVxuICBASW5wdXQoKSBwYWdlT2Zmc2V0OiBudW1iZXIgPSAyMDtcbiAgLy90b3RhbCBkZSByZWdpc3Ryb3NcbiAgdG90YWxSZWM6IG51bWJlcjtcbiAgLy90b3RhbCBkZSBww6FnaW5hc1xuICB0b3RhbFBhZ2VzOiBudW1iZXI7XG4gIC8vaW5kZXhhZG9yIGRlIHBhZ2luYXNcbiAgcGFnZXM6IG51bWJlcltdOyAgXG4gIHN0YXJ0OiBudW1iZXI7XG5cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIHZhbG9yZXNGaWx0cm8oKSB7XG4gICAgdGhpcy50YWJlbGFDYW1wb3MuQ29sdW5hcy5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKGMuRmlsdHJhcikge1xuICAgICAgICAvL3Byb2pldGFyIGEgY29sdW5hXG4gICAgICAgIGxldCBpbml0aWFsID0gW107XG4gICAgICAgIGxldCB2YWxvcmVzID0gdGhpcy5kYXRhU2V0Lm1hcChkID0+IGRbYy5DYW1wb10pO1xuICAgICAgICBjLlZhbG9yZXMgPSB2YWxvcmVzLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgICAgICB9KS5tYXAodiA9PiB7IHJldHVybiB7IFNlbGVjaW9uYWRvOiBmYWxzZSwgVmFsb3I6IHYgfSB9KTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coYy5DYW1wbywgdmFsb3Jlcyk7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGMuVmFsb3JlcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cblxuICAgIC8vdGhpcy5pbmljaWFsaXphR3J1cG8oKTtcbiAgICAvL3RoaXMuYWdydXBhcignTWFyY2EnKTtcbiAgICAvL2NvbnNvbGUubG9nKCdpbnB1dHMnLCB0aGlzLmlucHV0cyk7XG4gICAgLy9jb25zb2xlLmxvZygnSW5wdXQgZW1wcmVzYScsIHRoaXMuZW1wcmVzYUlkKTtcbiAgICBHcmlkVGFiZWxhLmluaXQodGhpcy50YWJlbGFDYW1wb3MpO1xuICAgIHRoaXMudmFsb3Jlc0ZpbHRybygpO1xuICAgIHRoaXMuZmlsdGVyZWREYXRhU2V0ID0gdGhpcy5kYXRhU2V0O1xuICAgIGNvbnNvbGUubG9nKCdJbml0IFRhYmVsYSBjYW1wb3MnLCB0aGlzLnRhYmVsYUNhbXBvcyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc29sZS5sb2coJ09uIGNoYW5nZXMgVGFiZWxhIGNhbXBvcycsIHRoaXMudGFiZWxhQ2FtcG9zKTtcbiAgICAvL2V2ZW50byBjaGFtYWRvIHF1YW5kbyBvIGRhdGFzZXQgZm9yIGF0dWFsaXphZG9cbiAgICAvL2luaWNpYWxpemFyIHZhcnMgZGUgcGFnaW5hw6fDo29cbiAgICB0aGlzLmluaXRQYWdlKCk7XG4gICAgdGhpcy50b2Rvc1NlbGVjaW9uYWRvcyA9IGZhbHNlO1xuICB9XG5cbiAgaW5pdFBhZ2UoKSB7XG4gICAgdGhpcy5wYWdlID0gMTtcbiAgICB0aGlzLnRvdGFsUmVjID0gdGhpcy5maWx0ZXJlZERhdGFTZXQubGVuZ3RoO1xuICAgIHRoaXMudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsUmVjIC8gdGhpcy5wYWdlT2Zmc2V0KTsgICAgXG5cbiAgICBpZiAodGhpcy5pbk1lbW9yeVBhZ2luYXRpb24gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZ2V0UmVnaXN0cm9zUGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VEYXRhU2V0ID0gdGhpcy5maWx0ZXJlZERhdGFTZXQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVnaXN0cm9zUGFnZSgpIHtcbiAgICB0aGlzLnN0YXJ0ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlT2Zmc2V0O1xuICAgIGNvbnNvbGUubG9nKCdkYXRhc2V0JywgdGhpcy5maWx0ZXJlZERhdGFTZXQpO1xuICAgIGNvbnNvbGUubG9nKCdzdGFydCcsIHRoaXMuc3RhcnQpO1xuICAgIGNvbnNvbGUubG9nKCdvZmZzZXQnLCB0aGlzLnBhZ2VPZmZzZXQpO1xuICAgIHRoaXMucGFnZURhdGFTZXQgPSB0aGlzLmZpbHRlcmVkRGF0YVNldC5zbGljZSh0aGlzLnN0YXJ0LCAodGhpcy5zdGFydCArIHRoaXMucGFnZU9mZnNldCkpO1xuICAgIGNvbnNvbGUubG9nKCdwYWdlIGRhdGFzZXQnLCB0aGlzLnBhZ2VEYXRhU2V0KTtcbiAgfVxuXG4gIHByb3hpbW8oKSB7XG4gICAgaWYgKHRoaXMucGFnZSA8IHRoaXMudG90YWxQYWdlcykge1xuICAgICAgdGhpcy5wYWdlKys7XG4gICAgICB0aGlzLmdldFJlZ2lzdHJvc1BhZ2UoKTtcbiAgICAgIHRoaXMuZ2VyYXJBcnJheVBhZ3MoKTtcbiAgICB9XG4gIH1cblxuICBhbnRlcmlvcigpIHtcbiAgICBpZiAodGhpcy5wYWdlID4gMSkge1xuICAgICAgdGhpcy5wYWdlLS07XG4gICAgICB0aGlzLmdldFJlZ2lzdHJvc1BhZ2UoKTtcbiAgICAgIHRoaXMuZ2VyYXJBcnJheVBhZ3MoKTtcbiAgICB9XG4gIH1cblxuICBnZXJhckFycmF5UGFncygpIHtcblxuICB9XG5cbiAgaW5pY2lhbGl6YUdydXBvKCkge1xuICAgIC8vaW5pY2lhbGl6YXIgbyBwcmltZWlybyBncnVwbyAnZGVmYXVsdCdcbiAgICB0aGlzLmNhbXBvc0Rpc3BsYXkgPSB0aGlzLnRhYmVsYUNhbXBvcy5Db2x1bmFzO1xuICAgIHRoaXMuZ3J1cG9zWzBdLlRhYmVsYSA9IHRoaXMuY2FtcG9zRGlzcGxheTtcbiAgICB0aGlzLmdydXBvc1swXS5EYWRvcyA9IHRoaXMuZGF0YVNldDtcbiAgfVxuXG4gIGFncnVwYXIoY2FtcG86IHN0cmluZykge1xuICAgIHRoaXMuZ3JvdXBzLnB1c2goY2FtcG8pO1xuICAgIGxldCBsZXZlbCA9IDA7XG4gICAgZm9yIChsZXQgZyBpbiB0aGlzLmdyb3Vwcykge1xuICAgICAgY29uc29sZS5sb2coZyk7XG4gICAgICAvL2ZpbHRyYXIgb3MgZGFkb3NcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRhdGFTZXQucmVkdWNlKChncm91cCwgZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCB7IGcgfSA9IGRhdGE7XG4gICAgICAgIGdyb3VwW2ddID0gZ3JvdXBbY2FtcG9dID8/IFtdO1xuICAgICAgICBncm91cFtnXS5wdXNoKGRhdGEpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICB9LCB7fSk7XG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgIH1cblxuICB9XG5cbiAgZmlsdHJhckNhbXBvcyhjb2x1bmEgPSAnJykge1xuICAgIGlmIChjb2x1bmEgIT0gJycpIHtcblxuICAgIH0gZWxzZSB7XG5cbiAgICB9XG4gIH1cblxuICBmaWx0cmFyKGNvbDogR3JpZENvbHVuYSkge1xuICAgIC8vY29uc29sZS5sb2coJ2ZpbHRyYXInLCBjb2wpO1xuICAgIGlmIChjb2wuVmFsb3JlcyAmJiBjb2wuVmFsb3Jlcy5maW5kKHYgPT4gdi5TZWxlY2lvbmFkbykgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdmFsb3JlcyA9IGNvbC5WYWxvcmVzLmZpbHRlcih2ID0+IHYuU2VsZWNpb25hZG8pLm1hcCh2ID0+IHYuVmFsb3IpO1xuXG4gICAgICAvL2ZpbHRyYXIgcG9yIHZhbG9yZXMgc2VsZWNpb25hZG9zXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YVNldCA9IHRoaXMuZGF0YVNldC5maWx0ZXIoZCA9PiB2YWxvcmVzLmluZGV4T2YoZFtjb2wuQ2FtcG9dKSA+IC0xKTtcbiAgICB9IGVsc2UgaWYgKGNvbC5GaWx0cm9PcGVyYWRvciAmJiBjb2wuRmlsdHJvVmFsb3IpIHtcbiAgICAgIC8vY29uc29sZS5sb2coY29sLkZpbHRyb09wZXJhZG9yLCBjb2wuRmlsdHJvVmFsb3IpXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YVNldCA9IHRoaXMuZGF0YVNldC5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChjb2wuRmlsdHJvT3BlcmFkb3IpIHtcbiAgICAgICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgICAgIHJldHVybiBkW2NvbC5DYW1wb10gPT0gY29sLkZpbHRyb1ZhbG9yO1xuICAgICAgICAgICAgY2FzZSBcIj49XCI6XG4gICAgICAgICAgICAgIGlmIChjb2wuVGlwbyA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBMaWJTZXJ2aWNlLnN0cmluZ1RvRGVjaW1hbChkW2NvbC5DYW1wb10sIHRydWUpID49IExpYlNlcnZpY2Uuc3RyaW5nVG9EZWNpbWFsKGNvbC5GaWx0cm9WYWxvciwgdHJ1ZSk7ICBcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2wuVGlwbyA9PSAnZGF0YScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy5kYXRhVG9TdHJpbmcoZFtjb2wuQ2FtcG9dKSkgPj0gbmV3IERhdGUodGhpcy5kYXRhVG9TdHJpbmcoY29sLkZpbHRyb1ZhbG9yKSk7ICBcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgIHJldHVybiBkW2NvbC5DYW1wb10gPj0gY29sLkZpbHRyb1ZhbG9yO1xuICAgICAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgICAgIGlmIChjb2wuVGlwbyA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBMaWJTZXJ2aWNlLnN0cmluZ1RvRGVjaW1hbChkW2NvbC5DYW1wb10sIHRydWUpIDw9IExpYlNlcnZpY2Uuc3RyaW5nVG9EZWNpbWFsKGNvbC5GaWx0cm9WYWxvciwgdHJ1ZSk7ICBcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgIHJldHVybiBkW2NvbC5DYW1wb10gPD0gY29sLkZpbHRyb1ZhbG9yO1xuICAgICAgICAgICAgY2FzZSBcInRlbVwiOlxuICAgICAgICAgICAgICByZXR1cm4gZFtjb2wuQ2FtcG9dLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGNvbC5GaWx0cm9WYWxvci50b0xvd2VyQ2FzZSgpKSA+IC0xO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICBjb25zb2xlLmxvZyhleCk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhU2V0ID0gdGhpcy5kYXRhU2V0O1xuICAgICAgfVxuICAgIH1cbiAgICBjb2wuRmlsdHJvVmlzaXZlbCA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbml0UGFnZSgpO1xuICB9XG5cbiAgZ2V0UGFnZSgpIHtcblxuICB9XG5cbiAgbGltcGFyKCkge1xuICAgIHRoaXMuZmlsdGVyZWREYXRhU2V0ID0gdGhpcy5kYXRhU2V0O1xuICB9XG5cbiAgZGF0YVRvU3RyaW5nKGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLnNwbGl0KCcvJykucmV2ZXJzZSgpLmpvaW4oJy0nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG5cbiAgb3JkZW5hcihjb2w6IEdyaWRDb2x1bmEpIHtcbiAgICBpZiAoY29sLk9yZGVtU3RhdHVzID09IDAgfHwgY29sLk9yZGVtU3RhdHVzID09IC0xKSB7XG4gICAgICBpZiAoY29sLlRpcG8gPT0gJ2RhdGEnKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhU2V0LnNvcnQoKGEsIGIpID0+IHRoaXMuZGF0YVRvU3RyaW5nKGFbY29sLkNhbXBvXSkgPiB0aGlzLmRhdGFUb1N0cmluZyhiW2NvbC5DYW1wb10pID8gMSA6ICh0aGlzLmRhdGFUb1N0cmluZyhhW2NvbC5DYW1wb10pIDwgdGhpcy5kYXRhVG9TdHJpbmcoYltjb2wuQ2FtcG9dKSA/IC0xIDogMCkpO1xuICAgICAgfSBlbHNlIGlmIChjb2wuVGlwbyA9PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YVNldC5zb3J0KChhLCBiKSA9PiBMaWJTZXJ2aWNlLnN0cmluZ1RvRGVjaW1hbChhW2NvbC5DYW1wb10pID4gTGliU2VydmljZS5zdHJpbmdUb0RlY2ltYWwoYltjb2wuQ2FtcG9dKSA/IDEgOiAoTGliU2VydmljZS5zdHJpbmdUb0RlY2ltYWwoYVtjb2wuQ2FtcG9dKSA8IExpYlNlcnZpY2Uuc3RyaW5nVG9EZWNpbWFsKGJbY29sLkNhbXBvXSkgPyAtMSA6IDApKTtcbiAgICAgIH0gZWxzZSBcbiAgICAgICAgdGhpcy5maWx0ZXJlZERhdGFTZXQuc29ydCgoYSwgYikgPT4gYVtjb2wuQ2FtcG9dID4gYltjb2wuQ2FtcG9dID8gMSA6IChhW2NvbC5DYW1wb10gPCBiW2NvbC5DYW1wb10gPyAtMSA6IDApKTtcbiAgICAgIGNvbC5PcmRlbVN0YXR1cyA9IDE7IC8vYXNjXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb2wuVGlwbyA9PSAnZGF0YScpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZERhdGFTZXQuc29ydCgoYSwgYikgPT4gdGhpcy5kYXRhVG9TdHJpbmcoYVtjb2wuQ2FtcG9dKSA8IHRoaXMuZGF0YVRvU3RyaW5nKGJbY29sLkNhbXBvXSkgPyAxIDogKHRoaXMuZGF0YVRvU3RyaW5nKGFbY29sLkNhbXBvXSkgPiB0aGlzLmRhdGFUb1N0cmluZyhiW2NvbC5DYW1wb10pID8gLTEgOiAwKSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbC5UaXBvID09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhU2V0LnNvcnQoKGEsIGIpID0+IExpYlNlcnZpY2Uuc3RyaW5nVG9EZWNpbWFsKGFbY29sLkNhbXBvXSwgdHJ1ZSkgPCBMaWJTZXJ2aWNlLnN0cmluZ1RvRGVjaW1hbChiW2NvbC5DYW1wb10sIHRydWUpID8gMSA6IChMaWJTZXJ2aWNlLnN0cmluZ1RvRGVjaW1hbChhW2NvbC5DYW1wb10sIHRydWUpID4gTGliU2VydmljZS5zdHJpbmdUb0RlY2ltYWwoYltjb2wuQ2FtcG9dLCB0cnVlKSA/IC0xIDogMCkpO1xuICAgICAgfSBlbHNlIFxuICAgICAgdGhpcy5maWx0ZXJlZERhdGFTZXQuc29ydCgoYSwgYikgPT4gYVtjb2wuQ2FtcG9dIDwgYltjb2wuQ2FtcG9dID8gMSA6IChhW2NvbC5DYW1wb10gPiBiW2NvbC5DYW1wb10gPyAtMSA6IDApKTtcbiAgICAgIGNvbC5PcmRlbVN0YXR1cyA9IC0xOyAvL2Rlc2NcbiAgICB9XG4gIH1cblxuICBzZXRGaWx0cm9PcGVuKGNvbDogYW55KSB7XG4gICAgY29sLkZpbHRyb1Zpc2l2ZWwgPSAhY29sLkZpbHRyb1Zpc2l2ZWxcbiAgICBpZiAoY29sLkZpbHRyb1Zpc2l2ZWwpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bmEgPSBjb2w7XG4gICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRDb2x1bmEpO1xuICAgIH0gICAgXG4gIH1cblxuICBzZWxlY2lvbmFyVG9kb3MoKSB7XG4gICAgLy90aGlzLnRvZG9zU2VsZWNpb25hZG9zID0gIXRoaXMudG9kb3NTZWxlY2lvbmFkb3M7XG4gICAgdGhpcy5maWx0ZXJlZERhdGFTZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGl0ZW1bdGhpcy50YWJlbGFDYW1wb3MuQ2FtcG9TZWxlY2lvbmFyXSA9IHRoaXMudG9kb3NTZWxlY2lvbmFkb3M7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY2lvbmFyQ2hlY2tlZC5lbWl0KCk7XG4gIH1cblxuICBzZWxlY2lvbmFyTGluaGEoaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY2lvbmFySXRlbS5lbWl0KGl0ZW0pO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgfVxuXG4gIGV4Y2x1aXJMaW5oYShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLmV4Y2x1aXJJdGVtLmVtaXQoaXRlbSk7XG4gIH1cblxuICAvL2NoZWNrXG4gIHNlbGVjaW9uYWRvQ2hlY2tlZCgpIHtcbiAgICB0aGlzLnNlbGVjaW9uYXJDaGVja2VkLmVtaXQoKTtcbiAgfVxufVxuIiwiPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDtcIj5cbiAgICA8ZGl2IGlkPVwicGFpbmVsRXhwb3J0YWNhb1wiPlxuICAgICAgPGlvbi1yb3cgKm5nSWY9XCJpbk1lbW9yeVBhZ2luYXRpb25cIj5cbiAgICAgICAgPCEtLVxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiMlwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwidGFiZWxhQ2FtcG9zLlNlbGVjaW9uYXIgPT09IHRydWVcIiBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwibWVkaXVtXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY2lvbmFyVG9kb3MoKVwiPlNlbGVjaW9uYXIgVG9kb3M8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIzXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJpbk1lbW9yeVBhZ2luYXRpb24gPT09IHRydWVcIiBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwiYmx1ZXRvb2xcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFudGVyaW9yKClcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgQW50ZXJpb3JcbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJpbk1lbW9yeVBhZ2luYXRpb24gPT09IHRydWVcIiBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwiYmx1ZXRvb2xcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInByb3hpbW8oKVwiPlxuICAgICAgICAgICAgUHLDs3hpbW9cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkLW91dGxpbmVcIiBzbG90PVwiZW5kXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+ICAgICAgICAgICAgICAgIFxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIyXCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLXRvcDogMTBweDtcIiAqbmdJZj1cImluTWVtb3J5UGFnaW5hdGlvbiAmJiB0b3RhbFJlYyA+IDBcIj5FeGliaW5kbyB7eyBzdGFydCArIDEgfX0gLSB7eyAoc3RhcnQgKyBwYWdlT2Zmc2V0KSA8IHRvdGFsUmVjID8gKHN0YXJ0ICsgcGFnZU9mZnNldCkgOiB0b3RhbFJlYyB9fSB0b3RhbCBkZSB7eyB0b3RhbFJlYyB9fSAgICAgICAgXG4gICAgICAgICAgPC9zcGFuPiAgICAgIFxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtzdHlsZS5taW4taGVpZ2h0XT1cIm1pbkhlaWdodFwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taW9uLWNvbG9yLWJsdWV0b29sKTsgY29sb3I6IHdoaXRlO1wiPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwidGFiZWxhQ2FtcG9zLlNlbGVjaW9uYXIgPT09IHRydWVcIiBzdHlsZT1cIndpZHRoOiAzJTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJ0b2Rvc1NlbGVjaW9uYWRvc1wiIChjaGFuZ2UpPVwic2VsZWNpb25hclRvZG9zKClcIj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiB0YWJlbGFDYW1wb3MuQ29sdW5hc1wiIFtzdHlsZS53aWR0aF09XCJjb2wuVGFtYW5ob1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBlbmQ7XCI+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGNvbC5UaXR1bG8gfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cImNvbC5PcmRlbVwiIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwib3JkZW5hcihjb2wpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJjb2wuT3JkZW1TdGF0dXMgPT0gMCA/ICdzd2FwLXZlcnRpY2FsJyA6IChjb2wuT3JkZW1TdGF0dXMgPT0gMSA/ICdhcnJvdy11cCc6ICdhcnJvdy1kb3duJylcIj48L2lvbi1pY29uPlxuICBcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiY29sLkZpbHRyYXJcIiBuYW1lPVwiZnVubmVsXCIgKGNsaWNrKT1cInNldEZpbHRyb09wZW4oY29sKVwiIHNsb3Q9XCJlbmRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gIFxuICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FpeGFHcmFuZGVcIiBbaGlkZGVuXT1cIiFjb2wuRmlsdHJvVmlzaXZlbFwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogYmxhY2s7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDgwMDsgd2lkdGg6IDIxMHB4OyByaWdodDogMHB4OyBvcGFjaXR5OiAwLjk7XCI+XG4gICAgICAgICAgICAgICAgICBGaWx0cmFyOlxuICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IHN0YXJ0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3Qgc3R5bGU9XCJ3aWR0aDogODBweDtcIiBbKG5nTW9kZWwpXT1cImNvbC5GaWx0cm9PcGVyYWRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj49PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPiZndDs9PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPiZsdDs9PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPnRlbTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sLkZpbHRyb1ZhbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBjb2xvcj1cIm1lZGl1bVwiIGV4cGFuZD1cImJsb2NrXCIgKGNsaWNrKT1cImZpbHRyYXIoY29sKVwiPkZpbHRyYXI8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIGNvbG9yPVwibGlnaHRcIiBleHBhbmQ9XCJibG9ja1wiIChjbGljayk9XCJsaW1wYXIoKVwiPkxpbXBhcjwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5WYWxvcmVzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBzY3JvbGw7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbG9yIG9mIGNvbC5WYWxvcmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwidmFsb3IuU2VsZWNpb25hZG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB2YWxvci5WYWxvciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cInRhYmVsYUNhbXBvcy5FeGNsdWlyID09PSB0cnVlXCI+XG4gIFxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhZ2VEYXRhU2V0XCIgW2NsYXNzXT1cIml0ZW0gPT0gc2VsZWN0ZWRJdGVtID8gJ2l0ZW0tc2VsZWNpb25hZG8nIDogJycgXCI+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJ0YWJlbGFDYW1wb3MuU2VsZWNpb25hciA9PT0gdHJ1ZVwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IGF1dG87XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIml0ZW1bdGFiZWxhQ2FtcG9zLkNhbXBvU2VsZWNpb25hcl1cIiAoY2hhbmdlKT1cInNlbGVjaW9uYWRvQ2hlY2tlZCgpXCI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29sXCIgKm5nRm9yPVwibGV0IGNvbCBvZiB0YWJlbGFDYW1wb3MuQ29sdW5hc1wiIFtzdHlsZS53aWR0aF09XCJjb2wuVGFtYW5ob1wiXG4gICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImNvbC5UaXBvID09ICdudW1iZXInID8gJ3JpZ2h0JyA6IChjb2wuQWxpbmhhbWVudG8gPz8gJ2xlZnQnKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb2wuQ2xpY2tGdW5jdGlvbiA/IGNvbC5DbGlja0Z1bmN0aW9uKGl0ZW0pIDogc2VsZWNpb25hckxpbmhhKGl0ZW0pXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLlBpcGUgPT0gJ2RhdGUnXCI+e3sgaXRlbVtjb2wuQ2FtcG9dIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19PC9zcGFuPiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLlBpcGUgPT0gJ3ZhbG9yJ1wiPnt7IGl0ZW1bY29sLkNhbXBvXSB8IHZhbG9yRm9ybWF0IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5SZW5kZXJGdW5jdGlvblwiIFtpbm5lckh0bWxdPVwiY29sLlJlbmRlckZ1bmN0aW9uKGl0ZW0pIHwgc2FmZUh0bWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5QaXBlICYmICFjb2wuUmVuZGVyRnVuY3Rpb25cIj57eyBpdGVtW2NvbC5DYW1wb10gPz8gY29sLkRlZmF1bHQgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwidGFiZWxhQ2FtcG9zLkV4Y2x1aXIgPT09IHRydWVcIiBzdHlsZT1cInBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBjb2xvcj1cImRhbmdlclwiIGZpbGw9XCJvdXRsaW5lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHNjYWxlKDAuODUpO1wiIChjbGljayk9XCJleGNsdWlyTGluaGEoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgXG4gICAgPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzRmlsdHJvT3BlblwiIChkaWREaXNtaXNzKT1cImlzRmlsdHJvT3BlbiA9IGZhbHNlO1wiPlxuICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWl4YUdyYW5kZVwiPlxuICAgICAgICAgICAgRmlsdHJhcjpcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZENvbHVuYS5WYWxvcmVzXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbG9yIG9mIHNlbGVjdGVkQ29sdW5hLlZhbG9yZXNcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB2YWxvciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9pb24tY29udGVudD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9pb24tbW9kYWw+XG4gIDwvZGl2PiJdfQ==