@taiga-ui/kit
Version:
Taiga UI Angular main components kit
137 lines • 21.3 kB
JavaScript
import { computed, Directive, effect, inject, Input, signal, untracked, } from '@angular/core';
import { MaskitoDirective } from '@maskito/angular';
import { MASKITO_DEFAULT_OPTIONS, maskitoTransform, } from '@maskito/core';
import { maskitoCaretGuard, maskitoPrefixPostprocessorGenerator } from '@maskito/kit';
import { tuiAsControl, TuiControl, tuiValueTransformerFrom } from '@taiga-ui/cdk/classes';
import { TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { TuiTextfieldComponent, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
import { tuiMaskito } from '@taiga-ui/kit/utils';
import { TUI_INPUT_PHONE_OPTIONS } from './input-phone.options';
import { tuiCreateCompletePhoneInsertionPreprocessor } from './utils/complete-phone-insertion-preprocessor';
import { tuiCreatePhoneMaskExpression } from './utils/create-phone-mask-expression';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
import * as i2 from "@maskito/angular";
const MASK_SYMBOLS = /[ \-_()]/g;
function isText(value) {
return Number.isNaN(parseInt(value.replaceAll(MASK_SYMBOLS, ''), 10));
}
class TuiInputPhone extends TuiControl {
constructor() {
super(...arguments);
this.textfield = inject(TuiTextfieldDirective);
this.host = inject(TuiTextfieldComponent);
this.nonRemovablePrefix = computed(() => `${this.countryCode()} `);
this.inputMode = computed(() => (this.allowText() ? 'text' : 'numeric'));
this.valueEffect = effect(() => {
const value = this.value() ?? '';
if (!value) {
return;
}
this.textfield.value.set(maskitoTransform(value, this.mask()));
}, TUI_ALLOW_SIGNAL_WRITES);
this.blurEffect = effect(() => {
const incomplete = untracked(() => !this.value());
if (!this.host.focused() && incomplete) {
this.textfield.value.set('');
}
if (this.host.focused() && incomplete && !this.allowText()) {
this.textfield.value.set(this.nonRemovablePrefix());
}
}, TUI_ALLOW_SIGNAL_WRITES);
this.options = inject(TUI_INPUT_PHONE_OPTIONS);
this.el = tuiInjectElement();
this.mask = computed(() => this.calculateMask(this.countryCode(), this.phoneMask(), this.nonRemovablePrefix(), this.allowText()));
this.maskito = tuiMaskito(computed(() => this.mask()));
this.countryCode = signal(extractCountryCode(this.options.mask));
this.allowText = signal(this.options.allowText);
this.phoneMask = signal(extractMask(this.options.mask));
}
// TODO(v5): replace with signal input
set allowTextSetter(allow) {
this.allowText.set(allow);
}
// TODO(v5): replace with signal input
set maskSetter(mask) {
this.countryCode.set(extractCountryCode(mask));
this.phoneMask.set(extractMask(mask));
}
onInput(value) {
if (!value && !this.allowText()) {
this.textfield.value.set(this.nonRemovablePrefix());
}
const parsed = isText(value)
? value
: value.replaceAll(MASK_SYMBOLS, '').slice(0, this.maxPhoneLength);
this.onChange(parsed === this.countryCode() || isText(parsed) ? '' : parsed);
}
get maxPhoneLength() {
return (this.countryCode().length + this.phoneMask().replaceAll(/[^#]+/g, '').length);
}
calculateMask(countryCode, phoneMaskAfterCountryCode, nonRemovablePrefix, allowText) {
const mask = tuiCreatePhoneMaskExpression(countryCode, phoneMaskAfterCountryCode);
const preprocessors = [
tuiCreateCompletePhoneInsertionPreprocessor(countryCode, phoneMaskAfterCountryCode),
];
return allowText
? {
mask: ({ value }) => isText(value) && value !== '+'
? MASKITO_DEFAULT_OPTIONS.mask
: mask,
preprocessors,
}
: {
mask,
preprocessors,
postprocessors: [
maskitoPrefixPostprocessorGenerator(nonRemovablePrefix),
],
plugins: [
maskitoCaretGuard((value, [from, to]) => [
from === to ? nonRemovablePrefix.length : 0,
value.length,
]),
],
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputPhone, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputPhone, isStandalone: true, selector: "input[tuiInputPhone]", inputs: { allowTextSetter: ["allowText", "allowTextSetter"], maskSetter: ["mask", "maskSetter"] }, host: { attributes: { "type": "tel" }, listeners: { "input": "onInput($event.target.value)" }, properties: { "inputMode": "inputMode()", "disabled": "disabled()" } }, providers: [
tuiAsControl(TuiInputPhone),
tuiValueTransformerFrom(TUI_INPUT_PHONE_OPTIONS),
], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }, { directive: i2.MaskitoDirective }], ngImport: i0 }); }
}
export { TuiInputPhone };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputPhone, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'input[tuiInputPhone]',
providers: [
tuiAsControl(TuiInputPhone),
tuiValueTransformerFrom(TUI_INPUT_PHONE_OPTIONS),
],
hostDirectives: [TuiWithTextfield, MaskitoDirective],
host: {
type: 'tel',
'[inputMode]': 'inputMode()',
'[disabled]': 'disabled()',
'(input)': 'onInput($event.target.value)',
},
}]
}], propDecorators: { allowTextSetter: [{
type: Input,
args: ['allowText']
}], maskSetter: [{
type: Input,
args: ['mask']
}] } });
function extractCountryCode(mask) {
const match = /^(\+\d+)/.exec(mask);
return match?.[1] || '';
}
function extractMask(mask) {
const match = /^\+\d+(.*)$/.exec(mask);
return match?.[1]?.trim() || '';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGhvbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvaW5wdXQtcGhvbmUvaW5wdXQtcGhvbmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUNILHVCQUF1QixFQUV2QixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUFFLG1DQUFtQyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUNILHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ25CLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBQywyQ0FBMkMsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQzFHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDOzs7O0FBRWxGLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUVqQyxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lB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RSxnQkFBZ0IsQ0FBQztvQkFDcEQsSUFBSSxFQUFFO3dCQUNGLElBQUksRUFBRSxLQUFLO3dCQUNYLGFBQWEsRUFBRSxhQUFhO3dCQUM1QixZQUFZLEVBQUUsWUFBWTt3QkFDMUIsU0FBUyxFQUFFLDhCQUE4QjtxQkFDNUM7aUJBQ0o7OEJBa0RjLGVBQWU7c0JBRHpCLEtBQUs7dUJBQUMsV0FBVztnQkFPUCxVQUFVO3NCQURwQixLQUFLO3VCQUFDLE1BQU07O0FBOERqQixTQUFTLGtCQUFrQixDQUFDLElBQVk7SUFDcEMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBWTtJQUM3QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXZDLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGNvbXB1dGVkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXNraXRvRGlyZWN0aXZlfSBmcm9tICdAbWFza2l0by9hbmd1bGFyJztcbmltcG9ydCB7XG4gICAgTUFTS0lUT19ERUZBVUxUX09QVElPTlMsXG4gICAgdHlwZSBNYXNraXRvT3B0aW9ucyxcbiAgICBtYXNraXRvVHJhbnNmb3JtLFxufSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7bWFza2l0b0NhcmV0R3VhcmQsIG1hc2tpdG9QcmVmaXhQb3N0cHJvY2Vzc29yR2VuZXJhdG9yfSBmcm9tICdAbWFza2l0by9raXQnO1xuaW1wb3J0IHt0dWlBc0NvbnRyb2wsIFR1aUNvbnRyb2wsIHR1aVZhbHVlVHJhbnNmb3JtZXJGcm9tfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NsYXNzZXMnO1xuaW1wb3J0IHtUVUlfQUxMT1dfU0lHTkFMX1dSSVRFU30gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2RvbSc7XG5pbXBvcnQge1xuICAgIFR1aVRleHRmaWVsZENvbXBvbmVudCxcbiAgICBUdWlUZXh0ZmllbGREaXJlY3RpdmUsXG4gICAgVHVpV2l0aFRleHRmaWVsZCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHt0dWlNYXNraXRvfSBmcm9tICdAdGFpZ2EtdWkva2l0L3V0aWxzJztcblxuaW1wb3J0IHtUVUlfSU5QVVRfUEhPTkVfT1BUSU9OU30gZnJvbSAnLi9pbnB1dC1waG9uZS5vcHRpb25zJztcbmltcG9ydCB7dHVpQ3JlYXRlQ29tcGxldGVQaG9uZUluc2VydGlvblByZXByb2Nlc3Nvcn0gZnJvbSAnLi91dGlscy9jb21wbGV0ZS1waG9uZS1pbnNlcnRpb24tcHJlcHJvY2Vzc29yJztcbmltcG9ydCB7dHVpQ3JlYXRlUGhvbmVNYXNrRXhwcmVzc2lvbn0gZnJvbSAnLi91dGlscy9jcmVhdGUtcGhvbmUtbWFzay1leHByZXNzaW9uJztcblxuY29uc3QgTUFTS19TWU1CT0xTID0gL1sgXFwtXygpXS9nO1xuXG5mdW5jdGlvbiBpc1RleHQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VJbnQodmFsdWUucmVwbGFjZUFsbChNQVNLX1NZTUJPTFMsICcnKSwgMTApKTtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ2lucHV0W3R1aUlucHV0UGhvbmVdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpQXNDb250cm9sKFR1aUlucHV0UGhvbmUpLFxuICAgICAgICB0dWlWYWx1ZVRyYW5zZm9ybWVyRnJvbShUVUlfSU5QVVRfUEhPTkVfT1BUSU9OUyksXG4gICAgXSxcbiAgICBob3N0RGlyZWN0aXZlczogW1R1aVdpdGhUZXh0ZmllbGQsIE1hc2tpdG9EaXJlY3RpdmVdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgdHlwZTogJ3RlbCcsXG4gICAgICAgICdbaW5wdXRNb2RlXSc6ICdpbnB1dE1vZGUoKScsXG4gICAgICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkKCknLFxuICAgICAgICAnKGlucHV0KSc6ICdvbklucHV0KCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlJbnB1dFBob25lIGV4dGVuZHMgVHVpQ29udHJvbDxzdHJpbmcgfCBudWxsPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXh0ZmllbGQgPSBpbmplY3QoVHVpVGV4dGZpZWxkRGlyZWN0aXZlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFR1aVRleHRmaWVsZENvbXBvbmVudDxzdHJpbmc+ID0gaW5qZWN0KFR1aVRleHRmaWVsZENvbXBvbmVudCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9uUmVtb3ZhYmxlUHJlZml4ID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5jb3VudHJ5Q29kZSgpfSBgKTtcbiAgICBwcm90ZWN0ZWQgaW5wdXRNb2RlID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuYWxsb3dUZXh0KCkgPyAndGV4dCcgOiAnbnVtZXJpYycpKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSgpID8/ICcnO1xuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldChtYXNraXRvVHJhbnNmb3JtKHZhbHVlLCB0aGlzLm1hc2soKSkpO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBibHVyRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5jb21wbGV0ZSA9IHVudHJhY2tlZCgoKSA9PiAhdGhpcy52YWx1ZSgpKTtcblxuICAgICAgICBpZiAoIXRoaXMuaG9zdC5mb2N1c2VkKCkgJiYgaW5jb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhvc3QuZm9jdXNlZCgpICYmIGluY29tcGxldGUgJiYgIXRoaXMuYWxsb3dUZXh0KCkpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCh0aGlzLm5vblJlbW92YWJsZVByZWZpeCgpKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KFRVSV9JTlBVVF9QSE9ORV9PUFRJT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50PEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWFzayA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTWFzayhcbiAgICAgICAgICAgIHRoaXMuY291bnRyeUNvZGUoKSxcbiAgICAgICAgICAgIHRoaXMucGhvbmVNYXNrKCksXG4gICAgICAgICAgICB0aGlzLm5vblJlbW92YWJsZVByZWZpeCgpLFxuICAgICAgICAgICAgdGhpcy5hbGxvd1RleHQoKSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hc2tpdG8gPSB0dWlNYXNraXRvKGNvbXB1dGVkKCgpID0+IHRoaXMubWFzaygpKSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY291bnRyeUNvZGUgPSBzaWduYWwoZXh0cmFjdENvdW50cnlDb2RlKHRoaXMub3B0aW9ucy5tYXNrKSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGFsbG93VGV4dCA9IHNpZ25hbCh0aGlzLm9wdGlvbnMuYWxsb3dUZXh0KTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGhvbmVNYXNrID0gc2lnbmFsKGV4dHJhY3RNYXNrKHRoaXMub3B0aW9ucy5tYXNrKSk7XG5cbiAgICAvLyBUT0RPKHY1KTogcmVwbGFjZSB3aXRoIHNpZ25hbCBpbnB1dFxuICAgIEBJbnB1dCgnYWxsb3dUZXh0JylcbiAgICBwdWJsaWMgc2V0IGFsbG93VGV4dFNldHRlcihhbGxvdzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmFsbG93VGV4dC5zZXQoYWxsb3cpO1xuICAgIH1cblxuICAgIC8vIFRPRE8odjUpOiByZXBsYWNlIHdpdGggc2lnbmFsIGlucHV0XG4gICAgQElucHV0KCdtYXNrJylcbiAgICBwdWJsaWMgc2V0IG1hc2tTZXR0ZXIobWFzazogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY291bnRyeUNvZGUuc2V0KGV4dHJhY3RDb3VudHJ5Q29kZShtYXNrKSk7XG4gICAgICAgIHRoaXMucGhvbmVNYXNrLnNldChleHRyYWN0TWFzayhtYXNrKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbHVlICYmICF0aGlzLmFsbG93VGV4dCgpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS5zZXQodGhpcy5ub25SZW1vdmFibGVQcmVmaXgoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBpc1RleHQodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IHZhbHVlLnJlcGxhY2VBbGwoTUFTS19TWU1CT0xTLCAnJykuc2xpY2UoMCwgdGhpcy5tYXhQaG9uZUxlbmd0aCk7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShwYXJzZWQgPT09IHRoaXMuY291bnRyeUNvZGUoKSB8fCBpc1RleHQocGFyc2VkKSA/ICcnIDogcGFyc2VkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBtYXhQaG9uZUxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jb3VudHJ5Q29kZSgpLmxlbmd0aCArIHRoaXMucGhvbmVNYXNrKCkucmVwbGFjZUFsbCgvW14jXSsvZywgJycpLmxlbmd0aFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlTWFzayhcbiAgICAgICAgY291bnRyeUNvZGU6IHN0cmluZyxcbiAgICAgICAgcGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZTogc3RyaW5nLFxuICAgICAgICBub25SZW1vdmFibGVQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgYWxsb3dUZXh0OiBib29sZWFuLFxuICAgICk6IE1hc2tpdG9PcHRpb25zIHtcbiAgICAgICAgY29uc3QgbWFzayA9IHR1aUNyZWF0ZVBob25lTWFza0V4cHJlc3Npb24oY291bnRyeUNvZGUsIHBob25lTWFza0FmdGVyQ291bnRyeUNvZGUpO1xuICAgICAgICBjb25zdCBwcmVwcm9jZXNzb3JzID0gW1xuICAgICAgICAgICAgdHVpQ3JlYXRlQ29tcGxldGVQaG9uZUluc2VydGlvblByZXByb2Nlc3NvcihcbiAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZSxcbiAgICAgICAgICAgICAgICBwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gYWxsb3dUZXh0XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG1hc2s6ICh7dmFsdWV9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dCh2YWx1ZSkgJiYgdmFsdWUgIT09ICcrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA/IChNQVNLSVRPX0RFRkFVTFRfT1BUSU9OUy5tYXNrIGFzIFJlZ0V4cClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXNrLFxuICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBtYXNrLFxuICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgbWFza2l0b1ByZWZpeFBvc3Rwcm9jZXNzb3JHZW5lcmF0b3Iobm9uUmVtb3ZhYmxlUHJlZml4KSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgbWFza2l0b0NhcmV0R3VhcmQoKHZhbHVlLCBbZnJvbSwgdG9dKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPT09IHRvID8gbm9uUmVtb3ZhYmxlUHJlZml4Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0Q291bnRyeUNvZGUobWFzazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eKFxcK1xcZCspLy5leGVjKG1hc2spO1xuXG4gICAgcmV0dXJuIG1hdGNoPy5bMV0gfHwgJyc7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNYXNrKG1hc2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxcK1xcZCsoLiopJC8uZXhlYyhtYXNrKTtcblxuICAgIHJldHVybiBtYXRjaD8uWzFdPy50cmltKCkgfHwgJyc7XG59XG4iXX0=