@seniorsistemas/angular-components 19.1.0 → 19.2.0

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 (42) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +58 -25
  2. package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +8 -8
  3. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +140 -99
  4. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +12 -12
  5. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
  7. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  8. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  9. package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-number-field.mjs +2 -3
  10. package/esm2022/locale/lib/locale/apply-localized-mask.mjs +19 -0
  11. package/esm2022/locale/lib/locale/pipes/localized-bignumber-impure.pipe.mjs +1 -1
  12. package/esm2022/locale/lib/locale/pipes/localized-bignumber.pipe.mjs +5 -4
  13. package/esm2022/locale/public-api.mjs +2 -1
  14. package/esm2022/number-input/lib/number-input/number-input.directive.mjs +12 -148
  15. package/esm2022/number-input/lib/number-input/number-input.module.mjs +5 -5
  16. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +32 -35
  17. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +20 -4
  18. package/esm2022/table/public-api.mjs +2 -1
  19. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +139 -98
  20. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  21. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +19 -19
  22. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  23. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +2 -3
  24. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  25. package/fesm2022/seniorsistemas-angular-components-locale.mjs +22 -4
  26. package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-number-input.mjs +14 -151
  28. package/fesm2022/seniorsistemas-angular-components-number-input.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +31 -34
  30. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-table.mjs +21 -6
  32. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  33. package/inline-edit/lib/inline-edit/fields/inline-edit-number-field.d.ts +2 -3
  34. package/locale/lib/locale/apply-localized-mask.d.ts +9 -0
  35. package/locale/lib/locale/pipes/localized-bignumber-impure.pipe.d.ts +2 -3
  36. package/locale/lib/locale/pipes/localized-bignumber.pipe.d.ts +3 -2
  37. package/locale/public-api.d.ts +1 -0
  38. package/number-input/lib/number-input/number-input.directive.d.ts +7 -47
  39. package/number-input/lib/number-input/number-input.module.d.ts +2 -2
  40. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +8 -9
  41. package/package.json +1 -1
  42. package/table/public-api.d.ts +1 -0
