@firestitch/list 13.0.2 → 13.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 (191) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +71 -71
  3. package/app/classes/data-controller.d.ts +91 -91
  4. package/app/classes/external-params-controller.d.ts +32 -32
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +191 -191
  7. package/app/classes/pagination-controller.d.ts +198 -196
  8. package/app/classes/persistance-controller.d.ts +10 -10
  9. package/app/classes/reorder-controller.d.ts +68 -68
  10. package/app/classes/selection-controller.d.ts +155 -155
  11. package/app/classes/sorting-controller.d.ts +65 -65
  12. package/app/components/body/body.component.d.ts +28 -28
  13. package/app/components/body/row/actions/actions.component.d.ts +36 -36
  14. package/app/components/body/row/cell/cell.component.d.ts +22 -22
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +13 -13
  16. package/app/components/body/row/menu-action/menu-action.component.d.ts +20 -20
  17. package/app/components/body/row/row.component.d.ts +85 -85
  18. package/app/components/customize-cols/customize-cols.component.d.ts +17 -17
  19. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -7
  20. package/app/components/footer/footer-row/footer-row.component.d.ts +14 -14
  21. package/app/components/footer/footer.component.d.ts +15 -15
  22. package/app/components/head/head-cell/head-cell.component.d.ts +14 -14
  23. package/app/components/head/head.component.d.ts +49 -49
  24. package/app/components/list/list.component.d.ts +128 -126
  25. package/app/components/loader/loader.component.d.ts +14 -14
  26. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +13 -13
  27. package/app/components/pagination/pagination.component.d.ts +14 -14
  28. package/app/components/saved-filters/saved-filters.component.d.ts +15 -15
  29. package/app/components/status/status.component.d.ts +21 -21
  30. package/app/directives/cell/cell.directive.d.ts +8 -8
  31. package/app/directives/column/column.directive.d.ts +33 -33
  32. package/app/directives/content/content.directive.d.ts +5 -5
  33. package/app/directives/content-init/content-init.directive.d.ts +9 -9
  34. package/app/directives/draggable-list/draggable-list.directive.d.ts +95 -95
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +23 -23
  36. package/app/directives/empty-state/empty-state.directive.d.ts +5 -5
  37. package/app/directives/footer/footer.directive.d.ts +8 -8
  38. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +10 -10
  39. package/app/directives/group-footer/group-footer.directive.d.ts +6 -6
  40. package/app/directives/group-header/group-header.directive.d.ts +6 -6
  41. package/app/directives/header/header.directive.d.ts +8 -8
  42. package/app/directives/heading/heading.directive.d.ts +5 -5
  43. package/app/directives/heading-container/heading-container.directive.d.ts +5 -5
  44. package/app/directives/index.d.ts +3 -3
  45. package/app/directives/subheading/subheading.directive.d.ts +5 -5
  46. package/app/enums/button-type.enum.d.ts +7 -7
  47. package/app/enums/page-change-type.enum.d.ts +4 -4
  48. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  49. package/app/enums/row-type.enum.d.ts +6 -6
  50. package/app/enums/state.enum.d.ts +9 -9
  51. package/app/fs-list.module.d.ts +60 -60
  52. package/app/fs-list.providers.d.ts +3 -3
  53. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  54. package/app/interfaces/column-config.interface.d.ts +2 -2
  55. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  56. package/app/interfaces/external-params.interface.d.ts +13 -13
  57. package/app/interfaces/index.d.ts +4 -4
  58. package/app/interfaces/listconfig.interface.d.ts +247 -247
  59. package/app/interfaces/pagination-state.interface.d.ts +9 -0
  60. package/app/interfaces/pagination.interface.d.ts +13 -13
  61. package/app/interfaces/sorting-change-event.interface.d.ts +4 -4
  62. package/app/models/column-async-attribute.d.ts +5 -5
  63. package/app/models/column-attributes.d.ts +39 -39
  64. package/app/models/column.model.d.ts +60 -60
  65. package/app/models/row/base-row.d.ts +13 -13
  66. package/app/models/row/child-row.d.ts +12 -12
  67. package/app/models/row/group-footer-row.d.ts +10 -10
  68. package/app/models/row/group-row.d.ts +16 -16
  69. package/app/models/row/simple-row.d.ts +5 -5
  70. package/app/models/row-action.model.d.ts +29 -29
  71. package/app/models/row.d.ts +34 -34
  72. package/app/models/styleConfig.model.d.ts +31 -31
  73. package/app/pipes/action-label.d.ts +8 -8
  74. package/app/pipes/index.d.ts +1 -1
  75. package/app/services/group-expand-notifier.service.d.ts +11 -11
  76. package/bundles/firestitch-list.umd.js +7218 -0
  77. package/bundles/firestitch-list.umd.js.map +1 -0
  78. package/{esm2020/app/classes/actions-controller.mjs → esm2015/app/classes/actions-controller.js} +55 -55
  79. package/{esm2020/app/classes/columns-controller.mjs → esm2015/app/classes/columns-controller.js} +205 -205
  80. package/esm2015/app/classes/data-controller.js +365 -0
  81. package/esm2015/app/classes/external-params-controller.js +147 -0
  82. package/{esm2020/app/classes/index.mjs → esm2015/app/classes/index.js} +3 -3
  83. package/esm2015/app/classes/list-controller.js +754 -0
  84. package/esm2015/app/classes/pagination-controller.js +479 -0
  85. package/{esm2020/app/classes/persistance-controller.mjs → esm2015/app/classes/persistance-controller.js} +19 -19
  86. package/esm2015/app/classes/reorder-controller.js +183 -0
  87. package/esm2015/app/classes/selection-controller.js +468 -0
  88. package/{esm2020/app/classes/sorting-controller.mjs → esm2015/app/classes/sorting-controller.js} +183 -183
  89. package/esm2015/app/components/body/body.component.js +69 -0
  90. package/esm2015/app/components/body/row/actions/actions.component.js +102 -0
  91. package/esm2015/app/components/body/row/cell/cell.component.js +113 -0
  92. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +37 -0
  93. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +50 -0
  94. package/esm2015/app/components/body/row/row.component.js +330 -0
  95. package/esm2015/app/components/customize-cols/customize-cols.component.js +72 -0
  96. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -0
  97. package/esm2015/app/components/footer/footer-row/footer-row.component.js +33 -0
  98. package/esm2015/app/components/footer/footer.component.js +36 -0
  99. package/esm2015/app/components/head/head-cell/head-cell.component.js +34 -0
  100. package/esm2015/app/components/head/head.component.js +108 -0
  101. package/esm2015/app/components/list/list.component.js +397 -0
  102. package/esm2015/app/components/loader/loader.component.js +45 -0
  103. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +79 -0
  104. package/esm2015/app/components/pagination/pagination.component.js +42 -0
  105. package/esm2015/app/components/saved-filters/saved-filters.component.js +32 -0
  106. package/esm2015/app/components/status/status.component.js +72 -0
  107. package/{esm2020/app/directives/cell/cell.directive.mjs → esm2015/app/directives/cell/cell.directive.js} +18 -18
  108. package/{esm2020/app/directives/column/column.directive.mjs → esm2015/app/directives/column/column.directive.js} +112 -112
  109. package/{esm2020/app/directives/content/content.directive.mjs → esm2015/app/directives/content/content.directive.js} +13 -13
  110. package/{esm2020/app/directives/content-init/content-init.directive.mjs → esm2015/app/directives/content-init/content-init.directive.js} +22 -22
  111. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +330 -0
  112. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +79 -0
  113. package/{esm2020/app/directives/empty-state/empty-state.directive.mjs → esm2015/app/directives/empty-state/empty-state.directive.js} +13 -13
  114. package/{esm2020/app/directives/footer/footer.directive.mjs → esm2015/app/directives/footer/footer.directive.js} +18 -18
  115. package/{esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs → esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js} +26 -26
  116. package/{esm2020/app/directives/group-footer/group-footer.directive.mjs → esm2015/app/directives/group-footer/group-footer.directive.js} +14 -14
  117. package/{esm2020/app/directives/group-header/group-header.directive.mjs → esm2015/app/directives/group-header/group-header.directive.js} +14 -14
  118. package/{esm2020/app/directives/header/header.directive.mjs → esm2015/app/directives/header/header.directive.js} +18 -18
  119. package/{esm2020/app/directives/heading/heading.directive.mjs → esm2015/app/directives/heading/heading.directive.js} +13 -13
  120. package/{esm2020/app/directives/heading-container/heading-container.directive.mjs → esm2015/app/directives/heading-container/heading-container.directive.js} +13 -13
  121. package/{esm2020/app/directives/index.mjs → esm2015/app/directives/index.js} +4 -4
  122. package/{esm2020/app/directives/subheading/subheading.directive.mjs → esm2015/app/directives/subheading/subheading.directive.js} +13 -13
  123. package/{esm2020/app/enums/button-type.enum.mjs → esm2015/app/enums/button-type.enum.js} +9 -9
  124. package/{esm2020/app/enums/page-change-type.enum.mjs → esm2015/app/enums/page-change-type.enum.js} +6 -6
  125. package/{esm2020/app/enums/pagination-strategy.enum.mjs → esm2015/app/enums/pagination-strategy.enum.js} +7 -7
  126. package/{esm2020/app/enums/row-type.enum.mjs → esm2015/app/enums/row-type.enum.js} +7 -7
  127. package/{esm2020/app/enums/state.enum.mjs → esm2015/app/enums/state.enum.js} +11 -11
  128. package/{esm2020/app/fs-list.module.mjs → esm2015/app/fs-list.module.js} +246 -246
  129. package/{esm2020/app/fs-list.providers.mjs → esm2015/app/fs-list.providers.js} +4 -4
  130. package/{esm2020/app/interfaces/cellconfig.interface.mjs → esm2015/app/interfaces/cellconfig.interface.js} +2 -2
  131. package/{esm2020/app/interfaces/column-config.interface.mjs → esm2015/app/interfaces/column-config.interface.js} +1 -1
  132. package/{esm2020/app/interfaces/draggable-list.interface.mjs → esm2015/app/interfaces/draggable-list.interface.js} +2 -2
  133. package/esm2015/app/interfaces/external-params.interface.js +2 -0
  134. package/{esm2020/app/interfaces/index.mjs → esm2015/app/interfaces/index.js} +5 -5
  135. package/{esm2020/app/interfaces/listconfig.interface.mjs → esm2015/app/interfaces/listconfig.interface.js} +1 -1
  136. package/esm2015/app/interfaces/pagination-state.interface.js +2 -0
  137. package/esm2015/app/interfaces/pagination.interface.js +2 -0
  138. package/{esm2020/app/interfaces/sorting-change-event.interface.mjs → esm2015/app/interfaces/sorting-change-event.interface.js} +2 -2
  139. package/{esm2020/app/models/column-async-attribute.mjs → esm2015/app/models/column-async-attribute.js} +13 -13
  140. package/{esm2020/app/models/column-attributes.mjs → esm2015/app/models/column-attributes.js} +130 -130
  141. package/{esm2020/app/models/column.model.mjs → esm2015/app/models/column.model.js} +162 -162
  142. package/{esm2020/app/models/row/base-row.mjs → esm2015/app/models/row/base-row.js} +23 -23
  143. package/{esm2020/app/models/row/child-row.mjs → esm2015/app/models/row/child-row.js} +28 -28
  144. package/{esm2020/app/models/row/group-footer-row.mjs → esm2015/app/models/row/group-footer-row.js} +20 -20
  145. package/{esm2020/app/models/row/group-row.mjs → esm2015/app/models/row/group-row.js} +44 -44
  146. package/{esm2020/app/models/row/simple-row.mjs → esm2015/app/models/row/simple-row.js} +10 -10
  147. package/esm2015/app/models/row-action.model.js +90 -0
  148. package/{esm2020/app/models/row.mjs → esm2015/app/models/row.js} +88 -88
  149. package/{esm2020/app/models/styleConfig.model.mjs → esm2015/app/models/styleConfig.model.js} +75 -75
  150. package/{esm2020/app/pipes/action-label.mjs → esm2015/app/pipes/action-label.js} +17 -17
  151. package/{esm2020/app/pipes/index.mjs → esm2015/app/pipes/index.js} +1 -1
  152. package/{esm2020/app/services/group-expand-notifier.service.mjs → esm2015/app/services/group-expand-notifier.service.js} +26 -26
  153. package/{esm2020/firestitch-list.mjs → esm2015/firestitch-list.js} +4 -4
  154. package/{esm2020/public_api.mjs → esm2015/public_api.js} +46 -46
  155. package/fesm2015/{firestitch-list.mjs → firestitch-list.js} +5803 -5711
  156. package/fesm2015/firestitch-list.js.map +1 -0
  157. package/firestitch-list.d.ts +5 -5
  158. package/package.json +7 -20
  159. package/public_api.d.ts +41 -40
  160. package/esm2020/app/classes/data-controller.mjs +0 -367
  161. package/esm2020/app/classes/external-params-controller.mjs +0 -147
  162. package/esm2020/app/classes/list-controller.mjs +0 -752
  163. package/esm2020/app/classes/pagination-controller.mjs +0 -467
  164. package/esm2020/app/classes/reorder-controller.mjs +0 -182
  165. package/esm2020/app/classes/selection-controller.mjs +0 -468
  166. package/esm2020/app/components/body/body.component.mjs +0 -64
  167. package/esm2020/app/components/body/row/actions/actions.component.mjs +0 -97
  168. package/esm2020/app/components/body/row/cell/cell.component.mjs +0 -107
  169. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +0 -33
  170. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +0 -46
  171. package/esm2020/app/components/body/row/row.component.mjs +0 -323
  172. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +0 -68
  173. package/esm2020/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +0 -16
  174. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +0 -28
  175. package/esm2020/app/components/footer/footer.component.mjs +0 -31
  176. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +0 -29
  177. package/esm2020/app/components/head/head.component.mjs +0 -103
  178. package/esm2020/app/components/list/list.component.mjs +0 -388
  179. package/esm2020/app/components/loader/loader.component.mjs +0 -40
  180. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +0 -76
  181. package/esm2020/app/components/pagination/pagination.component.mjs +0 -37
  182. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +0 -29
  183. package/esm2020/app/components/status/status.component.mjs +0 -66
  184. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +0 -328
  185. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +0 -78
  186. package/esm2020/app/interfaces/external-params.interface.mjs +0 -2
  187. package/esm2020/app/interfaces/pagination.interface.mjs +0 -2
  188. package/esm2020/app/models/row-action.model.mjs +0 -90
  189. package/fesm2015/firestitch-list.mjs.map +0 -1
  190. package/fesm2020/firestitch-list.mjs +0 -5846
  191. package/fesm2020/firestitch-list.mjs.map +0 -1
