UNPKG

@junte/ui

Version:

Quality Angular UI components kit

237 lines 26.9 kB
import { __decorate, __metadata, __read, __spread } from "tslib"; import { AfterViewInit, ChangeDetectorRef, Component, ContentChildren, forwardRef, HostBinding, HostListener, Input, QueryList } from '@angular/core'; import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; import { NGXLogger } from 'ngx-logger'; import { merge, Subscription } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { PropertyApi } from '../../../core/decorators/api'; import { Breakpoint } from '../../../core/enums/breakpoint'; import { Feature } from '../../../core/enums/feature'; import { FlexAlign } from '../../../core/enums/flex'; import { Gutter } from '../../../core/enums/gutter'; import { Orientation } from '../../../core/enums/orientation'; import { Size } from '../../../core/enums/size'; import { UI } from '../../../core/enums/ui'; import { BreakpointService } from '../../../layout/responsive/breakpoint.service'; import { RadioComponent } from '../radio.component'; var RadioGroupComponent = /** @class */ (function () { function RadioGroupComponent(fb, logger, breakpoint, cd) { var _this = this; this.fb = fb; this.logger = logger; this.breakpoint = breakpoint; this.cd = cd; this.ui = UI; this.host = 'jnt-radio-group-host'; this._orientation = Orientation.vertical; this._spacing = Gutter.small; this._align = FlexAlign.start; this._size = Size.normal; this.radiosControl = this.fb.array([]); this.form = this.fb.group({ radios: this.radiosControl }); this.cols = 1; this.features = []; 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; }; this.onBlur = function () { return _this.onTouched(); }; } RadioGroupComponent_1 = RadioGroupComponent; Object.defineProperty(RadioGroupComponent.prototype, "orientation", { get: function () { var _a; return this.breakpoint.current === Breakpoint.mobile && ((_a = this.features) === null || _a === void 0 ? void 0 : _a.includes(Feature.adapted)) ? Orientation.vertical : this._orientation; }, set: function (orientation) { this._orientation = orientation || Orientation.vertical; }, enumerable: true, configurable: true }); Object.defineProperty(RadioGroupComponent.prototype, "align", { get: function () { return this._align; }, set: function (align) { this._align = align || FlexAlign.start; }, enumerable: true, configurable: true }); Object.defineProperty(RadioGroupComponent.prototype, "size", { get: function () { return this._size; }, set: function (size) { this._size = size || Size.normal; }, enumerable: true, configurable: true }); Object.defineProperty(RadioGroupComponent.prototype, "spacing", { get: function () { return this._spacing; }, set: function (spacing) { this._spacing = spacing || Gutter.small; }, enumerable: true, configurable: true }); RadioGroupComponent.prototype.ngAfterViewInit = function () { var _this = this; var subscription = new Subscription(); this.radios.changes.subscribe(function () { subscription.unsubscribe(); _this.update(); subscription = _this.subscribe(); }); this.update(); subscription = this.subscribe(); }; RadioGroupComponent.prototype.subscribe = function () { var _this = this; return merge.apply(void 0, __spread(this.radiosControl.controls.map(function (control, index) { return control.valueChanges.pipe(filter(function (value) { return value; }), map(function () { return ({ control: control, index: index }); })); }))).subscribe(function (_a) { var control = _a.control, index = _a.index; _this.selected = _this.radios.toArray()[index].value; _this.onChange(_this.selected); _this.radiosControl.reset([], { emitEvent: false }); control.setValue(true, { emitEvent: false }); }); }; RadioGroupComponent.prototype.update = function () { var _this = this; if (!!this.radios) { this.radiosControl.reset([], { emitEvent: false }); this.radios.forEach(function (radio, i) { if (_this.radiosControl.length < i + 1) { _this.radiosControl.push(_this.fb.control(_this.selected === radio.value)); } else { _this.radiosControl.get(i.toString()) .setValue(_this.selected === radio.value, { emitEvent: false }); } }); this.cd.detectChanges(); } }; RadioGroupComponent.prototype.writeValue = function (value) { this.selected = value; this.update(); }; RadioGroupComponent.prototype.setDisabledState = function (isDisabled) { isDisabled ? this.radiosControl.disable({ emitEvent: false }) : this.radiosControl.enable({ emitEvent: false }); }; var RadioGroupComponent_1; RadioGroupComponent.ctorParameters = function () { return [ { type: FormBuilder }, { type: NGXLogger }, { type: BreakpointService }, { type: ChangeDetectorRef } ]; }; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], RadioGroupComponent.prototype, "host", void 0); __decorate([ PropertyApi({ description: 'Defined main axis of elements align', path: 'ui.orientation', default: Orientation.vertical, options: [Orientation.vertical, Orientation.horizontal] }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], RadioGroupComponent.prototype, "orientation", null); __decorate([ PropertyApi({ description: 'Align in radio group', path: 'ui.align' }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], RadioGroupComponent.prototype, "align", null); __decorate([ PropertyApi({ description: 'Count of cols in radio group', type: 'number', default: 1 }), Input(), __metadata("design:type", Object) ], RadioGroupComponent.prototype, "cols", void 0); __decorate([ PropertyApi({ description: 'Size for radio in radio group', path: 'ui.size', options: [Size.tiny, Size.small, Size.normal, Size.large], default: Size.normal }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], RadioGroupComponent.prototype, "size", null); __decorate([ PropertyApi({ description: 'Spacing between radio item', path: 'ui.gutter', options: [Gutter.tiny, Gutter.small, Gutter.normal, Gutter.large, Gutter.big, Gutter.huge], default: Gutter.normal }), Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], RadioGroupComponent.prototype, "spacing", null); __decorate([ PropertyApi({ description: 'Adapted radio group on mobile view', path: 'ui.feature', options: [Feature.adapted] }), HostBinding('attr.data-features'), Input(), __metadata("design:type", Array) ], RadioGroupComponent.prototype, "features", void 0); __decorate([ ContentChildren(RadioComponent, { descendants: true }), __metadata("design:type", QueryList) ], RadioGroupComponent.prototype, "radios", void 0); __decorate([ HostListener('blur'), __metadata("design:type", Object) ], RadioGroupComponent.prototype, "onBlur", void 0); RadioGroupComponent = RadioGroupComponent_1 = __decorate([ Component({ selector: 'jnt-radio-group', template: "<form child-of=\"jnt-radio-group-host\" [formGroup]=\"form\">\n <ng-container formArrayName=\"radios\">\n <ng-template #radiosTemplate let-item=\"item\" let-i=\"i\">\n <jnt-radio child-of=\"jnt-radio-group-host\" [formControlName]=\"i\"\n [size]=\"size\"\n [label]=\"item.label\"\n [value]=\"item.value\">\n <ng-template *ngIf=\"!!item.labelTemplate\" #radioLabelTemplate>\n <ng-container *ngTemplateOutlet=\"item.labelTemplate\"></ng-container>\n </ng-template>\n </jnt-radio>\n </ng-template>\n <ng-container *ngIf=\"!!radiosControl.length\">\n <ng-container *ngIf=\"cols <= 1; else colTemplate\">\n <jnt-stack child-of=\"jnt-radio-group-host\" [gutter]=\"spacing\"\n [orientation]=\"orientation\"\n [spacing]=\"spacing\"\n [align]=\"orientation === ui.orientation.horizontal ? align: ui.align.start\">\n <ng-container *ngFor=\"let item of radios; let i = index\">\n <ng-container *ngTemplateOutlet=\"radiosTemplate; context:{item: item, i: i}\"></ng-container>\n </ng-container>\n </jnt-stack>\n </ng-container>\n <ng-template #colTemplate>\n <jnt-row child-of=\"jnt-radio-group-host\" [align]=\"align\">\n <jnt-col child-of=\"jnt-radio-group-host\" *ngFor=\"let item of radios; let i = index\" [tablet]=\"(12 / cols) | trunc\">\n <ng-container *ngTemplateOutlet=\"radiosTemplate; context:{item: item, i: i}\"></ng-container>\n </jnt-col>\n </jnt-row>\n </ng-template>\n </ng-container>\n </ng-container>\n</form>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return RadioGroupComponent_1; }), multi: true } ] }), __metadata("design:paramtypes", [FormBuilder, NGXLogger, BreakpointService, ChangeDetectorRef]) ], RadioGroupComponent); return RadioGroupComponent; }()); export { RadioGroupComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL3JhZGlvL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixP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biAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgQnJlYWtwb2ludCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bXMvYnJlYWtwb2ludCc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtcy9mZWF0dXJlJztcbmltcG9ydCB7IEZsZXhBbGlnbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bXMvZmxleCc7XG5pbXBvcnQgeyBHdXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW1zL2d1dHRlcic7XG5pbXBvcnQgeyBPcmllbnRhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bXMvb3JpZW50YXRpb24nO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bXMvc2l6ZSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bXMvdWknO1xuaW1wb3J0IHsgQnJlYWtwb2ludFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9sYXlvdXQvcmVzcG9uc2l2ZS9icmVha3BvaW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmFkaW9Db21wb25lbnQgfSBmcm9tICcuLi9yYWRpby5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtcmFkaW8tZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8tZ3JvdXAuZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvR3JvdXBDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIHVpID0gVUk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1yYWRpby1ncm91cC1ob3N0JztcblxuICBfb3JpZW50YXRpb246IE9yaWVudGF0aW9uID0gT3JpZW50YXRpb24udmVydGljYWw7XG4gIF9zcGFjaW5nOiBHdXR0ZXIgPSBHdXR0ZXIuc21hbGw7XG4gIF9hbGlnbjogRmxleEFsaWduID0gRmxleEFsaWduLnN0YXJ0O1xuXG4gIHByaXZhdGUgX3NpemUgPSBTaXplLm5vcm1hbDtcbiAgc2VsZWN0ZWQ6IGFueTtcblxuICByYWRpb3NDb250cm9sID0gdGhpcy5mYi5hcnJheShbXSk7XG4gIGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICByYWRpb3M6IHRoaXMucmFkaW9zQ29udHJvbFxuICB9KTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lZCBtYWluIGF4aXMgb2YgZWxlbWVudHMgYWxpZ24nLFxuICAgIHBhdGg6ICd1aS5vcmllbnRhdGlvbicsXG4gICAgZGVmYXVsdDogT3JpZW50YXRpb24udmVydGljYWwsXG4gICAgb3B0aW9uczogW09yaWVudGF0aW9uLnZlcnRpY2FsLCBPcmllbnRhdGlvbi5ob3Jpem9udGFsXVxuICB9KVxuICBASW5wdXQoKVxuICBzZXQgb3JpZW50YXRpb24ob3JpZW50YXRpb246IE9yaWVudGF0aW9uKSB7XG4gICAgdGhpcy5fb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbiB8fCBPcmllbnRhdGlvbi52ZXJ0aWNhbDtcbiAgfVxuXG4gIGdldCBvcmllbnRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5icmVha3BvaW50LmN1cnJlbnQgPT09IEJyZWFrcG9pbnQubW9iaWxlICYmIHRoaXMuZmVhdHVyZXM/LmluY2x1ZGVzKEZlYXR1cmUuYWRhcHRlZCkgP1xuICAgICAgT3JpZW50YXRpb24udmVydGljYWwgOiB0aGlzLl9vcmllbnRhdGlvbjtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdBbGlnbiBpbiByYWRpbyBncm91cCcsXG4gICAgcGF0aDogJ3VpLmFsaWduJ1xuICB9KVxuICBASW5wdXQoKVxuICBzZXQgYWxpZ24oYWxpZ246IEZsZXhBbGlnbikge1xuICAgIHRoaXMuX2FsaWduID0gYWxpZ24gfHwgRmxleEFsaWduLnN0YXJ0O1xuICB9XG5cbiAgZ2V0IGFsaWduKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnbjtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdDb3VudCBvZiBjb2xzIGluIHJhZGlvIGdyb3VwJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiAxXG4gIH0pXG4gIEBJbnB1dCgpXG4gIGNvbHMgPSAxO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTaXplIGZvciByYWRpbyBpbiByYWRpbyBncm91cCcsXG4gICAgcGF0aDogJ3VpLnNpemUnLFxuICAgIG9wdGlvbnM6IFtTaXplLnRpbnksIFNpemUuc21hbGwsIFNpemUubm9ybWFsLCBTaXplLmxhcmdlXSxcbiAgICBkZWZhdWx0OiBTaXplLm5vcm1hbFxuICB9KVxuICBASW5wdXQoKVxuICBzZXQgc2l6ZShzaXplOiBTaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHNpemUgfHwgU2l6ZS5ub3JtYWw7XG4gIH1cblxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTcGFjaW5nIGJldHdlZW4gcmFkaW8gaXRlbScsXG4gICAgcGF0aDogJ3VpLmd1dHRlcicsXG4gICAgb3B0aW9uczogW0d1dHRlci50aW55LFxuICAgICAgR3V0dGVyLnNtYWxsLFxuICAgICAgR3V0dGVyLm5vcm1hbCxcbiAgICAgIEd1dHRlci5sYXJnZSxcbiAgICAgIEd1dHRlci5iaWcsXG4gICAgICBHdXR0ZXIuaHVnZV0sXG4gICAgZGVmYXVsdDogR3V0dGVyLm5vcm1hbFxuICB9KVxuICBASW5wdXQoKVxuICBzZXQgc3BhY2luZyhzcGFjaW5nOiBHdXR0ZXIpIHtcbiAgICB0aGlzLl9zcGFjaW5nID0gc3BhY2luZyB8fCBHdXR0ZXIuc21hbGw7XG4gIH1cblxuICBnZXQgc3BhY2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3BhY2luZztcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdBZGFwdGVkIHJhZGlvIGdyb3VwIG9uIG1vYmlsZSB2aWV3JyxcbiAgICBwYXRoOiAndWkuZmVhdHVyZScsXG4gICAgb3B0aW9uczogW0ZlYXR1cmUuYWRhcHRlZF1cbiAgfSlcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZmVhdHVyZXMnKVxuICBASW5wdXQoKVxuICBmZWF0dXJlczogRmVhdHVyZVtdID0gW107XG5cbiAgQENvbnRlbnRDaGlsZHJlbihSYWRpb0NvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSlcbiAgcmFkaW9zOiBRdWVyeUxpc3Q8UmFkaW9Db21wb25lbnQ+O1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmVycm9yKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBicmVha3BvaW50OiBCcmVha3BvaW50U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMucmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc3Vic2NyaWJlKCkge1xuICAgIHJldHVybiBtZXJnZSguLi50aGlzLnJhZGlvc0NvbnRyb2wuY29udHJvbHMubWFwKChjb250cm9sLCBpbmRleCkgPT5cbiAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSksXG4gICAgICAgIG1hcCgoKSA9PiAoe2NvbnRyb2wsIGluZGV4fSkpXG4gICAgICApKSkuc3Vic2NyaWJlKCh7Y29udHJvbCwgaW5kZXh9KSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5yYWRpb3MudG9BcnJheSgpW2luZGV4XS52YWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZCk7XG4gICAgICB0aGlzLnJhZGlvc0NvbnRyb2wucmVzZXQoW10sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICBjb250cm9sLnNldFZhbHVlKHRydWUsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKCEhdGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zQ29udHJvbC5yZXNldChbXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvLCBpKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvc0NvbnRyb2wubGVuZ3RoIDwgaSArIDEpIHtcbiAgICAgICAgICB0aGlzLnJhZGlvc0NvbnRyb2wucHVzaCh0aGlzLmZiLmNvbnRyb2wodGhpcy5zZWxlY3RlZCA9PT0gcmFkaW8udmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJhZGlvc0NvbnRyb2wuZ2V0KGkudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkID09PSByYWRpby52YWx1ZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlzRGlzYWJsZWQgPyB0aGlzLnJhZGlvc0NvbnRyb2wuZGlzYWJsZSh7ZW1pdEV2ZW50OiBmYWxzZX0pXG4gICAgICA6IHRoaXMucmFkaW9zQ29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxufVxuIl19