moh-common-lib
Version:
A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).
191 lines • 18.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, Optional, Self } from '@angular/core';
import { NgControl } from '@angular/forms';
import { NUMBER, SPACE } from '../../models/mask.constants';
import { LabelReplacementTag } from '../../models/error-message.interface';
import { AbstractFormControl } from '../../models/abstract-form-control';
/**
* PhoneNumberComponent is a used to show the Phone number.
*
*
* \@example
* <common-phone-number name='phoneNumber'
* [(ngModel)]='dataService.facAdminPhoneNumber'
* required></common-phone-number>
* @export
*/
export class PhoneNumberComponent extends AbstractFormControl {
/**
* @param {?} controlDir
*/
constructor(controlDir) {
super();
this.controlDir = controlDir;
this.displayMask = true;
this.required = false;
this.label = 'Mobile';
this.allowInternational = true;
// TODO: Remove once all project using library remove placeholders -- Temporary solution
this.enablePlaceHolder = true;
this.valueChange = new EventEmitter();
this.phoneNumber = '';
// Abstact variable defined
this._defaultErrMsg = {
required: `${LabelReplacementTag} is required.`,
incompleteValue: `${LabelReplacementTag} does not appear to be valid.`
};
if (controlDir) {
controlDir.valueAccessor = this;
}
}
// Setter/getter for when not used in form (ex. data dislayed but not edittable)
/**
* @param {?} val
* @return {?}
*/
set value(val) {
if (val !== undefined) {
this.phoneNumber = val;
}
}
/**
* @return {?}
*/
get value() {
return this.phoneNumber;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
/** @type {?} */
const internationalPrefix = '+1';
this.placeholder = this.enablePlaceHolder ? '(555) 555-5555' : '';
this.mask = ['(', /[2-9]/, NUMBER, NUMBER, ')', SPACE, NUMBER, NUMBER, NUMBER, '-', NUMBER, NUMBER, NUMBER, NUMBER];
if (this.allowInternational) {
if (this.placeholder) {
this.placeholder = `${internationalPrefix} ${this.placeholder}`;
}
/** @type {?} */
const prefixArrayOfChar = internationalPrefix.split('');
this.mask = [...prefixArrayOfChar, SPACE, ...this.mask];
}
// Register self validation
Promise.resolve().then((/**
* @return {?}
*/
() => {
if (this.controlDir) {
/** @type {?} */
const allValidators = [this.validateSelf.bind(this)];
if (this.controlDir.control.validator) {
allValidators.push(this.controlDir.control.validator);
}
this.controlDir.control.setValidators(allValidators);
this.controlDir.control.updateValueAndValidity();
}
}));
}
/**
* @param {?} value
* @return {?}
*/
setPhoneNumber(value) {
this.phoneNumber = value;
this.valueChange.emit(this.phoneNumber);
this._onChange(value);
}
/**
* @param {?} $event
* @return {?}
*/
onBlur($event) {
this._onTouched($event);
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== undefined) {
// phoneNumber is where the actual data is displayed to user for this
// component
this.phoneNumber = value;
}
}
/**
* @private
* @return {?}
*/
validateSelf() {
/** @type {?} */
const value = this.phoneNumber;
/** @type {?} */
const phoneLength = this.allowInternational ? 11 : 10;
if (value) {
/** @type {?} */
const stripped = value
.replace(/_/g, '') // remove underlines
.replace(/\s/g, '') // spaces
.replace(/\+|-/g, '') // + or - symbol
.replace('(', '')
.replace(')', '');
/** @type {?} */
const valid = stripped.length === phoneLength;
return valid ? null : { incompleteValue: true };
}
return null;
}
}
PhoneNumberComponent.PhoneNumberRegEx = '^[2-9]{1}\\d{2}[\\-]?\\d{3}[\\-]?\\d{4}$';
PhoneNumberComponent.decorators = [
{ type: Component, args: [{
selector: 'common-phone-number',
template: "\r\n<label for=\"phone_{{objectId}}\" class=\"control-label\">{{label}}</label>\r\n<div *ngIf=\"displayMask; else NoMask\">\r\n <input class=\"form-control\"\r\n type=\"text\"\r\n name=\"phone_{{objectId}}\"\r\n id=\"phone_{{objectId}}\"\r\n [ngModel]=\"phoneNumber\"\r\n (ngModelChange)=\"setPhoneNumber($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [placeholder]=\"placeholder \"\r\n [textMask]=\"{mask: mask}\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"/>\r\n</div>\r\n\r\n<!-- Error messages for component -->\r\n<common-error-container\r\n [displayError]=\"!disabled && (controlDir?.touched || controlDir?.dirty) && controlDir?.errors\">\r\n <div *ngIf=\"controlDir?.errors?.required\">\r\n {{_defaultErrMsg.required}}\r\n </div>\r\n <div *ngIf=\"controlDir?.errors?.incompleteValue\">\r\n {{_defaultErrMsg.incompleteValue}}\r\n </div>\r\n</common-error-container>\r\n\r\n\r\n<ng-template #NoMask>\r\n <input class=\"form-control\"\r\n type=\"text\"\r\n name=\"phone_{{objectId}}\"\r\n id=\"phone_{{objectId}}\"\r\n [value]=\"phoneNumber\"\r\n (input)=\"setPhoneNumber($event.target.value)\"\r\n (blur)=\"onBlur($event)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\" />\r\n</ng-template>\r\n\r\n",
styles: [""]
}] }
];
/** @nocollapse */
PhoneNumberComponent.ctorParameters = () => [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
];
PhoneNumberComponent.propDecorators = {
displayMask: [{ type: Input }],
required: [{ type: Input }],
label: [{ type: Input }],
allowInternational: [{ type: Input }],
enablePlaceHolder: [{ type: Input }],
value: [{ type: Input }],
valueChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
PhoneNumberComponent.PhoneNumberRegEx;
/** @type {?} */
PhoneNumberComponent.prototype.displayMask;
/** @type {?} */
PhoneNumberComponent.prototype.required;
/** @type {?} */
PhoneNumberComponent.prototype.label;
/** @type {?} */
PhoneNumberComponent.prototype.allowInternational;
/** @type {?} */
PhoneNumberComponent.prototype.enablePlaceHolder;
/** @type {?} */
PhoneNumberComponent.prototype.valueChange;
/** @type {?} */
PhoneNumberComponent.prototype.phoneNumber;
/** @type {?} */
PhoneNumberComponent.prototype.mask;
/** @type {?} */
PhoneNumberComponent.prototype.placeholder;
/** @type {?} */
PhoneNumberComponent.prototype._defaultErrMsg;
/** @type {?} */
PhoneNumberComponent.prototype.controlDir;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvcGhvbmUtbnVtYmVyL3Bob25lLW51bWJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osUUFBUSxFQUNSLElBQUksRUFFTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBb0J6RSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsbUJBQW1COzs7O0lBb0MzRCxZQUF1QyxVQUFxQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQUQ2QixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBakNuRCxnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBVyxRQUFRLENBQUM7UUFFekIsdUJBQWtCLEdBQVksSUFBSSxDQUFDOztRQUduQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFhakMsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRSxnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7UUFNaEMsbUJBQWMsR0FBaUI7WUFDN0IsUUFBUSxFQUFFLEdBQUcsbUJBQW1CLGVBQWU7WUFDL0MsZUFBZSxFQUFFLEdBQUcsbUJBQW1CLCtCQUErQjtTQUN2RSxDQUFDO1FBSUEsSUFBSSxVQUFVLEVBQUU7WUFDZCxVQUFV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SCxRQUFRLEdBQUcsS0FBSztpQkFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7aUJBQ3RDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUztpQkFDNUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7aUJBQ3JDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2lCQUNoQixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7a0JBRWIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssV0FBVztZQUM3QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUVqRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUE1R00scUNBQWdCLEdBQUcsMENBQTBDLENBQUM7O1lBUnRFLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixtNENBQTRDOzthQUU3Qzs7OztZQXJCUSxTQUFTLHVCQTJESCxRQUFRLFlBQUksSUFBSTs7OzBCQWpDNUIsS0FBSzt1QkFDTCxLQUFLO29CQUNMLEtBQUs7aUNBRUwsS0FBSztnQ0FHTCxLQUFLO29CQUdMLEtBQUs7MEJBVUwsTUFBTTs7OztJQXJCUCxzQ0FBcUU7O0lBQ3JFLDJDQUFxQzs7SUFDckMsd0NBQW1DOztJQUNuQyxxQ0FBa0M7O0lBRWxDLGtEQUE0Qzs7SUFHNUMsaURBQTJDOztJQWEzQywyQ0FBeUU7O0lBRXpFLDJDQUFnQzs7SUFFaEMsb0NBQWlCOztJQUNqQiwyQ0FBMkI7O0lBRzNCLDhDQUdFOztJQUVVLDBDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3B0aW9uYWwsXHJcbiAgU2VsZixcclxuICBPbkluaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOVU1CRVIsIFNQQUNFIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21hc2suY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXJyb3JNZXNzYWdlLCBMYWJlbFJlcGxhY2VtZW50VGFnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Vycm9yLW1lc3NhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29udHJvbCB9IGZyb20gJy4uLy4uL21vZGVscy9hYnN0cmFjdC1mb3JtLWNvbnRyb2wnO1xyXG5cclxuLyoqXHJcbiAqIFBob25lTnVtYmVyQ29tcG9uZW50IGlzIGEgdXNlZCB0byBzaG93IHRoZSBQaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqICAgICAgICAgPGNvbW1vbi1waG9uZS1udW1iZXIgbmFtZT0ncGhvbmVOdW1iZXInXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09J2RhdGFTZXJ2aWNlLmZhY0FkbWluUGhvbmVOdW1iZXInXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+PC9jb21tb24tcGhvbmUtbnVtYmVyPlxyXG4gKiBAZXhwb3J0XHJcbiAqL1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29tbW9uLXBob25lLW51bWJlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bob25lLW51bWJlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgUGhvbmVOdW1iZXJDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db250cm9sIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgc3RhdGljIFBob25lTnVtYmVyUmVnRXggPSAnXlsyLTldezF9XFxcXGR7Mn1bXFxcXC1dP1xcXFxkezN9W1xcXFwtXT9cXFxcZHs0fSQnO1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlNYXNrOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnTW9iaWxlJztcclxuXHJcbiAgQElucHV0KCkgYWxsb3dJbnRlcm5hdGlvbmFsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgYWxsIHByb2plY3QgdXNpbmcgbGlicmFyeSByZW1vdmUgcGxhY2Vob2xkZXJzIC0tIFRlbXBvcmFyeSBzb2x1dGlvblxyXG4gIEBJbnB1dCgpIGVuYWJsZVBsYWNlSG9sZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gU2V0dGVyL2dldHRlciBmb3Igd2hlbiBub3QgdXNlZCBpbiBmb3JtIChleC4gZGF0YSBkaXNsYXllZCBidXQgbm90IGVkaXR0YWJsZSlcclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSggdmFsOiBzdHJpbmcgKSB7XHJcbiAgICBpZiAoIHZhbCAhPT0gdW5kZWZpbmVkICkge1xyXG4gICAgICB0aGlzLnBob25lTnVtYmVyID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5waG9uZU51bWJlcjtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgcHVibGljIHBob25lTnVtYmVyOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHVibGljIG1hc2s6IGFueTtcclxuICBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgLy8gQWJzdGFjdCB2YXJpYWJsZSBkZWZpbmVkXHJcbiAgX2RlZmF1bHRFcnJNc2c6IEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHJlcXVpcmVkOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBpcyByZXF1aXJlZC5gLFxyXG4gICAgaW5jb21wbGV0ZVZhbHVlOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQuYFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIGNvbnRyb2xEaXI6IE5nQ29udHJvbCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmIChjb250cm9sRGlyKSB7XHJcbiAgICAgIGNvbnRyb2xEaXIudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgY29uc3QgaW50ZXJuYXRpb25hbFByZWZpeCA9ICcrMSc7XHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5lbmFibGVQbGFjZUhvbGRlciA/ICcoNTU1KSA1NTUtNTU1NScgOiAnJztcclxuICAgIHRoaXMubWFzayA9IFsnKCcsIC9bMi05XS8sIE5VTUJFUiwgTlVNQkVSLCAnKScsIFNQQUNFLCBOVU1CRVIsIE5VTUJFUiwgTlVNQkVSLCAnLScsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIE5VTUJFUl07XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dJbnRlcm5hdGlvbmFsKSB7XHJcbiAgICAgIGlmICggdGhpcy5wbGFjZWhvbGRlciApIHtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gYCR7aW50ZXJuYXRpb25hbFByZWZpeH0gJHt0aGlzLnBsYWNlaG9sZGVyfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcHJlZml4QXJyYXlPZkNoYXIgPSBpbnRlcm5hdGlvbmFsUHJlZml4LnNwbGl0KCcnKTsgLy8gWycrJywgJzEnXVxyXG4gICAgICB0aGlzLm1hc2sgPSBbLi4ucHJlZml4QXJyYXlPZkNoYXIsIFNQQUNFLCAuLi50aGlzLm1hc2tdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlZ2lzdGVyIHNlbGYgdmFsaWRhdGlvblxyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb250cm9sRGlyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbFZhbGlkYXRvcnMgPSBbdGhpcy52YWxpZGF0ZVNlbGYuYmluZCh0aGlzKV07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbERpci5jb250cm9sLnZhbGlkYXRvcikge1xyXG4gICAgICAgICAgYWxsVmFsaWRhdG9ycy5wdXNoKHRoaXMuY29udHJvbERpci5jb250cm9sLnZhbGlkYXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udHJvbERpci5jb250cm9sLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9ycyk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sRGlyLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRQaG9uZU51bWJlcih2YWx1ZSkge1xyXG4gICAgdGhpcy5waG9uZU51bWJlciA9IHZhbHVlO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMucGhvbmVOdW1iZXIpO1xyXG4gICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCAkZXZlbnQgKSB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQoJGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICAodmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgLy8gcGhvbmVOdW1iZXIgaXMgd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGlzIGRpc3BsYXllZCB0byB1c2VyIGZvciB0aGlzXHJcbiAgICAgIC8vIGNvbXBvbmVudFxyXG4gICAgICB0aGlzLnBob25lTnVtYmVyID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRlU2VsZigpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waG9uZU51bWJlcjtcclxuICAgIGNvbnN0IHBob25lTGVuZ3RoID0gdGhpcy5hbGxvd0ludGVybmF0aW9uYWwgPyAxMSA6IDEwO1xyXG5cclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHZhbHVlXHJcbiAgICAgICAgLnJlcGxhY2UoL18vZywgJycpIC8vIHJlbW92ZSB1bmRlcmxpbmVzXHJcbiAgICAgICAgLnJlcGxhY2UoL1xccy9nLCAnJykgLy8gc3BhY2VzXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcK3wtL2csICcnKSAvLyArIG9yIC0gc3ltYm9sXHJcbiAgICAgICAgLnJlcGxhY2UoJygnLCAnJylcclxuICAgICAgICAucmVwbGFjZSgnKScsICcnKTtcclxuXHJcbiAgICAgIGNvbnN0IHZhbGlkID0gc3RyaXBwZWQubGVuZ3RoID09PSBwaG9uZUxlbmd0aDtcclxuICAgICAgcmV0dXJuIHZhbGlkID8gbnVsbCA6IHsgaW5jb21wbGV0ZVZhbHVlOiB0cnVlIH07XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==