@seniorsistemas/angular-components 19.6.2 → 19.7.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.
- package/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.d.ts +1 -2
- package/esm2022/alert/lib/alert/alert.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +16 -17
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +20 -23
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +9 -10
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +9 -15
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +4 -4
- package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-number-field.mjs +1 -1
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +4 -5
- package/esm2022/input-mask/lib/input-mask/input-mask.directive.mjs +460 -0
- package/esm2022/input-mask/lib/input-mask/input-mask.module.mjs +16 -0
- package/esm2022/input-mask/public-api.mjs +3 -0
- package/esm2022/input-mask/seniorsistemas-angular-components-input-mask.mjs +5 -0
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +53 -62
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +6 -7
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs +480 -0
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs.map +1 -0
- package/inline-edit/lib/inline-edit/fields/inline-edit-number-field.d.ts +2 -2
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
- package/input-mask/README.md +183 -0
- package/input-mask/index.d.ts +5 -0
- package/input-mask/lib/input-mask/input-mask.directive.d.ts +103 -0
- package/input-mask/lib/input-mask/input-mask.module.d.ts +7 -0
- package/input-mask/public-api.d.ts +2 -0
- package/package.json +43 -37
|
@@ -34,4 +34,4 @@ export class InlineEditNumberField extends InlineEditField {
|
|
|
34
34
|
this.placeholder = options.placeholder ?? "";
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWVkaXQtbnVtYmVyLWZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2lubGluZS1lZGl0L3NyYy9saWIvaW5saW5lLWVkaXQvZmllbGRzL2lubGluZS1lZGl0LW51bWJlci1maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBcUI5RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZUFBZTtJQUMvQyxhQUFhLENBQVc7SUFDeEIsbUJBQW1CLENBQXVCO0lBQzFDLG1CQUFtQixDQUFXO0lBQzlCLFNBQVMsQ0FBcUI7SUFDOUIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLElBQUksQ0FBb0I7SUFDeEIsU0FBUyxDQUFlO0lBQ3hCLFVBQVUsQ0FBZTtJQUN6QixXQUFXLENBQVU7SUFDckIsU0FBUyxDQUFXO0lBQ3BCLE1BQU0sQ0FBMEI7SUFDaEMsT0FBTyxDQUEwQjtJQUNqQyxVQUFVLENBQXdCO0lBQ2xDLE9BQU8sQ0FBMEI7SUFFeEMsWUFBWSxPQUFxQztRQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO1FBQ25ELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7UUFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDakQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTnVtYmVyTG9jYWxlT3B0aW9ucyB9IGZyb20gXCJAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZVwiO1xuXG5pbXBvcnQgeyBBZGRvbkNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9hZGRvbi1jb25maWdcIjtcbmltcG9ydCB7IElubGluZUVkaXRGaWVsZCwgSW5saW5lRWRpdEZpZWxkT3B0aW9ucyB9IGZyb20gXCIuL2lubGluZS1lZGl0LWZpZWxkXCI7XG5cbnR5cGUgc3RyaW5GbiA9ICgpID0+IHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZUVkaXROdW1iZXJGaWVsZE9wdGlvbnMgZXh0ZW5kcyBJbmxpbmVFZGl0RmllbGRPcHRpb25zIHtcbiAgICBhbGxvd05lZ2F0aXZlPzogYm9vbGVhbjtcbiAgICBudW1iZXJMb2NhbGVPcHRpb25zPzogTnVtYmVyTG9jYWxlT3B0aW9ucztcbiAgICBicm93c2VyQXV0b2NvbXBsZXRlPzogYm9vbGVhbjtcbiAgICBwcmVjaXNpb24/OiBGdW5jdGlvbiB8IG51bWJlcjtcbiAgICBzY2FsZT86IEZ1bmN0aW9uIHwgbnVtYmVyO1xuICAgIG1hc2s/OiBzdHJpbkZuIHwgc3RyaW5nO1xuICAgIGxlZnRBZGRvbj86IEFkZG9uQ29uZmlnO1xuICAgIHJpZ2h0QWRkb24/OiBBZGRvbkNvbmZpZztcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBhdXRvQ2xlYXI/OiBib29sZWFuO1xuICAgIG9uQmx1cj86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gICAgb25Gb2N1cz86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gICAgb25Db21wbGV0ZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uSW5wdXQ/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSW5saW5lRWRpdE51bWJlckZpZWxkIGV4dGVuZHMgSW5saW5lRWRpdEZpZWxkIHtcbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZT86IGJvb2xlYW47XG4gICAgcHVibGljIG51bWJlckxvY2FsZU9wdGlvbnM/OiBOdW1iZXJMb2NhbGVPcHRpb25zO1xuICAgIHB1YmxpYyBicm93c2VyQXV0b2NvbXBsZXRlPzogYm9vbGVhbjtcbiAgICBwdWJsaWMgcHJlY2lzaW9uPzogRnVuY3Rpb24gfCBudW1iZXI7XG4gICAgcHVibGljIHNjYWxlPzogRnVuY3Rpb24gfCBudW1iZXI7XG4gICAgcHVibGljIGFsaWduVG86ICdsZWZ0JyB8ICdyaWdodCc7XG4gICAgcHVibGljIG1hc2s/OiBzdHJpbkZuIHwgc3RyaW5nO1xuICAgIHB1YmxpYyBsZWZ0QWRkb24/OiBBZGRvbkNvbmZpZztcbiAgICBwdWJsaWMgcmlnaHRBZGRvbj86IEFkZG9uQ29uZmlnO1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBwdWJsaWMgYXV0b0NsZWFyPzogYm9vbGVhbjtcbiAgICBwdWJsaWMgb25CbHVyPzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgICBwdWJsaWMgb25Gb2N1cz86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gICAgcHVibGljIG9uQ29tcGxldGU/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBwdWJsaWMgb25JbnB1dD86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbmxpbmVFZGl0TnVtYmVyRmllbGRPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuYWxsb3dOZWdhdGl2ZSA9IG9wdGlvbnMuYWxsb3dOZWdhdGl2ZSA/PyB0cnVlO1xuICAgICAgICB0aGlzLm51bWJlckxvY2FsZU9wdGlvbnMgPSBvcHRpb25zLm51bWJlckxvY2FsZU9wdGlvbnM7XG4gICAgICAgIHRoaXMuYnJvd3NlckF1dG9jb21wbGV0ZSA9IG9wdGlvbnMuYnJvd3NlckF1dG9jb21wbGV0ZTtcbiAgICAgICAgdGhpcy5wcmVjaXNpb24gPSBvcHRpb25zLnByZWNpc2lvbjtcbiAgICAgICAgdGhpcy5zY2FsZSA9IG9wdGlvbnMuc2NhbGUgPz8gMjtcbiAgICAgICAgdGhpcy5hbGlnblRvID0gdGhpcy5zY2FsZSA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgICAgIHRoaXMubWFzayA9IG9wdGlvbnMubWFzaztcbiAgICAgICAgdGhpcy5sZWZ0QWRkb24gPSBvcHRpb25zLmxlZnRBZGRvbjtcbiAgICAgICAgdGhpcy5yaWdodEFkZG9uID0gb3B0aW9ucy5yaWdodEFkZG9uO1xuICAgICAgICB0aGlzLm9uQmx1ciA9IG9wdGlvbnMub25CbHVyO1xuICAgICAgICB0aGlzLm9uRm9jdXMgPSBvcHRpb25zLm9uRm9jdXM7XG4gICAgICAgIHRoaXMub25Db21wbGV0ZSA9IG9wdGlvbnMub25Db21wbGV0ZTtcbiAgICAgICAgdGhpcy5vbklucHV0ID0gb3B0aW9ucy5vbklucHV0O1xuICAgICAgICB0aGlzLmF1dG9DbGVhciA9IG9wdGlvbnMuYXV0b0NsZWFyID8/IHRydWU7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyID8/IFwiXCI7XG4gICAgfVxufVxuIl19
|
|
@@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common';
|
|
|
2
2
|
import { NgModule } from '@angular/core';
|
|
3
3
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { TranslateModule } from '@ngx-translate/core';
|
|
5
|
-
import {
|
|
5
|
+
import { InputMaskDirective } from '@seniorsistemas/angular-components/input-mask';
|
|
6
6
|
import { InputTextModule } from 'primeng/inputtext';
|
|
7
7
|
import { KeyFilterModule } from 'primeng/keyfilter';
|
|
8
8
|
import { TextareaModule } from 'primeng/textarea';
|
|
@@ -43,7 +43,7 @@ export class InlineEditModule {
|
|
|
43
43
|
ContentGeneratorModule,
|
|
44
44
|
TooltipModule,
|
|
45
45
|
DatepickerComponent,
|
|
46
|
-
|
|
46
|
+
InputMaskDirective,
|
|
47
47
|
InputTextModule,
|
|
48
48
|
TextareaModule,
|
|
49
49
|
KeyFilterModule,
|
|
@@ -59,7 +59,6 @@ export class InlineEditModule {
|
|
|
59
59
|
ContentGeneratorModule,
|
|
60
60
|
TooltipModule,
|
|
61
61
|
DatepickerComponent,
|
|
62
|
-
InputMaskModule,
|
|
63
62
|
InputTextModule,
|
|
64
63
|
TextareaModule,
|
|
65
64
|
KeyFilterModule,
|
|
@@ -80,7 +79,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
80
79
|
ContentGeneratorModule,
|
|
81
80
|
TooltipModule,
|
|
82
81
|
DatepickerComponent,
|
|
83
|
-
|
|
82
|
+
InputMaskDirective,
|
|
84
83
|
InputTextModule,
|
|
85
84
|
TextareaModule,
|
|
86
85
|
KeyFilterModule,
|
|
@@ -99,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
99
98
|
exports: [InlineEditComponent],
|
|
100
99
|
}]
|
|
101
100
|
}] });
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWVkaXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2lubGluZS1lZGl0L3NyYy9saWIvaW5saW5lLWVkaXQvaW5saW5lLWVkaXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDdEgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDaEgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDaEgsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sMkZBQTJGLENBQUM7QUFDaEosT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDMUcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFFbkcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBaUNwRixNQUFNLE9BQU8sZ0JBQWdCO3dHQUFoQixnQkFBZ0I7eUdBQWhCLGdCQUFnQixpQkFYckIsbUJBQW1CO1lBQ25CLHVCQUF1QjtZQUN2QiwyQkFBMkI7WUFDM0IseUJBQXlCO1lBQ3pCLHlCQUF5QjtZQUN6Qix1QkFBdUI7WUFDdkIsMkJBQTJCO1lBQzNCLG1DQUFtQyxhQXpCbkMsWUFBWTtZQUNaLFdBQVc7WUFDWCxtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLG9CQUFvQjtZQUNwQixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGNBQWM7WUFDZCxzQkFBc0I7WUFDdEIsYUFBYTtZQUNiLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsZUFBZTtZQUNmLGNBQWM7WUFDZCxlQUFlO1lBQ2YsaUJBQWlCLGFBWVgsbUJBQW1CO3lHQUVwQixnQkFBZ0IsWUE3QnJCLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixvQkFBb0I7WUFDcEIsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixjQUFjO1lBQ2Qsc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixtQkFBbUI7WUFFbkIsZUFBZTtZQUNmLGNBQWM7WUFDZCxlQUFlO1lBQ2YsaUJBQWlCOzs0RkFjWixnQkFBZ0I7a0JBL0I1QixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsc0JBQXNCO3dCQUN0QixhQUFhO3dCQUNiLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixpQkFBaUI7cUJBQ3BCO29CQUNELFlBQVksRUFBRTt3QkFDVixtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLHlCQUF5Qjt3QkFDekIsdUJBQXVCO3dCQUN2QiwyQkFBMkI7d0JBQzNCLG1DQUFtQztxQkFDdEM7b0JBQ0QsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJbnB1dE1hc2tEaXJlY3RpdmUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2lucHV0LW1hc2snO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgS2V5RmlsdGVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9rZXlmaWx0ZXInO1xuaW1wb3J0IHsgVGV4dGFyZWFNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RleHRhcmVhJztcblxuaW1wb3J0IHsgSW5saW5lRWRpdENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZpZWxkcy9pbmxpbmUtZWRpdC1jYWxlbmRhci9pbmxpbmUtZWRpdC1jYWxlbmRhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5saW5lRWRpdExvb2t1cENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9maWVsZHMvaW5saW5lLWVkaXQtbG9va3VwL2lubGluZS1lZGl0LWxvb2t1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5saW5lRWRpdE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9maWVsZHMvaW5saW5lLWVkaXQtbnVtYmVyL2lubGluZS1lZGl0LW51bWJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5saW5lRWRpdENvbnRlbnRHZW5lcmF0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZmllbGRzL2lubGluZS1lZGl0LWNvbnRlbnQtZ2VuZXJhdG9yL2lubGluZS1lZGl0LWNvbnRlbnQtZ2VuZXJhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbmxpbmVFZGl0VGV4dEFyZWFDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZmllbGRzL2lubGluZS1lZGl0LXRleHQtYXJlYS9pbmxpbmUtZWRpdC10ZXh0LWFyZWEuY29tcG9uZW50JztcbmltcG9ydCB7IElubGluZUVkaXRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZpZWxkcy9pbmxpbmUtZWRpdC10ZXh0L2lubGluZS1lZGl0LXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IElubGluZUVkaXRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2lubGluZS1lZGl0LWl0ZW0vaW5saW5lLWVkaXQtaXRlbS5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBDb250cm9sRXJyb3JzTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jb250cm9sLWVycm9ycyc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9kYXRlcGlja2VyJztcbmltcG9ydCB7IElubGluZUVkaXRDb21wb25lbnQgfSBmcm9tICcuL2lubGluZS1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy90b29sdGlwJztcbmltcG9ydCB7IEluZm9TaWduTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9pbmZvLXNpZ24nO1xuaW1wb3J0IHsgQmlnbnVtYmVySW5wdXRNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2JpZ251bWJlci1pbnB1dCc7XG5pbXBvcnQgeyBDb250ZW50R2VuZXJhdG9yTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jb250ZW50LWdlbmVyYXRvcic7XG5pbXBvcnQgeyBEeW5hbWljRm9ybU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQmlnbnVtYmVySW5wdXRNb2R1bGUsXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgQ29udHJvbEVycm9yc01vZHVsZSxcbiAgICAgICAgSW5mb1NpZ25Nb2R1bGUsXG4gICAgICAgIENvbnRlbnRHZW5lcmF0b3JNb2R1bGUsXG4gICAgICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgIElucHV0TWFza0RpcmVjdGl2ZSxcbiAgICAgICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgICAgICBUZXh0YXJlYU1vZHVsZSxcbiAgICAgICAgS2V5RmlsdGVyTW9kdWxlLFxuICAgICAgICBEeW5hbWljRm9ybU1vZHVsZSxcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBJbmxpbmVFZGl0Q29tcG9uZW50LFxuICAgICAgICBJbmxpbmVFZGl0SXRlbUNvbXBvbmVudCxcbiAgICAgICAgSW5saW5lRWRpdENhbGVuZGFyQ29tcG9uZW50LFxuICAgICAgICBJbmxpbmVFZGl0TG9va3VwQ29tcG9uZW50LFxuICAgICAgICBJbmxpbmVFZGl0TnVtYmVyQ29tcG9uZW50LFxuICAgICAgICBJbmxpbmVFZGl0VGV4dENvbXBvbmVudCxcbiAgICAgICAgSW5saW5lRWRpdFRleHRBcmVhQ29tcG9uZW50LFxuICAgICAgICBJbmxpbmVFZGl0Q29udGVudEdlbmVyYXRvckNvbXBvbmVudCxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtJbmxpbmVFZGl0Q29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgSW5saW5lRWRpdE1vZHVsZSB7IH1cbiJdfQ==
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import { Directive, ElementRef, forwardRef, inject, input, output, Renderer2, } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* @description Diretiva de máscara de entrada para campos de texto.
|
|
6
|
+
*
|
|
7
|
+
* Aplique `[sInputMask]` em qualquer `<input>` para aplicar uma máscara de formatação,
|
|
8
|
+
* guiando a entrada do usuário com um padrão definido. Implementa ControlValueAccessor
|
|
9
|
+
* e Validator para integração nativa com Angular Forms.
|
|
10
|
+
*
|
|
11
|
+
* **Slots de máscara:**
|
|
12
|
+
* - `9` — dígito (0-9)
|
|
13
|
+
* - `a` — letra (conforme `characterPattern`, padrão `[A-Za-z]`)
|
|
14
|
+
* - `*` — alfanumérico (letra ou dígito)
|
|
15
|
+
* - Outros caracteres são tratados como literais (ex: `.`, `-`, `/`, `(`, `)`)
|
|
16
|
+
* - `?` — tudo após esse ponto na máscara é opcional
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```html
|
|
20
|
+
* <!-- CPF -->
|
|
21
|
+
* <input type="text" [sInputMask]="'999.999.999-99'" [(ngModel)]="cpf" />
|
|
22
|
+
*
|
|
23
|
+
* <!-- Telefone com unmask -->
|
|
24
|
+
* <input type="text" [sInputMask]="'(99) 99999-9999'" [unmask]="true" [(ngModel)]="telefone" />
|
|
25
|
+
* ```
|
|
26
|
+
* @category Input
|
|
27
|
+
*/
|
|
28
|
+
export class InputMaskDirective {
|
|
29
|
+
/**
|
|
30
|
+
* Padrão da máscara. Slots: `9` (dígito), `a` (letra), `*` (alfanumérico).
|
|
31
|
+
* Demais caracteres são literais. `?` torna o restante da máscara opcional.
|
|
32
|
+
*/
|
|
33
|
+
mask = input(undefined, { alias: 'sInputMask' });
|
|
34
|
+
/**
|
|
35
|
+
* Caractere exibido nas posições ainda não preenchidas.
|
|
36
|
+
* @default '_'
|
|
37
|
+
*/
|
|
38
|
+
slotChar = input('_');
|
|
39
|
+
/**
|
|
40
|
+
* Quando `true`, o modelo recebe apenas os caracteres digitados pelo usuário,
|
|
41
|
+
* sem os literais da máscara. Quando `false`, o modelo recebe o valor completo
|
|
42
|
+
* incluindo literais.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
unmask = input(false);
|
|
46
|
+
/**
|
|
47
|
+
* Expressão regular usada para validar o slot `a` (letra).
|
|
48
|
+
* @default '[A-Za-z]'
|
|
49
|
+
*/
|
|
50
|
+
characterPattern = input('[A-Za-z]');
|
|
51
|
+
/**
|
|
52
|
+
* Quando `true`, limpa o campo ao perder o foco se a máscara estiver incompleta.
|
|
53
|
+
* @default true
|
|
54
|
+
*/
|
|
55
|
+
autoClear = input(true);
|
|
56
|
+
/**
|
|
57
|
+
* Emitido quando todos os slots obrigatórios da máscara estão preenchidos.
|
|
58
|
+
* Emite o valor atual (mascarado ou não, conforme `unmask`).
|
|
59
|
+
*/
|
|
60
|
+
maskComplete = output();
|
|
61
|
+
el = inject((ElementRef));
|
|
62
|
+
renderer = inject(Renderer2);
|
|
63
|
+
tokens = [];
|
|
64
|
+
buffer = [];
|
|
65
|
+
wasComplete = false;
|
|
66
|
+
lastValue = null;
|
|
67
|
+
onChange = () => { };
|
|
68
|
+
onTouched = () => { };
|
|
69
|
+
ngOnInit() {
|
|
70
|
+
this.buildMask();
|
|
71
|
+
}
|
|
72
|
+
ngOnChanges(changes) {
|
|
73
|
+
if (changes['mask'] || changes['slotChar'] || changes['characterPattern']) {
|
|
74
|
+
this.buildMask();
|
|
75
|
+
if (this.mask()) {
|
|
76
|
+
this.writeValue(this.lastValue);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
buildMask() {
|
|
81
|
+
const maskStr = this.mask();
|
|
82
|
+
if (!maskStr) {
|
|
83
|
+
this.tokens = [];
|
|
84
|
+
this.buffer = [];
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.tokens = this.parseMask(maskStr);
|
|
88
|
+
this.resetBuffer();
|
|
89
|
+
}
|
|
90
|
+
parseMask(mask) {
|
|
91
|
+
const tokens = [];
|
|
92
|
+
let optional = false;
|
|
93
|
+
for (let i = 0; i < mask.length; i++) {
|
|
94
|
+
const ch = mask[i];
|
|
95
|
+
if (ch === '?') {
|
|
96
|
+
optional = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
switch (ch) {
|
|
100
|
+
case '9':
|
|
101
|
+
tokens.push({ type: 'digit', optional });
|
|
102
|
+
break;
|
|
103
|
+
case 'a':
|
|
104
|
+
tokens.push({ type: 'alpha', optional });
|
|
105
|
+
break;
|
|
106
|
+
case '*':
|
|
107
|
+
tokens.push({ type: 'alphanumeric', optional });
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
tokens.push({ type: 'literal', char: ch, optional: false });
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return tokens;
|
|
115
|
+
}
|
|
116
|
+
resetBuffer() {
|
|
117
|
+
this.buffer = this.tokens.map((t) => (t.type === 'literal' ? t.char : this.slotChar()));
|
|
118
|
+
}
|
|
119
|
+
isValidChar(char, token) {
|
|
120
|
+
switch (token.type) {
|
|
121
|
+
case 'digit':
|
|
122
|
+
return /[0-9]/.test(char);
|
|
123
|
+
case 'alpha':
|
|
124
|
+
return new RegExp(this.characterPattern()).test(char);
|
|
125
|
+
case 'alphanumeric':
|
|
126
|
+
return /[A-Za-z0-9]/.test(char);
|
|
127
|
+
default:
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
isEditable(token) {
|
|
132
|
+
return token.type !== 'literal';
|
|
133
|
+
}
|
|
134
|
+
nextEditablePos(from) {
|
|
135
|
+
for (let i = from; i < this.tokens.length; i++) {
|
|
136
|
+
if (this.isEditable(this.tokens[i])) {
|
|
137
|
+
return i;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return this.tokens.length;
|
|
141
|
+
}
|
|
142
|
+
prevEditablePos(from) {
|
|
143
|
+
for (let i = from; i >= 0; i--) {
|
|
144
|
+
if (this.tokens[i] && this.isEditable(this.tokens[i])) {
|
|
145
|
+
return i;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return -1;
|
|
149
|
+
}
|
|
150
|
+
setCursor(pos) {
|
|
151
|
+
const safePos = Math.min(pos, this.tokens.length);
|
|
152
|
+
this.el.nativeElement.setSelectionRange(safePos, safePos);
|
|
153
|
+
}
|
|
154
|
+
setInputValue(value) {
|
|
155
|
+
this.renderer.setProperty(this.el.nativeElement, 'value', value);
|
|
156
|
+
}
|
|
157
|
+
getDisplayValue() {
|
|
158
|
+
return this.buffer.join('');
|
|
159
|
+
}
|
|
160
|
+
getBlurDisplayValue() {
|
|
161
|
+
let lastFilledIndex = -1;
|
|
162
|
+
for (let i = 0; i < this.buffer.length; i++) {
|
|
163
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal' && this.buffer[i] !== this.slotChar()) {
|
|
164
|
+
lastFilledIndex = i;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (lastFilledIndex === -1)
|
|
168
|
+
return '';
|
|
169
|
+
return this.buffer.slice(0, lastFilledIndex + 1).join('');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Returns the value that should be set on the model.
|
|
173
|
+
* Returns null when the user has not typed anything.
|
|
174
|
+
*/
|
|
175
|
+
getModelValue() {
|
|
176
|
+
const hasInput = this.buffer.some((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar());
|
|
177
|
+
if (!hasInput) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
if (this.unmask()) {
|
|
181
|
+
return (this.buffer
|
|
182
|
+
.filter((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar())
|
|
183
|
+
.join('') || null);
|
|
184
|
+
}
|
|
185
|
+
return this.buffer.join('');
|
|
186
|
+
}
|
|
187
|
+
clearRange(startPos, endPos) {
|
|
188
|
+
for (let i = startPos; i < endPos; i++) {
|
|
189
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal') {
|
|
190
|
+
this.buffer[i] = this.slotChar();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.setInputValue(this.getDisplayValue());
|
|
194
|
+
}
|
|
195
|
+
isMaskComplete() {
|
|
196
|
+
return this.tokens.every((token, i) => {
|
|
197
|
+
if (token.type === 'literal' || token.optional) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return this.buffer[i] !== this.slotChar();
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
checkAndEmitComplete() {
|
|
204
|
+
const complete = this.isMaskComplete();
|
|
205
|
+
if (complete && !this.wasComplete) {
|
|
206
|
+
this.wasComplete = true;
|
|
207
|
+
this.maskComplete.emit(this.getModelValue() ?? '');
|
|
208
|
+
}
|
|
209
|
+
else if (!complete) {
|
|
210
|
+
this.wasComplete = false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
dispatchInputEvent() {
|
|
214
|
+
this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));
|
|
215
|
+
}
|
|
216
|
+
onKeyDown(event) {
|
|
217
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const key = event.key;
|
|
221
|
+
// Let the browser handle shortcuts (Ctrl/Cmd), Tab, and function keys
|
|
222
|
+
if (event.ctrlKey || event.metaKey || key === 'Tab' || key.startsWith('F')) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Let the browser handle arrow navigation and Home/End natively
|
|
226
|
+
if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const input = this.el.nativeElement;
|
|
230
|
+
const startPos = input.selectionStart ?? 0;
|
|
231
|
+
const endPos = input.selectionEnd ?? 0;
|
|
232
|
+
if (key === 'Backspace') {
|
|
233
|
+
event.preventDefault();
|
|
234
|
+
if (startPos !== endPos) {
|
|
235
|
+
this.clearRange(startPos, endPos);
|
|
236
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
237
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
238
|
+
}
|
|
239
|
+
else if (startPos > 0) {
|
|
240
|
+
const pos = this.prevEditablePos(startPos - 1);
|
|
241
|
+
if (pos >= 0) {
|
|
242
|
+
this.buffer[pos] = this.slotChar();
|
|
243
|
+
this.setInputValue(this.getDisplayValue());
|
|
244
|
+
this.setCursor(pos);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
this.onChange(this.getModelValue());
|
|
248
|
+
this.checkAndEmitComplete();
|
|
249
|
+
this.dispatchInputEvent();
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (key === 'Delete') {
|
|
253
|
+
event.preventDefault();
|
|
254
|
+
if (startPos !== endPos) {
|
|
255
|
+
this.clearRange(startPos, endPos);
|
|
256
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
257
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const pos = this.nextEditablePos(startPos);
|
|
261
|
+
if (pos < this.tokens.length) {
|
|
262
|
+
this.buffer[pos] = this.slotChar();
|
|
263
|
+
this.setInputValue(this.getDisplayValue());
|
|
264
|
+
this.setCursor(pos);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.onChange(this.getModelValue());
|
|
268
|
+
this.checkAndEmitComplete();
|
|
269
|
+
this.dispatchInputEvent();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Single printable character
|
|
273
|
+
if (key.length === 1) {
|
|
274
|
+
event.preventDefault();
|
|
275
|
+
let insertPos = startPos;
|
|
276
|
+
// Clear selection range if any
|
|
277
|
+
if (startPos !== endPos) {
|
|
278
|
+
this.clearRange(startPos, endPos);
|
|
279
|
+
insertPos = startPos;
|
|
280
|
+
}
|
|
281
|
+
const pos = this.nextEditablePos(insertPos);
|
|
282
|
+
if (pos >= this.tokens.length) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const token = this.tokens[pos];
|
|
286
|
+
if (!this.isValidChar(key, token)) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
this.buffer[pos] = key;
|
|
290
|
+
this.setInputValue(this.getDisplayValue());
|
|
291
|
+
const next = this.nextEditablePos(pos + 1);
|
|
292
|
+
this.setCursor(next <= this.tokens.length ? next : this.tokens.length);
|
|
293
|
+
this.onChange(this.getModelValue());
|
|
294
|
+
this.checkAndEmitComplete();
|
|
295
|
+
this.dispatchInputEvent();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
onFocus(_event) {
|
|
299
|
+
if (!this.mask()) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
// Always restore full mask display on focus (slot chars become visible)
|
|
303
|
+
this.setInputValue(this.getDisplayValue());
|
|
304
|
+
// Move cursor to the first empty editable slot
|
|
305
|
+
const firstEmpty = this.buffer.findIndex((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch === this.slotChar());
|
|
306
|
+
this.setCursor(firstEmpty >= 0 ? firstEmpty : this.nextEditablePos(0));
|
|
307
|
+
}
|
|
308
|
+
onBlur(_event) {
|
|
309
|
+
if (!this.mask()) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
this.onTouched();
|
|
313
|
+
if (!this.isMaskComplete()) {
|
|
314
|
+
if (this.autoClear()) {
|
|
315
|
+
this.resetBuffer();
|
|
316
|
+
this.onChange(null);
|
|
317
|
+
}
|
|
318
|
+
this.setInputValue(this.getBlurDisplayValue());
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
onPaste(event) {
|
|
322
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
event.preventDefault();
|
|
326
|
+
const pastedText = event.clipboardData?.getData('text') ?? '';
|
|
327
|
+
const input = this.el.nativeElement;
|
|
328
|
+
const startPos = input.selectionStart ?? 0;
|
|
329
|
+
const endPos = input.selectionEnd ?? 0;
|
|
330
|
+
if (startPos !== endPos) {
|
|
331
|
+
this.clearRange(startPos, endPos);
|
|
332
|
+
}
|
|
333
|
+
let pos = this.nextEditablePos(startPos);
|
|
334
|
+
for (const ch of pastedText) {
|
|
335
|
+
if (pos >= this.tokens.length) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
const token = this.tokens[pos];
|
|
339
|
+
if (token.type === 'literal') {
|
|
340
|
+
// Skip matching literal in pasted text; skip the literal slot regardless
|
|
341
|
+
if (ch === token.char) {
|
|
342
|
+
pos++;
|
|
343
|
+
}
|
|
344
|
+
pos = this.nextEditablePos(pos);
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (this.isValidChar(ch, token)) {
|
|
348
|
+
this.buffer[pos] = ch;
|
|
349
|
+
pos = this.nextEditablePos(pos + 1);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
this.setInputValue(this.getDisplayValue());
|
|
353
|
+
this.setCursor(pos <= this.tokens.length ? pos : this.tokens.length);
|
|
354
|
+
this.onChange(this.getModelValue());
|
|
355
|
+
this.checkAndEmitComplete();
|
|
356
|
+
this.dispatchInputEvent();
|
|
357
|
+
}
|
|
358
|
+
onClick() {
|
|
359
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const input = this.el.nativeElement;
|
|
363
|
+
const pos = input.selectionStart ?? 0;
|
|
364
|
+
// If cursor landed on a literal, nudge it to the nearest editable slot
|
|
365
|
+
if (this.tokens[pos] && this.tokens[pos].type === 'literal') {
|
|
366
|
+
this.setCursor(this.nextEditablePos(pos));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
writeValue(value) {
|
|
370
|
+
this.lastValue = value;
|
|
371
|
+
if (!this.mask()) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
this.resetBuffer();
|
|
375
|
+
if (!value) {
|
|
376
|
+
this.setInputValue('');
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
let bufferIdx = 0;
|
|
380
|
+
let valueIdx = 0;
|
|
381
|
+
while (valueIdx < value.length && bufferIdx < this.tokens.length) {
|
|
382
|
+
const token = this.tokens[bufferIdx];
|
|
383
|
+
const char = value[valueIdx];
|
|
384
|
+
if (token.type === 'literal') {
|
|
385
|
+
// Consume the literal character from value if it matches; always advance buffer
|
|
386
|
+
if (char === token.char)
|
|
387
|
+
valueIdx++;
|
|
388
|
+
bufferIdx++;
|
|
389
|
+
}
|
|
390
|
+
else if (this.isValidChar(char, token)) {
|
|
391
|
+
this.buffer[bufferIdx] = char;
|
|
392
|
+
bufferIdx++;
|
|
393
|
+
valueIdx++;
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// Skip characters from value that do not match the current slot
|
|
397
|
+
valueIdx++;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
this.setInputValue(this.getDisplayValue());
|
|
401
|
+
}
|
|
402
|
+
registerOnChange(onChange) {
|
|
403
|
+
this.onChange = onChange;
|
|
404
|
+
}
|
|
405
|
+
registerOnTouched(onTouched) {
|
|
406
|
+
this.onTouched = onTouched;
|
|
407
|
+
}
|
|
408
|
+
setDisabledState(isDisabled) {
|
|
409
|
+
this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
|
|
410
|
+
}
|
|
411
|
+
validate(control) {
|
|
412
|
+
if (!this.mask() || !control.value) {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
if (!this.isMaskComplete()) {
|
|
416
|
+
return { incompleteMask: { mask: this.mask() } };
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
421
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: InputMaskDirective, isStandalone: true, selector: "input[sInputMask]", inputs: { mask: { classPropertyName: "mask", publicName: "sInputMask", isSignal: true, isRequired: false, transformFunction: null }, slotChar: { classPropertyName: "slotChar", publicName: "slotChar", isSignal: true, isRequired: false, transformFunction: null }, unmask: { classPropertyName: "unmask", publicName: "unmask", isSignal: true, isRequired: false, transformFunction: null }, characterPattern: { classPropertyName: "characterPattern", publicName: "characterPattern", isSignal: true, isRequired: false, transformFunction: null }, autoClear: { classPropertyName: "autoClear", publicName: "autoClear", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { maskComplete: "maskComplete" }, host: { listeners: { "keydown": "onKeyDown($event)", "focus": "onFocus($event)", "blur": "onBlur($event)", "paste": "onPaste($event)", "click": "onClick()" } }, providers: [
|
|
422
|
+
{
|
|
423
|
+
provide: NG_VALUE_ACCESSOR,
|
|
424
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
425
|
+
multi: true,
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
provide: NG_VALIDATORS,
|
|
429
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
430
|
+
multi: true,
|
|
431
|
+
},
|
|
432
|
+
], usesOnChanges: true, ngImport: i0 });
|
|
433
|
+
}
|
|
434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, decorators: [{
|
|
435
|
+
type: Directive,
|
|
436
|
+
args: [{
|
|
437
|
+
selector: 'input[sInputMask]',
|
|
438
|
+
standalone: true,
|
|
439
|
+
host: {
|
|
440
|
+
'(keydown)': 'onKeyDown($event)',
|
|
441
|
+
'(focus)': 'onFocus($event)',
|
|
442
|
+
'(blur)': 'onBlur($event)',
|
|
443
|
+
'(paste)': 'onPaste($event)',
|
|
444
|
+
'(click)': 'onClick()',
|
|
445
|
+
},
|
|
446
|
+
providers: [
|
|
447
|
+
{
|
|
448
|
+
provide: NG_VALUE_ACCESSOR,
|
|
449
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
450
|
+
multi: true,
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
provide: NG_VALIDATORS,
|
|
454
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
455
|
+
multi: true,
|
|
456
|
+
},
|
|
457
|
+
],
|
|
458
|
+
}]
|
|
459
|
+
}] });
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvaW5wdXQtbWFzay9zcmMvbGliL2lucHV0LW1hc2svaW5wdXQtbWFzay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixHQUdwQixNQUFNLGdCQUFnQixDQUFDOztBQVF4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUF3QkgsTUFBTSxPQUFPLGtCQUFrQjtJQUMzQjs7O09BR0c7SUFDSSxJQUFJLEdBQUcsS0FBSyxDQUFxQixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUU1RTs7O09BR0c7SUFDSSxRQUFRLEdBQUcsS0FBSyxDQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXJDOzs7OztPQUtHO0lBQ0ksTUFBTSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV0Qzs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQVMsVUFBVSxDQUFDLENBQUM7SUFFcEQ7OztPQUdHO0lBQ0ksU0FBUyxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUV4Qzs7O09BR0c7SUFDSSxZQUFZLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFFdEIsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQTRCLENBQUEsQ0FBQyxDQUFDO0lBQzFDLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdEMsTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDekIsTUFBTSxHQUFhLEVBQUUsQ0FBQztJ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bUIsQ0FBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDOzRCQUNqRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBvdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbnRlcmZhY2UgTWFza1Rva2VuIHtcbiAgICB0eXBlOiAnbGl0ZXJhbCcgfCAnZGlnaXQnIHwgJ2FscGhhJyB8ICdhbHBoYW51bWVyaWMnO1xuICAgIGNoYXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpcmV0aXZhIGRlIG3DoXNjYXJhIGRlIGVudHJhZGEgcGFyYSBjYW1wb3MgZGUgdGV4dG8uXG4gKlxuICogQXBsaXF1ZSBgW3NJbnB1dE1hc2tdYCBlbSBxdWFscXVlciBgPGlucHV0PmAgcGFyYSBhcGxpY2FyIHVtYSBtw6FzY2FyYSBkZSBmb3JtYXRhw6fDo28sXG4gKiBndWlhbmRvIGEgZW50cmFkYSBkbyB1c3XDoXJpbyBjb20gdW0gcGFkcsOjbyBkZWZpbmlkby4gSW1wbGVtZW50YSBDb250cm9sVmFsdWVBY2Nlc3NvclxuICogZSBWYWxpZGF0b3IgcGFyYSBpbnRlZ3Jhw6fDo28gbmF0aXZhIGNvbSBBbmd1bGFyIEZvcm1zLlxuICpcbiAqICoqU2xvdHMgZGUgbcOhc2NhcmE6KipcbiAqIC0gYDlgIOKAlCBkw61naXRvICgwLTkpXG4gKiAtIGBhYCDigJQgbGV0cmEgKGNvbmZvcm1lIGBjaGFyYWN0ZXJQYXR0ZXJuYCwgcGFkcsOjbyBgW0EtWmEtel1gKVxuICogLSBgKmAg4oCUIGFsZmFudW3DqXJpY28gKGxldHJhIG91IGTDrWdpdG8pXG4gKiAtIE91dHJvcyBjYXJhY3RlcmVzIHPDo28gdHJhdGFkb3MgY29tbyBsaXRlcmFpcyAoZXg6IGAuYCwgYC1gLCBgL2AsIGAoYCwgYClgKVxuICogLSBgP2Ag4oCUIHR1ZG8gYXDDs3MgZXNzZSBwb250byBuYSBtw6FzY2FyYSDDqSBvcGNpb25hbFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIENQRiAtLT5cbiAqIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtzSW5wdXRNYXNrXT1cIic5OTkuOTk5Ljk5OS05OSdcIiBbKG5nTW9kZWwpXT1cImNwZlwiIC8+XG4gKlxuICogPCEtLSBUZWxlZm9uZSBjb20gdW5tYXNrIC0tPlxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3NJbnB1dE1hc2tdPVwiJyg5OSkgOTk5OTktOTk5OSdcIiBbdW5tYXNrXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRlbGVmb25lXCIgLz5cbiAqIGBgYFxuICogQGNhdGVnb3J5IElucHV0XG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbc0lucHV0TWFza10nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJyxcbiAgICAgICAgJyhmb2N1cyknOiAnb25Gb2N1cygkZXZlbnQpJyxcbiAgICAgICAgJyhibHVyKSc6ICdvbkJsdXIoJGV2ZW50KScsXG4gICAgICAgICcocGFzdGUpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoY2xpY2spJzogJ29uQ2xpY2soKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICAgIC8qKlxuICAgICAqIFBhZHLDo28gZGEgbcOhc2NhcmEuIFNsb3RzOiBgOWAgKGTDrWdpdG8pLCBgYWAgKGxldHJhKSwgYCpgIChhbGZhbnVtw6lyaWNvKS5cbiAgICAgKiBEZW1haXMgY2FyYWN0ZXJlcyBzw6NvIGxpdGVyYWlzLiBgP2AgdG9ybmEgbyByZXN0YW50ZSBkYSBtw6FzY2FyYSBvcGNpb25hbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFzayA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGFsaWFzOiAnc0lucHV0TWFzaycgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDYXJhY3RlcmUgZXhpYmlkbyBuYXMgcG9zacOnw7VlcyBhaW5kYSBuw6NvIHByZWVuY2hpZGFzLlxuICAgICAqIEBkZWZhdWx0ICdfJ1xuICAgICAqL1xuICAgIHB1YmxpYyBzbG90Q2hhciA9IGlucHV0PHN0cmluZz4oJ18nKTtcblxuICAgIC8qKlxuICAgICAqIFF1YW5kbyBgdHJ1ZWAsIG8gbW9kZWxvIHJlY2ViZSBhcGVuYXMgb3MgY2FyYWN0ZXJlcyBkaWdpdGFkb3MgcGVsbyB1c3XDoXJpbyxcbiAgICAgKiBzZW0gb3MgbGl0ZXJhaXMgZGEgbcOhc2NhcmEuIFF1YW5kbyBgZmFsc2VgLCBvIG1vZGVsbyByZWNlYmUgbyB2YWxvciBjb21wbGV0b1xuICAgICAqIGluY2x1aW5kbyBsaXRlcmFpcy5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHB1YmxpYyB1bm1hc2sgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgdXNhZGEgcGFyYSB2YWxpZGFyIG8gc2xvdCBgYWAgKGxldHJhKS5cbiAgICAgKiBAZGVmYXVsdCAnW0EtWmEtel0nXG4gICAgICovXG4gICAgcHVibGljIGNoYXJhY3RlclBhdHRlcm4gPSBpbnB1dDxzdHJpbmc+KCdbQS1aYS16XScpO1xuXG4gICAgLyoqXG4gICAgICogUXVhbmRvIGB0cnVlYCwgbGltcGEgbyBjYW1wbyBhbyBwZXJkZXIgbyBmb2NvIHNlIGEgbcOhc2NhcmEgZXN0aXZlciBpbmNvbXBsZXRhLlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0b0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0aWRvIHF1YW5kbyB0b2RvcyBvcyBzbG90cyBvYnJpZ2F0w7NyaW9zIGRhIG3DoXNjYXJhIGVzdMOjbyBwcmVlbmNoaWRvcy5cbiAgICAgKiBFbWl0ZSBvIHZhbG9yIGF0dWFsIChtYXNjYXJhZG8gb3UgbsOjbywgY29uZm9ybWUgYHVubWFza2ApLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYXNrQ29tcGxldGUgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdChFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgICBwcml2YXRlIHRva2VuczogTWFza1Rva2VuW10gPSBbXTtcbiAgICBwcml2YXRlIGJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIHdhc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZE1hc2soKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snbWFzayddIHx8IGNoYW5nZXNbJ3Nsb3RDaGFyJ10gfHwgY2hhbmdlc1snY2hhcmFjdGVyUGF0dGVybiddKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTWFzaygpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWFzaygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMubGFzdFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRNYXNrKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXNrU3RyID0gdGhpcy5tYXNrKCk7XG4gICAgICAgIGlmICghbWFza1N0cikge1xuICAgICAgICAgICAgdGhpcy50b2tlbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2tlbnMgPSB0aGlzLnBhcnNlTWFzayhtYXNrU3RyKTtcbiAgICAgICAgdGhpcy5yZXNldEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNYXNrKG1hc2s6IHN0cmluZyk6IE1hc2tUb2tlbltdIHtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBNYXNrVG9rZW5bXSA9IFtdO1xuICAgICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoID0gbWFza1tpXTtcblxuICAgICAgICAgICAgaWYgKGNoID09PSAnPycpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgICAgICAgICBjYXNlICc5JzpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnZGlnaXQnLCBvcHRpb25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2FscGhhJywgb3B0aW9uYWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICdhbHBoYW51bWVyaWMnLCBvcHRpb25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnbGl0ZXJhbCcsIGNoYXI6IGNoLCBvcHRpb25hbDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0QnVmZmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMudG9rZW5zLm1hcCgodCkgPT4gKHQudHlwZSA9PT0gJ2xpdGVyYWwnID8gdC5jaGFyISA6IHRoaXMuc2xvdENoYXIoKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZENoYXIoY2hhcjogc3RyaW5nLCB0b2tlbjogTWFza1Rva2VuKTogYm9vbGVhbiB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlnaXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAvWzAtOV0vLnRlc3QoY2hhcik7XG4gICAgICAgICAgICBjYXNlICdhbHBoYSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodGhpcy5jaGFyYWN0ZXJQYXR0ZXJuKCkpLnRlc3QoY2hhcik7XG4gICAgICAgICAgICBjYXNlICdhbHBoYW51bWVyaWMnOlxuICAgICAgICAgICAgICAgIHJldHVybiAvW0EtWmEtejAtOV0vLnRlc3QoY2hhcik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNFZGl0YWJsZSh0b2tlbjogTWFza1Rva2VuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0b2tlbi50eXBlICE9PSAnbGl0ZXJhbCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuZXh0RWRpdGFibGVQb3MoZnJvbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFZGl0YWJsZSh0aGlzLnRva2Vuc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJldkVkaXRhYmxlUG9zKGZyb206IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMuaXNFZGl0YWJsZSh0aGlzLnRva2Vuc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDdXJzb3IocG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2FmZVBvcyA9IE1hdGgubWluKHBvcywgdGhpcy50b2tlbnMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNhZmVQb3MsIHNhZmVQb3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Qmx1ckRpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbGFzdEZpbGxlZEluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5idWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRva2Vuc1tpXSAmJiB0aGlzLnRva2Vuc1tpXS50eXBlICE9PSAnbGl0ZXJhbCcgJiYgdGhpcy5idWZmZXJbaV0gIT09IHRoaXMuc2xvdENoYXIoKSkge1xuICAgICAgICAgICAgICAgIGxhc3RGaWxsZWRJbmRleCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RGaWxsZWRJbmRleCA9PT0gLTEpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIGxhc3RGaWxsZWRJbmRleCArIDEpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgbW9kZWwuXG4gICAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCB0eXBlZCBhbnl0aGluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1vZGVsVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGhhc0lucHV0ID0gdGhpcy5idWZmZXIuc29tZShcbiAgICAgICAgICAgIChjaCwgaSkgPT4gdGhpcy50b2tlbnNbaV0gJiYgdGhpcy50b2tlbnNbaV0udHlwZSAhPT0gJ2xpdGVyYWwnICYmIGNoICE9PSB0aGlzLnNsb3RDaGFyKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFoYXNJbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51bm1hc2soKSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChjaCwgaSkgPT4gdGhpcy50b2tlbnNbaV0gJiYgdGhpcy50b2tlbnNbaV0udHlwZSAhPT0gJ2xpdGVyYWwnICYmIGNoICE9PSB0aGlzLnNsb3RDaGFyKCkpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKSB8fCBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJSYW5nZShzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQb3M7IGkgPCBlbmRQb3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2ldID0gdGhpcy5zbG90Q2hhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWFza0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuZXZlcnkoKHRva2VuLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpdGVyYWwnIHx8IHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcltpXSAhPT0gdGhpcy5zbG90Q2hhcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrQW5kRW1pdENvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb21wbGV0ZSA9IHRoaXMuaXNNYXNrQ29tcGxldGUoKTtcbiAgICAgICAgaWYgKGNvbXBsZXRlICYmICF0aGlzLndhc0NvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLndhc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubWFza0NvbXBsZXRlLmVtaXQodGhpcy5nZXRNb2RlbFZhbHVlKCkgPz8gJycpO1xuICAgICAgICB9IGVsc2UgaWYgKCFjb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy53YXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwYXRjaElucHV0RXZlbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hc2soKSB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucmVhZE9ubHkgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAgICAgLy8gTGV0IHRoZSBicm93c2VyIGhhbmRsZSBzaG9ydGN1dHMgKEN0cmwvQ21kKSwgVGFiLCBhbmQgZnVuY3Rpb24ga2V5c1xuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGtleSA9PT0gJ1RhYicgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGV0IHRoZSBicm93c2VyIGhhbmRsZSBhcnJvdyBuYXZpZ2F0aW9uIGFuZCBIb21lL0VuZCBuYXRpdmVseVxuICAgICAgICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93bicsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzdGFydFBvcyA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgICAgIGNvbnN0IGVuZFBvcyA9IGlucHV0LnNlbGVjdGlvbkVuZCA/PyAwO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0UG9zICE9PSBlbmRQb3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihuZXh0UG9zIDwgdGhpcy50b2tlbnMubGVuZ3RoID8gbmV4dFBvcyA6IHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5wcmV2RWRpdGFibGVQb3Moc3RhcnRQb3MgLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbcG9zXSA9IHRoaXMuc2xvdENoYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5nZXRNb2RlbFZhbHVlKCkpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0FuZEVtaXRDb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0UG9zICE9PSBlbmRQb3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihuZXh0UG9zIDwgdGhpcy50b2tlbnMubGVuZ3RoID8gbmV4dFBvcyA6IHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5uZXh0RWRpdGFibGVQb3Moc3RhcnRQb3MpO1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbcG9zXSA9IHRoaXMuc2xvdENoYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5nZXRNb2RlbFZhbHVlKCkpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0FuZEVtaXRDb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyXG4gICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBsZXQgaW5zZXJ0UG9zID0gc3RhcnRQb3M7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHNlbGVjdGlvbiByYW5nZSBpZiBhbnlcbiAgICAgICAgICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclJhbmdlKHN0YXJ0UG9zLCBlbmRQb3MpO1xuICAgICAgICAgICAgICAgIGluc2VydFBvcyA9IHN0YXJ0UG9zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhpbnNlcnRQb3MpO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbnNbcG9zXTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDaGFyKGtleSwgdG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcltwb3NdID0ga2V5O1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0RWRpdGFibGVQb3MocG9zICsgMSk7XG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvcihuZXh0IDw9IHRoaXMudG9rZW5zLmxlbmd0aCA/IG5leHQgOiB0aGlzLnRva2Vucy5sZW5ndGgpO1xuXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0TW9kZWxWYWx1ZSgpKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRFbWl0Q29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1cyhfZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hc2soKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgZnVsbCBtYXNrIGRpc3BsYXkgb24gZm9jdXMgKHNsb3QgY2hhcnMgYmVjb21lIHZpc2libGUpXG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcblxuICAgICAgICAvLyBNb3ZlIGN1cnNvciB0byB0aGUgZmlyc3QgZW1wdHkgZWRpdGFibGUgc2xvdFxuICAgICAgICBjb25zdCBmaXJzdEVtcHR5ID0gdGhpcy5idWZmZXIuZmluZEluZGV4KFxuICAgICAgICAgICAgKGNoLCBpKSA9PiB0aGlzLnRva2Vuc1tpXSAmJiB0aGlzLnRva2Vuc1tpXS50eXBlICE9PSAnbGl0ZXJhbCcgJiYgY2ggPT09IHRoaXMuc2xvdENoYXIoKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNldEN1cnNvcihmaXJzdEVtcHR5ID49IDAgPyBmaXJzdEVtcHR5IDogdGhpcy5uZXh0RWRpdGFibGVQb3MoMCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoX2V2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubWFzaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc01hc2tDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvQ2xlYXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0Qmx1ckRpc3BsYXlWYWx1ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubWFzaygpIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5yZWFkT25seSB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSA/PyAnJztcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICAgICAgY29uc3QgZW5kUG9zID0gaW5wdXQuc2VsZWN0aW9uRW5kID8/IDA7XG5cbiAgICAgICAgaWYgKHN0YXJ0UG9zICE9PSBlbmRQb3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJSYW5nZShzdGFydFBvcywgZW5kUG9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhzdGFydFBvcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiBwYXN0ZWRUZXh0KSB7XG4gICAgICAgICAgICBpZiAocG9zID49IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5zW3Bvc107XG5cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIG1hdGNoaW5nIGxpdGVyYWwgaW4gcGFzdGVkIHRleHQ7IHNraXAgdGhlIGxpdGVyYWwgc2xvdCByZWdhcmRsZXNzXG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSB0b2tlbi5jaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhwb3MpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkQ2hhcihjaCwgdG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbcG9zXSA9IGNoO1xuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHBvcyArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuICAgICAgICB0aGlzLnNldEN1cnNvcihwb3MgPD0gdGhpcy50b2tlbnMubGVuZ3RoID8gcG9zIDogdGhpcy50b2tlbnMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldE1vZGVsVmFsdWUoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRFbWl0Q29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaElucHV0RXZlbnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hc2soKSB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucmVhZE9ubHkgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgcG9zID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcblxuICAgICAgICAvLyBJZiBjdXJzb3IgbGFuZGVkIG9uIGEgbGl0ZXJhbCwgbnVkZ2UgaXQgdG8gdGhlIG5lYXJlc3QgZWRpdGFibGUgc2xvdFxuICAgICAgICBpZiAodGhpcy50b2tlbnNbcG9zXSAmJiB0aGlzLnRva2Vuc1twb3NdLnR5cGUgPT09ICdsaXRlcmFsJykge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3IodGhpcy5uZXh0RWRpdGFibGVQb3MocG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5tYXNrKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRCdWZmZXIoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0VmFsdWUoJycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1ZmZlcklkeCA9IDA7XG4gICAgICAgIGxldCB2YWx1ZUlkeCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHZhbHVlSWR4IDwgdmFsdWUubGVuZ3RoICYmIGJ1ZmZlcklkeCA8IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2Vuc1tidWZmZXJJZHhdO1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHZhbHVlW3ZhbHVlSWR4XTtcblxuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIC8vIENvbnN1bWUgdGhlIGxpdGVyYWwgY2hhcmFjdGVyIGZyb20gdmFsdWUgaWYgaXQgbWF0Y2hlczsgYWx3YXlzIGFkdmFuY2UgYnVmZmVyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IHRva2VuLmNoYXIpIHZhbHVlSWR4Kys7XG4gICAgICAgICAgICAgICAgYnVmZmVySWR4Kys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWYWxpZENoYXIoY2hhciwgdG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbYnVmZmVySWR4XSA9IGNoYXI7XG4gICAgICAgICAgICAgICAgYnVmZmVySWR4Kys7XG4gICAgICAgICAgICAgICAgdmFsdWVJZHgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGFyYWN0ZXJzIGZyb20gdmFsdWUgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgc2xvdFxuICAgICAgICAgICAgICAgIHZhbHVlSWR4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXREaXNwbGF5VmFsdWUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMubWFzaygpIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc01hc2tDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpbmNvbXBsZXRlTWFzazogeyBtYXNrOiB0aGlzLm1hc2soKSB9IH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbiJdfQ==
|