ca-components 1.0.77 → 1.0.80

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 (89) hide show
  1. package/esm2022/lib/ca-components.module.mjs +16 -4
  2. package/esm2022/lib/components/ca-activity-log-list/ca-activity-log-list.component.mjs +1 -1
  3. package/esm2022/lib/components/ca-app-tooltip-v2/ca-app-tooltip-v2.component.mjs +1 -1
  4. package/esm2022/lib/components/ca-filters/components/ca-dispatcher-filter/ca-dispatcher-filter.component.mjs +2 -2
  5. package/esm2022/lib/components/ca-filters/components/ca-money-filter/ca-money-filter.component.mjs +2 -2
  6. package/esm2022/lib/components/ca-filters/components/ca-state-filter/ca-state-filter.component.mjs +2 -2
  7. package/esm2022/lib/components/ca-filters/components/ca-trailer-type-filter/ca-trailer-type-filter.component.mjs +1 -1
  8. package/esm2022/lib/components/ca-filters/components/ca-truck-type-filter/ca-truck-type-filter.component.mjs +1 -1
  9. package/esm2022/lib/components/ca-filters/components/ca-user-filter/ca-user-filter.component.mjs +2 -2
  10. package/esm2022/lib/components/ca-input/base-classes/ca-input-base-helpres.mjs +237 -0
  11. package/esm2022/lib/components/ca-input/base-classes/ca-input-base.mjs +1020 -0
  12. package/esm2022/lib/components/ca-input/base-classes/ca-input-event-manager.mjs +24 -0
  13. package/esm2022/lib/components/ca-input/ca-input.component.mjs +53 -163
  14. package/esm2022/lib/components/ca-input/components/ca-input-clear/ca-input-clear.component.mjs +4 -4
  15. package/esm2022/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.mjs +11 -17
  16. package/esm2022/lib/components/ca-input/config/ca-input.config.mjs +1 -1
  17. package/esm2022/lib/components/ca-input/directives/caps-lock.directive.mjs +50 -0
  18. package/esm2022/lib/components/ca-input/directives/index.mjs +5 -1
  19. package/esm2022/lib/components/ca-input/directives/input-max-value.directive.mjs +53 -0
  20. package/esm2022/lib/components/ca-input/directives/min-max-value.directive.mjs +1 -1
  21. package/esm2022/lib/components/ca-input/directives/price_format.directive.mjs +41 -0
  22. package/esm2022/lib/components/ca-input/directives/restrict-input.directive.mjs +98 -0
  23. package/esm2022/lib/components/ca-input/enums/input-text-transform.enum.mjs +9 -0
  24. package/esm2022/lib/components/ca-input/input-test/input-test.component.mjs +175 -0
  25. package/esm2022/lib/components/ca-input/pipes/input-container-class.pipe.mjs +16 -16
  26. package/esm2022/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.mjs +1 -1
  27. package/esm2022/lib/components/ca-input/pipes/input-error.pipe.mjs +18 -15
  28. package/esm2022/lib/components/ca-input/pipes/input-pattern.pipe.mjs +322 -0
  29. package/esm2022/lib/components/ca-input/services/index.mjs +1 -2
  30. package/esm2022/lib/components/ca-input/utils/constants/input-constants.mjs +102 -1
  31. package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +2 -2
  32. package/esm2022/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +809 -0
  33. package/esm2022/lib/components/ca-input-dropdown/ca-input-dropdown.component.mjs +18 -18
  34. package/esm2022/lib/components/ca-map/ca-map.component.mjs +137 -210
  35. package/esm2022/lib/components/ca-map/enums/google-map.enum.mjs +2 -1
  36. package/esm2022/lib/components/ca-map/enums/map-marker-string.enum.mjs +2 -1
  37. package/esm2022/lib/components/ca-map/models/map.model.mjs +1 -1
  38. package/esm2022/lib/components/ca-map/utils/constants/index.mjs +2 -1
  39. package/esm2022/lib/components/ca-map/utils/constants/map-marker-icons.constants.mjs +119 -0
  40. package/esm2022/lib/components/ca-map/utils/constants/map-options.constants.mjs +1 -2
  41. package/esm2022/lib/components/ca-map/utils/helpers/map-marker-icon.helper.mjs +50 -12
  42. package/esm2022/lib/components/ca-map/utils/services/index.mjs +2 -0
  43. package/esm2022/lib/components/ca-map/utils/services/map-marker-icon.service.mjs +137 -0
  44. package/esm2022/lib/components/ca-map-dropdown/ca-map-dropdown.component.mjs +25 -11
  45. package/esm2022/lib/components/ca-progress-bar/ca-progress-bar.component.mjs +15 -15
  46. package/esm2022/lib/components/ca-rating-review/ca-rating-review.component.mjs +2 -2
  47. package/esm2022/lib/components/ca-rating-review/components/ca-ratings-reviews-popup/ca-ratings-reviews-popup.component.mjs +1 -1
  48. package/esm2022/lib/components/ca-upload-files/components/ca-upload-file/ca-upload-file.component.mjs +1 -1
  49. package/esm2022/lib/constants/map.constant.mjs +131 -131
  50. package/esm2022/public-api.mjs +4 -1
  51. package/fesm2022/ca-components.mjs +10387 -9642
  52. package/fesm2022/ca-components.mjs.map +1 -1
  53. package/lib/ca-components.module.d.ts +32 -30
  54. package/lib/components/ca-input/base-classes/ca-input-base-helpres.d.ts +29 -0
  55. package/lib/components/ca-input/base-classes/ca-input-base.d.ts +82 -0
  56. package/lib/components/ca-input/base-classes/ca-input-event-manager.d.ts +16 -0
  57. package/lib/components/ca-input/ca-input.component.d.ts +30 -48
  58. package/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.d.ts +3 -7
  59. package/lib/components/ca-input/config/ca-input.config.d.ts +10 -1
  60. package/lib/components/ca-input/directives/caps-lock.directive.d.ts +14 -0
  61. package/lib/components/ca-input/directives/index.d.ts +4 -0
  62. package/lib/components/ca-input/directives/input-max-value.directive.d.ts +12 -0
  63. package/lib/components/ca-input/directives/price_format.directive.d.ts +11 -0
  64. package/lib/components/ca-input/directives/restrict-input.directive.d.ts +15 -0
  65. package/lib/components/ca-input/enums/input-text-transform.enum.d.ts +6 -0
  66. package/lib/components/ca-input/input-test/input-test.component.d.ts +47 -0
  67. package/lib/components/ca-input/pipes/input-container-class.pipe.d.ts +3 -3
  68. package/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.d.ts +1 -1
  69. package/lib/components/ca-input/pipes/input-pattern.pipe.d.ts +25 -0
  70. package/lib/components/ca-input/services/index.d.ts +0 -1
  71. package/lib/components/ca-input/utils/constants/input-constants.d.ts +11 -0
  72. package/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +99 -0
  73. package/lib/components/ca-map/ca-map.component.d.ts +22 -25
  74. package/lib/components/ca-map/enums/google-map.enum.d.ts +2 -1
  75. package/lib/components/ca-map/enums/map-marker-string.enum.d.ts +2 -1
  76. package/lib/components/ca-map/models/map.model.d.ts +8 -3
  77. package/lib/components/ca-map/utils/constants/index.d.ts +1 -0
  78. package/lib/components/ca-map/utils/constants/map-marker-icons.constants.d.ts +6 -0
  79. package/lib/components/ca-map/utils/helpers/map-marker-icon.helper.d.ts +2 -0
  80. package/lib/components/ca-map/utils/services/index.d.ts +1 -0
  81. package/lib/components/ca-map/utils/services/map-marker-icon.service.d.ts +23 -0
  82. package/lib/components/ca-map-dropdown/ca-map-dropdown.component.d.ts +5 -3
  83. package/lib/components/ca-progress-bar/ca-progress-bar.component.d.ts +3 -1
  84. package/package.json +1 -1
  85. package/public-api.d.ts +3 -0
  86. package/esm2022/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +0 -100
  87. package/esm2022/lib/components/ca-input/services/ca-input-state.service.mjs +0 -2173
  88. package/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +0 -48
  89. package/lib/components/ca-input/services/ca-input-state.service.d.ts +0 -196
