@alauda-fe/network 1.0.1 → 1.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 (62) hide show
  1. package/esm2022/index.mjs +10 -2
  2. package/esm2022/lib/components/certificate-status/component.mjs +7 -6
  3. package/esm2022/lib/components/fixed-ip/component.mjs +135 -91
  4. package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +57 -57
  5. package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +136 -142
  6. package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +24 -25
  7. package/esm2022/lib/components/service-form/component.mjs +34 -33
  8. package/esm2022/lib/components/service-form/fieldset/component.mjs +92 -95
  9. package/esm2022/lib/directives/subnet-validator.directive.mjs +5 -5
  10. package/esm2022/lib/features/network-policy/components/add-peer-rule-handler/component.mjs +69 -0
  11. package/esm2022/lib/features/network-policy/components/ip-block-display/component.mjs +54 -0
  12. package/esm2022/lib/features/network-policy/components/label-selector-display/component.mjs +117 -0
  13. package/esm2022/lib/features/network-policy/components/peer-container/component.mjs +81 -0
  14. package/esm2022/lib/features/network-policy/components/pod-review/component.mjs +250 -0
  15. package/esm2022/lib/features/network-policy/components/rule-table/component.mjs +269 -0
  16. package/esm2022/lib/features/network-policy/form/network-policy/component.mjs +429 -0
  17. package/esm2022/lib/features/network-policy/form/network-policy-ip-block/component.mjs +102 -0
  18. package/esm2022/lib/features/network-policy/form/network-policy-peer/component.mjs +247 -0
  19. package/esm2022/lib/features/network-policy/form/network-policy-ports/component.mjs +161 -0
  20. package/esm2022/lib/features/network-policy/form/network-policy-remote-except-input/component.mjs +128 -0
  21. package/esm2022/lib/features/network-policy/form/network-policy-rule/component.mjs +142 -0
  22. package/esm2022/lib/services/alb-api.service.mjs +26 -6
  23. package/esm2022/lib/services/certificate-api.service.mjs +4 -4
  24. package/esm2022/lib/services/network-util.service.mjs +22 -13
  25. package/esm2022/lib/services/subnet-util.service.mjs +118 -0
  26. package/esm2022/lib/types/alb-exports.mjs +1 -1
  27. package/esm2022/lib/types/k8s-exports.mjs +2 -1
  28. package/esm2022/lib/types/metallb-exports.mjs +2 -0
  29. package/esm2022/lib/types/resource-definition.mjs +28 -2
  30. package/esm2022/lib/utils/alb-exports.mjs +1 -1
  31. package/esm2022/lib/utils/cidr-exports.mjs +3 -3
  32. package/esm2022/lib/utils/common-exports.mjs +22 -0
  33. package/esm2022/lib/utils/service-exports.mjs +1 -1
  34. package/esm2022/lib/utils/validators-exports.mjs +44 -0
  35. package/index.d.ts +9 -1
  36. package/lib/components/fixed-ip/component.d.ts +10 -3
  37. package/lib/components/service-annotations-form/annotations.component.d.ts +6 -6
  38. package/lib/components/service-annotations-form-item/annotations.component.d.ts +1 -1
  39. package/lib/components/service-form/component.d.ts +1 -1
  40. package/lib/features/network-policy/components/add-peer-rule-handler/component.d.ts +8 -0
  41. package/lib/features/network-policy/components/ip-block-display/component.d.ts +7 -0
  42. package/lib/features/network-policy/components/label-selector-display/component.d.ts +13 -0
  43. package/lib/features/network-policy/components/peer-container/component.d.ts +18 -0
  44. package/lib/features/network-policy/components/pod-review/component.d.ts +37 -0
  45. package/lib/features/network-policy/components/rule-table/component.d.ts +21 -0
  46. package/lib/features/network-policy/form/network-policy/component.d.ts +70 -0
  47. package/lib/features/network-policy/form/network-policy-ip-block/component.d.ts +23 -0
  48. package/lib/features/network-policy/form/network-policy-peer/component.d.ts +43 -0
  49. package/lib/features/network-policy/form/network-policy-ports/component.d.ts +17 -0
  50. package/lib/features/network-policy/form/network-policy-remote-except-input/component.d.ts +23 -0
  51. package/lib/features/network-policy/form/network-policy-rule/component.d.ts +28 -0
  52. package/lib/services/alb-api.service.d.ts +4 -2
  53. package/lib/services/network-util.service.d.ts +4 -2
  54. package/lib/services/subnet-util.service.d.ts +26 -0
  55. package/lib/types/alb-exports.d.ts +23 -0
  56. package/lib/types/k8s-exports.d.ts +51 -1
  57. package/lib/types/metallb-exports.d.ts +65 -0
  58. package/lib/types/resource-definition.d.ts +154 -0
  59. package/lib/utils/common-exports.d.ts +5 -0
  60. package/lib/utils/validators-exports.d.ts +16 -0
  61. package/package.json +9 -4
  62. package/styles.css +1 -0
@@ -1,7 +1,6 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- /* eslint-disable sonarjs/cognitive-complexity */
3
- import { AutocompleteModule, CommonFormControl, FormItemWidth, FormModule, IconModule, InputModule, TagsInputComponent, TooltipModule, } from '@alauda/ui';
4
- import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TranslateModule, ErrorsMapperModule, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, } from '@alauda-fe/common';
2
+ import { AutocompleteModule, CommonFormControl, FormItemWidth, FormModule, IconModule, InputModule, TagModule, TagsInputComponent, TooltipModule, } from '@alauda/ui';
3
+ import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TRANSLATE_MODULE, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, ERRORS_MAPPER_MODULE, PurePipe, } from '@alauda-fe/common';
5
4
  import { AsyncPipe, NgFor, NgIf } from '@angular/common';
6
5
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, forwardRef, } from '@angular/core';
7
6
  import { toSignal } from '@angular/core/rxjs-interop';
@@ -10,7 +9,7 @@ import { uniq, values } from 'lodash-es';
10
9
  import { Observable, combineLatest, filter, first, fromEvent, map, merge, of, switchMap, forkJoin, startWith, tap, } from 'rxjs';
11
10
  import { NetworkUtilService } from '../../services/network-util.service';
12
11
  import { NETWORK_RESOURCE_TYPES } from '../../types/resource-definition';
13
- import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, } from '../../utils/cidr-exports';
12
+ import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, getAddressBuilder, } from '../../utils/cidr-exports';
14
13
  import { ClusterNetworkType, KUBE_OVN_ANNOTATION_PREFIX, } from '../../utils/subnet-exports';
15
14
  import * as i0 from "@angular/core";
16
15
  import * as i1 from "@alauda-fe/common";
@@ -19,64 +18,79 @@ import * as i3 from "@alauda/ui";
19
18
  import * as i4 from "@angular/forms";
20
19
  const _c0 = ["ipAddress"];
21
20
  const _c1 = ["tagsInput"];
21
+ const _c2 = a0 => ({ cidr: a0 });
22
22
  function FixedIpInputComponent_input_4_Template(rf, ctx) { if (rf & 1) {
23
- const _r8 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "input", 9, 10);
25
- i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.emitValue($event)); });
23
+ const _r1 = i0.ɵɵgetCurrentView();
24
+ i0.ɵɵelementStart(0, "input", 11, 1);
26
25
  i0.ɵɵpipe(2, "translate");
26
+ i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue($event)); });
27
27
  i0.ɵɵelementEnd();
28
28
  } if (rf & 2) {
29
- const ctx_r0 = i0.ɵɵnextContext();
30
- const _r2 = i0.ɵɵreference(7);
31
- i0.ɵɵproperty("ngModel", ctx_r0.model)("placeholder", ctx_r0.placeholder || i0.ɵɵpipeBind1(2, 3, "dhcp_placeholder"))("auiAutocomplete", _r2);
29
+ const ctx_r1 = i0.ɵɵnextContext();
30
+ const suggestions_r3 = i0.ɵɵreference(7);
31
+ i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(2, 3, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3);
32
32
  } }
33
33
  function FixedIpInputComponent_aui_tags_input_5_Template(rf, ctx) { if (rf & 1) {
34
- const _r12 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "aui-tags-input", 11, 12);
36
- i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.emitValue(ctx_r11.uniq($event))); });
34
+ const _r4 = i0.ɵɵgetCurrentView();
35
+ i0.ɵɵelementStart(0, "aui-tags-input", 12, 2);
37
36
  i0.ɵɵpipe(3, "translate");
37
+ i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue(ctx_r1.uniq($event))); });
38
38
  i0.ɵɵelementEnd();
39
39
  } if (rf & 2) {
40
40
  const ctx_r1 = i0.ɵɵnextContext();
41
- const _r2 = i0.ɵɵreference(7);
42
- i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete", _r2)("inputAsyncValidator", ctx_r1.validate);
41
+ const suggestions_r3 = i0.ɵɵreference(7);
42
+ i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3)("inputAsyncValidator", ctx_r1.validate);
43
+ } }
44
+ function FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "aui-tag", 15);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵpipe(2, "translate");
48
+ i0.ɵɵelementEnd();
49
+ } if (rf & 2) {
50
+ i0.ɵɵproperty("border", true)("size", "mini");
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "network.reserved_ip"), " ");
43
53
  } }
44
54
  function FixedIpInputComponent_aui_suggestion_8_Template(rf, ctx) { if (rf & 1) {
45
55
  i0.ɵɵelementStart(0, "aui-suggestion", 13);
46
56
  i0.ɵɵtext(1);
57
+ i0.ɵɵtemplate(2, FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template, 3, 5, "aui-tag", 14);
58
+ i0.ɵɵpipe(3, "pure");
47
59
  i0.ɵɵelementEnd();
48
60
  } if (rf & 2) {
49
- const ipAddressSuggestion_r13 = ctx.$implicit;
50
- i0.ɵɵproperty("value", ipAddressSuggestion_r13);
51
- i0.ɵɵadvance(1);
52
- i0.ɵɵtextInterpolate1(" ", ipAddressSuggestion_r13, " ");
61
+ const ipAddressSuggestion_r5 = ctx.$implicit;
62
+ const ctx_r1 = i0.ɵɵnextContext();
63
+ i0.ɵɵproperty("value", ipAddressSuggestion_r5);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵtextInterpolate1(" ", ipAddressSuggestion_r5, " ");
66
+ i0.ɵɵadvance();
67
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind3(3, 3, ipAddressSuggestion_r5, ctx_r1.isReservedIp, ctx_r1.$subnetInfo().excludeIps));
53
68
  } }
54
69
  function FixedIpInputComponent_ng_container_14_aui_icon_1_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelement(0, "aui-icon", 16);
70
+ i0.ɵɵelement(0, "aui-icon", 18);
56
71
  } if (rf & 2) {
57
- const ctx_r14 = i0.ɵɵnextContext(2);
58
- i0.ɵɵproperty("auiTooltip", ctx_r14.addonTip);
72
+ const ctx_r1 = i0.ɵɵnextContext(2);
73
+ i0.ɵɵproperty("auiTooltip", ctx_r1.addonTip);
59
74
  } }
60
75
  function FixedIpInputComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵelementContainerStart(0, 14);
