truly-ui
Version:
Web Components for Desktop Applications.
118 lines (116 loc) • 19.1 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Component, Input, ViewChild, Output, EventEmitter, Optional, Self } from '@angular/core';
import { ValueAccessorBase } from '../input/core/value-accessor';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
export class TlCheckBox extends ValueAccessorBase {
set checked(value) {
this._checked = value;
this.value = value;
}
get checked() {
return this._checked;
}
constructor(ngControl) {
super();
this.ngControl = ngControl;
this.label = '';
this.tabindex = '0';
this.disabled = null;
this.color = 'basic';
this.indeterminate = false;
this.labelWidth = 'auto';
this.checkBox = new EventEmitter();
this.focusBox = new EventEmitter();
this._checked = false;
this.setControl();
}
ngOnInit() {
if (!this.label) {
throw new EvalError('The [label] property is required!');
}
}
get control() {
return this.ngControl?.control;
}
setControl() {
if (this.ngControl) {
this.ngControl.valueAccessor = this;
}
}
check(boolean) {
if (this.checkbox.nativeElement.indeterminate) {
this.checkbox.nativeElement.indeterminate = false;
this.value = true;
this.emitEvent();
return;
}
if (!this.disabled) {
this.value = !boolean;
this.emitEvent();
}
}
emitEvent() {
this.checkBox.emit(this.value);
}
focusCheckBox() {
this.focusBox.emit(this.value);
}
ngOnChanges(changes) {
if (changes['indeterminate']) {
this.checkbox.nativeElement.indeterminate = changes['indeterminate'].currentValue;
}
}
}
/** @nocollapse */ TlCheckBox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlCheckBox, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlCheckBox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlCheckBox, selector: "tl-checkbox", inputs: { checked: "checked", label: "label", tabindex: "tabindex", disabled: "disabled", color: "color", indeterminate: "indeterminate", labelWidth: "labelWidth" }, outputs: { checkBox: "checkBox", focusBox: "focusBox" }, viewQueries: [{ propertyName: "checkbox", first: true, predicate: ["checkbox"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div [class]=\"'check-container '+ color\">\n <input #checkbox\n class=\"ui-check-input\"\n type=\"checkbox\"\n #model=\"ngModel\"\n (change)=\"emitEvent()\"\n [checked]=\"value\"\n [attr.disabled]=\"disabled\"\n [tabindex]=\"tabindex\"\n [(ngModel)]=\"value\">\n <label class=\"cbx\" (click)=\"check(value)\">\n <span tabindex=\"-1\" (focus)=\"focusCheckBox()\" (keydown.space)=\"$event.preventDefault(); check(value)\">\n <svg width=\"12px\" height=\"10px\" viewBox=\"0 0 12 10\" *ngIf=\"!checkbox.indeterminate\">\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\n </svg>\n <svg width=\"12px\" height=\"10px\" *ngIf=\"checkbox.indeterminate\" style=\"stroke: none\">\n <rect width=\"16\" height=\"2\" y=\"4\" style=\"fill:white;\"></rect>\n </svg>\n </span>\n <span class=\"checkbox-label\" [style.width]=\"labelWidth\">{{label}}</span>\n </label>\n</div>\n", styles: [".cbx{margin:auto;-webkit-user-select:none;user-select:none;cursor:pointer}.cbx span{display:inline-block;vertical-align:middle;transform:translateZ(0)}.cbx span:first-child{position:relative;width:18px;height:18px;border-radius:3px;transform:scale(1);vertical-align:middle;border:1px solid #9098A9;transition:all .2s ease}.cbx span:first-child svg{position:absolute;top:3px;left:2px;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:16px;stroke-dashoffset:16px;transition:all .3s ease;transition-delay:.1s;transform:translateZ(0)}.cbx span:first-child svg:before{content:\"\";width:100%;height:100%;display:block;transform:scale(0);opacity:1;border-radius:50%}.ui-check-input{display:none}.ui-check-input:indeterminate+.cbx span:first-child{animation:wave .4s ease}.ui-check-input:indeterminate+.cbx span:first-child svg{stroke-dashoffset:0}.ui-check-input:indeterminate+.cbx span:first-child:before{transform:scale(3.5);opacity:0;transition:all .6s ease}.ui-check-input:checked+.cbx span:first-child{animation:wave .4s ease}.ui-check-input:checked+.cbx span:first-child svg{stroke-dashoffset:0}.ui-check-input:checked+.cbx span:first-child:before{transform:scale(3.5);opacity:0;transition:all .6s ease}@keyframes wave{50%{transform:scale(.9)}}.checkbox-label{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:12px;font-weight:400!important;position:relative;left:5px;margin:0!important;-webkit-user-select:none;user-select:none}.checkbox-label:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlCheckBox, decorators: [{
type: Component,
args: [{ selector: 'tl-checkbox', template: "<div [class]=\"'check-container '+ color\">\n <input #checkbox\n class=\"ui-check-input\"\n type=\"checkbox\"\n #model=\"ngModel\"\n (change)=\"emitEvent()\"\n [checked]=\"value\"\n [attr.disabled]=\"disabled\"\n [tabindex]=\"tabindex\"\n [(ngModel)]=\"value\">\n <label class=\"cbx\" (click)=\"check(value)\">\n <span tabindex=\"-1\" (focus)=\"focusCheckBox()\" (keydown.space)=\"$event.preventDefault(); check(value)\">\n <svg width=\"12px\" height=\"10px\" viewBox=\"0 0 12 10\" *ngIf=\"!checkbox.indeterminate\">\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\n </svg>\n <svg width=\"12px\" height=\"10px\" *ngIf=\"checkbox.indeterminate\" style=\"stroke: none\">\n <rect width=\"16\" height=\"2\" y=\"4\" style=\"fill:white;\"></rect>\n </svg>\n </span>\n <span class=\"checkbox-label\" [style.width]=\"labelWidth\">{{label}}</span>\n </label>\n</div>\n", styles: [".cbx{margin:auto;-webkit-user-select:none;user-select:none;cursor:pointer}.cbx span{display:inline-block;vertical-align:middle;transform:translateZ(0)}.cbx span:first-child{position:relative;width:18px;height:18px;border-radius:3px;transform:scale(1);vertical-align:middle;border:1px solid #9098A9;transition:all .2s ease}.cbx span:first-child svg{position:absolute;top:3px;left:2px;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:16px;stroke-dashoffset:16px;transition:all .3s ease;transition-delay:.1s;transform:translateZ(0)}.cbx span:first-child svg:before{content:\"\";width:100%;height:100%;display:block;transform:scale(0);opacity:1;border-radius:50%}.ui-check-input{display:none}.ui-check-input:indeterminate+.cbx span:first-child{animation:wave .4s ease}.ui-check-input:indeterminate+.cbx span:first-child svg{stroke-dashoffset:0}.ui-check-input:indeterminate+.cbx span:first-child:before{transform:scale(3.5);opacity:0;transition:all .6s ease}.ui-check-input:checked+.cbx span:first-child{animation:wave .4s ease}.ui-check-input:checked+.cbx span:first-child svg{stroke-dashoffset:0}.ui-check-input:checked+.cbx span:first-child:before{transform:scale(3.5);opacity:0;transition:all .6s ease}@keyframes wave{50%{transform:scale(.9)}}.checkbox-label{font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:12px;font-weight:400!important;position:relative;left:5px;margin:0!important;-webkit-user-select:none;user-select:none}.checkbox-label:hover{cursor:pointer}\n"] }]
}], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
type: Optional
}, {
type: Self
}] }]; }, propDecorators: { checked: [{
type: Input,
args: ['checked']
}], label: [{
type: Input
}], tabindex: [{
type: Input
}], disabled: [{
type: Input
}], color: [{
type: Input
}], indeterminate: [{
type: Input
}], labelWidth: [{
type: Input
}], checkbox: [{
type: ViewChild,
args: ['checkbox', { static: true }]
}], checkBox: [{
type: Output
}], focusBox: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9jaGVja2JveC9jaGVja2JveC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2NoZWNrYm94L2NoZWNrYm94Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQ3ZCLFFBQVEsRUFBRSxJQUFJLEVBQ3pDLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBT2pFLE1BQU0sT0FBTyxVQUFXLFNBQVEsaUJBQTBCO0lBRXhELElBQ0ksT0FBTyxDQUFFLEtBQWM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBc0JELFlBQXVDLFNBQW9CO1FBQ3pELEtBQUssRUFBRSxDQUFDO1FBRDZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFwQmxELFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxhQUFRLEdBQUcsR0FBRyxDQUFDO1FBRWYsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRWhCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXRCLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFJbkIsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVuRCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSXZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFHO1lBQ2pCLE1BQU0sSUFBSSxTQUFTLENBQUUsbUNBQW1DLENBQUUsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSyxJQUFJLENBQUMsU0FBUyxFQUFHO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUUsT0FBTztRQUNaLElBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFHO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFHO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELFdBQVcsQ0FBRSxPQUFzQjtRQUNqQyxJQUFLLE9BQU8sQ0FBRSxlQUFlLENBQUUsRUFBRztZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFFLGVBQWUsQ0FBRSxDQUFDLFlBQVksQ0FBQztTQUNyRjtJQUNILENBQUM7OzJIQTlFVSxVQUFVOytHQUFWLFVBQVUsa2JDbEN2QixpOUJBc0JBOzRGRFlhLFVBQVU7a0JBTHRCLFNBQVM7K0JBQ0UsYUFBYTs7MEJBb0NWLFFBQVE7OzBCQUFJLElBQUk7NENBN0J6QixPQUFPO3NCQURWLEtBQUs7dUJBQUMsU0FBUztnQkFVUCxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRW9DLFFBQVE7c0JBQWpELFNBQVM7dUJBQUUsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFNUIsUUFBUTtzQkFBakIsTUFBTTtnQkFFRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFNlbGZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbHVlQWNjZXNzb3JCYXNlIH0gZnJvbSAnLi4vaW5wdXQvY29yZS92YWx1ZS1hY2Nlc3Nvcic7XG5cbkBDb21wb25lbnQoIHtcbiAgc2VsZWN0b3I6ICd0bC1jaGVja2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL2NoZWNrYm94LnNjc3MnIF1cbn0gKVxuZXhwb3J0IGNsYXNzIFRsQ2hlY2tCb3ggZXh0ZW5kcyBWYWx1ZUFjY2Vzc29yQmFzZTxib29sZWFuPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoJ2NoZWNrZWQnKVxuICBzZXQgY2hlY2tlZCggdmFsdWU6IGJvb2xlYW4gKSB7XG4gICAgdGhpcy5fY2hlY2tlZCA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICB9XG5cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICBASW5wdXQoKSB0YWJpbmRleCA9ICcwJztcblxuICBASW5wdXQoKSBkaXNhYmxlZCA9IG51bGw7XG5cbiAgQElucHV0KCkgY29sb3IgPSAnYmFzaWMnO1xuXG4gIEBJbnB1dCgpIGluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYWJlbFdpZHRoID0gJ2F1dG8nO1xuXG4gIEBWaWV3Q2hpbGQoICdjaGVja2JveCcsIHtzdGF0aWM6IHRydWV9ICApIGNoZWNrYm94O1xuXG4gIEBPdXRwdXQoKSBjaGVja0JveDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGZvY3VzQm94OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcml2YXRlIF9jaGVja2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2V0Q29udHJvbCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCAhdGhpcy5sYWJlbCApIHtcbiAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoICdUaGUgW2xhYmVsXSBwcm9wZXJ0eSBpcyByZXF1aXJlZCEnICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbnRyb2woKSB7XG4gICAgcmV0dXJuIHRoaXMubmdDb250cm9sPy5jb250cm9sO1xuICB9XG5cbiAgc2V0Q29udHJvbCgpIHtcbiAgICBpZiAoIHRoaXMubmdDb250cm9sICkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soIGJvb2xlYW4gKSB7XG4gICAgaWYgKCB0aGlzLmNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSApIHtcbiAgICAgIHRoaXMuY2hlY2tib3gubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbHVlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICggIXRoaXMuZGlzYWJsZWQgKSB7XG4gICAgICB0aGlzLnZhbHVlID0gIWJvb2xlYW47XG4gICAgICB0aGlzLmVtaXRFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGVtaXRFdmVudCgpIHtcbiAgICB0aGlzLmNoZWNrQm94LmVtaXQoIHRoaXMudmFsdWUgKTtcbiAgfVxuXG4gIGZvY3VzQ2hlY2tCb3goKSB7XG4gICAgdGhpcy5mb2N1c0JveC5lbWl0KCB0aGlzLnZhbHVlICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyggY2hhbmdlczogU2ltcGxlQ2hhbmdlcyApIHtcbiAgICBpZiAoIGNoYW5nZXNbICdpbmRldGVybWluYXRlJyBdICkge1xuICAgICAgdGhpcy5jaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSBjaGFuZ2VzWyAnaW5kZXRlcm1pbmF0ZScgXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbn1cblxuIiwiPGRpdiBbY2xhc3NdPVwiJ2NoZWNrLWNvbnRhaW5lciAnKyBjb2xvclwiPlxuICA8aW5wdXQgI2NoZWNrYm94XG4gICAgICAgICBjbGFzcz1cInVpLWNoZWNrLWlucHV0XCJcbiAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgIChjaGFuZ2UpPVwiZW1pdEV2ZW50KClcIlxuICAgICAgICAgW2NoZWNrZWRdPVwidmFsdWVcIlxuICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIj5cbiAgPGxhYmVsIGNsYXNzPVwiY2J4XCIgKGNsaWNrKT1cImNoZWNrKHZhbHVlKVwiPlxuICAgIDxzcGFuIHRhYmluZGV4PVwiLTFcIiAoZm9jdXMpPVwiZm9jdXNDaGVja0JveCgpXCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNoZWNrKHZhbHVlKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjEycHhcIiBoZWlnaHQ9XCIxMHB4XCIgdmlld0JveD1cIjAgMCAxMiAxMFwiICpuZ0lmPVwiIWNoZWNrYm94LmluZGV0ZXJtaW5hdGVcIj5cbiAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjEuNSA2IDQuNSA5IDEwLjUgMVwiPjwvcG9seWxpbmU+XG4gICAgICA8L3N2Zz5cbiAgICAgIDxzdmcgd2lkdGg9XCIxMnB4XCIgaGVpZ2h0PVwiMTBweFwiICpuZ0lmPVwiY2hlY2tib3guaW5kZXRlcm1pbmF0ZVwiIHN0eWxlPVwic3Ryb2tlOiBub25lXCI+XG4gICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIyXCIgeT1cIjRcIiBzdHlsZT1cImZpbGw6d2hpdGU7XCI+PC9yZWN0PlxuICAgICAgPC9zdmc+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBbc3R5bGUud2lkdGhdPVwibGFiZWxXaWR0aFwiPnt7bGFiZWx9fTwvc3Bhbj5cbiAgPC9sYWJlbD5cbjwvZGl2PlxuIl19