@crediblefinance/credible-ui
Version:
Credible's standard UI library
152 lines • 28.8 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/clipboard";
import * as i2 from "../cf-alert/cf-alert.service";
import * as i3 from "@angular/common";
import * as i4 from "../directives/precision-directive";
import * as i5 from "@angular/forms";
import * as i6 from "@angular/material/tooltip";
export class CfInputComponent {
clipboardService;
cfAlertService;
label;
showLabel = true;
type = 'text';
class;
id;
name;
placeholder = '';
showPlaceholder = false;
value;
readonly = false;
copy = false;
showRequiredSign = false;
trim = false;
trimLength = 22;
precision = 8;
precisionType = 'decimal';
maxLength = null;
minLength = null;
tooltip = '';
valueChanged = new EventEmitter();
showPassword = false;
trimmedValue = '';
formGroup;
control;
theme = 'dark';
// HTML helpers
objectFn = Object;
constructor(clipboardService, cfAlertService) {
this.clipboardService = clipboardService;
this.cfAlertService = cfAlertService;
if (!this.control && !this.formGroup) {
this.formGroup = new FormGroup({});
this.control = new FormControl('');
}
}
ngOnChanges(changes) {
// console.log('ngOnChanges', changes);
if (changes.value) {
const currentValue = changes.value.currentValue;
// console.log('currentValue', currentValue);
if (this.trim && currentValue.length > this.trimLength)
this.trimmedValue = currentValue.slice(0, this.trimLength) + '...';
else
this.trimmedValue = currentValue;
this.control.setValue(currentValue);
}
}
onPaste(event) {
const clipboardData = event.clipboardData;
const pastedText = clipboardData?.getData('text');
if (!pastedText)
return;
// console.log('onPaste', pastedText);
// console.log('this.type', this.type);
if (this.type === 'number') {
if (Number(pastedText))
this.valueChanged.emit(pastedText);
else {
this.trimmedValue = '';
this.value = '';
}
}
else {
this.valueChanged.emit(pastedText);
}
event.preventDefault();
event.stopPropagation();
}
ngOnInit() {
// console.log(this.formGroup);
}
keyUpHandler($event) {
// console.log('keyUpHandler', this.label, $event.target.value);
if (this.trim && $event.target.value.length > this.trimLength)
this.trimmedValue = $event.target.value.slice(0, this.trimLength) + '...';
else
this.trimmedValue = $event.target.value;
this.valueChanged.emit($event.target.value);
}
copyContent() {
this.clipboardService.copy(this.control.value);
this.cfAlertService.showSuccess(this.label + ' copied!');
}
get classes() {
return this.theme === 'dark' ? 'dark' : '';
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfInputComponent, deps: [{ token: i1.Clipboard }, { token: i2.CfAlertService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: CfInputComponent, selector: "cf-input", inputs: { label: "label", showLabel: "showLabel", type: "type", class: "class", id: "id", name: "name", placeholder: "placeholder", showPlaceholder: "showPlaceholder", value: "value", readonly: "readonly", copy: "copy", showRequiredSign: "showRequiredSign", trim: "trim", trimLength: "trimLength", precision: "precision", precisionType: "precisionType", maxLength: "maxLength", minLength: "minLength", tooltip: "tooltip", formGroup: "formGroup", control: "control", theme: "theme" }, outputs: { valueChanged: "valueChanged" }, usesOnChanges: true, ngImport: i0, template: "<div\n [ngClass]=\"[control.errors && control.invalid && control.touched ? 'cf-input mb-0' : 'cf-input', theme ]\">\n <div *ngIf=\"showLabel\">\n <label [ngClass]=\"theme=== 'dark' ? 'white-label':'label'\">{{ label }}\n <i class=\"fa-solid fa-circle-info ms-1\" *ngIf=\"tooltip\" [matTooltip]=\"tooltip\"></i></label>\n <sup style=\"color: red\" *ngIf=\"showRequiredSign\">*</sup>\n </div>\n <div [class.error]=\"control.invalid && control.touched\" class=\"input-holder\" [formGroup]=\"formGroup\">\n <span [class]=\"class\" *ngIf=\"readonly\">\n <span *ngIf=\"showPlaceholder\" style=\"color: gray\">\n {{ placeholder }}\n </span>\n <span *ngIf=\"!showPlaceholder\">\n {{ trimmedValue }}\n </span>\n </span>\n\n <input [type]=\"type\" [name]=\"name\" [id]=\"id\" [placeholder]=\"placeholder\" class=\"value-span\"\n [value]=\"trimmedValue\" [formControl]=\"control\" [maxlength]=\"maxLength\" [minLength]=\"minLength\"\n (keyup)=\"keyUpHandler($event)\" *ngIf=\"!readonly && type !== 'password'\" PrecisionDirective\n [precision]=\"precision\" [precisionType]=\"precisionType\" (paste)=\"onPaste($event)\" />\n\n <input [type]=\"showPassword ? 'text' : 'password'\" [name]=\"name\" [id]=\"id\" [placeholder]=\"placeholder\"\n class=\"value-span\" [value]=\"trimmedValue\" [formControl]=\"control\" [maxlength]=\"maxLength\"\n [minLength]=\"minLength\" (keyup)=\"keyUpHandler($event)\" *ngIf=\"!readonly && type === 'password'\" />\n\n <i class=\"fa-solid fa-copy\" [matTooltip]=\"'Copy ' + label\" *ngIf=\"copy\" (click)=\"copyContent()\"></i>\n\n <span *ngIf=\"type === 'password'\" style=\"cursor: pointer\" (click)=\"showPassword = !showPassword\">\n <i class=\"fa-solid fa-eye\" *ngIf=\"showPassword\"></i>\n <i class=\"fa-solid fa-eye-slash\" *ngIf=\"!showPassword\"></i>\n </span>\n </div>\n <span class=\"text-danger\" *ngIf=\"control.errors && control.touched\">\n {{ control.errors[objectFn.keys(control.errors)[0]] }}\n </span>\n</div>", styles: [".cf-input{padding:0;height:max-content;margin-left:auto;margin-right:auto;margin-bottom:0rem}.cf-input .fa-circle-info{color:gray;font-size:.8rem}.cf-input .fa-circle-info:hover{cursor:pointer;color:#000}.cf-input .error{border:.5px solid #dc3545!important}.cf-input .input-holder{border-radius:9px;padding:1rem;display:grid;grid-template-columns:1fr auto;column-gap:15px}.cf-input .input-holder span{border:none;width:100%;display:block;overflow-x:auto}.cf-input .input-holder input{border:none;width:100%;font-size:1rem}.cf-input .input-holder .fa-copy{margin-left:1rem;cursor:pointer;align-self:center}.cf-input .label,.cf-input .white-label{font-weight:700;font-size:.8rem;text-align:left;display:flex;margin-bottom:3px}.cf-input .white-label{color:#fff}@media only screen and (max-width: 500px){.input,.label,.cf-input .white-label{font-size:1rem!important}.cf-input{margin-bottom:1.5rem!important}.cf-input .label,.cf-input .white-label,.cf-input .input-holder .input,.cf-input .input-holder .span,.cf-input .input-holder .fa-copy{font-size:1rem!important}}button:focus,input:focus,select:focus,textarea:focus{outline:none}input:disabled{background:transparent!important}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px white inset!important}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield}.cf-input.dark .input-holder{background:#24252b;border:.5px solid grey}.cf-input.dark .input-holder input{background:#24252b;color:#fff}.cf-input.dark .input-holder .fa-copy{color:gray}.cf-input.dark .input-holder .fa-copy:hover{color:#d3d3d3}.cf-input.light .input-holder{background:white;border:.1px solid lightgrey}.cf-input.light .input-holder input{background:white;color:#000}.cf-input.light .input-holder .fa-copy{color:gray}.cf-input.light .input-holder .fa-copy:hover{color:#000}input,input:before,input:after{-webkit-user-select:initial;user-select:initial}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.PrecisionDirective, selector: "[PrecisionDirective]", inputs: ["precision", "type", "precisionType"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfInputComponent, decorators: [{
type: Component,
args: [{ selector: 'cf-input', template: "<div\n [ngClass]=\"[control.errors && control.invalid && control.touched ? 'cf-input mb-0' : 'cf-input', theme ]\">\n <div *ngIf=\"showLabel\">\n <label [ngClass]=\"theme=== 'dark' ? 'white-label':'label'\">{{ label }}\n <i class=\"fa-solid fa-circle-info ms-1\" *ngIf=\"tooltip\" [matTooltip]=\"tooltip\"></i></label>\n <sup style=\"color: red\" *ngIf=\"showRequiredSign\">*</sup>\n </div>\n <div [class.error]=\"control.invalid && control.touched\" class=\"input-holder\" [formGroup]=\"formGroup\">\n <span [class]=\"class\" *ngIf=\"readonly\">\n <span *ngIf=\"showPlaceholder\" style=\"color: gray\">\n {{ placeholder }}\n </span>\n <span *ngIf=\"!showPlaceholder\">\n {{ trimmedValue }}\n </span>\n </span>\n\n <input [type]=\"type\" [name]=\"name\" [id]=\"id\" [placeholder]=\"placeholder\" class=\"value-span\"\n [value]=\"trimmedValue\" [formControl]=\"control\" [maxlength]=\"maxLength\" [minLength]=\"minLength\"\n (keyup)=\"keyUpHandler($event)\" *ngIf=\"!readonly && type !== 'password'\" PrecisionDirective\n [precision]=\"precision\" [precisionType]=\"precisionType\" (paste)=\"onPaste($event)\" />\n\n <input [type]=\"showPassword ? 'text' : 'password'\" [name]=\"name\" [id]=\"id\" [placeholder]=\"placeholder\"\n class=\"value-span\" [value]=\"trimmedValue\" [formControl]=\"control\" [maxlength]=\"maxLength\"\n [minLength]=\"minLength\" (keyup)=\"keyUpHandler($event)\" *ngIf=\"!readonly && type === 'password'\" />\n\n <i class=\"fa-solid fa-copy\" [matTooltip]=\"'Copy ' + label\" *ngIf=\"copy\" (click)=\"copyContent()\"></i>\n\n <span *ngIf=\"type === 'password'\" style=\"cursor: pointer\" (click)=\"showPassword = !showPassword\">\n <i class=\"fa-solid fa-eye\" *ngIf=\"showPassword\"></i>\n <i class=\"fa-solid fa-eye-slash\" *ngIf=\"!showPassword\"></i>\n </span>\n </div>\n <span class=\"text-danger\" *ngIf=\"control.errors && control.touched\">\n {{ control.errors[objectFn.keys(control.errors)[0]] }}\n </span>\n</div>", styles: [".cf-input{padding:0;height:max-content;margin-left:auto;margin-right:auto;margin-bottom:0rem}.cf-input .fa-circle-info{color:gray;font-size:.8rem}.cf-input .fa-circle-info:hover{cursor:pointer;color:#000}.cf-input .error{border:.5px solid #dc3545!important}.cf-input .input-holder{border-radius:9px;padding:1rem;display:grid;grid-template-columns:1fr auto;column-gap:15px}.cf-input .input-holder span{border:none;width:100%;display:block;overflow-x:auto}.cf-input .input-holder input{border:none;width:100%;font-size:1rem}.cf-input .input-holder .fa-copy{margin-left:1rem;cursor:pointer;align-self:center}.cf-input .label,.cf-input .white-label{font-weight:700;font-size:.8rem;text-align:left;display:flex;margin-bottom:3px}.cf-input .white-label{color:#fff}@media only screen and (max-width: 500px){.input,.label,.cf-input .white-label{font-size:1rem!important}.cf-input{margin-bottom:1.5rem!important}.cf-input .label,.cf-input .white-label,.cf-input .input-holder .input,.cf-input .input-holder .span,.cf-input .input-holder .fa-copy{font-size:1rem!important}}button:focus,input:focus,select:focus,textarea:focus{outline:none}input:disabled{background:transparent!important}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px white inset!important}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield}.cf-input.dark .input-holder{background:#24252b;border:.5px solid grey}.cf-input.dark .input-holder input{background:#24252b;color:#fff}.cf-input.dark .input-holder .fa-copy{color:gray}.cf-input.dark .input-holder .fa-copy:hover{color:#d3d3d3}.cf-input.light .input-holder{background:white;border:.1px solid lightgrey}.cf-input.light .input-holder input{background:white;color:#000}.cf-input.light .input-holder .fa-copy{color:gray}.cf-input.light .input-holder .fa-copy:hover{color:#000}input,input:before,input:after{-webkit-user-select:initial;user-select:initial}\n"] }]
}], ctorParameters: () => [{ type: i1.Clipboard }, { type: i2.CfAlertService }], propDecorators: { label: [{
type: Input
}], showLabel: [{
type: Input
}], type: [{
type: Input
}], class: [{
type: Input
}], id: [{
type: Input
}], name: [{
type: Input
}], placeholder: [{
type: Input
}], showPlaceholder: [{
type: Input
}], value: [{
type: Input
}], readonly: [{
type: Input
}], copy: [{
type: Input
}], showRequiredSign: [{
type: Input
}], trim: [{
type: Input
}], trimLength: [{
type: Input
}], precision: [{
type: Input
}], precisionType: [{
type: Input
}], maxLength: [{
type: Input
}], minLength: [{
type: Input
}], tooltip: [{
type: Input
}], valueChanged: [{
type: Output
}], formGroup: [{
type: Input
}], control: [{
type: Input
}], theme: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2YtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JlZGlibGUtdWkvc3JjL2xpYi9jZi1pbnB1dC9jZi1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVkaWJsZS11aS9zcmMvbGliL2NmLWlucHV0L2NmLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQVUsS0FBSyxFQUE0QixNQUFNLEVBQUUsWUFBWSxFQUMzRSxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsV0FBVyxFQUFFLFNBQVMsRUFDekIsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFPeEIsTUFBTSxPQUFPLGdCQUFnQjtJQXlDTDtJQUFxQztJQXhDaEQsS0FBSyxDQUFVO0lBQ2YsU0FBUyxHQUFZLElBQUksQ0FBQztJQUMxQixJQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLEtBQUssQ0FBVTtJQUNmLEVBQUUsQ0FBbUI7SUFDckIsSUFBSSxDQUFVO0lBQ2QsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLEtBQUssQ0FBVTtJQUNmLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFMUIsSUFBSSxHQUFZLEtBQUssQ0FBQztJQUV0QixnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFFbEMsSUFBSSxHQUFZLEtBQUssQ0FBQztJQUN0QixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBRXhCLFNBQVMsR0FBVyxDQUFDLENBQUM7SUFDdEIsYUFBYSxHQUFXLFNBQVMsQ0FBQztJQUVsQyxTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxTQUFTLEdBQWtCLElBQUksQ0FBQztJQUVoQyxPQUFPLEdBQVcsRUFBRSxDQUFDO0lBRXBCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFD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TyxDQUFDLEtBQWUsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUdELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzlDLENBQUM7dUdBdkhRLGdCQUFnQjsyRkFBaEIsZ0JBQWdCLG9sQkNiN0IsMnBFQW9DTTs7MkZEdkJPLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDSSxVQUFVOzJHQUtYLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQU1FLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xpcGJvYXJkIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NsaXBib2FyZCc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLCBGb3JtR3JvdXBcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2ZBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9jZi1hbGVydC9jZi1hbGVydC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY2YtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jZi1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2YtaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDZklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3dMYWJlbDogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgdHlwZTogc3RyaW5nID0gJ3RleHQnO1xuICAgIEBJbnB1dCgpIGNsYXNzPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHNob3dQbGFjZWhvbGRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHZhbHVlPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBjb3B5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBzaG93UmVxdWlyZWRTaWduOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSB0cmltOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgdHJpbUxlbmd0aDogbnVtYmVyID0gMjI7XG5cbiAgICBASW5wdXQoKSBwcmVjaXNpb246IG51bWJlciA9IDg7XG4gICAgQElucHV0KCkgcHJlY2lzaW9uVHlwZTogc3RyaW5nID0gJ2RlY2ltYWwnO1xuXG4gICAgQElucHV0KCkgbWF4TGVuZ3RoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgdG9vbHRpcDogc3RyaW5nID0gJyc7XG5cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgc2hvd1Bhc3N3b3JkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICB0cmltbWVkVmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gICAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICAgIEBJbnB1dCgpIGNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICAgIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmcgPSAnZGFyaydcblxuICAgIC8vIEhUTUwgaGVscGVyc1xuICAgIG9iamVjdEZuID0gT2JqZWN0O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmQsIHByaXZhdGUgY2ZBbGVydFNlcnZpY2U6IENmQWxlcnRTZXJ2aWNlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250cm9sICYmICF0aGlzLmZvcm1Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCduZ09uQ2hhbmdlcycsIGNoYW5nZXMpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzLnZhbHVlLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2N1cnJlbnRWYWx1ZScsIGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRyaW0gJiYgY3VycmVudFZhbHVlLmxlbmd0aCA+IHRoaXMudHJpbUxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLnRyaW1tZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zbGljZSgwLCB0aGlzLnRyaW1MZW5ndGgpICsgJy4uLic7XG5cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnRyaW1tZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhOiBEYXRhVHJhbnNmZXIgfCBudWxsID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKTtcblxuICAgICAgICBpZiAoIXBhc3RlZFRleHQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uUGFzdGUnLCBwYXN0ZWRUZXh0KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudHlwZScsIHRoaXMudHlwZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmIChOdW1iZXIocGFzdGVkVGV4dCkpXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZWQuZW1pdChwYXN0ZWRUZXh0KTtcblxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmltbWVkVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkLmVtaXQocGFzdGVkVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5mb3JtR3JvdXApO1xuICAgIH1cblxuICAgIGtleVVwSGFuZGxlcigkZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygna2V5VXBIYW5kbGVyJywgdGhpcy5sYWJlbCwgJGV2ZW50LnRhcmdldC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHJpbSAmJiAkZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA+IHRoaXMudHJpbUxlbmd0aClcbiAgICAgICAgICAgIHRoaXMudHJpbW1lZFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZS5zbGljZSgwLCB0aGlzLnRyaW1MZW5ndGgpICsgJy4uLic7XG5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy50cmltbWVkVmFsdWUgPSAkZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkLmVtaXQoJGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxuXG4gICAgY29weUNvbnRlbnQoKSB7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5KHRoaXMuY29udHJvbC52YWx1ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHRoaXMuY2ZBbGVydFNlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5sYWJlbCArICcgY29waWVkIScpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldCBjbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW1lID09PSAnZGFyaycgPyAnZGFyaycgOiAnJ1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBbbmdDbGFzc109XCJbY29udHJvbC5lcnJvcnMgJiYgY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZCA/ICdjZi1pbnB1dCBtYi0wJyA6ICdjZi1pbnB1dCcsIHRoZW1lIF1cIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAgICAgIDxsYWJlbCBbbmdDbGFzc109XCJ0aGVtZT09PSAnZGFyaycgPyAnd2hpdGUtbGFiZWwnOidsYWJlbCdcIj57eyBsYWJlbCB9fVxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jaXJjbGUtaW5mbyBtcy0xXCIgKm5nSWY9XCJ0b29sdGlwXCIgW21hdFRvb2x0aXBdPVwidG9vbHRpcFwiPjwvaT48L2xhYmVsPlxuICAgICAgICA8c3VwIHN0eWxlPVwiY29sb3I6IHJlZFwiICpuZ0lmPVwic2hvd1JlcXVpcmVkU2lnblwiPio8L3N1cD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IFtjbGFzcy5lcnJvcl09XCJjb250cm9sLmludmFsaWQgJiYgY29udHJvbC50b3VjaGVkXCIgY2xhc3M9XCJpbnB1dC1ob2xkZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xhc3NcIiAqbmdJZj1cInJlYWRvbmx5XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dQbGFjZWhvbGRlclwiIHN0eWxlPVwiY29sb3I6IGdyYXlcIj5cbiAgICAgICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2hvd1BsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAge3sgdHJpbW1lZFZhbHVlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8aW5wdXQgW3R5cGVdPVwidHlwZVwiIFtuYW1lXT1cIm5hbWVcIiBbaWRdPVwiaWRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBjbGFzcz1cInZhbHVlLXNwYW5cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInRyaW1tZWRWYWx1ZVwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgW21heGxlbmd0aF09XCJtYXhMZW5ndGhcIiBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gICAgICAgICAgICAoa2V5dXApPVwia2V5VXBIYW5kbGVyKCRldmVudClcIiAqbmdJZj1cIiFyZWFkb25seSAmJiB0eXBlICE9PSAncGFzc3dvcmQnXCIgUHJlY2lzaW9uRGlyZWN0aXZlXG4gICAgICAgICAgICBbcHJlY2lzaW9uXT1cInByZWNpc2lvblwiIFtwcmVjaXNpb25UeXBlXT1cInByZWNpc2lvblR5cGVcIiAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCIgLz5cblxuICAgICAgICA8aW5wdXQgW3R5cGVdPVwic2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiIFtuYW1lXT1cIm5hbWVcIiBbaWRdPVwiaWRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJ2YWx1ZS1zcGFuXCIgW3ZhbHVlXT1cInRyaW1tZWRWYWx1ZVwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgW21heGxlbmd0aF09XCJtYXhMZW5ndGhcIlxuICAgICAgICAgICAgW21pbkxlbmd0aF09XCJtaW5MZW5ndGhcIiAoa2V5dXApPVwia2V5VXBIYW5kbGVyKCRldmVudClcIiAqbmdJZj1cIiFyZWFkb25seSAmJiB0eXBlID09PSAncGFzc3dvcmQnXCIgLz5cblxuICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNvcHlcIiBbbWF0VG9vbHRpcF09XCInQ29weSAnICsgbGFiZWxcIiAqbmdJZj1cImNvcHlcIiAoY2xpY2spPVwiY29weUNvbnRlbnQoKVwiPjwvaT5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cInR5cGUgPT09ICdwYXNzd29yZCdcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiIChjbGljayk9XCJzaG93UGFzc3dvcmQgPSAhc2hvd1Bhc3N3b3JkXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWV5ZVwiICpuZ0lmPVwic2hvd1Bhc3N3b3JkXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1leWUtc2xhc2hcIiAqbmdJZj1cIiFzaG93UGFzc3dvcmRcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjb250cm9sLmVycm9ycyAmJiBjb250cm9sLnRvdWNoZWRcIj5cbiAgICAgICAge3sgY29udHJvbC5lcnJvcnNbb2JqZWN0Rm4ua2V5cyhjb250cm9sLmVycm9ycylbMF1dIH19XG4gICAgPC9zcGFuPlxuPC9kaXY+Il19