62
- i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon", 15);
76
+ i0.ɵɵelementContainerStart(0, 16);
77
+ i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon", 17);
63
78
  i0.ɵɵelementContainerEnd();
64
79
  } if (rf & 2) {
65
- const ctx_r4 = i0.ɵɵnextContext();
66
- i0.ɵɵadvance(1);
67
- i0.ɵɵproperty("ngIf", ctx_r4.addonTip);
80
+ const ctx_r1 = i0.ɵɵnextContext();
81
+ i0.ɵɵadvance();
82
+ i0.ɵɵproperty("ngIf", ctx_r1.addonTip);
68
83
  } }
69
- const _c2 = function (a0) { return { cidr: a0 }; };
70
84
  function FixedIpInputComponent_div_18_Template(rf, ctx) { if (rf & 1) {
71
- i0.ɵɵelementStart(0, "div", 17);
85
+ i0.ɵɵelementStart(0, "div", 19);
72
86
  i0.ɵɵtext(1);
73
- i0.ɵɵpipe(2, "translate");
74
- i0.ɵɵpipe(3, "async");
87
+ i0.ɵɵpipe(2, "async");
88
+ i0.ɵɵpipe(3, "translate");
75
89
  i0.ɵɵelementEnd();
76
90
  } if (rf & 2) {
77
- const ctx_r5 = i0.ɵɵnextContext();
78
- i0.ɵɵadvance(1);
79
- i0.ɵɵtextInterpolate1(" ", ctx_r5.hint || i0.ɵɵpipeBind2(2, 1, "fix_ip_should_belong_tip", i0.ɵɵpureFunction1(6, _c2, i0.ɵɵpipeBind1(3, 4, ctx_r5.cidr$))), " ");
91
+ const ctx_r1 = i0.ɵɵnextContext();
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.hint || i0.ɵɵpipeBind2(3, 3, "network.fix_ip_should_belong_tip", i0.ɵɵpureFunction1(6, _c2, i0.ɵɵpipeBind1(2, 1, ctx_r1.cidr$))), " ");
80
94
  } }
81
95
  export class FixedIpInputComponent extends CommonFormControl {
82
96
  get isCalico() {
@@ -115,6 +129,7 @@ export class FixedIpInputComponent extends CommonFormControl {
115
129
  subnets: [subnet],
116
130
  subnet,
117
131
  gateway: subnet.spec?.gateway,
132
+ excludeIps: subnet.spec?.excludeIps,
118
133
  })
119
134
  : this.isCalico
120
135
  ? this.k8sApi
@@ -127,18 +142,20 @@ export class FixedIpInputComponent extends CommonFormControl {
127
142
  subnets,
128
143
  subnet: null,
129
144
  gateway: '',
145
+ excludeIps: [],
130
146
  })))
131
147
  : of({
132
148
  cluster,
133
149
  subnets: [],
134
150
  subnet: null,
135
151
  gateway: '',
152
+ excludeIps: [],
136
153
  })));
137
154
  this.subnetInfo$ = combineLatest([
138
155
  this.networkMode$,
139
156
  this.namespaceResource$.pipe(filter(Boolean)),
140
157
  this.subnetDetails$,
141
- ]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway }]) => {
158
+ ]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway, excludeIps },]) => {
142
159
  return {
143
160
  cluster,
144
161
  subnetCidrs: this.isCalico
@@ -148,14 +165,19 @@ export class FixedIpInputComponent extends CommonFormControl {
148
165
  type: 'cidr',
149
166
  baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
150
167
  })
151
- : subnet.spec?.cidrBlock ?? '', this.$networkMode(), this.enableFixIpV6ForDual),
168
+ : (subnet.spec?.cidrBlock ?? ''), this.$networkMode(), this.enableFixIpV6ForDual),
152
169
  subnetName: subnet == null
153
- ? this.k8sUtil.getAnnotation(namespace, {
154
- type: 'logical_switch',
155
- baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
156
- })
170
+ ? this.isCalico
171
+ ? this.networkUtilService
172
+ .getCalicoSubnetNames(namespace, this.$networkMode())
173
+ .join(',')
174
+ : this.k8sUtil.getAnnotation(namespace, {
175
+ type: 'logical_switch',
176
+ baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
177
+ })
157
178
  : this.k8sUtil.getName(subnet),
158
179
  gateway,
180
+ excludeIps: excludeIps || [],
159
181
  };
160
182
  }), switchMap(subnetInfo => {
161
183
  if (this.networkType === ClusterNetworkType.KUBE_OVN &&
@@ -173,6 +195,7 @@ export class FixedIpInputComponent extends CommonFormControl {
173
195
  .map(item => item.spec?.gateway)
174
196
  .filter(Boolean)
175
197
  .join(','),
198
+ excludeIps: uniq(subnetList.flatMap(item => item.spec?.excludeIps)),
176
199
  }
177
200
  : subnetInfo));
178
201
  }
@@ -195,10 +218,11 @@ export class FixedIpInputComponent extends CommonFormControl {
195
218
  subnetCidrs: adaptSubnetCidrs(subnet.spec.cidrBlock, this.$networkMode(), this.enableFixIpV6ForDual),
196
219
  subnetName: this.k8sUtil.getName(subnet),
197
220
  gateway: subnet.spec.gateway,
221
+ excludeIps: subnet.spec.excludeIps,
198
222
  })));
199
223
  }), publishRef());
200
224
  this.$subnetInfo = toSignal(this.subnetInfo$);
201
- this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => subnetInfo?.subnetCidrs.join('、')));
225
+ this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => uniq(subnetInfo?.subnetCidrs).join('、')));
202
226
  this.innerErrorsMapper$ = combineLatest([
203
227
  this.cidr$,
204
228
  this.translate.locale$,
@@ -229,30 +253,28 @@ export class FixedIpInputComponent extends CommonFormControl {
229
253
  this.cluster$,
230
254
  this.subnetInfo$,
231
255
  this.model$.pipe(first()),
232
- ]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.isCalico
233
- ? of([])
234
- : this.k8sApi
235
- .getResourceList({
236
- type: NETWORK_RESOURCE_TYPES.SUBNET_KUBE_OVN_IP,
237
- cluster,
238
- queryParams: {
239
- labelSelector: matchExpressionsToString([
240
- {
241
- key: `${KUBE_OVN_ANNOTATION_PREFIX}/subnet`,
242
- operator: 'in',
243
- values: subnetName.split(','),
244
- },
245
- ]),
246
- },
247
- })
248
- .pipe(map(res => res.items), skipError([]), map(subnetIps => subnetIps.reduce((usedIps, { spec: { ipAddress } }) => {
249
- ipAddress.split(',').forEach(item => {
250
- if (ip !== item) {
251
- usedIps.push(item);
252
- }
253
- });
254
- return usedIps;
255
- }, gateway.split(','))))), publishRef());
256
+ ]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.k8sApi
257
+ .getResourceList({
258
+ type: NETWORK_RESOURCE_TYPES.SUBNET_KUBE_OVN_IP,
259
+ cluster,
260
+ queryParams: {
261
+ labelSelector: matchExpressionsToString([
262
+ {
263
+ key: `${KUBE_OVN_ANNOTATION_PREFIX}/subnet`,
264
+ operator: 'in',
265
+ values: subnetName.split(','),
266
+ },
267
+ ]),
268
+ },
269
+ })
270
+ .pipe(map(res => res.items), skipError([]), map(subnetIps => subnetIps.reduce((usedIps, { spec: { ipAddress } }) => {
271
+ ipAddress.split(',').forEach(item => {
272
+ if (ip !== item) {
273
+ usedIps.push(item);
274
+ }
275
+ });
276
+ return usedIps;
277
+ }, gateway.split(','))))), publishRef());
256
278
  this.$usedIps = toSignal(this.usedIps$);
257
279
  this.ipAddressSuggestions$ = combineLatest([
258
280
  this.subnetInfo$,
@@ -267,6 +289,20 @@ export class FixedIpInputComponent extends CommonFormControl {
267
289
  ...(Array.isArray(addedIps) ? addedIps : [addedIps].filter(Boolean)),
268
290
  ], inputValue, this.isCalico)), startWith([]), skipError([]), publishRef());
269
291
  }
292
+ isReservedIp(ip, excludeIps) {
293
+ const Builder = getAddressBuilder(this.adaptIpMode(ip));
294
+ return excludeIps.some(excludeIp => {
295
+ if (excludeIp.includes('..')) {
296
+ const [start, end] = excludeIp?.split('..');
297
+ const _Builder = getAddressBuilder(this.adaptIpMode(start));
298
+ const _startAddress = new _Builder(start).bigInteger();
299
+ const _endAddress = new _Builder(end).bigInteger();
300
+ const _ip = new Builder(ip).bigInteger();
301
+ return (_startAddress.compareTo(_ip) <= 0 && _ip.compareTo(_endAddress) <= 0);
302
+ }
303
+ return excludeIp === ip;
304
+ });
305
+ }
270
306
  registerOnValidatorChange(fn) {
271
307
  this.onValidatorChange = fn;
272
308
  }
@@ -278,7 +314,7 @@ export class FixedIpInputComponent extends CommonFormControl {
278
314
  }
