@schenkerjon/ng-govbr-tw 0.2.1 → 0.3.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.
@@ -0,0 +1,270 @@
1
+ import { Component, Input, Optional, Self, ViewEncapsulation, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ export class BrInputCnpjComponent {
5
+ static { this.nextId = 0; }
6
+ static { this.defaultErrorMessages = {
7
+ required: 'Campo obrigatório',
8
+ cnpjInvalid: 'CNPJ inválido',
9
+ cnpjIncomplete: 'CNPJ incompleto',
10
+ }; }
11
+ constructor(ngControl) {
12
+ this.ngControl = ngControl;
13
+ this.placeholder = '00.000.000/0000-00';
14
+ this.required = false;
15
+ this.density = 'medium';
16
+ /** Mensagens customizadas para erros */
17
+ this.errorMessages = {};
18
+ this.displayValue = '';
19
+ this.isDisabled = false;
20
+ this.rawValue = '';
21
+ this.inputId = `br-input-cnpj-${BrInputCnpjComponent.nextId++}`;
22
+ this.onChange = () => { };
23
+ this.onTouched = () => { };
24
+ this.onValidatorChange = () => { };
25
+ if (this.ngControl) {
26
+ this.ngControl.valueAccessor = this;
27
+ }
28
+ }
29
+ get displayError() {
30
+ if (this.error)
31
+ return this.error;
32
+ if (!this.ngControl?.control)
33
+ return undefined;
34
+ const control = this.ngControl.control;
35
+ if (!control.errors || (!control.touched && !control.dirty))
36
+ return undefined;
37
+ return this.getFirstErrorMessage(control.errors);
38
+ }
39
+ getFirstErrorMessage(errors) {
40
+ for (const key of Object.keys(errors)) {
41
+ if (this.errorMessages[key])
42
+ return this.errorMessages[key];
43
+ const defaultMsg = BrInputCnpjComponent.defaultErrorMessages[key];
44
+ if (defaultMsg)
45
+ return defaultMsg;
46
+ }
47
+ return 'Campo inválido';
48
+ }
49
+ get inputClasses() {
50
+ const densityHeights = {
51
+ small: 'h-[var(--govbr-input-small)] text-govbr-sm',
52
+ medium: 'h-[var(--govbr-input-medium)] text-govbr-base',
53
+ large: 'h-[var(--govbr-input-large)] text-govbr-lg',
54
+ };
55
+ const base = `w-full px-4 pr-10 font-rawline govbr-input ${densityHeights[this.density]}`;
56
+ const statusCls = this.displayError ? 'govbr-input--danger' : '';
57
+ const disabledCls = this.isDisabled
58
+ ? 'bg-govbr-gray-2 text-govbr-gray-40 cursor-not-allowed'
59
+ : 'bg-white text-govbr-gray-80';
60
+ return [base, statusCls, disabledCls].filter(Boolean).join(' ');
61
+ }
62
+ onInput(event) {
63
+ const input = event.target;
64
+ const digits = input.value.replace(/\D/g, '').slice(0, 14);
65
+ this.rawValue = digits;
66
+ this.displayValue = this.formatCnpj(digits);
67
+ this.onChange(digits);
68
+ setTimeout(() => {
69
+ input.value = this.displayValue;
70
+ });
71
+ }
72
+ onBlur() {
73
+ this.onTouched();
74
+ }
75
+ formatCnpj(digits) {
76
+ if (!digits)
77
+ return '';
78
+ let formatted = digits;
79
+ // 00.000.000/0000-00
80
+ if (digits.length > 2) {
81
+ formatted = digits.slice(0, 2) + '.' + digits.slice(2);
82
+ }
83
+ if (digits.length > 5) {
84
+ formatted = formatted.slice(0, 6) + '.' + formatted.slice(6);
85
+ }
86
+ if (digits.length > 8) {
87
+ formatted = formatted.slice(0, 10) + '/' + formatted.slice(10);
88
+ }
89
+ if (digits.length > 12) {
90
+ formatted = formatted.slice(0, 15) + '-' + formatted.slice(15);
91
+ }
92
+ return formatted;
93
+ }
94
+ // ControlValueAccessor
95
+ writeValue(value) {
96
+ const digits = (value || '').replace(/\D/g, '').slice(0, 14);
97
+ this.rawValue = digits;
98
+ this.displayValue = this.formatCnpj(digits);
99
+ }
100
+ registerOnChange(fn) {
101
+ this.onChange = fn;
102
+ }
103
+ registerOnTouched(fn) {
104
+ this.onTouched = fn;
105
+ }
106
+ setDisabledState(isDisabled) {
107
+ this.isDisabled = isDisabled;
108
+ }
109
+ // Validator
110
+ validate(control) {
111
+ const value = control.value;
112
+ if (!value) {
113
+ return this.required ? { required: true } : null;
114
+ }
115
+ const digits = value.replace(/\D/g, '');
116
+ if (digits.length < 14) {
117
+ return { cnpjIncomplete: true };
118
+ }
119
+ if (!this.isValidCnpj(digits)) {
120
+ return { cnpjInvalid: true };
121
+ }
122
+ return null;
123
+ }
124
+ registerOnValidatorChange(fn) {
125
+ this.onValidatorChange = fn;
126
+ }
127
+ isValidCnpj(cnpj) {
128
+ const digits = cnpj.replace(/\D/g, '');
129
+ if (digits.length !== 14)
130
+ return false;
131
+ // Verifica se todos os dígitos são iguais
132
+ if (/^(\d)\1+$/.test(digits))
133
+ return false;
134
+ // Calcula primeiro dígito verificador
135
+ const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
136
+ let sum = 0;
137
+ for (let i = 0; i < 12; i++) {
138
+ sum += parseInt(digits[i], 10) * weights1[i];
139
+ }
140
+ let remainder = sum % 11;
141
+ const digit1 = remainder < 2 ? 0 : 11 - remainder;
142
+ if (digit1 !== parseInt(digits[12], 10))
143
+ return false;
144
+ // Calcula segundo dígito verificador
145
+ const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
146
+ sum = 0;
147
+ for (let i = 0; i < 13; i++) {
148
+ sum += parseInt(digits[i], 10) * weights2[i];
149
+ }
150
+ remainder = sum % 11;
151
+ const digit2 = remainder < 2 ? 0 : 11 - remainder;
152
+ if (digit2 !== parseInt(digits[13], 10))
153
+ return false;
154
+ return true;
155
+ }
156
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputCnpjComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
157
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BrInputCnpjComponent, isStandalone: true, selector: "br-input-cnpj", inputs: { label: "label", placeholder: "placeholder", required: "required", helperText: "helperText", error: "error", density: "density", errorMessages: "errorMessages" }, ngImport: i0, template: `
158
+ <div class="mb-4 font-rawline">
159
+ @if (label) {
160
+ <label
161
+ [for]="inputId"
162
+ class="block text-govbr-sm font-semibold text-govbr-gray-80 mb-1"
163
+ >
164
+ {{ label }}
165
+ @if (required) {
166
+ <span class="text-govbr-danger ml-0.5">*</span>
167
+ }
168
+ </label>
169
+ }
170
+
171
+ @if (helperText && !displayError) {
172
+ <span class="block text-govbr-xs text-govbr-gray-60 mb-1">
173
+ {{ helperText }}
174
+ </span>
175
+ }
176
+
177
+ <div class="relative">
178
+ <input
179
+ [id]="inputId"
180
+ type="text"
181
+ inputmode="numeric"
182
+ [placeholder]="placeholder"
183
+ [disabled]="isDisabled"
184
+ [class]="inputClasses"
185
+ [value]="displayValue"
186
+ (input)="onInput($event)"
187
+ (blur)="onBlur()"
188
+ maxlength="18"
189
+ />
190
+ <i class="fa-solid fa-building absolute right-3 top-1/2 -translate-y-1/2 text-govbr-gray-40 pointer-events-none"></i>
191
+ </div>
192
+
193
+ @if (displayError) {
194
+ <span class="flex items-center mt-1 text-govbr-sm text-govbr-danger">
195
+ <i class="fa-solid fa-times-circle mr-1"></i>{{ displayError }}
196
+ </span>
197
+ }
198
+ </div>
199
+ `, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputCnpjComponent, decorators: [{
202
+ type: Component,
203
+ args: [{
204
+ selector: 'br-input-cnpj',
205
+ standalone: true,
206
+ encapsulation: ViewEncapsulation.None,
207
+ template: `
208
+ <div class="mb-4 font-rawline">
209
+ @if (label) {
210
+ <label
211
+ [for]="inputId"
212
+ class="block text-govbr-sm font-semibold text-govbr-gray-80 mb-1"
213
+ >
214
+ {{ label }}
215
+ @if (required) {
216
+ <span class="text-govbr-danger ml-0.5">*</span>
217
+ }
218
+ </label>
219
+ }
220
+
221
+ @if (helperText && !displayError) {
222
+ <span class="block text-govbr-xs text-govbr-gray-60 mb-1">
223
+ {{ helperText }}
224
+ </span>
225
+ }
226
+
227
+ <div class="relative">
228
+ <input
229
+ [id]="inputId"
230
+ type="text"
231
+ inputmode="numeric"
232
+ [placeholder]="placeholder"
233
+ [disabled]="isDisabled"
234
+ [class]="inputClasses"
235
+ [value]="displayValue"
236
+ (input)="onInput($event)"
237
+ (blur)="onBlur()"
238
+ maxlength="18"
239
+ />
240
+ <i class="fa-solid fa-building absolute right-3 top-1/2 -translate-y-1/2 text-govbr-gray-40 pointer-events-none"></i>
241
+ </div>
242
+
243
+ @if (displayError) {
244
+ <span class="flex items-center mt-1 text-govbr-sm text-govbr-danger">
245
+ <i class="fa-solid fa-times-circle mr-1"></i>{{ displayError }}
246
+ </span>
247
+ }
248
+ </div>
249
+ `,
250
+ }]
251
+ }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
252
+ type: Self
253
+ }, {
254
+ type: Optional
255
+ }] }], propDecorators: { label: [{
256
+ type: Input
257
+ }], placeholder: [{
258
+ type: Input
259
+ }], required: [{
260
+ type: Input
261
+ }], helperText: [{
262
+ type: Input
263
+ }], error: [{
264
+ type: Input
265
+ }], density: [{
266
+ type: Input
267
+ }], errorMessages: [{
268
+ type: Input
269
+ }] } });
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnItaW5wdXQtY25wai5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1nb3Zici10dy9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQtY25wai9ici1pbnB1dC1jbnBqLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBb0R2QixNQUFNLE9BQU8sb0JBQW9CO2FBZWhCLFdBQU0sR0FBRyxDQUFDLEFBQUosQ0FBSzthQU9GLHlCQUFvQixHQUEyQjtRQUNyRSxRQUFRLEVBQUUsbUJBQW1CO1FBQzdCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLGNBQWMsRUFBRSxpQkFBaUI7S0FDbEMsQUFKMkMsQ0FJMUM7SUFFRixZQUF3QyxTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBMUJuRCxnQkFBVyxHQUFHLG9CQUFvQixDQUFDO1FBQ25DLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHakIsWUFBTyxHQUFpQyxRQUFRLENBQUM7UUFFMUQsd0NBQXdDO1FBQy9CLGtCQUFhLEdBQTJCLEVBQUUsQ0FBQztRQUVwRCxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ1gsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUd0QixZQUFPLEdBQUcsaUJBQWlCLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFFM0QsYUFBUSxHQUE0QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDN0MsY0FBUyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNqQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFTdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENB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ImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFNlbGYsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYnItaW5wdXQtY25waicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNCBmb250LXJhd2xpbmVcIj5cclxuICAgICAgQGlmIChsYWJlbCkge1xyXG4gICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgW2Zvcl09XCJpbnB1dElkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdGV4dC1nb3Zici1zbSBmb250LXNlbWlib2xkIHRleHQtZ292YnItZ3JheS04MCBtYi0xXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBsYWJlbCB9fVxyXG4gICAgICAgICAgQGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZ292YnItZGFuZ2VyIG1sLTAuNVwiPio8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChoZWxwZXJUZXh0ICYmICFkaXNwbGF5RXJyb3IpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJsb2NrIHRleHQtZ292YnIteHMgdGV4dC1nb3Zici1ncmF5LTYwIG1iLTFcIj5cclxuICAgICAgICAgIHt7IGhlbHBlclRleHQgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgW2lkXT1cImlucHV0SWRcIlxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZGlzcGxheVZhbHVlXCJcclxuICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgbWF4bGVuZ3RoPVwiMThcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1idWlsZGluZyBhYnNvbHV0ZSByaWdodC0zIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LWdvdmJyLWdyYXktNDAgcG9pbnRlci1ldmVudHMtbm9uZVwiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAaWYgKGRpc3BsYXlFcnJvcikge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbXQtMSB0ZXh0LWdvdmJyLXNtIHRleHQtZ292YnItZGFuZ2VyXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRpbWVzLWNpcmNsZSBtci0xXCI+PC9pPnt7IGRpc3BsYXlFcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEJySW5wdXRDbnBqQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnMDAuMDAwLjAwMC8wMDAwLTAwJztcclxuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZXJyb3I/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGVuc2l0eTogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyA9ICdtZWRpdW0nO1xyXG5cclxuICAvKiogTWVuc2FnZW5zIGN1c3RvbWl6YWRhcyBwYXJhIGVycm9zICovXHJcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICBkaXNwbGF5VmFsdWUgPSAnJztcclxuICBpc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByYXdWYWx1ZSA9ICcnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG4gIGlucHV0SWQgPSBgYnItaW5wdXQtY25wai0ke0JySW5wdXRDbnBqQ29tcG9uZW50Lm5leHRJZCsrfWA7XHJcblxyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRFcnJvck1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgcmVxdWlyZWQ6ICdDYW1wbyBvYnJpZ2F0w7NyaW8nLFxyXG4gICAgY25wakludmFsaWQ6ICdDTlBKIGludsOhbGlkbycsXHJcbiAgICBjbnBqSW5jb21wbGV0ZTogJ0NOUEogaW5jb21wbGV0bycsXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoQFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheUVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5lcnJvcikgcmV0dXJuIHRoaXMuZXJyb3I7XHJcblxyXG4gICAgaWYgKCF0aGlzLm5nQ29udHJvbD8uY29udHJvbCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbDtcclxuICAgIGlmICghY29udHJvbC5lcnJvcnMgfHwgKCFjb250cm9sLnRvdWNoZWQgJiYgIWNvbnRyb2wuZGlydHkpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmdldEZpcnN0RXJyb3JNZXNzYWdlKGNvbnRyb2wuZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rmlyc3RFcnJvck1lc3NhZ2UoZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9ycykpIHtcclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlc1trZXldKSByZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2VzW2tleV07XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNc2cgPSBCcklucHV0Q25wakNvbXBvbmVudC5kZWZhdWx0RXJyb3JNZXNzYWdlc1trZXldO1xyXG4gICAgICBpZiAoZGVmYXVsdE1zZykgcmV0dXJuIGRlZmF1bHRNc2c7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ0NhbXBvIGludsOhbGlkbyc7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5wdXRDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkZW5zaXR5SGVpZ2h0cyA9IHtcclxuICAgICAgc21hbGw6ICdoLVt2YXIoLS1nb3Zici1pbnB1dC1zbWFsbCldIHRleHQtZ292YnItc20nLFxyXG4gICAgICBtZWRpdW06ICdoLVt2YXIoLS1nb3Zici1pbnB1dC1tZWRpdW0pXSB0ZXh0LWdvdmJyLWJhc2UnLFxyXG4gICAgICBsYXJnZTogJ2gtW3ZhcigtLWdvdmJyLWlucHV0LWxhcmdlKV0gdGV4dC1nb3Zici1sZycsXHJcbiAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgIGNvbnN0IGJhc2UgPSBgdy1mdWxsIHB4LTQgcHItMTAgZm9udC1yYXdsaW5lIGdvdmJyLWlucHV0ICR7ZGVuc2l0eUhlaWdodHNbdGhpcy5kZW5zaXR5XX1gO1xyXG4gICAgY29uc3Qgc3RhdHVzQ2xzID0gdGhpcy5kaXNwbGF5RXJyb3IgPyAnZ292YnItaW5wdXQtLWRhbmdlcicgOiAnJztcclxuICAgIGNvbnN0IGRpc2FibGVkQ2xzID0gdGhpcy5pc0Rpc2FibGVkXHJcbiAgICAgID8gJ2JnLWdvdmJyLWdyYXktMiB0ZXh0LWdvdmJyLWdyYXktNDAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xyXG4gICAgICA6ICdiZy13aGl0ZSB0ZXh0LWdvdmJyLWdyYXktODAnO1xyXG5cclxuICAgIHJldHVybiBbYmFzZSwgc3RhdHVzQ2xzLCBkaXNhYmxlZENsc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgZGlnaXRzID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKS5zbGljZSgwLCAxNCk7XHJcbiAgICB0aGlzLnJhd1ZhbHVlID0gZGlnaXRzO1xyXG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLmZvcm1hdENucGooZGlnaXRzKTtcclxuICAgIHRoaXMub25DaGFuZ2UoZGlnaXRzKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0Q25waihkaWdpdHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWRpZ2l0cykgcmV0dXJuICcnO1xyXG4gICAgbGV0IGZvcm1hdHRlZCA9IGRpZ2l0cztcclxuICAgIC8vIDAwLjAwMC4wMDAvMDAwMC0wMFxyXG4gICAgaWYgKGRpZ2l0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGZvcm1hdHRlZCA9IGRpZ2l0cy5zbGljZSgwLCAyKSArICcuJyArIGRpZ2l0cy5zbGljZSgyKTtcclxuICAgIH1cclxuICAgIGlmIChkaWdpdHMubGVuZ3RoID4gNSkge1xyXG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQuc2xpY2UoMCwgNikgKyAnLicgKyBmb3JtYXR0ZWQuc2xpY2UoNik7XHJcbiAgICB9XHJcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCA+IDgpIHtcclxuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnNsaWNlKDAsIDEwKSArICcvJyArIGZvcm1hdHRlZC5zbGljZSgxMCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCA+IDEyKSB7XHJcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zbGljZSgwLCAxNSkgKyAnLScgKyBmb3JtYXR0ZWQuc2xpY2UoMTUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1hdHRlZDtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWdpdHMgPSAodmFsdWUgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJykuc2xpY2UoMCwgMTQpO1xyXG4gICAgdGhpcy5yYXdWYWx1ZSA9IGRpZ2l0cztcclxuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdGhpcy5mb3JtYXRDbnBqKGRpZ2l0cyk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBWYWxpZGF0b3JcclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWUgYXMgc3RyaW5nO1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCA/IHsgcmVxdWlyZWQ6IHRydWUgfSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlnaXRzID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICAgIGlmIChkaWdpdHMubGVuZ3RoIDwgMTQpIHtcclxuICAgICAgcmV0dXJuIHsgY25wakluY29tcGxldGU6IHRydWUgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZENucGooZGlnaXRzKSkge1xyXG4gICAgICByZXR1cm4geyBjbnBqSW52YWxpZDogdHJ1ZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkQ25waihjbnBqOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGRpZ2l0cyA9IGNucGoucmVwbGFjZSgvXFxEL2csICcnKTtcclxuXHJcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCAhPT0gMTQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBWZXJpZmljYSBzZSB0b2RvcyBvcyBkw61naXRvcyBzw6NvIGlndWFpc1xyXG4gICAgaWYgKC9eKFxcZClcXDErJC8udGVzdChkaWdpdHMpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2FsY3VsYSBwcmltZWlybyBkw61naXRvIHZlcmlmaWNhZG9yXHJcbiAgICBjb25zdCB3ZWlnaHRzMSA9IFs1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXTtcclxuICAgIGxldCBzdW0gPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XHJcbiAgICAgIHN1bSArPSBwYXJzZUludChkaWdpdHNbaV0sIDEwKSAqIHdlaWdodHMxW2ldO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlbWFpbmRlciA9IHN1bSAlIDExO1xyXG4gICAgY29uc3QgZGlnaXQxID0gcmVtYWluZGVyIDwgMiA/IDAgOiAxMSAtIHJlbWFpbmRlcjtcclxuICAgIGlmIChkaWdpdDEgIT09IHBhcnNlSW50KGRpZ2l0c1sxMl0sIDEwKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENhbGN1bGEgc2VndW5kbyBkw61naXRvIHZlcmlmaWNhZG9yXHJcbiAgICBjb25zdCB3ZWlnaHRzMiA9IFs2LCA1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXTtcclxuICAgIHN1bSA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEzOyBpKyspIHtcclxuICAgICAgc3VtICs9IHBhcnNlSW50KGRpZ2l0c1tpXSwgMTApICogd2VpZ2h0czJbaV07XHJcbiAgICB9XHJcbiAgICByZW1haW5kZXIgPSBzdW0gJSAxMTtcclxuICAgIGNvbnN0IGRpZ2l0MiA9IHJlbWFpbmRlciA8IDIgPyAwIDogMTEgLSByZW1haW5kZXI7XHJcbiAgICBpZiAoZGlnaXQyICE9PSBwYXJzZUludChkaWdpdHNbMTNdLCAxMCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,268 @@
1
+ import { Component, Input, Optional, Self, ViewEncapsulation, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ export class BrInputCpfComponent {
5
+ static { this.nextId = 0; }
6
+ static { this.defaultErrorMessages = {
7
+ required: 'Campo obrigatório',
8
+ cpfInvalid: 'CPF inválido',
9
+ cpfIncomplete: 'CPF incompleto',
10
+ }; }
11
+ constructor(ngControl) {
12
+ this.ngControl = ngControl;
13
+ this.placeholder = '000.000.000-00';
14
+ this.required = false;
15
+ this.density = 'medium';
16
+ /** Mensagens customizadas para erros */
17
+ this.errorMessages = {};
18
+ this.displayValue = '';
19
+ this.isDisabled = false;
20
+ this.rawValue = '';
21
+ this.inputId = `br-input-cpf-${BrInputCpfComponent.nextId++}`;
22
+ this.onChange = () => { };
23
+ this.onTouched = () => { };
24
+ this.onValidatorChange = () => { };
25
+ if (this.ngControl) {
26
+ this.ngControl.valueAccessor = this;
27
+ }
28
+ }
29
+ get displayError() {
30
+ if (this.error)
31
+ return this.error;
32
+ if (!this.ngControl?.control)
33
+ return undefined;
34
+ const control = this.ngControl.control;
35
+ if (!control.errors || (!control.touched && !control.dirty))
36
+ return undefined;
37
+ return this.getFirstErrorMessage(control.errors);
38
+ }
39
+ getFirstErrorMessage(errors) {
40
+ for (const key of Object.keys(errors)) {
41
+ if (this.errorMessages[key])
42
+ return this.errorMessages[key];
43
+ const defaultMsg = BrInputCpfComponent.defaultErrorMessages[key];
44
+ if (defaultMsg)
45
+ return defaultMsg;
46
+ }
47
+ return 'Campo inválido';
48
+ }
49
+ get inputClasses() {
50
+ const densityHeights = {
51
+ small: 'h-[var(--govbr-input-small)] text-govbr-sm',
52
+ medium: 'h-[var(--govbr-input-medium)] text-govbr-base',
53
+ large: 'h-[var(--govbr-input-large)] text-govbr-lg',
54
+ };
55
+ const base = `w-full px-4 pr-10 font-rawline govbr-input ${densityHeights[this.density]}`;
56
+ const statusCls = this.displayError ? 'govbr-input--danger' : '';
57
+ const disabledCls = this.isDisabled
58
+ ? 'bg-govbr-gray-2 text-govbr-gray-40 cursor-not-allowed'
59
+ : 'bg-white text-govbr-gray-80';
60
+ return [base, statusCls, disabledCls].filter(Boolean).join(' ');
61
+ }
62
+ onInput(event) {
63
+ const input = event.target;
64
+ const digits = input.value.replace(/\D/g, '').slice(0, 11);
65
+ this.rawValue = digits;
66
+ this.displayValue = this.formatCpf(digits);
67
+ this.onChange(digits);
68
+ // Reposition cursor
69
+ setTimeout(() => {
70
+ input.value = this.displayValue;
71
+ });
72
+ }
73
+ onBlur() {
74
+ this.onTouched();
75
+ }
76
+ formatCpf(digits) {
77
+ if (!digits)
78
+ return '';
79
+ let formatted = digits;
80
+ if (digits.length > 3) {
81
+ formatted = digits.slice(0, 3) + '.' + digits.slice(3);
82
+ }
83
+ if (digits.length > 6) {
84
+ formatted = formatted.slice(0, 7) + '.' + formatted.slice(7);
85
+ }
86
+ if (digits.length > 9) {
87
+ formatted = formatted.slice(0, 11) + '-' + formatted.slice(11);
88
+ }
89
+ return formatted;
90
+ }
91
+ // ControlValueAccessor
92
+ writeValue(value) {
93
+ const digits = (value || '').replace(/\D/g, '').slice(0, 11);
94
+ this.rawValue = digits;
95
+ this.displayValue = this.formatCpf(digits);
96
+ }
97
+ registerOnChange(fn) {
98
+ this.onChange = fn;
99
+ }
100
+ registerOnTouched(fn) {
101
+ this.onTouched = fn;
102
+ }
103
+ setDisabledState(isDisabled) {
104
+ this.isDisabled = isDisabled;
105
+ }
106
+ // Validator
107
+ validate(control) {
108
+ const value = control.value;
109
+ if (!value) {
110
+ return this.required ? { required: true } : null;
111
+ }
112
+ const digits = value.replace(/\D/g, '');
113
+ if (digits.length < 11) {
114
+ return { cpfIncomplete: true };
115
+ }
116
+ if (!this.isValidCpf(digits)) {
117
+ return { cpfInvalid: true };
118
+ }
119
+ return null;
120
+ }
121
+ registerOnValidatorChange(fn) {
122
+ this.onValidatorChange = fn;
123
+ }
124
+ isValidCpf(cpf) {
125
+ // Remove caracteres não numéricos
126
+ const digits = cpf.replace(/\D/g, '');
127
+ if (digits.length !== 11)
128
+ return false;
129
+ // Verifica se todos os dígitos são iguais
130
+ if (/^(\d)\1+$/.test(digits))
131
+ return false;
132
+ // Calcula primeiro dígito verificador
133
+ let sum = 0;
134
+ for (let i = 0; i < 9; i++) {
135
+ sum += parseInt(digits[i], 10) * (10 - i);
136
+ }
137
+ let remainder = (sum * 10) % 11;
138
+ if (remainder === 10 || remainder === 11)
139
+ remainder = 0;
140
+ if (remainder !== parseInt(digits[9], 10))
141
+ return false;
142
+ // Calcula segundo dígito verificador
143
+ sum = 0;
144
+ for (let i = 0; i < 10; i++) {
145
+ sum += parseInt(digits[i], 10) * (11 - i);
146
+ }
147
+ remainder = (sum * 10) % 11;
148
+ if (remainder === 10 || remainder === 11)
149
+ remainder = 0;
150
+ if (remainder !== parseInt(digits[10], 10))
151
+ return false;
152
+ return true;
153
+ }
154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputCpfComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
155
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BrInputCpfComponent, isStandalone: true, selector: "br-input-cpf", inputs: { label: "label", placeholder: "placeholder", required: "required", helperText: "helperText", error: "error", density: "density", errorMessages: "errorMessages" }, ngImport: i0, template: `
156
+ <div class="mb-4 font-rawline">
157
+ @if (label) {
158
+ <label
159
+ [for]="inputId"
160
+ class="block text-govbr-sm font-semibold text-govbr-gray-80 mb-1"
161
+ >
162
+ {{ label }}
163
+ @if (required) {
164
+ <span class="text-govbr-danger ml-0.5">*</span>
165
+ }
166
+ </label>
167
+ }
168
+
169
+ @if (helperText && !displayError) {
170
+ <span class="block text-govbr-xs text-govbr-gray-60 mb-1">
171
+ {{ helperText }}
172
+ </span>
173
+ }
174
+
175
+ <div class="relative">
176
+ <input
177
+ [id]="inputId"
178
+ type="text"
179
+ inputmode="numeric"
180
+ [placeholder]="placeholder"
181
+ [disabled]="isDisabled"
182
+ [class]="inputClasses"
183
+ [value]="displayValue"
184
+ (input)="onInput($event)"
185
+ (blur)="onBlur()"
186
+ maxlength="14"
187
+ />
188
+ <i class="fa-solid fa-id-card absolute right-3 top-1/2 -translate-y-1/2 text-govbr-gray-40 pointer-events-none"></i>
189
+ </div>
190
+
191
+ @if (displayError) {
192
+ <span class="flex items-center mt-1 text-govbr-sm text-govbr-danger">
193
+ <i class="fa-solid fa-times-circle mr-1"></i>{{ displayError }}
194
+ </span>
195
+ }
196
+ </div>
197
+ `, isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
198
+ }
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputCpfComponent, decorators: [{
200
+ type: Component,
201
+ args: [{
202
+ selector: 'br-input-cpf',
203
+ standalone: true,
204
+ encapsulation: ViewEncapsulation.None,
205
+ template: `
206
+ <div class="mb-4 font-rawline">
207
+ @if (label) {
208
+ <label
209
+ [for]="inputId"
210
+ class="block text-govbr-sm font-semibold text-govbr-gray-80 mb-1"
211
+ >
212
+ {{ label }}
213
+ @if (required) {
214
+ <span class="text-govbr-danger ml-0.5">*</span>
215
+ }
216
+ </label>
217
+ }
218
+
219
+ @if (helperText && !displayError) {
220
+ <span class="block text-govbr-xs text-govbr-gray-60 mb-1">
221
+ {{ helperText }}
222
+ </span>
223
+ }
224
+
225
+ <div class="relative">
226
+ <input
227
+ [id]="inputId"
228
+ type="text"
229
+ inputmode="numeric"
230
+ [placeholder]="placeholder"
231
+ [disabled]="isDisabled"
232
+ [class]="inputClasses"
233
+ [value]="displayValue"
234
+ (input)="onInput($event)"
235
+ (blur)="onBlur()"
236
+ maxlength="14"
237
+ />
238
+ <i class="fa-solid fa-id-card absolute right-3 top-1/2 -translate-y-1/2 text-govbr-gray-40 pointer-events-none"></i>
239
+ </div>
240
+
241
+ @if (displayError) {
242
+ <span class="flex items-center mt-1 text-govbr-sm text-govbr-danger">
243
+ <i class="fa-solid fa-times-circle mr-1"></i>{{ displayError }}
244
+ </span>
245
+ }
246
+ </div>
247
+ `,
248
+ }]
249
+ }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
250
+ type: Self
251
+ }, {
252
+ type: Optional
253
+ }] }], propDecorators: { label: [{
254
+ type: Input
255
+ }], placeholder: [{
256
+ type: Input
257
+ }], required: [{
258
+ type: Input
259
+ }], helperText: [{
260
+ type: Input
261
+ }], error: [{
262
+ type: Input
263
+ }], density: [{
264
+ type: Input
265
+ }], errorMessages: [{
266
+ type: Input
267
+ }] } });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnItaW5wdXQtY3BmLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWdvdmJyLXR3L3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC1jcGYvYnItaW5wdXQtY3BmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBb0R2QixNQUFNLE9BQU8sbUJBQW1CO2FBZWYsV0FBTSxHQUFHLENBQUMsQUFBSixDQUFLO2FBT0YseUJBQW9CLEdBQTJCO1FBQ3JFLFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsVUFBVSxFQUFFLGNBQWM7UUFDMUIsYUFBYSxFQUFFLGdCQUFnQjtLQUNoQyxBQUoyQyxDQUkxQztJQUVGLFlBQXdDLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUExQm5ELGdCQUFXLEdBQUcsZ0JBQWdCLENBQUM7UUFDL0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixZQUFPLEdBQWlDLFFBQVEsQ0FBQztRQUUxRCx3Q0FBd0M7UUFDL0Isa0JBQWEsR0FBMkIsRUFBRSxDQUFDO1FBRXBELGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDWCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBR3RCLFlBQU8sR0FBRyxnQkFBZ0IsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUV6RCxhQUFRLEdBQTRCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ2pDLHNCQUFpQixHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQVN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZ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QkFBbUIsb1BBNUNwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENUOzs0RkFFVSxtQkFBbUI7a0JBaEQvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENUO2lCQUNGOzswQkE2QmMsSUFBSTs7MEJBQUksUUFBUTt5Q0EzQnBCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBTZWxmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JyLWlucHV0LWNwZicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNCBmb250LXJhd2xpbmVcIj5cclxuICAgICAgQGlmIChsYWJlbCkge1xyXG4gICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgW2Zvcl09XCJpbnB1dElkXCJcclxuICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdGV4dC1nb3Zici1zbSBmb250LXNlbWlib2xkIHRleHQtZ292YnItZ3JheS04MCBtYi0xXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBsYWJlbCB9fVxyXG4gICAgICAgICAgQGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZ292YnItZGFuZ2VyIG1sLTAuNVwiPio8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChoZWxwZXJUZXh0ICYmICFkaXNwbGF5RXJyb3IpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJsb2NrIHRleHQtZ292YnIteHMgdGV4dC1nb3Zici1ncmF5LTYwIG1iLTFcIj5cclxuICAgICAgICAgIHt7IGhlbHBlclRleHQgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgW2lkXT1cImlucHV0SWRcIlxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZGlzcGxheVZhbHVlXCJcclxuICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgbWF4bGVuZ3RoPVwiMTRcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1pZC1jYXJkIGFic29sdXRlIHJpZ2h0LTMgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIHRleHQtZ292YnItZ3JheS00MCBwb2ludGVyLWV2ZW50cy1ub25lXCI+PC9pPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAoZGlzcGxheUVycm9yKSB7XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBtdC0xIHRleHQtZ292YnItc20gdGV4dC1nb3Zici1kYW5nZXJcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtdGltZXMtY2lyY2xlIG1yLTFcIj48L2k+e3sgZGlzcGxheUVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJJbnB1dENwZkNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJzAwMC4wMDAuMDAwLTAwJztcclxuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZXJyb3I/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGVuc2l0eTogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyA9ICdtZWRpdW0nO1xyXG5cclxuICAvKiogTWVuc2FnZW5zIGN1c3RvbWl6YWRhcyBwYXJhIGVycm9zICovXHJcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICBkaXNwbGF5VmFsdWUgPSAnJztcclxuICBpc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByYXdWYWx1ZSA9ICcnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG4gIGlucHV0SWQgPSBgYnItaW5wdXQtY3BmLSR7QnJJbnB1dENwZkNvbXBvbmVudC5uZXh0SWQrK31gO1xyXG5cclxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkZWZhdWx0RXJyb3JNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIHJlcXVpcmVkOiAnQ2FtcG8gb2JyaWdhdMOzcmlvJyxcclxuICAgIGNwZkludmFsaWQ6ICdDUEYgaW52w6FsaWRvJyxcclxuICAgIGNwZkluY29tcGxldGU6ICdDUEYgaW5jb21wbGV0bycsXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoQFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheUVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5lcnJvcikgcmV0dXJuIHRoaXMuZXJyb3I7XHJcblxyXG4gICAgaWYgKCF0aGlzLm5nQ29udHJvbD8uY29udHJvbCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbDtcclxuICAgIGlmICghY29udHJvbC5lcnJvcnMgfHwgKCFjb250cm9sLnRvdWNoZWQgJiYgIWNvbnRyb2wuZGlydHkpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmdldEZpcnN0RXJyb3JNZXNzYWdlKGNvbnRyb2wuZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rmlyc3RFcnJvck1lc3NhZ2UoZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9ycykpIHtcclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlc1trZXldKSByZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2VzW2tleV07XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRNc2cgPSBCcklucHV0Q3BmQ29tcG9uZW50LmRlZmF1bHRFcnJvck1lc3NhZ2VzW2tleV07XHJcbiAgICAgIGlmIChkZWZhdWx0TXNnKSByZXR1cm4gZGVmYXVsdE1zZztcclxuICAgIH1cclxuICAgIHJldHVybiAnQ2FtcG8gaW52w6FsaWRvJztcclxuICB9XHJcblxyXG4gIGdldCBpbnB1dENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRlbnNpdHlIZWlnaHRzID0ge1xyXG4gICAgICBzbWFsbDogJ2gtW3ZhcigtLWdvdmJyLWlucHV0LXNtYWxsKV0gdGV4dC1nb3Zici1zbScsXHJcbiAgICAgIG1lZGl1bTogJ2gtW3ZhcigtLWdvdmJyLWlucHV0LW1lZGl1bSldIHRleHQtZ292YnItYmFzZScsXHJcbiAgICAgIGxhcmdlOiAnaC1bdmFyKC0tZ292YnItaW5wdXQtbGFyZ2UpXSB0ZXh0LWdvdmJyLWxnJyxcclxuICAgIH0gYXMgY29uc3Q7XHJcblxyXG4gICAgY29uc3QgYmFzZSA9IGB3LWZ1bGwgcHgtNCBwci0xMCBmb250LXJhd2xpbmUgZ292YnItaW5wdXQgJHtkZW5zaXR5SGVpZ2h0c1t0aGlzLmRlbnNpdHldfWA7XHJcbiAgICBjb25zdCBzdGF0dXNDbHMgPSB0aGlzLmRpc3BsYXlFcnJvciA/ICdnb3Zici1pbnB1dC0tZGFuZ2VyJyA6ICcnO1xyXG4gICAgY29uc3QgZGlzYWJsZWRDbHMgPSB0aGlzLmlzRGlzYWJsZWRcclxuICAgICAgPyAnYmctZ292YnItZ3JheS0yIHRleHQtZ292YnItZ3JheS00MCBjdXJzb3Itbm90LWFsbG93ZWQnXHJcbiAgICAgIDogJ2JnLXdoaXRlIHRleHQtZ292YnItZ3JheS04MCc7XHJcblxyXG4gICAgcmV0dXJuIFtiYXNlLCBzdGF0dXNDbHMsIGRpc2FibGVkQ2xzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBkaWdpdHMgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpLnNsaWNlKDAsIDExKTtcclxuICAgIHRoaXMucmF3VmFsdWUgPSBkaWdpdHM7XHJcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0Q3BmKGRpZ2l0cyk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKGRpZ2l0cyk7XHJcblxyXG4gICAgLy8gUmVwb3NpdGlvbiBjdXJzb3JcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuZGlzcGxheVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRDcGYoZGlnaXRzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFkaWdpdHMpIHJldHVybiAnJztcclxuICAgIGxldCBmb3JtYXR0ZWQgPSBkaWdpdHM7XHJcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCA+IDMpIHtcclxuICAgICAgZm9ybWF0dGVkID0gZGlnaXRzLnNsaWNlKDAsIDMpICsgJy4nICsgZGlnaXRzLnNsaWNlKDMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRpZ2l0cy5sZW5ndGggPiA2KSB7XHJcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zbGljZSgwLCA3KSArICcuJyArIGZvcm1hdHRlZC5zbGljZSg3KTtcclxuICAgIH1cclxuICAgIGlmIChkaWdpdHMubGVuZ3RoID4gOSkge1xyXG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQuc2xpY2UoMCwgMTEpICsgJy0nICsgZm9ybWF0dGVkLnNsaWNlKDExKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtYXR0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZGlnaXRzID0gKHZhbHVlIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpLnNsaWNlKDAsIDExKTtcclxuICAgIHRoaXMucmF3VmFsdWUgPSBkaWdpdHM7XHJcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0Q3BmKGRpZ2l0cyk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBWYWxpZGF0b3JcclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWUgYXMgc3RyaW5nO1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCA/IHsgcmVxdWlyZWQ6IHRydWUgfSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlnaXRzID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICAgIGlmIChkaWdpdHMubGVuZ3RoIDwgMTEpIHtcclxuICAgICAgcmV0dXJuIHsgY3BmSW5jb21wbGV0ZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbGlkQ3BmKGRpZ2l0cykpIHtcclxuICAgICAgcmV0dXJuIHsgY3BmSW52YWxpZDogdHJ1ZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkQ3BmKGNwZjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBSZW1vdmUgY2FyYWN0ZXJlcyBuw6NvIG51bcOpcmljb3NcclxuICAgIGNvbnN0IGRpZ2l0cyA9IGNwZi5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG5cclxuICAgIGlmIChkaWdpdHMubGVuZ3RoICE9PSAxMSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIFZlcmlmaWNhIHNlIHRvZG9zIG9zIGTDrWdpdG9zIHPDo28gaWd1YWlzXHJcbiAgICBpZiAoL14oXFxkKVxcMSskLy50ZXN0KGRpZ2l0cykpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBDYWxjdWxhIHByaW1laXJvIGTDrWdpdG8gdmVyaWZpY2Fkb3JcclxuICAgIGxldCBzdW0gPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHtcclxuICAgICAgc3VtICs9IHBhcnNlSW50KGRpZ2l0c1tpXSwgMTApICogKDEwIC0gaSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVtYWluZGVyID0gKHN1bSAqIDEwKSAlIDExO1xyXG4gICAgaWYgKHJlbWFpbmRlciA9PT0gMTAgfHwgcmVtYWluZGVyID09PSAxMSkgcmVtYWluZGVyID0gMDtcclxuICAgIGlmIChyZW1haW5kZXIgIT09IHBhcnNlSW50KGRpZ2l0c1s5XSwgMTApKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gQ2FsY3VsYSBzZWd1bmRvIGTDrWdpdG8gdmVyaWZpY2Fkb3JcclxuICAgIHN1bSA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgc3VtICs9IHBhcnNlSW50KGRpZ2l0c1tpXSwgMTApICogKDExIC0gaSk7XHJcbiAgICB9XHJcbiAgICByZW1haW5kZXIgPSAoc3VtICogMTApICUgMTE7XHJcbiAgICBpZiAocmVtYWluZGVyID09PSAxMCB8fCByZW1haW5kZXIgPT09IDExKSByZW1haW5kZXIgPSAwO1xyXG4gICAgaWYgKHJlbWFpbmRlciAhPT0gcGFyc2VJbnQoZGlnaXRzWzEwXSwgMTApKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==