@seniorsistemas/angular-components 19.9.0 → 19.9.1

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 (28) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +7 -1
  2. package/control-errors/lib/control-errors/control-errors.component.d.ts +11 -2
  3. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +8 -2
  4. package/esm2022/control-errors/lib/control-errors/control-errors.component.mjs +21 -1
  5. package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +2 -2
  7. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  8. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +62 -6
  9. package/esm2022/sidebar/public-api.mjs +12 -1
  10. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +7 -1
  11. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  12. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +20 -0
  13. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
  14. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
  15. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  16. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  17. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  18. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +1 -1
  19. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  20. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +61 -5
  21. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  22. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +12 -1
  23. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
  24. package/numeric-mask/README.md +164 -60
  25. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +29 -2
  26. package/package.json +7 -7
  27. package/sidebar/README.md +3 -3
  28. package/sidebar/public-api.d.ts +10 -0
@@ -59,6 +59,22 @@ export class NumericMaskDirective {
59
59
  * Maximum value allowed
60
60
  */
61
61
  max = input(undefined);
62
+ /**
63
+ * Blocks typing/pasting decimal digits beyond maxDecimalPlaces.
64
+ * When maxDecimalPlaces is 0, the decimal separator itself cannot be entered.
65
+ * @default true
66
+ */
67
+ blockDecimalOverflow = input(true);
68
+ /**
69
+ * Strategy applied on blur when blockDecimalOverflow is false.
70
+ * 'preserve' keeps the model at full precision; only the display is truncated (legacy behavior).
71
+ * 'truncate' cuts the excess decimals without rounding (towards zero), updating the model too.
72
+ * 'roundUp' always rounds to the next representable value above (ceiling), updating the model too.
73
+ * 'roundDown' always rounds to the next representable value below (floor), updating the model too.
74
+ * Has no effect while blockDecimalOverflow is true.
75
+ * @default 'preserve'
76
+ */
77
+ decimalRoundingMode = input('preserve');
62
78
  elementRef = inject((ElementRef));
63
79
  renderer = inject(Renderer2);
64
80
  localeService = inject(LocaleService, { optional: true });
@@ -143,12 +159,17 @@ export class NumericMaskDirective {
143
159
  this.lastModelValue = null;
144
160
  return;
145
161
  }
146
- const modelValue = this.toModelValue(currentValue);
162
+ let modelValue = this.toModelValue(currentValue);
147
163
  if (!modelValue) {
148
164
  this.onChange(null);
149
165
  this.lastModelValue = null;
150
166
  return;
151
167
  }
168
+ const roundingMode = this.decimalRoundingMode();
169
+ if (!this.blockDecimalOverflow() && roundingMode !== 'preserve') {
170
+ const rounded = this.truncateToDecimalPlaces(new BigNumber(modelValue), this.maxDecimalPlaces(), this.resolveRoundingMode(roundingMode));
171
+ modelValue = rounded.toFixed();
172
+ }
152
173
  this.lastModelValue = modelValue;
153
174
  const displayValue = this.fromModelValue(modelValue);
154
175
  this.renderer.setProperty(this.elementRef.nativeElement, 'value', displayValue);
@@ -249,6 +270,9 @@ export class NumericMaskDirective {
249
270
  if (!this.decimalSeparator() || !this.thousandSeparator()) {
250
271
  this.updateSeparators();
251
272
  }
273
+ if (this.blockDecimalOverflow()) {
274
+ value = this.applyBlockLimit(value);
275
+ }
252
276
  this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
253
277
  const modelValue = this.toModelValue(value);
254
278
  // During typing, clear the stored model value so onFocus will recalculate
@@ -312,15 +336,47 @@ export class NumericMaskDirective {
312
336
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
313
337
  }
314
338
  /**
315
- * Truncates a number to the specified decimal places (never rounds)
339
+ * Truncates (or rounds, depending on roundingMode) a number to the specified decimal places
316
340
  * @private
317
341
  */
318
- truncateToDecimalPlaces(bigNumber, decimalPlaces) {
342
+ truncateToDecimalPlaces(bigNumber, decimalPlaces, roundingMode = BigNumber.ROUND_DOWN) {
319
343
  if (decimalPlaces < 0) {
320
344
  return bigNumber;
321
345
  }
322
346
  const multiplier = new BigNumber(10).pow(decimalPlaces);
323
- return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);
347
+ return bigNumber.multipliedBy(multiplier).integerValue(roundingMode).dividedBy(multiplier);
348
+ }
349
+ /**
350
+ * Maps decimalRoundingMode to the corresponding BigNumber rounding mode
351
+ * @private
352
+ */
353
+ resolveRoundingMode(mode) {
354
+ if (mode === 'roundUp') {
355
+ return BigNumber.ROUND_CEIL;
356
+ }
357
+ if (mode === 'roundDown') {
358
+ return BigNumber.ROUND_FLOOR;
359
+ }
360
+ return BigNumber.ROUND_DOWN;
361
+ }
362
+ /**
363
+ * Limits the decimal part of a value being typed/pasted to maxDecimalPlaces,
364
+ * preserving any scientific notation exponent untouched
365
+ * @private
366
+ */
367
+ applyBlockLimit(value) {
368
+ const maxDecimals = this.maxDecimalPlaces();
369
+ const eIndex = value.search(/[eE]/);
370
+ const mantissa = eIndex >= 0 ? value.slice(0, eIndex) : value;
371
+ const exponent = eIndex >= 0 ? value.slice(eIndex) : '';
372
+ const sepIndex = mantissa.indexOf(this.decimalSeparator());
373
+ if (sepIndex === -1) {
374
+ return value;
375
+ }
376
+ if (maxDecimals === 0) {
377
+ return mantissa.slice(0, sepIndex) + exponent;
378
+ }
379
+ return mantissa.slice(0, sepIndex + 1 + maxDecimals) + exponent;
324
380
  }
325
381
  /**
326
382
  * Parses a string value to its numeric representation, handling separators and sign
@@ -502,7 +558,7 @@ export class NumericMaskDirective {
502
558
  return null;
503
559
  }
504
560
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NumericMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
505
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange" }, host: { listeners: { "input": "onInput($event)", "focus": "onFocus()", "blur": "onBlur()", "paste": "onPaste($event)", "keydown": "onKeyDown($event)", "keypress": "onKeyPress($event)" }, properties: { "style.text-align": "\"right\"" } }, providers: [
561
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, blockDecimalOverflow: { classPropertyName: "blockDecimalOverflow", publicName: "blockDecimalOverflow", isSignal: true, isRequired: false, transformFunction: null }, decimalRoundingMode: { classPropertyName: "decimalRoundingMode", publicName: "decimalRoundingMode", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange" }, host: { listeners: { "input": "onInput($event)", "focus": "onFocus()", "blur": "onBlur()", "paste": "onPaste($event)", "keydown": "onKeyDown($event)", "keypress": "onKeyPress($event)" }, properties: { "style.text-align": "\"right\"" } }, providers: [
506
562
  {
507
563
  provide: NG_VALUE_ACCESSOR,
508
564
  useExisting: forwardRef(() => NumericMaskDirective),
@@ -543,4 +599,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
543
599
  ],
544
600
  }]
545
601
  }] });
546
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUdMLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixHQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7O0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTBCSCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOzs7T0FHRztJQUNJLE1BQU0sR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXJEOzs7T0FHRztJQUNJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuQzs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwQzs7O09BR0c7SUFDSSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFN0M7O09BRUc7SUFDSSxHQUFHLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVsRDs7T0FFRztJQUNJLEdBQUcsR0FBRyxLQUFL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WUFBWSxFQUFFLG9CQUFvQjt3QkFDbEMsb0JBQW9CLEVBQUUsU0FBUztxQkFDbEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG1vZGVsLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9sb2NhbGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXJldGl2YSBkZSBtw6FzY2FyYSBudW3DqXJpY2EgY29tIHN1cG9ydGUgYSBpbnRlcm5hY2lvbmFsaXphw6fDo28uXG4gKlxuICogRm9ybWF0YSB2YWxvcmVzIG51bcOpcmljb3MgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZSBlc3BlY2lmaWNhZG8sIGFwbGljYW5kb1xuICogc2VwYXJhZG9yZXMgZGUgbWlsaGFyIGUgZGVjaW1hbCBhZGVxdWFkb3MsIGNvbSBzdXBvcnRlIGEgdmFsb3JlcyBuZWdhdGl2b3MsXG4gKiBjb250cm9sZSBkZSBjYXNhcyBkZWNpbWFpcyBtw61uL23DoXggZSBub3Rhw6fDo28gY2llbnTDrWZpY2EuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dFxuICogICB0eXBlPVwidGV4dFwiXG4gKiAgIHNOdW1lcmljTWFza1xuICogICBbbG9jYWxlXT1cIidwdC1CUidcIlxuICogICBbbWluRGVjaW1hbFBsYWNlc109XCIyXCJcbiAqICAgW21heERlY2ltYWxQbGFjZXNdPVwiMlwiXG4gKiAgIFthbGxvd05lZ2F0aXZlXT1cInRydWVcIlxuICogICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAqIC8+XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBOdW1lcmljXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3NOdW1lcmljTWFza10nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICAnKGlucHV0KSc6ICdvbklucHV0KCRldmVudCknLFxuICAgICAgICAnKGZvY3VzKSc6ICdvbkZvY3VzKCknLFxuICAgICAgICAnKGJsdXIpJzogJ29uQmx1cigpJyxcbiAgICAgICAgJyhwYXN0ZSknOiAnb25QYXN0ZSgkZXZlbnQpJyxcbiAgICAgICAgJyhrZXlkb3duKSc6ICdvbktleURvd24oJGV2ZW50KScsXG4gICAgICAgICcoa2V5cHJlc3MpJzogJ29uS2V5UHJlc3MoJGV2ZW50KScsXG4gICAgICAgICdbc3R5bGUudGV4dC1hbGlnbl0nOiAnXCJyaWdodFwiJyxcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWVyaWNNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnVtZXJpY01hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTnVtZXJpY01hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gICAgLyoqXG4gICAgICogTG9jYWxlIGZvciBmb3JtYXR0aW5nIChlLmcuICdwdC1CUicsICdlbi1VUycsICdkZS1ERScpXG4gICAgICogSWYgbm90IHByb3ZpZGVkLCB1c2VzIHRoZSBsb2NhbGUgZnJvbSBMb2NhbGVTZXJ2aWNlXG4gICAgICovXG4gICAgcHVibGljIGxvY2FsZSA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIGRpc3BsYXlcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgcHVibGljIG1pbkRlY2ltYWxQbGFjZXMgPSBpbnB1dCgwKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGFsbG93ZWRcbiAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXhEZWNpbWFsUGxhY2VzID0gaW5wdXQoMTApO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIG5lZ2F0aXZlIHZhbHVlc1xuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgcHVibGljIGFsbG93TmVnYXRpdmUgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHNjaWVudGlmaWMgbm90YXRpb24gc3VwcG9ydFxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsb3dTY2llbnRpZmljTm90YXRpb24gPSBpbnB1dCh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gdmFsdWUgYWxsb3dlZFxuICAgICAqL1xuICAgIHB1YmxpYyBtaW4gPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIHZhbHVlIGFsbG93ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF4ID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgZGVjaW1hbFNlcGFyYXRvciA9IG1vZGVsKCcsJyk7XG4gICAgcHVibGljIHRob3VzYW5kU2VwYXJhdG9yID0gbW9kZWwoJy4nKTtcbiAgICBwcm90ZWN0ZWQgY3VycmVudExvY2FsZSA9ICdwdC1CUic7XG4gICAgcHJpdmF0ZSBsYXN0TW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlJ10gJiYgIWNoYW5nZXNbJ2xvY2FsZSddLmZpcnN0Q2hhbmdlICYmIHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5taW5EZWNpbWFsUGxhY2VzKCkgPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBOdW1lcmljTWFza0RpcmVjdGl2ZTogbWluRGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKX0pIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4RGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1heERlY2ltYWxQbGFjZXMoKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sb2NhbGUoKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy5sb2NhbGUoKSE7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbGVTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlU2VydmljZSEuZ2V0TG9jYWxlT3B0aW9ucygpPy5sb2NhbGUgfHwgJ3B0LUJSJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgaW5wdXQgZXZlbnRzICh0eXBpbmcpXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICB2YWx1ZSA9IHRoaXMubm9ybWFsaXplU2VwYXJhdG9ycyh2YWx1ZSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0lucHV0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBmb2N1cyBldmVudHMgKGdhaW5pbmcgZm9jdXMpXG4gICAgICovXG4gICAgcHVibGljIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0TW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5sYXN0TW9kZWxWYWx1ZS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBtb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICd2YWx1ZScsIGRpc3BsYXlWYWx1ZSk7XG4gICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBibHVyIGV2ZW50cyAoZm9jdXMgbG9zcylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUoY3VycmVudFZhbHVlKTtcblxuICAgICAgICBpZiAoIW1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmZyb21Nb2RlbFZhbHVlKG1vZGVsVmFsdWUpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG1vZGVsVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBwYXN0ZSBldmVudHMgKGNsaXBib2FyZClcbiAgICAgKi9cbiAgICBwdWJsaWMgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpIHx8ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBhcnNlQ2xpcGJvYXJkVmFsdWUocGFzdGVkVGV4dCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIHNwZWNpYWwga2V5cyAoKyBhbmQgLSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnLScgJiYgdGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2lnbih2YWx1ZSwga2V5ID09PSAnLScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGtleXByZXNzIHRvIGJsb2NrIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICgoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoY2hhckJlZm9yZUN1cnNvciA9PT0gJ2UnIHx8IGNoYXJCZWZvcmVDdXJzb3IgPT09ICdFJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICcrJyB8fCBrZXkgPT09ICctJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSAvXlswLTldJC8udGVzdChrZXkpO1xuICAgICAgICBjb25zdCBpc0RlY2ltYWxTZXBhcmF0b3IgPSBrZXkgPT09ICcsJyB8fCBrZXkgPT09ICcuJztcbiAgICAgICAgY29uc3QgaXNTY2llbnRpZmljTm90YXRpb24gPSAoa2V5ID09PSAnZScgfHwga2V5ID09PSAnRScpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKTtcbiAgICAgICAgY29uc3QgaXNDb250cm9sS2V5ID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleTtcbiAgICAgICAgY29uc3QgaXNTcGVjaWFsS2V5ID0gW1xuICAgICAgICAgICAgJ0JhY2tzcGFjZScsXG4gICAgICAgICAgICAnVGFiJyxcbiAgICAgICAgICAgICdFbnRlcicsXG4gICAgICAgICAgICAnRXNjYXBlJyxcbiAgICAgICAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgICAgICAgJ0Fycm93UmlnaHQnLFxuICAgICAgICAgICAgJ0RlbGV0ZScsXG4gICAgICAgICAgICAnSG9tZScsXG4gICAgICAgICAgICAnRW5kJyxcbiAgICAgICAgXS5pbmNsdWRlcyhrZXkpO1xuXG4gICAgICAgIGlmIChpc1NjaWVudGlmaWNOb3RhdGlvbikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdlJykgfHwgdmFsdWUuaW5jbHVkZXMoJ0UnKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGFyQmVmb3JlQ3Vyc29yID0gdmFsdWVbY3Vyc29yUG9zaXRpb24gLSAxXTtcbiAgICAgICAgICAgIGlmICghY2hhckJlZm9yZUN1cnNvciB8fCAhL15bMC05XSQvLnRlc3QoY2hhckJlZm9yZUN1cnNvcikpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaWdpdCAmJiAhaXNEZWNpbWFsU2VwYXJhdG9yICYmICFpc1NjaWVudGlmaWNOb3RhdGlvbiAmJiAhaXNDb250cm9sS2V5ICYmICFpc1NwZWNpYWxLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHNlcGFyYXRvcnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSkuZm9ybWF0KDEyMzQuNSk7XG5cbiAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvci5zZXQoZm9ybWF0dGVkWzFdKTtcbiAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yLnNldChmb3JtYXR0ZWRbNV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBpbnB1dCB2YWx1ZSBhbmQgdXBkYXRlcyB0aGUgaW5wdXQgYW5kIG1vZGVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSB8fCAhdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIC8vIER1cmluZyB0eXBpbmcsIGNsZWFyIHRoZSBzdG9yZWQgbW9kZWwgdmFsdWUgc28gb25Gb2N1cyB3aWxsIHJlY2FsY3VsYXRlXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UobW9kZWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbnB1dG1vZGUgZm9yIG51bWVyaWMga2V5Ym9hcmQgb24gbW9iaWxlIGRldmljZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5wdXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0bW9kZScsICdkZWNpbWFsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ29mZicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc2VwYXJhdG9ycyBmcm9tIGEgZm9ybWF0dGVkIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aG91c2FuZFJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSksICdnJyk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UodGhvdXNhbmRSZWdleCwgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmlwcyB1bm5lY2Vzc2FyeSB0cmFpbGluZyB6ZXJvcyBmcm9tIGRlY2ltYWwgcGFydFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdHJpcFRyYWlsaW5nWmVyb3ModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBkZWNpbWFsUGFydCA9IHBhcnRzWzFdLnJlcGxhY2UoLzArJC8sICcnKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNpbWFsUGFydC5sZW5ndGggPiAwID8gcGFydHNbMF0gKyB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSArIGRlY2ltYWxQYXJ0IDogcGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgc2VwYXJhdG9ycyBkdXJpbmcgdHlwaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5yZW1vdmVTZXBhcmF0b3JzKHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgPT09ICcsJykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC4vZywgJywnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLywvZywgJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgcGFydHMuc2xpY2UoMSkuam9pbignJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgZm9yIHVzZSBpbiByZWdleFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBlc2NhcGVSZWdleChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYSBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBkZWNpbWFsIHBsYWNlcyAobmV2ZXIgcm91bmRzKVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhiaWdOdW1iZXI6IEJpZ051bWJlciwgZGVjaW1hbFBsYWNlczogbnVtYmVyKTogQmlnTnVtYmVyIHtcbiAgICAgICAgaWYgKGRlY2ltYWxQbGFjZXMgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmlnTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBuZXcgQmlnTnVtYmVyKDEwKS5wb3coZGVjaW1hbFBsYWNlcyk7XG4gICAgICAgIHJldHVybiBiaWdOdW1iZXIubXVsdGlwbGllZEJ5KG11bHRpcGxpZXIpLmludGVnZXJWYWx1ZShCaWdOdW1iZXIuUk9VTkRfRE9XTikuZGl2aWRlZEJ5KG11bHRpcGxpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZSB0byBpdHMgbnVtZXJpYyByZXByZXNlbnRhdGlvbiwgaGFuZGxpbmcgc2VwYXJhdG9ycyBhbmQgc2lnblxuICAgICAqIFJldHVybnMgQmlnTnVtYmVyIHRvIHByZXNlcnZlIGZ1bGwgcHJlY2lzaW9uIGFuZCBvcHRpb25hbCBudW1iZXIgY29udmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN0cmluZ1RvVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgYmlnTnVtYmVyOiBCaWdOdW1iZXI7IG51bWVyaWM6IG51bWJlcjsgaXNOZWdhdGl2ZTogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgbGV0IG51bWVyaWNTdHIgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCl9YCwgJ2cnKSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKX1gLCAnZycpLCAnLicpO1xuXG4gICAgICAgIGlmIChudW1lcmljU3RyID09PSAnLicgfHwgbnVtZXJpY1N0ciA9PT0gJycpIHtcbiAgICAgICAgICAgIG51bWVyaWNTdHIgPSAnMCc7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtZXJpY1N0ci5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIG51bWVyaWNTdHIgPSAnMCcgKyBudW1lcmljU3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIobnVtZXJpY1N0cik7XG4gICAgICAgIGlmIChiaWdOdW1iZXIuaXNOYU4oKSkge1xuICAgICAgICAgICAgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc05lZ2F0aXZlICYmIHRoaXMuYWxsb3dOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBiaWdOdW1iZXIubmVnYXRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmlnTnVtYmVyLCBudW1lcmljOiBiaWdOdW1iZXIudG9OdW1iZXIoKSwgaXNOZWdhdGl2ZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHMgYSBudW1lcmljIHZhbHVlIGFjY29yZGluZyB0byB0aGUgbG9jYWxlXG4gICAgICogVHJ1bmNhdGVzIChuZXZlciByb3VuZHMpIHRvIG1heERlY2ltYWxQbGFjZXMgYW5kIHBhZHMgd2l0aCB6ZXJvcyB0byBtaW5EZWNpbWFsUGxhY2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdE51bWVyaWMobnVtZXJpYzogbnVtYmVyIHwgQmlnTnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGJpZ051bWVyaWMgPSBudW1lcmljIGluc3RhbmNlb2YgQmlnTnVtYmVyID8gbnVtZXJpYyA6IG5ldyBCaWdOdW1iZXIobnVtZXJpYyk7XG5cbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkVmFsdWUgPSB0aGlzLnRydW5jYXRlVG9EZWNpbWFsUGxhY2VzKGJpZ051bWVyaWMsIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKTtcblxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IHRydW5jYXRlZFZhbHVlLnRvRml4ZWQoTWF0aC5tYXgodGhpcy5taW5EZWNpbWFsUGxhY2VzKCksIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSk7XG5cbiAgICAgICAgbGV0IGZvcm1hdHRlZFZhbHVlID0gdmFsdWVTdHIucmVwbGFjZSgnLicsIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKTtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlZFZhbHVlLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKTtcbiAgICAgICAgY29uc3QgaW50ZWdlclBhcnQgPSBwYXJ0c1swXTtcbiAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0gfHwgJyc7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkSW50ZWdlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmN1cnJlbnRMb2NhbGUpXG4gICAgICAgICAgICAuZm9ybWF0KHBhcnNlSW50KGludGVnZXJQYXJ0LCAxMCkgfHwgMClcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSlbMF07XG5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRGVjaW1hbFBsYWNlcyA9IGRlY2ltYWxQYXJ0LnJlcGxhY2UoLzArJC8sICcnKS5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBsYWNlc1RvU2hvdyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgdGhpcy5taW5EZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICBNYXRoLm1pbihlZmZlY3RpdmVEZWNpbWFsUGxhY2VzLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zdWJzdHJpbmcoMCwgZGVjaW1hbFBsYWNlc1RvU2hvdykucGFkRW5kKGRlY2ltYWxQbGFjZXNUb1Nob3csICcwJyk7XG5cbiAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0ID8gZm9ybWF0dGVkSW50ZWdlciArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgZGVjaW1hbFBhcnQgOiBmb3JtYXR0ZWRJbnRlZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgdG8gdGhlIG1vZGVsIGZvcm1hdCAoaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBzdHJpbmcpXG4gICAgICogQWx3YXlzIHJldHVybnMgZGVjaW1hbCBub3RhdGlvbiwgbmV2ZXIgc2NpZW50aWZpYyBub3RhdGlvblxuICAgICAqIFN0b3JlcyB0aGUgZnVsbCBwcmVjaXNpb24gdmFsdWUgd2l0aG91dCB0cnVuY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvTW9kZWxWYWx1ZShmb3JtYXR0ZWRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghZm9ybWF0dGVkVmFsdWUgfHwgZm9ybWF0dGVkVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBiaWdOdW1iZXIgfSA9IHRoaXMucGFyc2VTdHJpbmdUb1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJpZ051bWJlci50b0ZpeGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIG1vZGVsIHZhbHVlIHRvIGRpc3BsYXkgZm9ybWF0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZyb21Nb2RlbFZhbHVlKG1vZGVsVmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBpZiAobW9kZWxWYWx1ZSA9PT0gbnVsbCB8fCBtb2RlbFZhbHVlID09PSB1bmRlZmluZWQgfHwgbW9kZWxWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKG1vZGVsVmFsdWUpO1xuICAgICAgICBpZiAoYmlnTnVtYmVyLmlzTmFOKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1lcmljKGJpZ051bWJlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHBhc3RlZCB2YWx1ZSBmcm9tIGNsaXBib2FyZFxuICAgICAqIENvbnZlcnRzIHNjaWVudGlmaWMgbm90YXRpb24gdG8gZGVjaW1hbCB1c2luZyBCaWdOdW1iZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VDbGlwYm9hcmRWYWx1ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpICYmIC9bZUVdLy50ZXN0KHRleHQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpZ051bWVyaWMgPSBuZXcgQmlnTnVtYmVyKHRleHQpO1xuICAgICAgICAgICAgICAgIGlmICghYmlnTnVtZXJpYy5pc05hTigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaWdOdW1lcmljLnRvRml4ZWQoKS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNpZ24gKC0gb3IgKykgb2YgYSB2YWx1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2dnbGVTaWduKHZhbHVlOiBzdHJpbmcsIG1ha2VOZWdhdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobWFrZU5lZ2F0aXZlICYmICFuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gJy0nICsgbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1ha2VOZWdhdGl2ZSAmJiBuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgbmV3VmFsdWUpO1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGVjaW1hbFNlcGFyYXRvcigpIHx8ICF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChoYXNGb2N1cykge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZyb21Nb2RlbFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5zdHJpcFRyYWlsaW5nWmVyb3ModGhpcy5yZW1vdmVTZXBhcmF0b3JzKGZvcm1hdHRlZFZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCByYXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgICBpZiAoaXNOYU4obnVtZXJpY1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYWxsb3dOZWdhdGl2ZSgpICYmIG51bWVyaWNWYWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5lZ2F0aXZlTm90QWxsb3dlZDogdHJ1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSB0aGlzLm1pbigpO1xuICAgICAgICBpZiAobWluVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBudW1lcmljVmFsdWUgPCBtaW5WYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgbWluOiBtaW5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBudW1lcmljVmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtYXhWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA+IG1heFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1heDoge1xuICAgICAgICAgICAgICAgICAgICBtYXg6IG1heFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gdmFsdWUuc3BsaXQoJy4nKVsxXTtcblxuICAgICAgICBpZiAoZGVjaW1hbFBhcnQgJiYgZGVjaW1hbFBhcnQubGVuZ3RoID4gdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXhjZXNzaXZlRGVjaW1hbFBsYWNlczoge1xuICAgICAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4RGVjaW1hbFBsYWNlcygpLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGRlY2ltYWxQYXJ0Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuIl19
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUdMLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixHQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7O0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTBCSCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOzs7T0FHRztJQUNJLE1BQU0sR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXJEOzs7T0FHRztJQUNJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuQzs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwQzs7O09BR0c7SUFDSSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFN0M7O09BRUc7SUFDSSxHQUFHLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVsRDs7T0FFRztJQUNJLEdBQUcsR0FBRyxLQUFL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WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpcmV0aXZhIGRlIG3DoXNjYXJhIG51bcOpcmljYSBjb20gc3Vwb3J0ZSBhIGludGVybmFjaW9uYWxpemHDp8Ojby5cbiAqXG4gKiBGb3JtYXRhIHZhbG9yZXMgbnVtw6lyaWNvcyBkZSBhY29yZG8gY29tIG8gbG9jYWxlIGVzcGVjaWZpY2FkbywgYXBsaWNhbmRvXG4gKiBzZXBhcmFkb3JlcyBkZSBtaWxoYXIgZSBkZWNpbWFsIGFkZXF1YWRvcywgY29tIHN1cG9ydGUgYSB2YWxvcmVzIG5lZ2F0aXZvcyxcbiAqIGNvbnRyb2xlIGRlIGNhc2FzIGRlY2ltYWlzIG3DrW4vbcOheCBlIG5vdGHDp8OjbyBjaWVudMOtZmljYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0XG4gKiAgIHR5cGU9XCJ0ZXh0XCJcbiAqICAgc051bWVyaWNNYXNrXG4gKiAgIFtsb2NhbGVdPVwiJ3B0LUJSJ1wiXG4gKiAgIFttaW5EZWNpbWFsUGxhY2VzXT1cIjJcIlxuICogICBbbWF4RGVjaW1hbFBsYWNlc109XCIyXCJcbiAqICAgW2FsbG93TmVnYXRpdmVdPVwidHJ1ZVwiXG4gKiAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICogLz5cbiAqIGBgYFxuICogQGNhdGVnb3J5IE51bWVyaWNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbc051bWVyaWNNYXNrXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoaW5wdXQpJzogJ29uSW5wdXQoJGV2ZW50KScsXG4gICAgICAgICcoZm9jdXMpJzogJ29uRm9jdXMoKScsXG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuICAgICAgICAnKHBhc3RlKSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJyxcbiAgICAgICAgJyhrZXlwcmVzcyknOiAnb25LZXlQcmVzcygkZXZlbnQpJyxcbiAgICAgICAgJ1tzdHlsZS50ZXh0LWFsaWduXSc6ICdcInJpZ2h0XCInLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnVtZXJpY01hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljTWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOdW1lcmljTWFza0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgICAvKipcbiAgICAgKiBMb2NhbGUgZm9yIGZvcm1hdHRpbmcgKGUuZy4gJ3B0LUJSJywgJ2VuLVVTJywgJ2RlLURFJylcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGxvY2FsZSBmcm9tIExvY2FsZVNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9jYWxlID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gZGlzcGxheVxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWluRGVjaW1hbFBsYWNlcyA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgYWxsb3dlZFxuICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICovXG4gICAgcHVibGljIG1heERlY2ltYWxQbGFjZXMgPSBpbnB1dCgxMCk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgbmVnYXRpdmUgdmFsdWVzXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2NpZW50aWZpYyBub3RhdGlvbiBzdXBwb3J0XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxvd1NjaWVudGlmaWNOb3RhdGlvbiA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSB2YWx1ZSBhbGxvd2VkXG4gICAgICovXG4gICAgcHVibGljIG1pbiA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdmFsdWUgYWxsb3dlZFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBCbG9ja3MgdHlwaW5nL3Bhc3RpbmcgZGVjaW1hbCBkaWdpdHMgYmV5b25kIG1heERlY2ltYWxQbGFjZXMuXG4gICAgICogV2hlbiBtYXhEZWNpbWFsUGxhY2VzIGlzIDAsIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpdHNlbGYgY2Fubm90IGJlIGVudGVyZWQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBibG9ja0RlY2ltYWxPdmVyZmxvdyA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogU3RyYXRlZ3kgYXBwbGllZCBvbiBibHVyIHdoZW4gYmxvY2tEZWNpbWFsT3ZlcmZsb3cgaXMgZmFsc2UuXG4gICAgICogJ3ByZXNlcnZlJyBrZWVwcyB0aGUgbW9kZWwgYXQgZnVsbCBwcmVjaXNpb247IG9ubHkgdGhlIGRpc3BsYXkgaXMgdHJ1bmNhdGVkIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAqICd0cnVuY2F0ZScgY3V0cyB0aGUgZXhjZXNzIGRlY2ltYWxzIHdpdGhvdXQgcm91bmRpbmcgKHRvd2FyZHMgemVybyksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogJ3JvdW5kVXAnIGFsd2F5cyByb3VuZHMgdG8gdGhlIG5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZSBhYm92ZSAoY2VpbGluZyksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogJ3JvdW5kRG93bicgYWx3YXlzIHJvdW5kcyB0byB0aGUgbmV4dCByZXByZXNlbnRhYmxlIHZhbHVlIGJlbG93IChmbG9vciksIHVwZGF0aW5nIHRoZSBtb2RlbCB0b28uXG4gICAgICogSGFzIG5vIGVmZmVjdCB3aGlsZSBibG9ja0RlY2ltYWxPdmVyZmxvdyBpcyB0cnVlLlxuICAgICAqIEBkZWZhdWx0ICdwcmVzZXJ2ZSdcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVjaW1hbFJvdW5kaW5nTW9kZSA9IGlucHV0PCdwcmVzZXJ2ZScgfCAndHJ1bmNhdGUnIHwgJ3JvdW5kVXAnIHwgJ3JvdW5kRG93bic+KCdwcmVzZXJ2ZScpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgZGVjaW1hbFNlcGFyYXRvciA9IG1vZGVsKCcsJyk7XG4gICAgcHVibGljIHRob3VzYW5kU2VwYXJhdG9yID0gbW9kZWwoJy4nKTtcbiAgICBwcm90ZWN0ZWQgY3VycmVudExvY2FsZSA9ICdwdC1CUic7XG4gICAgcHJpdmF0ZSBsYXN0TW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlJ10gJiYgIWNoYW5nZXNbJ2xvY2FsZSddLmZpcnN0Q2hhbmdlICYmIHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5taW5EZWNpbWFsUGxhY2VzKCkgPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBOdW1lcmljTWFza0RpcmVjdGl2ZTogbWluRGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKX0pIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4RGVjaW1hbFBsYWNlcyAoJHt0aGlzLm1heERlY2ltYWxQbGFjZXMoKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sb2NhbGUoKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy5sb2NhbGUoKSE7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbGVTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlU2VydmljZSEuZ2V0TG9jYWxlT3B0aW9ucygpPy5sb2NhbGUgfHwgJ3B0LUJSJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgaW5wdXQgZXZlbnRzICh0eXBpbmcpXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICB2YWx1ZSA9IHRoaXMubm9ybWFsaXplU2VwYXJhdG9ycyh2YWx1ZSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0lucHV0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBmb2N1cyBldmVudHMgKGdhaW5pbmcgZm9jdXMpXG4gICAgICovXG4gICAgcHVibGljIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0TW9kZWxWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5sYXN0TW9kZWxWYWx1ZS5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBtb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICd2YWx1ZScsIGRpc3BsYXlWYWx1ZSk7XG4gICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBibHVyIGV2ZW50cyAoZm9jdXMgbG9zcylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3VuZGluZ01vZGUgPSB0aGlzLmRlY2ltYWxSb3VuZGluZ01vZGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmJsb2NrRGVjaW1hbE92ZXJmbG93KCkgJiYgcm91bmRpbmdNb2RlICE9PSAncHJlc2VydmUnKSB7XG4gICAgICAgICAgICBjb25zdCByb3VuZGVkID0gdGhpcy50cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhcbiAgICAgICAgICAgICAgICBuZXcgQmlnTnVtYmVyKG1vZGVsVmFsdWUpLFxuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVJvdW5kaW5nTW9kZShyb3VuZGluZ01vZGUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGVsVmFsdWUgPSByb3VuZGVkLnRvRml4ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmZyb21Nb2RlbFZhbHVlKG1vZGVsVmFsdWUpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG1vZGVsVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBwYXN0ZSBldmVudHMgKGNsaXBib2FyZClcbiAgICAgKi9cbiAgICBwdWJsaWMgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpIHx8ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBhcnNlQ2xpcGJvYXJkVmFsdWUocGFzdGVkVGV4dCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIHNwZWNpYWwga2V5cyAoKyBhbmQgLSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnLScgJiYgdGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2lnbih2YWx1ZSwga2V5ID09PSAnLScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGtleXByZXNzIHRvIGJsb2NrIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgIGlmICgoa2V5ID09PSAnLScgfHwga2V5ID09PSAnKycpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoY2hhckJlZm9yZUN1cnNvciA9PT0gJ2UnIHx8IGNoYXJCZWZvcmVDdXJzb3IgPT09ICdFJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICcrJyB8fCBrZXkgPT09ICctJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSAvXlswLTldJC8udGVzdChrZXkpO1xuICAgICAgICBjb25zdCBpc0RlY2ltYWxTZXBhcmF0b3IgPSBrZXkgPT09ICcsJyB8fCBrZXkgPT09ICcuJztcbiAgICAgICAgY29uc3QgaXNTY2llbnRpZmljTm90YXRpb24gPSAoa2V5ID09PSAnZScgfHwga2V5ID09PSAnRScpICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKTtcbiAgICAgICAgY29uc3QgaXNDb250cm9sS2V5ID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleTtcbiAgICAgICAgY29uc3QgaXNTcGVjaWFsS2V5ID0gW1xuICAgICAgICAgICAgJ0JhY2tzcGFjZScsXG4gICAgICAgICAgICAnVGFiJyxcbiAgICAgICAgICAgICdFbnRlcicsXG4gICAgICAgICAgICAnRXNjYXBlJyxcbiAgICAgICAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgICAgICAgJ0Fycm93UmlnaHQnLFxuICAgICAgICAgICAgJ0RlbGV0ZScsXG4gICAgICAgICAgICAnSG9tZScsXG4gICAgICAgICAgICAnRW5kJyxcbiAgICAgICAgXS5pbmNsdWRlcyhrZXkpO1xuXG4gICAgICAgIGlmIChpc1NjaWVudGlmaWNOb3RhdGlvbikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdlJykgfHwgdmFsdWUuaW5jbHVkZXMoJ0UnKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGFyQmVmb3JlQ3Vyc29yID0gdmFsdWVbY3Vyc29yUG9zaXRpb24gLSAxXTtcbiAgICAgICAgICAgIGlmICghY2hhckJlZm9yZUN1cnNvciB8fCAhL15bMC05XSQvLnRlc3QoY2hhckJlZm9yZUN1cnNvcikpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaWdpdCAmJiAhaXNEZWNpbWFsU2VwYXJhdG9yICYmICFpc1NjaWVudGlmaWNOb3RhdGlvbiAmJiAhaXNDb250cm9sS2V5ICYmICFpc1NwZWNpYWxLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHNlcGFyYXRvcnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSkuZm9ybWF0KDEyMzQuNSk7XG5cbiAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvci5zZXQoZm9ybWF0dGVkWzFdKTtcbiAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yLnNldChmb3JtYXR0ZWRbNV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBpbnB1dCB2YWx1ZSBhbmQgdXBkYXRlcyB0aGUgaW5wdXQgYW5kIG1vZGVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSB8fCAhdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJsb2NrRGVjaW1hbE92ZXJmbG93KCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5hcHBseUJsb2NrTGltaXQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gRHVyaW5nIHR5cGluZywgY2xlYXIgdGhlIHN0b3JlZCBtb2RlbCB2YWx1ZSBzbyBvbkZvY3VzIHdpbGwgcmVjYWxjdWxhdGVcbiAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGlucHV0bW9kZSBmb3IgbnVtZXJpYyBrZXlib2FyZCBvbiBtb2JpbGUgZGV2aWNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRJbnB1dE1vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaW5wdXRtb2RlJywgJ2RlY2ltYWwnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhdXRvY29tcGxldGUnLCAnb2ZmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBzZXBhcmF0b3JzIGZyb20gYSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlU2VwYXJhdG9ycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRob3VzYW5kUmVnZXggPSBuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgodGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSwgJ2cnKTtcblxuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh0aG91c2FuZFJlZ2V4LCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaXBzIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHplcm9zIGZyb20gZGVjaW1hbCBwYXJ0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0cmlwVHJhaWxpbmdaZXJvcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0ucmVwbGFjZSgvMCskLywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDAgPyBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpICsgZGVjaW1hbFBhcnQgOiBwYXJ0c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBzZXBhcmF0b3JzIGR1cmluZyB0eXBpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplU2VwYXJhdG9ycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlbW92ZVNlcGFyYXRvcnModmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJywnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnLCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpID09PSAnLicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLC9nLCAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnRzWzBdICsgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgKyBwYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBmb3IgdXNlIGluIHJlZ2V4XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGVzY2FwZVJlZ2V4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyAob3Igcm91bmRzLCBkZXBlbmRpbmcgb24gcm91bmRpbmdNb2RlKSBhIG51bWJlciB0byB0aGUgc3BlY2lmaWVkIGRlY2ltYWwgcGxhY2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRydW5jYXRlVG9EZWNpbWFsUGxhY2VzKFxuICAgICAgICBiaWdOdW1iZXI6IEJpZ051bWJlcixcbiAgICAgICAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICAgICAgICByb3VuZGluZ01vZGU6IEJpZ051bWJlci5Sb3VuZGluZ01vZGUgPSBCaWdOdW1iZXIuUk9VTkRfRE9XTixcbiAgICApOiBCaWdOdW1iZXIge1xuICAgICAgICBpZiAoZGVjaW1hbFBsYWNlcyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBiaWdOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IG5ldyBCaWdOdW1iZXIoMTApLnBvdyhkZWNpbWFsUGxhY2VzKTtcbiAgICAgICAgcmV0dXJuIGJpZ051bWJlci5tdWx0aXBsaWVkQnkobXVsdGlwbGllcikuaW50ZWdlclZhbHVlKHJvdW5kaW5nTW9kZSkuZGl2aWRlZEJ5KG11bHRpcGxpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgZGVjaW1hbFJvdW5kaW5nTW9kZSB0byB0aGUgY29ycmVzcG9uZGluZyBCaWdOdW1iZXIgcm91bmRpbmcgbW9kZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNvbHZlUm91bmRpbmdNb2RlKG1vZGU6ICd0cnVuY2F0ZScgfCAncm91bmRVcCcgfCAncm91bmREb3duJyk6IEJpZ051bWJlci5Sb3VuZGluZ01vZGUge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ3JvdW5kVXAnKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLlJPVU5EX0NFSUw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGUgPT09ICdyb3VuZERvd24nKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLlJPVU5EX0ZMT09SO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBCaWdOdW1iZXIuUk9VTkRfRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1pdHMgdGhlIGRlY2ltYWwgcGFydCBvZiBhIHZhbHVlIGJlaW5nIHR5cGVkL3Bhc3RlZCB0byBtYXhEZWNpbWFsUGxhY2VzLFxuICAgICAqIHByZXNlcnZpbmcgYW55IHNjaWVudGlmaWMgbm90YXRpb24gZXhwb25lbnQgdW50b3VjaGVkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5QmxvY2tMaW1pdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWF4RGVjaW1hbHMgPSB0aGlzLm1heERlY2ltYWxQbGFjZXMoKTtcbiAgICAgICAgY29uc3QgZUluZGV4ID0gdmFsdWUuc2VhcmNoKC9bZUVdLyk7XG4gICAgICAgIGNvbnN0IG1hbnRpc3NhID0gZUluZGV4ID49IDAgPyB2YWx1ZS5zbGljZSgwLCBlSW5kZXgpIDogdmFsdWU7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50ID0gZUluZGV4ID49IDAgPyB2YWx1ZS5zbGljZShlSW5kZXgpIDogJyc7XG5cbiAgICAgICAgY29uc3Qgc2VwSW5kZXggPSBtYW50aXNzYS5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHNlcEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heERlY2ltYWxzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFudGlzc2Euc2xpY2UoMCwgc2VwSW5kZXgpICsgZXhwb25lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFudGlzc2Euc2xpY2UoMCwgc2VwSW5kZXggKyAxICsgbWF4RGVjaW1hbHMpICsgZXhwb25lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIHZhbHVlIHRvIGl0cyBudW1lcmljIHJlcHJlc2VudGF0aW9uLCBoYW5kbGluZyBzZXBhcmF0b3JzIGFuZCBzaWduXG4gICAgICogUmV0dXJucyBCaWdOdW1iZXIgdG8gcHJlc2VydmUgZnVsbCBwcmVjaXNpb24gYW5kIG9wdGlvbmFsIG51bWJlciBjb252ZXJzaW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3RyaW5nVG9WYWx1ZSh2YWx1ZTogc3RyaW5nKTogeyBiaWdOdW1iZXI6IEJpZ051bWJlcjsgbnVtZXJpYzogbnVtYmVyOyBpc05lZ2F0aXZlOiBib29sZWFuIH0ge1xuICAgICAgICBjb25zdCBpc05lZ2F0aXZlID0gdmFsdWUuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICBsZXQgbnVtZXJpY1N0ciA9IHZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXi0vLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke3RoaXMudGhvdXNhbmRTZXBhcmF0b3IoKX1gLCAnZycpLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke3RoaXMuZGVjaW1hbFNlcGFyYXRvcigpfWAsICdnJyksICcuJyk7XG5cbiAgICAgICAgaWYgKG51bWVyaWNTdHIgPT09ICcuJyB8fCBudW1lcmljU3RyID09PSAnJykge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJztcbiAgICAgICAgfSBlbHNlIGlmIChudW1lcmljU3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJyArIG51bWVyaWNTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihudW1lcmljU3RyKTtcbiAgICAgICAgaWYgKGJpZ051bWJlci5pc05hTigpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVnYXRpdmUgJiYgdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGJpZ051bWJlciA9IGJpZ051bWJlci5uZWdhdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiaWdOdW1iZXIsIG51bWVyaWM6IGJpZ051bWJlci50b051bWJlcigpLCBpc05lZ2F0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIG51bWVyaWMgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKiBUcnVuY2F0ZXMgKG5ldmVyIHJvdW5kcykgdG8gbWF4RGVjaW1hbFBsYWNlcyBhbmQgcGFkcyB3aXRoIHplcm9zIHRvIG1pbkRlY2ltYWxQbGFjZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZm9ybWF0TnVtZXJpYyhudW1lcmljOiBudW1iZXIgfCBCaWdOdW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmlnTnVtZXJpYyA9IG51bWVyaWMgaW5zdGFuY2VvZiBCaWdOdW1iZXIgPyBudW1lcmljIDogbmV3IEJpZ051bWJlcihudW1lcmljKTtcblxuICAgICAgICBjb25zdCB0cnVuY2F0ZWRWYWx1ZSA9IHRoaXMudHJ1bmNhdGVUb0RlY2ltYWxQbGFjZXMoYmlnTnVtZXJpYywgdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gdHJ1bmNhdGVkVmFsdWUudG9GaXhlZChNYXRoLm1heCh0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSwgdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCkpKTtcblxuICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZVN0ci5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVkVmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpO1xuICAgICAgICBjb25zdCBpbnRlZ2VyUGFydCA9IHBhcnRzWzBdO1xuICAgICAgICBsZXQgZGVjaW1hbFBhcnQgPSBwYXJ0c1sxXSB8fCAnJztcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRJbnRlZ2VyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSlcbiAgICAgICAgICAgIC5mb3JtYXQocGFyc2VJbnQoaW50ZWdlclBhcnQsIDEwKSB8fCAwKVxuICAgICAgICAgICAgLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpKVswXTtcblxuICAgICAgICBjb25zdCBlZmZlY3RpdmVEZWNpbWFsUGxhY2VzID0gZGVjaW1hbFBhcnQucmVwbGFjZSgvMCskLywgJycpLmxlbmd0aDtcblxuICAgICAgICBjb25zdCBkZWNpbWFsUGxhY2VzVG9TaG93ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICB0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSxcbiAgICAgICAgICAgIE1hdGgubWluKGVmZmVjdGl2ZURlY2ltYWxQbGFjZXMsIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSxcbiAgICAgICAgKTtcblxuICAgICAgICBkZWNpbWFsUGFydCA9IGRlY2ltYWxQYXJ0LnN1YnN0cmluZygwLCBkZWNpbWFsUGxhY2VzVG9TaG93KS5wYWRFbmQoZGVjaW1hbFBsYWNlc1RvU2hvdywgJzAnKTtcblxuICAgICAgICByZXR1cm4gZGVjaW1hbFBhcnQgPyBmb3JtYXR0ZWRJbnRlZ2VyICsgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgKyBkZWNpbWFsUGFydCA6IGZvcm1hdHRlZEludGVnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZvcm1hdHRlZCB2YWx1ZSB0byB0aGUgbW9kZWwgZm9ybWF0IChpbnRlcm5hdGlvbmFsIHN0YW5kYXJkIHN0cmluZylcbiAgICAgKiBBbHdheXMgcmV0dXJucyBkZWNpbWFsIG5vdGF0aW9uLCBuZXZlciBzY2llbnRpZmljIG5vdGF0aW9uXG4gICAgICogU3RvcmVzIHRoZSBmdWxsIHByZWNpc2lvbiB2YWx1ZSB3aXRob3V0IHRydW5jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdG9Nb2RlbFZhbHVlKGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWRWYWx1ZSB8fCBmb3JtYXR0ZWRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGJpZ051bWJlciB9ID0gdGhpcy5wYXJzZVN0cmluZ1RvVmFsdWUoZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLnRvRml4ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbW9kZWwgdmFsdWUgdG8gZGlzcGxheSBmb3JtYXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZnJvbU1vZGVsVmFsdWUobW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChtb2RlbFZhbHVlID09PSBudWxsIHx8IG1vZGVsVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtb2RlbFZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChiaWdOdW1iZXIuaXNOYU4oKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMoYmlnTnVtYmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcGFzdGVkIHZhbHVlIGZyb20gY2xpcGJvYXJkXG4gICAgICogQ29udmVydHMgc2NpZW50aWZpYyBub3RhdGlvbiB0byBkZWNpbWFsIHVzaW5nIEJpZ051bWJlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUNsaXBib2FyZFZhbHVlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkgJiYgL1tlRV0vLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlnTnVtZXJpYyA9IG5ldyBCaWdOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKCFiaWdOdW1lcmljLmlzTmFOKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpZ051bWVyaWMudG9GaXhlZCgpLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdm9pZCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVNlcGFyYXRvcnModGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgc2lnbiAoLSBvciArKSBvZiBhIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZVNpZ24odmFsdWU6IHN0cmluZywgbWFrZU5lZ2F0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChtYWtlTmVnYXRpdmUgJiYgIW5ld1ZhbHVlLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSAnLScgKyBuZXdWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghbWFrZU5lZ2F0aXZlICYmIG5ld1ZhbHVlLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0LCAndmFsdWUnLCBuZXdWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLnRvTW9kZWxWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG1vZGVsVmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgfHwgIXRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGhhc0ZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLnN0cmlwVHJhaWxpbmdaZXJvcyh0aGlzLnJlbW92ZVNlcGFyYXRvcnMoZm9ybWF0dGVkVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHJhd1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChpc05hTihudW1lcmljVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkgJiYgbnVtZXJpY1ZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmVOb3RBbGxvd2VkOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA8IG1pblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbjoge1xuICAgICAgICAgICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogbnVtZXJpY1ZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNlc3NpdmVEZWNpbWFsUGxhY2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogZGVjaW1hbFBhcnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4iXX0=
@@ -9,4 +9,15 @@ export const DrawerComponent = DrawerComponentOriginal;
9
9
  * O pacote sidebar será removido na versão 20.0.0.
10
10
  */
11
11
  export const DrawerModule = DrawerModuleOriginal;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaWRlYmFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxlQUFlLElBQUksdUJBQXVCLEVBQzFDLFlBQVksSUFBSSxvQkFBb0IsR0FDdkMsTUFBTSwyQ0FBMkMsQ0FBQztBQUVuRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBEcmF3ZXJDb21wb25lbnQgYXMgRHJhd2VyQ29tcG9uZW50T3JpZ2luYWwsXG4gICAgRHJhd2VyTW9kdWxlIGFzIERyYXdlck1vZHVsZU9yaWdpbmFsLFxufSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RyYXdlcic7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIERyYXdlckNvbXBvbmVudCBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RyYXdlcicuXG4gKiBPIHBhY290ZSBzaWRlYmFyIHNlcsOhIHJlbW92aWRvIG5hIHZlcnPDo28gMjAuMC4wLlxuICovXG5leHBvcnQgY29uc3QgRHJhd2VyQ29tcG9uZW50ID0gRHJhd2VyQ29tcG9uZW50T3JpZ2luYWw7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIERyYXdlck1vZHVsZSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RyYXdlcicuXG4gKiBPIHBhY290ZSBzaWRlYmFyIHNlcsOhIHJlbW92aWRvIG5hIHZlcnPDo28gMjAuMC4wLlxuICovXG5leHBvcnQgY29uc3QgRHJhd2VyTW9kdWxlID0gRHJhd2VyTW9kdWxlT3JpZ2luYWw7XG4iXX0=
12
+ // Aliases com os nomes antigos para manter compatibilidade
13
+ /**
14
+ * @deprecated Use DrawerComponent from '@seniorsistemas/angular-components/drawer'.
15
+ * O pacote sidebar será removido na versão 20.0.0.
16
+ */
17
+ export const SidebarComponent = DrawerComponentOriginal;
18
+ /**
19
+ * @deprecated Use DrawerModule from '@seniorsistemas/angular-components/drawer'.
20
+ * O pacote sidebar será removido na versão 20.0.0.
21
+ */
22
+ export const SidebarModule = DrawerModuleOriginal;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaWRlYmFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxlQUFlLElBQUksdUJBQXVCLEVBQzFDLFlBQVksSUFBSSxvQkFBb0IsR0FDdkMsTUFBTSwyQ0FBMkMsQ0FBQztBQUVuRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBRWpELDJEQUEyRDtBQUMzRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQztBQUV4RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERyYXdlckNvbXBvbmVudCBhcyBEcmF3ZXJDb21wb25lbnRPcmlnaW5hbCxcbiAgICBEcmF3ZXJNb2R1bGUgYXMgRHJhd2VyTW9kdWxlT3JpZ2luYWwsXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHJhd2VyJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRHJhd2VyQ29tcG9uZW50IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHJhd2VyJy5cbiAqIE8gcGFjb3RlIHNpZGViYXIgc2Vyw6EgcmVtb3ZpZG8gbmEgdmVyc8OjbyAyMC4wLjAuXG4gKi9cbmV4cG9ydCBjb25zdCBEcmF3ZXJDb21wb25lbnQgPSBEcmF3ZXJDb21wb25lbnRPcmlnaW5hbDtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRHJhd2VyTW9kdWxlIGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHJhd2VyJy5cbiAqIE8gcGFjb3RlIHNpZGViYXIgc2Vyw6EgcmVtb3ZpZG8gbmEgdmVyc8OjbyAyMC4wLjAuXG4gKi9cbmV4cG9ydCBjb25zdCBEcmF3ZXJNb2R1bGUgPSBEcmF3ZXJNb2R1bGVPcmlnaW5hbDtcblxuLy8gQWxpYXNlcyBjb20gb3Mgbm9tZXMgYW50aWdvcyBwYXJhIG1hbnRlciBjb21wYXRpYmlsaWRhZGVcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIERyYXdlckNvbXBvbmVudCBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RyYXdlcicuXG4gKiBPIHBhY290ZSBzaWRlYmFyIHNlcsOhIHJlbW92aWRvIG5hIHZlcnPDo28gMjAuMC4wLlxuICovXG5leHBvcnQgY29uc3QgU2lkZWJhckNvbXBvbmVudCA9IERyYXdlckNvbXBvbmVudE9yaWdpbmFsO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBEcmF3ZXJNb2R1bGUgZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9kcmF3ZXInLlxuICogTyBwYWNvdGUgc2lkZWJhciBzZXLDoSByZW1vdmlkbyBuYSB2ZXJzw6NvIDIwLjAuMC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNpZGViYXJNb2R1bGUgPSBEcmF3ZXJNb2R1bGVPcmlnaW5hbDtcbiJdfQ==
@@ -82,6 +82,12 @@ class BignumberInputDirective extends NumericMaskDirective {
82
82
  * @default true
83
83
  */
84
84
  allowNegative = input(true);
85
+ /**
86
+ * Preserves this deprecated directive's legacy behavior: NumericMaskDirective now
87
+ * defaults to blocking decimal overflow while typing/pasting, but existing
88
+ * sBignumberInput consumers should not have their input behavior changed silently.
89
+ */
90
+ blockDecimalOverflow = input(false);
85
91
  /**
86
92
  * @description Texto de placeholder exibido quando o campo está vazio.
87
93
  */
@@ -218,7 +224,7 @@ class BignumberInputDirective extends NumericMaskDirective {
218
224
  this._lastAutoPlaceholder = autoPlaceholder;
219
225
  }
220
226
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
221
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, isStandalone: true, selector: "input[sBignumberInput]", inputs: { precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandsSeparator: { classPropertyName: "thousandsSeparator", publicName: "thousandsSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, alignTo: { classPropertyName: "alignTo", publicName: "alignTo", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { minDecimalPlaces: "minDecimalPlacesChange", maxDecimalPlaces: "maxDecimalPlacesChange", decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange", placeholder: "placeholderChange", pasteRejected: "pasteRejected" }, host: { properties: { "attr.placeholder": "placeholder()", "attr.maxLength": "maxLength" } }, providers: [
227
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, isStandalone: true, selector: "input[sBignumberInput]", inputs: { precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandsSeparator: { classPropertyName: "thousandsSeparator", publicName: "thousandsSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, alignTo: { classPropertyName: "alignTo", publicName: "alignTo", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, blockDecimalOverflow: { classPropertyName: "blockDecimalOverflow", publicName: "blockDecimalOverflow", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { minDecimalPlaces: "minDecimalPlacesChange", maxDecimalPlaces: "maxDecimalPlacesChange", decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange", placeholder: "placeholderChange", pasteRejected: "pasteRejected" }, host: { properties: { "attr.placeholder": "placeholder()", "attr.maxLength": "maxLength" } }, providers: [
222
228
  {
223
229
  provide: NG_VALUE_ACCESSOR,
224
230
  // NOSONAR - 'BignumberInputDirective' is deprecated.
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-bignumber-input.mjs","sources":["../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.directive.ts","../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.module.ts","../../projects/angular-components/bignumber-input/src/seniorsistemas-angular-components-bignumber-input.ts"],"sourcesContent":["import { Directive, forwardRef, input, model, OnChanges, OnInit, output, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NG_VALUE_ACCESSOR, ValidationErrors } from '@angular/forms';\r\n\r\nimport { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';\r\n\r\n/**\r\n * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.\r\n */\r\nexport enum BignumberAlignmentOption {\r\n RIGHT = 'right',\r\n LEFT = 'left',\r\n}\r\n\r\n/**\r\n * @deprecated Utilize a diretiva `BigNumberInput` ao invés desta.\r\n * @description Diretiva de máscara para campos de entrada de números de grande precisão,\r\n * adaptada do `CurrencyMaskDirective`. Permite configurar precisão, escala,\r\n * separadores decimais e de milhar de acordo com o locale da aplicação.\r\n *\r\n * @example\r\n * ```html\r\n * <input sBignumberInput [precision]=\"15\" [scale]=\"2\" [allowNegative]=\"false\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Directive({\r\n selector: 'input[sBignumberInput]',\r\n host: {\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.maxLength]': 'maxLength',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n useExisting: forwardRef(() => BignumberInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n})\r\nexport class BignumberInputDirective extends NumericMaskDirective implements OnInit, OnChanges {\r\n /**\r\n * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).\r\n *\r\n * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.\r\n * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.\r\n * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,\r\n * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.\r\n *\r\n * @default 15\r\n */\r\n public precision = input(15);\r\n\r\n /**\r\n * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.\r\n * @description Número de casas decimais exibidas e aceitas pelo campo.\r\n * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.\r\n *\r\n * @default 0\r\n */\r\n public scale = input(0);\r\n\r\n /**\r\n * @description Número mínimo de casas decimais exibidas.\r\n *\r\n * @default 0\r\n */\r\n public override minDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Número máximo de casas decimais aceitas.\r\n *\r\n * @default 0\r\n */\r\n public override maxDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Separador decimal personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override decimalSeparator = model(',');\r\n\r\n /**\r\n * @deprecated Use `thousandSeparator` ao invés deste.\r\n * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.\r\n */\r\n public thousandsSeparator = input<string | undefined>(undefined);\r\n\r\n /**\r\n * @description Separador de milhar personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override thousandSeparator = model('.');\r\n\r\n /**\r\n * @deprecated Este input não tem mais efeito e pode ser removido.\r\n * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.\r\n */\r\n public alignTo = input<'left' | 'right'>('right');\r\n\r\n /**\r\n * @description Permite a entrada de valores negativos.\r\n *\r\n * @default true\r\n */\r\n public override allowNegative = input(true);\r\n\r\n /**\r\n * @description Texto de placeholder exibido quando o campo está vazio.\r\n */\r\n public placeholder = model<string | undefined>(undefined);\r\n\r\n public maxLength?: number;\r\n\r\n /**\r\n * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.\r\n * Emite a string colada que foi recusada.\r\n */\r\n public pasteRejected = output<string>();\r\n\r\n private _decimalSeparatorExplicit = false;\r\n private _thousandSeparatorExplicit = false;\r\n private _lastAutoPlaceholder: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updatePlaceholder();\r\n }\r\n\r\n // ngOnChanges handles all signal writes reactively, avoiding the need for\r\n // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs\r\n // have truthy defaults, so ngOnChanges is necessary to distinguish \"parent bound this\"\r\n // from \"it's just the default value\".\r\n public override ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['decimalSeparator'] && this.decimalSeparator()) {\r\n this._decimalSeparatorExplicit = true;\r\n }\r\n if (changes['thousandSeparator'] && this.thousandSeparator()) {\r\n this._thousandSeparatorExplicit = true;\r\n }\r\n if (changes['thousandsSeparator']) {\r\n const val = this.thousandsSeparator();\r\n if (val !== undefined) {\r\n this._thousandSeparatorExplicit = true;\r\n this.thousandSeparator.set(val);\r\n }\r\n }\r\n if (changes['scale']) {\r\n this.minDecimalPlaces.set(this.scale());\r\n this.maxDecimalPlaces.set(this.scale());\r\n }\r\n if (\r\n changes['scale'] ||\r\n changes['decimalSeparator'] ||\r\n changes['thousandSeparator'] ||\r\n changes['thousandsSeparator'] ||\r\n changes['precision']\r\n ) {\r\n this.calculateMaxLength();\r\n }\r\n if (changes['scale'] || changes['decimalSeparator']) {\r\n this.updatePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Overrides base paste handler to add precision validation.\r\n * If the pasted value exceeds `precision` digits, the paste is rejected.\r\n */\r\n public override onPaste(event: ClipboardEvent): void {\r\n const pastedText = event.clipboardData?.getData('text') ?? '';\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const numericText = pastedText\r\n .replace(new RegExp(`\\\\${effectiveThousandSep}`, 'g'), '')\r\n .replace(this.decimalSeparator(), '.');\r\n const [intPart, decimalPart = ''] = numericText.split('.');\r\n const totalDigits = intPart.replace(/\\D/g, '').length + decimalPart.slice(0, this.scale()).length;\r\n\r\n if (totalDigits > this.precision()) {\r\n event.preventDefault();\r\n this.pasteRejected.emit(pastedText);\r\n return;\r\n }\r\n\r\n super.onPaste(event);\r\n }\r\n\r\n /**\r\n * Overrides locale-derived separators with explicitly set inputs, if provided.\r\n * If no explicit separator is set, the locale-derived value is used.\r\n */\r\n protected override updateSeparators(): void {\r\n const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;\r\n const explicitThousand = this._thousandSeparatorExplicit\r\n ? (this.thousandsSeparator() ?? this.thousandSeparator())\r\n : undefined;\r\n\r\n super.updateSeparators();\r\n\r\n if (explicitDecimal !== undefined) {\r\n this.decimalSeparator.set(explicitDecimal);\r\n }\r\n if (explicitThousand !== undefined) {\r\n this.thousandSeparator.set(explicitThousand);\r\n }\r\n\r\n this.calculateMaxLength();\r\n this.updatePlaceholder();\r\n }\r\n\r\n /**\r\n * Overrides base validator to add precision validation.\r\n * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.\r\n */\r\n public override validate(control: AbstractControl): ValidationErrors | null {\r\n const baseErrors = super.validate(control);\r\n\r\n if (!control.value || !this.precision()) {\r\n return baseErrors ?? null;\r\n }\r\n\r\n const numericStr = String(control.value).replace('-', '');\r\n const [intPart, decimalPart = ''] = numericStr.split('.');\r\n const totalDigits = intPart.length + decimalPart.length;\r\n\r\n if (totalDigits > this.precision()) {\r\n return {\r\n ...baseErrors,\r\n exceedsPrecision: {\r\n precision: this.precision(),\r\n actual: totalDigits,\r\n },\r\n };\r\n }\r\n\r\n return baseErrors ?? null;\r\n }\r\n\r\n /**\r\n * Responsible to calculate the field maximum length considering the separators.\r\n */\r\n private calculateMaxLength(): void {\r\n const decSepLength = this.decimalSeparator()?.length ?? 0;\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const thoSepLength = effectiveThousandSep?.length ?? 0;\r\n\r\n const DIGITS_GROUP_SIZE = 3;\r\n\r\n let maxLength = this.precision() + (this.scale() ? decSepLength : 0);\r\n maxLength +=\r\n Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;\r\n\r\n this.maxLength = maxLength;\r\n }\r\n\r\n private updatePlaceholder(): void {\r\n const scale = this.scale();\r\n const autoPlaceholder = scale ? `0${this.decimalSeparator()}${''.padEnd(scale, '0')}` : '0';\r\n\r\n if (this.placeholder() === undefined || this.placeholder() === this._lastAutoPlaceholder) {\r\n this.placeholder.set(autoPlaceholder);\r\n }\r\n\r\n this._lastAutoPlaceholder = autoPlaceholder;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n// NOSONAR - 'BignumberInputDirective' is deprecated.\r\nimport { BignumberInputDirective } from './bignumber-input.directive';\r\n\r\n@NgModule({\r\n imports: [BignumberInputDirective],\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n exports: [BignumberInputDirective],\r\n})\r\nexport class BignumberInputModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-bignumber-input.mjs","sources":["../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.directive.ts","../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.module.ts","../../projects/angular-components/bignumber-input/src/seniorsistemas-angular-components-bignumber-input.ts"],"sourcesContent":["import { Directive, forwardRef, input, model, OnChanges, OnInit, output, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NG_VALUE_ACCESSOR, ValidationErrors } from '@angular/forms';\r\n\r\nimport { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';\r\n\r\n/**\r\n * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.\r\n */\r\nexport enum BignumberAlignmentOption {\r\n RIGHT = 'right',\r\n LEFT = 'left',\r\n}\r\n\r\n/**\r\n * @deprecated Utilize a diretiva `BigNumberInput` ao invés desta.\r\n * @description Diretiva de máscara para campos de entrada de números de grande precisão,\r\n * adaptada do `CurrencyMaskDirective`. Permite configurar precisão, escala,\r\n * separadores decimais e de milhar de acordo com o locale da aplicação.\r\n *\r\n * @example\r\n * ```html\r\n * <input sBignumberInput [precision]=\"15\" [scale]=\"2\" [allowNegative]=\"false\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Directive({\r\n selector: 'input[sBignumberInput]',\r\n host: {\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.maxLength]': 'maxLength',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n useExisting: forwardRef(() => BignumberInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n})\r\nexport class BignumberInputDirective extends NumericMaskDirective implements OnInit, OnChanges {\r\n /**\r\n * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).\r\n *\r\n * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.\r\n * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.\r\n * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,\r\n * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.\r\n *\r\n * @default 15\r\n */\r\n public precision = input(15);\r\n\r\n /**\r\n * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.\r\n * @description Número de casas decimais exibidas e aceitas pelo campo.\r\n * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.\r\n *\r\n * @default 0\r\n */\r\n public scale = input(0);\r\n\r\n /**\r\n * @description Número mínimo de casas decimais exibidas.\r\n *\r\n * @default 0\r\n */\r\n public override minDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Número máximo de casas decimais aceitas.\r\n *\r\n * @default 0\r\n */\r\n public override maxDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Separador decimal personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override decimalSeparator = model(',');\r\n\r\n /**\r\n * @deprecated Use `thousandSeparator` ao invés deste.\r\n * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.\r\n */\r\n public thousandsSeparator = input<string | undefined>(undefined);\r\n\r\n /**\r\n * @description Separador de milhar personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override thousandSeparator = model('.');\r\n\r\n /**\r\n * @deprecated Este input não tem mais efeito e pode ser removido.\r\n * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.\r\n */\r\n public alignTo = input<'left' | 'right'>('right');\r\n\r\n /**\r\n * @description Permite a entrada de valores negativos.\r\n *\r\n * @default true\r\n */\r\n public override allowNegative = input(true);\r\n\r\n /**\r\n * Preserves this deprecated directive's legacy behavior: NumericMaskDirective now\r\n * defaults to blocking decimal overflow while typing/pasting, but existing\r\n * sBignumberInput consumers should not have their input behavior changed silently.\r\n */\r\n public override blockDecimalOverflow = input(false);\r\n\r\n /**\r\n * @description Texto de placeholder exibido quando o campo está vazio.\r\n */\r\n public placeholder = model<string | undefined>(undefined);\r\n\r\n public maxLength?: number;\r\n\r\n /**\r\n * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.\r\n * Emite a string colada que foi recusada.\r\n */\r\n public pasteRejected = output<string>();\r\n\r\n private _decimalSeparatorExplicit = false;\r\n private _thousandSeparatorExplicit = false;\r\n private _lastAutoPlaceholder: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updatePlaceholder();\r\n }\r\n\r\n // ngOnChanges handles all signal writes reactively, avoiding the need for\r\n // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs\r\n // have truthy defaults, so ngOnChanges is necessary to distinguish \"parent bound this\"\r\n // from \"it's just the default value\".\r\n public override ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['decimalSeparator'] && this.decimalSeparator()) {\r\n this._decimalSeparatorExplicit = true;\r\n }\r\n if (changes['thousandSeparator'] && this.thousandSeparator()) {\r\n this._thousandSeparatorExplicit = true;\r\n }\r\n if (changes['thousandsSeparator']) {\r\n const val = this.thousandsSeparator();\r\n if (val !== undefined) {\r\n this._thousandSeparatorExplicit = true;\r\n this.thousandSeparator.set(val);\r\n }\r\n }\r\n if (changes['scale']) {\r\n this.minDecimalPlaces.set(this.scale());\r\n this.maxDecimalPlaces.set(this.scale());\r\n }\r\n if (\r\n changes['scale'] ||\r\n changes['decimalSeparator'] ||\r\n changes['thousandSeparator'] ||\r\n changes['thousandsSeparator'] ||\r\n changes['precision']\r\n ) {\r\n this.calculateMaxLength();\r\n }\r\n if (changes['scale'] || changes['decimalSeparator']) {\r\n this.updatePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Overrides base paste handler to add precision validation.\r\n * If the pasted value exceeds `precision` digits, the paste is rejected.\r\n */\r\n public override onPaste(event: ClipboardEvent): void {\r\n const pastedText = event.clipboardData?.getData('text') ?? '';\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const numericText = pastedText\r\n .replace(new RegExp(`\\\\${effectiveThousandSep}`, 'g'), '')\r\n .replace(this.decimalSeparator(), '.');\r\n const [intPart, decimalPart = ''] = numericText.split('.');\r\n const totalDigits = intPart.replace(/\\D/g, '').length + decimalPart.slice(0, this.scale()).length;\r\n\r\n if (totalDigits > this.precision()) {\r\n event.preventDefault();\r\n this.pasteRejected.emit(pastedText);\r\n return;\r\n }\r\n\r\n super.onPaste(event);\r\n }\r\n\r\n /**\r\n * Overrides locale-derived separators with explicitly set inputs, if provided.\r\n * If no explicit separator is set, the locale-derived value is used.\r\n */\r\n protected override updateSeparators(): void {\r\n const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;\r\n const explicitThousand = this._thousandSeparatorExplicit\r\n ? (this.thousandsSeparator() ?? this.thousandSeparator())\r\n : undefined;\r\n\r\n super.updateSeparators();\r\n\r\n if (explicitDecimal !== undefined) {\r\n this.decimalSeparator.set(explicitDecimal);\r\n }\r\n if (explicitThousand !== undefined) {\r\n this.thousandSeparator.set(explicitThousand);\r\n }\r\n\r\n this.calculateMaxLength();\r\n this.updatePlaceholder();\r\n }\r\n\r\n /**\r\n * Overrides base validator to add precision validation.\r\n * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.\r\n */\r\n public override validate(control: AbstractControl): ValidationErrors | null {\r\n const baseErrors = super.validate(control);\r\n\r\n if (!control.value || !this.precision()) {\r\n return baseErrors ?? null;\r\n }\r\n\r\n const numericStr = String(control.value).replace('-', '');\r\n const [intPart, decimalPart = ''] = numericStr.split('.');\r\n const totalDigits = intPart.length + decimalPart.length;\r\n\r\n if (totalDigits > this.precision()) {\r\n return {\r\n ...baseErrors,\r\n exceedsPrecision: {\r\n precision: this.precision(),\r\n actual: totalDigits,\r\n },\r\n };\r\n }\r\n\r\n return baseErrors ?? null;\r\n }\r\n\r\n /**\r\n * Responsible to calculate the field maximum length considering the separators.\r\n */\r\n private calculateMaxLength(): void {\r\n const decSepLength = this.decimalSeparator()?.length ?? 0;\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const thoSepLength = effectiveThousandSep?.length ?? 0;\r\n\r\n const DIGITS_GROUP_SIZE = 3;\r\n\r\n let maxLength = this.precision() + (this.scale() ? decSepLength : 0);\r\n maxLength +=\r\n Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;\r\n\r\n this.maxLength = maxLength;\r\n }\r\n\r\n private updatePlaceholder(): void {\r\n const scale = this.scale();\r\n const autoPlaceholder = scale ? `0${this.decimalSeparator()}${''.padEnd(scale, '0')}` : '0';\r\n\r\n if (this.placeholder() === undefined || this.placeholder() === this._lastAutoPlaceholder) {\r\n this.placeholder.set(autoPlaceholder);\r\n }\r\n\r\n this._lastAutoPlaceholder = autoPlaceholder;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n// NOSONAR - 'BignumberInputDirective' is deprecated.\r\nimport { BignumberInputDirective } from './bignumber-input.directive';\r\n\r\n@NgModule({\r\n imports: [BignumberInputDirective],\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n exports: [BignumberInputDirective],\r\n})\r\nexport class BignumberInputModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -52,14 +52,34 @@ class ControlErrorsComponent {
52
52
  form;
53
53
  errorMessagesList = [];
54
54
  onDestroy$ = new Subject();
55
+ /**
56
+ * Assinatura barata do último estado verificado (dirty + chaves de erro).
57
+ * Permite reagir a `markAsDirty()` chamado sem alteração de valor (ex: validação
58
+ * disparada manualmente no submit) sem recalcular `errorMessagesList` em todo ciclo
59
+ * de change detection — só quando esse estado de fato muda.
60
+ */
61
+ lastCheckedSignature = '';
55
62
  ngOnChanges(changes) {
56
63
  if (changes['control'] && changes['control'].firstChange) {
57
64
  this.control?.valueChanges?.pipe(takeUntil(this.onDestroy$)).subscribe(() => this.setErrorMessagesList());
58
65
  }
59
66
  }
67
+ ngDoCheck() {
68
+ const signature = this.getControlSignature();
69
+ if (signature !== this.lastCheckedSignature) {
70
+ this.lastCheckedSignature = signature;
71
+ this.setErrorMessagesList();
72
+ }
73
+ }
74
+ getControlSignature() {
75
+ const dirty = !!this.control?.dirty;
76
+ const errorKeys = Object.keys(this.control?.errors || {});
77
+ return `${dirty}|${errorKeys.join(',')}`;
78
+ }
60
79
  setErrorMessagesList() {
61
80
  if (!this.control?.dirty) {
62
81
  this.errorMessagesList = [];
82
+ return;
63
83
  }
64
84
  this.errorMessagesList = Object.keys(this.control.errors || {}).map((error) => ({
65
85
  id: `${Date.now()}-${Math.random().toString(ControlErrorsComponent.BASE_36).substring(2, ControlErrorsComponent.RANDOM_ID_END_INDEX)}`,
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-control-errors.mjs","sources":["../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.ts","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.html","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.module.ts","../../projects/angular-components/control-errors/src/seniorsistemas-angular-components-control-errors.ts"],"sourcesContent":["import { Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NgModel } from '@angular/forms';\r\n\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\ntype ErrorMessageType = {\r\n id: string;\r\n message: string;\r\n};\r\n\r\n/**\r\n * @description Componente que exibe as mensagens de erro de validação associadas a um controle de formulário.\r\n * Observa as alterações de estado do controle e renderiza as mensagens mapeadas em `errorMessages`.\r\n * Compativel com `AbstractControl` do Reactive Forms e `NgModel` do Template-Driven Forms.\r\n *\r\n * @example\r\n * ```html\r\n * <s-control-errors\r\n * [control]=\"form.get('email')\"\r\n * [errorMessages]=\"{ required: 'E-mail obrigatório', email: 'E-mail inválido' }\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n selector: 's-control-errors',\r\n templateUrl: './control-errors.component.html',\r\n standalone: true,\r\n})\r\nexport class ControlErrorsComponent implements OnDestroy, OnChanges {\r\n public static readonly nextIdSeed = 0;\r\n private static readonly RANDOM_ID_END_INDEX = 9;\r\n private static readonly BASE_36 = 36;\r\n\r\n private static _nextId = ControlErrorsComponent.nextIdSeed;\r\n\r\n public static getNextId(): number {\r\n return this._nextId++;\r\n }\r\n\r\n /**\r\n * @description Identificador único do componente. Gerado automaticamente se não informado.\r\n * Usado para associação acessível com o campo correspondente.\r\n */\r\n @Input()\r\n public id = `s-control-errors-${ControlErrorsComponent.getNextId()}`;\r\n\r\n /**\r\n * @description Controle do formulário cujos erros serão exibidos.\r\n * Aceita `AbstractControl` (Reactive Forms) ou `NgModel` (Template-Driven Forms). Campo obrigatório.\r\n */\r\n @Input({ required: true })\r\n public control!: AbstractControl | NgModel;\r\n\r\n /**\r\n * @description Mapa de chaves de erro para mensagens de texto exibidas ao usuário.\r\n * Cada chave corresponde a um erro que pode estar presente em `control.errors`.\r\n *\r\n * @example\r\n * ```ts\r\n * { required: 'Campo obrigatório', minlength: 'Mínimo 8 caracteres' }\r\n * ```\r\n */\r\n @Input()\r\n public errorMessages: any = {};\r\n\r\n /**\r\n * @description Referência ao formulário pai. Utilizado em cenários de validação customizada\r\n * que dependem do estado geral do formulário.\r\n */\r\n @Input()\r\n public form: any;\r\n\r\n errorMessagesList: ErrorMessageType[] = [];\r\n\r\n private readonly onDestroy$ = new Subject<void>();\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['control'] && changes['control'].firstChange) {\r\n this.control?.valueChanges?.pipe(takeUntil(this.onDestroy$)).subscribe(() => this.setErrorMessagesList());\r\n }\r\n }\r\n\r\n setErrorMessagesList() {\r\n if (!this.control?.dirty) {\r\n this.errorMessagesList = [];\r\n }\r\n\r\n this.errorMessagesList = Object.keys(this.control.errors || {}).map((error) => ({\r\n id: `${Date.now()}-${Math.random().toString(ControlErrorsComponent.BASE_36).substring(2, ControlErrorsComponent.RANDOM_ID_END_INDEX)}`,\r\n message: this.errorMessages?.[error],\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.onDestroy$.next();\r\n this.onDestroy$.complete();\r\n }\r\n}\r\n","@for (errorMessage of errorMessagesList; track errorMessage.id) {\n @if (errorMessage) {\n <div \n class=\"text-criticality-red mt-[5px] text-xs\" \n role=\"alert\" \n aria-live=\"assertive\" \n aria-atomic=\"true\"\n >\n {{ errorMessage.message }}\n </div>\n }\n}\n","import { NgModule } from '@angular/core';\r\n\r\nimport { ControlErrorsComponent } from './control-errors.component';\r\n\r\n@NgModule({\r\n imports: [ControlErrorsComponent],\r\n exports: [ControlErrorsComponent],\r\n})\r\nexport class ControlErrorsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-control-errors.mjs","sources":["../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.ts","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.component.html","../../projects/angular-components/control-errors/src/lib/control-errors/control-errors.module.ts","../../projects/angular-components/control-errors/src/seniorsistemas-angular-components-control-errors.ts"],"sourcesContent":["import { Component, DoCheck, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NgModel } from '@angular/forms';\r\n\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\ntype ErrorMessageType = {\r\n id: string;\r\n message: string;\r\n};\r\n\r\n/**\r\n * @description Componente que exibe as mensagens de erro de validação associadas a um controle de formulário.\r\n * Observa as alterações de estado do controle e renderiza as mensagens mapeadas em `errorMessages`.\r\n * Compativel com `AbstractControl` do Reactive Forms e `NgModel` do Template-Driven Forms.\r\n *\r\n * @example\r\n * ```html\r\n * <s-control-errors\r\n * [control]=\"form.get('email')\"\r\n * [errorMessages]=\"{ required: 'E-mail obrigatório', email: 'E-mail inválido' }\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n selector: 's-control-errors',\r\n templateUrl: './control-errors.component.html',\r\n standalone: true,\r\n})\r\nexport class ControlErrorsComponent implements OnDestroy, OnChanges, DoCheck {\r\n public static readonly nextIdSeed = 0;\r\n private static readonly RANDOM_ID_END_INDEX = 9;\r\n private static readonly BASE_36 = 36;\r\n\r\n private static _nextId = ControlErrorsComponent.nextIdSeed;\r\n\r\n public static getNextId(): number {\r\n return this._nextId++;\r\n }\r\n\r\n /**\r\n * @description Identificador único do componente. Gerado automaticamente se não informado.\r\n * Usado para associação acessível com o campo correspondente.\r\n */\r\n @Input()\r\n public id = `s-control-errors-${ControlErrorsComponent.getNextId()}`;\r\n\r\n /**\r\n * @description Controle do formulário cujos erros serão exibidos.\r\n * Aceita `AbstractControl` (Reactive Forms) ou `NgModel` (Template-Driven Forms). Campo obrigatório.\r\n */\r\n @Input({ required: true })\r\n public control!: AbstractControl | NgModel;\r\n\r\n /**\r\n * @description Mapa de chaves de erro para mensagens de texto exibidas ao usuário.\r\n * Cada chave corresponde a um erro que pode estar presente em `control.errors`.\r\n *\r\n * @example\r\n * ```ts\r\n * { required: 'Campo obrigatório', minlength: 'Mínimo 8 caracteres' }\r\n * ```\r\n */\r\n @Input()\r\n public errorMessages: any = {};\r\n\r\n /**\r\n * @description Referência ao formulário pai. Utilizado em cenários de validação customizada\r\n * que dependem do estado geral do formulário.\r\n */\r\n @Input()\r\n public form: any;\r\n\r\n errorMessagesList: ErrorMessageType[] = [];\r\n\r\n private readonly onDestroy$ = new Subject<void>();\r\n\r\n /**\r\n * Assinatura barata do último estado verificado (dirty + chaves de erro).\r\n * Permite reagir a `markAsDirty()` chamado sem alteração de valor (ex: validação\r\n * disparada manualmente no submit) sem recalcular `errorMessagesList` em todo ciclo\r\n * de change detection — só quando esse estado de fato muda.\r\n */\r\n private lastCheckedSignature = '';\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['control'] && changes['control'].firstChange) {\r\n this.control?.valueChanges?.pipe(takeUntil(this.onDestroy$)).subscribe(() => this.setErrorMessagesList());\r\n }\r\n }\r\n\r\n ngDoCheck(): void {\r\n const signature = this.getControlSignature();\r\n\r\n if (signature !== this.lastCheckedSignature) {\r\n this.lastCheckedSignature = signature;\r\n this.setErrorMessagesList();\r\n }\r\n }\r\n\r\n private getControlSignature(): string {\r\n const dirty = !!this.control?.dirty;\r\n const errorKeys = Object.keys(this.control?.errors || {});\r\n\r\n return `${dirty}|${errorKeys.join(',')}`;\r\n }\r\n\r\n setErrorMessagesList() {\r\n if (!this.control?.dirty) {\r\n this.errorMessagesList = [];\r\n\r\n return;\r\n }\r\n\r\n this.errorMessagesList = Object.keys(this.control.errors || {}).map((error) => ({\r\n id: `${Date.now()}-${Math.random().toString(ControlErrorsComponent.BASE_36).substring(2, ControlErrorsComponent.RANDOM_ID_END_INDEX)}`,\r\n message: this.errorMessages?.[error],\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.onDestroy$.next();\r\n this.onDestroy$.complete();\r\n }\r\n}\r\n","@for (errorMessage of errorMessagesList; track errorMessage.id) {\n @if (errorMessage) {\n <div \n class=\"text-criticality-red mt-[5px] text-xs\" \n role=\"alert\" \n aria-live=\"assertive\" \n aria-atomic=\"true\"\n >\n {{ errorMessage.message }}\n </div>\n }\n}\n","import { NgModule } from '@angular/core';\r\n\r\nimport { ControlErrorsComponent } from './control-errors.component';\r\n\r\n@NgModule({\r\n imports: [ControlErrorsComponent],\r\n exports: [ControlErrorsComponent],\r\n})\r\nexport class ControlErrorsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}