@universis/ngx-tables 6.0.0 → 15.0.3

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 (163) hide show
  1. package/esm2020/lib/actions/table.actions.mjs +27 -0
  2. package/esm2020/lib/advanced-aggregator.mjs +2 -0
  3. package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
  4. package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
  5. package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
  6. package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
  7. package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
  8. package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
  9. package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
  10. package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
  11. package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
  12. package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
  13. package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
  14. package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
  15. package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
  16. package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
  17. package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
  18. package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
  19. package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
  20. package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
  21. package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
  22. package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
  23. package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
  24. package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
  25. package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
  26. package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
  27. package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
  28. package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
  29. package/esm2020/lib/i18n/tables.el.mjs +129 -0
  30. package/esm2020/lib/i18n/tables.en.mjs +128 -0
  31. package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
  32. package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
  33. package/esm2020/lib/reducers/index.mjs +37 -0
  34. package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
  35. package/esm2020/lib/tables.activated-table.service.mjs +46 -0
  36. package/esm2020/lib/tables.module.mjs +218 -0
  37. package/esm2020/public_api.mjs +37 -0
  38. package/esm2020/universis-ngx-tables.mjs +5 -0
  39. package/fesm2015/universis-ngx-tables.mjs +5642 -0
  40. package/fesm2015/universis-ngx-tables.mjs.map +1 -0
  41. package/fesm2020/universis-ngx-tables.mjs +5609 -0
  42. package/fesm2020/universis-ngx-tables.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/lib/actions/table.actions.d.ts +4 -4
  45. package/lib/components/add-items/add-items.component.d.ts +8 -8
  46. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +10 -4
  47. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
  48. package/lib/components/advanced-list/advanced-list.component.d.ts +6 -3
  49. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +9 -7
  50. package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +4 -1
  51. package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
  52. package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
  53. package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
  54. package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
  55. package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
  56. package/lib/components/advanced-table/advanced-table-search.component.d.ts +6 -2
  57. package/lib/components/advanced-table/advanced-table-settings.component.d.ts +3 -0
  58. package/lib/components/advanced-table/advanced-table.component.d.ts +21 -12
  59. package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +4 -1
  60. package/lib/components/column-selector/column-selector.component.d.ts +8 -5
  61. package/lib/components/column-selector/column-selector.service.d.ts +3 -0
  62. package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
  63. package/lib/directives/advance-search-state.directive.d.ts +3 -0
  64. package/lib/directives/advance-table-state.directive.d.ts +3 -0
  65. package/lib/directives/advanced-search-router-state.directive.d.ts +3 -0
  66. package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
  67. package/lib/directives/btnexp.directive.d.ts +3 -0
  68. package/lib/i18n/tables.el.d.ts +107 -107
  69. package/lib/i18n/tables.en.d.ts +106 -106
  70. package/lib/pipes/advanced-aggregator.pipe.d.ts +4 -1
  71. package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +4 -1
  72. package/lib/reducers/index.d.ts +5 -3
  73. package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +3 -0
  74. package/lib/tables.activated-table.service.d.ts +5 -1
  75. package/lib/tables.module.d.ts +36 -0
  76. package/package.json +44 -42
  77. package/public_api.d.ts +3 -0
  78. package/bundles/universis-ngx-tables.umd.js +0 -8161
  79. package/bundles/universis-ngx-tables.umd.js.map +0 -1
  80. package/bundles/universis-ngx-tables.umd.min.js +0 -2
  81. package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
  82. package/esm2015/lib/actions/table.actions.js +0 -69
  83. package/esm2015/lib/advanced-aggregator.js +0 -6
  84. package/esm2015/lib/components/add-items/add-items.component.js +0 -209
  85. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -190
  86. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -80
  87. package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -245
  88. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -265
  89. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -213
  90. package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -97
  91. package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -57
  92. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -58
  93. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -72
  94. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -49
  95. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -718
  96. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -191
  97. package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1973
  98. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
  99. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -642
  100. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
  101. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -553
  102. package/esm2015/lib/components/column-selector/column-selector.component.js +0 -296
  103. package/esm2015/lib/components/column-selector/column-selector.service.js +0 -64
  104. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -76
  105. package/esm2015/lib/directives/advance-search-state.directive.js +0 -147
  106. package/esm2015/lib/directives/advance-table-state.directive.js +0 -86
  107. package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -90
  108. package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -186
  109. package/esm2015/lib/directives/btnexp.directive.js +0 -272
  110. package/esm2015/lib/i18n/tables.el.js +0 -133
  111. package/esm2015/lib/i18n/tables.en.js +0 -132
  112. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -39
  113. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -58
  114. package/esm2015/lib/reducers/index.js +0 -63
  115. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -142
  116. package/esm2015/lib/tables.activated-table.service.js +0 -85
  117. package/esm2015/lib/tables.module.js +0 -163
  118. package/esm2015/public_api.js +0 -37
  119. package/esm2015/universis-ngx-tables.js +0 -13
  120. package/esm5/lib/actions/table.actions.js +0 -64
  121. package/esm5/lib/advanced-aggregator.js +0 -6
  122. package/esm5/lib/components/add-items/add-items.component.js +0 -243
  123. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -265
  124. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -99
  125. package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -273
  126. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -288
  127. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -232
  128. package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -103
  129. package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -61
  130. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -82
  131. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -80
  132. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -59
  133. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -828
  134. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -212
  135. package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -2145
  136. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
  137. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -815
  138. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
  139. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -555
  140. package/esm5/lib/components/column-selector/column-selector.component.js +0 -389
  141. package/esm5/lib/components/column-selector/column-selector.service.js +0 -68
  142. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -92
  143. package/esm5/lib/directives/advance-search-state.directive.js +0 -169
  144. package/esm5/lib/directives/advance-table-state.directive.js +0 -87
  145. package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -98
  146. package/esm5/lib/directives/advanced-table-editor.directive.js +0 -244
  147. package/esm5/lib/directives/btnexp.directive.js +0 -389
  148. package/esm5/lib/i18n/tables.el.js +0 -133
  149. package/esm5/lib/i18n/tables.en.js +0 -132
  150. package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -65
  151. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -75
  152. package/esm5/lib/reducers/index.js +0 -65
  153. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -196
  154. package/esm5/lib/tables.activated-table.service.js +0 -88
  155. package/esm5/lib/tables.module.js +0 -168
  156. package/esm5/public_api.js +0 -37
  157. package/esm5/universis-ngx-tables.js +0 -13
  158. package/fesm2015/universis-ngx-tables.js +0 -6745
  159. package/fesm2015/universis-ngx-tables.js.map +0 -1
  160. package/fesm5/universis-ngx-tables.js +0 -7837
  161. package/fesm5/universis-ngx-tables.js.map +0 -1
  162. package/universis-ngx-tables.d.ts +0 -8
  163. package/universis-ngx-tables.metadata.json +0 -1
