ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
421 lines • 42.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,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',] }],
tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe',] }],
defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar',] }],
tabsBarContainer: [{ type: ViewChild, args: ['TabsBarContainer',] }],
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.tabsBarSwipe;
/** @type {?} */
TabsComponent.prototype.defaultTabBar;
/** @type {?} */
TabsComponent.prototype.tabsBarContainer;
/** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUXhELE1BQU0sT0FBTyxhQUFhO0lBc0l4QjtRQXJJQSxjQUFTLEdBQVcsU0FBUyxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQVcsc0JBQXNCLENBQUM7UUFFdkMsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQix1QkFBa0IsR0FBVyxHQUFHLENBQUM7UUFDakMsa0JBQWEsR0FBaUIsWUFBWSxDQUFDO1FBQzNDLG9CQUFlLEdBQXVCLEtBQUssQ0FBQztRQWVwRCxTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBRWpCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFMUIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUV6QixhQUFRLEdBQVksSUFBSSxDQUFDO1FBSXpCLHdCQUFtQixHQUFXLEdBQUcsQ0FBQztRQUVsQyxpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUV6QiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFFbkMsNEJBQXVCLEdBQVcsRUFBRSxDQUFDO1FBRXJDLGlCQUFZLEdBQXNCLElBQUksQ0FBQztRQUV2QywwQkFBcUIsR0FBVyxNQUFNLENBQUM7UUFFdkMsK0JBQTBCLEdBQVcsQ0FB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eUNBQ2lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBEb0NoZWNrLFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIFRlbXBsYXRlUmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi90YWItcGFuZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFiRGlyZWN0aW9uLCBUYWJCYXJQb3NpdGlvblR5cGUsIFRhYnNPbkNoYW5nZUV2ZW50IH0gZnJvbSAnLi9Qcm9wc1R5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUYWJzLCBuem0tdGFicycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXRhYnMnO1xuICBzZWxlY3RlZEtleTogbnVtYmVyID0gMDtcbiAga2V5VG9TZWxlY3Q6IG51bWJlciA9IDA7XG4gIHBhbmVNb3ZlU3R5bGU6IHN0cmluZyA9ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSc7XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9zdGFydFBvc2l0aW9uOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF92ZWxvY2l0eVRocmVzaG9sZDogbnVtYmVyID0gMC4zO1xuICBwcml2YXRlIF90YWJEaXJlY3Rpb246IFRhYkRpcmVjdGlvbiA9ICdob3Jpem9udGFsJztcbiAgcHJpdmF0ZSBfdGFiQmFyUG9zaXRpb246IFRhYkJhclBvc2l0aW9uVHlwZSA9ICd0b3AnO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFiUGFuZUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgdGFiUGFuZXM6IFF1ZXJ5TGlzdDxUYWJQYW5lQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCdUYWJDb250ZW50JylcbiAgdGFiQ29udGVudDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnVGFic0JhclN3aXBlJylcbiAgdGFic0JhclN3aXBlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdEZWZhdWx0VGFiQmFyJylcbiAgZGVmYXVsdFRhYkJhcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnVGFic0JhckNvbnRhaW5lcicpXG4gIHRhYnNCYXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgcGFnZTogbnVtYmVyID0gNTtcbiAgQElucHV0KClcbiAgc3dpcGVhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdXNlT25QYW46IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBhbmltYXRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclVuZGVybGluZVN0eWxlOiBvYmplY3Q7XG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9DaGFuZ2VUYWI6IG51bWJlciA9IDAuMztcbiAgQElucHV0KClcbiAgdGFiVGl0bGVTaXplOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICB0YWJCYXJBY3RpdmVUZXh0Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICB0YWJCYXJJbmFjdGl2ZVRleHRDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHJlbmRlclRhYkJhcjogVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuICBASW5wdXQoKVxuICB0YWJCYXJCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjRkZGJztcbiAgQElucHV0KClcbiAgcHJlcmVuZGVyaW5nU2libGluZ3NOdW1iZXI6IG51bWJlciA9IC0xO1xuICBASW5wdXQoKVxuICB0YWJCYXJUZXh0U3R5bGU6IG9iamVjdCA9IHt9O1xuICAvKiogc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDgxMCByZXNvbHZlZCAqKi9cbiAgQElucHV0KClcbiAgdGFiUGFuZXNDb250ZW50OiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD4gPSBudWxsO1xuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlVGFiKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRLZXk7XG4gIH1cbiAgc2V0IGFjdGl2ZVRhYih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5rZXlUb1NlbGVjdCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0YWJCYXJQb3NpdGlvbigpOiBUYWJCYXJQb3NpdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90YWJCYXJQb3NpdGlvbjtcbiAgfVxuICBzZXQgdGFiQmFyUG9zaXRpb24ocG9zaXRpb246IFRhYkJhclBvc2l0aW9uVHlwZSkge1xuICAgIHRoaXMuX3RhYkJhclBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGFiRGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90YWJEaXJlY3Rpb247XG4gIH1cbiAgc2V0IHRhYkRpcmVjdGlvbihkaXJlY3Rpb246IFRhYkRpcmVjdGlvbikge1xuICAgIHRoaXMuX3RhYkRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGFic09uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpXG4gIG9uVGFiQ2xpY2s6IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYnNPbkNoYW5nZUV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicycpXG4gIGFtVGFiczogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy10b3AnKVxuICBhbVRhYnNUb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtbGVmdCcpXG4gIGFtVGFic0xlZnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXJpZ2h0JylcbiAgYW1UYWJzUmlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWJvdHRvbScpXG4gIGFtVGFic0JvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtdmVydGljYWwnKVxuICBhbVRhYnNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtaG9yaXpvbnRhbCcpXG4gIGFtVGFic0hvcml6b250YWw6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjbGlja1RhYihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRLZXkgIT09IGluZGV4KSB7XG4gICAgICB0aGlzLmtleVRvU2VsZWN0ID0gaW5kZXg7XG4gICAgICB0aGlzLm9uVGFiQ2xpY2suZW1pdCh7IGluZGV4OiB0aGlzLmtleVRvU2VsZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRUYWJQYW5lcygpOiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD4ge1xuICAgIHJldHVybiB0aGlzLnRhYlBhbmVzQ29udGVudCB8fCB0aGlzLnRhYlBhbmVzO1xuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gZXZlbnQudGltZVN0YW1wO1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB2ZWxvY2l0eSDlsI/kuo7pmIjlgLzmiY3orqTkuLrmmK9wYW7mk43kvZxcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICB0aGlzLnVzZU9uUGFuICYmXG4gICAgICAgICAgdGhpcy5zd2lwZWFibGUgJiZcbiAgICAgICAgICB0aGlzLmFuaW1hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZChjYWxjKC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclICsgJyArIGRpc3RhbmNlICsgJ3B4KSwgMCwgMCApJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgIHRoaXMudXNlT25QYW4gJiZcbiAgICAgICAgICB0aGlzLnN3aXBlYWJsZSAmJlxuICAgICAgICAgIHRoaXMuYW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIGNhbGMoLScgKyB0aGlzLnNlbGVjdGVkS2V5ICogMTAwICsgJyUgKyAnICsgZGlzdGFuY2UgKyAncHgsIDAgKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRvdWNoRW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiB0aGlzLmRpc3RhbmNlVG9DaGFuZ2VUYWI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMudXNlT25QYW4gJiYgdGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4KSkgfHxcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA+IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4IC8gMikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPCB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclLCAwLCAwICknO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5kaXN0YW5jZVRvQ2hhbmdlVGFiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZU9uUGFuICYmIHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCkpIHx8XG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPiB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCAvIDIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiIDwgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0LS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAtJyArIHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDAgKyAnJSwgMCApJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RUYWJQYW5lKHRoaXMua2V5VG9TZWxlY3QpO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmtleVRvU2VsZWN0O1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmtleVRvU2VsZWN0ICE9PSB0aGlzLnNlbGVjdGVkS2V5ICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdFRhYlBhbmUodGhpcy5rZXlUb1NlbGVjdCk7XG4gICAgICB0aGlzLnNlbGVjdGVkS2V5ID0gdGhpcy5rZXlUb1NlbGVjdDtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7IGluZGV4OiB0aGlzLnNlbGVjdGVkS2V5IH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0VGFiUGFuZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhY3R1YWxLZXlUb1NlbGVjdCA9IE1hdGgubWluKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSwgTWF0aC5tYXgoaW5kZXggfHwgMCwgMCkpO1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgtJyArIGFjdHVhbEtleVRvU2VsZWN0ICogMTAwICsgJyUsIDAsIDAgKSc7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgLScgKyBhY3R1YWxLZXlUb1NlbGVjdCAqIDEwMCArICclLCAwICknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVsb2NpdHkoZGVsdGFEaXN0YW5jZSwgZGVsdGFUaW1lKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGRlbHRhRGlzdGFuY2UgLyBkZWx0YVRpbWUpO1xuICB9XG59XG4iXX0=