@hmcts/rpx-xui-common-lib 2.0.0-rc.6 → 2.1.2-angular-upgrade-11

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 (177) hide show
  1. package/bundles/hmcts-rpx-xui-common-lib.umd.js +7465 -2916
  2. package/bundles/hmcts-rpx-xui-common-lib.umd.js.map +1 -1
  3. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js +15 -1
  4. package/bundles/hmcts-rpx-xui-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/hmcts-rpx-xui-common-lib.js +59 -47
  6. package/esm2015/lib/components/accessibility/accessibility.component.js +2 -2
  7. package/esm2015/lib/components/cookie-banner/cookie-banner.component.js +129 -0
  8. package/esm2015/lib/components/due-date/due-date.component.js +6 -7
  9. package/esm2015/lib/components/find-location/find-location.component.js +240 -0
  10. package/esm2015/lib/components/find-person/find-person.component.js +259 -0
  11. package/esm2015/lib/components/generic-filter/generic-filter-utils.js +65 -0
  12. package/esm2015/lib/components/generic-filter/generic-filter.component.js +548 -52
  13. package/esm2015/lib/components/index.js +2 -2
  14. package/esm2015/lib/components/loading-spinner/loading-spinner.component.js +6 -35
  15. package/esm2015/lib/components/pagination/pagination.component.js +50 -0
  16. package/esm2015/lib/components/public_api.js +9 -7
  17. package/esm2015/lib/components/search-judicials/search-judicials.component.js +249 -0
  18. package/esm2015/lib/components/search-location/search-location.component.js +294 -0
  19. package/esm2015/lib/components/search-venue/search-venue.component.js +246 -0
  20. package/esm2015/lib/components/service-messages/service-messages.component.js +2 -2
  21. package/esm2015/lib/components/share-case/share-case.component.js +2 -2
  22. package/esm2015/lib/components/user-list/user-list.component.js +29 -3
  23. package/esm2015/lib/exui-common-lib.module.js +30 -27
  24. package/esm2015/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +81 -9
  25. package/esm2015/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +2 -2
  26. package/esm2015/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +49 -0
  27. package/esm2015/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +7 -2
  28. package/esm2015/lib/gov-ui/components/index.js +2 -2
  29. package/esm2015/lib/gov-ui/components/public_api.js +1 -20
  30. package/esm2015/lib/gov-ui/gov-ui.service.js +1 -1
  31. package/esm2015/lib/gov-ui/index.js +2 -2
  32. package/esm2015/lib/gov-ui/models/isession-storage.interface.js +24 -0
  33. package/esm2015/lib/gov-ui/public_api.js +2 -4
  34. package/esm2015/lib/gov-ui/util/session-storage/session-storage-utils.js +58 -0
  35. package/esm2015/lib/models/contact-details.model.js +8 -1
  36. package/esm2015/lib/models/due-date.model.js +8 -1
  37. package/esm2015/lib/models/filter.model.js +59 -1
  38. package/esm2015/lib/models/index.js +15 -2
  39. package/esm2015/lib/models/location.model.js +129 -0
  40. package/esm2015/lib/models/pagination.model.js +18 -0
  41. package/esm2015/lib/models/person.model.js +92 -0
  42. package/esm2015/lib/models/public_api.js +3 -9
  43. package/esm2015/lib/models/search-options.model.js +22 -0
  44. package/esm2015/lib/services/case-sharing-state/case-sharing-state.service.js +1 -1
  45. package/esm2015/lib/services/cookie/cookie.service.js +110 -0
  46. package/esm2015/lib/services/feature-toggle/feature-toggle.guard.js +8 -2
  47. package/esm2015/lib/services/feature-toggle/feature-toggle.service.js +4 -3
  48. package/esm2015/lib/services/feature-toggle/launch-darkly.service.js +28 -27
  49. package/esm2015/lib/services/filter/filter.service.js +8 -4
  50. package/esm2015/lib/services/find-person/find-person.service.js +214 -0
  51. package/esm2015/lib/services/google-analytics/google-analytics.service.js +1 -1
  52. package/esm2015/lib/services/google-tag-manager/google-tag-manager.service.js +1 -1
  53. package/esm2015/lib/services/index.js +2 -2
  54. package/esm2015/lib/services/loading/loading.service.js +1 -1
  55. package/esm2015/lib/services/locations/location.service.js +57 -0
  56. package/esm2015/lib/services/manage-session/manage-session.services.js +3 -3
  57. package/esm2015/lib/services/public-api.js +8 -4
  58. package/esm2015/lib/services/role-guard/role.guard.js +1 -1
  59. package/esm2015/lib/services/role-guard/role.service.js +1 -1
  60. package/esm2015/lib/services/session-storage/session-storage.service.js +55 -0
  61. package/esm2015/lib/services/timeout-notifications/timeout-notifications.service.js +3 -3
  62. package/esm2015/public-api.js +6 -6
  63. package/esm5/hmcts-rpx-xui-common-lib.js +59 -47
  64. package/esm5/lib/components/accessibility/accessibility.component.js +2 -2
  65. package/esm5/lib/components/cookie-banner/cookie-banner.component.js +154 -0
  66. package/esm5/lib/components/due-date/due-date.component.js +6 -7
  67. package/esm5/lib/components/find-location/find-location.component.js +293 -0
  68. package/esm5/lib/components/find-person/find-person.component.js +286 -0
  69. package/esm5/lib/components/generic-filter/generic-filter-utils.js +66 -0
  70. package/esm5/lib/components/generic-filter/generic-filter.component.js +735 -57
  71. package/esm5/lib/components/index.js +2 -2
  72. package/esm5/lib/components/loading-spinner/loading-spinner.component.js +6 -38
  73. package/esm5/lib/components/pagination/pagination.component.js +58 -0
  74. package/esm5/lib/components/public_api.js +9 -7
  75. package/esm5/lib/components/search-judicials/search-judicials.component.js +291 -0
  76. package/esm5/lib/components/search-location/search-location.component.js +330 -0
  77. package/esm5/lib/components/search-venue/search-venue.component.js +290 -0
  78. package/esm5/lib/components/service-messages/service-messages.component.js +2 -2
  79. package/esm5/lib/components/share-case/share-case.component.js +2 -2
  80. package/esm5/lib/components/user-list/user-list.component.js +36 -3
  81. package/esm5/lib/exui-common-lib.module.js +32 -28
  82. package/esm5/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.js +95 -8
  83. package/esm5/lib/gov-ui/components/gov-uk-input/gov-uk-input.component.js +2 -2
  84. package/esm5/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.js +51 -0
  85. package/esm5/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.js +7 -2
  86. package/esm5/lib/gov-ui/components/index.js +2 -2
  87. package/esm5/lib/gov-ui/components/public_api.js +1 -20
  88. package/esm5/lib/gov-ui/gov-ui.service.js +1 -1
  89. package/esm5/lib/gov-ui/index.js +2 -2
  90. package/esm5/lib/gov-ui/models/isession-storage.interface.js +24 -0
  91. package/esm5/lib/gov-ui/public_api.js +2 -4
  92. package/esm5/lib/gov-ui/util/session-storage/session-storage-utils.js +58 -0
  93. package/esm5/lib/models/contact-details.model.js +8 -1
  94. package/esm5/lib/models/due-date.model.js +8 -1
  95. package/esm5/lib/models/filter.model.js +59 -1
  96. package/esm5/lib/models/index.js +15 -2
  97. package/esm5/lib/models/location.model.js +129 -0
  98. package/esm5/lib/models/pagination.model.js +18 -0
  99. package/esm5/lib/models/person.model.js +92 -0
  100. package/esm5/lib/models/public_api.js +3 -9
  101. package/esm5/lib/models/search-options.model.js +22 -0
  102. package/esm5/lib/services/case-sharing-state/case-sharing-state.service.js +1 -1
  103. package/esm5/lib/services/cookie/cookie.service.js +136 -0
  104. package/esm5/lib/services/feature-toggle/feature-toggle.guard.js +8 -2
  105. package/esm5/lib/services/feature-toggle/feature-toggle.service.js +5 -3
  106. package/esm5/lib/services/feature-toggle/launch-darkly.service.js +29 -25
  107. package/esm5/lib/services/filter/filter.service.js +8 -4
  108. package/esm5/lib/services/find-person/find-person.service.js +238 -0
  109. package/esm5/lib/services/google-analytics/google-analytics.service.js +1 -1
  110. package/esm5/lib/services/google-tag-manager/google-tag-manager.service.js +1 -1
  111. package/esm5/lib/services/index.js +2 -2
  112. package/esm5/lib/services/loading/loading.service.js +1 -1
  113. package/esm5/lib/services/locations/location.service.js +86 -0
  114. package/esm5/lib/services/manage-session/manage-session.services.js +3 -3
  115. package/esm5/lib/services/public-api.js +8 -4
  116. package/esm5/lib/services/role-guard/role.guard.js +1 -1
  117. package/esm5/lib/services/role-guard/role.service.js +1 -1
  118. package/esm5/lib/services/session-storage/session-storage.service.js +96 -0
  119. package/esm5/lib/services/timeout-notifications/timeout-notifications.service.js +3 -3
  120. package/esm5/public-api.js +6 -6
  121. package/fesm2015/hmcts-rpx-xui-common-lib.js +4567 -751
  122. package/fesm2015/hmcts-rpx-xui-common-lib.js.map +1 -1
  123. package/fesm5/hmcts-rpx-xui-common-lib.js +6324 -1958
  124. package/fesm5/hmcts-rpx-xui-common-lib.js.map +1 -1
  125. package/hmcts-rpx-xui-common-lib.d.ts +57 -45
  126. package/hmcts-rpx-xui-common-lib.metadata.json +1 -1
  127. package/lib/components/cookie-banner/cookie-banner.component.d.ts +20 -0
  128. package/lib/components/find-location/find-location.component.d.ts +32 -0
  129. package/lib/components/find-person/find-person.component.d.ts +40 -0
  130. package/lib/components/generic-filter/generic-filter-utils.d.ts +8 -0
  131. package/lib/components/generic-filter/generic-filter.component.d.ts +34 -10
  132. package/lib/components/hmcts-session-dialog/hmcts-session-dialog.component.d.ts +1 -1
  133. package/lib/components/invite-user-form/invite-user-form.component.d.ts +1 -1
  134. package/lib/components/loading-spinner/loading-spinner.component.d.ts +1 -7
  135. package/lib/components/pagination/pagination.component.d.ts +10 -0
  136. package/lib/components/public_api.d.ts +8 -6
  137. package/lib/components/search-judicials/search-judicials.component.d.ts +37 -0
  138. package/lib/components/search-location/search-location.component.d.ts +41 -0
  139. package/lib/components/search-venue/search-venue.component.d.ts +37 -0
  140. package/lib/components/user-list/user-list.component.d.ts +9 -2
  141. package/lib/exui-common-lib.module.d.ts +10 -11
  142. package/lib/gov-ui/components/gov-uk-date/gov-uk-date.component.d.ts +8 -0
  143. package/lib/gov-ui/components/hmcts-pagination/hmcts-pagination.component.d.ts +10 -0
  144. package/lib/gov-ui/components/hmcts-sub-navigation/hmcts-sub-navigation.component.d.ts +2 -0
  145. package/lib/gov-ui/components/public_api.d.ts +0 -19
  146. package/lib/gov-ui/models/isession-storage.interface.d.ts +4 -0
  147. package/lib/gov-ui/public_api.d.ts +0 -2
  148. package/lib/gov-ui/util/session-storage/session-storage-utils.d.ts +6 -0
  149. package/lib/models/contact-details.model.d.ts +5 -1
  150. package/lib/models/due-date.model.d.ts +5 -0
  151. package/lib/models/filter.model.d.ts +33 -2
  152. package/lib/models/index.d.ts +13 -0
  153. package/lib/models/location.model.d.ts +60 -0
  154. package/lib/models/pagination.model.d.ts +5 -0
  155. package/lib/models/person.model.d.ts +43 -0
  156. package/lib/models/public_api.d.ts +1 -7
  157. package/lib/models/search-options.model.d.ts +8 -0
  158. package/lib/services/cookie/cookie.service.d.ts +9 -0
  159. package/lib/services/feature-toggle/feature-toggle.service.d.ts +1 -1
  160. package/lib/services/feature-toggle/launch-darkly.service.d.ts +4 -6
  161. package/lib/services/filter/filter.service.d.ts +4 -3
  162. package/lib/services/find-person/find-person.service.d.ts +17 -0
  163. package/lib/services/locations/location.service.d.ts +23 -0
  164. package/lib/services/public-api.d.ts +6 -2
  165. package/lib/services/session-storage/session-storage.service.d.ts +20 -0
  166. package/lib/window.d.ts +1 -1
  167. package/package.json +5 -3
  168. package/public-api.d.ts +2 -2
  169. package/esm2015/lib/gov-ui/directives/index.js +0 -7
  170. package/esm2015/lib/gov-ui/directives/public_api.js +0 -7
  171. package/esm2015/lib/models/badge-colour.enum.js +0 -14
  172. package/esm5/lib/gov-ui/directives/index.js +0 -7
  173. package/esm5/lib/gov-ui/directives/public_api.js +0 -7
  174. package/esm5/lib/models/badge-colour.enum.js +0 -14
  175. package/lib/gov-ui/directives/index.d.ts +0 -1
  176. package/lib/gov-ui/directives/public_api.d.ts +0 -1
  177. package/lib/models/badge-colour.enum.d.ts +0 -6
