@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
236 lines • 30.2 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, forwardRef, HostListener, Inject, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { AswMaskService } from './mask.service';
import * as i0 from "@angular/core";
import * as i1 from "./mask.service";
export class AswMaskDirective {
document;
maskService;
maskValue;
inputValue;
position = null;
start;
end;
onChange = (_) => { };
onTouch = () => { };
constructor(document, maskService) {
this.document = document;
this.maskService = maskService;
}
set maskExpression(value) {
this.maskValue = value || '';
if (!this.maskValue) {
return;
}
this.maskService.maskExpression = this._repeatPatternSymbols(this.maskValue);
this.maskService.formElementProperty = ['value', this.maskService.applyMask(this.inputValue, this.maskService.maskExpression)];
}
set specialCharacters(value) {
if (!value || !Array.isArray(value) || (Array.isArray(value) && !value.length)) {
return;
}
this.maskService.maskSpecialCharacters = value;
}
set patterns(value) {
if (!value) {
return;
}
this.maskService.maskAvailablePatterns = value;
}
set prefix(value) {
if (!value) {
return;
}
this.maskService.prefix = value;
}
set sufix(value) {
if (!value) {
return;
}
this.maskService.sufix = value;
}
set dropSpecialCharacters(value) {
this.maskService.dropSpecialCharacters = value;
}
set showMaskTyped(value) {
if (!value) {
return;
}
this.maskService.showMaskTyped = value;
}
set showTemplate(value) {
this.maskService.showTemplate = value;
}
set clearIfNotMatch(value) {
this.maskService.clearIfNotMatch = value;
}
onInput(e) {
const el = e.target;
this.inputValue = el.value;
if (!this.maskValue) {
this.onChange(el.value);
return;
}
const position = el.selectionStart === 1 ? el.selectionStart + this.maskService.prefix.length : el.selectionStart;
let caretShift = 0;
this.maskService.applyValueChanges(position, (shift) => (caretShift = shift));
// only set the selection if the element is active
if (this.document.activeElement !== el) {
return;
}
el.selectionStart = el.selectionEnd =
this.position !== null
? this.position
: position +
// tslint:disable-next-line
(e.inputType === 'deleteContentBackward' ? 0 : caretShift);
this.position = null;
}
onBlur() {
this.maskService.clearIfNotMatchFn();
this.onTouch();
}
onFocus(e) {
const el = e.target;
if (el !== null &&
el.selectionStart !== null &&
el.selectionStart === el.selectionEnd &&
el.selectionStart > this.maskService.prefix.length &&
// tslint:disable-next-line
e.keyCode !== 38) {
return;
}
if (this.maskService.showMaskTyped) {
this.maskService.maskIsShown = this.maskService.maskExpression.replace(/[0-9]/g, '_');
}
el.value = !el.value || el.value === this.maskService.prefix ? this.maskService.prefix + this.maskService.maskIsShown : el.value;
/** fix of cursor position with prefix when mouse click occur */
if ((el.selectionStart || el.selectionEnd) <= this.maskService.prefix.length) {
el.selectionStart = this.maskService.prefix.length;
return;
}
}
a(e) {
const el = e.target;
if (e.keyCode === 38) {
e.preventDefault();
}
if (e.keyCode === 37 || e.keyCode === 8) {
if (el.selectionStart <= this.maskService.prefix.length && el.selectionEnd <= this.maskService.prefix.length) {
e.preventDefault();
}
this.onFocus(e);
if (e.keyCode === 8 && el.selectionStart === 0 && el.selectionEnd === el.value.length) {
el.value = this.maskService.prefix;
this.position = this.maskService.prefix ? this.maskService.prefix.length : 1;
this.onInput(e);
}
}
}
onPaste() {
this.position = Number.MAX_SAFE_INTEGER;
}
/** It writes the value in the input */
async writeValue(inputValue) {
if (inputValue === undefined) {
inputValue = '';
}
if (typeof inputValue === 'number') {
inputValue = String(inputValue);
this.maskService.isNumberValue = true;
}
(inputValue && this.maskService.maskExpression) || (this.maskService.maskExpression && (this.maskService.prefix || this.maskService.showMaskTyped))
? (this.maskService.formElementProperty = ['value', this.maskService.applyMask(inputValue, this.maskService.maskExpression)])
: (this.maskService.formElementProperty = ['value', inputValue]);
this.inputValue = inputValue;
}
// tslint:disable-next-line
registerOnChange(fn) {
this.onChange = fn;
this.maskService.onChange = this.onChange;
}
// tslint:disable-next-line
registerOnTouched(fn) {
this.onTouch = fn;
}
/** It disables the input element */
setDisabledState(isDisabled) {
this.maskService.formElementProperty = ['disabled', isDisabled];
}
_repeatPatternSymbols(maskExp) {
return ((maskExp.match(/{[0-9]+}/) &&
maskExp.split('').reduce((accum, currval, index) => {
this.start = currval === '{' ? index : this.start;
if (currval !== '}') {
return this.maskService._findSpecialChar(currval) ? accum + currval : accum;
}
this.end = index;
const repeatNumber = Number(maskExp.slice(this.start + 1, this.end));
const repaceWith = new Array(repeatNumber + 1).join(maskExp[this.start - 1]);
return accum + repaceWith;
}, '')) ||
maskExp);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswMaskDirective, deps: [{ token: DOCUMENT }, { token: i1.AswMaskService }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: AswMaskDirective, selector: "[aswMask]", inputs: { maskExpression: ["aswMask", "maskExpression"], specialCharacters: "specialCharacters", patterns: "patterns", prefix: "prefix", sufix: "sufix", dropSpecialCharacters: "dropSpecialCharacters", showMaskTyped: "showMaskTyped", showTemplate: "showTemplate", clearIfNotMatch: "clearIfNotMatch" }, host: { listeners: { "input": "onInput($event)", "blur": "onBlur()", "click": "onFocus($event)", "keydown": "a($event)", "paste": "onPaste()" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AswMaskDirective),
multi: true
},
AswMaskService
], ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswMaskDirective, decorators: [{
type: Directive,
args: [{
selector: '[aswMask]',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AswMaskDirective),
multi: true
},
AswMaskService
]
}]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.AswMaskService }], propDecorators: { maskExpression: [{
type: Input,
args: ['aswMask']
}], specialCharacters: [{
type: Input
}], patterns: [{
type: Input
}], prefix: [{
type: Input
}], sufix: [{
type: Input
}], dropSpecialCharacters: [{
type: Input
}], showMaskTyped: [{
type: Input
}], showTemplate: [{
type: Input
}], clearIfNotMatch: [{
type: Input
}], onInput: [{
type: HostListener,
args: ['input', ['$event']]
}], onBlur: [{
type: HostListener,
args: ['blur']
}], onFocus: [{
type: HostListener,
args: ['click', ['$event']]
}], a: [{
type: HostListener,
args: ['keydown', ['$event']]
}], onPaste: [{
type: HostListener,
args: ['paste']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9jb21tb24vbWFzay9tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBYWhELE1BQU0sT0FBTyxnQkFBZ0I7SUFTSztJQUNsQjtJQVRKLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQVU7SUFDcEIsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsS0FBSyxDQUFVO0lBQ2YsR0FBRyxDQUFVO0lBQ2QsUUFBUSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDMUIsT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUMxQixZQUM4QixRQUFhLEVBQy9CLFdBQTJCO1FBRFQsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFDcEMsQ0FBQztJQUVKLElBQ1csY0FBYyxDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FB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Z0JBU0ssWUFBWTtzQkFEdEIsS0FBSztnQkFNSyxlQUFlO3NCQUR6QixLQUFLO2dCQU1DLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBeUIxQixNQUFNO3NCQURaLFlBQVk7dUJBQUMsTUFBTTtnQkFPYixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXlCMUIsQ0FBQztzQkFEUCxZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQjVCLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBBc3dNYXNrU2VydmljZSB9IGZyb20gJy4vbWFzay5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYXN3TWFza10nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzd01hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgQXN3TWFza1NlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzd01hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgcHJpdmF0ZSBtYXNrVmFsdWUhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpbnB1dFZhbHVlITogc3RyaW5nO1xuICAgIHByaXZhdGUgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgc3RhcnQhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBlbmQhOiBudW1iZXI7XG4gICAgcHVibGljIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gICAgcHVibGljIG9uVG91Y2ggPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBtYXNrU2VydmljZTogQXN3TWFza1NlcnZpY2VcbiAgICApIHt9XG5cbiAgICBASW5wdXQoJ2Fzd01hc2snKVxuICAgIHB1YmxpYyBzZXQgbWFza0V4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1hc2tWYWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgICBpZiAoIXRoaXMubWFza1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9IHRoaXMuX3JlcGVhdFBhdHRlcm5TeW1ib2xzKHRoaXMubWFza1ZhbHVlKTtcbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gWyd2YWx1ZScsIHRoaXMubWFza1NlcnZpY2UuYXBwbHlNYXNrKHRoaXMuaW5wdXRWYWx1ZSwgdGhpcy5tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbildO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogSUNvbmZpZ1snc3BlY2lhbENoYXJhY3RlcnMnXSkge1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hc2tTZXJ2aWNlLm1hc2tTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBwYXR0ZXJucyh2YWx1ZTogSUNvbmZpZ1sncGF0dGVybnMnXSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5tYXNrQXZhaWxhYmxlUGF0dGVybnMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcHJlZml4KHZhbHVlOiBJQ29uZmlnWydwcmVmaXgnXSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5wcmVmaXggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc3VmaXgodmFsdWU6IElDb25maWdbJ3N1Zml4J10pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFza1NlcnZpY2Uuc3VmaXggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZHJvcFNwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBJQ29uZmlnWydkcm9wU3BlY2lhbENoYXJhY3RlcnMnXSkge1xuICAgICAgICB0aGlzLm1hc2tTZXJ2aWNlLmRyb3BTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzaG93TWFza1R5cGVkKHZhbHVlOiBJQ29uZmlnWydzaG93TWFza1R5cGVkJ10pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFza1NlcnZpY2Uuc2hvd01hc2tUeXBlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzaG93VGVtcGxhdGUodmFsdWU6IElDb25maWdbJ3Nob3dUZW1wbGF0ZSddKSB7XG4gICAgICAgIHRoaXMubWFza1NlcnZpY2Uuc2hvd1RlbXBsYXRlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGNsZWFySWZOb3RNYXRjaCh2YWx1ZTogSUNvbmZpZ1snY2xlYXJJZk5vdE1hdGNoJ10pIHtcbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2ggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uSW5wdXQoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMubWFza1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NpdGlvbjogbnVtYmVyID0gKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgPT09IDEgPyAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSArIHRoaXMubWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCA6IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuICAgICAgICBsZXQgY2FyZXRTaGlmdCA9IDA7XG4gICAgICAgIHRoaXMubWFza1NlcnZpY2UuYXBwbHlWYWx1ZUNoYW5nZXMocG9zaXRpb24sIChzaGlmdDogbnVtYmVyKSA9PiAoY2FyZXRTaGlmdCA9IHNoaWZ0KSk7XG4gICAgICAgIC8vIG9ubHkgc2V0IHRoZSBzZWxlY3Rpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbC5zZWxlY3Rpb25FbmQgPVxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gdGhpcy5wb3NpdGlvblxuICAgICAgICAgICAgICAgIDogcG9zaXRpb24gK1xuICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAoKGUgYXMgYW55KS5pbnB1dFR5cGUgPT09ICdkZWxldGVDb250ZW50QmFja3dhcmQnID8gMCA6IGNhcmV0U2hpZnQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hc2tTZXJ2aWNlLmNsZWFySWZOb3RNYXRjaEZuKCk7XG4gICAgICAgIHRoaXMub25Ub3VjaCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Gb2N1cyhlOiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsICE9PSBudWxsICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IGVsLnNlbGVjdGlvbkVuZCAmJlxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPiB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggJiZcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgKGUgYXMgYW55KS5rZXlDb2RlICE9PSAzOFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXNrU2VydmljZS5zaG93TWFza1R5cGVkKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tTZXJ2aWNlLm1hc2tJc1Nob3duID0gdGhpcy5tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbi5yZXBsYWNlKC9bMC05XS9nLCAnXycpO1xuICAgICAgICB9XG4gICAgICAgIGVsLnZhbHVlID0gIWVsLnZhbHVlIHx8IGVsLnZhbHVlID09PSB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeCA/IHRoaXMubWFza1NlcnZpY2UucHJlZml4ICsgdGhpcy5tYXNrU2VydmljZS5tYXNrSXNTaG93biA6IGVsLnZhbHVlO1xuICAgICAgICAvKiogZml4IG9mIGN1cnNvciBwb3NpdGlvbiB3aXRoIHByZWZpeCB3aGVuIG1vdXNlIGNsaWNrIG9jY3VyICovXG4gICAgICAgIGlmICgoKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgfHwgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpKSA8PSB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGEoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSA4KSB7XG4gICAgICAgICAgICBpZiAoKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgPD0gdGhpcy5tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmIChlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSA8PSB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRm9jdXMoZSk7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4ICYmIGVsLnNlbGVjdGlvblN0YXJ0ID09PSAwICYmIGVsLnNlbGVjdGlvbkVuZCA9PT0gZWwudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWwudmFsdWUgPSB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeDtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5tYXNrU2VydmljZS5wcmVmaXggPyB0aGlzLm1hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggOiAxO1xuICAgICAgICAgICAgICAgIHRoaXMub25JbnB1dChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJylcbiAgICBwdWJsaWMgb25QYXN0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKiBJdCB3cml0ZXMgdGhlIHZhbHVlIGluIHRoZSBpbnB1dCAqL1xuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKGlucHV0VmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IFN0cmluZyhpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubWFza1NlcnZpY2UuaXNOdW1iZXJWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgKGlucHV0VmFsdWUgJiYgdGhpcy5tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbikgfHwgKHRoaXMubWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gJiYgKHRoaXMubWFza1NlcnZpY2UucHJlZml4IHx8IHRoaXMubWFza1NlcnZpY2Uuc2hvd01hc2tUeXBlZCkpXG4gICAgICAgICAgICA/ICh0aGlzLm1hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbJ3ZhbHVlJywgdGhpcy5tYXNrU2VydmljZS5hcHBseU1hc2soaW5wdXRWYWx1ZSwgdGhpcy5tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbildKVxuICAgICAgICAgICAgOiAodGhpcy5tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gWyd2YWx1ZScsIGlucHV0VmFsdWVdKTtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICAgICAgdGhpcy5tYXNrU2VydmljZS5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEl0IGRpc2FibGVzIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbJ2Rpc2FibGVkJywgaXNEaXNhYmxlZF07XG4gICAgfVxuICAgIHByaXZhdGUgX3JlcGVhdFBhdHRlcm5TeW1ib2xzKG1hc2tFeHA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobWFza0V4cC5tYXRjaCgve1swLTldK30vKSAmJlxuICAgICAgICAgICAgICAgIG1hc2tFeHAuc3BsaXQoJycpLnJlZHVjZSgoYWNjdW06IHN0cmluZywgY3VycnZhbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydCA9IGN1cnJ2YWwgPT09ICd7JyA/IGluZGV4IDogdGhpcy5zdGFydDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycnZhbCAhPT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXNrU2VydmljZS5fZmluZFNwZWNpYWxDaGFyKGN1cnJ2YWwpID8gYWNjdW0gKyBjdXJydmFsIDogYWNjdW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQgPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwZWF0TnVtYmVyOiBudW1iZXIgPSBOdW1iZXIobWFza0V4cC5zbGljZSh0aGlzLnN0YXJ0ICsgMSwgdGhpcy5lbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwYWNlV2l0aDogc3RyaW5nID0gbmV3IEFycmF5KHJlcGVhdE51bWJlciArIDEpLmpvaW4obWFza0V4cFt0aGlzLnN0YXJ0IC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW0gKyByZXBhY2VXaXRoO1xuICAgICAgICAgICAgICAgIH0sICcnKSkgfHxcbiAgICAgICAgICAgIG1hc2tFeHBcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=