@@ -1,147 +0,0 @@
1
- import { merge, Subject } from 'rxjs';
2
- import { takeUntil } from 'rxjs/operators';
3
- export class ExternalParamsController {
4
- constructor(_router, _route, _persistance, _paginator, _sorting, _queryParamsEnabled) {
5
- this._router = _router;
6
- this._route = _route;
7
- this._persistance = _persistance;
8
- this._paginator = _paginator;
9
- this._sorting = _sorting;
10
- this._queryParamsEnabled = _queryParamsEnabled;
11
- this._externalParams = {
12
- page: null,
13
- limit: null,
14
- sortName: null,
15
- sortDirection: null,
16
- };
17
- this._destroy$ = new Subject();
18
- this.initialize();
19
- }
20
- get externalSorting() {
21
- if (!this._enabled || !this._sortName || !this._sortDirection) {
22
- return null;
23
- }
24
- return {
25
- value: this._sortName,
26
- direction: this._sortDirection,
27
- };
28
- }
29
- get _enabled() {
30
- return this._queryParamsEnabled || this._persistance.enabled;
31
- }
32
- get _page() {
33
- return this._externalParams.page;
34
- }
35
- get _limit() {
36
- return this._externalParams.limit;
37
- }
38
- get _sortName() {
39
- return this._externalParams.sortName;
40
- }
41
- get _sortDirection() {
42
- return this._externalParams.sortDirection;
43
- }
44
- initialize() {
45
- // Restore from localStorage parameters if persistance enabled
46
- if (this._persistance.enabled) {
47
- this._restorePaginationParams(this._persistance.getDataFromScope('paging'));
48
- this._restoreSortingParams(this._persistance.getDataFromScope('sorting'));
49
- }
50
- // Restore from queryParams and override if persistance already had values for those params
51
- if (this._queryParamsEnabled) {
52
- this._restorePaginationParams(this._route.snapshot.queryParams);
53
- this._restoreSortingParams(this._route.snapshot.queryParams);
54
- }
55
- // Set initial pagination params
56
- // The same initial, but for sorting placed in list-controller "tranformTemplatesToColumns" method
57
- if (this._paginator.enabled && !this._paginator.infinityScrollEnabled) {
58
- if (this._limit) {
59
- this._paginator.setLimit(this._limit);
60
- }
61
- if (this._page) {
62
- this._paginator.goToPage(this._page);
63
- }
64
- }
65
- // Update pagination in stores
66
- this._updatePaginationParams(this._paginator.queryPageStrategy);
67
- this._listenPaginatorChanges();
68
- this._listenSortingChanges();
69
- }
70
- clearSortingParams() {
71
- this._updateSortingParams(null, null);
72
- }
73
- destroy() {
74
- this._destroy$.next();
75
- this._destroy$.complete();
76
- }
77
- _restorePaginationParams(values) {
78
- if (values?.page) {
79
- this._externalParams.page = +values.page;
80
- }
81
- if (values?.limit) {
82
- this._externalParams.limit = +values.limit;
83
- }
84
- }
85
- _restoreSortingParams(values) {
86
- if (values?.sortName) {
87
- this._externalParams.sortName = values.sortName;
88
- }
89
- if (values?.sortDirection) {
90
- this._externalParams.sortDirection = values.sortDirection;
91
- }
92
- }
93
- _listenPaginatorChanges() {
94
- merge(this._paginator.pageChanged$, this._paginator.pages$, this._paginator.pageReset$)
95
- .pipe(takeUntil(this._destroy$))
96
- .subscribe(() => {
97
- this._updatePaginationParams(this._paginator.queryPageStrategy);
98
- });
99
- }
100
- _listenSortingChanges() {
101
- merge(this._sorting.initialized$, this._sorting.sortingChanged$)
102
- .pipe(takeUntil(this._destroy$))
103
- .subscribe(() => {
104
- const sorting = this._sorting.value;
105
- if (sorting) {
106
- this._updateSortingParams(sorting.value, sorting.direction);
107
- }
108
- else {
109
- this.clearSortingParams();
110
- }
111
- });
112
- }
113
- _updateSortingParams(name, direction) {
114
- if (this._queryParamsEnabled) {
115
- this._replaceState({
116
- sortName: name,
117
- sortDirection: direction,
118
- });
119
- }
120
- if (this._persistance.enabled) {
121
- if (name && direction) {
122
- this._persistance.saveDataToScope('sorting', { sortName: name, sortDirection: direction });
123
- }
124
- else {
125
- this._persistance.saveDataToScope('sorting', null);
126
- }
127
- }
128
- }
129
- _updatePaginationParams(params) {
130
- if (this._queryParamsEnabled) {
131
- this._replaceState(params);
132
- }
133
- if (this._persistance.enabled) {
134
- this._persistance.saveDataToScope('paging', params);
135
- }
136
- }
137
- _replaceState(data) {
138
- const url = new URL(window.location.href);
139
- Object.keys(data)
140
- .filter((name) => data[name] !== undefined && data[name] !== null)
141
- .forEach((name) => {
142
- url.searchParams.set(name, data[name]);
143
- });
144
- history.replaceState({}, null, url.pathname + url.search);
145
- }
146
- }
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2NsYXNzZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBYzNDLE1BQU0sT0FBTyx3QkFBd0I7SUFXbkMsWUFDVSxPQUFlLEVBQ2YsTUFBc0IsRUFDdEIsWUFBbUMsRUFDbkMsVUFBZ0MsRUFDaEMsUUFBMkIsRUFDM0IsbUJBQTRCO1FBTDVCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFDM0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO1FBZjlCLG9CQUFlLEdBQW1CO1lBQ3hDLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUM7UUFFTSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQVV0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMs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LFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udHJvbGxlciB9IGZyb20gJy4uL2NsYXNzZXMvcGFnaW5hdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFNvcnRpbmdDb250cm9sbGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9zb3J0aW5nLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRnNMaXN0U29ydENvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgRXh0ZXJuYWxQYXJhbXMsXG4gIEV4dGVybmFsUXVlcnlQYWdpbmF0aW9uLFxuICBFeHRlcm5hbFF1ZXJ5U29ydGluZyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRlcm5hbC1wYXJhbXMuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgUGVyc2lzdGFuY2VDb250cm9sbGVyIH0gZnJvbSAnLi9wZXJzaXN0YW5jZS1jb250cm9sbGVyJztcblxuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyIHtcblxuICBwcml2YXRlIF9leHRlcm5hbFBhcmFtczogRXh0ZXJuYWxQYXJhbXMgPSB7XG4gICAgcGFnZTogbnVsbCxcbiAgICBsaW1pdDogbnVsbCxcbiAgICBzb3J0TmFtZTogbnVsbCxcbiAgICBzb3J0RGlyZWN0aW9uOiBudWxsLFxuICB9O1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBfcGVyc2lzdGFuY2U6IFBlcnNpc3RhbmNlQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9wYWdpbmF0b3I6IFBhZ2luYXRpb25Db250cm9sbGVyLFxuICAgIHByaXZhdGUgX3NvcnRpbmc6IFNvcnRpbmdDb250cm9sbGVyLFxuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zRW5hYmxlZDogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4dGVybmFsU29ydGluZygpOiBGc0xpc3RTb3J0Q29uZmlnIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQgfHwgIXRoaXMuX3NvcnROYW1lIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHRoaXMuX3NvcnROYW1lLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLl9zb3J0RGlyZWN0aW9uLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldCBfZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlQYXJhbXNFbmFibGVkIHx8IHRoaXMuX3BlcnNpc3RhbmNlLmVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBfcGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFBhcmFtcy5wYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsUGFyYW1zLmxpbWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3NvcnROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsUGFyYW1zLnNvcnROYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3NvcnREaXJlY3Rpb24oKTogJ2FzYycgfCAnZGVzYycge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0RGlyZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoKSB7XG5cbiAgICAvLyBSZXN0b3JlIGZyb20gbG9jYWxTdG9yYWdlIHBhcmFtZXRlcnMgaWYgcGVyc2lzdGFuY2UgZW5hYmxlZFxuICAgIGlmICh0aGlzLl9wZXJzaXN0YW5jZS5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wZXJzaXN0YW5jZS5nZXREYXRhRnJvbVNjb3BlKCdwYWdpbmcnKSk7XG4gICAgICB0aGlzLl9yZXN0b3JlU29ydGluZ1BhcmFtcyh0aGlzLl9wZXJzaXN0YW5jZS5nZXREYXRhRnJvbVNjb3BlKCdzb3J0aW5nJykpO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgZnJvbSBxdWVyeVBhcmFtcyBhbmQgb3ZlcnJpZGUgaWYgcGVyc2lzdGFuY2UgYWxyZWFkeSBoYWQgdmFsdWVzIGZvciB0aG9zZSBwYXJhbXNcbiAgICBpZiAodGhpcy5fcXVlcnlQYXJhbXNFbmFibGVkKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBFeHRlcm5hbFF1ZXJ5UGFnaW5hdGlvbik7XG4gICAgICB0aGlzLl9yZXN0b3JlU29ydGluZ1BhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBFeHRlcm5hbFF1ZXJ5U29ydGluZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGluaXRpYWwgcGFnaW5hdGlvbiBwYXJhbXNcbiAgICAvLyBUaGUgc2FtZSBpbml0aWFsLCBidXQgZm9yIHNvcnRpbmcgcGxhY2VkIGluIGxpc3QtY29udHJvbGxlciBcInRyYW5mb3JtVGVtcGxhdGVzVG9Db2x1bW5zXCIgbWV0aG9kXG4gICAgaWYgKHRoaXMuX3BhZ2luYXRvci5lbmFibGVkICYmICF0aGlzLl9wYWdpbmF0b3IuaW5maW5pdHlTY3JvbGxFbmFibGVkKSB7XG4gICAgICBpZiAodGhpcy5fbGltaXQpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9yLnNldExpbWl0KHRoaXMuX2xpbWl0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3BhZ2UpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9yLmdvVG9QYWdlKHRoaXMuX3BhZ2UpO1xuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHBhZ2luYXRpb24gaW4gc3RvcmVzXG4gICAgdGhpcy5fdXBkYXRlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wYWdpbmF0b3IucXVlcnlQYWdlU3RyYXRlZ3kpO1xuXG4gICAgdGhpcy5fbGlzdGVuUGFnaW5hdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuX2xpc3RlblNvcnRpbmdDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTb3J0aW5nUGFyYW1zKCkge1xuICAgIHRoaXMuX3VwZGF0ZVNvcnRpbmdQYXJhbXMobnVsbCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVQYWdpbmF0aW9uUGFyYW1zKHZhbHVlczogRXh0ZXJuYWxRdWVyeVBhZ2luYXRpb24pIHtcbiAgICBpZiAodmFsdWVzPy5wYWdlKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5wYWdlID0gK3ZhbHVlcy5wYWdlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXM/LmxpbWl0KSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5saW1pdCA9ICt2YWx1ZXMubGltaXQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZVNvcnRpbmdQYXJhbXModmFsdWVzOiBFeHRlcm5hbFF1ZXJ5U29ydGluZykge1xuICAgIGlmICh2YWx1ZXM/LnNvcnROYW1lKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0TmFtZSA9IHZhbHVlcy5zb3J0TmFtZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzPy5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0RGlyZWN0aW9uID0gdmFsdWVzLnNvcnREaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuUGFnaW5hdG9yQ2hhbmdlcygpIHtcbiAgICBtZXJnZShcbiAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlQ2hhbmdlZCQsXG4gICAgICB0aGlzLl9wYWdpbmF0b3IucGFnZXMkLFxuICAgICAgdGhpcy5fcGFnaW5hdG9yLnBhZ2VSZXNldCQsXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wYWdpbmF0b3IucXVlcnlQYWdlU3RyYXRlZ3kpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Tb3J0aW5nQ2hhbmdlcygpIHtcbiAgICBtZXJnZShcbiAgICAgIHRoaXMuX3NvcnRpbmcuaW5pdGlhbGl6ZWQkLFxuICAgICAgdGhpcy5fc29ydGluZy5zb3J0aW5nQ2hhbmdlZCQsXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ydGluZyA9IHRoaXMuX3NvcnRpbmcudmFsdWU7XG5cbiAgICAgICAgaWYgKHNvcnRpbmcpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTb3J0aW5nUGFyYW1zKHNvcnRpbmcudmFsdWUsIHNvcnRpbmcuZGlyZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsZWFyU29ydGluZ1BhcmFtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNvcnRpbmdQYXJhbXMobmFtZTogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9xdWVyeVBhcmFtc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3JlcGxhY2VTdGF0ZSh7XG4gICAgICAgIHNvcnROYW1lOiBuYW1lLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVyc2lzdGFuY2UuZW5hYmxlZCkge1xuICAgICAgaWYgKG5hbWUgJiYgZGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgnc29ydGluZycsIHsgc29ydE5hbWU6IG5hbWUsIHNvcnREaXJlY3Rpb246IGRpcmVjdGlvbiB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgnc29ydGluZycsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVBhZ2luYXRpb25QYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXJ5UGFyYW1zRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcmVwbGFjZVN0YXRlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlcnNpc3RhbmNlLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgncGFnaW5nJywgcGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXBsYWNlU3RhdGUoZGF0YSkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgT2JqZWN0LmtleXMoZGF0YSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IGRhdGFbbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBkYXRhW25hbWVdICE9PSBudWxsKVxuICAgICAgLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQobmFtZSxkYXRhW25hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIG51bGwsIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2gpO1xuICB9XG59XG4iXX0=