@@ -1,9 +1,9 @@
1
- import { ElementRef, EventEmitter, KeyValueDiffers, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { CurrencyMaskDirective } from 'ng2-currency-mask';
3
- import { LocaleService } from '@seniorsistemas/angular-components/locale';
1
+ import { OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { AbstractControl, ValidationErrors } from '@angular/forms';
3
+ import { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
- * @deprecated Should use 'AlignmentOptions' from @seniorsistemas/ng2-currency-mask instead
6
+ * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.
7
7
  */
8
8
  export declare enum BignumberAlignmentOption {
9
9
  RIGHT = "right",
@@ -22,66 +22,99 @@ export declare enum BignumberAlignmentOption {
22
22
  *
23
23
  * @category Inputs
24
24
  */
25
- export declare class BignumberInputDirective extends CurrencyMaskDirective implements OnInit, OnChanges {
26
- private readonly localeService;
25
+ export declare class BignumberInputDirective extends NumericMaskDirective implements OnInit, OnChanges {
27
26
  /**
28
- * @description Número total de dígitos significativos aceitos pelo campo.
27
+ * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).
28
+ *
29
+ * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.
30
+ * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.
31
+ * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,
32
+ * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.
29
33
  *
30
34
  * @default 15
31
35
  */
32
- precision: number;
36
+ precision: import("@angular/core").InputSignal<number>;
33
37
  /**
38
+ * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.
34
39
  * @description Número de casas decimais exibidas e aceitas pelo campo.
40
+ * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.
41
+ *
42
+ * @default 0
43
+ */
44
+ scale: import("@angular/core").InputSignal<number>;
45
+ /**
46
+ * @description Número mínimo de casas decimais exibidas.
47
+ *
48
+ * @default 0
49
+ */
50
+ minDecimalPlaces: import("@angular/core").ModelSignal<number>;
51
+ /**
52
+ * @description Número máximo de casas decimais aceitas.
35
53
  *
36
54
  * @default 0
37
55
  */
38
- scale: number;
56
+ maxDecimalPlaces: import("@angular/core").ModelSignal<number>;
39
57
  /**
40
58
  * @description Separador decimal personalizado. Quando não informado,
41
59
  * utiliza o separador definido pelo locale ativo da aplicação.
42
60
  */
43
- decimalSeparator?: string;
61
+ decimalSeparator: import("@angular/core").ModelSignal<string>;
62
+ /**
63
+ * @deprecated Use `thousandSeparator` ao invés deste.
64
+ * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.
65
+ */
66
+ thousandsSeparator: import("@angular/core").InputSignal<string | undefined>;
44
67
  /**
45
68
  * @description Separador de milhar personalizado. Quando não informado,
46
69
  * utiliza o separador definido pelo locale ativo da aplicação.
47
70
  */
48
- thousandsSeparator?: string;
71
+ thousandSeparator: import("@angular/core").ModelSignal<string>;
49
72
  /**
50
- * @description Alinhamento do conteúdo do campo. Aceita `'left'` ou `'right'`.
51
- *
52
- * @default 'left'
73
+ * @deprecated Este input não tem mais efeito e pode ser removido.
74
+ * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.
53
75
  */
54
- alignTo: 'left' | 'right';
76
+ alignTo: import("@angular/core").InputSignal<"right" | "left">;
55
77
  /**
56
78
  * @description Permite a entrada de valores negativos.
57
79
  *
58
80
  * @default true
59
81
  */
60
- allowNegative: boolean;
82
+ allowNegative: import("@angular/core").InputSignal<boolean>;
61
83
  /**
62
84
  * @description Texto de placeholder exibido quando o campo está vazio.
63
85
  */
64
- placeholder?: string;
86
+ placeholder: import("@angular/core").ModelSignal<string | undefined>;
65
87
  maxLength?: number;
66
88
  /**
67
- * @description Emitido quando uma colé (paste) é rejeitada pela validação do campo.
89
+ * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.
68
90
  * Emite a string colada que foi recusada.
69
91
  */
70
- pasteRejected: EventEmitter<string>;
71
- private readonly regex;
72
- constructor(_elementRef: ElementRef, _keyValueDiffers: KeyValueDiffers, localeService: LocaleService);
92
+ pasteRejected: import("@angular/core").OutputEmitterRef<string>;
93
+ private _decimalSeparatorExplicit;
94
+ private _thousandSeparatorExplicit;
95
+ constructor();
73
96
  ngOnInit(): void;
74
97
  ngOnChanges(changes: SimpleChanges): void;
98
+ /**
99
+ * Overrides base paste handler to add precision validation.
100
+ * If the pasted value exceeds `precision` digits, the paste is rejected.
101
+ */
75
102
  onPaste(event: ClipboardEvent): void;
76
103
  /**
77
- * Update the options values according to the directive input values.
104
+ * Overrides locale-derived separators with explicitly set inputs, if provided.
105
+ * If no explicit separator is set, the locale-derived value is used.
106
+ */
107
+ protected updateSeparators(): void;
108
+ /**
109
+ * Overrides base validator to add precision validation.
110
+ * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.
78
111
  */
79
- private updateVariables;
112
+ validate(control: AbstractControl): ValidationErrors | null;
80
113
  /**
81
114
  * Responsible to calculate the field maximum length considering the separators.
82
115
  */
83
116
  private calculateMaxLength;
84
- private onLocaleService;
117
+ private updatePlaceholder;
85
118
  static ɵfac: i0.ɵɵFactoryDeclaration<BignumberInputDirective, never>;
86
- static ɵdir: i0.ɵɵDirectiveDeclaration<BignumberInputDirective, "input[sBignumberInput]", never, { "precision": { "alias": "precision"; "required": false; }; "scale": { "alias": "scale"; "required": false; }; "decimalSeparator": { "alias": "decimalSeparator"; "required": false; }; "thousandsSeparator": { "alias": "thousandsSeparator"; "required": false; }; "alignTo": { "alias": "alignTo"; "required": false; }; "allowNegative": { "alias": "allowNegative"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; }, { "pasteRejected": "pasteRejected"; }, never, never, false, never>;
119
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BignumberInputDirective, "input[sBignumberInput]", never, { "precision": { "alias": "precision"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "minDecimalPlaces": { "alias": "minDecimalPlaces"; "required": false; "isSignal": true; }; "maxDecimalPlaces": { "alias": "maxDecimalPlaces"; "required": false; "isSignal": true; }; "decimalSeparator": { "alias": "decimalSeparator"; "required": false; "isSignal": true; }; "thousandsSeparator": { "alias": "thousandsSeparator"; "required": false; "isSignal": true; }; "thousandSeparator": { "alias": "thousandSeparator"; "required": false; "isSignal": true; }; "alignTo": { "alias": "alignTo"; "required": false; "isSignal": true; }; "allowNegative": { "alias": "allowNegative"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "minDecimalPlaces": "minDecimalPlacesChange"; "maxDecimalPlaces": "maxDecimalPlacesChange"; "decimalSeparator": "decimalSeparatorChange"; "thousandSeparator": "thousandSeparatorChange"; "placeholder": "placeholderChange"; "pasteRejected": "pasteRejected"; }, never, never, false, never>;
87
120
  }
@@ -1,14 +1,12 @@
1
1
  import { ChangeDetectorRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { ControlValueAccessor, FormGroup } from '@angular/forms';
3
3
  import { TranslateService } from '@ngx-translate/core';
4
- import { MaskConfig } from '@seniorsistemas/ng2-currency-mask';
4
+ import { LoadingStateIndicators } from '@seniorsistemas/angular-components/loading-state';
5
+ import { LocalizedBignumberOptions } from '@seniorsistemas/angular-components/locale';
5
6
  import { HotkeysService } from 'angular2-hotkeys';
6
7
  import { SortMeta } from 'primeng/api';
7
8
  import { AutoComplete, AutoCompleteCompleteEvent } from 'primeng/autocomplete';
8
9
  import { Table, TableLazyLoadEvent } from 'primeng/table';
9
- import { DefaultFilter } from './types/default-filter';
10
- import { LabelOptions } from './types/label-options';
11
- import { LoadingStateIndicators } from '@seniorsistemas/angular-components/loading-state';
12
10
  import { DynamicStructure } from '../../configurations/structure/structure';
13
11
  import { BignumberFieldConfig } from '../../form-field/configurations/fields/bignumber-field';
14
12
  import { CurrencyFieldConfig } from '../../form-field/configurations/fields/currency-field';
@@ -17,6 +15,8 @@ import { NumberFieldConfig } from '../../form-field/configurations/fields/number
17
15
  import { SelectFieldConfig } from '../../form-field/configurations/fields/select-field';
18
16
  import { TextFieldConfig } from '../../form-field/configurations/fields/text-field';
19
17
  import { LookupSearchRequest } from './models/lookup-api.model';
18
+ import { DefaultFilter } from './types/default-filter';
19
+ import { LabelOptions } from './types/label-options';
20
20
  import * as i0 from "@angular/core";
21
21
  export declare class LookupComponent implements ControlValueAccessor, OnChanges, OnInit, OnDestroy {
22
22
  private readonly hotkeysService;
@@ -128,10 +128,10 @@ export declare class LookupComponent implements ControlValueAccessor, OnChanges,
128
128
  getColWidth(label: string): string;
129
129
  getScale(scale: any): number;
130
130
  private isFunction;
131
- getDoubleMaskConfig(col: NumberFieldConfig | BignumberFieldConfig): MaskConfig;
132
- getMoneyMaskConfig(col: CurrencyFieldConfig): MaskConfig;
133
- getIntegerMaskConfig(col: BignumberFieldConfig | NumberFieldConfig): MaskConfig;
134
- getNumberMaskConfig(col: NumberFieldConfig | BignumberFieldConfig): MaskConfig;
131
+ getDoubleMaskConfig(col: NumberFieldConfig | BignumberFieldConfig): LocalizedBignumberOptions;
132
+ getMoneyMaskConfig(col: CurrencyFieldConfig): LocalizedBignumberOptions;
133
+ getIntegerMaskConfig(col: BignumberFieldConfig | NumberFieldConfig): LocalizedBignumberOptions;
134
+ getNumberMaskConfig(col: NumberFieldConfig | BignumberFieldConfig): LocalizedBignumberOptions;
135
135
  parseValueMaskValue(col: DynamicType, rowData: any): any;
136
136
  fieldHasMask(field: DynamicType): field is NumberFieldConfig | BignumberFieldConfig | TextFieldConfig;
137
137
  onTableRowDoubleClick(rowData: any): void;
@@ -1,11 +1,9 @@
1
- import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, } from '@angular/core';
1
+ import { Directive, forwardRef, input, model, output } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { CurrencyMaskDirective } from 'ng2-currency-mask';
4
- import { first } from 'rxjs/operators';
3
+ import { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';
5
4
  import * as i0 from "@angular/core";
6
- import * as i1 from "@seniorsistemas/angular-components/locale";
7
5
  /**
8
- * @deprecated Should use 'AlignmentOptions' from @seniorsistemas/ng2-currency-mask instead
6
+ * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.
9
7
  */
10
8
  export var BignumberAlignmentOption;
11
9
  (function (BignumberAlignmentOption) {
@@ -25,134 +23,198 @@ export var BignumberAlignmentOption;
25
23
  *
26
24
  * @category Inputs
27
25
  */
28
- export class BignumberInputDirective extends CurrencyMaskDirective {
29
- localeService;
26
+ export class BignumberInputDirective extends NumericMaskDirective {
30
27
  /**
31
- * @description Número total de dígitos significativos aceitos pelo campo.
28
+ * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).
29
+ *
30
+ * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.
31
+ * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.
32
+ * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,
33
+ * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.
32
34
  *
33
35
  * @default 15
34
36
  */
35
- precision = 15;
37
+ precision = input(15);
36
38
  /**
39
+ * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.
37
40
  * @description Número de casas decimais exibidas e aceitas pelo campo.
41
+ * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.
38
42
  *
39
43
  * @default 0
40
44
  */
41
- scale = 0;
45
+ scale = input(0);
46
+ /**
47
+ * @description Número mínimo de casas decimais exibidas.
48
+ *
49
+ * @default 0
50
+ */
51
+ minDecimalPlaces = model(0);
52
+ /**
53
+ * @description Número máximo de casas decimais aceitas.
54
+ *
55
+ * @default 0
56
+ */
57
+ maxDecimalPlaces = model(0);
42
58
  /**
43
59
  * @description Separador decimal personalizado. Quando não informado,
44
60
  * utiliza o separador definido pelo locale ativo da aplicação.
45
61
  */
46
- decimalSeparator;
62
+ decimalSeparator = model(',');
63
+ /**
64
+ * @deprecated Use `thousandSeparator` ao invés deste.
65
+ * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.
66
+ */
67
+ thousandsSeparator = input(undefined);
47
68
  /**
48
69
  * @description Separador de milhar personalizado. Quando não informado,
49
70
  * utiliza o separador definido pelo locale ativo da aplicação.
50
71
  */
51
- thousandsSeparator;
72
+ thousandSeparator = model('.');
52
73
  /**
53
- * @description Alinhamento do conteúdo do campo. Aceita `'left'` ou `'right'`.
54
- *
55
- * @default 'left'
74
+ * @deprecated Este input não tem mais efeito e pode ser removido.
75
+ * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.
56
76
  */
57
- alignTo = 'left';
77
+ alignTo = input('right');
58
78
  /**
59
79
  * @description Permite a entrada de valores negativos.
60
80
  *
61
81
  * @default true
62
82
  */
63
- allowNegative = true;
83
+ allowNegative = input(true);
64
84
  /**
65
85
  * @description Texto de placeholder exibido quando o campo está vazio.
66
86
  */
67
- placeholder;
87
+ placeholder = model(undefined);
68
88
  maxLength;
69
89
  /**
70
- * @description Emitido quando uma colé (paste) é rejeitada pela validação do campo.
90
+ * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.
71
91
  * Emite a string colada que foi recusada.
72
92
  */
73
- pasteRejected = new EventEmitter();
74
- regex = /\d/;
75
- //TODO: Ajuste no ng2-currency-mask para utilizar esse Código (aplicado na tarefa: SDS-305)
76
- // private readonly _angularComponentsLocaleService: LocaleService;
77
- // constructor(injector: Injector) {
78
- // super(injector);
79
- // this._angularComponentsLocaleService = injector.get(LocaleService);
80
- // this.onLocaleService();
81
- // }
82
- //TODO: Remover esse constructor
83
- constructor(_elementRef, _keyValueDiffers, localeService) {
84
- super({ align: '', allowNegative: true, decimal: '', precision: 0, prefix: '', suffix: '', thousands: '' }, _elementRef, _keyValueDiffers);
85
- this.localeService = localeService;
86
- this.onLocaleService();
93
+ pasteRejected = output();
94
+ _decimalSeparatorExplicit = false;
95
+ _thousandSeparatorExplicit = false;
96
+ constructor() {
97
+ super();
87
98
  }
88
99
  ngOnInit() {
89
- this.updateVariables();
90
100
  super.ngOnInit();
101
+ this.updatePlaceholder();
91
102
  }
103
+ // ngOnChanges handles all signal writes reactively, avoiding the need for
104
+ // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs
105
+ // have truthy defaults, so ngOnChanges is necessary to distinguish "parent bound this"
106
+ // from "it's just the default value".
92
107
  ngOnChanges(changes) {
93
- const placeholderChange = changes['placeholder']?.currentValue;
94
- if (!placeholderChange && this.scale) {
95
- this.placeholder = `0${this.decimalSeparator}${''.padEnd(this.scale, '0')}`;
108
+ if (changes['decimalSeparator'] && this.decimalSeparator()) {
109
+ this._decimalSeparatorExplicit = true;
110
+ }
111
+ if (changes['thousandSeparator'] && this.thousandSeparator()) {
112
+ this._thousandSeparatorExplicit = true;
96
113
  }
97
- const configChanged = changes['scale'] ||
114
+ if (changes['thousandsSeparator']) {
115
+ const val = this.thousandsSeparator();
116
+ if (val !== undefined) {
117
+ this._thousandSeparatorExplicit = true;
118
+ this.thousandSeparator.set(val);
119
+ }
120
+ }
121
+ if (changes['scale']) {
122
+ this.minDecimalPlaces.set(this.scale());
123
+ this.maxDecimalPlaces.set(this.scale());
124
+ }
125
+ if (changes['scale'] ||
98
126
  changes['decimalSeparator'] ||
127
+ changes['thousandSeparator'] ||
99
128
  changes['thousandsSeparator'] ||
100
- changes['alignTo'] ||
101
- changes['precision'] ||
102
- changes['allowNegative'];
103
- if (configChanged) {
104
- this.updateVariables();
129
+ changes['precision']) {
130
+ this.calculateMaxLength();
131
+ }
132
+ if (changes['scale'] || changes['decimalSeparator']) {
133
+ this.updatePlaceholder();
105
134
  }
106
135
  }
136
+ /**
137
+ * Overrides base paste handler to add precision validation.
138
+ * If the pasted value exceeds `precision` digits, the paste is rejected.
139
+ */
107
140
  onPaste(event) {
108
141
  const pastedText = event.clipboardData?.getData('text') ?? '';
142
+ const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();
109
143
  const numericText = pastedText
110
- .replace(new RegExp(`\\${this.thousandsSeparator}`, 'g'), '')
111
- .replace(this.decimalSeparator, '.');
144
+ .replace(new RegExp(`\\${effectiveThousandSep}`, 'g'), '')
145
+ .replace(this.decimalSeparator(), '.');
112
146
  const [intPart, decimalPart = ''] = numericText.split('.');
113
- const totalDigits = intPart.replace(/\D/g, '').length + decimalPart.slice(0, this.scale).length;
114
- if (totalDigits > this.precision) {
147
+ const totalDigits = intPart.replace(/\D/g, '').length + decimalPart.slice(0, this.scale()).length;
148
+ if (totalDigits > this.precision()) {
115
149
  event.preventDefault();
116
150
  this.pasteRejected.emit(pastedText);
151
+ return;
117
152
  }
153
+ super.onPaste(event);
118
154
  }
119
155
  /**
120
- * Update the options values according to the directive input values.
156
+ * Overrides locale-derived separators with explicitly set inputs, if provided.
157
+ * If no explicit separator is set, the locale-derived value is used.
121
158
  */
122
- updateVariables() {
123
- this.options = {
124
- align: this.alignTo,
125
- decimal: this.decimalSeparator,
126
- thousands: this.thousandsSeparator,
127
- precision: this.scale || 0,
128
- prefix: '',
129
- suffix: '',
130
- allowNegative: this.allowNegative,
131
- };
159
+ updateSeparators() {
160
+ const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;
161
+ const explicitThousand = this._thousandSeparatorExplicit
162
+ ? (this.thousandsSeparator() ?? this.thousandSeparator())
163
+ : undefined;
164
+ super.updateSeparators();
165
+ if (explicitDecimal !== undefined) {
166
+ this.decimalSeparator.set(explicitDecimal);
167
+ }
168
+ if (explicitThousand !== undefined) {
169
+ this.thousandSeparator.set(explicitThousand);
170
+ }
132
171
  this.calculateMaxLength();
172
+ this.updatePlaceholder();
173
+ }
174
+ /**
175
+ * Overrides base validator to add precision validation.
176
+ * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.
177
+ */
178
+ validate(control) {
179
+ const baseErrors = super.validate(control);
180
+ if (!control.value || !this.precision()) {
181
+ return baseErrors ?? null;
182
+ }
183
+ const numericStr = String(control.value).replace('-', '');
184
+ const [intPart, decimalPart = ''] = numericStr.split('.');
185
+ const totalDigits = intPart.length + decimalPart.length;
186
+ if (totalDigits > this.precision()) {
187
+ return {
188
+ ...baseErrors,
189
+ exceedsPrecision: {
190
+ precision: this.precision(),
191
+ actual: totalDigits,
192
+ },
193
+ };
194
+ }
195
+ return baseErrors ?? null;
133
196
  }
134
197
  /**
135
198
  * Responsible to calculate the field maximum length considering the separators.
136
199
  */
137
200
  calculateMaxLength() {
138
- const decSepLength = this.decimalSeparator?.length ?? 0;
139
- const thoSepLength = this.thousandsSeparator?.length ?? 0;
201
+ const decSepLength = this.decimalSeparator()?.length ?? 0;
202
+ const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();
203
+ const thoSepLength = effectiveThousandSep?.length ?? 0;
140
204
  const DIGITS_GROUP_SIZE = 3;
141
- let maxLength = this.precision + (this.scale ? decSepLength : 0);
142
- maxLength += Math.ceil((this.precision - (this.scale ? this.scale : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;
205
+ let maxLength = this.precision() + (this.scale() ? decSepLength : 0);
206
+ maxLength +=
207
+ Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;
143
208
  this.maxLength = maxLength;
144
209
  }
145
- onLocaleService() {
146
- this.localeService
147
- .getLocale()
148
- .pipe(first())
149
- .subscribe(() => {
150
- this.decimalSeparator = this.decimalSeparator ?? this.localeService.getDecimalSeparator();
151
- this.thousandsSeparator = this.thousandsSeparator ?? this.localeService.getGroupingSeparator();
152
- });
210
+ updatePlaceholder() {
211
+ const scale = this.scale();
212
+ if (!this.placeholder() && scale) {
213
+ this.placeholder.set(`0${this.decimalSeparator()}${''.padEnd(scale, '0')}`);
214
+ }
153
215
  }
154
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.KeyValueDiffers }, { token: i1.LocaleService }], target: i0.ɵɵFactoryTarget.Directive });
155
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BignumberInputDirective, selector: "input[sBignumberInput]", inputs: { precision: "precision", scale: "scale", decimalSeparator: "decimalSeparator", thousandsSeparator: "thousandsSeparator", alignTo: "alignTo", allowNegative: "allowNegative", placeholder: "placeholder" }, outputs: { pasteRejected: "pasteRejected" }, host: { listeners: { "paste": "onPaste($event)" }, properties: { "attr.placeholder": "this.placeholder", "attr.maxLength": "this.maxLength" } }, providers: [
216
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
217
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, 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: [
156
218
  {
157
219
  provide: NG_VALUE_ACCESSOR,
158
220
  // NOSONAR - 'BignumberInputDirective' is deprecated.
@@ -165,6 +227,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
165
227
  type: Directive,
166
228
  args: [{
167
229
  selector: 'input[sBignumberInput]',
230
+ host: {
231
+ '[attr.placeholder]': 'placeholder()',
232
+ '[attr.maxLength]': 'maxLength',
233
+ },
168
234
  providers: [
169
235
  {
170
236
  provide: NG_VALUE_ACCESSOR,
@@ -174,30 +240,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
174
240
  },
175
241
  ],
176
242
  }]
177
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.KeyValueDiffers }, { type: i1.LocaleService }], propDecorators: { precision: [{
178
- type: Input
179
- }], scale: [{
180
- type: Input
181
- }], decimalSeparator: [{
182
- type: Input
183
- }], thousandsSeparator: [{
184
- type: Input
185
- }], alignTo: [{
186
- type: Input
187
- }], allowNegative: [{
188
- type: Input
189
- }], placeholder: [{
190
- type: Input
191
- }, {
192
- type: HostBinding,
193
- args: ['attr.placeholder']
194
- }], maxLength: [{
195
- type: HostBinding,
196
- args: ['attr.maxLength']
197
- }], pasteRejected: [{
198
- type: Output
199
- }], onPaste: [{
200
- type: HostListener,
201
- args: ['paste', ['$event']]
202
- }] } });
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9iaWdudW1iZXItaW5wdXQvc3JjL2xpYi9iaWdudW1iZXItaW5wdXQvYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBSXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksd0JBR1g7QUFIRCxXQUFZLHdCQUF3QjtJQUNoQywyQ0FBZSxDQUFBO0lBQ2YseUNBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSFcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQUduQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQVlILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxxQkFBcUI7SUFnRnpDO0lBL0VyQjs7OztPQUlHO0lBRUksU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUV0Qjs7OztPQUlHO0lBRUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVqQjs7O09BR0c7SUFFSSxnQkFBZ0IsQ0FBVTtJQUVqQzs7O09BR0c7SUFFSSxrQkFBa0IsQ0FBVTtJQUVuQzs7OztPQUlHO0lBRUksT0FBTyxHQUFxQixNQUFNLENBQUM7SUFFMUM7Ozs7T0FJRztJQUVJLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFNUI7O09BRUc7SUFHSSxXQUFXLENBQVU7SUFHckIsU0FBUyxD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SSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDbkcsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO3dHQTFLUSx1QkFBdUI7NEZBQXZCLHVCQUF1QixtY0FUckI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixxREFBcUQ7Z0JBQ3JELFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3RELEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSjs7NEZBRVEsdUJBQXVCO2tCQVhuQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixxREFBcUQ7NEJBQ3JELFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjtpQkFDSjt5SUFRVSxTQUFTO3NCQURmLEtBQUs7Z0JBU0MsS0FBSztzQkFEWCxLQUFLO2dCQVFDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFRQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBU0MsT0FBTztzQkFEYixLQUFLO2dCQVNDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBUUMsV0FBVztzQkFGakIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBSXhCLFNBQVM7c0JBRGYsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBUXRCLGFBQWE7c0JBRG5CLE1BQU07Z0JBd0RBLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBLZXlWYWx1ZURpZmZlcnMsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ3VycmVuY3lNYXNrRGlyZWN0aXZlIH0gZnJvbSAnbmcyLWN1cnJlbmN5LW1hc2snO1xuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGlnbm1lbnRPcHRpb25zIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL25nMi1jdXJyZW5jeS1tYXNrJztcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZSc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2hvdWxkIHVzZSAnQWxpZ25tZW50T3B0aW9ucycgZnJvbSBAc2VuaW9yc2lzdGVtYXMvbmcyLWN1cnJlbmN5LW1hc2sgaW5zdGVhZFxuICovXG5leHBvcnQgZW51bSBCaWdudW1iZXJBbGlnbm1lbnRPcHRpb24ge1xuICAgIFJJR0hUID0gJ3JpZ2h0JyxcbiAgICBMRUZUID0gJ2xlZnQnLFxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFV0aWxpemUgYSBkaXJldGl2YSBgQmlnTnVtYmVySW5wdXRgIGFvIGludsOpcyBkZXN0YS5cbiAqIEBkZXNjcmlwdGlvbiBEaXJldGl2YSBkZSBtw6FzY2FyYSBwYXJhIGNhbXBvcyBkZSBlbnRyYWRhIGRlIG7Dum1lcm9zIGRlIGdyYW5kZSBwcmVjaXPDo28sXG4gKiBhZGFwdGFkYSBkbyBgQ3VycmVuY3lNYXNrRGlyZWN0aXZlYC4gUGVybWl0ZSBjb25maWd1cmFyIHByZWNpc8OjbywgZXNjYWxhLFxuICogc2VwYXJhZG9yZXMgZGVjaW1haXMgZSBkZSBtaWxoYXIgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZSBkYSBhcGxpY2HDp8Ojby5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0IHNCaWdudW1iZXJJbnB1dCBbcHJlY2lzaW9uXT1cIjE1XCIgW3NjYWxlXT1cIjJcIiBbYWxsb3dOZWdhdGl2ZV09XCJmYWxzZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbc0JpZ251bWJlcklucHV0XScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgLy8gTk9TT05BUiAtICdCaWdudW1iZXJJbnB1dERpcmVjdGl2ZScgaXMgZGVwcmVjYXRlZC5cbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJpZ251bWJlcklucHV0RGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJpZ251bWJlcklucHV0RGlyZWN0aXZlIGV4dGVuZHMgQ3VycmVuY3lNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBOw7ptZXJvIHRvdGFsIGRlIGTDrWdpdG9zIHNpZ25pZmljYXRpdm9zIGFjZWl0b3MgcGVsbyBjYW1wby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDE1XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJlY2lzaW9uID0gMTU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gTsO6bWVybyBkZSBjYXNhcyBkZWNpbWFpcyBleGliaWRhcyBlIGFjZWl0YXMgcGVsbyBjYW1wby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzY2FsZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlY2ltYWwgcGVyc29uYWxpemFkby4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLFxuICAgICAqIHV0aWxpemEgbyBzZXBhcmFkb3IgZGVmaW5pZG8gcGVsbyBsb2NhbGUgYXRpdm8gZGEgYXBsaWNhw6fDo28uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVjaW1hbFNlcGFyYXRvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXBhcmFkb3IgZGUgbWlsaGFyIHBlcnNvbmFsaXphZG8uIFF1YW5kbyBuw6NvIGluZm9ybWFkbyxcbiAgICAgKiB1dGlsaXphIG8gc2VwYXJhZG9yIGRlZmluaWRvIHBlbG8gbG9jYWxlIGF0aXZvIGRhIGFwbGljYcOnw6NvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRob3VzYW5kc1NlcGFyYXRvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBbGluaGFtZW50byBkbyBjb250ZcO6ZG8gZG8gY2FtcG8uIEFjZWl0YSBgJ2xlZnQnYCBvdSBgJ3JpZ2h0J2AuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhbGlnblRvOiAnbGVmdCcgfCAncmlnaHQnID0gJ2xlZnQnO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFBlcm1pdGUgYSBlbnRyYWRhIGRlIHZhbG9yZXMgbmVnYXRpdm9zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93TmVnYXRpdmUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFRleHRvIGRlIHBsYWNlaG9sZGVyIGV4aWJpZG8gcXVhbmRvIG8gY2FtcG8gZXN0w6EgdmF6aW8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucGxhY2Vob2xkZXInKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5tYXhMZW5ndGgnKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gdW1hIGNvbMOpIChwYXN0ZSkgw6kgcmVqZWl0YWRhIHBlbGEgdmFsaWRhw6fDo28gZG8gY2FtcG8uXG4gICAgICogRW1pdGUgYSBzdHJpbmcgY29sYWRhIHF1ZSBmb2kgcmVjdXNhZGEuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhc3RlUmVqZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnZXggPSAvXFxkLztcblxuICAgIC8vVE9ETzogQWp1c3RlIG5vIG5nMi1jdXJyZW5jeS1tYXNrIHBhcmEgdXRpbGl6YXIgZXNzZSBDw7NkaWdvIChhcGxpY2FkbyBuYSB0YXJlZmE6IFNEUy0zMDUpXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBfYW5ndWxhckNvbXBvbmVudHNMb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlO1xuXG4gICAgLy8gY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgLy8gc3VwZXIoaW5qZWN0b3IpO1xuXG4gICAgLy8gdGhpcy5fYW5ndWxhckNvbXBvbmVudHNMb2NhbGVTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KExvY2FsZVNlcnZpY2UpO1xuICAgIC8vIHRoaXMub25Mb2NhbGVTZXJ2aWNlKCk7XG4gICAgLy8gfVxuXG4gICAgLy9UT0RPOiAgUmVtb3ZlciBlc3NlIGNvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBfa2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICB7IGFsaWduOiAnJywgYWxsb3dOZWdhdGl2ZTogdHJ1ZSwgZGVjaW1hbDogJycsIHByZWNpc2lvbjogMCwgcHJlZml4OiAnJywgc3VmZml4OiAnJywgdGhvdXNhbmRzOiAnJyB9LFxuICAgICAgICAgICAgX2VsZW1lbnRSZWYsXG4gICAgICAgICAgICBfa2V5VmFsdWVEaWZmZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub25Mb2NhbGVTZXJ2aWNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhYmxlcygpO1xuXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJDaGFuZ2UgPSBjaGFuZ2VzWydwbGFjZWhvbGRlciddPy5jdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICghcGxhY2Vob2xkZXJDaGFuZ2UgJiYgdGhpcy5zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGAwJHt0aGlzLmRlY2ltYWxTZXBhcmF0b3J9JHsnJy5wYWRFbmQodGhpcy5zY2FsZSwgJzAnKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9XG4gICAgICAgICAgICBjaGFuZ2VzWydzY2FsZSddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydkZWNpbWFsU2VwYXJhdG9yJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ3Rob3VzYW5kc1NlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydhbGlnblRvJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ3ByZWNpc2lvbiddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydhbGxvd05lZ2F0aXZlJ107XG5cbiAgICAgICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFyaWFibGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JykgPz8gJyc7XG4gICAgICAgIGNvbnN0IG51bWVyaWNUZXh0ID0gcGFzdGVkVGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCR7dGhpcy50aG91c2FuZHNTZXBhcmF0b3J9YCwgJ2cnKSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSh0aGlzLmRlY2ltYWxTZXBhcmF0b3IgYXMgc3RyaW5nLCAnLicpO1xuICAgICAgICBjb25zdCBbaW50UGFydCwgZGVjaW1hbFBhcnQgPSAnJ10gPSBudW1lcmljVGV4dC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCB0b3RhbERpZ2l0cyA9IGludFBhcnQucmVwbGFjZSgvXFxEL2csICcnKS5sZW5ndGggKyBkZWNpbWFsUGFydC5zbGljZSgwLCB0aGlzLnNjYWxlKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRvdGFsRGlnaXRzID4gdGhpcy5wcmVjaXNpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBhc3RlUmVqZWN0ZWQuZW1pdChwYXN0ZWRUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgb3B0aW9ucyB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3RpdmUgaW5wdXQgdmFsdWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVmFyaWFibGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGlnbjogdGhpcy5hbGlnblRvLFxuICAgICAgICAgICAgZGVjaW1hbDogdGhpcy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzOiB0aGlzLnRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdGhpcy5zY2FsZSB8fCAwLFxuICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgICAgIHN1ZmZpeDogJycsXG4gICAgICAgICAgICBhbGxvd05lZ2F0aXZlOiB0aGlzLmFsbG93TmVnYXRpdmUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTWF4TGVuZ3RoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzcG9uc2libGUgdG8gY2FsY3VsYXRlIHRoZSBmaWVsZCBtYXhpbXVtIGxlbmd0aCBjb25zaWRlcmluZyB0aGUgc2VwYXJhdG9ycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZU1heExlbmd0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVjU2VwTGVuZ3RoID0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgdGhvU2VwTGVuZ3RoID0gdGhpcy50aG91c2FuZHNTZXBhcmF0b3I/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICAgIGNvbnN0IERJR0lUU19HUk9VUF9TSVpFID0gMztcblxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gdGhpcy5wcmVjaXNpb24gKyAodGhpcy5zY2FsZSA/IGRlY1NlcExlbmd0aCA6IDApO1xuICAgICAgICBtYXhMZW5ndGggKz0gTWF0aC5jZWlsKCh0aGlzLnByZWNpc2lvbiAtICh0aGlzLnNjYWxlID8gdGhpcy5zY2FsZSA6IDApKSAvIERJR0lUU19HUk9VUF9TSVpFIC0gMSkgKiB0aG9TZXBMZW5ndGg7XG5cbiAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvY2FsZVNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9jYWxlU2VydmljZVxuICAgICAgICAgICAgLmdldExvY2FsZSgpXG4gICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yID0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yID8/IHRoaXMubG9jYWxlU2VydmljZS5nZXREZWNpbWFsU2VwYXJhdG9yKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aG91c2FuZHNTZXBhcmF0b3IgPSB0aGlzLnRob3VzYW5kc1NlcGFyYXRvciA/PyB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0R3JvdXBpbmdTZXBhcmF0b3IoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
243
+ }], ctorParameters: () => [] });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9iaWdudW1iZXItaW5wdXQvc3JjL2xpYi9iaWdudW1iZXItaW5wdXQvYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7QUFFdkY7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFHWDtBQUhELFdBQVksd0JBQXdCO0lBQ2hDLDJDQUFlLENBQUE7SUFDZix5Q0FBYSxDQUFBO0FBQ2pCLENBQUMsRUFIVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBR25DO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBZ0JILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxvQkFBb0I7SUFDN0Q7Ozs7Ozs7OztPQVNHO0lBQ0ksU0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU3Qjs7Ozs7O09BTUc7SUFDSSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXhCOzs7O09BSUc7SUFDYSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNhLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1Qzs7O09BR0c7SUFDYSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUM7OztPQUdHO0lBQ0ksa0JBQWtCLEdBQUcsS0FBSyxDQUFxQixT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QUNyRCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQUN0RCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0o7OzRGQUVRLHVCQUF1QjtrQkFmbkMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxJQUFJLEVBQUU7d0JBQ0Ysb0JBQW9CLEVBQUUsZUFBZTt3QkFDckMsa0JBQWtCLEVBQUUsV0FBVztxQkFDbEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLHFEQUFxRDs0QkFDckQsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBmb3J3YXJkUmVmLCBpbnB1dCwgbW9kZWwsIE9uSW5pdCwgT25DaGFuZ2VzLCBvdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE51bWVyaWNNYXNrRGlyZWN0aXZlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2snO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEVzdGUgZW51bSBuw6NvIHRlbSBtYWlzIGVmZWl0by4gTyBhbGluaGFtZW50byBkbyBjYW1wbyDDqSBzZW1wcmUgYCdyaWdodCdgLlxuICovXG5leHBvcnQgZW51bSBCaWdudW1iZXJBbGlnbm1lbnRPcHRpb24ge1xuICAgIFJJR0hUID0gJ3JpZ2h0JyxcbiAgICBMRUZUID0gJ2xlZnQnLFxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFV0aWxpemUgYSBkaXJldGl2YSBgQmlnTnVtYmVySW5wdXRgIGFvIGludsOpcyBkZXN0YS5cbiAqIEBkZXNjcmlwdGlvbiBEaXJldGl2YSBkZSBtw6FzY2FyYSBwYXJhIGNhbXBvcyBkZSBlbnRyYWRhIGRlIG7Dum1lcm9zIGRlIGdyYW5kZSBwcmVjaXPDo28sXG4gKiBhZGFwdGFkYSBkbyBgQ3VycmVuY3lNYXNrRGlyZWN0aXZlYC4gUGVybWl0ZSBjb25maWd1cmFyIHByZWNpc8OjbywgZXNjYWxhLFxuICogc2VwYXJhZG9yZXMgZGVjaW1haXMgZSBkZSBtaWxoYXIgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZSBkYSBhcGxpY2HDp8Ojby5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0IHNCaWdudW1iZXJJbnB1dCBbcHJlY2lzaW9uXT1cIjE1XCIgW3NjYWxlXT1cIjJcIiBbYWxsb3dOZWdhdGl2ZV09XCJmYWxzZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbc0JpZ251bWJlcklucHV0XScsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIucGxhY2Vob2xkZXJdJzogJ3BsYWNlaG9sZGVyKCknLFxuICAgICAgICAnW2F0dHIubWF4TGVuZ3RoXSc6ICdtYXhMZW5ndGgnLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgLy8gTk9TT05BUiAtICdCaWdudW1iZXJJbnB1dERpcmVjdGl2ZScgaXMgZGVwcmVjYXRlZC5cbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJpZ251bWJlcklucHV0RGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJpZ251bWJlcklucHV0RGlyZWN0aXZlIGV4dGVuZHMgTnVtZXJpY01hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gdG90YWwgZGUgZMOtZ2l0b3Mgc2lnbmlmaWNhdGl2b3MgYWNlaXRvcyBwZWxvIGNhbXBvIChwYXJ0ZSBpbnRlaXJhICsgcGFydGUgZGVjaW1hbCkuXG4gICAgICpcbiAgICAgKiBEdXJhbnRlIGEgZGlnaXRhw6fDo28sIG8gY2FtcG8gbGltaXRhIGZpc2ljYW1lbnRlIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIHZpYSBgbWF4TGVuZ3RoYC5cbiAgICAgKiBBbyBjb2xhciB1bSB2YWxvciBxdWUgdWx0cmFwYXNzZSBvIGxpbWl0ZSwgbyBldmVudG8gYHBhc3RlUmVqZWN0ZWRgIMOpIGVtaXRpZG8gZSBhIGNvbGFnZW0gw6kgY2FuY2VsYWRhLlxuICAgICAqIEFww7NzIHNhaXIgZG8gY2FtcG8gKGJsdXIpIG91IGFvIHN1Ym1ldGVyIG8gZm9ybXVsw6FyaW8sIHNlIG8gdmFsb3IgdWx0cmFwYXNzYXIgYHByZWNpc2lvbmAsXG4gICAgICogbyBjYW1wbyBmaWNhcsOhIGludsOhbGlkbyBjb20gbyBlcnJvIGBleGNlZWRzUHJlY2lzaW9uOiB7IHByZWNpc2lvbiwgYWN0dWFsIH1gLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMTVcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlY2lzaW9uID0gaW5wdXQoMTUpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBtaW5EZWNpbWFsUGxhY2VzYCBlIGBtYXhEZWNpbWFsUGxhY2VzYCBhbyBpbnbDqXMgZGVzdGUuXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gZGUgY2FzYXMgZGVjaW1haXMgZXhpYmlkYXMgZSBhY2VpdGFzIHBlbG8gY2FtcG8uXG4gICAgICogUXVhbmRvIGluZm9ybWFkbywgcmVwYXNzYSBvIHZhbG9yIHBhcmEgYG1pbkRlY2ltYWxQbGFjZXNgIGUgYG1heERlY2ltYWxQbGFjZXNgLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FsZSA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gbcOtbmltbyBkZSBjYXNhcyBkZWNpbWFpcyBleGliaWRhcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWluRGVjaW1hbFBsYWNlcyA9IG1vZGVsKDApO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gbcOheGltbyBkZSBjYXNhcyBkZWNpbWFpcyBhY2VpdGFzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBtYXhEZWNpbWFsUGxhY2VzID0gbW9kZWwoMCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlY2ltYWwgcGVyc29uYWxpemFkby4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLFxuICAgICAqIHV0aWxpemEgbyBzZXBhcmFkb3IgZGVmaW5pZG8gcGVsbyBsb2NhbGUgYXRpdm8gZGEgYXBsaWNhw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGRlY2ltYWxTZXBhcmF0b3IgPSBtb2RlbCgnLCcpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGB0aG91c2FuZFNlcGFyYXRvcmAgYW8gaW52w6lzIGRlc3RlLlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXBhcmFkb3IgZGUgbWlsaGFyIHBlcnNvbmFsaXphZG8uIFJlY29tZW5kYS1zZSBtaWdyYXIgcGFyYSBgdGhvdXNhbmRTZXBhcmF0b3JgLlxuICAgICAqL1xuICAgIHB1YmxpYyB0aG91c2FuZHNTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlIG1pbGhhciBwZXJzb25hbGl6YWRvLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sXG4gICAgICogdXRpbGl6YSBvIHNlcGFyYWRvciBkZWZpbmlkbyBwZWxvIGxvY2FsZSBhdGl2byBkYSBhcGxpY2HDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdGhvdXNhbmRTZXBhcmF0b3IgPSBtb2RlbCgnLicpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgRXN0ZSBpbnB1dCBuw6NvIHRlbSBtYWlzIGVmZWl0byBlIHBvZGUgc2VyIHJlbW92aWRvLlxuICAgICAqIE8gYWxpbmhhbWVudG8gZG8gY2FtcG8gw6kgc2VtcHJlIGAncmlnaHQnYCwgY29uZm9ybWUgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZGEgbcOhc2NhcmEgbnVtw6lyaWNhLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGlnblRvID0gaW5wdXQ8J2xlZnQnIHwgJ3JpZ2h0Jz4oJ3JpZ2h0Jyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUGVybWl0ZSBhIGVudHJhZGEgZGUgdmFsb3JlcyBuZWdhdGl2b3MuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGFsbG93TmVnYXRpdmUgPSBpbnB1dCh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBUZXh0byBkZSBwbGFjZWhvbGRlciBleGliaWRvIHF1YW5kbyBvIGNhbXBvIGVzdMOhIHZhemlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IG1vZGVsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIHB1YmxpYyBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gdW1hIGNvbGFnZW0gKHBhc3RlKSDDqSByZWplaXRhZGEgcGVsYSB2YWxpZGHDp8OjbyBkbyBjYW1wby5cbiAgICAgKiBFbWl0ZSBhIHN0cmluZyBjb2xhZGEgcXVlIGZvaSByZWN1c2FkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFzdGVSZWplY3RlZCA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIF9kZWNpbWFsU2VwYXJhdG9yRXhwbGljaXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICAvLyBuZ09uQ2hhbmdlcyBoYW5kbGVzIGFsbCBzaWduYWwgd3JpdGVzIHJlYWN0aXZlbHksIGF2b2lkaW5nIHRoZSBuZWVkIGZvclxuICAgIC8vIGVmZmVjdCgpIHdpdGggYWxsb3dTaWduYWxXcml0ZXMuIFRoZSBkZWNpbWFsU2VwYXJhdG9yL3Rob3VzYW5kU2VwYXJhdG9yIGlucHV0c1xuICAgIC8vIGhhdmUgdHJ1dGh5IGRlZmF1bHRzLCBzbyBuZ09uQ2hhbmdlcyBpcyBuZWNlc3NhcnkgdG8gZGlzdGluZ3Vpc2ggXCJwYXJlbnQgYm91bmQgdGhpc1wiXG4gICAgLy8gZnJvbSBcIml0J3MganVzdCB0aGUgZGVmYXVsdCB2YWx1ZVwiLlxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkZWNpbWFsU2VwYXJhdG9yJ10gJiYgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlY2ltYWxTZXBhcmF0b3JFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3Rob3VzYW5kU2VwYXJhdG9yJ10gJiYgdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1sndGhvdXNhbmRzU2VwYXJhdG9yJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudGhvdXNhbmRzU2VwYXJhdG9yKCk7XG4gICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLnNldCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzY2FsZSddKSB7XG4gICAgICAgICAgICB0aGlzLm1pbkRlY2ltYWxQbGFjZXMuc2V0KHRoaXMuc2NhbGUoKSk7XG4gICAgICAgICAgICB0aGlzLm1heERlY2ltYWxQbGFjZXMuc2V0KHRoaXMuc2NhbGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlc1snc2NhbGUnXSB8fFxuICAgICAgICAgICAgY2hhbmdlc1snZGVjaW1hbFNlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWyd0aG91c2FuZFNlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWyd0aG91c2FuZHNTZXBhcmF0b3InXSB8fFxuICAgICAgICAgICAgY2hhbmdlc1sncHJlY2lzaW9uJ11cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU1heExlbmd0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzY2FsZSddIHx8IGNoYW5nZXNbJ2RlY2ltYWxTZXBhcmF0b3InXSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIGJhc2UgcGFzdGUgaGFuZGxlciB0byBhZGQgcHJlY2lzaW9uIHZhbGlkYXRpb24uXG4gICAgICogSWYgdGhlIHBhc3RlZCB2YWx1ZSBleGNlZWRzIGBwcmVjaXNpb25gIGRpZ2l0cywgdGhlIHBhc3RlIGlzIHJlamVjdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpID8/ICcnO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVUaG91c2FuZFNlcCA9IHRoaXMudGhvdXNhbmRzU2VwYXJhdG9yKCkgPz8gdGhpcy50aG91c2FuZFNlcGFyYXRvcigpO1xuICAgICAgICBjb25zdCBudW1lcmljVGV4dCA9IHBhc3RlZFRleHRcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke2VmZmVjdGl2ZVRob3VzYW5kU2VwfWAsICdnJyksICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCksICcuJyk7XG4gICAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNpbWFsUGFydCA9ICcnXSA9IG51bWVyaWNUZXh0LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRvdGFsRGlnaXRzID0gaW50UGFydC5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aCArIGRlY2ltYWxQYXJ0LnNsaWNlKDAsIHRoaXMuc2NhbGUoKSkubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0b3RhbERpZ2l0cyA+IHRoaXMucHJlY2lzaW9uKCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBhc3RlUmVqZWN0ZWQuZW1pdChwYXN0ZWRUZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUGFzdGUoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlcyBsb2NhbGUtZGVyaXZlZCBzZXBhcmF0b3JzIHdpdGggZXhwbGljaXRseSBzZXQgaW5wdXRzLCBpZiBwcm92aWRlZC5cbiAgICAgKiBJZiBubyBleHBsaWNpdCBzZXBhcmF0b3IgaXMgc2V0LCB0aGUgbG9jYWxlLWRlcml2ZWQgdmFsdWUgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwbGljaXREZWNpbWFsID0gdGhpcy5fZGVjaW1hbFNlcGFyYXRvckV4cGxpY2l0ID8gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGhvdXNhbmQgPSB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0XG4gICAgICAgICAgICA/ICh0aGlzLnRob3VzYW5kc1NlcGFyYXRvcigpID8/IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZVNlcGFyYXRvcnMoKTtcblxuICAgICAgICBpZiAoZXhwbGljaXREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvci5zZXQoZXhwbGljaXREZWNpbWFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRUaG91c2FuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLnNldChleHBsaWNpdFRob3VzYW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTWF4TGVuZ3RoKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZXMgYmFzZSB2YWxpZGF0b3IgdG8gYWRkIHByZWNpc2lvbiB2YWxpZGF0aW9uLlxuICAgICAqIElmIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGV4Y2VlZHMgYHByZWNpc2lvbmAsIHJldHVybnMgYW4gYGV4Y2VlZHNQcmVjaXNpb25gIGVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJhc2VFcnJvcnMgPSBzdXBlci52YWxpZGF0ZShjb250cm9sKTtcblxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgIXRoaXMucHJlY2lzaW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlRXJyb3JzID8/IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1lcmljU3RyID0gU3RyaW5nKGNvbnRyb2wudmFsdWUpLnJlcGxhY2UoJy0nLCAnJyk7XG4gICAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNpbWFsUGFydCA9ICcnXSA9IG51bWVyaWNTdHIuc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgdG90YWxEaWdpdHMgPSBpbnRQYXJ0Lmxlbmd0aCArIGRlY2ltYWxQYXJ0Lmxlbmd0aDtcblxuICAgICAgICBpZiAodG90YWxEaWdpdHMgPiB0aGlzLnByZWNpc2lvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VFcnJvcnMsXG4gICAgICAgICAgICAgICAgZXhjZWVkc1ByZWNpc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IHRoaXMucHJlY2lzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdG90YWxEaWdpdHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFzZUVycm9ycyA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3BvbnNpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgZmllbGQgbWF4aW11bSBsZW5ndGggY29uc2lkZXJpbmcgdGhlIHNlcGFyYXRvcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhMZW5ndGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlY1NlcExlbmd0aCA9IHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlVGhvdXNhbmRTZXAgPSB0aGlzLnRob3VzYW5kc1NlcGFyYXRvcigpID8/IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKTtcbiAgICAgICAgY29uc3QgdGhvU2VwTGVuZ3RoID0gZWZmZWN0aXZlVGhvdXNhbmRTZXA/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICAgIGNvbnN0IERJR0lUU19HUk9VUF9TSVpFID0gMztcblxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gdGhpcy5wcmVjaXNpb24oKSArICh0aGlzLnNjYWxlKCkgPyBkZWNTZXBMZW5ndGggOiAwKTtcbiAgICAgICAgbWF4TGVuZ3RoICs9XG4gICAgICAgICAgICBNYXRoLmNlaWwoKHRoaXMucHJlY2lzaW9uKCkgLSAodGhpcy5zY2FsZSgpID8gdGhpcy5zY2FsZSgpIDogMCkpIC8gRElHSVRTX0dST1VQX1NJWkUgLSAxKSAqIHRob1NlcExlbmd0aDtcblxuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKCkgJiYgc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIuc2V0KGAwJHt0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKX0keycnLnBhZEVuZChzY2FsZSwgJzAnKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIl19