ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
459 lines • 40.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, HostBinding, Output, EventEmitter, ElementRef } from '@angular/core';
export class DrawerComponent {
/**
* @param {?} _el
*/
constructor(_el) {
this._el = _el;
this.prefixCls = 'am-drawer';
this.sidebarStyleFinal = {};
this.contentStyleFinal = {};
this.overlayStyleFinal = {};
this.sidebarWidth = 0;
this.sidebarHeight = 0;
this.sidebarTop = 0;
this.dragHandleTop = 0;
this.touchIdentifier = null;
this.touchStartX = null;
this.touchStartY = null;
this.touchCurrentX = null;
this.touchCurrentY = null;
this.touchSupported = typeof window === 'object' && 'ontouchstart' in window;
this._docked = false;
this._open = false;
this._position = 'left';
this.sidebarStyle = {};
this.contentStyle = {};
this.overlayStyle = {};
this.dragHandleStyle = {};
this.transitions = true;
this.touch = true;
this.enableDragHandle = false;
this.dragToggleDistance = 30;
this.onOpenChange = new EventEmitter();
this.am = true;
this.left = this._position === 'left';
this.right = this._position === 'right';
this.top = this._position == 'top';
this.bottom = this._position == 'bottom';
this.dockedCls = this._docked;
this.openCls = this._open;
}
/**
* @return {?}
*/
get docked() {
return this._docked;
}
/**
* @param {?} v
* @return {?}
*/
set docked(v) {
this._docked = v;
this.dockedCls = v;
}
/**
* @return {?}
*/
get open() {
return this._open;
}
/**
* @param {?} v
* @return {?}
*/
set open(v) {
this._open = v;
this.openCls = v;
}
/**
* @param {?} v
* @return {?}
*/
set position(v) {
this._position = v;
this.right = false;
this.left = false;
this.top = false;
this.bottom = false;
switch (v) {
case 'right':
this.right = true;
break;
case 'left':
this.left = true;
break;
case 'top':
this.top = true;
break;
case 'bottom':
this.bottom = true;
break;
}
}
/**
* @return {?}
*/
onOverlayClicked() {
if (this._open) {
this.onOpenChange.emit(true);
}
}
/**
* @return {?}
*/
isTouching() {
return this.touchIdentifier !== null;
}
/**
* @param {?} event
* @return {?}
*/
onTouchStart(event) {
/** @type {?} */
const touch = event.changedTouches[0];
this.touchIdentifier = touch.identifier;
this.touchStartX = touch.clientX;
this.touchStartY = touch.clientY;
this.touchCurrentX = touch.clientX;
this.touchCurrentY = touch.clientY;
}
/**
* @param {?} ev
* @return {?}
*/
onTouchMove(ev) {
for (let ind = 0; ind < ev.changedTouches.length; ind++) {
if (ev.changedTouches[ind].identifier === this.touchIdentifier) {
this.touchCurrentX = ev.changedTouches[ind].clientX;
this.touchCurrentY = ev.changedTouches[ind].clientY;
break;
}
}
this.update();
}
/**
* @return {?}
*/
onTouchEnd() {
/** @type {?} */
const touchWidth = this.touchSidebarWidth();
if (!this._open && touchWidth > this.dragToggleDistance) {
this.onOpenChange.emit(!this._open);
}
/** @type {?} */
const touchHeight = this.touchSidebarHeight();
if (!this._open && touchHeight > this.dragToggleDistance) {
this.onOpenChange.emit(!this._open);
}
this.touchIdentifier = null;
this.touchStartX = null;
this.touchStartY = null;
this.touchCurrentX = null;
this.touchCurrentY = null;
this.update();
}
/**
* @return {?}
*/
saveSidebarSize() {
/** @type {?} */
const sidebar = this._el.nativeElement.querySelector('#sidebar');
/** @type {?} */
const dragHandle = this._el.nativeElement.querySelector('#dragHandle');
/** @type {?} */
const width = sidebar.offsetWidth;
/** @type {?} */
const height = sidebar.offsetHeight;
/** @type {?} */
const sidebarTop = this.getOffset(sidebar).top;
/** @type {?} */
const dragHandleTop = this.getOffset(dragHandle).top;
if (width !== this.sidebarWidth) {
this.sidebarWidth = width;
}
if (height !== this.sidebarHeight) {
this.sidebarHeight = height;
}
if (sidebarTop !== this.sidebarTop) {
this.sidebarTop = sidebarTop;
}
if (dragHandleTop !== this.dragHandleTop) {
this.dragHandleTop = dragHandleTop;
}
}
/**
* @return {?}
*/
touchSidebarWidth() {
if (this._position === 'right') {
return Math.min(window.innerWidth - this.touchCurrentX, this.sidebarWidth);
}
if (this._position === 'left') {
return Math.min(this.touchCurrentX, this.sidebarWidth);
}
}
/**
* @return {?}
*/
touchSidebarHeight() {
if (this._position === 'bottom') {
return Math.min(this._el.nativeElement.offsetHeight - this.touchCurrentY + this._el.nativeElement.offsetTop, this.sidebarHeight);
}
if (this._position === 'top') {
return Math.min(this.touchCurrentY - this.dragHandleTop, this.sidebarHeight);
}
}
/**
* @param {?} __0
* @return {?}
*/
renderStyle({ sidebarStyle, isTouching, overlayStyle, contentStyle }) {
if (this._position === 'right' || this._position === 'left') {
sidebarStyle.transform = `translateX(0%)`;
sidebarStyle.WebkitTransform = `translateX(0%)`;
if (isTouching) {
/** @type {?} */
const percentage = this.touchSidebarWidth() / this.sidebarWidth;
// slide open to what we dragged
if (this._position === 'right') {
sidebarStyle.transform = `translateX(${(1 - percentage) * 100}%)`;
sidebarStyle.WebkitTransform = `translateX(${(1 - percentage) * 100}%)`;
}
if (this._position === 'left') {
sidebarStyle.transform = `translateX(-${(1 - percentage) * 100}%)`;
sidebarStyle.WebkitTransform = `translateX(-${(1 - percentage) * 100}%)`;
}
overlayStyle.opacity = percentage;
overlayStyle.visibility = 'visible';
}
if (contentStyle) {
contentStyle[this._position] = `${this.sidebarWidth}px`;
}
}
if (this._position === 'top' || this._position === 'bottom') {
sidebarStyle.transform = `translateY(0%)`;
sidebarStyle.WebkitTransform = `translateY(0%)`;
if (isTouching) {
/** @type {?} */
const percentage = this.touchSidebarHeight() / this.sidebarHeight;
if (this._position === 'bottom') {
sidebarStyle.transform = `translateY(${(1 - percentage) * 100}%)`;
sidebarStyle.WebkitTransform = `translateY(${(1 - percentage) * 100}%)`;
}
if (this._position === 'top') {
sidebarStyle.transform = `translateY(-${(1 - percentage) * 100}%)`;
sidebarStyle.WebkitTransform = `translateY(-${(1 - percentage) * 100}%)`;
}
overlayStyle.opacity = percentage;
overlayStyle.visibility = 'visible';
}
if (contentStyle) {
contentStyle[this._position] = `${this.sidebarHeight}px`;
}
}
}
/**
* @return {?}
*/
update() {
/** @type {?} */
const sidebarStyle = Object.assign({}, this.sidebarStyle);
/** @type {?} */
const contentStyle = Object.assign({}, this.contentStyle);
/** @type {?} */
const overlayStyle = Object.assign({}, this.overlayStyle);
if (this.isTouching()) {
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: true,
contentStyle: undefined,
overlayStyle: overlayStyle
});
}
else if (this._docked) {
this.dockedCls = true;
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: undefined,
contentStyle: contentStyle,
overlayStyle: undefined
});
}
else if (this._open) {
this.openCls = true;
this.renderStyle({
sidebarStyle: sidebarStyle,
isTouching: undefined,
contentStyle: undefined,
overlayStyle: undefined
});
overlayStyle.opacity = 1;
overlayStyle.visibility = 'visible';
}
if (this.isTouching() || !this.transitions) {
sidebarStyle.transition = 'none';
sidebarStyle.WebkitTransition = 'none';
contentStyle.transition = 'none';
overlayStyle.transition = 'none';
}
this.sidebarStyleFinal = sidebarStyle;
this.contentStyleFinal = contentStyle;
this.overlayStyleFinal = overlayStyle;
}
/**
* @param {?} ele
* @return {?}
*/
getOffset(ele) {
/** @type {?} */
let el = ele;
/** @type {?} */
let _x = 0;
/** @type {?} */
let _y = 0;
while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
/**
* @return {?}
*/
ngAfterViewChecked() {
if (!this.isTouching()) {
this.saveSidebarSize();
}
}
/**
* @return {?}
*/
ngOnChanges() {
this.update();
}
}
DrawerComponent.decorators = [
{ type: Component, args: [{
selector: 'Drawer, nzm-drawer',
template: "<div class=\"{{ prefixCls }}-sidebar\" [ngStyle]=\"sidebarStyleFinal\" id=\"sidebar\">\n <ng-template [ngTemplateOutlet]=\"sidebar\"></ng-template>\n</div>\n<div\n class=\"{{ prefixCls }}-overlay\"\n [ngStyle]=\"overlayStyleFinal\"\n role=\"presentation\"\n ref=\"overlay\"\n (click)=\"onOverlayClicked()\"\n></div>\n<div class=\"{{ prefixCls }}-content\" [ngStyle]=\"contentStyleFinal\" ref=\"content\">\n <div\n *ngIf=\"touch && touchSupported && !open && !docked && enableDragHandle\"\n id=\"dragHandle\"\n class=\"{{ prefixCls }}-draghandle\"\n [ngStyle]=\"dragHandleStyle\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd()\"\n (touchcancle)=\"onTouchEnd()\"\n ></div>\n <ng-content></ng-content>\n</div>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
DrawerComponent.ctorParameters = () => [
{ type: ElementRef }
];
DrawerComponent.propDecorators = {
sidebar: [{ type: Input }],
sidebarStyle: [{ type: Input }],
contentStyle: [{ type: Input }],
overlayStyle: [{ type: Input }],
dragHandleStyle: [{ type: Input }],
transitions: [{ type: Input }],
touch: [{ type: Input }],
enableDragHandle: [{ type: Input }],
dragToggleDistance: [{ type: Input }],
docked: [{ type: Input }],
open: [{ type: Input }],
position: [{ type: Input }],
onOpenChange: [{ type: Output }],
am: [{ type: HostBinding, args: ['class.am-drawer',] }],
left: [{ type: HostBinding, args: ['class.am-drawer-left',] }],
right: [{ type: HostBinding, args: ['class.am-drawer-right',] }],
top: [{ type: HostBinding, args: ['class.am-drawer-top',] }],
bottom: [{ type: HostBinding, args: ['class.am-drawer-bottom',] }],
dockedCls: [{ type: HostBinding, args: ['class.am-drawer-docked',] }],
openCls: [{ type: HostBinding, args: ['class.am-drawer-open',] }]
};
if (false) {
/** @type {?} */
DrawerComponent.prototype.prefixCls;
/** @type {?} */
DrawerComponent.prototype.sidebarStyleFinal;
/** @type {?} */
DrawerComponent.prototype.contentStyleFinal;
/** @type {?} */
DrawerComponent.prototype.overlayStyleFinal;
/** @type {?} */
DrawerComponent.prototype.sidebarWidth;
/** @type {?} */
DrawerComponent.prototype.sidebarHeight;
/** @type {?} */
DrawerComponent.prototype.sidebarTop;
/** @type {?} */
DrawerComponent.prototype.dragHandleTop;
/** @type {?} */
DrawerComponent.prototype.touchIdentifier;
/** @type {?} */
DrawerComponent.prototype.touchStartX;
/** @type {?} */
DrawerComponent.prototype.touchStartY;
/** @type {?} */
DrawerComponent.prototype.touchCurrentX;
/** @type {?} */
DrawerComponent.prototype.touchCurrentY;
/** @type {?} */
DrawerComponent.prototype.touchSupported;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype._docked;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype._open;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype._position;
/** @type {?} */
DrawerComponent.prototype.sidebar;
/** @type {?} */
DrawerComponent.prototype.sidebarStyle;
/** @type {?} */
DrawerComponent.prototype.contentStyle;
/** @type {?} */
DrawerComponent.prototype.overlayStyle;
/** @type {?} */
DrawerComponent.prototype.dragHandleStyle;
/** @type {?} */
DrawerComponent.prototype.transitions;
/** @type {?} */
DrawerComponent.prototype.touch;
/** @type {?} */
DrawerComponent.prototype.enableDragHandle;
/** @type {?} */
DrawerComponent.prototype.dragToggleDistance;
/** @type {?} */
DrawerComponent.prototype.onOpenChange;
/** @type {?} */
DrawerComponent.prototype.am;
/** @type {?} */
DrawerComponent.prototype.left;
/** @type {?} */
DrawerComponent.prototype.right;
/** @type {?} */
DrawerComponent.prototype.top;
/** @type {?} */
DrawerComponent.prototype.bottom;
/** @type {?} */
DrawerComponent.prototype.dockedCls;
/** @type {?} */
DrawerComponent.prototype.openCls;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype._el;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiZHJhd2VyL2RyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBR1gsTUFBTSxlQUFlLENBQUM7QUFPdkIsTUFBTSxPQUFPLGVBQWU7Ozs7SUE4RjFCLFlBQW9CLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBN0ZuQyxjQUFTLEdBQVcsV0FBVyxDQUFDO1FBQ2hDLHNCQUFpQixHQUF5QixFQUFFLENBQUM7UUFDN0Msc0JBQWlCLEdBQXlCLEVBQUUsQ0FBQztRQUM3QyxzQkFBaUIsR0FBeUIsRUFBRSxDQUFDO1FBQzdDLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsb0JBQWUsR0FBVyxJQUFJLENBQUM7UUFDL0IsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDM0Isa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFDN0Isa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFDN0IsbUJBQWMsR0FBWSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksY0FBYyxJQUFJLE1BQU0sQ0FBQztRQUV6RSxZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFDdkIsY0FBUyxHQUFXLE1BQU0sQ0FBQztRQUtuQyxpQkFBWSxHQUF5QixFQUFFLENBQUM7UUFFeEMsaUJBQVksR0FBeUIsRUFBRSxDQUFDO1FBRXhDLGlCQUFZLEdBQXlCLEVBQUUsQ0FB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O0lBQzdCLHlDQUFpRjs7Ozs7SUFFakYsa0NBQWlDOzs7OztJQUNqQyxnQ0FBK0I7Ozs7O0lBQy9CLG9DQUFtQzs7SUFFbkMsa0NBQ2E7O0lBQ2IsdUNBQ3dDOztJQUN4Qyx1Q0FDd0M7O0lBQ3hDLHVDQUN3Qzs7SUFDeEMsMENBQzJDOztJQUMzQyxzQ0FDNEI7O0lBQzVCLGdDQUNzQjs7SUFDdEIsMkNBQ2tDOztJQUNsQyw2Q0FDZ0M7O0lBdUNoQyx1Q0FDMEQ7O0lBRTFELDZCQUNtQjs7SUFDbkIsK0JBQzBDOztJQUMxQyxnQ0FDNEM7O0lBQzVDLDhCQUN1Qzs7SUFDdkMsaUNBQzZDOztJQUM3QyxvQ0FDa0M7O0lBQ2xDLGtDQUM4Qjs7Ozs7SUFFbEIsOEJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBBZnRlclZpZXdDaGVja2VkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdEcmF3ZXIsIG56bS1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1kcmF3ZXInO1xuICBzaWRlYmFyU3R5bGVGaW5hbDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgY29udGVudFN0eWxlRmluYWw6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIG92ZXJsYXlTdHlsZUZpbmFsOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBzaWRlYmFyV2lkdGg6IG51bWJlciA9IDA7XG4gIHNpZGViYXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHNpZGViYXJUb3A6IG51bWJlciA9IDA7XG4gIGRyYWdIYW5kbGVUb3A6IG51bWJlciA9IDA7XG4gIHRvdWNoSWRlbnRpZmllcjogbnVtYmVyID0gbnVsbDtcbiAgdG91Y2hTdGFydFg6IG51bWJlciA9IG51bGw7XG4gIHRvdWNoU3RhcnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRYOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaEN1cnJlbnRZOiBudW1iZXIgPSBudWxsO1xuICB0b3VjaFN1cHBvcnRlZDogYm9vbGVhbiA9IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdztcblxuICBwcml2YXRlIF9kb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wb3NpdGlvbjogc3RyaW5nID0gJ2xlZnQnO1xuXG4gIEBJbnB1dCgpXG4gIHNpZGViYXI6IGFueTtcbiAgQElucHV0KClcbiAgc2lkZWJhclN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICBjb250ZW50U3R5bGU6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIG92ZXJsYXlTdHlsZTogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgQElucHV0KClcbiAgZHJhZ0hhbmRsZVN0eWxlOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBASW5wdXQoKVxuICB0cmFuc2l0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRvdWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZW5hYmxlRHJhZ0hhbmRsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBkcmFnVG9nZ2xlRGlzdGFuY2U6IG51bWJlciA9IDMwO1xuICBASW5wdXQoKVxuICBnZXQgZG9ja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9kb2NrZWQ7XG4gIH1cbiAgc2V0IGRvY2tlZCh2KSB7XG4gICAgdGhpcy5fZG9ja2VkID0gdjtcbiAgICB0aGlzLmRvY2tlZENscyA9IHY7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG9wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW47XG4gIH1cbiAgc2V0IG9wZW4odikge1xuICAgIHRoaXMuX29wZW4gPSB2O1xuICAgIHRoaXMub3BlbkNscyA9IHY7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBvc2l0aW9uKHYpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHY7XG4gICAgdGhpcy5yaWdodCA9IGZhbHNlO1xuICAgIHRoaXMubGVmdCA9IGZhbHNlO1xuICAgIHRoaXMudG9wID0gZmFsc2U7XG4gICAgdGhpcy5ib3R0b20gPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHYpIHtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdGhpcy5yaWdodCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHRoaXMubGVmdCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgdGhpcy50b3AgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRoaXMuYm90dG9tID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbk9wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXInKVxuICBhbTogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLWxlZnQnKVxuICBsZWZ0OiBib29sZWFuID0gdGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0JztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItcmlnaHQnKVxuICByaWdodDogYm9vbGVhbiA9IHRoaXMuX3Bvc2l0aW9uID09PSAncmlnaHQnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWRyYXdlci10b3AnKVxuICB0b3A6IGJvb2xlYW4gPSB0aGlzLl9wb3NpdGlvbiA9PSAndG9wJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItYm90dG9tJylcbiAgYm90dG9tOiBib29sZWFuID0gdGhpcy5fcG9zaXRpb24gPT0gJ2JvdHRvbSc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZHJhd2VyLWRvY2tlZCcpXG4gIGRvY2tlZENsczogYm9vbGVhbiA9IHRoaXMuX2RvY2tlZDtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1kcmF3ZXItb3BlbicpXG4gIG9wZW5DbHM6IGJvb2xlYW4gPSB0aGlzLl9vcGVuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG9uT3ZlcmxheUNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgaXNUb3VjaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b3VjaElkZW50aWZpZXIgIT09IG51bGw7XG4gIH1cblxuICBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgIHRoaXMudG91Y2hJZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjtcbiAgICB0aGlzLnRvdWNoU3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICB0aGlzLnRvdWNoU3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICB0aGlzLnRvdWNoQ3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHRoaXMudG91Y2hDdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gIH1cblxuICBvblRvdWNoTW92ZShldikge1xuICAgIGZvciAobGV0IGluZCA9IDA7IGluZCA8IGV2LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaW5kKyspIHtcbiAgICAgIGlmIChldi5jaGFuZ2VkVG91Y2hlc1tpbmRdLmlkZW50aWZpZXIgPT09IHRoaXMudG91Y2hJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMudG91Y2hDdXJyZW50WCA9IGV2LmNoYW5nZWRUb3VjaGVzW2luZF0uY2xpZW50WDtcbiAgICAgICAgdGhpcy50b3VjaEN1cnJlbnRZID0gZXYuY2hhbmdlZFRvdWNoZXNbaW5kXS5jbGllbnRZO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIG9uVG91Y2hFbmQoKSB7XG4gICAgY29uc3QgdG91Y2hXaWR0aCA9IHRoaXMudG91Y2hTaWRlYmFyV2lkdGgoKTtcbiAgICBpZiAoIXRoaXMuX29wZW4gJiYgdG91Y2hXaWR0aCA+IHRoaXMuZHJhZ1RvZ2dsZURpc3RhbmNlKSB7XG4gICAgICB0aGlzLm9uT3BlbkNoYW5nZS5lbWl0KCF0aGlzLl9vcGVuKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3VjaEhlaWdodCA9IHRoaXMudG91Y2hTaWRlYmFySGVpZ2h0KCk7XG4gICAgaWYgKCF0aGlzLl9vcGVuICYmIHRvdWNoSGVpZ2h0ID4gdGhpcy5kcmFnVG9nZ2xlRGlzdGFuY2UpIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlLmVtaXQoIXRoaXMuX29wZW4pO1xuICAgIH1cbiAgICB0aGlzLnRvdWNoSWRlbnRpZmllciA9IG51bGw7XG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IG51bGw7XG4gICAgdGhpcy50b3VjaFN0YXJ0WSA9IG51bGw7XG4gICAgdGhpcy50b3VjaEN1cnJlbnRYID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoQ3VycmVudFkgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBzYXZlU2lkZWJhclNpemUoKSB7XG4gICAgY29uc3Qgc2lkZWJhciA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI3NpZGViYXInKTtcbiAgICBjb25zdCBkcmFnSGFuZGxlID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZHJhZ0hhbmRsZScpO1xuXG4gICAgY29uc3Qgd2lkdGggPSBzaWRlYmFyLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNpZGViYXIub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IHNpZGViYXJUb3AgPSB0aGlzLmdldE9mZnNldChzaWRlYmFyKS50b3A7XG4gICAgY29uc3QgZHJhZ0hhbmRsZVRvcCA9IHRoaXMuZ2V0T2Zmc2V0KGRyYWdIYW5kbGUpLnRvcDtcblxuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5zaWRlYmFyV2lkdGgpIHtcbiAgICAgIHRoaXMuc2lkZWJhcldpZHRoID0gd2lkdGg7XG4gICAgfVxuICAgIGlmIChoZWlnaHQgIT09IHRoaXMuc2lkZWJhckhlaWdodCkge1xuICAgICAgdGhpcy5zaWRlYmFySGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoc2lkZWJhclRvcCAhPT0gdGhpcy5zaWRlYmFyVG9wKSB7XG4gICAgICB0aGlzLnNpZGViYXJUb3AgPSBzaWRlYmFyVG9wO1xuICAgIH1cbiAgICBpZiAoZHJhZ0hhbmRsZVRvcCAhPT0gdGhpcy5kcmFnSGFuZGxlVG9wKSB7XG4gICAgICB0aGlzLmRyYWdIYW5kbGVUb3AgPSBkcmFnSGFuZGxlVG9wO1xuICAgIH1cbiAgfVxuXG4gIHRvdWNoU2lkZWJhcldpZHRoKCkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy50b3VjaEN1cnJlbnRYLCB0aGlzLnNpZGViYXJXaWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdWNoQ3VycmVudFgsIHRoaXMuc2lkZWJhcldpZHRoKTtcbiAgICB9XG4gIH1cblxuICB0b3VjaFNpZGViYXJIZWlnaHQoKSB7XG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMudG91Y2hDdXJyZW50WSArIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wLFxuICAgICAgICB0aGlzLnNpZGViYXJIZWlnaHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMudG91Y2hDdXJyZW50WSAtIHRoaXMuZHJhZ0hhbmRsZVRvcCwgdGhpcy5zaWRlYmFySGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJTdHlsZSh7IHNpZGViYXJTdHlsZSwgaXNUb3VjaGluZywgb3ZlcmxheVN0eWxlLCBjb250ZW50U3R5bGUgfSkge1xuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0JyB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoMCUpYDtcbiAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgwJSlgO1xuICAgICAgaWYgKGlzVG91Y2hpbmcpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMudG91Y2hTaWRlYmFyV2lkdGgoKSAvIHRoaXMuc2lkZWJhcldpZHRoO1xuICAgICAgICAvLyBzbGlkZSBvcGVuIHRvIHdoYXQgd2UgZHJhZ2dlZFxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgtJHsoMSAtIHBlcmNlbnRhZ2UpICogMTAwfSUpYDtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgIH1cbiAgICAgICAgb3ZlcmxheVN0eWxlLm9wYWNpdHkgPSBwZXJjZW50YWdlO1xuICAgICAgICBvdmVybGF5U3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50U3R5bGUpIHtcbiAgICAgICAgY29udGVudFN0eWxlW3RoaXMuX3Bvc2l0aW9uXSA9IGAke3RoaXMuc2lkZWJhcldpZHRofXB4YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgwJSlgO1xuICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKDAlKWA7XG4gICAgICBpZiAoaXNUb3VjaGluZykge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy50b3VjaFNpZGViYXJIZWlnaHQoKSAvIHRoaXMuc2lkZWJhckhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHNpZGViYXJTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgkeygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICAgIHNpZGViYXJTdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgkeygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBzaWRlYmFyU3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoLSR7KDEgLSBwZXJjZW50YWdlKSAqIDEwMH0lKWA7XG4gICAgICAgICAgc2lkZWJhclN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC0keygxIC0gcGVyY2VudGFnZSkgKiAxMDB9JSlgO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gcGVyY2VudGFnZTtcbiAgICAgICAgb3ZlcmxheVN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICB9XG4gICAgICBpZiAoY29udGVudFN0eWxlKSB7XG4gICAgICAgIGNvbnRlbnRTdHlsZVt0aGlzLl9wb3NpdGlvbl0gPSBgJHt0aGlzLnNpZGViYXJIZWlnaHR9cHhgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBzaWRlYmFyU3R5bGUgPSB7IC4uLnRoaXMuc2lkZWJhclN0eWxlIH07XG4gICAgY29uc3QgY29udGVudFN0eWxlID0geyAuLi50aGlzLmNvbnRlbnRTdHlsZSB9O1xuICAgIGNvbnN0IG92ZXJsYXlTdHlsZSA9IHsgLi4udGhpcy5vdmVybGF5U3R5bGUgfTtcblxuICAgIGlmICh0aGlzLmlzVG91Y2hpbmcoKSkge1xuICAgICAgdGhpcy5yZW5kZXJTdHlsZSh7XG4gICAgICAgIHNpZGViYXJTdHlsZTogc2lkZWJhclN0eWxlLFxuICAgICAgICBpc1RvdWNoaW5nOiB0cnVlLFxuICAgICAgICBjb250ZW50U3R5bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3ZlcmxheVN0eWxlOiBvdmVybGF5U3R5bGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZG9ja2VkKSB7XG4gICAgICB0aGlzLmRvY2tlZENscyA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlclN0eWxlKHtcbiAgICAgICAgc2lkZWJhclN0eWxlOiBzaWRlYmFyU3R5bGUsXG4gICAgICAgIGlzVG91Y2hpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGVudFN0eWxlOiBjb250ZW50U3R5bGUsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgIHRoaXMub3BlbkNscyA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlclN0eWxlKHtcbiAgICAgICAgc2lkZWJhclN0eWxlOiBzaWRlYmFyU3R5bGUsXG4gICAgICAgIGlzVG91Y2hpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGVudFN0eWxlOiB1bmRlZmluZWQsXG4gICAgICAgIG92ZXJsYXlTdHlsZTogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIG92ZXJsYXlTdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgIG92ZXJsYXlTdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVG91Y2hpbmcoKSB8fCAhdGhpcy50cmFuc2l0aW9ucykge1xuICAgICAgc2lkZWJhclN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICBzaWRlYmFyU3R5bGUuV2Via2l0VHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgIGNvbnRlbnRTdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgb3ZlcmxheVN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgfVxuICAgIHRoaXMuc2lkZWJhclN0eWxlRmluYWwgPSBzaWRlYmFyU3R5bGU7XG4gICAgdGhpcy5jb250ZW50U3R5bGVGaW5hbCA9IGNvbnRlbnRTdHlsZTtcbiAgICB0aGlzLm92ZXJsYXlTdHlsZUZpbmFsID0gb3ZlcmxheVN0eWxlO1xuICB9XG5cbiAgZ2V0T2Zmc2V0KGVsZSkge1xuICAgIGxldCBlbCA9IGVsZTtcbiAgICBsZXQgX3ggPSAwO1xuICAgIGxldCBfeSA9IDA7XG4gICAgd2hpbGUgKGVsICYmICFpc05hTihlbC5vZmZzZXRMZWZ0KSAmJiAhaXNOYU4oZWwub2Zmc2V0VG9wKSkge1xuICAgICAgX3ggKz0gZWwub2Zmc2V0TGVmdCAtIGVsLnNjcm9sbExlZnQ7XG4gICAgICBfeSArPSBlbC5vZmZzZXRUb3AgLSBlbC5zY3JvbGxUb3A7XG4gICAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHsgdG9wOiBfeSwgbGVmdDogX3ggfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNUb3VjaGluZygpKSB7XG4gICAgICB0aGlzLnNhdmVTaWRlYmFyU2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbn1cbiJdfQ==