@@ -3,13 +3,83 @@
3
3
  * Generated from: lib/components/generic-filter/generic-filter.component.ts
4
4
  * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
5
  */
6
- import { Component, Input, ViewEncapsulation } from '@angular/core';
7
- import { FilterService } from '../../services/filter/filter.service';
6
+ import * as tslib_1 from "tslib";
7
+ import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
8
+ import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
9
+ import { FilterService } from './../../services/filter/filter.service';
10
+ import { getValues, maxSelectedValidator, minSelectedValidator } from './generic-filter-utils';
8
11
  var GenericFilterComponent = /** @class */ (function () {
9
- function GenericFilterComponent(filterService) {
12
+ function GenericFilterComponent(filterService, fb) {
10
13
  this.filterService = filterService;
11
- this.selected = [];
14
+ this.fb = fb;
15
+ this.submitted = false;
12
16
  }
17
+ Object.defineProperty(GenericFilterComponent.prototype, "config", {
18
+ get: /**
19
+ * @return {?}
20
+ */
21
+ function () {
22
+ return this._config;
23
+ },
24
+ set: /**
25
+ * @param {?} value
26
+ * @return {?}
27
+ */
28
+ function (value) {
29
+ this._config = tslib_1.__assign({}, value, { fields: value.fields.map((/**
30
+ * @param {?} field
31
+ * @return {?}
32
+ */
33
+ function (field) { return (tslib_1.__assign({}, field, { displayMinSelectedError: false, displayMaxSelectedError: false })); })) });
34
+ this._config = value;
35
+ },
36
+ enumerable: true,
37
+ configurable: true
38
+ });
39
+ Object.defineProperty(GenericFilterComponent.prototype, "settings", {
40
+ get: /**
41
+ * @return {?}
42
+ */
43
+ function () {
44
+ return this._settings;
45
+ },
46
+ set: /**
47
+ * @param {?} value
48
+ * @return {?}
49
+ */
50
+ function (value) {
51
+ if (!value) {
52
+ this.getSettings();
53
+ }
54
+ if (value && value.fields) {
55
+ this.mergeDefaultFields(value);
56
+ }
57
+ this._settings = value;
58
+ },
59
+ enumerable: true,
60
+ configurable: true
61
+ });
62
+ /**
63
+ * @private
64
+ * @param {?} field
65
+ * @return {?}
66
+ */
67
+ GenericFilterComponent.addFormValidators = /**
68
+ * @private
69
+ * @param {?} field
70
+ * @return {?}
71
+ */
72
+ function (field) {
73
+ /** @type {?} */
74
+ var validators = [];
75
+ if (field && field.minSelected) {
76
+ validators.push(minSelectedValidator(field.minSelected));
77
+ }
78
+ if (field && field.maxSelected) {
79
+ validators.push(maxSelectedValidator(field.maxSelected));
80
+ }
81
+ return validators;
82
+ };
13
83
  /**
14
84
  * @return {?}
15
85
  */
@@ -17,21 +87,193 @@ var GenericFilterComponent = /** @class */ (function () {
17
87
  * @return {?}
18
88
  */
19
89
  function () {
90
+ var _this = this;
20
91
  if (!this.settings) {
21
92
  this.getSettings();
22
93
  }
23
- if (this.settings && this.settings.fields) {
24
- this.selected = this.settings.fields;
94
+ this.mergeDefaultFields(this.settings);
95
+ this.buildForm(this.config, this.settings);
96
+ this.formSub = this.form.valueChanges.subscribe((/**
97
+ * @return {?}
98
+ */
99
+ function () { return _this.submitted = false; }));
100
+ };
101
+ /**
102
+ * @return {?}
103
+ */
104
+ GenericFilterComponent.prototype.ngOnDestroy = /**
105
+ * @return {?}
106
+ */
107
+ function () {
108
+ if (this.formSub) {
109
+ this.formSub.unsubscribe();
110
+ }
111
+ };
112
+ /**
113
+ * @param {?} field
114
+ * @param {?} form
115
+ * @return {?}
116
+ */
117
+ GenericFilterComponent.prototype.hidden = /**
118
+ * @param {?} field
119
+ * @param {?} form
120
+ * @return {?}
121
+ */
122
+ function (field, form) {
123
+ if (!field.showCondition) {
124
+ return false;
125
+ }
126
+ if (typeof field.showCondition === 'string') {
127
+ /** @type {?} */
128
+ var control = (/** @type {?} */ (form.get(field.name)));
129
+ var _a = tslib_1.__read(field.showCondition.split('='), 2), name_1 = _a[0], value = _a[1];
130
+ if (form.value && form.value[name_1] === value) {
131
+ if (field.type === 'find-person') {
132
+ control.get('email').setValidators(Validators.required);
133
+ control.get('email').updateValueAndValidity();
134
+ }
135
+ else {
136
+ control.setValidators(Validators.required);
137
+ control.updateValueAndValidity();
138
+ }
139
+ return false;
140
+ }
141
+ else {
142
+ if (field.type === 'find-person') {
143
+ control.get('email').clearValidators();
144
+ control.get('email').updateValueAndValidity();
145
+ }
146
+ else {
147
+ control.clearValidators();
148
+ control.updateValueAndValidity();
149
+ }
150
+ }
151
+ }
152
+ return true;
153
+ };
154
+ /**
155
+ * @param {?} field
156
+ * @param {?} form
157
+ * @return {?}
158
+ */
159
+ GenericFilterComponent.prototype.disabled = /**
160
+ * @param {?} field
161
+ * @param {?} form
162
+ * @return {?}
163
+ */
164
+ function (field, form) {
165
+ if (!field.enableCondition) {
166
+ return null;
167
+ }
168
+ if (typeof field.enableCondition === 'string') {
169
+ /** @type {?} */
170
+ var control = (/** @type {?} */ (form.get(field.name)));
171
+ var _a = tslib_1.__read(field.enableCondition.split('='), 2), name_2 = _a[0], value = _a[1];
172
+ if (form.value && form.value[name_2] === value) {
173
+ if (field.type === 'find-person') {
174
+ control.get('email').setValidators(Validators.required);
175
+ control.get('email').updateValueAndValidity();
176
+ }
177
+ else {
178
+ control.setValidators(Validators.required);
179
+ control.updateValueAndValidity();
180
+ }
181
+ return null;
182
+ }
183
+ else {
184
+ if (field.type === 'find-person') {
185
+ control.get('email').clearValidators();
186
+ control.get('email').updateValueAndValidity();
187
+ }
188
+ else {
189
+ control.clearValidators();
190
+ control.updateValueAndValidity();
191
+ }
192
+ }
193
+ }
194
+ // find-location is special case where need to reset textbox (by existing disabling functionality)
195
+ // field.disable referred to component itself
196
+ if (field.type === 'find-location') {
197
+ return true;
25
198
  }
199
+ // Note: field.disable decides whether to actually disable or not
200
+ return field.disable ? field.disable : null;
26
201
  };
27
202
  /**
203
+ * @param {?} form
28
204
  * @return {?}
29
205
  */
30
206
  GenericFilterComponent.prototype.applyFilter = /**
207
+ * @param {?} form
31
208
  * @return {?}
32
209
  */
33
- function () {
34
- this.filterService.persist(this.settings, this.config.persistence);
210
+ function (form) {
211
+ this.submitted = true;
212
+ form.markAsTouched();
213
+ if (form.valid) {
214
+ this._settings = {
215
+ id: this.config.id,
216
+ fields: this.getSelectedValues(form.value, this.config)
217
+ };
218
+ this.filterService.givenErrors.next(null);
219
+ /** @type {?} */
220
+ var settings = tslib_1.__assign({}, this.settings, { reset: false });
221
+ this.filterService.persist(settings, this.config.persistence);
222
+ }
223
+ else {
224
+ this.emitFormErrors(form);
225
+ }
226
+ };
227
+ // when domain changes ensure that person field is reset
228
+ // when domain changes ensure that person field is reset
229
+ /**
230
+ * @param {?} field
231
+ * @param {?} form
232
+ * @return {?}
233
+ */
234
+ GenericFilterComponent.prototype.fieldChanged =
235
+ // when domain changes ensure that person field is reset
236
+ /**
237
+ * @param {?} field
238
+ * @param {?} form
239
+ * @return {?}
240
+ */
241
+ function (field, form) {
242
+ var e_1, _a;
243
+ // TODO - Do similar with jurisdiction/service for caseworkers by services
244
+ if (field.changeResetFields && field.changeResetFields.length) {
245
+ try {
246
+ for (var _b = tslib_1.__values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
247
+ var resetField = _c.value;
248
+ this.resetField(resetField, form);
249
+ }
250
+ }
251
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
252
+ finally {
253
+ try {
254
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
255
+ }
256
+ finally { if (e_1) throw e_1.error; }
257
+ }
258
+ }
259
+ };
260
+ // when user enters input change radio button
261
+ // when user enters input change radio button
262
+ /**
263
+ * @param {?} field
264
+ * @return {?}
265
+ */
266
+ GenericFilterComponent.prototype.inputChanged =
267
+ // when user enters input change radio button
268
+ /**
269
+ * @param {?} field
270
+ * @return {?}
271
+ */
272
+ function (field) {
273
+ if (field.radioSelectionChange && typeof field.radioSelectionChange === 'string') {
274
+ var _a = tslib_1.__read(field.enableCondition.split('='), 2), name_3 = _a[0], value = _a[1];
275
+ this.form.get(name_3).patchValue(value);
276
+ }
35
277
  };
36
278
  /**
37
279
  * @return {?}
@@ -40,100 +282,524 @@ var GenericFilterComponent = /** @class */ (function () {
40
282
  * @return {?}
41
283
  */
42
284
  function () {
43
- this.getSettings();
285
+ this.buildForm(this.config, this.settings, true);
286
+ if (this.config && this.config.cancelSetting) {
287
+ this._settings.fields = JSON.parse(JSON.stringify(this.config.cancelSetting.fields));
288
+ }
289
+ /** @type {?} */
290
+ var settings = tslib_1.__assign({}, this.settings, { reset: true });
291
+ this.filterService.persist(settings, this.config.persistence);
292
+ this.filterService.givenErrors.next(null);
293
+ this.submitted = false;
44
294
  };
45
295
  /**
46
- * @param {?} id
47
- * @param {?} key
296
+ * @param {?} values
297
+ * @param {?} field
48
298
  * @return {?}
49
299
  */
50
- GenericFilterComponent.prototype.isSelected = /**
51
- * @param {?} id
52
- * @param {?} key
300
+ GenericFilterComponent.prototype.updatePersonControls = /**
301
+ * @param {?} values
302
+ * @param {?} field
53
303
  * @return {?}
54
304
  */
55
- function (id, key) {
56
- if (this.settings) {
57
- return this.settings.fields.some((/**
58
- * @param {?} x
305
+ function (values, field) {
306
+ var e_2, _a;
307
+ /** @type {?} */
308
+ var keys;
309
+ if (!values) {
310
+ keys = Object.keys(this.form.get(field.name).value);
311
+ }
312
+ else {
313
+ keys = Object.keys(values);
314
+ }
315
+ try {
316
+ for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
317
+ var key = keys_1_1.value;
318
+ if (this.form.get(field.name) && this.form.get(field.name).get(key)) {
319
+ /** @type {?} */
320
+ var value = values && values[key] ? values[key] : null;
321
+ this.form.get(field.name).get(key).patchValue(value);
322
+ }
323
+ }
324
+ }
325
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
326
+ finally {
327
+ try {
328
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
329
+ }
330
+ finally { if (e_2) throw e_2.error; }
331
+ }
332
+ };
333
+ /**
334
+ * @param {?} event
335
+ * @param {?} form
336
+ * @param {?} item
337
+ * @param {?} field
338
+ * @return {?}
339
+ */
340
+ GenericFilterComponent.prototype.toggleSelectAll = /**
341
+ * @param {?} event
342
+ * @param {?} form
343
+ * @param {?} item
344
+ * @param {?} field
345
+ * @return {?}
346
+ */
347
+ function (event, form, item, field) {
348
+ var e_3, _a;
349
+ /** @type {?} */
350
+ var isChecked = event.target.checked;
351
+ /** @type {?} */
352
+ var formArray = (/** @type {?} */ (form.get(field.name)));
353
+ if (!item.selectAll) {
354
+ /** @type {?} */
355
+ var allChecked = formArray.controls.every((/**
356
+ * @param {?} control
357
+ * @return {?}
358
+ */
359
+ function (control) { return control.value; }));
360
+ /** @type {?} */
361
+ var index_1 = null;
362
+ /** @type {?} */
363
+ var hasSelectAllOption = field.options.find((/**
364
+ * @param {?} option
365
+ * @param {?} i
366
+ * @return {?}
367
+ */
368
+ function (option, i) {
369
+ if (option.hasOwnProperty('selectAll')) {
370
+ index_1 = i;
371
+ return true;
372
+ }
373
+ return false;
374
+ }));
375
+ // tslint:disable-next-line:variable-name
376
+ /** @type {?} */
377
+ var isAllCheckedExcludingTheSelectAllOption = formArray.controls.filter((/**
378
+ * @param {?} _control
379
+ * @param {?} i
59
380
  * @return {?}
60
381
  */
61
- function (x) { return x.name === id; })) && this.settings.fields.some((/**
62
- * @param {?} x
382
+ function (_control, i) { return i !== index_1; }))
383
+ .every((/**
384
+ * @param {?} control
63
385
  * @return {?}
64
386
  */
65
- function (x) { return x.value.some((/**
66
- * @param {?} v
387
+ function (control) { return control.value; }));
388
+ if (!allChecked && hasSelectAllOption && !isChecked) {
389
+ formArray.controls.forEach((/**
390
+ * @param {?} control
391
+ * @param {?} i
392
+ * @return {?}
393
+ */
394
+ function (control, i) {
395
+ if (index_1 === i) {
396
+ control.patchValue(false);
397
+ return;
398
+ }
399
+ }));
400
+ }
401
+ else if (hasSelectAllOption && !allChecked && isChecked && isAllCheckedExcludingTheSelectAllOption) {
402
+ formArray.controls[index_1].patchValue(true);
403
+ }
404
+ }
405
+ else {
406
+ formArray.controls.forEach((/**
407
+ * @param {?} control
67
408
  * @return {?}
68
409
  */
69
- function (v) { return v === key; })); }));
410
+ function (control) {
411
+ if (isChecked) {
412
+ control.patchValue(true);
413
+ }
414
+ else {
415
+ control.patchValue(false);
416
+ }
417
+ }));
418
+ }
419
+ if (field.changeResetFields && field.changeResetFields.length) {
420
+ try {
421
+ for (var _b = tslib_1.__values(field.changeResetFields), _c = _b.next(); !_c.done; _c = _b.next()) {
422
+ var resetField = _c.value;
423
+ this.resetField(resetField, form);
424
+ }
425
+ }
426
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
427
+ finally {
428
+ try {
429
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
430
+ }
431
+ finally { if (e_3) throw e_3.error; }
432
+ }
70
433
  }
71
- return false;
72
434
  };
73
435
  /**
74
- * @param {?} item
436
+ * @private
437
+ * @param {?} resetField
438
+ * @param {?} form
75
439
  * @return {?}
76
440
  */
77
- GenericFilterComponent.prototype.onSelectionChange = /**
78
- * @param {?} item
441
+ GenericFilterComponent.prototype.resetField = /**
442
+ * @private
443
+ * @param {?} resetField
444
+ * @param {?} form
79
445
  * @return {?}
80
446
  */
81
- function (item) {
447
+ function (resetField, form) {
448
+ var e_4, _a;
82
449
  /** @type {?} */
83
- var fieldName = item.target.name.replace(item.target.type + "_", '');
450
+ var control = form.get(resetField);
84
451
  /** @type {?} */
85
- var match = this.selected.find((/**
86
- * @param {?} x
452
+ var defaultValue = this.config.cancelSetting.fields.find((/**
453
+ * @param {?} f
87
454
  * @return {?}
88
455
  */
89
- function (x) { return x.name === fieldName; }));
90
- if (match) {
91
- if (item.target.type === 'checkbox') {
92
- if (item.target.checked) {
93
- match.value.push(item.target.value);
456
+ function (f) { return f.name === resetField; }));
457
+ if (control instanceof FormArray) {
458
+ for (var i = 0; i < control.length; i++) {
459
+ control.removeAt(i);
460
+ }
461
+ }
462
+ else if (control instanceof FormGroup) {
463
+ /** @type {?} */
464
+ var keys = Object.keys(control.value);
465
+ try {
466
+ for (var keys_2 = tslib_1.__values(keys), keys_2_1 = keys_2.next(); !keys_2_1.done; keys_2_1 = keys_2.next()) {
467
+ var key = keys_2_1.value;
468
+ this.resetField(key, control);
469
+ }
470
+ }
471
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
472
+ finally {
473
+ try {
474
+ if (keys_2_1 && !keys_2_1.done && (_a = keys_2.return)) _a.call(keys_2);
475
+ }
476
+ finally { if (e_4) throw e_4.error; }
477
+ }
478
+ }
479
+ else if (control instanceof FormControl) {
480
+ /** @type {?} */
481
+ var value = defaultValue && defaultValue.value && defaultValue.value.length ? defaultValue.value[0] : null;
482
+ control.setValue(value);
483
+ }
484
+ };
485
+ /**
486
+ * @private
487
+ * @param {?} filter
488
+ * @return {?}
489
+ */
490
+ GenericFilterComponent.prototype.mergeDefaultFields = /**
491
+ * @private
492
+ * @param {?} filter
493
+ * @return {?}
494
+ */
495
+ function (filter) {
496
+ if (filter) {
497
+ filter.fields = this.filterService.get(this.config.id) ? this.filterService.get(this.config.id).fields : filter.fields;
498
+ }
499
+ else if (this.config && this.config.cancelSetting) {
500
+ this._settings = {
501
+ id: this.config.id,
502
+ fields: JSON.parse(JSON.stringify(this.config.cancelSetting.fields))
503
+ };
504
+ }
505
+ };
506
+ /**
507
+ * @private
508
+ * @return {?}
509
+ */
510
+ GenericFilterComponent.prototype.getSettings = /**
511
+ * @private
512
+ * @return {?}
513
+ */
514
+ function () {
515
+ this._settings = this.filterService.get(this.config.id);
516
+ };
517
+ /**
518
+ * @private
519
+ * @param {?} config
520
+ * @param {?} settings
521
+ * @param {?=} reset
522
+ * @return {?}
523
+ */
524
+ GenericFilterComponent.prototype.buildForm = /**
525
+ * @private
526
+ * @param {?} config
527
+ * @param {?} settings
528
+ * @param {?=} reset
529
+ * @return {?}
530
+ */
531
+ function (config, settings, reset) {
532
+ var e_5, _a;
533
+ /** @type {?} */
534
+ var findPersonControl = this.form ? this.form.get('findPersonControl') : null;
535
+ this.form = this.fb.group({});
536
+ if (findPersonControl) {
537
+ // in order to maintain find person component, control needs to be kept
538
+ this.form.addControl('findPersonControl', findPersonControl);
539
+ }
540
+ var _loop_1 = function (field) {
541
+ if (field.type === 'checkbox' || field.type === 'checkbox-large') {
542
+ /** @type {?} */
543
+ var formArray = this_1.buildCheckBoxFormArray(field, settings);
544
+ this_1.form.addControl(field.name, formArray);
545
+ }
546
+ else if (field.type === 'find-location') {
547
+ /** @type {?} */
548
+ var formArray = this_1.buildFindLocationFormArray(field, settings);
549
+ this_1.form.addControl(field.name, formArray);
550
+ }
551
+ else {
552
+ /** @type {?} */
553
+ var validators = [];
554
+ if (field.minSelected && field.minSelected > 0) {
555
+ validators.push(Validators.required);
556
+ }
557
+ /** @type {?} */
558
+ var defaultValue = null;
559
+ if (reset && config.cancelSetting) {
560
+ /** @type {?} */
561
+ var cancelField = config.cancelSetting.fields.find((/**
562
+ * @param {?} f
563
+ * @return {?}
564
+ */
565
+ function (f) { return f.name === field.name; }));
566
+ defaultValue = cancelField && cancelField.value ? cancelField.value[0] : '';
567
+ }
568
+ else if (settings && settings.fields) {
569
+ /** @type {?} */
570
+ var lastSavedValue = settings.fields.find((/**
571
+ * @param {?} f
572
+ * @return {?}
573
+ */
574
+ function (f) { return f.name === field.name; }));
575
+ defaultValue = lastSavedValue && lastSavedValue ? lastSavedValue.value[0] : '';
576
+ }
577
+ // if field is find-person build a form group;
578
+ if (field.type === 'find-person') {
579
+ /** @type {?} */
580
+ var formGroup = new FormGroup({
581
+ domain: new FormControl(''),
582
+ email: new FormControl(defaultValue && defaultValue.hasOwnProperty('email') ? defaultValue.email : '', validators),
583
+ id: new FormControl(''),
584
+ name: new FormControl(''),
585
+ knownAs: new FormControl(''),
586
+ });
587
+ this_1.form.addControl(field.name, formGroup);
94
588
  }
95
589
  else {
96
590
  /** @type {?} */
97
- var index = match.value.indexOf(item.target.value);
98
- if (index !== -1) {
99
- match.value.splice(index, 1);
100
- }
591
+ var control = new FormControl(defaultValue, validators);
592
+ this_1.form.addControl(field.name, control);
593
+ }
594
+ // if field updates find person component set the initial domain
595
+ if (field.findPersonField) {
596
+ this_1.fieldChanged(field, this_1.form);
101
597
  }
102
598
  }
103
- else {
104
- match.value = [item.target.value];
599
+ };
600
+ var this_1 = this;
601
+ try {
602
+ for (var _b = tslib_1.__values(config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
603
+ var field = _c.value;
604
+ _loop_1(field);
105
605
  }
106
606
  }
107
- else {
108
- this.selected.push({ name: fieldName, value: [item.target.value] });
607
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
608
+ finally {
609
+ try {
610
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
611
+ }
612
+ finally { if (e_5) throw e_5.error; }
109
613
  }
110
- this.settings = {
111
- id: this.config.id,
112
- fields: this.selected
614
+ };
615
+ /**
616
+ * @private
617
+ * @param {?} field
618
+ * @param {?} settings
619
+ * @return {?}
620
+ */
621
+ GenericFilterComponent.prototype.buildCheckBoxFormArray = /**
622
+ * @private
623
+ * @param {?} field
624
+ * @param {?} settings
625
+ * @return {?}
626
+ */
627
+ function (field, settings) {
628
+ var e_6, _a;
629
+ /** @type {?} */
630
+ var validators = GenericFilterComponent.addFormValidators(field);
631
+ /** @type {?} */
632
+ var formArray = this.fb.array([], validators);
633
+ /** @type {?} */
634
+ var defaultValues;
635
+ if (settings && settings.fields) {
636
+ defaultValues = settings.fields.find((/**
637
+ * @param {?} f
638
+ * @return {?}
639
+ */
640
+ function (f) { return f.name === field.name; }));
641
+ }
642
+ var _loop_2 = function (option) {
643
+ /** @type {?} */
644
+ var checked = false;
645
+ if (defaultValues && Array.isArray(defaultValues.value)) {
646
+ checked = !!defaultValues.value.find((/**
647
+ * @param {?} value
648
+ * @return {?}
649
+ */
650
+ function (value) { return value === option.key; }));
651
+ }
652
+ formArray.push(new FormControl(checked));
113
653
  };
654
+ try {
655
+ for (var _b = tslib_1.__values(field.options), _c = _b.next(); !_c.done; _c = _b.next()) {
656
+ var option = _c.value;
657
+ _loop_2(option);
658
+ }
659
+ }
660
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
661
+ finally {
662
+ try {
663
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
664
+ }
665
+ finally { if (e_6) throw e_6.error; }
666
+ }
667
+ return formArray;
114
668
  };
115
669
  /**
116
670
  * @private
671
+ * @param {?} field
672
+ * @param {?} settings
117
673
  * @return {?}
118
674
  */
119
- GenericFilterComponent.prototype.getSettings = /**
675
+ GenericFilterComponent.prototype.buildFindLocationFormArray = /**
120
676
  * @private
677
+ * @param {?} field
678
+ * @param {?} settings
121
679
  * @return {?}
122
680
  */
123
- function () {
124
- this.settings = this.filterService.get(this.config.id);
681
+ function (field, settings) {
682
+ var e_7, _a;
683
+ /** @type {?} */
684
+ var validators = GenericFilterComponent.addFormValidators(field);
685
+ /** @type {?} */
686
+ var formArray = this.fb.array([], validators);
687
+ /** @type {?} */
688
+ var defaultValues;
689
+ if (settings && settings.fields) {
690
+ defaultValues = settings.fields.find((/**
691
+ * @param {?} f
692
+ * @return {?}
693
+ */
694
+ function (f) { return f.name === field.name; }));
695
+ if (defaultValues && defaultValues.value && defaultValues.value.length > 0) {
696
+ try {
697
+ for (var _b = tslib_1.__values(defaultValues.value), _c = _b.next(); !_c.done; _c = _b.next()) {
698
+ var defaultValue = _c.value;
699
+ formArray.push(new FormControl(defaultValue));
700
+ }
701
+ }
702
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
703
+ finally {
704
+ try {
705
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
706
+ }
707
+ finally { if (e_7) throw e_7.error; }
708
+ }
709
+ }
710
+ }
711
+ return formArray;
712
+ };
713
+ /**
714
+ * @private
715
+ * @param {?} formValues
716
+ * @param {?} config
717
+ * @return {?}
718
+ */
719
+ GenericFilterComponent.prototype.getSelectedValues = /**
720
+ * @private
721
+ * @param {?} formValues
722
+ * @param {?} config
723
+ * @return {?}
724
+ */
725
+ function (formValues, config) {
726
+ return Object.keys(formValues).map((/**
727
+ * @param {?} name
728
+ * @return {?}
729
+ */
730
+ function (name) {
731
+ /** @type {?} */
732
+ var values = formValues[name];
733
+ if (Array.isArray(values)) {
734
+ /** @type {?} */
735
+ var field = config.fields.find((/**
736
+ * @param {?} f
737
+ * @return {?}
738
+ */
739
+ function (f) { return f.name === name; }));
740
+ if (field.type === 'find-location') {
741
+ return { value: values, name: name };
742
+ }
743
+ else {
744
+ return { value: getValues(field.options, values), name: name };
745
+ }
746
+ }
747
+ else {
748
+ return { value: [values], name: name };
749
+ }
750
+ }));
751
+ };
752
+ /**
753
+ * @private
754
+ * @param {?} form
755
+ * @return {?}
756
+ */
757
+ GenericFilterComponent.prototype.emitFormErrors = /**
758
+ * @private
759
+ * @param {?} form
760
+ * @return {?}
761
+ */
762
+ function (form) {
763
+ var e_8, _a;
764
+ /** @type {?} */
765
+ var errors = [];
766
+ try {
767
+ for (var _b = tslib_1.__values(this.config.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
768
+ var field = _c.value;
769
+ /** @type {?} */
770
+ var formGroup = form.get(field.name);
771
+ if (formGroup && formGroup.errors && formGroup.errors.minLength) {
772
+ errors.push({ name: field.name, error: field.minSelectedError });
773
+ }
774
+ if (formGroup && formGroup.errors && formGroup.errors.maxLength) {
775
+ errors.push({ name: field.name, error: field.minSelectedError });
776
+ }
777
+ }
778
+ }
779
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
780
+ finally {
781
+ try {
782
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
783
+ }
784
+ finally { if (e_8) throw e_8.error; }
785
+ }
786
+ if (errors.length) {
787
+ this.filterService.givenErrors.next(errors);
788
+ }
125
789
  };
126
790
  GenericFilterComponent.decorators = [
127
791
  { type: Component, args: [{
128
792
  selector: 'xuilib-generic-filter',
129
- template: "<div class=\"govuk-form-group\">\n <div class=\"xui-generic-filter\" *ngFor=\"let field of config.fields\">\n <ng-container *ngIf=\"field.type === 'checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\">\n <div class=\"checkbox-items\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" [name]=\"'checkbox_' + field.name\" [id]=\"'checkbox_' + item.key\" [value]=\"item.key\" [checked]=\"isSelected(field.name,item.key)\" (change)=\"onSelectionChange($event)\" class=\"govuk-checkboxes__input\" />\n <label [for]=\"'checkbox_' + item.key\" class=\"govuk-label govuk-checkboxes__label\">{{item.label}}</label>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"field.type === 'radio'\">\n <div class=\"govuk-radios\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-radios__item\">\n <input type=\"radio\" [name]=\"'radio_' + field.name\" [id]=\"'radio_' + item.key\" [value]=\"item.key\" [checked]=\"isSelected(field.name,item.key)\" (change)=\"onSelectionChange($event)\" class=\"govuk-radios__input\" />\n <label [for]=\"'radio_' + item.key\" class=\"govuk-label govuk-radios__label\">{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"field.type === 'select'\">\n <select class=\"govuk-select\" [name]=\"field.name\" [id]=\"field.name\" (change)=\"onSelectionChange($event)\">\n <ng-container *ngFor=\"let item of field.options\">\n <option class=\"govuk-radios__item\" [value]=\"item.key\" [selected]=\"isSelected(field.name,item.key)\">{{item.label}}</option>\n </ng-container>\n </select>\n </ng-container>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <hr class=\"govuk-section-break govuk-section-break--m govuk-section-break--visible\" />\n <button class=\"govuk-button govuk-!-margin-right-1\" type=\"submit\" id=\"applyFilter\" (click)=\"applyFilter()\">Apply</button>\n <button class=\"govuk-button govuk-button--secondary\" id=\"cancelFilter\" (click)=\"cancelFilter()\">Cancel</button>\n </div>\n </div>\n </div>\n</div>\n",
793
+ template: "<form [formGroup]=\"form\" (ngSubmit)=\"applyFilter(form)\">\n <div class=\"contain-classes\" *ngFor=\"let field of config.fields\">\n <hr *ngIf=\"field.lineBreakBefore\" class=\"govuk-section-break govuk-section-break--visible elevated-break\">\n <div class=\"govuk-form-group xui-generic-filter\"\n [hidden]=\"hidden(field, form)\"\n [id]=\"field.name\"\n [ngClass]=\"{'form-group-error': submitted && (form.get(field.name).errors?.minLength || form.get(field.name).errors?.maxLength)}\">\n <h3 *ngIf=\"field.title\" class=\"govuk-heading-s\">{{field.title}}</h3>\n <p class=\"govuk-body\" *ngIf=\"field.subTitle\">{{field.subTitle}}</p>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMinSelectedError && submitted && form.get(field.name).errors?.minLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.minSelectedError}}\n </span>\n <span [id]=\"field.name + '-error'\" class=\"govuk-error-message\" *ngIf=\"field.displayMaxSelectedError && submitted && form.get(field.name).errors?.maxLength\">\n <span class=\"govuk-visually-hidden\">Error:</span> {{field.maxSelectedError}}\n </span>\n <div class=\"govuk-body\" [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <select class=\"govuk-select\" (change)=\"fieldChanged(field, form)\" [attr.disabled]=\"disabled(field, form)\" [name]=\"'select_' + field.name\" [id]=\"'select_' + field.name\" [formControlName]=\"field.name\">\n <option disabled selected hidden value=\"\">{{field.disabledText}}</option>\n <option class=\"govuk-radios__item\" *ngFor=\"let item of field.options\" [value]=\"item.key\">{{item.label}}</option>\n </select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div class=\"govuk-checkboxes govuk-checkboxes--small\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox-large'\">\n <div class=\"govuk-checkboxes\" [formGroupName]=\"field.name\" [attr.field]=\"field.name\" [id]=\"'checkbox_' + field.name\">\n <div *ngFor=\"let item of field.options; let i = index\" class=\"govuk-checkboxes__item\">\n <input type=\"checkbox\" class=\"govuk-checkboxes__input\"\n [attr.disabled]=\"disabled(field, form)\"\n [formControlName]=\"i\"\n (change)=\"toggleSelectAll($event, form, item, field)\"\n [value]=\"item.key\" [id]=\"'checkbox_' + item.key\"\n [name]=\"'checkbox_' + item.key\"\n />\n <label\n [for]=\"'checkbox_' + item.key\"\n class=\"govuk-label govuk-checkboxes__label\"\n [ngClass]=\"{'govuk-!-font-weight-bold': item.selectAll}\"\n >{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radio'\">\n <div class=\"govuk-radios\">\n <div *ngFor=\"let item of field.options\" class=\"govuk-radios__item\">\n <input type=\"radio\"\n [formControlName]=\"field.name\"\n [id]=\"'radio_' + item.key\"\n [attr.disabled]=\"disabled(field, form)\"\n [checked]=\"item.key === form.get(field.name).value\"\n class=\"govuk-radios__input\"\n [value]=\"item.key\"\n (change)=\"fieldChanged(field, form)\"\n />\n <label [for]=\"'radio_' + item.key\" class=\"govuk-label govuk-radios__label\">{{item.label}}</label>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-person'\">\n <xuilib-find-person subTitle=\"\" (personSelected)=\"updatePersonControls($event, field)\"\n (personFieldChanged)=\"inputChanged(field)\"\n [submitted]=\"submitted\"\n [disabled]=\"disabled(field, form)\"\n [domain]=\"form.get(field.domainField)?.value\"\n [findPersonGroup]=\"form\"\n [selectedPerson]=\"form.get(field.name)?.value?.email\"\n [userIncluded]=\"false\"\n ></xuilib-find-person>\n </ng-container>\n <ng-container *ngSwitchCase=\"'find-location'\">\n <xuilib-find-location (locationFieldChanged)=\"inputChanged(field)\"\n [form]=\"form\"\n [fields]=\"config.fields\"\n [locationTitle]=\"field.locationTitle\"\n [enableAddLocationButton]=\"field.enableAddLocationButton\"\n [disabled]=\"disabled(field, form)\"\n [disableInputField]=\"field.disable\"\n [selectedLocations]=\"form.get(field.name)?.value\"\n [submitted]=\"submitted\"\n [services]=\"form.get(field.findLocationField)?.value\"\n [field]=\"field\"\n ></xuilib-find-location>\n </ng-container>\n </div>\n </div>\n </div>\n <hr class=\"govuk-section-break govuk-section-break--m govuk-section-break--visible\"/>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <button\n class=\"govuk-button govuk-!-margin-right-1 govuk-!-margin-bottom-0\"\n type=\"submit\"\n id=\"applyFilter\"\n [disabled]=\"config.enableDisabledButton && form.invalid\"\n >{{config.applyButtonText || 'Apply'}}</button>\n <button *ngIf=\"config.showCancelFilterButton\"\n class=\"govuk-button govuk-button--secondary govuk-!-margin-bottom-0\"\n type=\"button\"\n id=\"cancelFilter\"\n (click)=\"cancelFilter()\">{{ config.cancelButtonText || 'Cancel'}}</button>\n </div>\n </div>\n</form>\n",
794
+ changeDetection: ChangeDetectionStrategy.OnPush,
130
795
  encapsulation: ViewEncapsulation.None,
131
- styles: [".xui-generic-filter .select-all{margin-bottom:10px}.xui-generic-filter .checkbox-items{display:flex;flex-direction:column;flex-wrap:wrap;height:100%;max-height:100%;align-items:flex-start;align-content:flex-start;width:100%;max-width:100%;overflow-x:scroll}"]
796
+ styles: [".contain-classes .elevated-break{position:relative;top:-10px}.contain-classes .xui-generic-filter .select-all{margin-bottom:10px}.contain-classes .xui-generic-filter .govuk-checkboxes{display:flex;flex-wrap:wrap}.contain-classes .xui-generic-filter .govuk-checkboxes>div{flex-grow:1;flex-shrink:0}"]
132
797
  }] }
133
798
  ];
134
799
  /** @nocollapse */
135
800
  GenericFilterComponent.ctorParameters = function () { return [
136
- { type: FilterService }
801
+ { type: FilterService },
802
+ { type: FormBuilder }
137
803
  ]; };
138
804
  GenericFilterComponent.propDecorators = {
139
805
  config: [{ type: Input }],
@@ -144,18 +810,30 @@ var GenericFilterComponent = /** @class */ (function () {
144
810
  export { GenericFilterComponent };
145
811
  if (false) {
146
812
  /** @type {?} */
147
- GenericFilterComponent.prototype.config;
813
+ GenericFilterComponent.prototype.form;
814
+ /** @type {?} */
815
+ GenericFilterComponent.prototype.submitted;
148
816
  /** @type {?} */
149
- GenericFilterComponent.prototype.settings;
817
+ GenericFilterComponent.prototype.formSub;
150
818
  /**
151
819
  * @type {?}
152
820
  * @private
153
821
  */
154
- GenericFilterComponent.prototype.selected;
822
+ GenericFilterComponent.prototype._config;
823
+ /**
824
+ * @type {?}
825
+ * @private
826
+ */
827
+ GenericFilterComponent.prototype._settings;
155
828
  /**
156
829
  * @type {?}
157
830
  * @private
158
831
  */
159
832
  GenericFilterComponent.prototype.filterService;
833
+ /**
834
+ * @type {?}
835
+ * @private
836
+ */
837
+ GenericFilterComponent.prototype.fb;
160
838
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRTtJQVlFLGdDQUE2QixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUZqRCxhQUFRLEdBQXdDLEVBQUUsQ0FBQztJQUVFLENBQUM7Ozs7SUFFdkQseUNBQVE7OztJQUFmO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDdEM7SUFDSCxDQUFDOzs7O0lBRU0sNENBQVc7OztJQUFsQjtRQUNFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRSxDQUFDOzs7O0lBRU0sNkNBQVk7OztJQUFuQjtRQUNFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7Ozs7SUFFTSwyQ0FBVTs7Ozs7SUFBakIsVUFBa0IsRUFBVSxFQUFFLEdBQVc7UUFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSTs7OztZQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQWIsQ0FBYSxFQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSTs7OztZQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJOzs7O1lBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEtBQUssR0FBRyxFQUFULENBQVMsRUFBQyxFQUE1QixDQUE0QixFQUFDLENBQUM7U0FDdEg7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7O0lBRU0sa0RBQWlCOzs7O0lBQXhCLFVBQXlCLElBQVM7O1lBQzFCLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQUcsRUFBRSxFQUFFLENBQUM7O1lBQ2hFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFwQixDQUFvQixFQUFDO1FBQzNELElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNOzt3QkFDQyxLQUFLLEdBQVcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQzVELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNoQixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkM7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3RCLENBQUM7SUFDSixDQUFDOzs7OztJQUVPLDRDQUFXOzs7O0lBQW5CO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7O2dCQWpFRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsaXdFQUE0QztvQkFFNUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2lCQUN0Qzs7OztnQkFQUSxhQUFhOzs7eUJBVW5CLEtBQUs7MkJBQ0wsS0FBSzs7SUF5RFIsNkJBQUM7Q0FBQSxBQWxFRCxJQWtFQztTQTVEWSxzQkFBc0I7OztJQUVqQyx3Q0FBcUM7O0lBQ3JDLDBDQUF5Qzs7Ozs7SUFDekMsMENBQTJEOzs7OztJQUUvQywrQ0FBNkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWx0ZXJDb25maWcsIEZpbHRlclNldHRpbmcgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXIvZmlsdGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWlsaWItZ2VuZXJpYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZzogRmlsdGVyQ29uZmlnO1xuICBASW5wdXQoKSBwdWJsaWMgc2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5nO1xuICBwcml2YXRlIHNlbGVjdGVkOiB7IG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZ1tdIH1bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSkgeyB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncyAmJiB0aGlzLnNldHRpbmdzLmZpZWxkcykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2V0dGluZ3MuZmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlcigpIHtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UucGVyc2lzdCh0aGlzLnNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsRmlsdGVyKCkge1xuICAgIHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlbGVjdGVkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmZpZWxkcy5zb21lKHggPT4geC5uYW1lID09PSBpZCkgJiYgdGhpcy5zZXR0aW5ncy5maWVsZHMuc29tZSh4ID0+IHgudmFsdWUuc29tZSh2ID0+IHYgPT09IGtleSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoaXRlbTogYW55KSB7XG4gICAgY29uc3QgZmllbGROYW1lID0gaXRlbS50YXJnZXQubmFtZS5yZXBsYWNlKGAke2l0ZW0udGFyZ2V0LnR5cGV9X2AsICcnKTtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuc2VsZWN0ZWQuZmluZCh4ID0+IHgubmFtZSA9PT0gZmllbGROYW1lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGlmIChpdGVtLnRhcmdldC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldC5jaGVja2VkKSB7XG4gICAgICAgICAgbWF0Y2gudmFsdWUucHVzaChpdGVtLnRhcmdldC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IG1hdGNoLnZhbHVlLmluZGV4T2YoaXRlbS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG1hdGNoLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXRjaC52YWx1ZSA9IFtpdGVtLnRhcmdldC52YWx1ZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaCh7IG5hbWU6IGZpZWxkTmFtZSwgdmFsdWU6IFtpdGVtLnRhcmdldC52YWx1ZV0gfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0dGluZ3MgPSB7XG4gICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICBmaWVsZHM6IHRoaXMuc2VsZWN0ZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXR0aW5ncygpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCk7XG4gIH1cbn1cbiJdfQ==
839
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL3JweC14dWktY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2dlbmVyaWMtZmlsdGVyL2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFrQixTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RjtJQVlFLGdDQUE2QixhQUE0QixFQUFtQixFQUFlO1FBQTlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQW1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFIcEYsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUl6QixDQUFDO0lBS0Qsc0JBQVcsMENBQU07Ozs7UUFBakI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzs7Ozs7UUFFRCxVQUNrQixLQUFtQjtZQUNuQyxJQUFJLENBQUMsT0FBTyx3QkFDUCxLQUFLLElBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRzs7OztnQkFBQyxVQUFBLEtBQUssSUFBSSxPQUFBLHNCQUM3QixLQUFLLElBQ1IsdUJBQXVCLEVBQUUsS0FBSyxFQUM5Qix1QkFBdUIsRUFBRSxLQUFLLElBQzlCLEVBSmdDLENBSWhDLEVBQUMsR0FDSixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFL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QWdCLEVBQUMsQ0FBQyxDQUFDO2lCQUNoRTthQUNGOzs7Ozs7Ozs7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQzs7Z0JBeFlGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyx5N05BQTRDO29CQUU1QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2lCQUN0Qzs7OztnQkFUTyxhQUFhO2dCQUhlLFdBQVc7Ozt5QkE0QjVDLEtBQUs7MkJBb0JMLEtBQUs7O0lBK1ZSLDZCQUFDO0NBQUEsQUF6WUQsSUF5WUM7U0FsWVksc0JBQXNCOzs7SUFDakMsc0NBQXVCOztJQUN2QiwyQ0FBeUI7O0lBQ3pCLHlDQUE2Qjs7Ozs7SUFNN0IseUNBQThCOzs7OztJQW9COUIsMkNBQWtDOzs7OztJQXhCdEIsK0NBQTZDOzs7OztJQUFFLG9DQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmlsdGVyQ29uZmlnLCBGaWx0ZXJFcnJvciwgRmlsdGVyRmllbGRDb25maWcsIEZpbHRlclNldHRpbmd9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0ZpbHRlclNlcnZpY2V9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvZmlsdGVyL2ZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7Z2V0VmFsdWVzLCBtYXhTZWxlY3RlZFZhbGlkYXRvciwgbWluU2VsZWN0ZWRWYWxpZGF0b3J9IGZyb20gJy4vZ2VuZXJpYy1maWx0ZXItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd4dWlsaWItZ2VuZXJpYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2dlbmVyaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gIHB1YmxpYyBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1TdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyKSB7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jb25maWc6IEZpbHRlckNvbmZpZztcblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogRmlsdGVyQ29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBmaWVsZHM6IHZhbHVlLmZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgICAgLi4uZmllbGQsXG4gICAgICAgIGRpc3BsYXlNaW5TZWxlY3RlZEVycm9yOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU1heFNlbGVjdGVkRXJyb3I6IGZhbHNlLFxuICAgICAgfSkpXG4gICAgfTtcbiAgICB0aGlzLl9jb25maWcgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3NldHRpbmdzPzogRmlsdGVyU2V0dGluZztcblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IEZpbHRlclNldHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2V0dGluZ3ModmFsdWU6IEZpbHRlclNldHRpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5maWVsZHMpIHtcbiAgICAgIHRoaXMubWVyZ2VEZWZhdWx0RmllbGRzKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFkZEZvcm1WYWxpZGF0b3JzKGZpZWxkOiBGaWx0ZXJGaWVsZENvbmZpZyk6IFZhbGlkYXRvcnMge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAoZmllbGQgJiYgZmllbGQubWluU2VsZWN0ZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChtaW5TZWxlY3RlZFZhbGlkYXRvcihmaWVsZC5taW5TZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5tYXhTZWxlY3RlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFNlbGVjdGVkVmFsaWRhdG9yKGZpZWxkLm1heFNlbGVjdGVkKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncykge1xuICAgICAgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIH1cbiAgICB0aGlzLm1lcmdlRGVmYXVsdEZpZWxkcyh0aGlzLnNldHRpbmdzKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLmNvbmZpZywgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5mb3JtU3ViID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybVN1Yikge1xuICAgICAgdGhpcy5mb3JtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhpZGRlbihmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuc2hvd0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkLnNob3dDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuc2hvd0NvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgaWYgKGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZVtuYW1lXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLXBlcnNvbicpIHtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLmdldCgnZW1haWwnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGQuZW5hYmxlQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWVsZC5lbmFibGVDb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoZmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gZmllbGQuZW5hYmxlQ29uZGl0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlW25hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtcGVyc29uJykge1xuICAgICAgICAgIGNvbnRyb2wuZ2V0KCdlbWFpbCcpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ2VtYWlsJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmluZC1sb2NhdGlvbiBpcyBzcGVjaWFsIGNhc2Ugd2hlcmUgbmVlZCB0byByZXNldCB0ZXh0Ym94IChieSBleGlzdGluZyBkaXNhYmxpbmcgZnVuY3Rpb25hbGl0eSlcbiAgICAvLyBmaWVsZC5kaXNhYmxlIHJlZmVycmVkIHRvIGNvbXBvbmVudCBpdHNlbGZcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gTm90ZTogZmllbGQuZGlzYWJsZSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0dWFsbHkgZGlzYWJsZSBvciBub3RcbiAgICByZXR1cm4gZmllbGQuZGlzYWJsZSA/IGZpZWxkLmRpc2FibGUgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICBmb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICBpZiAoZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5fc2V0dGluZ3MgPSB7XG4gICAgICAgIGlkOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldFNlbGVjdGVkVmFsdWVzKGZvcm0udmFsdWUsIHRoaXMuY29uZmlnKVxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KG51bGwpO1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7Li4udGhpcy5zZXR0aW5ncywgcmVzZXQ6IGZhbHNlfTtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5wZXJzaXN0KHNldHRpbmdzLCB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdEZvcm1FcnJvcnMoZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgLy8gd2hlbiBkb21haW4gY2hhbmdlcyBlbnN1cmUgdGhhdCBwZXJzb24gZmllbGQgaXMgcmVzZXRcbiAgcHVibGljIGZpZWxkQ2hhbmdlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIC8vIFRPRE8gLSBEbyBzaW1pbGFyIHdpdGgganVyaXNkaWN0aW9uL3NlcnZpY2UgZm9yIGNhc2V3b3JrZXJzIGJ5IHNlcnZpY2VzXG4gICAgaWYgKGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzICYmIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzLmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCByZXNldEZpZWxkIG9mIGZpZWxkLmNoYW5nZVJlc2V0RmllbGRzKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWVsZChyZXNldEZpZWxkLCBmb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB3aGVuIHVzZXIgZW50ZXJzIGlucHV0IGNoYW5nZSByYWRpbyBidXR0b25cbiAgcHVibGljIGlucHV0Q2hhbmdlZChmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoZmllbGQucmFkaW9TZWxlY3Rpb25DaGFuZ2UgJiYgdHlwZW9mIGZpZWxkLnJhZGlvU2VsZWN0aW9uQ2hhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGZpZWxkLmVuYWJsZUNvbmRpdGlvbi5zcGxpdCgnPScpO1xuICAgICAgdGhpcy5mb3JtLmdldChuYW1lKS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMuY29uZmlnLCB0aGlzLnNldHRpbmdzLCB0cnVlKTtcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuY2FuY2VsU2V0dGluZykge1xuICAgICAgdGhpcy5fc2V0dGluZ3MuZmllbGRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHsuLi50aGlzLnNldHRpbmdzLCByZXNldDogdHJ1ZX07XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnBlcnNpc3Qoc2V0dGluZ3MsIHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlKTtcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UuZ2l2ZW5FcnJvcnMubmV4dChudWxsKTtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVBlcnNvbkNvbnRyb2xzKHZhbHVlczogYW55LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBsZXQga2V5cztcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModmFsdWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5nZXQoZmllbGQubmFtZSkgJiYgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlcyAmJiB2YWx1ZXNba2V5XSA/IHZhbHVlc1trZXldIDogbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWVsZC5uYW1lKS5nZXQoa2V5KS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBhbnksIGZvcm06IEZvcm1Hcm91cCwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgc2VsZWN0QWxsPzogdHJ1ZSB9LCBmaWVsZDogRmlsdGVyRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcbiAgICBjb25zdCBmb3JtQXJyYXk6IEZvcm1BcnJheSA9IGZvcm0uZ2V0KGZpZWxkLm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAoIWl0ZW0uc2VsZWN0QWxsKSB7XG4gICAgICBjb25zdCBhbGxDaGVja2VkID0gZm9ybUFycmF5LmNvbnRyb2xzLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgICAgY29uc3QgaGFzU2VsZWN0QWxsT3B0aW9uID0gZmllbGQub3B0aW9ucy5maW5kKChvcHRpb24sIGkpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0QWxsJykpIHtcbiAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgICAgY29uc3QgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbHRlcigoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgLmV2ZXJ5KChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICBpZiAoIWFsbENoZWNrZWQgJiYgaGFzU2VsZWN0QWxsT3B0aW9uICYmICFpc0NoZWNrZWQpIHtcbiAgICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc1NlbGVjdEFsbE9wdGlvbiAmJiAhYWxsQ2hlY2tlZCAmJiBpc0NoZWNrZWQgJiYgaXNBbGxDaGVja2VkRXhjbHVkaW5nVGhlU2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICAgIGZvcm1BcnJheS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMgJiYgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc2V0RmllbGQgb2YgZmllbGQuY2hhbmdlUmVzZXRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5yZXNldEZpZWxkKHJlc2V0RmllbGQsIGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWVsZChyZXNldEZpZWxkOiBzdHJpbmcsIGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChyZXNldEZpZWxkKTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWU6IHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55W10gfSA9IHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gcmVzZXRGaWVsZCk7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb250cm9sLnJlbW92ZUF0KGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2wudmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICB0aGlzLnJlc2V0RmllbGQoa2V5LCBjb250cm9sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlLnZhbHVlICYmIGRlZmF1bHRWYWx1ZS52YWx1ZS5sZW5ndGggPyBkZWZhdWx0VmFsdWUudmFsdWVbMF0gOiBudWxsO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRGaWVsZHMoZmlsdGVyOiBGaWx0ZXJTZXR0aW5nKTogdm9pZCB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuZmlsdGVyU2VydmljZS5nZXQodGhpcy5jb25maWcuaWQpID8gdGhpcy5maWx0ZXJTZXJ2aWNlLmdldCh0aGlzLmNvbmZpZy5pZCkuZmllbGRzIDogZmlsdGVyLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX3NldHRpbmdzID0ge1xuICAgICAgICBpZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgIGZpZWxkczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcykpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB0aGlzLmZpbHRlclNlcnZpY2UuZ2V0KHRoaXMuY29uZmlnLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKGNvbmZpZzogRmlsdGVyQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZywgcmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFBlcnNvbkNvbnRyb2wgPSB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0KCdmaW5kUGVyc29uQ29udHJvbCcpIDogbnVsbDtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBpZiAoZmluZFBlcnNvbkNvbnRyb2wpIHtcbiAgICAgIC8vIGluIG9yZGVyIHRvIG1haW50YWluIGZpbmQgcGVyc29uIGNvbXBvbmVudCwgY29udHJvbCBuZWVkcyB0byBiZSBrZXB0XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCgnZmluZFBlcnNvbkNvbnRyb2wnLCBmaW5kUGVyc29uQ29udHJvbCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgY29uZmlnLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZmllbGQudHlwZSA9PT0gJ2NoZWNrYm94LWxhcmdlJykge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbmQtbG9jYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGQubmFtZSwgZm9ybUFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkLm1pblNlbGVjdGVkICYmIGZpZWxkLm1pblNlbGVjdGVkID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAocmVzZXQgJiYgY29uZmlnLmNhbmNlbFNldHRpbmcpIHtcbiAgICAgICAgICBjb25zdCBjYW5jZWxGaWVsZCA9IGNvbmZpZy5jYW5jZWxTZXR0aW5nLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNhbmNlbEZpZWxkICYmIGNhbmNlbEZpZWxkLnZhbHVlID8gY2FuY2VsRmllbGQudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBsYXN0U2F2ZWRWYWx1ZSA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGxhc3RTYXZlZFZhbHVlICYmIGxhc3RTYXZlZFZhbHVlID8gbGFzdFNhdmVkVmFsdWUudmFsdWVbMF0gOiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZCBpcyBmaW5kLXBlcnNvbiBidWlsZCBhIGZvcm0gZ3JvdXA7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmluZC1wZXJzb24nKSB7XG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBkb21haW46IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBlbWFpbDogbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUuaGFzT3duUHJvcGVydHkoJ2VtYWlsJykgPyBkZWZhdWx0VmFsdWUuZW1haWwgOiAnJywgdmFsaWRhdG9ycyksXG4gICAgICAgICAgICBpZDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgICAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICAgICAgICBrbm93bkFzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGZvcm1Hcm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcnMpO1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZmllbGQgdXBkYXRlcyBmaW5kIHBlcnNvbiBjb21wb25lbnQgc2V0IHRoZSBpbml0aWFsIGRvbWFpblxuICAgICAgICBpZiAoZmllbGQuZmluZFBlcnNvbkZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5maWVsZENoYW5nZWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2hlY2tCb3hGb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5maWVsZHMpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBzZXR0aW5ncy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgZmllbGQub3B0aW9ucykge1xuICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWVzICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlcy52YWx1ZSkpIHtcbiAgICAgICAgY2hlY2tlZCA9ICEhZGVmYXVsdFZhbHVlcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG9wdGlvbi5rZXkpO1xuICAgICAgfVxuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKGNoZWNrZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGaW5kTG9jYXRpb25Gb3JtQXJyYXkoZmllbGQ6IEZpbHRlckZpZWxkQ29uZmlnLCBzZXR0aW5nczogRmlsdGVyU2V0dGluZyk6IEZvcm1BcnJheSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IEdlbmVyaWNGaWx0ZXJDb21wb25lbnQuYWRkRm9ybVZhbGlkYXRvcnMoZmllbGQpO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10sIHZhbGlkYXRvcnMpO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueVtdIH07XG4gICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzLmZpZWxkcykge1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IHNldHRpbmdzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlcy52YWx1ZSAmJiBkZWZhdWx0VmFsdWVzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWZhdWx0VmFsdWUgb2YgZGVmYXVsdFZhbHVlcy52YWx1ZSkge1xuICAgICAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybUFycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFZhbHVlcyhmb3JtVmFsdWVzOiBhbnksIGNvbmZpZzogRmlsdGVyQ29uZmlnKTogYW55IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybVZhbHVlcykubWFwKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1WYWx1ZXNbbmFtZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaW5kLWxvY2F0aW9uJykge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHZhbHVlcywgbmFtZX07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogZ2V0VmFsdWVzKGZpZWxkLm9wdGlvbnMsIHZhbHVlcyksIG5hbWV9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3ZhbHVlOiBbdmFsdWVzXSwgbmFtZX07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRGb3JtRXJyb3JzKGZvcm06IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yczogRmlsdGVyRXJyb3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5jb25maWcuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1pbkxlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLm1heExlbmd0aCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7bmFtZTogZmllbGQubmFtZSwgZXJyb3I6IGZpZWxkLm1pblNlbGVjdGVkRXJyb3J9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5naXZlbkVycm9ycy5uZXh0KGVycm9ycyk7XG4gICAgfVxuICB9XG59XG4iXX0=