@@ -0,0 +1,108 @@
1
+ import { Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
2
+ import { FormArray, FormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@themost/angular";
5
+ import * as i2 from "@angular/router";
6
+ import * as i3 from "ngx-bootstrap/modal";
7
+ import * as i4 from "@universis/common";
8
+ import * as i5 from "@angular/forms";
9
+ import * as i6 from "../../tables.activated-table.service";
10
+ import * as i7 from "@ngx-translate/core";
11
+ export class AdvancedTableSettingsComponent {
12
+ constructor(_context, _activatedRoute, modalService, userStorage, formBuilder, _activatedTable) {
13
+ this._context = _context;
14
+ this._activatedRoute = _activatedRoute;
15
+ this.modalService = modalService;
16
+ this.userStorage = userStorage;
17
+ this.formBuilder = formBuilder;
18
+ this._activatedTable = _activatedTable;
19
+ this.params = this._activatedRoute.params;
20
+ this.columns = [];
21
+ }
22
+ ngOnInit() {
23
+ }
24
+ ngAfterViewInit() {
25
+ this.activeTableConfig = this._activatedTable.activeTable && this._activatedTable.activeTable.getConfig();
26
+ this.storageKey = 'registrar/settings/' + this.activeTableConfig.title + '/table/columns';
27
+ this.form = this.formBuilder.group({ columns: new FormArray([], this.minSelectedColumns(1)) });
28
+ this.userStorage.getItem(this.storageKey).then((data) => {
29
+ if (data) {
30
+ this.savedTableSettings = data.value;
31
+ if (this.savedTableSettings) {
32
+ if (this._activatedTable.activeTable) {
33
+ this._activatedTable.activeTable.handleColumns(this.savedTableSettings);
34
+ }
35
+ }
36
+ this.addCheckboxes();
37
+ }
38
+ });
39
+ }
40
+ addCheckboxes() {
41
+ this.tableColumns = this.activeTableConfig.columns.slice(1);
42
+ this.tableColumns.forEach((column, i) => {
43
+ if (!column.hidden) {
44
+ const control = {
45
+ id: column.name,
46
+ name: column.title
47
+ };
48
+ this.columns.push(control);
49
+ }
50
+ });
51
+ if (this.savedTableSettings) {
52
+ this.columns.forEach((column, i) => {
53
+ column.check = false;
54
+ column.check = this.savedTableSettings.includes(column.id);
55
+ });
56
+ this.columns.map((column, i) => {
57
+ const control = new FormControl(column.check);
58
+ if (this.form) {
59
+ this.form.controls.columns.push(control);
60
+ }
61
+ });
62
+ }
63
+ }
64
+ openTableSettings(table_settings_modal) {
65
+ this.modalRef = this.modalService.show(table_settings_modal);
66
+ }
67
+ saveTableSettings() {
68
+ if (this.form == null) {
69
+ return;
70
+ }
71
+ const selectedColumnsIds = this.form.value.columns
72
+ .map((v, i) => v ? this.columns[i].id : null)
73
+ .filter(v => v !== null);
74
+ this.userStorage.setItem(this.storageKey, selectedColumnsIds);
75
+ if (this._activatedTable.activeTable) {
76
+ this._activatedTable.activeTable.handleColumns(selectedColumnsIds);
77
+ }
78
+ if (this.modalRef) {
79
+ this.modalRef.hide();
80
+ }
81
+ }
82
+ dismiss() {
83
+ if (this.modalRef) {
84
+ this.modalRef.hide();
85
+ }
86
+ }
87
+ minSelectedColumns(min = 1) {
88
+ const validator = (formArray) => {
89
+ const totalSelected = formArray.controls
90
+ .map(control => control.value)
91
+ .reduce((prev, next) => next ? prev + next : prev, 0);
92
+ return totalSelected >= min ? null : { required: true };
93
+ };
94
+ return validator;
95
+ }
96
+ }
97
+ AdvancedTableSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedTableSettingsComponent, deps: [{ token: i1.AngularDataContext }, { token: i2.ActivatedRoute }, { token: i3.BsModalService }, { token: i4.UserStorageService }, { token: i5.FormBuilder }, { token: i6.ActivatedTableService }], target: i0.ɵɵFactoryTarget.Component });
98
+ AdvancedTableSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AdvancedTableSettingsComponent, selector: "app-advanced-table-settings", inputs: { table: "table" }, viewQueries: [{ propertyName: "modal_settings_template", first: true, predicate: ["modal_settings_template"], descendants: true }], ngImport: i0, template: "<i class=\"fa fa-edit fa-lg advanced-table-settings\" (click)=\"openTableSettings(modal_settings_template)\"></i>\r\n<ng-template #modal_settings_template>\r\n <div class=\"modal-header\">\r\n <h3 class=\"modal-title\" [translate]=\"'Tables.ColumnDisplay'\"></h3>\r\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"dismiss()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n\r\n <form class=\"form-group p-3 text-left\" [formGroup]=\"form\" (ngSubmit)=\"saveTableSettings()\">\r\n <div class=\"modal-body\">\r\n <p [translate]=\"'Tables.ColumnDisplayInfo'\"></p>\r\n <!-- <div *ngFor=\"let column of form.controls.columns.controls; let i = index\">\r\n <div formArrayName=\"columns\">\r\n <input class=\"checkbox checkbox-primary\" type=\"checkbox\" [formControlName]=\"i\" id=\"checkbox{{i}}\">\r\n <label for=\"checkbox{{i}}\">\r\n {{columns[i].name | translate}}\r\n </label>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-light\" (click)=\"dismiss()\" [translate]=\"'Tables.Cancel'\"> </button>\r\n <button type=\"submit\" class=\"btn btn-success\" [translate]=\"'Tables.Save'\"></button>\r\n </div>\r\n </form>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], encapsulation: i0.ViewEncapsulation.None });
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedTableSettingsComponent, decorators: [{
100
+ type: Component,
101
+ args: [{ selector: 'app-advanced-table-settings', encapsulation: ViewEncapsulation.None, template: "<i class=\"fa fa-edit fa-lg advanced-table-settings\" (click)=\"openTableSettings(modal_settings_template)\"></i>\r\n<ng-template #modal_settings_template>\r\n <div class=\"modal-header\">\r\n <h3 class=\"modal-title\" [translate]=\"'Tables.ColumnDisplay'\"></h3>\r\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"dismiss()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n\r\n <form class=\"form-group p-3 text-left\" [formGroup]=\"form\" (ngSubmit)=\"saveTableSettings()\">\r\n <div class=\"modal-body\">\r\n <p [translate]=\"'Tables.ColumnDisplayInfo'\"></p>\r\n <!-- <div *ngFor=\"let column of form.controls.columns.controls; let i = index\">\r\n <div formArrayName=\"columns\">\r\n <input class=\"checkbox checkbox-primary\" type=\"checkbox\" [formControlName]=\"i\" id=\"checkbox{{i}}\">\r\n <label for=\"checkbox{{i}}\">\r\n {{columns[i].name | translate}}\r\n </label>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-light\" (click)=\"dismiss()\" [translate]=\"'Tables.Cancel'\"> </button>\r\n <button type=\"submit\" class=\"btn btn-success\" [translate]=\"'Tables.Save'\"></button>\r\n </div>\r\n </form>\r\n</ng-template>\r\n" }]
102
+ }], ctorParameters: function () { return [{ type: i1.AngularDataContext }, { type: i2.ActivatedRoute }, { type: i3.BsModalService }, { type: i4.UserStorageService }, { type: i5.FormBuilder }, { type: i6.ActivatedTableService }]; }, propDecorators: { table: [{
103
+ type: Input
104
+ }], modal_settings_template: [{
105
+ type: ViewChild,
106
+ args: ['modal_settings_template']
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUtc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLXNldHRpbmdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFBRSxTQUFTLEVBQWUsV0FBVyxFQUEwQixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFTN0YsTUFBTSxPQUFPLDhCQUE4QjtJQWF6QyxZQUFzQixRQUE0QixFQUM1QixlQUErQixFQUNqQyxZQUE0QixFQUM1QixXQUErQixFQUMvQixXQUF3QixFQUN4QixlQUFzQztRQUxwQyxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDakMsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFaMUQsV0FBTSxHQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBRzFDLFlBQU8sR0FBVSxFQUFFLENBQUM7SUFVcEIsQ0FBQztJQUNELFFBQVE7SUFDUixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUs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Q0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7OzJIQW5HVSw4QkFBOEI7K0dBQTlCLDhCQUE4QixtT0N6QjNDLDQ4Q0EyQkE7MkZERmEsOEJBQThCO2tCQVAxQyxTQUFTOytCQUVFLDZCQUE2QixpQkFFeEIsaUJBQWlCLENBQUMsSUFBSTtrUUFLNUIsS0FBSztzQkFBYixLQUFLO2dCQUNnQyx1QkFBdUI7c0JBQTVELFNBQVM7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBbmd1bGFyRGF0YUNvbnRleHQgfSBmcm9tICdAdGhlbW9zdC9hbmd1bGFyJztcclxuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdGFibGVzLmFjdGl2YXRlZC10YWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2FwcC1hZHZhbmNlZC10YWJsZS1zZXR0aW5ncycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXRhYmxlLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZVNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQElucHV0KCkgdGFibGU/OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ21vZGFsX3NldHRpbmdzX3RlbXBsYXRlJykgbW9kYWxfc2V0dGluZ3NfdGVtcGxhdGU/OiBFbGVtZW50UmVmO1xyXG4gIG1vZGFsUmVmPzogQnNNb2RhbFJlZjtcclxuICBzdG9yYWdlS2V5OiBhbnk7XHJcbiAgcGFyYW1zOiBhbnkgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5wYXJhbXM7XHJcbiAgcHJpdmF0ZSBzYXZlZFRhYmxlU2V0dGluZ3M6IGFueTtcclxuICBmb3JtPzogRm9ybUdyb3VwO1xyXG4gIGNvbHVtbnM6IGFueVtdID0gW107XHJcbiAgdGFibGVDb2x1bW5zOiBhbnk7XHJcbiAgYWN0aXZlVGFibGVDb25maWc6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXNlclN0b3JhZ2U6IFVzZXJTdG9yYWdlU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9hY3RpdmF0ZWRUYWJsZTogQWN0aXZhdGVkVGFibGVTZXJ2aWNlKSB7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYmxlQ29uZmlnID0gdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUgJiYgdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUuZ2V0Q29uZmlnKCk7XHJcbiAgICB0aGlzLnN0b3JhZ2VLZXkgPSAncmVnaXN0cmFyL3NldHRpbmdzLycgKyB0aGlzLmFjdGl2ZVRhYmxlQ29uZmlnLnRpdGxlICsgJy90YWJsZS9jb2x1bW5zJztcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe2NvbHVtbnM6IG5ldyBGb3JtQXJyYXkoW10sIHRoaXMubWluU2VsZWN0ZWRDb2x1bW5zKDEpKX0pO1xyXG4gICAgdGhpcy51c2VyU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSkudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2F2ZWRUYWJsZVNldHRpbmdzID0gZGF0YS52YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5zYXZlZFRhYmxlU2V0dGluZ3MpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmF0ZWRUYWJsZS5hY3RpdmVUYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmF0ZWRUYWJsZS5hY3RpdmVUYWJsZS5oYW5kbGVDb2x1bW5zKHRoaXMuc2F2ZWRUYWJsZVNldHRpbmdzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDaGVja2JveGVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIGFkZENoZWNrYm94ZXMoKSB7XHJcbiAgICB0aGlzLnRhYmxlQ29sdW1ucyA9IHRoaXMuYWN0aXZlVGFibGVDb25maWcuY29sdW1ucy5zbGljZSgxKTtcclxuICAgIHRoaXMudGFibGVDb2x1bW5zLmZvckVhY2ggKChjb2x1bW4sIGkpID0+IHtcclxuICAgICAgaWYgKCFjb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHtcclxuICAgICAgICAgIGlkOiBjb2x1bW4ubmFtZSxcclxuICAgICAgICAgIG5hbWU6IGNvbHVtbi50aXRsZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29udHJvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc2F2ZWRUYWJsZVNldHRpbmdzKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoICgoY29sdW1uLCBpKSA9PiB7XHJcbiAgICAgICAgY29sdW1uLmNoZWNrID0gZmFsc2U7XHJcbiAgICAgICAgY29sdW1uLmNoZWNrID0gdGhpcy5zYXZlZFRhYmxlU2V0dGluZ3MuaW5jbHVkZXMoY29sdW1uLmlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbiwgaSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woY29sdW1uLmNoZWNrKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtKSB7XHJcbiAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzLmNvbHVtbnMgYXMgRm9ybUFycmF5KS5wdXNoKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVGFibGVTZXR0aW5ncyh0YWJsZV9zZXR0aW5nc19tb2RhbDogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGFibGVfc2V0dGluZ3NfbW9kYWwpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVRhYmxlU2V0dGluZ3MoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zSWRzID0gdGhpcy5mb3JtLnZhbHVlLmNvbHVtbnNcclxuICAgICAgLm1hcCgodiwgaSkgPT4gdiA/IHRoaXMuY29sdW1uc1tpXS5pZCA6IG51bGwpXHJcbiAgICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcclxuICAgIHRoaXMudXNlclN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIHNlbGVjdGVkQ29sdW1uc0lkcyk7XHJcbiAgICBpZiAodGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUpIHtcclxuICAgICAgdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUuaGFuZGxlQ29sdW1ucyhzZWxlY3RlZENvbHVtbnNJZHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5tb2RhbFJlZi5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNtaXNzKCkge1xyXG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5tb2RhbFJlZi5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtaW5TZWxlY3RlZENvbHVtbnMobWluID0gMSkge1xyXG4gICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChmb3JtQXJyYXk6IEZvcm1BcnJheSkgPT4ge1xyXG4gICAgICBjb25zdCB0b3RhbFNlbGVjdGVkID0gZm9ybUFycmF5LmNvbnRyb2xzXHJcbiAgICAgICAgLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpXHJcbiAgICAgICAgLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gbmV4dCA/IHByZXYgKyBuZXh0IDogcHJldiwgMCk7XHJcblxyXG4gICAgICByZXR1cm4gdG90YWxTZWxlY3RlZCA+PSBtaW4gPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdmFsaWRhdG9yO1xyXG4gIH1cclxufVxyXG4iLCI8aSBjbGFzcz1cImZhIGZhLWVkaXQgZmEtbGcgYWR2YW5jZWQtdGFibGUtc2V0dGluZ3NcIiAoY2xpY2spPVwib3BlblRhYmxlU2V0dGluZ3MobW9kYWxfc2V0dGluZ3NfdGVtcGxhdGUpXCI+PC9pPlxyXG48bmctdGVtcGxhdGUgI21vZGFsX3NldHRpbmdzX3RlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGVcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuQ29sdW1uRGlzcGxheSdcIj48L2gzPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJkaXNtaXNzKClcIj5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWdyb3VwIHAtMyB0ZXh0LWxlZnRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwic2F2ZVRhYmxlU2V0dGluZ3MoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICA8cCBbdHJhbnNsYXRlXT1cIidUYWJsZXMuQ29sdW1uRGlzcGxheUluZm8nXCI+PC9wPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmb3JtLmNvbnRyb2xzLmNvbHVtbnMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGVja2JveCBjaGVja2JveC1wcmltYXJ5XCIgdHlwZT1cImNoZWNrYm94XCIgW2Zvcm1Db250cm9sTmFtZV09XCJpXCIgaWQ9XCJjaGVja2JveHt7aX19XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hlY2tib3h7e2l9fVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e2NvbHVtbnNbaV0ubmFtZSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cImRpc21pc3MoKVwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5DYW5jZWwnXCI+IDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuU2F2ZSdcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=