279
315
  setErrors(errors) {
280
316
  const combinedErrors = this.multiple
281
- ? { ...this.ipAddress?.control.errors, ...errors } // 可能存在传入的 errors
317
+ ? { ...this.errors, ...errors } // 可能存在传入的 errors
282
318
  : errors;
283
319
  const validationErrors = values(combinedErrors).length
284
320
  ? combinedErrors
@@ -355,51 +391,50 @@ export class FixedIpInputComponent extends CommonFormControl {
355
391
  useExisting: forwardRef(() => FixedIpInputComponent),
356
392
  multi: true,
357
393
  },
358
- ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [[3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], ["suggestions", ""], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemHint", "", 4, "ngIf"], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange"], ["ipAddress", "ngModel"], ["auiFormItemControl", "", 1, "flex-1", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange"], ["tagsInput", "", "ipAddress", "ngModel"], [3, "value"], ["auiFormItemAddon", ""], ["icon", "question_circle", "class", "icon--help", "auiTooltipPosition", "end", 3, "auiTooltip", 4, "ngIf"], ["icon", "question_circle", "auiTooltipPosition", "end", 1, "icon--help", 3, "auiTooltip"], ["auiFormItemHint", ""]], template: function FixedIpInputComponent_Template(rf, ctx) { if (rf & 1) {
359
- i0.ɵɵelementStart(0, "aui-form-item", 0)(1, "label", 1);
394
+ ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [["suggestions", ""], ["ipAddress", "ngModel"], ["tagsInput", "", "ipAddress", "ngModel"], [3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemHint", "", 4, "ngIf"], ["aui-input", "", "auiFormItemControl", "", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete"], ["auiFormItemControl", "", 1, "flex-1", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator"], [3, "value"], ["type", "info", 3, "border", "size", 4, "ngIf"], ["type", "info", 3, "border", "size"], ["auiFormItemAddon", ""], ["icon", "question_circle", "class", "icon--help", "auiTooltipPosition", "end", 3, "auiTooltip", 4, "ngIf"], ["icon", "question_circle", "auiTooltipPosition", "end", 1, "icon--help", 3, "auiTooltip"], ["auiFormItemHint", ""]], template: function FixedIpInputComponent_Template(rf, ctx) { if (rf & 1) {
395
+ i0.ɵɵelementStart(0, "aui-form-item", 3)(1, "label", 4);
360
396
  i0.ɵɵtext(2);
361
397
  i0.ɵɵpipe(3, "translate");
362
398
  i0.ɵɵelementEnd();
363
- i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input", 2);
364
- i0.ɵɵtemplate(5, FixedIpInputComponent_aui_tags_input_5_Template, 4, 6, "aui-tags-input", 3);
365
- i0.ɵɵelementStart(6, "aui-autocomplete", null, 4);
366
- i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 2, 2, "aui-suggestion", 5);
399
+ i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input", 5)(5, FixedIpInputComponent_aui_tags_input_5_Template, 4, 6, "aui-tags-input", 6);
400
+ i0.ɵɵelementStart(6, "aui-autocomplete", null, 0);
401
+ i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 4, 7, "aui-suggestion", 7);
367
402
  i0.ɵɵpipe(9, "async");
368
403
  i0.ɵɵelementStart(10, "aui-autocomplete-placeholder");
369
404
  i0.ɵɵtext(11);
370
- i0.ɵɵpipe(12, "translate");
371
- i0.ɵɵpipe(13, "async");
405
+ i0.ɵɵpipe(12, "async");
406
+ i0.ɵɵpipe(13, "translate");
372
407
  i0.ɵɵelementEnd()();
373
- i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container", 6);
374
- i0.ɵɵelement(15, "acl-errors-mapper", 7);
408
+ i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container", 8);
409
+ i0.ɵɵelement(15, "acl-errors-mapper", 9);
375
410
  i0.ɵɵpipe(16, "async");
376
411
  i0.ɵɵpipe(17, "async");
377
- i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div", 8);
412
+ i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div", 10);
378
413
  i0.ɵɵpipe(19, "async");
379
414
  i0.ɵɵelementEnd();
380
415
  } if (rf & 2) {
381
416
  i0.ɵɵproperty("width", ctx.formItemWidth);
382
417
  i0.ɵɵadvance(2);
383
- i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "ip_address"));
418
+ i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "network.ip_address"));
384
419
  i0.ɵɵadvance(2);
385
420
  i0.ɵɵproperty("ngIf", !ctx.multiple);
386
- i0.ɵɵadvance(1);
421
+ i0.ɵɵadvance();
387
422
  i0.ɵɵproperty("ngIf", ctx.multiple);
388
423
  i0.ɵɵadvance(3);
389
424
  i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(9, 12, ctx.ipAddressSuggestions$));
390
425
  i0.ɵɵadvance(3);
391
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(12, 14, i0.ɵɵpipeBind1(13, 16, ctx.ipAddressSuggestions$) ? "no_available_suggestion" : "loading"), " ");
426
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(13, 16, i0.ɵɵpipeBind1(12, 14, ctx.ipAddressSuggestions$) ? "network.no_available_suggestion" : "loading"), " ");
392
427
  i0.ɵɵadvance(3);
393
428
  i0.ɵɵproperty("ngIf", ctx.addonTip != null);
394
- i0.ɵɵadvance(1);
429
+ i0.ɵɵadvance();
395
430
  i0.ɵɵproperty("errors", (ctx.ipAddress == null ? null : ctx.ipAddress.errors == null ? null : ctx.ipAddress.errors.input_data_error) || (ctx.ipAddress == null ? null : ctx.ipAddress.errors) || i0.ɵɵpipeBind1(16, 18, ctx.inputErrors$))("errorsMapper", i0.ɵɵpipeBind1(17, 20, ctx.combinedErrorsMapper$));
396
431
  i0.ɵɵadvance(3);
397
432
  i0.ɵɵproperty("ngIf", ctx.hint !== null && (ctx.hint || i0.ɵɵpipeBind1(19, 22, ctx.cidr$)));
398
433
  } }, dependencies: [AutocompleteModule, i3.AutoCompleteDirective, i3.CustomAutoCompleteDirective, i3.AutocompleteComponent, i3.SuggestionComponent, i3.AutocompletePlaceholderComponent, AsyncPipe,
399
- E2eAttributeBindingDirective,
400
- ErrorsMapperModule, i1.ErrorsMapperComponent, FormModule, i3.FormItemComponent, i3.FormItemAddonDirective, i3.FormItemErrorDirective, i3.FormItemHintDirective, i3.FormItemLabelDirective, i3.FormItemControlDirective, NgIf,
434
+ PurePipe,
435
+ E2eAttributeBindingDirective, i1.ErrorsMapperComponent, FormModule, i3.FormItemComponent, i3.FormItemAddonDirective, i3.FormItemErrorDirective, i3.FormItemHintDirective, i3.FormItemLabelDirective, i3.FormItemControlDirective, NgIf,
401
436
  NgFor,
402
- InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, TranslateModule, i1.TranslatePipe], styles: ["[_nghost-%COMP%]:not(:last-child) aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:16px}"], changeDetection: 0 }); }
437
+ InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, TagModule, i3.TagComponent, i1.TranslatePipe], styles: ["[_nghost-%COMP%]:not(:last-child) aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:16px}"], changeDetection: 0 }); }
403
438
  }
