UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

415 lines 42.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, QueryList, ViewChild, ElementRef, HostBinding, TemplateRef, EventEmitter, ContentChildren, ViewEncapsulation } from '@angular/core'; import { TabPaneComponent } from './tab-pane.component'; export class TabsComponent { constructor() { this.prefixCls = 'am-tabs'; this.selectedKey = 0; this.keyToSelect = 0; this.paneMoveStyle = 'translate3d(0, 0, 0)'; this._startTime = 0; this._startPosition = 0; this._velocityThreshold = 0.3; this._tabDirection = 'horizontal'; this._tabBarPosition = 'top'; this.page = 5; this.swipeable = true; this.useOnPan = true; this.animated = true; this.distanceToChangeTab = 0.3; this.tabTitleSize = 0; this.tabBarActiveTextColor = ''; this.tabBarInactiveTextColor = ''; this.renderTabBar = null; this.tabBarBackgroundColor = '#FFF'; this.prerenderingSiblingsNumber = -1; this.tabBarTextStyle = {}; /** * should be removed when https://github.com/angular/angular/issues/20810 resolved * */ this.tabPanesContent = null; this.onChange = new EventEmitter(); this.onTabClick = new EventEmitter(); this.amTabs = true; this.amTabsTop = true; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = false; this.amTabsVertical = false; this.amTabsHorizontal = true; } /** * @return {?} */ get activeTab() { return this.selectedKey; } /** * @param {?} value * @return {?} */ set activeTab(value) { this.keyToSelect = value; } /** * @return {?} */ get tabBarPosition() { return this._tabBarPosition; } /** * @param {?} position * @return {?} */ set tabBarPosition(position) { this._tabBarPosition = position; switch (position) { case 'top': this.amTabsTop = true; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = false; break; case 'left': this.amTabsTop = false; this.amTabsLeft = true; this.amTabsRight = false; this.amTabsBottom = false; break; case 'bottom': this.amTabsTop = false; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = true; break; case 'right': this.amTabsTop = false; this.amTabsLeft = false; this.amTabsRight = true; this.amTabsBottom = false; break; default: break; } } /** * @return {?} */ get tabDirection() { return this._tabDirection; } /** * @param {?} direction * @return {?} */ set tabDirection(direction) { this._tabDirection = direction; switch (direction) { case 'horizontal': this.amTabsHorizontal = true; this.amTabsVertical = false; break; case 'vertical': this.amTabsHorizontal = false; this.amTabsVertical = true; break; default: break; } } /** * @param {?} index * @return {?} */ clickTab(index) { if (this.selectedKey !== index) { this.keyToSelect = index; this.onTabClick.emit({ index: this.keyToSelect }); } } /** * @return {?} */ getCurrentTabPanes() { return this.tabPanesContent || this.tabPanes; } /** * @param {?} event * @return {?} */ onTouchStart(event) { this._startTime = event.timeStamp; if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX; } else if ('vertical' === this._tabDirection) { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY; } } } /** * @param {?} event * @return {?} */ onTouchMove(event) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { /** @type {?} */ const distance = event.changedTouches[0].clientX - this._startPosition; if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) { return; } else if (distance > 0 && this.activeTab === 0) { return; } // velocity 小于阈值才认为是pan操作 if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && this.useOnPan && this.swipeable && this.animated) { this.paneMoveStyle = 'translate3d(calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px), 0, 0 )'; } } else if ('vertical' === this._tabDirection) { /** @type {?} */ const distance = event.changedTouches[0].clientY - this._startPosition; if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) { return; } else if (distance > 0 && this.activeTab === 0) { return; } if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && this.useOnPan && this.swipeable && this.animated) { this.paneMoveStyle = 'translate3d(0, calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px, 0 )'; } } } } /** * @param {?} event * @return {?} */ onTouchEnd(event) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { /** @type {?} */ const distance = event.changedTouches[0].clientX - this._startPosition; /** @type {?} */ const distanceToChangeTabPx = this.tabContent.nativeElement.offsetWidth * this.distanceToChangeTab; if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) || (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold && (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) { if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) { this.keyToSelect++; } else if (distance > 0 && this.activeTab > 0) { this.keyToSelect--; } } this.paneMoveStyle = 'translate3d(-' + this.selectedKey * 100 + '%, 0, 0 )'; } else if ('vertical' === this._tabDirection) { /** @type {?} */ const distance = event.changedTouches[0].clientY - this._startPosition; /** @type {?} */ const distanceToChangeTabPx = this.tabContent.nativeElement.offsetHeight * this.distanceToChangeTab; if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) || (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold && (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) { if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) { this.keyToSelect++; } else if (distance > 0 && this.activeTab > 0) { this.keyToSelect--; } } this.paneMoveStyle = 'translate3d(0, -' + this.selectedKey * 100 + '%, 0 )'; } } } /** * @return {?} */ ngAfterContentInit() { this.selectTabPane(this.keyToSelect); this.selectedKey = this.keyToSelect; } /** * @return {?} */ ngDoCheck() { if (this.keyToSelect !== this.selectedKey && this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { this.selectTabPane(this.keyToSelect); this.selectedKey = this.keyToSelect; this.onChange.emit({ index: this.selectedKey }); } } /** * @private * @param {?} index * @return {?} */ selectTabPane(index) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { /** @type {?} */ const actualKeyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0)); if ('horizontal' === this._tabDirection) { this.paneMoveStyle = 'translate3d(-' + actualKeyToSelect * 100 + '%, 0, 0 )'; } else if ('vertical' === this._tabDirection) { this.paneMoveStyle = 'translate3d(0, -' + actualKeyToSelect * 100 + '%, 0 )'; } } } /** * @private * @param {?} deltaDistance * @param {?} deltaTime * @return {?} */ getVelocity(deltaDistance, deltaTime) { return Math.abs(deltaDistance / deltaTime); } } TabsComponent.decorators = [ { type: Component, args: [{ selector: 'Tabs, nzm-tabs', template: "<ng-container>\n <ng-template\n *ngIf=\"'top' === tabBarPosition || 'left' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n >\n </ng-template>\n <div\n #TabContent\n class=\"{{ prefixCls }}-content-wrap\"\n [ngClass]=\"{ 'am-tabs-content-wrap-animated': animated }\"\n [ngStyle]=\"{ transform: paneMoveStyle, webkitTransform: paneMoveStyle }\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n >\n <div\n tab-pane-body\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n [content]=\"tabPane.content\"\n [active]=\"i === selectedKey\"\n [prerender]=\"\n prerenderingSiblingsNumber < 0 ||\n (selectedKey - i <= prerenderingSiblingsNumber && selectedKey - i + prerenderingSiblingsNumber >= 0)\n \"\n ></div>\n </div>\n <ng-template\n *ngIf=\"'bottom' === tabBarPosition || 'right' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n ></ng-template>\n</ng-container>\n\n<ng-template #renderDefaultTabBar>\n <DefaultTabBar\n #DefaultTabBar\n [page]=\"page\"\n [animated]=\"animated\"\n [activeTab]=\"selectedKey\"\n [tabTitleSize]=\"tabTitleSize\"\n [tabBarPosition]=\"tabBarPosition\"\n [tabBarUnderlineStyle]=\"tabBarUnderlineStyle\"\n [tabBarBackgroundColor]=\"tabBarBackgroundColor\"\n >\n <div\n #TabTitle\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n class=\"{{ prefixCls }}-default-bar-tab\"\n [ngClass]=\"{\n 'am-tabs-default-bar-tab-active': i === selectedKey,\n 'am-tabs-default-bar-tab-disabled': tabPane.disabled\n }\"\n [ngStyle]=\"tabBarTextStyle\"\n [style.color]=\"i === selectedKey ? tabBarActiveTextColor : tabBarInactiveTextColor\"\n (click)=\"clickTab(i)\"\n >\n <ng-container *ngIf=\"tabPane.isTitleString; else titleTemplate\">\n {{ tabPane.title }}\n </ng-container>\n <ng-template #titleTemplate>\n <ng-template [ngTemplateOutlet]=\"tabPane.title\"></ng-template>\n </ng-template>\n </div>\n </DefaultTabBar>\n</ng-template>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ TabsComponent.ctorParameters = () => []; TabsComponent.propDecorators = { tabPanes: [{ type: ContentChildren, args: [TabPaneComponent, { descendants: false },] }], tabContent: [{ type: ViewChild, args: ['TabContent', { static: true },] }], defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar', { static: false },] }], page: [{ type: Input }], swipeable: [{ type: Input }], useOnPan: [{ type: Input }], animated: [{ type: Input }], tabBarUnderlineStyle: [{ type: Input }], distanceToChangeTab: [{ type: Input }], tabTitleSize: [{ type: Input }], tabBarActiveTextColor: [{ type: Input }], tabBarInactiveTextColor: [{ type: Input }], renderTabBar: [{ type: Input }], tabBarBackgroundColor: [{ type: Input }], prerenderingSiblingsNumber: [{ type: Input }], tabBarTextStyle: [{ type: Input }], tabPanesContent: [{ type: Input }], activeTab: [{ type: Input }], tabBarPosition: [{ type: Input }], tabDirection: [{ type: Input }], onChange: [{ type: Output }], onTabClick: [{ type: Output }], amTabs: [{ type: HostBinding, args: ['class.am-tabs',] }], amTabsTop: [{ type: HostBinding, args: ['class.am-tabs-top',] }], amTabsLeft: [{ type: HostBinding, args: ['class.am-tabs-left',] }], amTabsRight: [{ type: HostBinding, args: ['class.am-tabs-right',] }], amTabsBottom: [{ type: HostBinding, args: ['class.am-tabs-bottom',] }], amTabsVertical: [{ type: HostBinding, args: ['class.am-tabs-vertical',] }], amTabsHorizontal: [{ type: HostBinding, args: ['class.am-tabs-horizontal',] }] }; if (false) { /** @type {?} */ TabsComponent.prototype.prefixCls; /** @type {?} */ TabsComponent.prototype.selectedKey; /** @type {?} */ TabsComponent.prototype.keyToSelect; /** @type {?} */ TabsComponent.prototype.paneMoveStyle; /** * @type {?} * @private */ TabsComponent.prototype._startTime; /** * @type {?} * @private */ TabsComponent.prototype._startPosition; /** * @type {?} * @private */ TabsComponent.prototype._velocityThreshold; /** * @type {?} * @private */ TabsComponent.prototype._tabDirection; /** * @type {?} * @private */ TabsComponent.prototype._tabBarPosition; /** @type {?} */ TabsComponent.prototype.tabPanes; /** @type {?} */ TabsComponent.prototype.tabContent; /** @type {?} */ TabsComponent.prototype.defaultTabBar; /** @type {?} */ TabsComponent.prototype.page; /** @type {?} */ TabsComponent.prototype.swipeable; /** @type {?} */ TabsComponent.prototype.useOnPan; /** @type {?} */ TabsComponent.prototype.animated; /** @type {?} */ TabsComponent.prototype.tabBarUnderlineStyle; /** @type {?} */ TabsComponent.prototype.distanceToChangeTab; /** @type {?} */ TabsComponent.prototype.tabTitleSize; /** @type {?} */ TabsComponent.prototype.tabBarActiveTextColor; /** @type {?} */ TabsComponent.prototype.tabBarInactiveTextColor; /** @type {?} */ TabsComponent.prototype.renderTabBar; /** @type {?} */ TabsComponent.prototype.tabBarBackgroundColor; /** @type {?} */ TabsComponent.prototype.prerenderingSiblingsNumber; /** @type {?} */ TabsComponent.prototype.tabBarTextStyle; /** * should be removed when https://github.com/angular/angular/issues/20810 resolved * * @type {?} */ TabsComponent.prototype.tabPanesContent; /** @type {?} */ TabsComponent.prototype.onChange; /** @type {?} */ TabsComponent.prototype.onTabClick; /** @type {?} */ TabsComponent.prototype.amTabs; /** @type {?} */ TabsComponent.prototype.amTabsTop; /** @type {?} */ TabsComponent.prototype.amTabsLeft; /** @type {?} */ TabsComponent.prototype.amTabsRight; /** @type {?} */ TabsComponent.prototype.amTabsBottom; /** @type {?} */ TabsComponent.prototype.amTabsVertical; /** @type {?} */ TabsComponent.prototype.amTabsHorizontal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUXhELE1BQU0sT0FBTyxhQUFhO0lBa0l4QjtRQWpJQSxjQUFTLEdBQVcsU0FBUyxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQVcsc0JBQXNCLENBQUM7UUFFdkMsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQix1QkFBa0IsR0FBVyxHQUFHLENBQUM7UUFDakMsa0JBQWEsR0FBaUIsWUFBWSxDQUFDO1FBQzNDLG9CQUFlLEdBQXVCLEtBQUssQ0FBQztRQVdwRCxTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBRWpCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFMUIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUV6QixhQUFRLEdBQVksSUFBSSxDQUFDO1FBSXpCLHdCQUFtQixHQUFXLEdBQUcsQ0FBQztRQUVsQyxpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUV6QiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFFbkMsNEJBQXVCLEdBQVcsRUFBRSxDQUFDO1FBRXJDLGlCQUFZLEdBQXNCLElBQUksQ0FBQztRQUV2QywwQkFBcUIsR0FBVyxNQUFNLENBQUM7UUFFdkMsK0JBQTBCLEdBQVcsQ0FB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ZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRG9DaGVjayxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBUZW1wbGF0ZVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiUGFuZUNvbXBvbmVudCB9IGZyb20gJy4vdGFiLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYkRpcmVjdGlvbiwgVGFiQmFyUG9zaXRpb25UeXBlLCBUYWJzT25DaGFuZ2VFdmVudCB9IGZyb20gJy4vUHJvcHNUeXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGFicywgbnptLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGFic0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10YWJzJztcbiAgc2VsZWN0ZWRLZXk6IG51bWJlciA9IDA7XG4gIGtleVRvU2VsZWN0OiBudW1iZXIgPSAwO1xuICBwYW5lTW92ZVN0eWxlOiBzdHJpbmcgPSAndHJhbnNsYXRlM2QoMCwgMCwgMCknO1xuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfdmVsb2NpdHlUaHJlc2hvbGQ6IG51bWJlciA9IDAuMztcbiAgcHJpdmF0ZSBfdGFiRGlyZWN0aW9uOiBUYWJEaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCc7XG4gIHByaXZhdGUgX3RhYkJhclBvc2l0aW9uOiBUYWJCYXJQb3NpdGlvblR5cGUgPSAndG9wJztcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmVDb21wb25lbnQsIHsgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gIHRhYlBhbmVzOiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgnVGFiQ29udGVudCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHRhYkNvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ0RlZmF1bHRUYWJCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgZGVmYXVsdFRhYkJhcjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBwYWdlOiBudW1iZXIgPSA1O1xuICBASW5wdXQoKVxuICBzd2lwZWFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICB1c2VPblBhbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGFuaW1hdGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdGFiQmFyVW5kZXJsaW5lU3R5bGU6IG9iamVjdDtcbiAgQElucHV0KClcbiAgZGlzdGFuY2VUb0NoYW5nZVRhYjogbnVtYmVyID0gMC4zO1xuICBASW5wdXQoKVxuICB0YWJUaXRsZVNpemU6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckFjdGl2ZVRleHRDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckluYWN0aXZlVGV4dENvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgcmVuZGVyVGFiQmFyOiBUZW1wbGF0ZVJlZjx2b2lkPiA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNGRkYnO1xuICBASW5wdXQoKVxuICBwcmVyZW5kZXJpbmdTaWJsaW5nc051bWJlcjogbnVtYmVyID0gLTE7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclRleHRTdHlsZTogb2JqZWN0ID0ge307XG4gIC8qKiBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIwODEwIHJlc29sdmVkICoqL1xuICBASW5wdXQoKVxuICB0YWJQYW5lc0NvbnRlbnQ6IFF1ZXJ5TGlzdDxUYWJQYW5lQ29tcG9uZW50PiA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVUYWIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEtleTtcbiAgfVxuICBzZXQgYWN0aXZlVGFiKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmtleVRvU2VsZWN0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRhYkJhclBvc2l0aW9uKCk6IFRhYkJhclBvc2l0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkJhclBvc2l0aW9uO1xuICB9XG4gIHNldCB0YWJCYXJQb3NpdGlvbihwb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlKSB7XG4gICAgdGhpcy5fdGFiQmFyUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0YWJEaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkRpcmVjdGlvbjtcbiAgfVxuICBzZXQgdGFiRGlyZWN0aW9uKGRpcmVjdGlvbjogVGFiRGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fdGFiRGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgICAgdGhpcy5hbVRhYnNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNWZXJ0aWNhbCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgICAgdGhpcy5hbVRhYnNIb3Jpem9udGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYnNPbkNoYW5nZUV2ZW50PigpO1xuICBAT3V0cHV0KClcbiAgb25UYWJDbGljazogRXZlbnRFbWl0dGVyPFRhYnNPbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFic09uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzJylcbiAgYW1UYWJzOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXRvcCcpXG4gIGFtVGFic1RvcDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1sZWZ0JylcbiAgYW1UYWJzTGVmdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtcmlnaHQnKVxuICBhbVRhYnNSaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtYm90dG9tJylcbiAgYW1UYWJzQm90dG9tOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy12ZXJ0aWNhbCcpXG4gIGFtVGFic1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1ob3Jpem9udGFsJylcbiAgYW1UYWJzSG9yaXpvbnRhbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNsaWNrVGFiKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEtleSAhPT0gaW5kZXgpIHtcbiAgICAgIHRoaXMua2V5VG9TZWxlY3QgPSBpbmRleDtcbiAgICAgIHRoaXMub25UYWJDbGljay5lbWl0KHsgaW5kZXg6IHRoaXMua2V5VG9TZWxlY3QgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFRhYlBhbmVzKCk6IFF1ZXJ5TGlzdDxUYWJQYW5lQ29tcG9uZW50PiB7XG4gICAgcmV0dXJuIHRoaXMudGFiUGFuZXNDb250ZW50IHx8IHRoaXMudGFiUGFuZXM7XG4gIH1cblxuICBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBldmVudC50aW1lU3RhbXA7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9XG4gICAgICAgICAgZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiID09PSB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZlbG9jaXR5IOWwj+S6jumYiOWAvOaJjeiupOS4uuaYr3BhbuaTjeS9nFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgIHRoaXMudXNlT25QYW4gJiZcbiAgICAgICAgICB0aGlzLnN3aXBlYWJsZSAmJlxuICAgICAgICAgIHRoaXMuYW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKGNhbGMoLScgKyB0aGlzLnNlbGVjdGVkS2V5ICogMTAwICsgJyUgKyAnICsgZGlzdGFuY2UgKyAncHgpLCAwLCAwICknO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiID09PSB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgdGhpcy51c2VPblBhbiAmJlxuICAgICAgICAgIHRoaXMuc3dpcGVhYmxlICYmXG4gICAgICAgICAgdGhpcy5hbmltYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgY2FsYygtJyArIHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDAgKyAnJSArICcgKyBkaXN0YW5jZSArICdweCwgMCApJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hFbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggPSB0aGlzLnRhYkNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIHRoaXMuZGlzdGFuY2VUb0NoYW5nZVRhYjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy51c2VPblBhbiAmJiB0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHgpKSB8fFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpID4gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA8IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdCsrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoLScgKyB0aGlzLnNlbGVjdGVkS2V5ICogMTAwICsgJyUsIDAsIDAgKSc7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggPSB0aGlzLnRhYkNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLmRpc3RhbmNlVG9DaGFuZ2VUYWI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMudXNlT25QYW4gJiYgdGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4KSkgfHxcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA+IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4IC8gMikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPCB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclLCAwICknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdFRhYlBhbmUodGhpcy5rZXlUb1NlbGVjdCk7XG4gICAgdGhpcy5zZWxlY3RlZEtleSA9IHRoaXMua2V5VG9TZWxlY3Q7XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMua2V5VG9TZWxlY3QgIT09IHRoaXMuc2VsZWN0ZWRLZXkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiUGFuZSh0aGlzLmtleVRvU2VsZWN0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmtleVRvU2VsZWN0O1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHsgaW5kZXg6IHRoaXMuc2VsZWN0ZWRLZXkgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RUYWJQYW5lKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGFjdHVhbEtleVRvU2VsZWN0ID0gTWF0aC5taW4odGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxLCBNYXRoLm1heChpbmRleCB8fCAwLCAwKSk7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKC0nICsgYWN0dWFsS2V5VG9TZWxlY3QgKiAxMDAgKyAnJSwgMCwgMCApJztcbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAtJyArIGFjdHVhbEtleVRvU2VsZWN0ICogMTAwICsgJyUsIDAgKSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWZWxvY2l0eShkZWx0YURpc3RhbmNlLCBkZWx0YVRpbWUpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZGVsdGFEaXN0YW5jZSAvIGRlbHRhVGltZSk7XG4gIH1cbn1cbiJdfQ==