UNPKG

@junte/ui

Version:

Quality Angular UI components kit

245 lines 29.7 kB
var SwitcherComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, ContentChildren, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, QueryList } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NGXLogger } from 'ngx-logger'; import { DeviceService } from '../../layout/responsive/device.service'; import { PropertyApi } from '../../core/decorators/api'; import { Feature } from '../../core/enums/feature'; import { Orientation } from '../../core/enums/orientation'; import { UI } from '../../core/enums/ui'; import { Width } from '../../core/enums/width'; import { isEqual } from '../../core/utils/equal'; import { BreakpointService } from '../../layout/responsive/breakpoint.service'; import { SelectMode } from '../select/enums'; import { SwitcherOptionComponent } from './switcher-option.component'; let SwitcherComponent = SwitcherComponent_1 = class SwitcherComponent { constructor(logger, breakpoint, device) { this.logger = logger; this.breakpoint = breakpoint; this.device = device; this.host = 'jnt-switcher-host'; this.ui = UI; this._features = []; this._orientation = Orientation.horizontal; this._width = Width.default; this.disabled = false; this._mode = SelectMode.single; this.capacity = 3; this.loading = false; this.updated = new EventEmitter(); this.selected = []; this.version = 0; this.onChange = () => this.logger.error('value accessor is not registered'); this.onTouched = () => this.logger.error('value accessor is not registered'); this.registerOnChange = fn => this.onChange = fn; this.registerOnTouched = fn => this.onTouched = fn; this.onBlur = () => this.onTouched(); } set orientation(type) { this._orientation = type || Orientation.horizontal; } get orientation() { return this._orientation; } set mode(mode) { this._mode = mode || SelectMode.single; } get mode() { return this._mode; } set features(features) { this._features = features || []; } get features() { return this._features; } set width(width) { this._width = width || Width.default; } writeValue(value) { if (this.mode === SelectMode.multiple && !value) { throw new Error('Wrong value form multiple select mode'); } this.selected = (this.mode === SelectMode.single ? (!!value ? [value] : []) : value); } setDisabledState(disabled) { this.disabled = disabled; } select(value) { switch (this.mode) { case SelectMode.single: const current = this.selected.length > 0 ? this.selected[0] : null; if (current !== null) { const same = !!this.keyField ? current[this.keyField] === value[this.keyField] : isEqual(current, value); if (same && !this.features.includes(Feature.allowEmpty)) { return; } this.selected = same || value === null ? [] : [value]; this.onChange(same ? null : value); this.updated.emit(same ? null : value); } else { this.selected = value === null ? [] : [value]; this.onChange(value); this.updated.emit(value); } this.version++; break; case SelectMode.multiple: const index = !!this.keyField ? this.selected.indexOf(value[this.keyField]) : this.selected.findIndex(e => isEqual(e, value)); if (index !== -1) { this.selected.splice(index, 1); } else { this.selected.push(value); } this.version++; this.onChange(this.selected); this.updated.emit(this.selected); break; } } selectAll() { this.options.forEach(o => this.selected.push(o.value)); this.version++; this.onChange(this.selected); this.updated.emit(this.selected); } }; SwitcherComponent.ctorParameters = () => [ { type: NGXLogger }, { type: BreakpointService }, { type: DeviceService } ]; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], SwitcherComponent.prototype, "host", void 0); __decorate([ HostBinding('attr.data-width'), __metadata("design:type", String) ], SwitcherComponent.prototype, "_width", void 0); __decorate([ PropertyApi({ description: 'Switcher orientation ', path: 'ui.orientation', default: Orientation.horizontal, options: [Orientation.horizontal, Orientation.vertical] }), HostBinding('attr.data-orientation'), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SwitcherComponent.prototype, "orientation", null); __decorate([ PropertyApi({ description: 'Set disabled state', type: 'boolean', default: 'false', }), HostBinding('attr.data-disabled'), Input(), __metadata("design:type", Object) ], SwitcherComponent.prototype, "disabled", void 0); __decorate([ PropertyApi({ description: 'Select key field', type: 'string', default: 'key' }), Input(), __metadata("design:type", String) ], SwitcherComponent.prototype, "keyField", void 0); __decorate([ HostBinding('attr.data-mode'), __metadata("design:type", String) ], SwitcherComponent.prototype, "_mode", void 0); __decorate([ PropertyApi({ description: 'Switcher mode', path: 'ui.select.mode', default: SelectMode.single, options: [SelectMode.single, SelectMode.multiple] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SwitcherComponent.prototype, "mode", null); __decorate([ PropertyApi({ description: 'Add badge with the number of selected items; Select all item in switcher; Allow empty value in switcher; Adapted on mobile; Display marks', path: 'ui.feature', default: '[ui.feature.adapted]', options: [Feature.badge, Feature.selectAll, Feature.allowEmpty, Feature.adapted, Feature.marks] }), Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], SwitcherComponent.prototype, "features", null); __decorate([ PropertyApi({ description: 'Display skeleton', type: 'count: number', }), Input(), __metadata("design:type", Object) ], SwitcherComponent.prototype, "capacity", void 0); __decorate([ PropertyApi({ description: 'Loading', type: 'boolean', default: 'false', }), Input(), __metadata("design:type", Object) ], SwitcherComponent.prototype, "loading", void 0); __decorate([ PropertyApi({ description: 'Input width', path: 'ui.width', default: Width.default, options: [Width.default, Width.fluid] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SwitcherComponent.prototype, "width", null); __decorate([ PropertyApi({ description: 'Selected value', type: '(selected)=' }), Output('selected'), __metadata("design:type", Object) ], SwitcherComponent.prototype, "updated", void 0); __decorate([ ContentChildren(SwitcherOptionComponent), __metadata("design:type", QueryList) ], SwitcherComponent.prototype, "options", void 0); __decorate([ HostListener('blur'), __metadata("design:type", Object) ], SwitcherComponent.prototype, "onBlur", void 0); SwitcherComponent = SwitcherComponent_1 = __decorate([ Component({ selector: 'jnt-switcher', template: "<ng-template #optionDefaultTemplate\n let-icon=\"option.icon\"\n let-dot=\"option.dot\"\n let-badge=\"option.badge\"\n let-label=\"option.label\"\n let-selected=\"selected\">\n <jnt-dot child-of=\"jnt-switcher-host\" *ngIf=\"dot\" [color]=\"dot.color\"></jnt-dot>\n <jnt-icon child-of=\"jnt-switcher-host\" *ngIf=\"icon\" data-icon [icon]=\"icon\"></jnt-icon>\n\n <div child-of=\"jnt-switcher-host\" data-switch *ngIf=\"!!features && features.includes(ui.feature.marks)\"\n [attr.data-single]=\"mode === ui.select.mode.single\">\n <span child-of=\"jnt-switcher-host\" data-indicator *ngIf=\"selected\"></span>\n </div>\n\n <jnt-stack child-of=\"jnt-switcher-host\" *ngIf=\"label || badge\" [orientation]=\"ui.orientation.horizontal\"\n [justify]=\"ui.justify.between\"\n [align]=\"ui.align.center\"\n [gutter]=\"ui.gutter.small\"\n data-title>\n <div child-of=\"jnt-switcher-host\" data-label *ngIf=\"label\">{{label}}</div>\n <jnt-badge child-of=\"jnt-switcher-host\" *ngIf=\"badge\"\n [position]=\"ui.position.inline\"\n [color]=\"badge.color\"\n [text]=\"badge.text\"\n [value]=\"badge.value\"\n [overflow]=\"badge.overflow\">\n </jnt-badge>\n </jnt-stack>\n</ng-template>\n\n<div child-of=\"jnt-switcher-host\" data-switcher>\n <div child-of=\"jnt-switcher-host\" data-scroll [attr.data-windows]=\"device.platform.windows\">\n <jnt-stack child-of=\"jnt-switcher-host\" data-options\n [orientation]=\"breakpoint.current === ui.breakpoint.mobile && (features | includes : ui.feature.adapted) ?\n ui.orientation.vertical : orientation\"\n [gutter]=\"ui.gutter.none\"\n [align]=\"ui.align.stretch\">\n <ng-container *ngIf=\"!loading; else loadingTemplate\">\n <ng-container *ngFor=\"let option of options\">\n <ng-container *ngIf=\"!!option.optionTemplate;else defaultOptionTemplate\">\n <div child-of=\"jnt-switcher-host\" data-option data-custom-option tabindex=\"0\"\n [attr.data-selected]=\"option.value | check:selected:keyField:version\"\n [attr.data-disabled]=\"option.disabled\"\n (click)=\"select(option.value)\">\n <ng-container *ngTemplateOutlet=\"option.optionTemplate; context: {selected: option.value | check:selected:keyField:version }\"></ng-container>\n </div>\n </ng-container>\n <ng-template #defaultOptionTemplate>\n <jnt-stack child-of=\"jnt-switcher-host\" data-option tabindex=\"0\"\n [orientation]=\"ui.orientation.horizontal\"\n [align]=\"ui.align.center\"\n [gutter]=\"ui.gutter.small\"\n [attr.data-selected]=\"option.value | check:selected:keyField:version\"\n [attr.data-disabled]=\"option.disabled\"\n (click)=\"select(option.value)\">\n <ng-container *ngTemplateOutlet=\"optionDefaultTemplate; context: {option: option, mode: mode, selected: option.value | check:selected:keyField:version }\">\n </ng-container>\n </jnt-stack>\n </ng-template>\n </ng-container>\n </ng-container>\n </jnt-stack>\n </div>\n</div>\n\n<jnt-badge child-of=\"jnt-switcher-host\" data-count\n *ngIf=\"!!features && features.includes(ui.feature.badge) && mode === ui.select.mode.multiple && selected.length > 0\"\n [color]=\"ui.color.green\"\n [value]=\"selected.length\"></jnt-badge>\n\n<jnt-button child-of=\"jnt-switcher-host\" data-button\n *ngIf=\"!!features && features.includes(ui.feature.selectAll) && mode === ui.select.mode.multiple\"\n [text]=\"'action.select_all' | translate\"\n [outline]=\"ui.outline.transparent\"\n [size]=\"ui.size.tiny\"\n [scheme]=\"ui.scheme.secondary\"\n (click)=\"selectAll()\"></jnt-button>\n\n<ng-template #loadingTemplate>\n <div child-of=\"jnt-switcher-host\" data-placeholder *ngFor=\"let line of capacity | mockArray\"></div>\n</ng-template>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SwitcherComponent_1), multi: true } ] }), __metadata("design:paramtypes", [NGXLogger, BreakpointService, DeviceService]) ], SwitcherComponent); export { SwitcherComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL3N3aXRjaGVyL3N3aXRjaGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBYXRFLElBQWEsaUJBQWlCLHlCQUE5QixNQUFhLGlCQUFpQjtJQXdINUIsWUFBb0IsTUFBaUIsRUFDbEIsVUFBNkIsRUFDN0IsTUFBcUI7UUFGcEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNsQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBdkgvQixTQUFJLEdBQUcsbUJBQW1CLENBQUM7UUFFcEMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVBLGNBQVMsR0FBYyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBZ0IsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUczRCxXQUFNLEdBQVUsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQXdCOUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVVqQixVQUFLLEdBQWUsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQW9DdEMsYUFBUSxHQUFHLENBQUMsQ0FBQztRQVFiLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFpQmhCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBS2xDLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVaLGFBQVEsR0FBeUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM3RixjQUFTLEdBQWUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNwRixxQkFBZ0IsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzVDLHNCQUFpQixHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDeEIsV0FBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUt0RCxDQUFDO0lBdkdRLElBQUksV0FBVyxDQUFDLElBQWlCO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBMkJRLElBQUksSUFBSSxDQUFDLElBQWdCO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBU0QsSUFBSSxRQUFRLENBQUMsUUFBbUI7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQXVCUSxJQUFJLEtBQUssQ0FBQyxLQUFZO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkMsQ0FBQztJQTBCRCxVQUFVLENBQUMsS0FBa0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFVLENBQUM7SUFDaEcsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWlCO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLFVBQVUsQ0FBQyxNQUFNO2dCQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkUsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUNwQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7d0JBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUNqRCxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQ3ZELE9BQU87cUJBQ1I7b0JBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN4QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFCO2dCQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixNQUFNO1lBQ1IsS0FBSyxVQUFVLENBQUMsUUFBUTtnQkFDdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDM0I7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGLENBQUE7O1lBOUQ2QixTQUFTO1lBQ04saUJBQWlCO1lBQ3JCLGFBQWE7O0FBdkh4QztJQURDLFdBQVcsQ0FBQyxXQUFXLENBQUM7OytDQUNXO0FBUXBDO0lBREMsV0FBVyxDQUFDLGlCQUFpQixDQUFDOztpREFDRDtBQVNyQjtJQVBSLFdBQVcsQ0FBQztRQUNYLFdBQVcsRUFBRSx1QkFBdUI7UUFDcEMsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVU7UUFDL0IsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDO0tBQ3hELENBQUM7SUFDRCxXQUFXLENBQUMsdUJBQXVCLENBQUM7SUFDcEMsS0FBSyxFQUFFOzs7b0RBRVA7QUFhRDtJQVBDLFdBQVcsQ0FBQztRQUNYLFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPLEVBQUUsT0FBTztLQUNqQixDQUFDO0lBQ0QsV0FBVyxDQUFDLG9CQUFvQixDQUFDO0lBQ2pDLEtBQUssRUFBRTs7bURBQ1M7QUFPUjtJQUxSLFdBQVcsQ0FBQztRQUNYLFdBQVcsRUFBRSxrQkFBa0I7UUFDL0IsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsS0FBSztLQUNmLENBQUM7SUFDRCxLQUFLLEVBQUU7O21EQUFrQjtBQUcxQjtJQURDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQzs7Z0RBQ1E7QUFRN0I7SUFOUixXQUFXLENBQUM7UUFDWCxXQUFXLEVBQUUsZUFBZTtRQUM1QixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTTtRQUMxQixPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7S0FDbEQsQ0FBQztJQUNELEtBQUssRUFBRTs7OzZDQUVQO0FBYUQ7SUFQQyxXQUFXLENBQUM7UUFDWCxXQUFXLEVBQUUsMklBQTJJO1FBQ3hKLElBQUksRUFBRSxZQUFZO1FBQ2xCLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO0tBQ2hHLENBQUM7SUFDRCxLQUFLLEVBQUU7OztpREFHUDtBQVdEO0lBTEMsV0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixJQUFJLEVBQUUsZUFBZTtLQUN0QixDQUFDO0lBQ0QsS0FBSyxFQUFFOzttREFDSztBQVFiO0lBTkMsV0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLFNBQVM7UUFDdEIsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPLEVBQUUsT0FBTztLQUNqQixDQUFDO0lBQ0QsS0FBSyxFQUFFOztrREFDUTtBQVFQO0lBTlIsV0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLGFBQWE7UUFDMUIsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztLQUN0QyxDQUFDO0lBQ0QsS0FBSyxFQUFFOzs7OENBRVA7QUFPRDtJQUxDLFdBQVcsQ0FBQztRQUNYLFdBQVcsRUFBRSxnQkFBZ0I7UUFDN0IsSUFBSSxFQUFFLGFBQWE7S0FDcEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxVQUFVLENBQUM7O2tEQUNlO0FBR2xDO0lBREMsZUFBZSxDQUFDLHVCQUF1QixDQUFDOzhCQUNoQyxTQUFTO2tEQUEwQjtBQVN0QjtJQUFyQixZQUFZLENBQUMsTUFBTSxDQUFDOztpREFBaUM7QUF0SDNDLGlCQUFpQjtJQVg3QixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsY0FBYztRQUN4QixpdElBQTJDO1FBQzNDLFNBQVMsRUFBRTtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQWlCLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjtLQUNGLENBQUM7cUNBeUg0QixTQUFTO1FBQ04saUJBQWlCO1FBQ3JCLGFBQWE7R0ExSDdCLGlCQUFpQixDQXNMN0I7U0F0TFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICduZ3gtbG9nZ2VyJztcbmltcG9ydCB7IERldmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9sYXlvdXQvcmVzcG9uc2l2ZS9kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvZmVhdHVyZSc7XG5pbXBvcnQgeyBPcmllbnRhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvb3JpZW50YXRpb24nO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3VpJztcbmltcG9ydCB7IFdpZHRoIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy93aWR0aCc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9lcXVhbCc7XG5pbXBvcnQgeyBCcmVha3BvaW50U2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2JyZWFrcG9pbnQuc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3RNb2RlIH0gZnJvbSAnLi4vc2VsZWN0L2VudW1zJztcbmltcG9ydCB7IEtleSB9IGZyb20gJy4uL3NlbGVjdC9tb2RlbCc7XG5pbXBvcnQgeyBTd2l0Y2hlck9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc3dpdGNoZXItb3B0aW9uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2pudC1zd2l0Y2hlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2l0Y2hlci5lbmNhcHN1bGF0ZWQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3dpdGNoZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3dpdGNoZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1zd2l0Y2hlci1ob3N0JztcblxuICB1aSA9IFVJO1xuXG4gIHByaXZhdGUgX2ZlYXR1cmVzOiBGZWF0dXJlW10gPSBbXTtcbiAgcHJpdmF0ZSBfb3JpZW50YXRpb246IE9yaWVudGF0aW9uID0gT3JpZW50YXRpb24uaG9yaXpvbnRhbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS13aWR0aCcpXG4gIF93aWR0aDogV2lkdGggPSBXaWR0aC5kZWZhdWx0O1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTd2l0Y2hlciBvcmllbnRhdGlvbiAnLFxuICAgIHBhdGg6ICd1aS5vcmllbnRhdGlvbicsXG4gICAgZGVmYXVsdDogT3JpZW50YXRpb24uaG9yaXpvbnRhbCxcbiAgICBvcHRpb25zOiBbT3JpZW50YXRpb24uaG9yaXpvbnRhbCwgT3JpZW50YXRpb24udmVydGljYWxdXG4gIH0pXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLW9yaWVudGF0aW9uJylcbiAgQElucHV0KCkgc2V0IG9yaWVudGF0aW9uKHR5cGU6IE9yaWVudGF0aW9uKSB7XG4gICAgdGhpcy5fb3JpZW50YXRpb24gPSB0eXBlIHx8IE9yaWVudGF0aW9uLmhvcml6b250YWw7XG4gIH1cblxuICBnZXQgb3JpZW50YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1NldCBkaXNhYmxlZCBzdGF0ZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6ICdmYWxzZScsXG4gIH0pXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWRpc2FibGVkJylcbiAgQElucHV0KClcbiAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU2VsZWN0IGtleSBmaWVsZCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ2tleSdcbiAgfSlcbiAgQElucHV0KCkga2V5RmllbGQ6IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1tb2RlJylcbiAgX21vZGU6IFNlbGVjdE1vZGUgPSBTZWxlY3RNb2RlLnNpbmdsZTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU3dpdGNoZXIgbW9kZScsXG4gICAgcGF0aDogJ3VpLnNlbGVjdC5tb2RlJyxcbiAgICBkZWZhdWx0OiBTZWxlY3RNb2RlLnNpbmdsZSxcbiAgICBvcHRpb25zOiBbU2VsZWN0TW9kZS5zaW5nbGUsIFNlbGVjdE1vZGUubXVsdGlwbGVdXG4gIH0pXG4gIEBJbnB1dCgpIHNldCBtb2RlKG1vZGU6IFNlbGVjdE1vZGUpIHtcbiAgICB0aGlzLl9tb2RlID0gbW9kZSB8fCBTZWxlY3RNb2RlLnNpbmdsZTtcbiAgfVxuXG4gIGdldCBtb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZCBiYWRnZSB3aXRoIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXM7IFNlbGVjdCBhbGwgaXRlbSBpbiBzd2l0Y2hlcjsgQWxsb3cgZW1wdHkgdmFsdWUgaW4gc3dpdGNoZXI7IEFkYXB0ZWQgb24gbW9iaWxlOyBEaXNwbGF5IG1hcmtzJyxcbiAgICBwYXRoOiAndWkuZmVhdHVyZScsXG4gICAgZGVmYXVsdDogJ1t1aS5mZWF0dXJlLmFkYXB0ZWRdJyxcbiAgICBvcHRpb25zOiBbRmVhdHVyZS5iYWRnZSwgRmVhdHVyZS5zZWxlY3RBbGwsIEZlYXR1cmUuYWxsb3dFbXB0eSwgRmVhdHVyZS5hZGFwdGVkLCBGZWF0dXJlLm1hcmtzXVxuICB9KVxuICBASW5wdXQoKVxuICBzZXQgZmVhdHVyZXMoZmVhdHVyZXM6IEZlYXR1cmVbXSkge1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gZmVhdHVyZXMgfHwgW107XG4gIH1cblxuICBnZXQgZmVhdHVyZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlYXR1cmVzO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0Rpc3BsYXkgc2tlbGV0b24nLFxuICAgIHR5cGU6ICdjb3VudDogbnVtYmVyJyxcbiAgfSlcbiAgQElucHV0KClcbiAgY2FwYWNpdHkgPSAzO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdMb2FkaW5nJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgfSlcbiAgQElucHV0KClcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdJbnB1dCB3aWR0aCcsXG4gICAgcGF0aDogJ3VpLndpZHRoJyxcbiAgICBkZWZhdWx0OiBXaWR0aC5kZWZhdWx0LFxuICAgIG9wdGlvbnM6IFtXaWR0aC5kZWZhdWx0LCBXaWR0aC5mbHVpZF1cbiAgfSlcbiAgQElucHV0KCkgc2V0IHdpZHRoKHdpZHRoOiBXaWR0aCkge1xuICAgIHRoaXMuX3dpZHRoID0gd2lkdGggfHwgV2lkdGguZGVmYXVsdDtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTZWxlY3RlZCB2YWx1ZScsXG4gICAgdHlwZTogJyhzZWxlY3RlZCk9J1xuICB9KVxuICBAT3V0cHV0KCdzZWxlY3RlZCcpXG4gIHVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKFN3aXRjaGVyT3B0aW9uQ29tcG9uZW50KVxuICBvcHRpb25zOiBRdWVyeUxpc3Q8U3dpdGNoZXJPcHRpb25Db21wb25lbnQ+O1xuXG4gIHNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICB2ZXJzaW9uID0gMDtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZXJyb3IoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIHJlZ2lzdGVyT25DaGFuZ2UgPSBmbiA9PiB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIHJlZ2lzdGVyT25Ub3VjaGVkID0gZm4gPT4gdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1ciA9ICgpID0+IHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICAgICAgICAgICAgcHVibGljIGJyZWFrcG9pbnQ6IEJyZWFrcG9pbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgZGV2aWNlOiBEZXZpY2VTZXJ2aWNlKSB7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkgfCBhbnlbXSkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFNlbGVjdE1vZGUubXVsdGlwbGUgJiYgIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIHZhbHVlIGZvcm0gbXVsdGlwbGUgc2VsZWN0IG1vZGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMubW9kZSA9PT0gU2VsZWN0TW9kZS5zaW5nbGUgPyAoISF2YWx1ZSA/IFt2YWx1ZV0gOiBbXSkgOiB2YWx1ZSkgYXMgS2V5W107XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgc2VsZWN0KHZhbHVlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSBTZWxlY3RNb2RlLnNpbmdsZTpcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VsZWN0ZWQubGVuZ3RoID4gMCA/IHRoaXMuc2VsZWN0ZWRbMF0gOiBudWxsO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNhbWUgPSAhIXRoaXMua2V5RmllbGRcbiAgICAgICAgICAgID8gY3VycmVudFt0aGlzLmtleUZpZWxkXSA9PT0gdmFsdWVbdGhpcy5rZXlGaWVsZF1cbiAgICAgICAgICAgIDogaXNFcXVhbChjdXJyZW50LCB2YWx1ZSk7XG4gICAgICAgICAgaWYgKHNhbWUgJiYgIXRoaXMuZmVhdHVyZXMuaW5jbHVkZXMoRmVhdHVyZS5hbGxvd0VtcHR5KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzYW1lIHx8IHZhbHVlID09PSBudWxsID8gW10gOiBbdmFsdWVdO1xuICAgICAgICAgIHRoaXMub25DaGFuZ2Uoc2FtZSA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVkLmVtaXQoc2FtZSA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHZhbHVlID09PSBudWxsID8gW10gOiBbdmFsdWVdO1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICAgIHRoaXMudXBkYXRlZC5lbWl0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVyc2lvbisrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2VsZWN0TW9kZS5tdWx0aXBsZTpcbiAgICAgICAgY29uc3QgaW5kZXggPSAhIXRoaXMua2V5RmllbGRcbiAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWQuaW5kZXhPZih2YWx1ZVt0aGlzLmtleUZpZWxkXSlcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KGUgPT4gaXNFcXVhbChlLCB2YWx1ZSkpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJzaW9uKys7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIHRoaXMudXBkYXRlZC5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2gobyA9PiB0aGlzLnNlbGVjdGVkLnB1c2goby52YWx1ZSkpO1xuICAgIHRoaXMudmVyc2lvbisrO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy51cGRhdGVkLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gIH1cbn1cbiJdfQ==