UNPKG

@junte/ui

Version:

Quality Angular UI components kit

595 lines 66.1 kB
import { __decorate, __metadata } from "tslib"; import { AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, QueryList, Renderer2, TemplateRef, ViewChild } from '@angular/core'; import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; import { NGXLogger } from 'ngx-logger'; import { debounceTime, distinctUntilChanged, filter, finalize, takeWhile, tap } from 'rxjs/operators'; import { DeviceService } from '../../layout/responsive/device.service'; import { PropertyApi } from '../../core/decorators/api'; import { Behaviour } from '../../core/enums/behaviour'; import { Breakpoint } from '../../core/enums/breakpoint'; import { Feature } from '../../core/enums/feature'; import { Placement } from '../../core/enums/placement'; import { Size } from '../../core/enums/size'; import { State } from '../../core/enums/state'; import { UI } from '../../core/enums/ui'; import { Width } from '../../core/enums/width'; import { BreakpointService } from '../../layout/responsive/breakpoint.service'; import { PopoverInstance, PopoverService } from '../../overlays/popover/popover.service'; import { SelectMode } from './enums'; var MIN_WIDTH = 20; var CHAR_WIDTH = 8; var CHECKING_INTERVAL = 100; var SelectOptionComponent = /** @class */ (function () { function SelectOptionComponent() { this.ui = UI; } __decorate([ PropertyApi({ description: 'Icon for select option', type: 'string' }), Input(), __metadata("design:type", String) ], SelectOptionComponent.prototype, "icon", void 0); __decorate([ PropertyApi({ description: 'Key for select option', type: 'number | string' }), Input(), __metadata("design:type", Object) ], SelectOptionComponent.prototype, "key", void 0); __decorate([ PropertyApi({ description: 'Label name for select option', type: 'string' }), Input(), __metadata("design:type", String) ], SelectOptionComponent.prototype, "label", void 0); __decorate([ PropertyApi({ description: 'Value for select option', type: 'any' }), Input(), __metadata("design:type", Object) ], SelectOptionComponent.prototype, "value", void 0); SelectOptionComponent = __decorate([ Component({ selector: 'jnt-select-option', template: '' }) ], SelectOptionComponent); return SelectOptionComponent; }()); export { SelectOptionComponent }; var SEARCH_DELAY = 100; var SelectComponent = /** @class */ (function () { function SelectComponent(hostRef, renderer, fb, popover, logger, breakpoint, device) { var _this = this; this.hostRef = hostRef; this.renderer = renderer; this.fb = fb; this.popover = popover; this.logger = logger; this.breakpoint = breakpoint; this.device = device; this.host = 'jnt-select-host'; this.reference = { popover: null }; this.destroyed = false; this._features = []; this.ui = UI; this._placement = Placement.absolute; this.options = { persisted: {}, found: {} }; this.changes = { selected: 0, options: 0 }; this.selected = []; this.queryControl = this.fb.control({ value: null, disabled: true }); this.form = this.fb.group({ query: this.queryControl }); this.labelField = 'label'; this.keyField = 'key'; this.placeholder = ''; this.required = false; this._mode = SelectMode.single; this._size = Size.normal; this._width = Width.default; this.updated = new EventEmitter(); this.opened = false; this.disabled = false; this.loader = null; this.onChange = function () { return _this.logger.error('value accessor is not registered'); }; this.onTouched = function () { return _this.logger.error('value accessor is not registered'); }; this.registerOnChange = function (fn) { return _this.onChange = fn; }; this.registerOnTouched = function (fn) { return _this.onTouched = fn; }; } SelectComponent_1 = SelectComponent; Object.defineProperty(SelectComponent.prototype, "mobile", { get: function () { return this.breakpoint.current === Breakpoint.mobile; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "placement", { get: function () { return this._placement; }, set: function (placement) { this._placement = placement || Placement.absolute; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "mode", { get: function () { return this._mode; }, set: function (mode) { this._mode = mode || SelectMode.single; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "features", { get: function () { return this._features; }, set: function (features) { this._features = features || []; this.features.includes(Feature.search) ? this.queryControl.enable({ emitEvent: false }) : this.queryControl.disable({ emitEvent: false }); }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "size", { set: function (size) { this._size = size || Size.normal; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "width", { set: function (width) { this._width = width || Width.default; }, enumerable: true, configurable: true }); Object.defineProperty(SelectComponent.prototype, "empty", { get: function () { return this.selected.length === 0; }, enumerable: true, configurable: true }); SelectComponent.prototype.clickOutside = function (path) { if (!!this.reference.popover && this.opened && !this.picked(path) && !this.reference.popover.picked(path)) { this.close(); } }; SelectComponent.prototype.focused = function (_a) { var target = _a.target; switch (this.mode) { case SelectMode.single: break; case SelectMode.multiple: if (target === this.selectedList.nativeElement) { this.opened ? this.close() : this.open(); } break; } }; SelectComponent.prototype.blurred = function () { this.onTouched(); }; SelectComponent.prototype.ngOnInit = function () { var _this = this; var loadOptions = function (query) { if (!!_this.fetcher) { _this.fetcher.unsubscribe(); } if (!!_this.loader) { _this.fetcher = _this.loader(query) .pipe(finalize(function () { return _this.loading = false; })) .subscribe(function (objects) { _this.options.found = {}; objects.forEach(function (o, index) { var key = o[_this.keyField]; if (!!key) { _this.options.found["" + key] = { index: index, key: key, label: o[_this.labelField], icon: o.icon, value: o }; } }); _this.changes.options++; }); } else { _this.options.found = {}; var options = Object.values(_this.options.persisted); options = options.filter(function (o) { return o.label.toLocaleLowerCase() .includes(query.toLocaleLowerCase()); }); options.forEach(function (option) { return _this.options.found[option.key] = option; }); _this.changes.options++; } }; this.queryControl.valueChanges.pipe(distinctUntilChanged(), tap(function (query) { _this.logger.debug('query has been changed'); _this.loading = !!query && !!_this.loader; var input = _this.queryInput.nativeElement; if (!!query && query.length > 0) { var width = Math.max((query.length + 1) * CHAR_WIDTH, MIN_WIDTH); _this.renderer.setStyle(input, 'width', width + 'px'); } else { _this.renderer.removeStyle(input, 'width'); } }), debounceTime(SEARCH_DELAY), filter(function (query) { return !!query; })).subscribe(function (query) { return loadOptions(query); }); }; SelectComponent.prototype.ngAfterContentInit = function () { var _this = this; var convert = function (options) { _this.options.persisted = {}; options.forEach(function (_a, index) { var key = _a.key, label = _a.label, icon = _a.icon, value = _a.value; return _this.options.persisted["" + key] = { index: index, key: key, label: label, icon: icon, value: value }; }); _this.changes.options++; }; convert(this.optionsFromMarkup.toArray()); this.optionsFromMarkup.changes.pipe(tap(function () { return _this.logger.debug('options from markup changed'); })) .subscribe(function (options) { return convert(options.toArray()); }); }; SelectComponent.prototype.ngOnDestroy = function () { this.destroyed = true; if (!!this.reference.popover) { this.reference.popover.hide(); this.reference.popover = null; } }; SelectComponent.prototype.picked = function (elements) { return elements.indexOf(this.hostRef.nativeElement) !== -1; }; SelectComponent.prototype.trackOption = function (index, option) { return option.key || index; }; SelectComponent.prototype.toggle = function (option) { this.selected.indexOf(option.key) === -1 ? this.select(option) : this.remove(option.key); }; SelectComponent.prototype.select = function (option) { this.logger.debug('option is selected'); this.options.persisted["" + option.key] = option; this.changes.options++; if (this.mode === SelectMode.multiple) { this.selected.push(option.key); if (!!this.reference.popover) { this.reference.popover.update(); } } else { this.selected = [option.key]; } if (this.mode !== SelectMode.multiple || !this.features.includes(Feature.multiplex)) { this.close(); } this.onChange(this.mode === SelectMode.multiple ? this.selected : option.key); this.updated.emit(option.value); }; SelectComponent.prototype.remove = function (key) { var index = this.selected.findIndex(function (i) { return i === key; }); if (index !== -1 && (this.mode === SelectMode.multiple || this.features.includes(Feature.allowEmpty))) { this.logger.debug("option " + index + " has been removed"); this.selected.splice(index, 1); this.changes.selected++; this.onChange(this.mode === SelectMode.multiple ? this.selected : null); } }; SelectComponent.prototype.open = function () { var _this = this; this.opened = true; var input = this.queryInput.nativeElement; var checking = function () { var style = getComputedStyle(input); if (style.display !== 'none') { input.focus(); } else { setTimeout(function () { return checking(); }, CHECKING_INTERVAL); } }; setTimeout(function () { return checking(); }, CHECKING_INTERVAL); if (!this.mobile) { this.reference.popover = this.popover.show(this.hostRef, { contentTemplate: this.optionsTemplate, behaviour: Behaviour.dropdown, placement: this.placement, padding: UI.gutter.small }); this.popover.attached.pipe(takeWhile((function () { return !_this.destroyed; })), filter(function (t) { return !!t && t !== _this.hostRef; })) .subscribe(function () { return _this.close(); }); } }; SelectComponent.prototype.close = function () { this.opened = false; this.queryControl.setValue(null); if (!!this.reference.popover) { this.reference.popover.hide(); this.reference.popover = null; } }; SelectComponent.prototype.writeValue = function (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); }; SelectComponent.prototype.setDisabledState = function (disabled) { this.disabled = disabled; }; var SelectComponent_1; SelectComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 }, { type: FormBuilder }, { type: PopoverService }, { type: NGXLogger }, { type: BreakpointService }, { type: DeviceService } ]; }; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], SelectComponent.prototype, "host", void 0); __decorate([ PropertyApi({ description: 'Select label field', type: 'string', default: 'label' }), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "labelField", void 0); __decorate([ PropertyApi({ description: 'Select key field', type: 'string', default: 'key' }), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "keyField", void 0); __decorate([ PropertyApi({ description: 'Select placeholder', type: 'string' }), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "placeholder", void 0); __decorate([ PropertyApi({ description: 'Select required', type: 'boolean', default: 'false' }), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "required", void 0); __decorate([ HostBinding('attr.data-mode'), __metadata("design:type", String) ], SelectComponent.prototype, "_mode", void 0); __decorate([ HostBinding('attr.data-size'), __metadata("design:type", String) ], SelectComponent.prototype, "_size", void 0); __decorate([ HostBinding('attr.data-width'), __metadata("design:type", String) ], SelectComponent.prototype, "_width", void 0); __decorate([ PropertyApi({ description: 'Select label', type: 'string' }), Input(), __metadata("design:type", String) ], SelectComponent.prototype, "label", void 0); __decorate([ PropertyApi({ description: 'Icon for select', type: 'string', }), Input(), __metadata("design:type", String) ], SelectComponent.prototype, "icon", void 0); __decorate([ ViewChild('queryInput', { static: true }), __metadata("design:type", ElementRef) ], SelectComponent.prototype, "queryInput", void 0); __decorate([ ViewChild('selectedList', { static: true }), __metadata("design:type", ElementRef) ], SelectComponent.prototype, "selectedList", void 0); __decorate([ ViewChild('query'), __metadata("design:type", ElementRef) ], SelectComponent.prototype, "query", void 0); __decorate([ PropertyApi({ description: 'Select state', path: 'ui.state', options: [State.loading] }), HostBinding('attr.data-state'), Input(), __metadata("design:type", String) ], SelectComponent.prototype, "state", void 0); __decorate([ PropertyApi({ description: 'Template for option', type: 'TemplateRef<any>' }), Input(), __metadata("design:type", TemplateRef) ], SelectComponent.prototype, "optionTemplate", void 0); __decorate([ PropertyApi({ description: 'Template for empty options', type: 'TemplateRef<any>' }), Input(), __metadata("design:type", TemplateRef) ], SelectComponent.prototype, "emptyOptionsTemplate", void 0); __decorate([ PropertyApi({ description: 'Template for options header', type: 'TemplateRef<any>' }), Input(), __metadata("design:type", TemplateRef) ], SelectComponent.prototype, "optionsHeaderTemplate", void 0); __decorate([ ContentChildren(SelectOptionComponent), __metadata("design:type", QueryList) ], SelectComponent.prototype, "optionsFromMarkup", void 0); __decorate([ ViewChild('optionsTemplate'), __metadata("design:type", TemplateRef) ], SelectComponent.prototype, "optionsTemplate", void 0); __decorate([ PropertyApi({ description: 'Selected value', type: '(selected)=' }), Output('selected'), __metadata("design:type", Object) ], SelectComponent.prototype, "updated", void 0); __decorate([ HostBinding('attr.data-opened'), __metadata("design:type", Object) ], SelectComponent.prototype, "opened", void 0); __decorate([ PropertyApi({ description: 'Menu popover placement', path: 'ui.placement', default: Placement.absolute, options: [Placement.absolute, Placement.fixed] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "placement", null); __decorate([ PropertyApi({ description: 'Select mode', path: 'ui.select.mode', default: SelectMode.single, options: [SelectMode.single, SelectMode.multiple] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "mode", null); __decorate([ PropertyApi({ description: 'Select features', path: 'ui.feature', options: [Feature.search, Feature.multiplex, Feature.allowEmpty] }), HostBinding('attr.data-features'), Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], SelectComponent.prototype, "features", null); __decorate([ HostBinding('attr.data-disabled'), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "disabled", void 0); __decorate([ PropertyApi({ description: 'Select size', path: 'ui.size', default: Size.normal, options: [Size.tiny, Size.small, Size.normal, Size.large] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "size", null); __decorate([ PropertyApi({ description: 'Select width', path: 'ui.width', default: Width.default, options: [Width.default, Width.fluid] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], SelectComponent.prototype, "width", null); __decorate([ HostBinding('attr.data-empty'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], SelectComponent.prototype, "empty", null); __decorate([ PropertyApi({ description: 'Select loader', type: 'function' }), Input(), __metadata("design:type", Object) ], SelectComponent.prototype, "loader", void 0); __decorate([ HostListener('document:click', ['$event.path']), __metadata("design:type", Function), __metadata("design:paramtypes", [Array]), __metadata("design:returntype", void 0) ], SelectComponent.prototype, "clickOutside", null); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], SelectComponent.prototype, "focused", null); __decorate([ HostListener('blur'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], SelectComponent.prototype, "blurred", null); SelectComponent = SelectComponent_1 = __decorate([ Component({ selector: 'jnt-select', template: "<ng-template #emptyOptionsDefaultTemplate let-query=\"query\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n</ng-template>\n\n<ng-template #optionDefaultTemplate let-icon=\"icon\" let-label=\"label\">\n <jnt-stack child-of=\"jnt-select-host\" [orientation]=\"ui.orientation.horizontal\"\n [gutter]=\"ui.gutter.small\"\n [align]=\"ui.align.center\">\n <jnt-icon child-of=\"jnt-select-host\" *ngIf=\"icon\" [icon]=\"icon\"></jnt-icon>\n <div child-of=\"jnt-select-host\" >{{label}}</div>\n </jnt-stack>\n</ng-template>\n\n<jnt-stack child-of=\"jnt-select-host\" data-select [orientation]=\"ui.orientation.horizontal\"\n [gutter]=\"ui.gutter.tiny\" [align]=\"ui.align.center\"\n tabindex=\"0\">\n <div child-of=\"jnt-select-host\" *ngIf=\"!!label\" data-label>{{label}}</div>\n <jnt-icon child-of=\"jnt-select-host\" *ngIf=\"!!icon && !label\" [icon]=\"icon\"></jnt-icon>\n <ul child-of=\"jnt-select-host\" #selectedList>\n <ng-container *ngIf=\"selected.length\">\n <li child-of=\"jnt-select-host\" *ngFor=\"let key of selected\" (click)=\"mode == ui.select.mode.single ? (opened ? close() : open()) : null\"\n [attr.data-with-template]=\"!!optionTemplate\">\n <ng-template #noOptionTemplate>\n <div child-of=\"jnt-select-host\" data-empty></div>\n </ng-template>\n <div child-of=\"jnt-select-host\" *ngIf=\"(key | getOption:options:changes.selected:changes.options) as o;else noOptionTemplate\">\n <ng-container *ngTemplateOutlet=\"!!optionTemplate ? optionTemplate\n : optionDefaultTemplate;context: {icon: o.icon, label: o.label, value: o.value, selected: true}\">\n </ng-container>\n </div>\n <button child-of=\"jnt-select-host\" data-close type=\"button\" (click)=\"remove(key)\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"ui.icons.closeSmall\"></jnt-icon>\n </button>\n </li>\n </ng-container>\n\n <li child-of=\"jnt-select-host\" data-query [formGroup]=\"form\" (click)=\"opened ? close() : open()\">\n <input child-of=\"jnt-select-host\" #queryInput [placeholder]=\"mode != ui.select.mode.multiple || !selected.length ? placeholder : ''\"\n formControlName=\"query\" />\n </li>\n </ul>\n <div child-of=\"jnt-select-host\" data-loading *ngIf=\"state === ui.state.loading\">\n <jnt-spinner child-of=\"jnt-select-host\" data-spinner></jnt-spinner>\n </div>\n <button child-of=\"jnt-select-host\" data-toggle type=\"button\" (click)=\"opened ? close() : open()\">\n <jnt-icon child-of=\"jnt-select-host\" [icon]=\"opened ? ui.icons.selectOpen : ui.icons.selectClose\"></jnt-icon>\n </button>\n</jnt-stack>\n\n<ng-template #optionsTemplate>\n <div child-of=\"jnt-select-host\" data-options *ngIf=\"opened\" [attr.data-loading]=\"loading\">\n <ng-template #noOptionsTemplate>\n <div child-of=\"jnt-select-host\" data-skeleton>\n <jnt-skeleton child-of=\"jnt-select-host\" *ngIf=\"loading; else optionsNotFoundTemplate\"\n [type]=\"ui.skeleton.type.text\" [lines]=\"5\"></jnt-skeleton>\n </div>\n <ng-template #optionsNotFoundTemplate>\n <div child-of=\"jnt-select-host\" data-empty-options>\n <ng-container *ngTemplateOutlet=\"!!emptyOptionsTemplate ? emptyOptionsTemplate\n : emptyOptionsDefaultTemplate;context: {query: queryControl.value, close: close.bind(this)}\">\n </ng-container>\n </div>\n </ng-template>\n </ng-template>\n <ng-container *ngIf=\"((!!queryControl.value ? options.found : options.persisted)\n | getOptions:changes.selected:changes.options) as options\">\n <ng-container *ngIf=\"options.length;else noOptionsTemplate\">\n <div child-of=\"jnt-select-host\" data-loading *ngIf=\"loading\">\n <jnt-spinner child-of=\"jnt-select-host\" data-spinner></jnt-spinner>\n </div>\n <jnt-stack child-of=\"jnt-select-host\" [align]=\"ui.align.stretch\">\n <div child-of=\"jnt-select-host\" data-options-header *ngIf=\"!!optionsHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"optionsHeaderTemplate;context: {close: close.bind(this)}\"></ng-container>\n </div>\n <ul child-of=\"jnt-select-host\" [attr.data-windows]=\"device.platform.windows\">\n <li child-of=\"jnt-select-host\" *ngFor=\"let o of options;trackBy:trackOption\"\n [attr.data-selected]=\"selected | includes:o.key\"\n (click)=\"toggle(o)\">\n <ng-container *ngTemplateOutlet=\"!!optionTemplate ? optionTemplate\n : optionDefaultTemplate;context: {icon: o.icon, label: o.label, value: o.value}\">\n </ng-container>\n </li>\n </ul>\n </jnt-stack>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container *jntFor=\"ui.breakpoint.mobile\">\n <ng-container *ngTemplateOutlet=\"optionsTemplate\"></ng-container>\n</ng-container>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return SelectComponent_1; }), multi: true } ] }), __metadata("design:paramtypes", [ElementRef, Renderer2, FormBuilder, PopoverService, NGXLogger, BreakpointService, DeviceService]) ], SelectComponent); return SelectComponent; }()); export { SelectComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BqdW50ZS91aS8iLCJzb3VyY2VzIjpbImxpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxF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QztRQUNELEtBQUssRUFBRTs7O2dEQUVQO0lBR0Q7UUFEQyxXQUFXLENBQUMsaUJBQWlCLENBQUM7OztnREFHOUI7SUFPRDtRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxlQUFlO1lBQzVCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUM7UUFDRCxLQUFLLEVBQUU7O21EQUNNO0lBR2Q7UUFEQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7Ozt1REFLL0M7SUFHRDtRQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7OztrREFXakM7SUFHRDtRQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7a0RBR3BCO0lBdFBVLGVBQWU7UUFYM0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFlBQVk7WUFDdEIsbzlKQUF5QztZQUN6QyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsaUJBQWUsRUFBZixDQUFlLENBQUM7b0JBQzlDLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO3lDQThQNkIsVUFBVTtZQUNULFNBQVM7WUFDZixXQUFXO1lBQ04sY0FBYztZQUNmLFNBQVM7WUFDTCxpQkFBaUI7WUFDdEIsYUFBYTtPQW5RN0IsZUFBZSxDQXNhM0I7SUFBRCxzQkFBQztDQUFBLEFBdGFELElBc2FDO1NBdGFZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUJ1aWxkZXIsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmluYWxpemUsIHRha2VXaGlsZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGV2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2RldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByb3BlcnR5QXBpIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzL2FwaSc7XG5pbXBvcnQgeyBCZWhhdmlvdXIgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2JlaGF2aW91cic7XG5pbXBvcnQgeyBCcmVha3BvaW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9icmVha3BvaW50JztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2ZlYXR1cmUnO1xuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9wbGFjZW1lbnQnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvc2l6ZSc7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvc3RhdGUnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3VpJztcbmltcG9ydCB7IFdpZHRoIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy93aWR0aCc7XG5pbXBvcnQgeyBCcmVha3BvaW50U2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2JyZWFrcG9pbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQb3BvdmVySW5zdGFuY2UsIFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vb3ZlcmxheXMvcG9wb3Zlci9wb3BvdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0TW9kZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgSU9wdGlvbiwgS2V5LCBPcHRpb25zIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmNvbnN0IE1JTl9XSURUSCA9IDIwO1xuY29uc3QgQ0hBUl9XSURUSCA9IDg7XG5jb25zdCBDSEVDS0lOR19JTlRFUlZBTCA9IDEwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LXNlbGVjdC1vcHRpb24nLFxuICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0T3B0aW9uQ29tcG9uZW50IHtcblxuICB1aSA9IFVJO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdJY29uIGZvciBzZWxlY3Qgb3B0aW9uJyxcbiAgICB0eXBlOiAnc3RyaW5nJ1xuICB9KVxuICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGl