ng-devui
Version:
DevUI components based on Angular
152 lines • 19.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2 } from '@angular/core';
import { SplitterService } from './splitter.service';
import * as i0 from "@angular/core";
import * as i1 from "./splitter.service";
export class SplitterPaneComponent {
set collapsed(newCollapsed) {
if (this._collapsed !== newCollapsed) {
this._collapsed = newCollapsed;
this.splitter.paneChangeSubject.next(true);
}
}
get collapsed() {
return this._collapsed;
}
set size(newSize) {
this._size = newSize;
this.widthBeforeShrink = newSize;
this.renderer.setStyle(this.element, 'flex-basis', newSize);
const paneFixedClass = 'devui-splitter-pane-fixed';
if (this.size) {
// 设置 flex-grow 和 flex-shrink
this.renderer.addClass(this.element, paneFixedClass);
}
else {
this.renderer.removeClass(this.element, paneFixedClass);
}
}
get size() {
return this._size;
}
set order(paneOrder) {
this._order = paneOrder;
this.setOrderStyles();
}
get order() {
return this._order;
}
constructor(splitter, el, renderer) {
this.splitter = splitter;
this.el = el;
this.renderer = renderer;
// 当前panel是否可调整大小
this.resizable = true;
// 面板是否可折叠
this.collapsible = false;
// 是否折叠收缩
this.shrink = false;
// 折叠收缩后宽度
this.shrinkWidth = 36;
// 面板初始化是否折叠,默认不折叠
this._collapsed = false;
// 非边缘面板折叠方向,before只生成向前折叠的按钮,after生成向后折叠按钮,both生成两个
this.collapseDirection = 'both';
// 大小改变事件
this.sizeChange = new EventEmitter();
// 收起和展开事件
this.collapsedChange = new EventEmitter();
// 收缩和展开事件
this.shrinkStatusChange = new EventEmitter();
this.paneClass = true;
this._order = 0; // flex布局下pane位置
this.element = this.el.nativeElement;
}
ngOnChanges(changes) {
if ((changes.collapsible && !changes.collapsible.isFirstChange()) || (changes.resizable && !changes.resizable.isFirstChange())) {
this.splitter.paneChangeSubject.next(true);
}
}
// 设置order
setOrderStyles() {
this.renderer.setStyle(this.element, 'order', this.order);
}
// 获取当前pane大小
get computedSize() {
if (this.orientation === 'vertical') {
return this.element.offsetHeight;
}
else {
return this.element.offsetWidth;
}
}
// 收起时隐藏当前pane
toggleCollapseClass() {
const paneHiddenClass = 'devui-splitter-pane-hidden';
if (!this._collapsed) {
this.renderer.removeClass(this.element, paneHiddenClass);
}
else {
this.renderer.addClass(this.element, paneHiddenClass);
}
if (this._collapsed && this.shrink) {
this.renderer.removeClass(this.element, paneHiddenClass);
this.renderer.setStyle(this.element, 'flex-basis', `${this.shrinkWidth}px`);
this.shrinkStatusChange.emit(true);
}
else {
this.renderer.setStyle(this.element, 'flex-basis', this.widthBeforeShrink);
this.shrinkStatusChange.emit(false);
}
}
// 收起时用于改变相邻pane的flex-grow属性来改变非自适应pane的size
toggleNearPaneFlexGrow(collapsed) {
const flexGrowClass = 'devui-splitter-pane-grow';
const hasFlexGrowClass = this.element.classList.contains(flexGrowClass);
if (hasFlexGrowClass) {
this.renderer.removeClass(this.element, flexGrowClass);
}
else if (collapsed) {
this.renderer.addClass(this.element, flexGrowClass);
}
}
ngAfterViewChecked() {
// 视图检查完对resizeable pane设置flex属性
if (!this.size && !this.resizable) {
this.renderer.addClass(this.element, 'devui-splitter-pane-fixed');
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterPaneComponent, deps: [{ token: i1.SplitterService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SplitterPaneComponent, selector: "d-splitter-pane", inputs: { minSize: "minSize", maxSize: "maxSize", resizable: "resizable", collapsible: "collapsible", shrink: "shrink", shrinkWidth: "shrinkWidth", collapsed: "collapsed", collapseDirection: "collapseDirection", size: "size" }, outputs: { sizeChange: "sizeChange", collapsedChange: "collapsedChange", shrinkStatusChange: "shrinkStatusChange" }, host: { properties: { "class.devui-splitter-pane": "this.paneClass" } }, usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host.devui-splitter-pane{position:relative;flex:1 1 auto;display:block;min-width:0;max-width:100%;min-height:0;max-height:100%}:host.devui-splitter-pane-fixed{flex-grow:0;flex-shrink:0}:host.devui-splitter-pane-grow{flex-grow:1!important}:host.devui-splitter-pane-hidden{flex:0!important;overflow:hidden!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterPaneComponent, decorators: [{
type: Component,
args: [{ selector: 'd-splitter-pane', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<ng-content></ng-content>\n", styles: [":host.devui-splitter-pane{position:relative;flex:1 1 auto;display:block;min-width:0;max-width:100%;min-height:0;max-height:100%}:host.devui-splitter-pane-fixed{flex-grow:0;flex-shrink:0}:host.devui-splitter-pane-grow{flex-grow:1!important}:host.devui-splitter-pane-hidden{flex:0!important;overflow:hidden!important}\n"] }]
}], ctorParameters: () => [{ type: i1.SplitterService }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { minSize: [{
type: Input
}], maxSize: [{
type: Input
}], resizable: [{
type: Input
}], collapsible: [{
type: Input
}], shrink: [{
type: Input
}], shrinkWidth: [{
type: Input
}], collapsed: [{
type: Input
}], collapseDirection: [{
type: Input
}], size: [{
type: Input
}], sizeChange: [{
type: Output
}], collapsedChange: [{
type: Output
}], shrinkStatusChange: [{
type: Output
}], paneClass: [{
type: HostBinding,
args: ['class.devui-splitter-pane']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXItcGFuZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9zcGxpdHRlci9zcGxpdHRlci1wYW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2RldnVpL3NwbGl0dGVyL3NwbGl0dGVyLXBhbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNhLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUM5RSxXQUFXLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQ2pELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBVXJELE1BQU0sT0FBTyxxQkFBcUI7SUFlaEMsSUFDSSxTQUFTLENBQUMsWUFBWTtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQU1ELElBQ0ksSUFBSSxDQUFDLE9BQU87UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLDJCQUEyQixDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFnQkQsSUFBSSxLQUFLLENBQUMsU0FBUztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBb0IsUUFBeUIsRUFBVSxFQUFjLEVBQVUsUUFBbUI7UUFBOUUsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWhFbEcsaUJBQWlCO1FBQ1IsY0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixVQUFVO1FBQ0QsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDN0IsU0FBUztRQUNBLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDeEIsVUFBVTtRQUNELGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzFCLGtCQUFrQjtRQUNsQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBV25CLG9EQUFvRDtRQUMzQyxzQkFBaUIsR0FBc0IsTUFBTSxDQUFDO1FBb0J2RCxTQUFTO1FBQ0MsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFL0MsVUFBVTtRQUNBLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxVQUFVO1FBQ0EsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVqQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRzNELFdBQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7UUFZMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9ILElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtJQUNWLGNBQWM7UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGFBQWE7SUFDYixJQUFJLFlBQVk7UUFDZCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO0lBQ2QsbUJBQW1CO1FBQ2pCLE1BQU0sZUFBZSxHQUFHLDRCQUE0QixDQUFDO1FBRXJELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLHNCQUFzQixDQUFDLFNBQVM7UUFDOUIsTUFBTSxhQUFhLEdBQUcsMEJBQTBCLENBQUM7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsQ0FBQzthQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDOytHQWpJVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiw4ZUNkbEMsNkJBQ0E7OzRGRGFhLHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSx1QkFDMUIsS0FBSztxSUFLakIsT0FBTztzQkFBZixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUYsU0FBUztzQkFEWixLQUFLO2dCQVdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRixJQUFJO3NCQURQLEtBQUs7Z0JBaUJJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRW1DLFNBQVM7c0JBQWxELFdBQVc7dUJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTcGxpdHRlclNlcnZpY2UgfSBmcm9tICcuL3NwbGl0dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGFwc2VEaXJlY3Rpb24sIFNwbGl0dGVyT3JpZW50YXRpb24gfSBmcm9tICcuL3NwbGl0dGVyLnR5cGVzJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Qtc3BsaXR0ZXItcGFuZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGxpdHRlci1wYW5lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BsaXR0ZXItcGFuZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuXG5leHBvcnQgY2xhc3MgU3BsaXR0ZXJQYW5lQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkIHtcbiAgLy8gcGFuZeeahOacgOWwj+WAvFxuICBASW5wdXQoKSBtaW5TaXplOiBzdHJpbmc7XG4gIC8vIHBhbmXnmoTmnIDlpKflgLxcbiAgQElucHV0KCkgbWF4U2l6ZTogc3RyaW5nO1xuICAvLyDlvZPliY1wYW5lbOaYr+WQpuWPr+iwg+aVtOWkp+Wwj1xuICBASW5wdXQoKSByZXNpemFibGUgPSB0cnVlO1xuICAvLyDpnaLmnb/mmK/lkKblj6/mipjlj6BcbiAgQElucHV0KCkgY29sbGFwc2libGUgPSBmYWxzZTtcbiAgLy8g5piv5ZCm5oqY5Y+g5pS257ypXG4gIEBJbnB1dCgpIHNocmluayA9IGZhbHNlO1xuICAvLyDmipjlj6DmlLbnvKnlkI7lrr3luqZcbiAgQElucHV0KCkgc2hyaW5rV2lkdGggPSAzNjtcbiAgLy8g6Z2i5p2/5Yid5aeL5YyW5piv5ZCm5oqY5Y+g77yM6buY6K6k5LiN5oqY5Y+gXG4gIF9jb2xsYXBzZWQgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IGNvbGxhcHNlZChuZXdDb2xsYXBzZWQpIHtcbiAgICBpZiAodGhpcy5fY29sbGFwc2VkICE9PSBuZXdDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IG5ld0NvbGxhcHNlZDtcbiAgICAgIHRoaXMuc3BsaXR0ZXIucGFuZUNoYW5nZVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbGxhcHNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VkO1xuICB9XG4gIC8vIOmdnui+uee8mOmdouadv+aKmOWPoOaWueWQke+8jGJlZm9yZeWPqueUn+aIkOWQkeWJjeaKmOWPoOeahOaMiemSru+8jGFmdGVy55Sf5oiQ5ZCR5ZCO5oqY5Y+g5oyJ6ZKu77yMYm90aOeUn+aIkOS4pOS4qlxuICBASW5wdXQoKSBjb2xsYXBzZURpcmVjdGlvbjogQ29sbGFwc2VEaXJlY3Rpb24gPSAnYm90aCc7XG4gIHdpZHRoQmVmb3JlU2hyaW5rO1xuICAvLyBwYW5l5Yid5aeL5YyW5aSn5bCPXG4gIF9zaXplO1xuICBASW5wdXQoKVxuICBzZXQgc2l6ZShuZXdTaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IG5ld1NpemU7XG4gICAgdGhpcy53aWR0aEJlZm9yZVNocmluayA9IG5ld1NpemU7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdmbGV4LWJhc2lzJywgbmV3U2l6ZSk7XG4gICAgY29uc3QgcGFuZUZpeGVkQ2xhc3MgPSAnZGV2dWktc3BsaXR0ZXItcGFuZS1maXhlZCc7XG4gICAgaWYgKHRoaXMuc2l6ZSkge1xuICAgICAgLy8g6K6+572uIGZsZXgtZ3JvdyDlkowgZmxleC1zaHJpbmtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCBwYW5lRml4ZWRDbGFzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCBwYW5lRml4ZWRDbGFzcyk7XG4gICAgfVxuICB9XG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG4gIC8vIOWkp+Wwj+aUueWPmOS6i+S7tlxuICBAT3V0cHV0KCkgc2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIOaUtui1t+WSjOWxleW8gOS6i+S7tlxuICBAT3V0cHV0KCkgY29sbGFwc2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8g5pS257yp5ZKM5bGV5byA5LqL5Lu2XG4gIEBPdXRwdXQoKSBzaHJpbmtTdGF0dXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXZ1aS1zcGxpdHRlci1wYW5lJykgcGFuZUNsYXNzID0gdHJ1ZTtcblxuICBvcmllbnRhdGlvbjogU3BsaXR0ZXJPcmllbnRhdGlvbjsgLy8g5YiG5Ymy5p2h5pa55ZCRXG4gIF9vcmRlciA9IDA7IC8vIGZsZXjluIPlsYDkuItwYW5l5L2N572uXG4gIGVsZW1lbnQ7IC8vIG5hdGl2ZUVsZW1lbnTlj6Xmn4RcblxuICBzZXQgb3JkZXIocGFuZU9yZGVyKSB7XG4gICAgdGhpcy5fb3JkZXIgPSBwYW5lT3JkZXI7XG4gICAgdGhpcy5zZXRPcmRlclN0eWxlcygpO1xuICB9XG4gIGdldCBvcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3JkZXI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNwbGl0dGVyOiBTcGxpdHRlclNlcnZpY2UsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoKGNoYW5nZXMuY29sbGFwc2libGUgJiYgIWNoYW5nZXMuY29sbGFwc2libGUuaXNGaXJzdENoYW5nZSgpKSB8fCAoY2hhbmdlcy5yZXNpemFibGUgJiYgIWNoYW5nZXMucmVzaXphYmxlLmlzRmlyc3RDaGFuZ2UoKSkpIHtcbiAgICAgIHRoaXMuc3BsaXR0ZXIucGFuZUNoYW5nZVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvLyDorr7nva5vcmRlclxuICBzZXRPcmRlclN0eWxlcygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudCwgJ29yZGVyJywgdGhpcy5vcmRlcik7XG4gIH1cblxuICAvLyDojrflj5blvZPliY1wYW5l5aSn5bCPXG4gIGdldCBjb21wdXRlZFNpemUoKSB7XG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIOaUtui1t+aXtumakOiXj+W9k+WJjXBhbmVcbiAgdG9nZ2xlQ29sbGFwc2VDbGFzcygpIHtcbiAgICBjb25zdCBwYW5lSGlkZGVuQ2xhc3MgPSAnZGV2dWktc3BsaXR0ZXItcGFuZS1oaWRkZW4nO1xuXG4gICAgaWYgKCF0aGlzLl9jb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCBwYW5lSGlkZGVuQ2xhc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudCwgcGFuZUhpZGRlbkNsYXNzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29sbGFwc2VkICYmIHRoaXMuc2hyaW5rKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudCwgcGFuZUhpZGRlbkNsYXNzKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50LCAnZmxleC1iYXNpcycsIGAke3RoaXMuc2hyaW5rV2lkdGh9cHhgKTtcbiAgICAgIHRoaXMuc2hyaW5rU3RhdHVzQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50LCAnZmxleC1iYXNpcycsIHRoaXMud2lkdGhCZWZvcmVTaHJpbmspO1xuICAgICAgdGhpcy5zaHJpbmtTdGF0dXNDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g5pS26LW35pe255So5LqO5pS55Y+Y55u46YK7cGFuZeeahGZsZXgtZ3Jvd+WxnuaAp+adpeaUueWPmOmdnuiHqumAguW6lHBhbmXnmoRzaXplXG4gIHRvZ2dsZU5lYXJQYW5lRmxleEdyb3coY29sbGFwc2VkKSB7XG4gICAgY29uc3QgZmxleEdyb3dDbGFzcyA9ICdkZXZ1aS1zcGxpdHRlci1wYW5lLWdyb3cnO1xuICAgIGNvbnN0IGhhc0ZsZXhHcm93Q2xhc3MgPSB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGZsZXhHcm93Q2xhc3MpO1xuICAgIGlmIChoYXNGbGV4R3Jvd0NsYXNzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudCwgZmxleEdyb3dDbGFzcyk7XG4gICAgfSBlbHNlIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCBmbGV4R3Jvd0NsYXNzKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgLy8g6KeG5Zu+5qOA5p+l5a6M5a+5cmVzaXplYWJsZSBwYW5l6K6+572uZmxleOWxnuaAp1xuICAgIGlmICghdGhpcy5zaXplICYmICF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsICdkZXZ1aS1zcGxpdHRlci1wYW5lLWZpeGVkJyk7XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=