404
439
  __decorate([
405
440
  ObservableInput(),
@@ -429,13 +464,19 @@ __decorate([
429
464
  ObservableInput(),
430
465
  __metadata("design:type", Observable)
431
466
  ], FixedIpInputComponent.prototype, "errorsMapper$", void 0);
467
+ __decorate([
468
+ bind,
469
+ __metadata("design:type", Function),
470
+ __metadata("design:paramtypes", [String, Array]),
471
+ __metadata("design:returntype", void 0)
472
+ ], FixedIpInputComponent.prototype, "isReservedIp", null);
432
473
  __decorate([
433
474
  bind,
434
475
  __metadata("design:type", Function),
435
476
  __metadata("design:paramtypes", [AbstractControl]),
436
477
  __metadata("design:returntype", void 0)
437
478
  ], FixedIpInputComponent.prototype, "validate", null);
438
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixedIpInputComponent, [{
479
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixedIpInputComponent, [{
439
480
  type: Component,
440
481
  args: [{ standalone: true, selector: 'acl-fixed-ip-input', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
441
482
  {
@@ -451,8 +492,9 @@ __decorate([
451
492
  ], imports: [
452
493
  AutocompleteModule,
453
494
  AsyncPipe,
495
+ PurePipe,
454
496
  E2eAttributeBindingDirective,
455
- ErrorsMapperModule,
497
+ ERRORS_MAPPER_MODULE,
456
498
  FormModule,
457
499
  NgIf,
458
500
  NgFor,
@@ -460,9 +502,10 @@ __decorate([
460
502
  IconModule,
461
503
  TooltipModule,
462
504
  FormsModule,
463
- TranslateModule,
464
- ], template: "<aui-form-item [width]=\"formItemWidth\">\n <label auiFormItemLabel>{{ label || ('ip_address' | translate) }}</label>\n <input\n *ngIf=\"!multiple\"\n aui-input\n auiFormItemControl\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue($event)\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n />\n <aui-tags-input\n *ngIf=\"multiple\"\n class=\"flex-1\"\n auiFormItemControl\n #tagsInput\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue(uniq($event))\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n [inputAsyncValidator]=\"validate\"\n ></aui-tags-input>\n <aui-autocomplete #suggestions>\n <aui-suggestion\n *ngFor=\"let ipAddressSuggestion of ipAddressSuggestions$ | async\"\n [value]=\"ipAddressSuggestion\"\n >\n {{ ipAddressSuggestion }}\n </aui-suggestion>\n <aui-autocomplete-placeholder>\n {{\n ((ipAddressSuggestions$ | async)\n ? 'no_available_suggestion'\n : 'loading'\n ) | translate\n }}\n </aui-autocomplete-placeholder>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"addonTip != null\"\n auiFormItemAddon\n >\n <aui-icon\n *ngIf=\"addonTip\"\n icon=\"question_circle\"\n class=\"icon--help\"\n [auiTooltip]=\"addonTip\"\n auiTooltipPosition=\"end\"\n ></aui-icon>\n </ng-container>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"\n ipAddress?.errors?.input_data_error ||\n ipAddress?.errors ||\n (inputErrors$ | async)\n \"\n [errorsMapper]=\"combinedErrorsMapper$ | async\"\n ></acl-errors-mapper>\n <div\n auiFormItemHint\n *ngIf=\"hint !== null && (hint || (cidr$ | async))\"\n >\n {{\n hint ||\n ('fix_ip_should_belong_tip' | translate: { cidr: (cidr$ | async) })\n }}\n </div>\n</aui-form-item>\n", styles: [":host:not(:last-child) aui-form-item ::ng-deep .aui-form-item{margin-bottom:16px}\n"] }]
465
- }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.K8sUtilService }, { type: i1.K8sApiService }, { type: i2.NetworkUtilService }, { type: i1.TranslateService }]; }, { cluster: [{
505
+ TagModule,
506
+ TRANSLATE_MODULE,
507
+ ], template: "<aui-form-item [width]=\"formItemWidth\">\n <label auiFormItemLabel>{{\n label || ('network.ip_address' | translate)\n }}</label>\n <input\n *ngIf=\"!multiple\"\n aui-input\n auiFormItemControl\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue($event)\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n />\n <aui-tags-input\n *ngIf=\"multiple\"\n class=\"flex-1\"\n auiFormItemControl\n #tagsInput\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue(uniq($event))\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n [inputAsyncValidator]=\"validate\"\n ></aui-tags-input>\n <aui-autocomplete #suggestions>\n <aui-suggestion\n *ngFor=\"let ipAddressSuggestion of ipAddressSuggestions$ | async\"\n [value]=\"ipAddressSuggestion\"\n >\n {{ ipAddressSuggestion }}\n <aui-tag\n *ngIf=\"\n ipAddressSuggestion | pure: isReservedIp : $subnetInfo().excludeIps\n \"\n [border]=\"true\"\n [size]=\"'mini'\"\n type=\"info\"\n >\n {{ 'network.reserved_ip' | translate }}\n </aui-tag>\n </aui-suggestion>\n <aui-autocomplete-placeholder>\n {{\n ((ipAddressSuggestions$ | async)\n ? 'network.no_available_suggestion'\n : 'loading'\n ) | translate\n }}\n </aui-autocomplete-placeholder>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"addonTip != null\"\n auiFormItemAddon\n >\n <aui-icon\n *ngIf=\"addonTip\"\n icon=\"question_circle\"\n class=\"icon--help\"\n [auiTooltip]=\"addonTip\"\n auiTooltipPosition=\"end\"\n ></aui-icon>\n </ng-container>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"\n ipAddress?.errors?.input_data_error ||\n ipAddress?.errors ||\n (inputErrors$ | async)\n \"\n [errorsMapper]=\"combinedErrorsMapper$ | async\"\n ></acl-errors-mapper>\n <div\n auiFormItemHint\n *ngIf=\"hint !== null && (hint || (cidr$ | async))\"\n >\n {{\n hint ||\n ('network.fix_ip_should_belong_tip'\n | translate: { cidr: (cidr$ | async) })\n }}\n </div>\n</aui-form-item>\n", styles: [":host:not(:last-child) aui-form-item ::ng-deep .aui-form-item{margin-bottom:16px}\n"] }]
508
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.K8sUtilService }, { type: i1.K8sApiService }, { type: i2.NetworkUtilService }, { type: i1.TranslateService }], { cluster: [{
466
509
  type: Input,
467
510
  args: [{ required: true }]
468
511
  }], cluster$: [], namespace: [{
@@ -499,5 +542,6 @@ __decorate([
499
542
  type: Input
500
543
  }], errors$: [], errorsMapper: [{
501
544
  type: Input
502
- }], errorsMapper$: [], validate: [] }); })();
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlEQUFpRDtBQUNqRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLDRCQUE0QixFQUM1QixnQkFBZ0IsR0FFakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBRWYsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsT0FBTyxHQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxF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RSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLFlBQVksTUFHWixNQUFNO2tCQURMLEtBQUs7WUFJTixPQUFPLE1BR1AsS0FBSztrQkFESixLQUFLO1lBSU4sV0FBVztrQkFEVixLQUFLO1lBSU4sSUFBSTtrQkFESCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsYUFBYTtrQkFEWixLQUFLO1lBSU4sVUFBVSxNQUlWLFlBQVk7a0JBRFgsS0FBSztZQUtOLG9CQUFvQjtrQkFEbkIsS0FBSztZQUdHLE1BQU07a0JBQWQsS0FBSztZQUVOLE9BQU8sTUFFRSxZQUFZO2tCQUFwQixLQUFLO1lBRU4sYUFBYSxNQWlUYixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBDb21tb25Gb3JtQ29udHJvbCxcbiAgRm9ybUl0ZW1XaWR0aCxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhZ3NJbnB1dENvbXBvbmVudCxcbiAgVG9vbHRpcE1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBLOHNBcGlTZXJ2aWNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBwdWJsaXNoUmVmLFxuICBza2lwRXJyb3IsXG4gIG1hdGNoRXhwcmVzc2lvbnNUb1N0cmluZyxcbiAgTmFtZXNwYWNlLFxuICBiaW5kLFxuICBUcmFuc2xhdGVNb2R1bGUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgUkVTT1VSQ0VfVFlQRVMsXG4gIEUyZUF0dHJpYnV0ZUJpbmRpbmdEaXJlY3RpdmUsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdNb2RlbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcSwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgZm9ya0pvaW4sXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmV0d29ya1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibmV0LCBTdWJuZXRJcCB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cy1leHBvcnRzJztcbmltcG9ydCB7IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMgfSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7XG4gIElQTW9kZSxcbiAgTmV0d29ya01vZGUsXG4gIGFkYXB0SXBNb2RlLFxuICBhZGFwdFN1Ym5ldENpZHJzLFxuICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMsXG4gIGlwQWRkcmVzc0VxdWFsLFxuICBpc0JlbG9uZ0NpZHIsXG4gIGlzQnJvYWRjYXN0QWRkcixcbiAgaXNJcEFkZHJlc3NWYWxpZCxcbiAgaXNOZXR3b3JrQWRkcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY2lkci1leHBvcnRzJztcbmltcG9ydCB7XG4gIENsdXN0ZXJOZXR3b3JrVHlwZSxcbiAgS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N1Ym5ldC1leHBvcnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWZpeGVkLWlwLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Q6bm90KDpsYXN0LWNoaWxkKSBhdWktZm9ybS1pdGVtIDo6bmctZGVlcCAuYXVpLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRml4ZWRJcElucHV0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4ZWRJcElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgQ29tbW9uRm9ybUNvbnRyb2w8c3RyaW5nIHwgc3RyaW5nW10+XG4gIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3JcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3Rlcjogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBjbHVzdGVyJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuYW1lc3BhY2U6IHN0cmluZztcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgbmFtZXNwYWNlJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuZXR3b3JrVHlwZTogQ2x1c3Rlck5ldHdvcmtUeXBlO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBuZXR3b3JrVHlwZSQhOiBPYnNlcnZhYmxlPENsdXN0ZXJOZXR3b3JrVHlwZT47XG5cbiAgQElucHV0KClcbiAgc3VibmV0OiBTdWJuZXQ7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN1Ym5ldCQhOiBPYnNlcnZhYmxlPFN1Ym5ldD47XG5cbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGhpbnQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBhZGRvblRpcDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ2lwQWRkcmVzcycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpcEFkZHJlc3M6IE5nTW9kZWw7XG5cbiAgQFZpZXdDaGlsZCgndGFnc0lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhZ3NJbnB1dDogVGFnc0lucHV0Q29tcG9uZW50O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1JdGVtV2lkdGg6IEZvcm1JdGVtV2lkdGggPSBGb3JtSXRlbVdpZHRoLk1lZGl1bTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgdGFnc0lucHV0JCE6IE9ic2VydmFibGU8VGFnc0lucHV0Q29tcG9uZW50PjtcblxuICAvLyDomZrmi5/mnLrmm7TmlrDml7bmjpLpmaTmjonoh6rouqtcbiAgQElucHV0KClcbiAgc2tpcE9jY3VwaWVkID0gZmFsc2U7XG5cbiAgLy8g55uu5YmN5Y+M5qCI5Zu65a6aIElQIOWPquaUr+aMgSBJUHY0XG4gIEBJbnB1dCgpXG4gIGVuYWJsZUZpeElwVjZGb3JEdWFsID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgZXJyb3JzJCE6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycz47XG5cbiAgQElucHV0KCkgZXJyb3JzTWFwcGVyOiBTdHJpbmdNYXA7XG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBlcnJvcnNNYXBwZXIkITogT2JzZXJ2YWJsZTxTdHJpbmdNYXA+O1xuXG4gIHVuaXEgPSB1bmlxO1xuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcblxuICBnZXQgaXNDYWxpY28oKSB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya1R5cGUgPT09IENsdXN0ZXJOZXR3b3JrVHlwZS5DQUxJQ087XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWVzcGFjZVJlc291cmNlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2x1c3RlciQsXG4gICAgdGhpcy5uYW1lc3BhY2UkLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW2NsdXN0ZXIsIG5hbWVzcGFjZV0pID0+ICEhY2x1c3RlciAmJiAhIW5hbWVzcGFjZSksXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgbmFtZXNwYWNlXSkgPT5cbiAgICAgIHRoaXMuazhzQXBpLmdldFJlc291cmNlPE5hbWVzcGFjZT4oe1xuICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5OQU1FU1BBQ0UsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICAgIG5hbWU6IG5hbWVzcGFjZSxcbiAgICAgIH0pLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya01vZGUkID0gdGhpcy5jbHVzdGVyJC5waXBlKFxuICAgIHN3aXRjaE1hcChjbHVzdGVyID0+IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldE5ldHdvcmtNb2RlJChjbHVzdGVyKSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJG5ldHdvcmtNb2RlID0gdG9TaWduYWwodGhpcy5uZXR3b3JrTW9kZSQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0RGV0YWlscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmV0d29ya1R5cGUkLFxuICAgIHRoaXMuc3VibmV0JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuZXR3b3JrVHlwZV0pID0+ICEhY2x1c3RlciAmJiAhIW5ldHdvcmtUeXBlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBfbmV0d29ya1R5cGUsIHN1Ym5ldF0pID0+XG4gICAgICBzdWJuZXRcbiAgICAgICAgPyBvZih7XG4gICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgc3VibmV0czogW3N1Ym5ldF0sXG4gICAgICAgICAgICBzdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYz8uZ2F0ZXdheSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk4sXG4gICAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcChyZXMgPT4gcmVzLml0ZW1zKSxcbiAgICAgICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldHMgPT4gKHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgICAgc3VibmV0OiBudWxsIGFzIFN1Ym5ldCxcbiAgICAgICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICA6IG9mKHtcbiAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICBzdWJuZXRzOiBbXSBhcyBTdWJuZXRbXSxcbiAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICB9KSxcbiAgICApLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0SW5mbyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm5ldHdvcmtNb2RlJCxcbiAgICB0aGlzLm5hbWVzcGFjZVJlc291cmNlJC5waXBlKGZpbHRlcihCb29sZWFuKSksXG4gICAgdGhpcy5zdWJuZXREZXRhaWxzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtuZXR3b3JrTW9kZSwgbmFtZXNwYWNlLCB7IGNsdXN0ZXIsIHN1Ym5ldHMsIHN1Ym5ldCwgZ2F0ZXdheSB9XSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgc3VibmV0Q2lkcnM6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldENhbGljb0NpZHJzKFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0ID09IG51bGxcbiAgICAgICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2lkcicsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IHN1Ym5ldC5zcGVjPy5jaWRyQmxvY2sgPz8gJycsXG4gICAgICAgICAgICAgIHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICApLFxuICAgICAgICBzdWJuZXROYW1lOlxuICAgICAgICAgIHN1Ym5ldCA9PSBudWxsXG4gICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsb2dpY2FsX3N3aXRjaCcsXG4gICAgICAgICAgICAgICAgYmFzZURvbWFpbjogS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgIGdhdGV3YXksXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcChzdWJuZXRJbmZvID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLktVQkVfT1ZOICYmXG4gICAgICAgICFzdWJuZXRJbmZvLmdhdGV3YXlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oXG4gICAgICAgICAgc3VibmV0SW5mby5zdWJuZXROYW1lLnNwbGl0KCcsJykubWFwKHN1Ym5ldE5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgICAgICAgbmFtZTogc3VibmV0TmFtZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoc2tpcEVycm9yKG51bGwgYXMgU3VibmV0KSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChsaXN0ID0+IGxpc3QuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgICBtYXAoc3VibmV0TGlzdCA9PlxuICAgICAgICAgICAgc3VibmV0TGlzdC5sZW5ndGhcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAuLi5zdWJuZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogc3VibmV0TGlzdFxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5nYXRld2F5KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHN1Ym5ldEluZm8sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihzdWJuZXRJbmZvKTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoc3VibmV0SW5mby5zdWJuZXRDaWRycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgICAgfVxuXG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHN1Ym5ldFxuICAgICAgcmV0dXJuIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgbmFtZTogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyBgZGVmYXVsdC1pcCR7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSA9PT0gJ2R1YWwnID8gJ3Y0JyA6IHRoaXMuJG5ldHdvcmtNb2RlKClcbiAgICAgICAgICAgICAgfS1pcHBvb2xgXG4gICAgICAgICAgICA6ICdvdm4tZGVmYXVsdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChzdWJuZXQgPT4gKHtcbiAgICAgICAgICAgIC4uLnN1Ym5ldEluZm8sXG4gICAgICAgICAgICBzdWJuZXRDaWRyczogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0LnNwZWMuY2lkckJsb2NrLFxuICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Ym5ldE5hbWU6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYy5nYXRld2F5LFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSAkc3VibmV0SW5mbyA9IHRvU2lnbmFsKHRoaXMuc3VibmV0SW5mbyQpO1xuXG4gIGNpZHIkID0gdGhpcy5zdWJuZXRJbmZvJC5waXBlKFxuICAgIG1hcChzdWJuZXRJbmZvID0+IHN1Ym5ldEluZm8/LnN1Ym5ldENpZHJzLmpvaW4oJ+OAgScpKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlubmVyRXJyb3JzTWFwcGVyJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2lkciQsXG4gICAgdGhpcy50cmFuc2xhdGUubG9jYWxlJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjaWRyXSkgPT4gKHtcbiAgICAgIHBhdHRlcm46IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfcGF0dGVybl90aXBzJywge1xuICAgICAgICBpcE1vZGU6IFsnZHVhbCcsICd2NCddLmluY2x1ZGVzKHRoaXMuJG5ldHdvcmtNb2RlKCkpID8gJ0lQdjQnIDogJ0lQdjYnLFxuICAgICAgfSksXG4gICAgICBvY2N1cGllZDogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9vY2N1cGllZF90aXBzJywge1xuICAgICAgICBjaWRyLFxuICAgICAgfSksXG4gICAgICBvdXRfb2ZfcmFuZ2U6IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfb3V0X29mX3JhbmdlX3RpcHMnLCB7XG4gICAgICAgIGNpZHIsXG4gICAgICB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29tYmluZWRFcnJvcnNNYXBwZXIkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbm5lckVycm9yc01hcHBlciQsXG4gICAgdGhpcy5lcnJvcnNNYXBwZXIkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lubmVyRXJyb3JzTWFwcGVyLCBlcnJvcnNNYXBwZXJdKSA9PiAoe1xuICAgICAgLi4uaW5uZXJFcnJvcnNNYXBwZXIsXG4gICAgICAuLi5lcnJvcnNNYXBwZXIsXG4gICAgfSkpLFxuICApO1xuXG4gIGlucHV0RXJyb3JzJCA9IHRoaXMuZXJyb3JzJC5waXBlKFxuICAgIHRhcChlcnJvcnMgPT4ge1xuICAgICAgdGhpcy5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlPy4oKTtcbiAgICB9KSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVzZWRJcHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jbHVzdGVyJCxcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMubW9kZWwkLnBpcGUoZmlyc3QoKSksXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgeyBzdWJuZXROYW1lLCBnYXRld2F5IH0sIGlwXSkgPT5cbiAgICAgIHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyBvZihbXSBhcyBzdHJpbmdbXSlcbiAgICAgICAgOiB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXRJcD4oe1xuICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTl9JUCxcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBsYWJlbFNlbGVjdG9yOiBtYXRjaEV4cHJlc3Npb25zVG9TdHJpbmcoW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9zdWJuZXRgLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBzdWJuZXROYW1lLnNwbGl0KCcsJyksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgICAgIHNraXBFcnJvcihbXSBhcyBTdWJuZXRJcFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldElwcyA9PlxuICAgICAgICAgICAgICAgIHN1Ym5ldElwcy5yZWR1Y2U8c3RyaW5nW10+KFxuICAgICAgICAgICAgICAgICAgKHVzZWRJcHMsIHsgc3BlYzogeyBpcEFkZHJlc3MgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcy5zcGxpdCgnLCcpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlwICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkSXBzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZWRJcHM7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheS5zcGxpdCgnLCcpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJHVzZWRJcHMgPSB0b1NpZ25hbCh0aGlzLnVzZWRJcHMkKTtcblxuICBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMudXNlZElwcyQsXG4gICAgdGhpcy5uZXR3b3JrTW9kZSQsXG4gICAgdGhpcy5tb2RlbCQsXG4gICAgdGhpcy50YWdzSW5wdXQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodGFnc0lucHV0ID0+XG4gICAgICAgIHRhZ3NJbnB1dFxuICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgIGZyb21FdmVudCh0YWdzSW5wdXQuaW5wdXRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0JykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoZXYgPT4gKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRhZ3NJbnB1dC5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzIGFzIE9ic2VydmFibGU8c3RyaW5nPixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICh0aGlzLm1vZGVsJCBhcyBPYnNlcnZhYmxlPHN0cmluZz4pLFxuICAgICAgKSxcbiAgICApLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3sgc3VibmV0Q2lkcnMgfSwgdXNlZElwcywgbmV0d29ya01vZGUsIGFkZGVkSXBzLCBpbnB1dFZhbHVlXSkgPT5cbiAgICAgIGdldElwQWRkcmVzc1N1Z2dlc3Rpb25zQnlDaWRycyhcbiAgICAgICAgc3VibmV0Q2lkcnMsXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBbXG4gICAgICAgICAgLi4udXNlZElwcyxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShhZGRlZElwcykgPyBhZGRlZElwcyA6IFthZGRlZElwc10uZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy5pc0NhbGljbyxcbiAgICAgICksXG4gICAgKSxcbiAgICBzdGFydFdpdGgoW10gYXMgc3RyaW5nW10pLFxuICAgIHNraXBFcnJvcihbXSBhcyBzdHJpbmdbXSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzVXRpbDogSzhzVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrVXRpbFNlcnZpY2U6IE5ldHdvcmtVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBAYmluZFxuICB2YWxpZGF0ZShjdHJsOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBjb25zdCBpcEFkZHJlc3M6IHN0cmluZyB8IHN0cmluZ1tdID0gY3RybC52YWx1ZTtcbiAgICByZXR1cm4gaXBBZGRyZXNzICYmICFBcnJheS5pc0FycmF5KGlwQWRkcmVzcylcbiAgICAgID8gdGhpcy51c2VkSXBzJC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuc2V0RXJyb3JzKHRoaXMudmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzcykpKSxcbiAgICAgICAgKVxuICAgICAgOiBvZih0aGlzLnNldEVycm9ycyhudWxsKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEVycm9ycyhlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICBjb25zdCBjb21iaW5lZEVycm9ycyA9IHRoaXMubXVsdGlwbGVcbiAgICAgID8geyAuLi50aGlzLmlwQWRkcmVzcz8uY29udHJvbC5lcnJvcnMsIC4uLmVycm9ycyB9IC8vIOWPr+iDveWtmOWcqOS8oOWFpeeahCBlcnJvcnNcbiAgICAgIDogZXJyb3JzO1xuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWx1ZXMoY29tYmluZWRFcnJvcnMpLmxlbmd0aFxuICAgICAgPyBjb21iaW5lZEVycm9yc1xuICAgICAgOiBudWxsO1xuICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLnNldEVycm9ycyh2YWxpZGF0aW9uRXJyb3JzKTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzczogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBzdWJuZXRDaWRycywgZ2F0ZXdheSB9ID0gdGhpcy4kc3VibmV0SW5mbygpO1xuXG4gICAgY29uc3QgaXBNb2RlID0gdGhpcy5hZGFwdElwTW9kZShpcEFkZHJlc3MpO1xuICAgIGNvbnN0IGlzSXBWNCA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQ7XG5cbiAgICBjb25zdCBqdWRnZUNpZHJzID0gc3VibmV0Q2lkcnMuZmlsdGVyKGNpZHIgPT4ge1xuICAgICAgY29uc3QgaXNJcFY2ID0gY2lkci5pbmNsdWRlcygnOicpO1xuICAgICAgcmV0dXJuIGlzSXBWNCA/ICFpc0lwVjYgOiBpc0lwVjY7XG4gICAgfSk7XG5cbiAgICBpZiAoc3VibmV0Q2lkcnMubGVuZ3RoICYmICFqdWRnZUNpZHJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBpcCBwYXR0ZXJuLCBub3QgYnJvYWRjYXN0IGlwLCBub3QgbmV0d29yayBpcFxuICAgIGlmIChcbiAgICAgICFpc0lwQWRkcmVzc1ZhbGlkKGlwQWRkcmVzcywgaXBNb2RlKSB8fFxuICAgICAganVkZ2VDaWRycy5zb21lKFxuICAgICAgICBjYWxpY29DaWRyID0+XG4gICAgICAgICAgaXNCcm9hZGNhc3RBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSB8fFxuICAgICAgICAgIGlzTmV0d29ya0FkZHIoaXBBZGRyZXNzLCBjYWxpY29DaWRyLCBpcE1vZGUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHY0R2F0ZXdheTogc3RyaW5nO1xuICAgIGxldCB2NkdhdGV3YXk6IHN0cmluZztcblxuICAgIGlmIChnYXRld2F5KSB7XG4gICAgICBjb25zdCBnYXRld2F5UGFydHMgPSBnYXRld2F5LnNwbGl0KCcsJyk7XG4gICAgICB2NEdhdGV3YXkgPSBnYXRld2F5UGFydHNbMF07XG4gICAgICB2NkdhdGV3YXkgPSBnYXRld2F5UGFydHNbMV07XG4gICAgfVxuXG4gICAgY29uc3QgaXBHYXRld2F5ID0gaXNJcFY0ID8gdjRHYXRld2F5IDogdjZHYXRld2F5O1xuXG4gICAgaWYgKFxuICAgICAgLy8gaHR0cHM6Ly9qaXJhLmFsYXVkYS5jbi9icm93c2UvQUNQLTEyMTM2P2ZvY3VzZWRDb21tZW50SWQ9MjE1NDYwJnBhZ2U9Y29tLmF0bGFzc2lhbi5qaXJhLnBsdWdpbi5zeXN0ZW0uaXNzdWV0YWJwYW5lbHMlM0Fjb21tZW50LXRhYnBhbmVsI2NvbW1lbnQtMjE1NDYwXG4gICAgICAoaXBHYXRld2F5ICYmIGlwQWRkcmVzc0VxdWFsKGlwR2F0ZXdheSwgaXBBZGRyZXNzLCBpcE1vZGUpKSB8fFxuICAgICAgKCF0aGlzLnNraXBPY2N1cGllZCAmJlxuICAgICAgICB0aGlzLiR1c2VkSXBzKCkuc29tZSh1c2VkSXAgPT5cbiAgICAgICAgICBpcEFkZHJlc3NFcXVhbCh1c2VkSXAsIGlwQWRkcmVzcywgaXBNb2RlKSxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9jY3VwaWVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBqdWRnZUNpZHJzLmxlbmd0aCAmJlxuICAgICAgIWp1ZGdlQ2lkcnMuc29tZShjaWRyID0+IGNpZHIgJiYgaXNCZWxvbmdDaWRyKGNpZHIsIGlwQWRkcmVzcywgaXBNb2RlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dF9vZl9yYW5nZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGFwdElwTW9kZShpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIHJldHVybiBhZGFwdElwTW9kZShcbiAgICAgIGlwQWRkcmVzcyxcbiAgICAgICF0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsICYmIHRoaXMuJG5ldHdvcmtNb2RlKCkgPT09IE5ldHdvcmtNb2RlLkRVQUxcbiAgICAgICAgPyBOZXR3b3JrTW9kZS5JUFY0XG4gICAgICAgIDogdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YXVpLWZvcm0taXRlbSBbd2lkdGhdPVwiZm9ybUl0ZW1XaWR0aFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyBsYWJlbCB8fCAoJ2lwX2FkZHJlc3MnIHwgdHJhbnNsYXRlKSB9fTwvbGFiZWw+XG4gIDxpbnB1dFxuICAgICpuZ0lmPVwiIW11bHRpcGxlXCJcbiAgICBhdWktaW5wdXRcbiAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICBbbmdNb2RlbF09XCJtb2RlbFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiZW1pdFZhbHVlKCRldmVudClcIlxuICAgICNpcEFkZHJlc3M9XCJuZ01vZGVsXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgKCdkaGNwX3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZSlcIlxuICAgIFthdWlBdXRvY29tcGxldGVdPVwic3VnZ2VzdGlvbnNcIlxuICAvPlxuICA8YXVpLXRhZ3MtaW5wdXRcbiAgICAqbmdJZj1cIm11bHRpcGxlXCJcbiAgICBjbGFzcz1cImZsZXgtMVwiXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgI3RhZ3NJbnB1dFxuICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJlbWl0VmFsdWUodW5pcSgkZXZlbnQpKVwiXG4gICAgI2lwQWRkcmVzcz1cIm5nTW9kZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAoJ2RoY3BfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlKVwiXG4gICAgW2F1aUF1dG9jb21wbGV0ZV09XCJzdWdnZXN0aW9uc1wiXG4gICAgW2lucHV0QXN5bmNWYWxpZGF0b3JdPVwidmFsaWRhdGVcIlxuICA+PC9hdWktdGFncy1pbnB1dD5cbiAgPGF1aS1hdXRvY29tcGxldGUgI3N1Z2dlc3Rpb25zPlxuICAgIDxhdWktc3VnZ2VzdGlvblxuICAgICAgKm5nRm9yPVwibGV0IGlwQWRkcmVzc1N1Z2dlc3Rpb24gb2YgaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmNcIlxuICAgICAgW3ZhbHVlXT1cImlwQWRkcmVzc1N1Z2dlc3Rpb25cIlxuICAgID5cbiAgICAgIHt7IGlwQWRkcmVzc1N1Z2dlc3Rpb24gfX1cbiAgICA8L2F1aS1zdWdnZXN0aW9uPlxuICAgIDxhdWktYXV0b2NvbXBsZXRlLXBsYWNlaG9sZGVyPlxuICAgICAge3tcbiAgICAgICAgKChpcEFkZHJlc3NTdWdnZXN0aW9ucyQgfCBhc3luYylcbiAgICAgICAgICA/ICdub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ2ZpeF9pcF9zaG91bGRfYmVsb25nX3RpcCcgfCB0cmFuc2xhdGU6IHsgY2lkcjogKGNpZHIkIHwgYXN5bmMpIH0pXG4gICAgfX1cbiAgPC9kaXY+XG48L2F1aS1mb3JtLWl0ZW0+XG4iXX0=
545
+ }], errorsMapper$: [], isReservedIp: [], validate: [] }); })();
546
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixedIpInputComponent, { className: "FixedIpInputComponent", filePath: "lib/components/fixed-ip/component.ts", lineNumber: 126 }); })();
547
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUVoQixvQkFBb0IsRUFDcEIsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsZUFBZSxFQUVmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLE9BQU8sR0FFUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FB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QVksTUFzQlosUUFBUTtrRkFyWkcscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBDb21tb25Gb3JtQ29udHJvbCxcbiAgRm9ybUl0ZW1XaWR0aCxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhZ01vZHVsZSxcbiAgVGFnc0lucHV0Q29tcG9uZW50LFxuICBUb29sdGlwTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEs4c0FwaVNlcnZpY2UsXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBPYnNlcnZhYmxlSW5wdXQsXG4gIHB1Ymxpc2hSZWYsXG4gIHNraXBFcnJvcixcbiAgbWF0Y2hFeHByZXNzaW9uc1RvU3RyaW5nLFxuICBOYW1lc3BhY2UsXG4gIGJpbmQsXG4gIFRSQU5TTEFURV9NT0RVTEUsXG4gIFJFU09VUkNFX1RZUEVTLFxuICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBTdHJpbmdNYXAsXG4gIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICBQdXJlUGlwZSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdNb2RlbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcSwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgZm9ya0pvaW4sXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmV0d29ya1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibmV0LCBTdWJuZXRJcCB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cy1leHBvcnRzJztcbmltcG9ydCB7IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMgfSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7XG4gIElQTW9kZSxcbiAgTmV0d29ya01vZGUsXG4gIGFkYXB0SXBNb2RlLFxuICBhZGFwdFN1Ym5ldENpZHJzLFxuICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMsXG4gIGlwQWRkcmVzc0VxdWFsLFxuICBpc0JlbG9uZ0NpZHIsXG4gIGlzQnJvYWRjYXN0QWRkcixcbiAgaXNJcEFkZHJlc3NWYWxpZCxcbiAgaXNOZXR3b3JrQWRkcixcbiAgZ2V0QWRkcmVzc0J1aWxkZXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL2NpZHItZXhwb3J0cyc7XG5pbXBvcnQge1xuICBDbHVzdGVyTmV0d29ya1R5cGUsXG4gIEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxufSBmcm9tICcuLi8uLi91dGlscy9zdWJuZXQtZXhwb3J0cyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2FjbC1maXhlZC1pcC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAndGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0Om5vdCg6bGFzdC1jaGlsZCkgYXVpLWZvcm0taXRlbSA6Om5nLWRlZXAgLmF1aS1mb3JtLWl0ZW0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGaXhlZElwSW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgUHVyZVBpcGUsXG4gICAgRTJlQXR0cmlidXRlQmluZGluZ0RpcmVjdGl2ZSxcbiAgICBFUlJPUlNfTUFQUEVSX01PRFVMRSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRhZ01vZHVsZSxcbiAgICBUUkFOU0xBVEVfTU9EVUxFLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGaXhlZElwSW5wdXRDb21wb25lbnRcbiAgZXh0ZW5kcyBDb21tb25Gb3JtQ29udHJvbDxzdHJpbmcgfCBzdHJpbmdbXT5cbiAgaW1wbGVtZW50cyBBc3luY1ZhbGlkYXRvclxue1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBjbHVzdGVyOiBzdHJpbmc7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGNsdXN0ZXIkITogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBuYW1lc3BhY2UkITogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG5ldHdvcmtUeXBlOiBDbHVzdGVyTmV0d29ya1R5cGU7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIG5ldHdvcmtUeXBlJCE6IE9ic2VydmFibGU8Q2x1c3Rlck5ldHdvcmtUeXBlPjtcblxuICBASW5wdXQoKVxuICBzdWJuZXQ6IFN1Ym5ldDtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgc3VibmV0JCE6IE9ic2VydmFibGU8U3VibmV0PjtcblxuICBASW5wdXQoKVxuICBsYWJlbDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgaGludDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGFkZG9uVGlwOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgbXVsdGlwbGU6IGJvb2xlYW47XG5cbiAgQFZpZXdDaGlsZCgnaXBBZGRyZXNzJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlwQWRkcmVzczogTmdNb2RlbDtcblxuICBAVmlld0NoaWxkKCd0YWdzSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFnc0lucHV0OiBUYWdzSW5wdXRDb21wb25lbnQ7XG5cbiAgQElucHV0KClcbiAgZm9ybUl0ZW1XaWR0aDogRm9ybUl0ZW1XaWR0aCA9IEZvcm1JdGVtV2lkdGguTWVkaXVtO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICB0YWdzSW5wdXQkITogT2JzZXJ2YWJsZTxUYWdzSW5wdXRDb21wb25lbnQ+O1xuXG4gIC8vIOiZmuaLn+acuuabtOaWsOaXtuaOkumZpOaOieiHqui6q1xuICBASW5wdXQoKVxuICBza2lwT2NjdXBpZWQgPSBmYWxzZTtcblxuICAvLyDnm67liY3lj4zmoIjlm7rlrpogSVAg5Y+q5pSv5oyBIElQdjRcbiAgQElucHV0KClcbiAgZW5hYmxlRml4SXBWNkZvckR1YWwgPSBmYWxzZTtcblxuICBASW5wdXQoKSBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnM7XG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBlcnJvcnMkITogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzPjtcblxuICBASW5wdXQoKSBlcnJvcnNNYXBwZXI6IFN0cmluZ01hcDtcbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGVycm9yc01hcHBlciQhOiBPYnNlcnZhYmxlPFN0cmluZ01hcD47XG5cbiAgdW5pcSA9IHVuaXE7XG4gIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGdldCBpc0NhbGljbygpIHtcbiAgICByZXR1cm4gdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLkNBTElDTztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZXNwYWNlUmVzb3VyY2UkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jbHVzdGVyJCxcbiAgICB0aGlzLm5hbWVzcGFjZSQsXG4gIF0pLnBpcGUoXG4gICAgZmlsdGVyKChbY2x1c3RlciwgbmFtZXNwYWNlXSkgPT4gISFjbHVzdGVyICYmICEhbmFtZXNwYWNlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBuYW1lc3BhY2VdKSA9PlxuICAgICAgdGhpcy5rOHNBcGkuZ2V0UmVzb3VyY2U8TmFtZXNwYWNlPih7XG4gICAgICAgIHR5cGU6IFJFU09VUkNFX1RZUEVTLk5BTUVTUEFDRSxcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgbmFtZTogbmFtZXNwYWNlLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrTW9kZSQgPSB0aGlzLmNsdXN0ZXIkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGNsdXN0ZXIgPT4gdGhpcy5uZXR3b3JrVXRpbFNlcnZpY2UuZ2V0TmV0d29ya01vZGUkKGNsdXN0ZXIpKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcmVhZG9ubHkgJG5ldHdvcmtNb2RlID0gdG9TaWduYWwodGhpcy5uZXR3b3JrTW9kZSQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0RGV0YWlscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmV0d29ya1R5cGUkLFxuICAgIHRoaXMuc3VibmV0JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuZXR3b3JrVHlwZV0pID0+ICEhY2x1c3RlciAmJiAhIW5ldHdvcmtUeXBlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBfbmV0d29ya1R5cGUsIHN1Ym5ldF0pID0+XG4gICAgICBzdWJuZXRcbiAgICAgICAgPyBvZih7XG4gICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgc3VibmV0czogW3N1Ym5ldF0sXG4gICAgICAgICAgICBzdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYz8uZ2F0ZXdheSxcbiAgICAgICAgICAgIGV4Y2x1ZGVJcHM6IHN1Ym5ldC5zcGVjPy5leGNsdWRlSXBzLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdGhpcy5pc0NhbGljb1xuICAgICAgICAgID8gdGhpcy5rOHNBcGlcbiAgICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldFtdKSxcbiAgICAgICAgICAgICAgICBtYXAoc3VibmV0cyA9PiAoe1xuICAgICAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgICAgICBzdWJuZXQ6IG51bGwgYXMgU3VibmV0LFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogJycsXG4gICAgICAgICAgICAgICAgICBleGNsdWRlSXBzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9mKHtcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgc3VibmV0czogW10gYXMgU3VibmV0W10sXG4gICAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICAgIGdhdGV3YXk6ICcnLFxuICAgICAgICAgICAgICBleGNsdWRlSXBzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJuZXRJbmZvJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMubmV0d29ya01vZGUkLFxuICAgIHRoaXMubmFtZXNwYWNlUmVzb3VyY2UkLnBpcGUoZmlsdGVyKEJvb2xlYW4pKSxcbiAgICB0aGlzLnN1Ym5ldERldGFpbHMkLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHsgY2x1c3Rlciwgc3VibmV0cywgc3VibmV0LCBnYXRld2F5LCBleGNsdWRlSXBzIH0sXG4gICAgICBdKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBzdWJuZXRDaWRyczogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyB0aGlzLm5ldHdvcmtVdGlsU2VydmljZS5nZXRDYWxpY29DaWRycyhcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgc3VibmV0cyxcbiAgICAgICAgICAgICAgICBuZXR3b3JrTW9kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGFkYXB0U3VibmV0Q2lkcnMoXG4gICAgICAgICAgICAgICAgc3VibmV0ID09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5rOHNVdGlsLmdldEFubm90YXRpb24obmFtZXNwYWNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NpZHInLFxuICAgICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiAoc3VibmV0LnNwZWM/LmNpZHJCbG9jayA/PyAnJyksXG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIHN1Ym5ldE5hbWU6XG4gICAgICAgICAgICBzdWJuZXQgPT0gbnVsbFxuICAgICAgICAgICAgICA/IHRoaXMuaXNDYWxpY29cbiAgICAgICAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRDYWxpY29TdWJuZXROYW1lcyhuYW1lc3BhY2UsIHRoaXMuJG5ldHdvcmtNb2RlKCkpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJylcbiAgICAgICAgICAgICAgICA6IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbG9naWNhbF9zd2l0Y2gnLFxuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluOiBLVUJFX09WTl9BTk5PVEFUSU9OX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogdGhpcy5rOHNVdGlsLmdldE5hbWUoc3VibmV0KSxcbiAgICAgICAgICBnYXRld2F5LFxuICAgICAgICAgIGV4Y2x1ZGVJcHM6IGV4Y2x1ZGVJcHMgfHwgKFtdIGFzIHN0cmluZ1tdKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubmV0d29ya1R5cGUgPT09IENsdXN0ZXJOZXR3b3JrVHlwZS5LVUJFX09WTiAmJlxuICAgICAgICAhc3VibmV0SW5mby5nYXRld2F5XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxuICAgICAgICAgIHN1Ym5ldEluZm8uc3VibmV0TmFtZS5zcGxpdCgnLCcpLm1hcChzdWJuZXROYW1lID0+XG4gICAgICAgICAgICB0aGlzLms4c0FwaVxuICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2U8U3VibmV0Pih7XG4gICAgICAgICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk4sXG4gICAgICAgICAgICAgICAgY2x1c3Rlcjogc3VibmV0SW5mby5jbHVzdGVyLFxuICAgICAgICAgICAgICAgIG5hbWU6IHN1Ym5ldE5hbWUsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5waXBlKHNraXBFcnJvcihudWxsIGFzIFN1Ym5ldCkpLFxuICAgICAgICAgICksXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAobGlzdCA9PiBsaXN0LmZpbHRlcihCb29sZWFuKSksXG4gICAgICAgICAgbWFwKHN1Ym5ldExpc3QgPT5cbiAgICAgICAgICAgIHN1Ym5ldExpc3QubGVuZ3RoXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgLi4uc3VibmV0SW5mbyxcbiAgICAgICAgICAgICAgICAgIGdhdGV3YXk6IHN1Ym5ldExpc3RcbiAgICAgICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW0uc3BlYz8uZ2F0ZXdheSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpLFxuICAgICAgICAgICAgICAgICAgZXhjbHVkZUlwczogdW5pcShcbiAgICAgICAgICAgICAgICAgICAgc3VibmV0TGlzdC5mbGF0TWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5leGNsdWRlSXBzKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHN1Ym5ldEluZm8sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihzdWJuZXRJbmZvKTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoc3VibmV0SW5mby5zdWJuZXRDaWRycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgICAgfVxuXG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHN1Ym5ldFxuICAgICAgcmV0dXJuIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgbmFtZTogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyBgZGVmYXVsdC1pcCR7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSA9PT0gJ2R1YWwnID8gJ3Y0JyA6IHRoaXMuJG5ldHdvcmtNb2RlKClcbiAgICAgICAgICAgICAgfS1pcHBvb2xgXG4gICAgICAgICAgICA6ICdvdm4tZGVmYXVsdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChzdWJuZXQgPT4gKHtcbiAgICAgICAgICAgIC4uLnN1Ym5ldEluZm8sXG4gICAgICAgICAgICBzdWJuZXRDaWRyczogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0LnNwZWMuY2lkckJsb2NrLFxuICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Ym5ldE5hbWU6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYy5nYXRld2F5LFxuICAgICAgICAgICAgZXhjbHVkZUlwczogc3VibmV0LnNwZWMuZXhjbHVkZUlwcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHJlYWRvbmx5ICRzdWJuZXRJbmZvID0gdG9TaWduYWwodGhpcy5zdWJuZXRJbmZvJCk7XG5cbiAgY2lkciQgPSB0aGlzLnN1Ym5ldEluZm8kLnBpcGUoXG4gICAgbWFwKHN1Ym5ldEluZm8gPT4gdW5pcShzdWJuZXRJbmZvPy5zdWJuZXRDaWRycykuam9pbign44CBJykpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5uZXJFcnJvcnNNYXBwZXIkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jaWRyJCxcbiAgICB0aGlzLnRyYW5zbGF0ZS5sb2NhbGUkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2NpZHJdKSA9PiAoe1xuICAgICAgcGF0dGVybjogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9wYXR0ZXJuX3RpcHMnLCB7XG4gICAgICAgIGlwTW9kZTogWydkdWFsJywgJ3Y0J10uaW5jbHVkZXModGhpcy4kbmV0d29ya01vZGUoKSkgPyAnSVB2NCcgOiAnSVB2NicsXG4gICAgICB9KSxcbiAgICAgIG9jY3VwaWVkOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2ZpeGVkX2lwX29jY3VwaWVkX3RpcHMnLCB7XG4gICAgICAgIGNpZHIsXG4gICAgICB9KSxcbiAgICAgIG91dF9vZl9yYW5nZTogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9vdXRfb2ZfcmFuZ2VfdGlwcycsIHtcbiAgICAgICAgY2lkcixcbiAgICAgIH0pLFxuICAgIH0pKSxcbiAgKTtcblxuICBjb21iaW5lZEVycm9yc01hcHBlciQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlubmVyRXJyb3JzTWFwcGVyJCxcbiAgICB0aGlzLmVycm9yc01hcHBlciQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5uZXJFcnJvcnNNYXBwZXIsIGVycm9yc01hcHBlcl0pID0+ICh7XG4gICAgICAuLi5pbm5lckVycm9yc01hcHBlcixcbiAgICAgIC4uLmVycm9yc01hcHBlcixcbiAgICB9KSksXG4gICk7XG5cbiAgaW5wdXRFcnJvcnMkID0gdGhpcy5lcnJvcnMkLnBpcGUoXG4gICAgdGFwKGVycm9ycyA9PiB7XG4gICAgICB0aGlzLnNldEVycm9ycyhlcnJvcnMpO1xuICAgICAgdGhpcy5pcEFkZHJlc3M/LmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgIH0pLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlZElwcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMuc3VibmV0SW5mbyQsXG4gICAgdGhpcy5tb2RlbCQucGlwZShmaXJzdCgpKSxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCB7IHN1Ym5ldE5hbWUsIGdhdGV3YXkgfSwgaXBdKSA9PlxuICAgICAgdGhpcy5rOHNBcGlcbiAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXRJcD4oe1xuICAgICAgICAgIHR5cGU6IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMuU1VCTkVUX0tVQkVfT1ZOX0lQLFxuICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgIGxhYmVsU2VsZWN0b3I6IG1hdGNoRXhwcmVzc2lvbnNUb1N0cmluZyhbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9zdWJuZXRgLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yOiAnaW4nLFxuICAgICAgICAgICAgICAgIHZhbHVlczogc3VibmV0TmFtZS5zcGxpdCgnLCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKHJlcyA9PiByZXMuaXRlbXMpLFxuICAgICAgICAgIHNraXBFcnJvcihbXSBhcyBTdWJuZXRJcFtdKSxcbiAgICAgICAgICBtYXAoc3VibmV0SXBzID0+XG4gICAgICAgICAgICBzdWJuZXRJcHMucmVkdWNlPHN0cmluZ1tdPigodXNlZElwcywgeyBzcGVjOiB7IGlwQWRkcmVzcyB9IH0pID0+IHtcbiAgICAgICAgICAgICAgaXBBZGRyZXNzLnNwbGl0KCcsJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXAgIT09IGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHVzZWRJcHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdXNlZElwcztcbiAgICAgICAgICAgIH0sIGdhdGV3YXkuc3BsaXQoJywnKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICApLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5ICR1c2VkSXBzID0gdG9TaWduYWwodGhpcy51c2VkSXBzJCk7XG5cbiAgaXBBZGRyZXNzU3VnZ2VzdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zdWJuZXRJbmZvJCxcbiAgICB0aGlzLnVzZWRJcHMkLFxuICAgIHRoaXMubmV0d29ya01vZGUkLFxuICAgIHRoaXMubW9kZWwkLFxuICAgIHRoaXMudGFnc0lucHV0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKHRhZ3NJbnB1dCA9PlxuICAgICAgICB0YWdzSW5wdXRcbiAgICAgICAgICA/IG1lcmdlKFxuICAgICAgICAgICAgICBmcm9tRXZlbnQodGFnc0lucHV0LmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQsICdpbnB1dCcpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ID0+IChldi50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0YWdzSW5wdXQuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcyBhcyBPYnNlcnZhYmxlPHN0cmluZz4sXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAodGhpcy5tb2RlbCQgYXMgT2JzZXJ2YWJsZTxzdHJpbmc+KSxcbiAgICAgICksXG4gICAgKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFt7IHN1Ym5ldENpZHJzIH0sIHVzZWRJcHMsIG5ldHdvcmtNb2RlLCBhZGRlZElwcywgaW5wdXRWYWx1ZV0pID0+XG4gICAgICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMoXG4gICAgICAgIHN1Ym5ldENpZHJzLFxuICAgICAgICBuZXR3b3JrTW9kZSxcbiAgICAgICAgW1xuICAgICAgICAgIC4uLnVzZWRJcHMsXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoYWRkZWRJcHMpID8gYWRkZWRJcHMgOiBbYWRkZWRJcHNdLmZpbHRlcihCb29sZWFuKSksXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0VmFsdWUsXG4gICAgICAgIHRoaXMuaXNDYWxpY28sXG4gICAgICApLFxuICAgICksXG4gICAgc3RhcnRXaXRoKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBza2lwRXJyb3IoW10gYXMgc3RyaW5nW10pLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzQXBpOiBLOHNBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1V0aWxTZXJ2aWNlOiBOZXR3b3JrVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBAYmluZFxuICBpc1Jlc2VydmVkSXAoaXA6IHN0cmluZywgZXhjbHVkZUlwczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBCdWlsZGVyID0gZ2V0QWRkcmVzc0J1aWxkZXIodGhpcy5hZGFwdElwTW9kZShpcCkpO1xuICAgIHJldHVybiBleGNsdWRlSXBzLnNvbWUoZXhjbHVkZUlwID0+IHtcbiAgICAgIGlmIChleGNsdWRlSXAuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gZXhjbHVkZUlwPy5zcGxpdCgnLi4nKTtcbiAgICAgICAgY29uc3QgX0J1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcih0aGlzLmFkYXB0SXBNb2RlKHN0YXJ0KSk7XG4gICAgICAgIGNvbnN0IF9zdGFydEFkZHJlc3MgPSBuZXcgX0J1aWxkZXIoc3RhcnQpLmJpZ0ludGVnZXIoKTtcbiAgICAgICAgY29uc3QgX2VuZEFkZHJlc3MgPSBuZXcgX0J1aWxkZXIoZW5kKS5iaWdJbnRlZ2VyKCk7XG4gICAgICAgIGNvbnN0IF9pcCA9IG5ldyBCdWlsZGVyKGlwKS5iaWdJbnRlZ2VyKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgX3N0YXJ0QWRkcmVzcy5jb21wYXJlVG8oX2lwKSA8PSAwICYmIF9pcC5jb21wYXJlVG8oX2VuZEFkZHJlc3MpIDw9IDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleGNsdWRlSXAgPT09IGlwO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIEBiaW5kXG4gIHZhbGlkYXRlKGN0cmw6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIGNvbnN0IGlwQWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10gPSBjdHJsLnZhbHVlO1xuICAgIHJldHVybiBpcEFkZHJlc3MgJiYgIUFycmF5LmlzQXJyYXkoaXBBZGRyZXNzKVxuICAgICAgPyB0aGlzLnVzZWRJcHMkLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5zZXRFcnJvcnModGhpcy52YWxpZGF0ZUZpeGVkSXAoaXBBZGRyZXNzKSkpLFxuICAgICAgICApXG4gICAgICA6IG9mKHRoaXMuc2V0RXJyb3JzKG51bGwpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXJyb3JzKGVycm9yczogVmFsaWRhdGlvbkVycm9ycykge1xuICAgIGNvbnN0IGNvbWJpbmVkRXJyb3JzID0gdGhpcy5tdWx0aXBsZVxuICAgICAgPyB7IC4uLnRoaXMuZXJyb3JzLCAuLi5lcnJvcnMgfSAvLyDlj6/og73lrZjlnKjkvKDlhaXnmoQgZXJyb3JzXG4gICAgICA6IGVycm9ycztcbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsdWVzKGNvbWJpbmVkRXJyb3JzKS5sZW5ndGhcbiAgICAgID8gY29tYmluZWRFcnJvcnNcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmlwQWRkcmVzcz8uY29udHJvbC5zZXRFcnJvcnModmFsaWRhdGlvbkVycm9ycyk7XG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRml4ZWRJcChpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIGNvbnN0IHsgc3VibmV0Q2lkcnMsIGdhdGV3YXkgfSA9IHRoaXMuJHN1Ym5ldEluZm8oKTtcblxuICAgIGNvbnN0IGlwTW9kZSA9IHRoaXMuYWRhcHRJcE1vZGUoaXBBZGRyZXNzKTtcbiAgICBjb25zdCBpc0lwVjQgPSBpcE1vZGUgPT09IElQTW9kZS5JUFY0O1xuXG4gICAgY29uc3QganVkZ2VDaWRycyA9IHN1Ym5ldENpZHJzLmZpbHRlcihjaWRyID0+IHtcbiAgICAgIGNvbnN0IGlzSXBWNiA9IGNpZHIuaW5jbHVkZXMoJzonKTtcbiAgICAgIHJldHVybiBpc0lwVjQgPyAhaXNJcFY2IDogaXNJcFY2O1xuICAgIH0pO1xuXG4gICAgaWYgKHN1Ym5ldENpZHJzLmxlbmd0aCAmJiAhanVkZ2VDaWRycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdHRlcm46IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGludmFsaWQgaXAgcGF0dGVybiwgbm90IGJyb2FkY2FzdCBpcCwgbm90IG5ldHdvcmsgaXBcbiAgICBpZiAoXG4gICAgICAhaXNJcEFkZHJlc3NWYWxpZChpcEFkZHJlc3MsIGlwTW9kZSkgfHxcbiAgICAgIGp1ZGdlQ2lkcnMuc29tZShcbiAgICAgICAgY2FsaWNvQ2lkciA9PlxuICAgICAgICAgIGlzQnJvYWRjYXN0QWRkcihpcEFkZHJlc3MsIGNhbGljb0NpZHIsIGlwTW9kZSkgfHxcbiAgICAgICAgICBpc05ldHdvcmtBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdHRlcm46IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCB2NEdhdGV3YXk6IHN0cmluZztcbiAgICBsZXQgdjZHYXRld2F5OiBzdHJpbmc7XG5cbiAgICBpZiAoZ2F0ZXdheSkge1xuICAgICAgY29uc3QgZ2F0ZXdheVBhcnRzID0gZ2F0ZXdheS5zcGxpdCgnLCcpO1xuICAgICAgdjRHYXRld2F5ID0gZ2F0ZXdheVBhcnRzWzBdO1xuICAgICAgdjZHYXRld2F5ID0gZ2F0ZXdheVBhcnRzWzFdO1xuICAgIH1cblxuICAgIGNvbnN0IGlwR2F0ZXdheSA9IGlzSXBWNCA/IHY0R2F0ZXdheSA6IHY2R2F0ZXdheTtcblxuICAgIGlmIChcbiAgICAgIC8vIGh0dHBzOi8vamlyYS5hbGF1ZGEuY24vYnJvd3NlL0FDUC0xMjEzNj9mb2N1c2VkQ29tbWVudElkPTIxNTQ2MCZwYWdlPWNvbS5hdGxhc3NpYW4uamlyYS5wbHVnaW4uc3lzdGVtLmlzc3VldGFicGFuZWxzJTNBY29tbWVudC10YWJwYW5lbCNjb21tZW50LTIxNTQ2MFxuICAgICAgKGlwR2F0ZXdheSAmJiBpcEFkZHJlc3NFcXVhbChpcEdhdGV3YXksIGlwQWRkcmVzcywgaXBNb2RlKSkgfHxcbiAgICAgICghdGhpcy5za2lwT2NjdXBpZWQgJiZcbiAgICAgICAgdGhpcy4kdXNlZElwcygpLnNvbWUodXNlZElwID0+XG4gICAgICAgICAgaXBBZGRyZXNzRXF1YWwodXNlZElwLCBpcEFkZHJlc3MsIGlwTW9kZSksXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvY2N1cGllZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAganVkZ2VDaWRycy5sZW5ndGggJiZcbiAgICAgICFqdWRnZUNpZHJzLnNvbWUoY2lkciA9PiBjaWRyICYmIGlzQmVsb25nQ2lkcihjaWRyLCBpcEFkZHJlc3MsIGlwTW9kZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRfb2ZfcmFuZ2U6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRhcHRJcE1vZGUoaXBBZGRyZXNzOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYWRhcHRJcE1vZGUoXG4gICAgICBpcEFkZHJlc3MsXG4gICAgICAhdGhpcy5lbmFibGVGaXhJcFY2Rm9yRHVhbCAmJiB0aGlzLiRuZXR3b3JrTW9kZSgpID09PSBOZXR3b3JrTW9kZS5EVUFMXG4gICAgICAgID8gTmV0d29ya01vZGUuSVBWNFxuICAgICAgICA6IHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgKTtcbiAgfVxufVxuIiwiPGF1aS1mb3JtLWl0ZW0gW3dpZHRoXT1cImZvcm1JdGVtV2lkdGhcIj5cbiAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3tcbiAgICBsYWJlbCB8fCAoJ25ldHdvcmsuaXBfYWRkcmVzcycgfCB0cmFuc2xhdGUpXG4gIH19PC9sYWJlbD5cbiAgPGlucHV0XG4gICAgKm5nSWY9XCIhbXVsdGlwbGVcIlxuICAgIGF1aS1pbnB1dFxuICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJlbWl0VmFsdWUoJGV2ZW50KVwiXG4gICAgI2lwQWRkcmVzcz1cIm5nTW9kZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAoJ2RoY3BfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlKVwiXG4gICAgW2F1aUF1dG9jb21wbGV0ZV09XCJzdWdnZXN0aW9uc1wiXG4gIC8+XG4gIDxhdWktdGFncy1pbnB1dFxuICAgICpuZ0lmPVwibXVsdGlwbGVcIlxuICAgIGNsYXNzPVwiZmxleC0xXCJcbiAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAjdGFnc0lucHV0XG4gICAgW25nTW9kZWxdPVwibW9kZWxcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImVtaXRWYWx1ZSh1bmlxKCRldmVudCkpXCJcbiAgICAjaXBBZGRyZXNzPVwibmdNb2RlbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICgnZGhjcF9wbGFjZWhvbGRlcicgfCB0cmFuc2xhdGUpXCJcbiAgICBbYXVpQXV0b2NvbXBsZXRlXT1cInN1Z2dlc3Rpb25zXCJcbiAgICBbaW5wdXRBc3luY1ZhbGlkYXRvcl09XCJ2YWxpZGF0ZVwiXG4gID48L2F1aS10YWdzLWlucHV0PlxuICA8YXVpLWF1dG9jb21wbGV0ZSAjc3VnZ2VzdGlvbnM+XG4gICAgPGF1aS1zdWdnZXN0aW9uXG4gICAgICAqbmdGb3I9XCJsZXQgaXBBZGRyZXNzU3VnZ2VzdGlvbiBvZiBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgfCBhc3luY1wiXG4gICAgICBbdmFsdWVdPVwiaXBBZGRyZXNzU3VnZ2VzdGlvblwiXG4gICAgPlxuICAgICAge3sgaXBBZGRyZXNzU3VnZ2VzdGlvbiB9fVxuICAgICAgPGF1aS10YWdcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpcEFkZHJlc3NTdWdnZXN0aW9uIHwgcHVyZTogaXNSZXNlcnZlZElwIDogJHN1Ym5ldEluZm8oKS5leGNsdWRlSXBzXG4gICAgICAgIFwiXG4gICAgICAgIFtib3JkZXJdPVwidHJ1ZVwiXG4gICAgICAgIFtzaXplXT1cIidtaW5pJ1wiXG4gICAgICAgIHR5cGU9XCJpbmZvXCJcbiAgICAgID5cbiAgICAgICAge3sgJ25ldHdvcmsucmVzZXJ2ZWRfaXAnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS10YWc+XG4gICAgPC9hdWktc3VnZ2VzdGlvbj5cbiAgICA8YXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgICAgIHt7XG4gICAgICAgICgoaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmMpXG4gICAgICAgICAgPyAnbmV0d29yay5ub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ25ldHdvcmsuZml4X2lwX3Nob3VsZF9iZWxvbmdfdGlwJ1xuICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGNpZHI6IChjaWRyJCB8IGFzeW5jKSB9KVxuICAgIH19XG4gIDwvZGl2PlxuPC9hdWktZm9ybS1pdGVtPlxuIl19