@@ -0,0 +1,1020 @@
1
+ import { InputCommandsAction, InputCommandsType, InputConfigNameStringEnum, InputStringEnum, } from '../enums';
2
+ import moment from 'moment';
3
+ import { InputConstants } from '../utils/constants';
4
+ import { InputSvgRoutes } from '../utils';
5
+ import { CaInputBaseHelpersComponent } from '../base-classes/ca-input-base-helpres';
6
+ export class CaInputBaseComponent extends CaInputBaseHelpersComponent {
7
+ constructor(cdRef, thousandSeparatorPipe) {
8
+ super();
9
+ this.cdRef = cdRef;
10
+ this.thousandSeparatorPipe = thousandSeparatorPipe;
11
+ // #endregion
12
+ this.inputSelection = false;
13
+ this.hasDecimalIndex = -1;
14
+ this.lastCursorSpacePosition = 0;
15
+ // Dropdown
16
+ this.showDateInput = false;
17
+ this.dateTimeInputDate = new Date();
18
+ // Number of spaces
19
+ this.numberOfConsecutivelySpaces = 0;
20
+ }
21
+ transformText(value, isPaste) {
22
+ this.cursorInputPosition = this.input.nativeElement.selectionStart;
23
+ // Handle paste operation
24
+ if (isPaste) {
25
+ this.handlePaste(value);
26
+ }
27
+ else if (value) {
28
+ this.superControl.control?.patchValue(value, { emitEvent: false });
29
+ }
30
+ this.applyTextTransformation();
31
+ // Apply thousand and price separators if configured
32
+ this.applyThousandSeparator();
33
+ this.applyPriceSeparator();
34
+ this.customValidation(value);
35
+ this.sanitizeConsecutiveSpaces();
36
+ this.removeLeadingZero();
37
+ }
38
+ handlePaste(value) {
39
+ let mainValue = this.superControl.control?.value;
40
+ if (!this.inputSelection) {
41
+ mainValue += value;
42
+ this.limitInputLength();
43
+ }
44
+ else {
45
+ mainValue = value;
46
+ this.inputSelection = false;
47
+ }
48
+ // Delete spaces on begin and end
49
+ mainValue = mainValue.trim();
50
+ this.superControl.control?.patchValue(mainValue, {
51
+ emitEvent: false,
52
+ });
53
+ }
54
+ limitInputLength() {
55
+ if (this.superControl.control?.value.length >
56
+ this._inputConfig.maxLength) {
57
+ this.superControl.control?.patchValue(this.superControl.control?.value.substring(0, this._inputConfig.maxLength), {
58
+ emitEvent: false,
59
+ });
60
+ }
61
+ }
62
+ applyTextTransformation() {
63
+ let { value } = this.input.nativeElement;
64
+ switch (this._inputConfig.textTransform) {
65
+ case InputStringEnum.CAPITALIZE:
66
+ value =
67
+ value.charAt(0).toUpperCase() +
68
+ value.substring(1).toLowerCase();
69
+ break;
70
+ case InputStringEnum.UPPERCASE:
71
+ value = value.toLocaleUpperCase('en-US');
72
+ break;
73
+ case InputStringEnum.CAPITALIZED_CASE:
74
+ const capitalizedCaseWords = value.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
75
+ value = capitalizedCaseWords;
76
+ break;
77
+ default:
78
+ break;
79
+ }
80
+ this.superControl.control?.patchValue(value, {
81
+ emitEvent: false,
82
+ });
83
+ }
84
+ applyThousandSeparator() {
85
+ const controlValue = this.superControl.control?.value;
86
+ if (this._inputConfig.thousandSeparator && controlValue) {
87
+ if (this.isAllZeros(controlValue)) {
88
+ this.superControl.control?.patchValue('0', {
89
+ emitEvent: false,
90
+ });
91
+ return;
92
+ }
93
+ if (this.superControl.control?.value.toString()) {
94
+ this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
95
+ emitEvent: false,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ applyPriceSeparator() {
101
+ const controlValue = this.superControl.control?.value;
102
+ if (this._inputConfig.priceSeparator && controlValue) {
103
+ // 0. Don't allow 0 as first character
104
+ if (this.isAllZeros(controlValue)) {
105
+ this.superControl.control?.patchValue('0', {
106
+ emitEvent: false,
107
+ });
108
+ return;
109
+ }
110
+ // 4. If user set dot
111
+ if (controlValue.includes('.')) {
112
+ this.formatWithDecimal();
113
+ }
114
+ else {
115
+ // 5. If user doesn't set dot
116
+ this.formatWithoutDecimal();
117
+ }
118
+ this.setInputCursorPosition();
119
+ }
120
+ }
121
+ setInputCursorPosition() {
122
+ if (this.superControl.control?.value) {
123
+ this.timeoutCleaner = setTimeout(() => {
124
+ this.input.nativeElement.setSelectionRange(this.cursorInputPosition +
125
+ (this.superControl.control?.value.indexOf('.') === -1
126
+ ? 1
127
+ : 0), this.cursorInputPosition +
128
+ (this.superControl.control?.value.indexOf('.') === -1
129
+ ? 1
130
+ : 0));
131
+ }, 0);
132
+ }
133
+ else {
134
+ // if we have ${n}00000 and we delete N then we got undefined instead of dot
135
+ this.superControl.control?.patchValue(0, {
136
+ emitEvent: false,
137
+ });
138
+ }
139
+ }
140
+ formatWithDecimal() {
141
+ const controlValue = this.superControl.control?.value;
142
+ // 4.1. Check for Dot position
143
+ this.hasDecimalIndex = controlValue.indexOf('.');
144
+ this.originPriceSeparatorLimit =
145
+ this._inputConfig.priceSeparatorLimitation + 3;
146
+ // 4.2. Divide number into decimal and integer parts
147
+ let integerPart = this.thousandSeparatorPipe.transform(controlValue
148
+ .slice(0, this.hasDecimalIndex)
149
+ .slice(0, this._inputConfig.priceSeparatorLimitation));
150
+ let decimalPart = controlValue.slice(this.hasDecimalIndex + 1);
151
+ if (!integerPart) {
152
+ integerPart = '0';
153
+ }
154
+ // 4.4. Get only two numbers of the decimal part
155
+ decimalPart = decimalPart.slice(0, 2);
156
+ if (decimalPart) {
157
+ // 4.5. Set formatted number
158
+ this.superControl.control?.patchValue(`${integerPart}.${decimalPart}`, {
159
+ emitEvent: false,
160
+ });
161
+ this.hasDecimalIndex =
162
+ this.superControl.control?.value.indexOf('.');
163
+ }
164
+ }
165
+ customValidation(value) {
166
+ const configName = this._inputConfig.name.toLowerCase();
167
+ if (configName === InputStringEnum.YEAR &&
168
+ parseInt(value) > parseInt(moment().add(1, 'year').format('YYYY'))) {
169
+ this.superControl.control?.setErrors({ invalid: true });
170
+ }
171
+ if (configName === InputStringEnum.MONTHS) {
172
+ if (parseInt(value) < 1 || parseInt(value) > 12) {
173
+ this.superControl.control?.setErrors({ invalid: true });
174
+ }
175
+ else {
176
+ this.superControl.control?.setErrors(null);
177
+ }
178
+ }
179
+ if (configName === InputStringEnum.AXLES) {
180
+ if (parseInt(value) < 1 || parseInt(value) > 17) {
181
+ if (parseInt(value) < 1) {
182
+ this.superControl.control?.setErrors({ min: 1 });
183
+ }
184
+ else if (parseInt(value) > 17) {
185
+ this.superControl.control?.setErrors({ max: 17 });
186
+ }
187
+ }
188
+ else {
189
+ this.superControl.control?.setErrors(null);
190
+ }
191
+ }
192
+ if (configName === InputStringEnum.FULL_NAME &&
193
+ this.superControl.control?.value) {
194
+ this.capitalizeWords();
195
+ }
196
+ }
197
+ formatWithoutDecimal() {
198
+ const controlValue = this.superControl.control?.value;
199
+ this.hasDecimalIndex = -1;
200
+ if (controlValue.indexOf('.') === -1) {
201
+ // Transform value with thousand separator
202
+ this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
203
+ emitEvent: false,
204
+ });
205
+ // Limit validation
206
+ this.originPriceSeparatorLimit =
207
+ this._inputConfig.priceSeparatorLimitation;
208
+ // Cut value
209
+ if (controlValue) {
210
+ this.superControl.control?.patchValue(controlValue.slice(0, this._inputConfig.priceSeparatorLimitation), {
211
+ emitEvent: false,
212
+ });
213
+ }
214
+ // Transform value again after cutting
215
+ this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue), {
216
+ emitEvent: false,
217
+ });
218
+ }
219
+ }
220
+ sanitizeConsecutiveSpaces() {
221
+ const configNames = InputConstants.textTransformConfigNames;
222
+ if (configNames.includes(this._inputConfig.name.toLowerCase())) {
223
+ const sanitizedInput = this.input.nativeElement.value.replace(/\s{2,}/g, ' ');
224
+ if (sanitizedInput !== this.input.nativeElement.value) {
225
+ this.superControl.control?.patchValue(sanitizedInput, {
226
+ emitEvent: false,
227
+ });
228
+ this.setCursorForSanitizedInput();
229
+ }
230
+ }
231
+ }
232
+ setCursorForSanitizedInput() {
233
+ this.timeoutCleaner = setTimeout(() => {
234
+ this.input.nativeElement.setSelectionRange(this.lastCursorSpacePosition - 1, this.lastCursorSpacePosition - 1);
235
+ });
236
+ }
237
+ removeLeadingZero() {
238
+ if (this._inputConfig.removeLeadingZero) {
239
+ const currentValue = this.superControl.control?.value;
240
+ if (!currentValue) {
241
+ this.superControl.control?.patchValue('', {
242
+ emitEvent: false,
243
+ });
244
+ this.superControl.control?.setErrors(null);
245
+ return;
246
+ }
247
+ if (this._inputConfig.negativeLeadingZero) {
248
+ const isNegative = currentValue.startsWith('-');
249
+ if (isNegative) {
250
+ // Get the part after the negative sign
251
+ const numberPart = currentValue.slice(1);
252
+ // Remove leading zeros
253
+ const transformedNumber = numberPart.replace(/^0+(?=\d)/, '');
254
+ this.superControl.control?.patchValue(`-${transformedNumber}`, {
255
+ emitEvent: false,
256
+ });
257
+ }
258
+ else {
259
+ this.superControl.control?.patchValue(currentValue.replace(/^0+(?=\d)/, ''), {
260
+ emitEvent: false,
261
+ });
262
+ }
263
+ }
264
+ else {
265
+ this.superControl.control?.patchValue(currentValue.replace(/^0+(?!$)/, ''), {
266
+ emitEvent: false,
267
+ });
268
+ }
269
+ }
270
+ }
271
+ writeValueBase(obj) {
272
+ this.setChangeInput.next(obj);
273
+ if (!this._inputConfig.priceSeparator) {
274
+ this.input.nativeElement.value = obj;
275
+ }
276
+ }
277
+ capitalizeWords() {
278
+ const words = this.superControl.control?.value.split(' ');
279
+ const capitalized = words.map((word) => {
280
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
281
+ });
282
+ this.superControl.control?.patchValue(capitalized.join(' '), {
283
+ emitEvent: false,
284
+ });
285
+ }
286
+ isAllZeros(value) {
287
+ return value.split('').every((char) => char === '0');
288
+ }
289
+ onBlurBase(event) {
290
+ // DropDown Label
291
+ if (this._inputConfig.dropdownLabel && !this.isEditInput)
292
+ this._inputConfig.placeholderIcon = InputSvgRoutes.dynamicLabelSvg;
293
+ // Edit Input
294
+ if (this.isEditInput) {
295
+ this.superControl.control?.setErrors({ invalid: true });
296
+ return;
297
+ }
298
+ // Datepicker;
299
+ if (this.preventBlur) {
300
+ this.preventBlur = false;
301
+ return;
302
+ }
303
+ // Bank
304
+ if (this._inputConfig.name ===
305
+ InputConfigNameStringEnum.INPUT_DROPDOWN_BANK_NAME)
306
+ this._inputConfig.blackInput = false;
307
+ // Price Separator - remove dot on focus out
308
+ if (this._inputConfig.priceSeparator &&
309
+ this.superControl.control?.value &&
310
+ this.superControl.control?.value?.toString().indexOf('.') >= 0) {
311
+ // 4.1. Check for Dot position
312
+ this.hasDecimalIndex = this.superControl.control?.value
313
+ .toString()
314
+ .indexOf('.');
315
+ let integerPart = this.thousandSeparatorPipe.transform(this.superControl.control?.value
316
+ .slice(0, this.hasDecimalIndex)
317
+ .slice(0, this._inputConfig.priceSeparatorLimitation));
318
+ let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
319
+ // 4.4. Get only two numbers of decimal part
320
+ decimalPart = decimalPart.slice(0, 2);
321
+ if (!decimalPart) {
322
+ this.hasDecimalIndex = -1;
323
+ this.superControl.control?.patchValue(integerPart);
324
+ this.numberOfPoints = 0;
325
+ }
326
+ }
327
+ // Dropdown
328
+ if (this._inputConfig.isDropdown || this._inputConfig.dropdownLabel) {
329
+ this.blurOnDropDownArrow();
330
+ }
331
+ // Normal, without dropdown
332
+ else {
333
+ let selection = window.getSelection();
334
+ selection?.removeAllRanges();
335
+ // Input Commands
336
+ if (this._inputConfig.commands)
337
+ this.blurOnCommands();
338
+ // Password
339
+ if (this._inputConfig.type === 'password')
340
+ this.blurOnPassword();
341
+ // Normal focus out
342
+ else
343
+ this.isFocusInput = false;
344
+ }
345
+ this.setBlurInput.next(true);
346
+ this.isTouchedInput = true;
347
+ }
348
+ blurOnDropDownArrow() {
349
+ this.timeoutCleaner = setTimeout(() => {
350
+ this.isDropdownToggler = false;
351
+ this.isFocusInput = false;
352
+ this.isDropdownToggler = false;
353
+ this.isFocusInput = false;
354
+ this.setShowHideDropdown.next(this.isDropdownToggler);
355
+ }, 150);
356
+ }
357
+ blurOnPassword() {
358
+ this.passwordTimeout = setTimeout(() => {
359
+ this.isFocusInput = false;
360
+ this.input.nativeElement.blur();
361
+ this.cdRef.detectChanges();
362
+ }, 150);
363
+ }
364
+ checkRegexPattern(charCode, name) {
365
+ return this.caInputValidationService
366
+ .getInputRegexPattern(name)
367
+ ?.test(charCode);
368
+ }
369
+ // FOCUS INPUT FUNCTION
370
+ onKeypress(event) {
371
+ const lowerCaseName = this._inputConfig.name.toLowerCase();
372
+ const charCode = String.fromCharCode(event.charCode);
373
+ // Disable first character to be space
374
+ if (!this.input.nativeElement.value && /^\s*$/.test(charCode)) {
375
+ event.preventDefault();
376
+ return false;
377
+ }
378
+ if (this._inputConfig.priceSeparator) {
379
+ if (this.checkRegexPattern(charCode, InputStringEnum.PRICE_SEPARATOR)) {
380
+ if (this.superControl.control?.value?.length ===
381
+ this.originPriceSeparatorLimit &&
382
+ event.keyCode !== 46) {
383
+ event.preventDefault();
384
+ return;
385
+ }
386
+ // Disable multiple dots
387
+ this.disableMultiplePoints(event);
388
+ // Find index of dot
389
+ const valueToString = String(this.superControl.control?.value);
390
+ this.hasDecimalIndex = valueToString?.indexOf('.');
391
+ if (this.hasDecimalIndex >= 0) {
392
+ // 1. Divide number on decimal and integer part
393
+ let integerPart = this.superControl.control?.value.slice(0, this.hasDecimalIndex);
394
+ if (!integerPart)
395
+ integerPart = '0';
396
+ let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
397
+ // 2. Disable more than two decimals
398
+ if (decimalPart.length > 2) {
399
+ event.preventDefault();
400
+ return;
401
+ }
402
+ // 3. Get only two numbers of decimal part
403
+ decimalPart = decimalPart.slice(0, 2);
404
+ const currentPosition = this.input.nativeElement.selectionStart;
405
+ // 4. Set formatted number
406
+ this.superControl.control?.patchValue(integerPart + '.' + decimalPart);
407
+ this.timeoutCleaner = setTimeout(() => {
408
+ if (event.keyCode === 51) {
409
+ this.cursorInputPosition =
410
+ this.input.nativeElement.selectionStart;
411
+ this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
412
+ }
413
+ else {
414
+ this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
415
+ }
416
+ }, 0);
417
+ }
418
+ return true;
419
+ }
420
+ event.preventDefault();
421
+ return false;
422
+ }
423
+ if (this.checkNameArray(InputConstants.businessNamesArray, lowerCaseName)) {
424
+ if (this.checkRegexPattern(charCode, InputStringEnum.BUSINESS_NAME)) {
425
+ this.disableMultiplePoints(event);
426
+ this.disableConsecutivelySpaces(event);
427
+ return true;
428
+ }
429
+ event.preventDefault();
430
+ return false;
431
+ }
432
+ if (this.checkNameArray(InputConstants.qtyArray, lowerCaseName)) {
433
+ // Only numbers
434
+ if (this.checkRegexPattern(charCode, InputStringEnum.QTY))
435
+ return true;
436
+ event.preventDefault();
437
+ return false;
438
+ }
439
+ if (this.checkNameArray([InputStringEnum.EMAIL], lowerCaseName)) {
440
+ if (this.checkRegexPattern(charCode, InputStringEnum.EMAIL)) {
441
+ this.disableConsecutivelyPoints(event);
442
+ return true;
443
+ }
444
+ event.preventDefault();
445
+ return false;
446
+ }
447
+ if (this.checkNameArray([InputStringEnum.INVOICE], lowerCaseName)) {
448
+ if (this.checkRegexPattern(charCode, InputStringEnum.INVOICE))
449
+ return true;
450
+ event.preventDefault();
451
+ return false;
452
+ }
453
+ if (this.checkNameArray([InputStringEnum.ADDRESS], lowerCaseName)) {
454
+ if (/^[A-Za-z0-9\s.&/,_-]*$/?.test(charCode)) {
455
+ this.disableConsecutivelySpaces(event);
456
+ return true;
457
+ }
458
+ else {
459
+ event.preventDefault();
460
+ return false;
461
+ }
462
+ }
463
+ if (this.checkNameArray(InputConstants.addressUnitArray, lowerCaseName)) {
464
+ if (this.checkRegexPattern(charCode, InputStringEnum.ADDRESS_UNIT))
465
+ return true;
466
+ event.preventDefault();
467
+ return false;
468
+ }
469
+ if (this.checkNameArray([InputStringEnum.FIRST_NAME], lowerCaseName)) {
470
+ if (this.checkRegexPattern(charCode, InputStringEnum.FIRST_NAME)) {
471
+ this.disableMultiplePoints(event);
472
+ this.enableOneSpaceOnly(event);
473
+ return true;
474
+ }
475
+ event.preventDefault();
476
+ return false;
477
+ }
478
+ if (this.checkNameArray([InputStringEnum.LAST_NAME], lowerCaseName)) {
479
+ if (this.checkRegexPattern(charCode, InputStringEnum.LAST_NAME)) {
480
+ this.enableOneSpaceOnly(event);
481
+ return true;
482
+ }
483
+ event.preventDefault();
484
+ return false;
485
+ }
486
+ if (this.checkNameArray([InputStringEnum.BANK_NAME], lowerCaseName)) {
487
+ if (this.checkRegexPattern(charCode, InputStringEnum.BANK_NAME)) {
488
+ this.disableMultiplePoints(event);
489
+ this.enableOneSpaceOnly(event);
490
+ return true;
491
+ }
492
+ event.preventDefault();
493
+ return false;
494
+ }
495
+ if (this.checkNameArray(InputConstants.vinNumberArray, lowerCaseName)) {
496
+ if (this.checkRegexPattern(charCode, InputStringEnum.VIN_NUMBER))
497
+ return !/^[IiOQ]*$/?.test(charCode);
498
+ event.preventDefault();
499
+ return false;
500
+ }
501
+ if (this.checkNameArray([InputStringEnum.TRUCK_TRAILER_MODEL], lowerCaseName)) {
502
+ if (this.checkRegexPattern(charCode, InputStringEnum.TRUCK_TRAILER_MODEL)) {
503
+ this.enableOneSpaceOnly(event);
504
+ return true;
505
+ }
506
+ event.preventDefault();
507
+ return false;
508
+ }
509
+ if (this.checkNameArray([InputStringEnum.YEAR], lowerCaseName)) {
510
+ if (/^0*$/.test(charCode) && !this.input.nativeElement.value) {
511
+ event.preventDefault();
512
+ return false;
513
+ }
514
+ if (this.checkRegexPattern(charCode, InputStringEnum.YEAR))
515
+ return true;
516
+ event.preventDefault();
517
+ return false;
518
+ }
519
+ if (this.checkNameArray([InputStringEnum.LICENSE_PLATE], lowerCaseName)) {
520
+ if (this.checkRegexPattern(charCode, InputStringEnum.LICENSE_PLATE)) {
521
+ this.enableOneSpaceOnly(event);
522
+ return true;
523
+ }
524
+ event.preventDefault();
525
+ return false;
526
+ }
527
+ if (this.checkNameArray([InputStringEnum.DESCRIPTION], lowerCaseName)) {
528
+ if (this.checkRegexPattern(charCode, InputStringEnum.DESCRIPTION)) {
529
+ this.disableConsecutivelySpaces(event);
530
+ return true;
531
+ }
532
+ event.preventDefault();
533
+ return false;
534
+ }
535
+ if (this.checkNameArray([InputStringEnum.ALLOW_ALL], lowerCaseName)) {
536
+ if (/.*/?.test(charCode))
537
+ return true;
538
+ event.preventDefault();
539
+ return false;
540
+ }
541
+ if (this.checkNameArray([InputStringEnum.DBA_NAME], lowerCaseName)) {
542
+ if (this.checkRegexPattern(charCode, InputStringEnum.DBA_NAME))
543
+ return true;
544
+ event.preventDefault();
545
+ return false;
546
+ }
547
+ if (this.checkNameArray([InputStringEnum.PER_MILE], lowerCaseName)) {
548
+ if (this.checkRegexPattern(charCode, InputStringEnum.PER_MILE)) {
549
+ this.disableMultiplePoints(event);
550
+ // Check for max length
551
+ if (this.superControl.control?.value?.toString().includes('.'))
552
+ this._inputConfig.maxLength = 4;
553
+ else
554
+ this._inputConfig.maxLength = 2;
555
+ // Check for range
556
+ if (this.superControl.control?.value > this._inputConfig.max ||
557
+ this.superControl.control?.value < this._inputConfig.min) {
558
+ this.superControl.control?.setErrors({ invalid: true });
559
+ }
560
+ return true;
561
+ }
562
+ else {
563
+ event.preventDefault();
564
+ return false;
565
+ }
566
+ }
567
+ if (this.checkNameArray(InputConstants.perStopArray, lowerCaseName)) {
568
+ if (this.checkRegexPattern(charCode, InputStringEnum.PER_STOP)) {
569
+ this.timeoutCleaner = setTimeout(() => {
570
+ if (this.superControl.control?.value) {
571
+ let perStopValue = this.superControl.control?.value.replace(/,/g, '');
572
+ if (perStopValue > this._inputConfig.max ||
573
+ perStopValue < this._inputConfig.min) {
574
+ this.superControl.control?.setErrors({
575
+ invalid: true,
576
+ });
577
+ return false;
578
+ }
579
+ return true;
580
+ }
581
+ return;
582
+ }, 0);
583
+ }
584
+ else {
585
+ event.preventDefault();
586
+ return false;
587
+ }
588
+ }
589
+ if (this.checkNameArray(InputConstants.emergencyNameArray, lowerCaseName)) {
590
+ if (this.checkRegexPattern(charCode, InputStringEnum.EMERGENCY_NAME))
591
+ return true;
592
+ event.preventDefault();
593
+ return false;
594
+ }
595
+ if (this.checkNameArray([InputStringEnum.EMERGENCY_NAME], lowerCaseName)) {
596
+ if (this.checkRegexPattern(charCode, InputStringEnum.EMERGENCY_NAME)) {
597
+ this.disableConsecutivelySpaces(event);
598
+ this.enableOneSpaceOnly(event);
599
+ return true;
600
+ }
601
+ event.preventDefault();
602
+ return false;
603
+ }
604
+ if (this.checkNameArray([InputStringEnum.FULL_CONTACT_NAME], lowerCaseName)) {
605
+ if (this.checkRegexPattern(charCode, InputStringEnum.FULL_CONTACT_NAME))
606
+ return true;
607
+ event.preventDefault();
608
+ return false;
609
+ }
610
+ if (this.checkNameArray([InputStringEnum.FUEL_STORE], lowerCaseName)) {
611
+ if (this.checkRegexPattern(charCode, InputStringEnum.FUEL_STORE))
612
+ return true;
613
+ event.preventDefault();
614
+ return false;
615
+ }
616
+ if (this.checkNameArray([InputStringEnum.HOS], lowerCaseName)) {
617
+ if (!this.inputSelection &&
618
+ this.checkRegexPattern(charCode, InputStringEnum.HOS)) {
619
+ return (this.superControl.control?.value * 10 +
620
+ event.charCode -
621
+ 48 <=
622
+ this._inputConfig.max);
623
+ }
624
+ else {
625
+ if (this.inputSelection) {
626
+ this.superControl.control?.patchValue(charCode);
627
+ this.inputSelection = false;
628
+ }
629
+ event.preventDefault();
630
+ return false;
631
+ }
632
+ }
633
+ if (this.checkNameArray(InputConstants.parkingSlotArray, lowerCaseName)) {
634
+ if (this.checkRegexPattern(charCode, InputStringEnum.FULL_PARKING_SLOT))
635
+ return true;
636
+ else {
637
+ event.preventDefault();
638
+ return false;
639
+ }
640
+ }
641
+ if (this.checkNameArray([InputStringEnum.CDL_NUMBER], lowerCaseName)) {
642
+ if (this.checkRegexPattern(charCode, InputStringEnum.CDL_NUMBER)) {
643
+ this.enableOneSpaceOnly(event);
644
+ this.disableConsecutivelySpaces(event);
645
+ return true;
646
+ }
647
+ else {
648
+ event.preventDefault();
649
+ return false;
650
+ }
651
+ }
652
+ // All Simbols
653
+ if (this.checkNameArray(InputConstants.usernameArray, lowerCaseName)) {
654
+ if (this.checkRegexPattern(charCode, InputStringEnum.USERNAME))
655
+ return true;
656
+ else {
657
+ event.preventDefault();
658
+ return false;
659
+ }
660
+ }
661
+ if (this.checkNameArray([InputStringEnum.FULL_NAME], lowerCaseName)) {
662
+ if (this.checkRegexPattern(charCode, InputStringEnum.FULL_NAME)) {
663
+ this.enableOneSpaceOnly(event);
664
+ this.disableMultiplePoints(event);
665
+ this.disableConsecutivelySpaces(event);
666
+ return true;
667
+ }
668
+ else {
669
+ event.preventDefault();
670
+ return false;
671
+ }
672
+ }
673
+ if (this.checkNameArray([InputStringEnum.TOLL_VALIDATION], lowerCaseName)) {
674
+ if (this.checkRegexPattern(charCode, InputStringEnum.TOLL_VALIDATION))
675
+ return true;
676
+ else {
677
+ event.preventDefault();
678
+ return false;
679
+ }
680
+ }
681
+ // Just characters and numbers
682
+ if (this.checkNameArray(InputConstants.prefixArray, lowerCaseName)) {
683
+ if (this.checkRegexPattern(charCode, InputStringEnum.PREFIX))
684
+ return true;
685
+ else {
686
+ event.preventDefault();
687
+ return false;
688
+ }
689
+ }
690
+ if (this.checkNameArray([InputStringEnum.FULL_NAME], lowerCaseName)) {
691
+ if (this.checkRegexPattern(charCode, InputStringEnum.FULL_NAME)) {
692
+ event.preventDefault();
693
+ return false;
694
+ }
695
+ else {
696
+ this.disableConsecutivelySpaces(event);
697
+ return true;
698
+ }
699
+ }
700
+ if (this.checkNameArray(InputConstants.producerNameArray, lowerCaseName)) {
701
+ if (this.checkRegexPattern(charCode, InputStringEnum.PRODUCER_NAME)) {
702
+ this.disableMultiplePoints(event);
703
+ return true;
704
+ }
705
+ else {
706
+ event.preventDefault();
707
+ return false;
708
+ }
709
+ }
710
+ if (this.checkNameArray([InputStringEnum.INPUT_DROPDOWN_LABEL], lowerCaseName)) {
711
+ this.disableConsecutivelySpaces(event);
712
+ this.disableConsecutivelyPoints(event);
713
+ }
714
+ this.input.nativeElement.value.trim();
715
+ }
716
+ // #region onFocus
717
+ onFocus(event) {
718
+ this.focusInputEvent.emit(event);
719
+ // DropDown Label
720
+ if (this._inputConfig.dropdownLabel) {
721
+ this._inputConfig.placeholderIcon =
722
+ InputSvgRoutes.dynamicFocusLabelSvg;
723
+ }
724
+ // Dropdown
725
+ if (this._inputConfig.isDropdown) {
726
+ this.isDropdownToggler = true;
727
+ this.setShowHideDropdown.next(this.isDropdownToggler);
728
+ }
729
+ // Commands
730
+ if (this._inputConfig.commands && !this._inputConfig.isDisabled) {
731
+ if (this._inputConfig.commands.type === InputCommandsType.MONTHS) {
732
+ if (!this._inputConfig.blueInput)
733
+ this._inputConfig.blackInput = true;
734
+ this._inputConfig.commands.active = true;
735
+ this.isVisibleCommands = true;
736
+ }
737
+ if (this._inputConfig.commands.type ===
738
+ InputCommandsType.PM_INCREMENT_DECREMENT ||
739
+ this._inputConfig.commands.type ===
740
+ InputCommandsType.INCREMENT_DECREMENT) {
741
+ this._inputConfig.blackInput = false;
742
+ this._inputConfig.commands.active = true;
743
+ this.isVisibleCommands = true;
744
+ }
745
+ }
746
+ this.isFocusInput = true;
747
+ }
748
+ // #endregion
749
+ // #region onKeyDown
750
+ onKeydown(event) {
751
+ if (event)
752
+ this.isCapsLockOn = event?.getModifierState?.('CapsLock');
753
+ if (this._inputConfig.priceSeparator) {
754
+ const valueToString = String(this.superControl.control?.value);
755
+ this.isDotDeleted = valueToString?.includes('.');
756
+ }
757
+ // Disable for phone field first character to be 0
758
+ if (this._inputConfig.name.toLowerCase() === InputStringEnum.PHONE) {
759
+ if (event.target.selectionStart === 0 &&
760
+ event.key === '0') {
761
+ event.preventDefault();
762
+ }
763
+ }
764
+ if (event.keyCode === 9) {
765
+ this.setDropDownKeyNavigation.next({
766
+ keyCode: event.keyCode,
767
+ data: null,
768
+ });
769
+ }
770
+ }
771
+ // #endregion
772
+ // #region onKeyUp
773
+ onKeyup(event) {
774
+ if (event) {
775
+ this.isCapsLockOn = event?.getModifierState?.('CapsLock');
776
+ }
777
+ // Reset function property for disabling multiple dots
778
+ const valueToString = String(this.superControl.control?.value);
779
+ if (this.isDotDeleted && !valueToString?.includes('.'))
780
+ this.numberOfPoints = 0;
781
+ if (event.keyCode == 8 &&
782
+ !(this._inputConfig.isDropdown || this._inputConfig.dropdownLabel)) {
783
+ // Reset Multiple Consecutively Spaces
784
+ this.numberOfConsecutivelySpaces = 0;
785
+ // Reset One Space Only
786
+ if (this.superControl.control?.value &&
787
+ !this.superControl.control?.value?.includes(' ')) {
788
+ this.oneSpaceOnlyCounter = 0;
789
+ }
790
+ }
791
+ if (this._inputConfig.isDropdown ||
792
+ this._inputConfig.dropdownLabel ||
793
+ this._inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
794
+ if (event.keyCode === 40 || event.keyCode === 38) {
795
+ this.setDropDownKeyNavigation.next({
796
+ keyCode: event.keyCode,
797
+ data: null,
798
+ });
799
+ }
800
+ if (event.keyCode === 13) {
801
+ this.setDropDownKeyNavigation.next({
802
+ keyCode: event.keyCode,
803
+ data: this._inputConfig,
804
+ });
805
+ if (this._inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
806
+ this.input.nativeElement.blur();
807
+ }
808
+ }
809
+ if (event.keyCode === 27) {
810
+ this.isVisibleCommands = false;
811
+ this.onBlurBase();
812
+ this.blurOnDropDownArrow();
813
+ this.input.nativeElement.blur();
814
+ this.setDropDownKeyNavigation.next({
815
+ keyCode: event.keyCode,
816
+ data: null,
817
+ });
818
+ }
819
+ if (event.keyCode === 9) {
820
+ this.onFocus();
821
+ this.input.nativeElement.focus();
822
+ this.setDropDownKeyNavigation.next({
823
+ keyCode: event.keyCode,
824
+ data: null,
825
+ });
826
+ }
827
+ }
828
+ }
829
+ handleConfirmCancel(action) {
830
+ switch (action) {
831
+ case InputCommandsAction.CONFIRM:
832
+ this.confirmCommand();
833
+ break;
834
+ case InputCommandsAction.CANCEL:
835
+ this.cancelCommand();
836
+ break;
837
+ default:
838
+ break;
839
+ }
840
+ this.superControl.control?.setErrors(null);
841
+ this._inputConfig.dropdownLabelNew = false;
842
+ this._inputConfig.commands.active = false;
843
+ this._inputConfig.blackInput = false;
844
+ this.isEditInput = false;
845
+ this.isVisibleCommands = false;
846
+ this.isFocusInput = false;
847
+ }
848
+ cancelCommand() {
849
+ this.setCommandEvent.next({ action: InputCommandsAction.CANCEL });
850
+ }
851
+ confirmCommand() {
852
+ this.setCommandEvent.next({
853
+ data: this.superControl.control?.value,
854
+ action: InputCommandsAction.CONFIRM,
855
+ mode: !this._inputConfig.dropdownLabelNew &&
856
+ this._inputConfig.name !== 'Input Dropdown Bank Name'
857
+ ? 'edit'
858
+ : 'new',
859
+ });
860
+ }
861
+ // #endregion
862
+ // #region ClearInput
863
+ clearInput(event) {
864
+ event.preventDefault();
865
+ event.stopPropagation();
866
+ // Clear whole input
867
+ if (this._inputConfig.removeInput) {
868
+ this.setClearInputEvent.next(true);
869
+ return;
870
+ }
871
+ // Incorrect Input
872
+ if (this._inputConfig.incorrectInput) {
873
+ this.incorrectValue = !this.incorrectValue;
874
+ this.setIncorrectInput.next(this.incorrectValue);
875
+ }
876
+ // Native clear
877
+ else {
878
+ this.input.nativeElement.value = null;
879
+ this.superControl.control?.setValue(null, {
880
+ emitEvent: false,
881
+ });
882
+ this.numberOfConsecutivelySpaces = 0;
883
+ this.numberOfConsecutivelyPoints = 0;
884
+ this.numberOfPoints = 0;
885
+ this.oneSpaceOnlyCounter = 0;
886
+ this._inputConfig.dropdownImageInput = undefined;
887
+ this.isTouchedInput = true;
888
+ this.isFocusInput = false;
889
+ this.setClearInputEvent.next(true);
890
+ }
891
+ }
892
+ // #endregion
893
+ // #region OnCommands
894
+ onCommands(e) {
895
+ const { event, type, action } = e;
896
+ event.stopPropagation();
897
+ event.preventDefault();
898
+ switch (type) {
899
+ case InputCommandsType.PM_INCREMENT_DECREMENT:
900
+ this.handlePmIncrementDecrement(action);
901
+ break;
902
+ case InputCommandsType.INCREMENT_DECREMENT:
903
+ this.handleIncrementDecrement(action);
904
+ break;
905
+ case InputCommandsType.CONFIRM_CANCEL:
906
+ this.handleConfirmCancel(action);
907
+ break;
908
+ case InputCommandsType.MONTHS:
909
+ this.handleMonths(action);
910
+ break;
911
+ default:
912
+ break;
913
+ }
914
+ }
915
+ // #endregion
916
+ // #region onEditInput
917
+ onEditInput(event) {
918
+ event.preventDefault();
919
+ event.stopPropagation();
920
+ this.isEditInput = true;
921
+ this._inputConfig.dropdownLabelNew = false;
922
+ if (!this._inputConfig.blueInput)
923
+ this._inputConfig.blackInput = true;
924
+ this._inputConfig.commands.active = true;
925
+ this.isVisibleCommands = true;
926
+ this.isFocusInput = true;
927
+ this.setInputCursorAtTheEnd(this.input.nativeElement);
928
+ this.superControl.control?.setErrors({ required: true });
929
+ this.setCommandEvent.next({
930
+ data: this.superControl.control?.value,
931
+ action: 'Edit Input',
932
+ });
933
+ }
934
+ // #endregion
935
+ // #region ToggleDropdownOptions
936
+ toggleDropdownOptions() {
937
+ this.handleToggleDropdownOptions.emit();
938
+ if (this._inputConfig.isDisabled) {
939
+ return;
940
+ }
941
+ this.isDropdownToggler = !this.isDropdownToggler;
942
+ this.setShowHideDropdown.next(this.isDropdownToggler);
943
+ if (this.isDropdownToggler) {
944
+ this.input.nativeElement.focus();
945
+ this.isFocusInput = true;
946
+ }
947
+ }
948
+ // #endregion
949
+ // #region onPlaceholderIconevent
950
+ onPlaceholderIconEvent(event) {
951
+ event.preventDefault();
952
+ event.stopPropagation();
953
+ if (this.isEditInput) {
954
+ this.setCommandEvent.next({
955
+ data: this.superControl.control?.value,
956
+ action: 'Toggle Dropdown',
957
+ });
958
+ }
959
+ else {
960
+ this.setCommandEvent.next({
961
+ data: this.superControl.control?.value,
962
+ action: 'Placeholder Icon Event',
963
+ });
964
+ }
965
+ }
966
+ // #endregion
967
+ // #region SelectionChange
968
+ selectionChange(event) {
969
+ if (event)
970
+ this.inputSelection = true;
971
+ }
972
+ // #endregion setSelection
973
+ // #region AutoFocusFirstInput
974
+ autoFocusFirstInput() {
975
+ if (this._inputConfig.autoFocus && !this.superControl.control?.value) {
976
+ this.timeoutCleaner = setTimeout(() => {
977
+ this.input.nativeElement.focus();
978
+ this.isFocusInput = true;
979
+ this._inputConfig.autoFocus = false;
980
+ }, 30);
981
+ }
982
+ }
983
+ // #endregion
984
+ onPopoverShown() {
985
+ if (!this._inputConfig.dropdownLabel) {
986
+ this.isFocusInput = true;
987
+ }
988
+ }
989
+ onPopoverHidden() {
990
+ if (!this._inputConfig.dropdownLabel) {
991
+ this.isFocusInput = false;
992
+ }
993
+ }
994
+ onInputConfigChange() {
995
+ // Price Separator
996
+ if (this._inputConfig.priceSeparator) {
997
+ this.originPriceSeparatorLimit =
998
+ this._inputConfig.priceSeparatorLimitation;
999
+ }
1000
+ // Custom Range
1001
+ if (this._inputConfig.isUsingCustomPeriodRange) {
1002
+ if (this._inputConfig.isDisplayingCustomPeriodRange)
1003
+ this.isFocusInput = true;
1004
+ else
1005
+ this.isFocusInput = false;
1006
+ }
1007
+ // When add mode in dropdown
1008
+ if (this._inputConfig.commands?.active &&
1009
+ !this._inputConfig.isDisabled) {
1010
+ if (this._inputConfig.commands.type === 'confirm-cancel') {
1011
+ if (!this._inputConfig.blueInput)
1012
+ this._inputConfig.blackInput = true;
1013
+ this.isVisibleCommands = true;
1014
+ this.isFocusInput = true;
1015
+ this.input.nativeElement.focus();
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtaW5wdXQtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLWlucHV0L2Jhc2UtY2xhc3Nlcy9jYS1pbnB1dC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHlCQUF5QixFQUN6QixlQUFlLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFvQixjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLcEYsTUFBTSxPQUFnQixvQkFBcUIsU0FBUSwyQkFBMkI7SUFxRDFFLFlBQ1csS0FBd0IsRUFDeEIscUJBQTRDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBSEQsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQTFCdkQsYUFBYTtRQUVOLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRWhDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFHN0IsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO1FBUTNDLFdBQVc7UUFDSixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixzQkFBaUIsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRTVDLG1CQUFtQjtRQUNaLGdDQUEyQixHQUFXLENBQUMsQ0FBQztJQVMvQyxDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQWEsRUFBRSxPQUFpQjtRQUNqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxD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QUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHlCQUF5QjtnQkFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQztRQUNuRCxDQUFDO1FBRUQsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkI7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOztnQkFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDbkMsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU07WUFDbEMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFDL0IsQ0FBQztZQUNDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7b0JBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJbnB1dENvbW1hbmRzQWN0aW9uLFxuICAgIElucHV0Q29tbWFuZHNUeXBlLFxuICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0sXG4gICAgSW5wdXRTdHJpbmdFbnVtLFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBUaG91c2FuZFNlcGFyYXRvclBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy90aG91c2FuZC1zZXBhcmF0b3IucGlwZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJbnB1dENvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJbnB1dENoYW5nZVZhbHVlLCBJbnB1dFN2Z1JvdXRlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENhSW5wdXRCYXNlSGVscGVyc0NvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtY2xhc3Nlcy9jYS1pbnB1dC1iYXNlLWhlbHByZXMnO1xuaW1wb3J0IHsgRXZlbnRJbnB1dE1hbmFnZXIgfSBmcm9tICcuL2NhLWlucHV0LWV2ZW50LW1hbmFnZXInO1xuaW1wb3J0IHsgQ29tbWFuZHNFdmVudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJQ2FJbnB1dCB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYUlucHV0QmFzZUNvbXBvbmVudCBleHRlbmRzIENhSW5wdXRCYXNlSGVscGVyc0NvbXBvbmVudCB7XG4gICAgYWJzdHJhY3QgZm9jdXNJbnB1dEV2ZW50OiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD47XG4gICAgYWJzdHJhY3QgaGFuZGxlVG9nZ2xlRHJvcGRvd25PcHRpb25zOiBFdmVudEVtaXR0ZXI8dm9pZD47XG5cbiAgICAvLyAjcmVnaW9uIGFic3RyYWN0IHZhcmlhYmxlc1xuICAgIGFic3RyYWN0IGlzRm9jdXNJbnB1dDogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBpc1RvdWNoZWRJbnB1dDogYm9vbGVhbjtcblxuICAgIC8vIElucHV0IENvbW1hbmRzXG4gICAgYWJzdHJhY3QgaXNWaXNpYmxlQ29tbWFuZHM6IGJvb2xlYW47XG5cbiAgICAvLyBFZGl0IElucHV0XG4gICAgYWJzdHJhY3QgaXNFZGl0SW5wdXQ6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBpc0Ryb3Bkb3duVG9nZ2xlcjogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBpc0NhcHNMb2NrT246IGJvb2xlYW47XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBhYnN0cmFjdCBldmVudHNcbiAgICBhYnN0cmFjdCBzZXRDb21tYW5kRXZlbnQ6IEV2ZW50SW5wdXRNYW5hZ2VyPENvbW1hbmRzRXZlbnQ+O1xuICAgIGFic3RyYWN0IHNldENsZWFySW5wdXRFdmVudDogRXZlbnRJbnB1dE1hbmFnZXI8Ym9vbGVhbj47XG4gICAgYWJzdHJhY3Qgc2V0SW5jb3JyZWN0SW5wdXQ6IEV2ZW50SW5wdXRNYW5hZ2VyPGJvb2xlYW4+O1xuICAgIGFic3RyYWN0IHNldEJsdXJJbnB1dDogRXZlbnRJbnB1dE1hbmFnZXI8Ym9vbGVhbj47XG4gICAgYWJzdHJhY3Qgc2V0Q2hhbmdlSW5wdXQ6IEV2ZW50SW5wdXRNYW5hZ2VyPElucHV0Q2hhbmdlVmFsdWU+O1xuICAgIGFic3RyYWN0IHNldFNob3dIaWRlRHJvcGRvd246IEV2ZW50SW5wdXRNYW5hZ2VyPGJvb2xlYW4+O1xuICAgIGFic3RyYWN0IHNldERyb3BEb3duS2V5TmF2aWdhdGlvbjogRXZlbnRJbnB1dE1hbmFnZXI8e1xuICAgICAgICBrZXlDb2RlOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IElDYUlucHV0IHwgbnVsbDtcbiAgICB9PjtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICBwdWJsaWMgaW5wdXRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY3Vyc29ySW5wdXRQb3NpdGlvbiE6IG51bWJlcjtcbiAgICBwdWJsaWMgaGFzRGVjaW1hbEluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwdWJsaWMgb3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCE6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgdGltZW91dENsZWFuZXIhOiBOb2RlSlMuVGltZW91dCB8IG51bWJlcjtcbiAgICBwdWJsaWMgbGFzdEN1cnNvclNwYWNlUG9zaXRpb246IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBwcmV2ZW50Qmx1ciE6IGJvb2xlYW47XG4gICAgcHVibGljIHBhc3N3b3JkVGltZW91dCE6IE5vZGVKUy5UaW1lb3V0IHwgbnVtYmVyO1xuXG4gICAgcHVibGljIGlzRG90RGVsZXRlZCE6IGJvb2xlYW47XG5cbiAgICBhYnN0cmFjdCBpbmNvcnJlY3RWYWx1ZTogYm9vbGVhbjtcblxuICAgIC8vIERyb3Bkb3duXG4gICAgcHVibGljIHNob3dEYXRlSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZGF0ZVRpbWVJbnB1dERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgLy8gTnVtYmVyIG9mIHNwYWNlc1xuICAgIHB1YmxpYyBudW1iZXJPZkNvbnNlY3V0aXZlbHlTcGFjZXM6IG51bWJlciA9IDA7XG5cbiAgICBhYnN0cmFjdCBjYUlucHV0VmFsaWRhdGlvblNlcnZpY2U6IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3JQaXBlOiBUaG91c2FuZFNlcGFyYXRvclBpcGVcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNmb3JtVGV4dCh2YWx1ZTogc3RyaW5nLCBpc1Bhc3RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnNvcklucHV0UG9zaXRpb24gPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG5cbiAgICAgICAgLy8gSGFuZGxlIHBhc3RlIG9wZXJhdGlvblxuICAgICAgICBpZiAoaXNQYXN0ZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQYXN0ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtYXRpb24oKTtcblxuICAgICAgICAvLyBBcHBseSB0aG91c2FuZCBhbmQgcHJpY2Ugc2VwYXJhdG9ycyBpZiBjb25maWd1cmVkXG4gICAgICAgIHRoaXMuYXBwbHlUaG91c2FuZFNlcGFyYXRvcigpO1xuICAgICAgICB0aGlzLmFwcGx5UHJpY2VTZXBhcmF0b3IoKTtcblxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRpb24odmFsdWUpO1xuXG4gICAgICAgIHRoaXMuc2FuaXRpemVDb25zZWN1dGl2ZVNwYWNlcygpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlTGVhZGluZ1plcm8oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVBhc3RlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IG1haW5WYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIG1haW5WYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubGltaXRJbnB1dExlbmd0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFpblZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlucHV0U2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxldGUgc3BhY2VzIG9uIGJlZ2luIGFuZCBlbmRcbiAgICAgICAgbWFpblZhbHVlID0gbWFpblZhbHVlLnRyaW0oKTtcbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShtYWluVmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGltaXRJbnB1dExlbmd0aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUubGVuZ3RoID5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm1heExlbmd0aCFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlUZXh0VHJhbnNmb3JtYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5faW5wdXRDb25maWcudGV4dFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY2FzZSBJbnB1dFN0cmluZ0VudW0uQ0FQSVRBTElaRTpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0U3RyaW5nRW51bS5VUFBFUkNBU0U6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvY2FsZVVwcGVyQ2FzZSgnZW4tVVMnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5wdXRTdHJpbmdFbnVtLkNBUElUQUxJWkVEX0NBU0U6XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRDYXNlV29yZHMgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKF5cXHd7MX0pfChcXHMrXFx3ezF9KS9nLFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyOiBzdHJpbmcpID0+IGxldHRlci50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHZhbHVlID0gY2FwaXRhbGl6ZWRDYXNlV29yZHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUodmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlUaG91c2FuZFNlcGFyYXRvcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy50aG91c2FuZFNlcGFyYXRvciAmJiBjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWxsWmVyb3MoY29udHJvbFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoJzAnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UHJpY2VTZXBhcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3IgJiYgY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyAwLiBEb24ndCBhbGxvdyAwIGFzIGZpcnN0IGNoYXJhY3RlclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNBbGxaZXJvcyhjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSgnMCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDQuIElmIHVzZXIgc2V0IGRvdFxuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRXaXRoRGVjaW1hbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyA1LiBJZiB1c2VyIGRvZXNuJ3Qgc2V0IGRvdFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0V2l0aG91dERlY2ltYWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElucHV0Q3Vyc29yUG9zaXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5pbmRleE9mKCcuJykgPT09IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5pbmRleE9mKCcuJykgPT09IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgJHtufTAwMDAwIGFuZCB3ZSBkZWxldGUgTiB0aGVuIHdlIGdvdCB1bmRlZmluZWQgaW5zdGVhZCBvZiBkb3RcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoMCwge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0V2l0aERlY2ltYWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICAvLyA0LjEuIENoZWNrIGZvciBEb3QgcG9zaXRpb25cbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSBjb250cm9sVmFsdWUuaW5kZXhPZignLicpO1xuXG4gICAgICAgIHRoaXMub3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCA9XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb24hICsgMztcblxuICAgICAgICAvLyA0LjIuIERpdmlkZSBudW1iZXIgaW50byBkZWNpbWFsIGFuZCBpbnRlZ2VyIHBhcnRzXG4gICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IHRoaXMudGhvdXNhbmRTZXBhcmF0b3JQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgICAgIGNvbnRyb2xWYWx1ZVxuICAgICAgICAgICAgICAgIC5zbGljZSgwLCB0aGlzLmhhc0RlY2ltYWxJbmRleClcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3JMaW1pdGF0aW9uKVxuICAgICAgICApO1xuICAgICAgICBsZXQgZGVjaW1hbFBhcnQgPSBjb250cm9sVmFsdWUuc2xpY2UodGhpcy5oYXNEZWNpbWFsSW5kZXggKyAxKTtcblxuICAgICAgICBpZiAoIWludGVnZXJQYXJ0KSB7XG4gICAgICAgICAgICBpbnRlZ2VyUGFydCA9ICcwJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuNC4gR2V0IG9ubHkgdHdvIG51bWJlcnMgb2YgdGhlIGRlY2ltYWwgcGFydFxuICAgICAgICBkZWNpbWFsUGFydCA9IGRlY2ltYWxQYXJ0LnNsaWNlKDAsIDIpO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCkge1xuICAgICAgICAgICAgLy8gNC41LiBTZXQgZm9ybWF0dGVkIG51bWJlclxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBgJHtpbnRlZ2VyUGFydH0uJHtkZWNpbWFsUGFydH1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPVxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLmluZGV4T2YoJy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3VzdG9tVmFsaWRhdGlvbih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ05hbWUgPSB0aGlzLl9pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLllFQVIgJiZcbiAgICAgICAgICAgIHBhcnNlSW50KHZhbHVlKSA+IHBhcnNlSW50KG1vbWVudCgpLmFkZCgxLCAneWVhcicpLmZvcm1hdCgnWVlZWScpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLk1PTlRIUykge1xuICAgICAgICAgICAgaWYgKHBhcnNlSW50KHZhbHVlKSA8IDEgfHwgcGFyc2VJbnQodmFsdWUpID4gMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLkFYTEVTKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VJbnQodmFsdWUpIDwgMSB8fCBwYXJzZUludCh2YWx1ZSkgPiAxNykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IG1pbjogMSB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlKSA+IDE3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7IG1heDogMTcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWdOYW1lID09PSBJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FICYmXG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY2FwaXRhbGl6ZVdvcmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFdpdGhvdXREZWNpbWFsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB2YWx1ZSB3aXRoIHRob3VzYW5kIHNlcGFyYXRvclxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTGltaXQgdmFsaWRhdGlvblxuICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ID1cbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb247XG5cbiAgICAgICAgICAgIC8vIEN1dCB2YWx1ZVxuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB2YWx1ZSBhZ2FpbiBhZnRlciBjdXR0aW5nXG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3JQaXBlLnRyYW5zZm9ybShjb250cm9sVmFsdWUpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZUNvbnNlY3V0aXZlU3BhY2VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWdOYW1lcyA9IElucHV0Q29uc3RhbnRzLnRleHRUcmFuc2Zvcm1Db25maWdOYW1lcztcblxuICAgICAgICBpZiAoY29uZmlnTmFtZXMuaW5jbHVkZXModGhpcy5faW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAvXFxzezIsfS9nLFxuICAgICAgICAgICAgICAgICcgJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzYW5pdGl6ZWRJbnB1dCAhPT0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShzYW5pdGl6ZWRJbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3Vyc29yRm9yU2FuaXRpemVkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q3Vyc29yRm9yU2FuaXRpemVkSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDdXJzb3JTcGFjZVBvc2l0aW9uIC0gMSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDdXJzb3JTcGFjZVBvc2l0aW9uIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVMZWFkaW5nWmVybygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnJlbW92ZUxlYWRpbmdaZXJvKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKCcnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLm5lZ2F0aXZlTGVhZGluZ1plcm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc05lZ2F0aXZlID0gY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFydCBhZnRlciB0aGUgbmVnYXRpdmUgc2lnblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJQYXJ0ID0gY3VycmVudFZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyB6ZXJvc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZE51bWJlciA9IG51bWJlclBhcnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIC9eMCsoPz1cXGQpLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgLSR7dHJhbnNmb3JtZWROdW1iZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUucmVwbGFjZSgvXjArKD89XFxkKS8sICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLnJlcGxhY2UoL14wKyg/ISQpLywgJycpLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlQmFzZShvYmo6IElucHV0Q2hhbmdlVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2VJbnB1dC5uZXh0KG9iaik7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gb2JqO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYXBpdGFsaXplV29yZHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdvcmRzID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWQgPSB3b3Jkcy5tYXAoKHdvcmQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKGNhcGl0YWxpemVkLmpvaW4oJyAnKSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FsbFplcm9zKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gJzAnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyQmFzZShldmVudD86IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gRHJvcERvd24gTGFiZWxcblxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCAmJiAhdGhpcy5pc0VkaXRJbnB1dClcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLnBsYWNlaG9sZGVySWNvbiA9IElucHV0U3ZnUm91dGVzLmR5bmFtaWNMYWJlbFN2ZztcblxuICAgICAgICAvLyBFZGl0IElucHV0XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdElucHV0KSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGF0ZXBpY2tlcjtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEJsdXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhbmtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uSU5QVVRfRFJPUERPV05fQkFOS19OQU1FXG4gICAgICAgIClcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSBmYWxzZTtcblxuICAgICAgICAvLyBQcmljZSBTZXBhcmF0b3IgLSByZW1vdmUgZG90IG9uIGZvY3VzIG91dFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvciAmJlxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgJiZcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy50b1N0cmluZygpLmluZGV4T2YoJy4nKSA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gNC4xLiBDaGVjayBmb3IgRG90IHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAuaW5kZXhPZignLicpO1xuXG4gICAgICAgICAgICBsZXQgaW50ZWdlclBhcnQgPSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuaGFzRGVjaW1hbEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5faW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3JMaW1pdGF0aW9uKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggKyAxXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyA0LjQuIEdldCBvbmx5IHR3byBudW1iZXJzIG9mIGRlY2ltYWwgcGFydFxuICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgaWYgKCFkZWNpbWFsUGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShpbnRlZ2VyUGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1iZXJPZlBvaW50cyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEcm9wZG93blxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNEcm9wZG93biB8fCB0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkRyb3BEb3duQXJyb3coKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3JtYWwsIHdpdGhvdXQgZHJvcGRvd25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gSW5wdXQgQ29tbWFuZHNcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcykgdGhpcy5ibHVyT25Db21tYW5kcygpO1xuXG4gICAgICAgICAgICAvLyBQYXNzd29yZFxuICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnR5cGUgPT09ICdwYXNzd29yZCcpIHRoaXMuYmx1ck9uUGFzc3dvcmQoKTtcbiAgICAgICAgICAgIC8vIE5vcm1hbCBmb2N1cyBvdXRcbiAgICAgICAgICAgIGVsc2UgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Qmx1cklucHV0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXNUb3VjaGVkSW5wdXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmx1ck9uRHJvcERvd25BcnJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVG9nZ2xlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVG9nZ2xlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0hpZGVEcm9wZG93bi5uZXh0KHRoaXMuaXNEcm9wZG93blRvZ2dsZXIpO1xuICAgICAgICB9LCAxNTApO1xuICAgIH1cblxuICAgIHB1YmxpYyBibHVyT25QYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5wYXNzd29yZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICBjaGFyQ29kZTogc3RyaW5nLFxuICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICApOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4obmFtZSlcbiAgICAgICAgICAgID8udGVzdChjaGFyQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gRk9DVVMgSU5QVVQgRlVOQ1RJT05cbiAgICBwdWJsaWMgb25LZXlwcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgICAgICAgY29uc3QgbG93ZXJDYXNlTmFtZSA9IHRoaXMuX2lucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKTtcblxuICAgICAgICAvLyBEaXNhYmxlIGZpcnN0IGNoYXJhY3RlciB0byBiZSBzcGFjZVxuICAgICAgICBpZiAoIXRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSAmJiAvXlxccyokLy50ZXN0KGNoYXJDb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlLFxuICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUFJJQ0VfU0VQQVJBVE9SXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZT8ubGVuZ3RoID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ICYmXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgIT09IDQ2XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIERpc2FibGUgbXVsdGlwbGUgZG90c1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgaW5kZXggb2YgZG90XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHZhbHVlVG9TdHJpbmc/LmluZGV4T2YoJy4nKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlY2ltYWxJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIERpdmlkZSBudW1iZXIgb24gZGVjaW1hbCBhbmQgaW50ZWdlciBwYXJ0XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlZ2VyUGFydCkgaW50ZWdlclBhcnQgPSAnMCc7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCArIDFcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyAyLiBEaXNhYmxlIG1vcmUgdGhhbiB0d28gZGVjaW1hbHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBHZXQgb25seSB0d28gbnVtYmVycyBvZiBkZWNpbWFsIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIDQuIFNldCBmb3JtYXR0ZWQgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydCArICcuJyArIGRlY2ltYWxQYXJ0XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDUxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBJbnB1dENvbnN0YW50cy5idXNpbmVzc05hbWVzQXJyYXksXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uQlVTSU5FU1NfTkFNRSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnF0eUFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgLy8gT25seSBudW1iZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLlFUWSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkVNQUlMXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1BSUwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5JTlZPSUNFXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uSU5WT0lDRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkFERFJFU1NdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKC9eW0EtWmEtejAtOVxccy4mLyxfLV0qJC8/LnRlc3QoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy5hZGRyZXNzVW5pdEFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uQUREUkVTU19VTklUKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRklSU1RfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkZJUlNUX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkxBU1RfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkxBU1RfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5CQU5LX05BTUVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5CQU5LX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy52aW5OdW1iZXJBcnJheSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uVklOX05VTUJFUikpXG4gICAgICAgICAgICAgICAgcmV0dXJuICEvXltJaU9RXSokLz8udGVzdChjaGFyQ29kZSk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFxuICAgICAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uVFJVQ0tfVFJBSUxFUl9NT0RFTF0sXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRSVUNLX1RSQUlMRVJfTU9ERUxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5ZRUFSXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICgvXjAqJC8udGVzdChjaGFyQ29kZSkgJiYgIXRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLllFQVIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkxJQ0VOU0VfUExBVEVdLCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uTElDRU5TRV9QTEFURSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkRFU0NSSVBUSU9OXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uREVTQ1JJUFRJT04pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoW0lucHV0U3RyaW5nRW51bS5BTExPV19BTExdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKC8uKi8/LnRlc3QoY2hhckNvZGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uREJBX05BTUVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5EQkFfTkFNRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLlBFUl9NSUxFXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uUEVSX01JTEUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG1heCBsZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubWF4TGVuZ3RoID0gNDtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuX2lucHV0Q29uZmlnLm1heExlbmd0aCA9IDI7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlID4gdGhpcy5faW5wdXRDb25maWcubWF4ISB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSA8IHRoaXMuX2lucHV0Q29uZmlnLm1pbiFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tOYW1lQXJyYXkoSW5wdXRDb25zdGFudHMucGVyU3RvcEFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5QRVJfU1RPUCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBlclN0b3BWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUucmVwbGFjZSgvLC9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyU3RvcFZhbHVlID4gdGhpcy5faW5wdXRDb25maWcubWF4ISB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclN0b3BWYWx1ZSA8IHRoaXMuX2lucHV0Q29uZmlnLm1pbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBJbnB1dENvbnN0YW50cy5lbWVyZ2VuY3lOYW1lQXJyYXksXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUVdLCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRU1FUkdFTkNZX05BTUUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkZVTExfQ09OVEFDVF9OQU1FXSxcbiAgICAgICAgICAgICAgICBsb3dlckNhc2VOYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlLFxuICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRlVMTF9DT05UQUNUX05BTUVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkZVRUxfU1RPUkVdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5GVUVMX1NUT1JFKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uSE9TXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5pbnB1dFNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5IT1MpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSAqIDEwICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNoYXJDb2RlIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIDQ4IDw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm1heCFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy5wYXJraW5nU2xvdEFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVTExfUEFSS0lOR19TTE9UXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkNETF9OVU1CRVJdLCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5DRExfTlVNQkVSKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGwgU2ltYm9sc1xuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShJbnB1dENvbnN0YW50cy51c2VybmFtZUFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5VU0VSTkFNRSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KFtJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FXSwgbG93ZXJDYXNlTmFtZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uRlVMTF9OQU1FKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aXBsZVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jaGVja05hbWVBcnJheShcbiAgICAgICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTl0sXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlTmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSnVzdCBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzXG4gICAgICAgIGlmICh0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnByZWZpeEFycmF5LCBsb3dlckNhc2VOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tSZWdleFBhdHRlcm4oY2hhckNvZGUsIElucHV0U3RyaW5nRW51bS5QUkVGSVgpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaGVja05hbWVBcnJheShbSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRV0sIGxvd2VyQ2FzZU5hbWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja1JlZ2V4UGF0dGVybihjaGFyQ29kZSwgSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KElucHV0Q29uc3RhbnRzLnByb2R1Y2VyTmFtZUFycmF5LCBsb3dlckNhc2VOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVnZXhQYXR0ZXJuKGNoYXJDb2RlLCBJbnB1dFN0cmluZ0VudW0uUFJPRFVDRVJfTkFNRSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNoZWNrTmFtZUFycmF5KFxuICAgICAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uSU5QVVRfRFJPUERPV05fTEFCRUxdLFxuICAgICAgICAgICAgICAgIGxvd2VyQ2FzZU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnNlY3V0aXZlbHlQb2ludHMoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvLyAjcmVnaW9uIG9uRm9jdXNcbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudD86IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c0lucHV0RXZlbnQuZW1pdChldmVudCk7XG4gICAgICAgIC8vIERyb3BEb3duIExhYmVsXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5wbGFjZWhvbGRlckljb24gPVxuICAgICAgICAgICAgICAgIElucHV0U3ZnUm91dGVzLmR5bmFtaWNGb2N1c0xhYmVsU3ZnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJvcGRvd25cbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmlzRHJvcGRvd24pIHtcbiAgICAgICAgICAgIHRoaXMuaXNEcm9wZG93blRvZ2dsZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93SGlkZURyb3Bkb3duLm5leHQodGhpcy5pc0Ryb3Bkb3duVG9nZ2xlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21tYW5kc1xuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMgJiYgIXRoaXMuX2lucHV0Q29uZmlnLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PSBJbnB1dENvbW1hbmRzVHlwZS5NT05USFMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0Q29uZmlnLmJsdWVJbnB1dClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbW1hbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmNvbW1hbmRzLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICBJbnB1dENvbW1hbmRzVHlwZS5JTkNSRU1FTlRfREVDUkVNRU5UXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5ibGFja0lucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbW1hbmRzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBvbktleURvd25cbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5pc0NhcHNMb2NrT24gPSBldmVudD8uZ2V0TW9kaWZpZXJTdGF0ZT8uKCdDYXBzTG9jaycpO1xuXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNEb3REZWxldGVkID0gdmFsdWVUb1N0cmluZz8uaW5jbHVkZXMoJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgZm9yIHBob25lIGZpZWxkIGZpcnN0IGNoYXJhY3RlciB0byBiZSAwXG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IElucHV0U3RyaW5nRW51bS5QSE9ORSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuc2VsZWN0aW9uU3RhcnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICBldmVudC5rZXkgPT09ICcwJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIG9uS2V5VXBcbiAgICBwdWJsaWMgb25LZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDYXBzTG9ja09uID0gZXZlbnQ/LmdldE1vZGlmaWVyU3RhdGU/LignQ2Fwc0xvY2snKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNldCBmdW5jdGlvbiBwcm9wZXJ0eSBmb3IgZGlzYWJsaW5nIG11bHRpcGxlIGRvdHNcbiAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEb3REZWxldGVkICYmICF2YWx1ZVRvU3RyaW5nPy5pbmNsdWRlcygnLicpKVxuICAgICAgICAgICAgdGhpcy5udW1iZXJPZlBvaW50cyA9IDA7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PSA4ICYmXG4gICAgICAgICAgICAhKHRoaXMuX2lucHV0Q29uZmlnLmlzRHJvcGRvd24gfHwgdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXNldCBNdWx0aXBsZSBDb25zZWN1dGl2ZWx5IFNwYWNlc1xuICAgICAgICAgICAgdGhpcy5udW1iZXJPZkNvbnNlY3V0aXZlbHlTcGFjZXMgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXNldCBPbmUgU3BhY2UgT25seVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy5pbmNsdWRlcygnICcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uZVNwYWNlT25seUNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuaXNEcm9wZG93biB8fFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCB8fFxuICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5BRERSRVNTXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDQwIHx8IGV2ZW50LmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcm9wRG93bktleU5hdmlnYXRpb24ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIGtleUNvZGU6IGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5faW5wdXRDb25maWcsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uQUREUkVTU1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQmx1ckJhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJsdXJPbkRyb3BEb3duQXJyb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJvcERvd25LZXlOYXZpZ2F0aW9uLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ29uZmlybUNhbmNlbChhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzQWN0aW9uLkNPTkZJUk06XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtQ29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbENvbW1hbmQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWxOZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5wdXRDb25maWcuY29tbWFuZHMhLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5ibGFja0lucHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNFZGl0SW5wdXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1Zpc2libGVDb21tYW5kcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuY2VsQ29tbWFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7IGFjdGlvbjogSW5wdXRDb21tYW5kc0FjdGlvbi5DQU5DRUwgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtQ29tbWFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogSW5wdXRDb21tYW5kc0FjdGlvbi5DT05GSVJNLFxuICAgICAgICAgICAgbW9kZTpcbiAgICAgICAgICAgICAgICAhdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbE5ldyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLm5hbWUgIT09ICdJbnB1dCBEcm9wZG93biBCYW5rIE5hbWUnXG4gICAgICAgICAgICAgICAgICAgID8gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgIDogJ25ldycsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIENsZWFySW5wdXRcbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIC8vIENsZWFyIHdob2xlIGlucHV0XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5yZW1vdmVJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDbGVhcklucHV0RXZlbnQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmNvcnJlY3QgSW5wdXRcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmluY29ycmVjdElucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdFZhbHVlID0gIXRoaXMuaW5jb3JyZWN0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldEluY29ycmVjdElucHV0Lm5leHQodGhpcy5pbmNvcnJlY3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmF0aXZlIGNsZWFyXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnNldFZhbHVlKG51bGwsIHtcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVNwYWNlcyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVBvaW50cyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mUG9pbnRzID0gMDtcbiAgICAgICAgICAgIHRoaXMub25lU3BhY2VPbmx5Q291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5kcm9wZG93bkltYWdlSW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmlzVG91Y2hlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q2xlYXJJbnB1dEV2ZW50Lm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBPbkNvbW1hbmRzXG4gICAgcHVibGljIG9uQ29tbWFuZHMoZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQsIHR5cGUsIGFjdGlvbiB9ID0gZTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQbUluY3JlbWVudERlY3JlbWVudChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5JTkNSRU1FTlRfREVDUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jcmVtZW50RGVjcmVtZW50KGFjdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLkNPTkZJUk1fQ0FOQ0VMOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmlybUNhbmNlbChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5NT05USFM6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNb250aHMoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBvbkVkaXRJbnB1dFxuICAgIHB1YmxpYyBvbkVkaXRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5pc0VkaXRJbnB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWxOZXcgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5ibHVlSW5wdXQpIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcyEuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1Zpc2libGVDb21tYW5kcyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnNldElucHV0Q3Vyc29yQXRUaGVFbmQodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy5zZXRDb21tYW5kRXZlbnQubmV4dCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0VkaXQgSW5wdXQnLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBUb2dnbGVEcm9wZG93bk9wdGlvbnNcbiAgICBwdWJsaWMgdG9nZ2xlRHJvcGRvd25PcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhhbmRsZVRvZ2dsZURyb3Bkb3duT3B0aW9ucy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRHJvcGRvd25Ub2dnbGVyID0gIXRoaXMuaXNEcm9wZG93blRvZ2dsZXI7XG5cbiAgICAgICAgdGhpcy5zZXRTaG93SGlkZURyb3Bkb3duLm5leHQodGhpcy5pc0Ryb3Bkb3duVG9nZ2xlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blRvZ2dsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gb25QbGFjZWhvbGRlckljb25ldmVudFxuICAgIHB1YmxpYyBvblBsYWNlaG9sZGVySWNvbkV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0SW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50Lm5leHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ1RvZ2dsZSBEcm9wZG93bicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50Lm5leHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ1BsYWNlaG9sZGVyIEljb24gRXZlbnQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBTZWxlY3Rpb25DaGFuZ2VcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHRoaXMuaW5wdXRTZWxlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIHNldFNlbGVjdGlvblxuXG4gICAgLy8gI3JlZ2lvbiBBdXRvRm9jdXNGaXJzdElucHV0XG5cbiAgICBwdWJsaWMgYXV0b0ZvY3VzRmlyc3RJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLmF1dG9Gb2N1cyAmJiAhdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRDb25maWcuYXV0b0ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAzMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcHVibGljIG9uUG9wb3ZlclNob3duKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2lucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWwpIHtcbiAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblBvcG92ZXJIaWRkZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Q29uZmlnQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBQcmljZSBTZXBhcmF0b3JcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpblByaWNlU2VwYXJhdG9yTGltaXQgPVxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yTGltaXRhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEN1c3RvbSBSYW5nZVxuICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNVc2luZ0N1c3RvbVBlcmlvZFJhbmdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5wdXRDb25maWcuaXNEaXNwbGF5aW5nQ3VzdG9tUGVyaW9kUmFuZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmlzRm9jdXNJbnB1dCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiBhZGQgbW9kZSBpbiBkcm9wZG93blxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcz8uYWN0aXZlICYmXG4gICAgICAgICAgICAhdGhpcy5faW5wdXRDb25maWcuaXNEaXNhYmxlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dENvbmZpZy5jb21tYW5kcy50eXBlID09PSAnY29uZmlybS1jYW5jZWwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnB1dENvbmZpZy5ibHVlSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Q29uZmlnLmJsYWNrSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tbWFuZHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNGb2N1c0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==