@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
363 lines • 32.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: drawer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, Directive, ElementRef, HostListener, Input, ViewChild, ViewContainerRef } from '@angular/core';
import { isNumber, parseInt, trim } from 'lodash-es';
import { fromEvent, Subject } from 'rxjs';
import { distinctUntilChanged, debounceTime } from 'rxjs/operators';
export class DrawerContentDirective {
/**
* @param {?} viewContainerRef
*/
constructor(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
}
}
DrawerContentDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDrawerContentHost]',
},] }
];
/** @nocollapse */
DrawerContentDirective.ctorParameters = () => [
{ type: ViewContainerRef }
];
if (false) {
/** @type {?} */
DrawerContentDirective.prototype.viewContainerRef;
}
export class DrawerComponent {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
this.elementRef = elementRef;
this.animateState = 'void';
this.width = '300px';
this.isCover = true;
this.fullScreen = false;
this.clickDoms = [];
this.animationDone = new Subject();
}
/**
* @return {?}
*/
ngOnInit() {
this.setWidth(this.width);
this._isCover = this.isCover === undefined ? true : this.isCover;
// some browsers(ie11 & edge) fire the animation done event twice
this.animationDoneSub = this.animationDone.pipe(distinctUntilChanged((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => {
return x.fromState === y.fromState && x.toState === y.toState;
}))).subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.onAnimationEnd(event);
}));
}
/**
* @param {?} width
* @return {?}
*/
setWidth(width) {
if (width.indexOf('%') >= 0) {
/** @type {?} */
const widthStr = trim(width, '%');
/** @type {?} */
const widthNum = parseInt(widthStr, 10);
this._width = isNumber(widthNum) ? (widthNum * window.innerWidth / 100 + 'px') : '0px';
}
else {
this._width = width;
}
this.oldWidth = this._width;
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.animationDoneSub) {
this.animationDoneSub.unsubscribe();
}
if (this.resizeSub) {
this.resizeSub.unsubscribe();
}
}
/**
* @param {?} event
* @return {?}
*/
keydownHandler(event) {
if (this.escKeyCloseable && !this.isHaveDialogOrUpload()) {
this.hide();
}
}
/**
* @param {?} event
* @return {?}
*/
onAnimationEnd(event) {
if (this.animateState === 'void') {
this.onHidden();
}
if (this.animateState === 'in' && this.afterOpened) {
this.afterOpened();
}
}
// Will overwrite by drawer service
/**
* @return {?}
*/
onHidden() {
}
/**
* @return {?}
*/
show() {
if (!this.bodyScrollable) {
document.querySelector('body').classList.add('modal-open');
}
this.animateState = 'in';
this.isCover = this.isCover === undefined ? true : this.isCover;
if (!this.backdropCloseable || this.isCover) {
return;
}
/** @type {?} */
const documentClick = fromEvent(document, 'click');
setTimeout((/**
* @return {?}
*/
() => {
this.subscription = documentClick.subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
if (this.clickDoms && this.clickDoms.length > 0) {
this.clickDoms.forEach((/**
* @param {?} dom
* @return {?}
*/
dom => {
if (dom !== null && dom.contains(event.target)) {
this.hide();
return;
}
}));
}
else {
/** @type {?} */
const target = event.target;
// 一定要document.contains(event.target),因为event.target可能已经不在document里了,这个时候就不能进hide了
if (this.animateState === 'in' && (!this.elementRef.nativeElement.contains(target) && document.body.contains(target))
&& !this.isHaveDialogOrUpload()) {
this.hide();
}
}
}));
}));
}
/**
* @return {?}
*/
hide() {
this.canHideModel().then((/**
* @param {?} canHide
* @return {?}
*/
(canHide) => {
if (!canHide) {
return;
}
if (!this.bodyScrollable) {
document.querySelector('body').classList.remove('modal-open');
}
this.animateState = 'void';
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = undefined;
}
}));
}
// Will overwrite by drawer service
/**
* @return {?}
*/
destroy() { }
/**
* @return {?}
*/
isHaveDialogOrUpload() {
/** @type {?} */
const dialog = document.getElementsByClassName('modal-dialog');
/** @type {?} */
const upload = document.getElementById('d-upload-temp');
return (dialog && dialog.length > 0) || upload;
}
/**
* @return {?}
*/
canHideModel() {
/** @type {?} */
let hiddenResult = Promise.resolve(true);
if (this.beforeHidden) {
/** @type {?} */
const result = this.beforeHidden();
if (typeof result !== 'undefined') {
if (result.then) {
hiddenResult = result;
}
else if (result.subscribe) {
hiddenResult = ((/** @type {?} */ (result))).toPromise();
}
else {
hiddenResult = Promise.resolve(result);
}
}
}
return hiddenResult;
}
/**
* @private
* @param {?=} fullScreen
* @return {?}
*/
_setFullScreen(fullScreen) {
if (this._width === this.oldWidth) {
if (fullScreen === true || fullScreen === undefined) {
this._width = this._isCover ? '100%' : window.innerWidth + 'px';
if (!this._isCover) {
/** @type {?} */
const resizeEv = fromEvent(window, 'resize');
/** @type {?} */
const result = resizeEv.pipe(debounceTime(100));
this.resizeSub = result.subscribe((/**
* @param {?} ev
* @return {?}
*/
ev => {
this._width = window.innerWidth + 'px';
}));
}
}
}
else {
if (!fullScreen) {
this._width = this.oldWidth;
if (this.resizeSub) {
this.resizeSub.unsubscribe();
}
}
}
}
/**
* @return {?}
*/
toggleFullScreen() {
this._setFullScreen();
}
/**
* @param {?} fullScreen
* @return {?}
*/
setFullScreen(fullScreen) {
this._setFullScreen(fullScreen);
}
}
DrawerComponent.decorators = [
{ type: Component, args: [{
selector: 'd-drawer',
template: "<div\r\n class=\"drawer\"\r\n [attr.id]=\"id\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n>\r\n <div\r\n class=\"overlay-wrapper\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"overlay-backdrop\" [@fadeInOut]=\"animateState\" (click)=\"backdropCloseable && hide()\"></div>\r\n <div\r\n class=\"drawer-nav\"\r\n [ngStyle]=\"{ width: _width }\"\r\n [@flyInOut]=\"position + '-' + animateState\"\r\n (@flyInOut.done)=\"animationDone.next($event)\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"drawer-content\" cdkScrollable>\r\n <ng-template dDrawerContentHost></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
animations: [
trigger('fadeInOut', [
state('void', style({ display: 'block', opacity: 0 })),
state('in', style({ display: 'block', opacity: 0.6 })),
transition('* => *', animate('300ms ease')),
]),
trigger('flyInOut', [
state('left-void', style({ transform: 'translateX(-100%)', left: 0 })),
state('left-in', style({ transform: 'none', left: 0 })),
state('right-void', style({ transform: 'translateX(100%)', right: 0 })),
state('right-in', style({ transform: 'none', right: 0 })),
transition('* => *', animate('300ms ease')),
]),
],
styles: [".drawer{position:fixed;top:0;bottom:0;z-index:1000}.overlay-wrapper{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:absolute;top:0;bottom:0;z-index:1000}.display-width{left:0;right:0}.overlay-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(41,48,64,.2);width:100%;height:100%}.drawer-nav{position:absolute;top:0;bottom:0;background:#fff}.drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;box-shadow:0 1px 20px -5px rgba(41,48,64,.2)}"]
}] }
];
/** @nocollapse */
DrawerComponent.ctorParameters = () => [
{ type: ElementRef }
];
DrawerComponent.propDecorators = {
id: [{ type: Input }],
width: [{ type: Input }],
isCover: [{ type: Input }],
fullScreen: [{ type: Input }],
drawerContentHost: [{ type: ViewChild, args: [DrawerContentDirective, { static: true },] }],
backdropCloseable: [{ type: Input }],
escKeyCloseable: [{ type: Input }],
beforeHidden: [{ type: Input }],
clickDoms: [{ type: Input }],
afterOpened: [{ type: Input }],
position: [{ type: Input }],
bodyScrollable: [{ type: Input }],
keydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event'],] }]
};
if (false) {
/** @type {?} */
DrawerComponent.prototype.animateState;
/** @type {?} */
DrawerComponent.prototype.id;
/** @type {?} */
DrawerComponent.prototype.width;
/** @type {?} */
DrawerComponent.prototype.isCover;
/** @type {?} */
DrawerComponent.prototype.fullScreen;
/** @type {?} */
DrawerComponent.prototype.drawerContentHost;
/** @type {?} */
DrawerComponent.prototype.backdropCloseable;
/** @type {?} */
DrawerComponent.prototype.escKeyCloseable;
/** @type {?} */
DrawerComponent.prototype.beforeHidden;
/** @type {?} */
DrawerComponent.prototype.clickDoms;
/** @type {?} */
DrawerComponent.prototype.afterOpened;
/** @type {?} */
DrawerComponent.prototype.position;
/** @type {?} */
DrawerComponent.prototype.bodyScrollable;
/** @type {?} */
DrawerComponent.prototype._width;
/** @type {?} */
DrawerComponent.prototype.oldWidth;
/** @type {?} */
DrawerComponent.prototype._isCover;
/** @type {?} */
DrawerComponent.prototype.subscription;
/** @type {?} */
DrawerComponent.prototype.animationDone;
/** @type {?} */
DrawerComponent.prototype.animationDoneSub;
/** @type {?} */
DrawerComponent.prototype.resizeSub;
/**
* @type {?}
* @private
*/
DrawerComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RyYXdlci8iLCJzb3VyY2VzIjpbImRyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFFLEtBQUssRUFDakUsU0FBUyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3BFLE1BQU0sT0FBTyxzQkFBc0I7Ozs7SUFDakMsWUFBbUIsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFDckQsQ0FBQzs7O1lBTEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7YUFDakM7Ozs7WUFQb0IsZ0JBQWdCOzs7O0lBU3ZCLGtEQUF5Qzs7QUF1QnZELE1BQU0sT0FBTyxlQUFlOzs7O0lBeUIxQixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBeEIxQyxpQkFBWSxHQUFHLE1BQU0sQ0FBQztRQUViLFVBQUssR0FBRyxPQUFPLENBQUM7UUFDaEIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFLbkIsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQVc3QixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0lBSzlDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRWpFLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9COzs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFOztrQkFDckIsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDOztrQkFDM0IsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3hGO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQzs7Ozs7SUFFb0QsY0FBYyxDQUFDLEtBQW9CO1FBQ3RGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBQ3hELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxjQUFjLENBQUMsS0FBSztRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7OztJQUdELFFBQVE7SUFFUixDQUFDOzs7O0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDM0MsT0FBTztTQUNSOztjQUNLLGFBQWEsR0FBRyxTQUFTLENBQWdCLFFBQVEsRUFBRSxPQUFPLENBQUM7UUFDakUsVUFBVTs7O1FBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsU0FBUzs7OztZQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7Z0JBQzNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzs7OztvQkFBQyxHQUFHLENBQUMsRUFBRTt3QkFDM0IsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ1osT0FBTzt5QkFDUjtvQkFDSCxDQUFDLEVBQUMsQ0FBQztpQkFDSjtxQkFBTTs7MEJBQ0MsTUFBTSxHQUFRLEtBQUssQ0FBQyxNQUFNO29CQUNoQyxrRkFBa0Y7b0JBQ2xGLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzsyQkFDaEgsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTt3QkFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO3FCQUNiO2lCQUNGO1lBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUk7Ozs7UUFBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3hCLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMvRDtZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7YUFDL0I7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBR0MsT0FBTyxLQUFJLENBQUM7Ozs7SUFFZCxvQkFBb0I7O2NBQ1osTUFBTSxHQUFRLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUM7O2NBQzdELE1BQU0sR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUM1RCxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCxZQUFZOztZQUNOLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7O2tCQUNmLE1BQU0sR0FBUSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO2dCQUNqQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7b0JBQ2YsWUFBWSxHQUFHLE1BQU0sQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUMzQixZQUFZLEdBQUcsQ0FBQyxtQkFBQSxNQUFNLEVBQXVCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3hDO2FBQ0Y7U0FDRjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Ozs7OztJQUVPLGNBQWMsQ0FBQyxVQUFvQjtRQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTs7MEJBQ1osUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDOzswQkFDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTOzs7O29CQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO29CQUN6QyxDQUFDLEVBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQzlCO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBRU0sYUFBYSxDQUFDLFVBQW1CO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7O1lBMU1GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsaWtDQUFzQztnQkFFdEMsVUFBVSxFQUFFO29CQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7d0JBQ25CLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzt3QkFDcEQsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO3dCQUNwRCxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDNUMsQ0FBQztvQkFDRixPQUFPLENBQUMsVUFBVSxFQUFFO3dCQUNsQixLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzt3QkFDcEUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO3dCQUNyRCxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzt3QkFDckUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO3dCQUN2RCxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDNUMsQ0FBQztpQkFDSDs7YUFDRjs7OztZQWhDOEIsVUFBVTs7O2lCQW1DdEMsS0FBSztvQkFDTCxLQUFLO3NCQUNMLEtBQUs7eUJBQ0wsS0FBSztnQ0FDTCxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dDQUNsRCxLQUFLOzhCQUNMLEtBQUs7MkJBQ0wsS0FBSzt3QkFDTCxLQUFLOzBCQUVMLEtBQUs7dUJBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQThDTCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUEzRG5ELHVDQUFzQjs7SUFDdEIsNkJBQW9COztJQUNwQixnQ0FBeUI7O0lBQ3pCLGtDQUF3Qjs7SUFDeEIscUNBQTRCOztJQUM1Qiw0Q0FBK0Y7O0lBQy9GLDRDQUFvQzs7SUFDcEMsMENBQWtDOztJQUNsQyx1Q0FBOEU7O0lBQzlFLG9DQUE2Qjs7SUFFN0Isc0NBQStCOztJQUMvQixtQ0FBb0M7O0lBQ3BDLHlDQUFpQzs7SUFDakMsaUNBQWU7O0lBRWYsbUNBQWlCOztJQUNqQixtQ0FBa0I7O0lBQ2xCLHVDQUEyQjs7SUFFM0Isd0NBQThDOztJQUM5QywyQ0FBK0I7O0lBQy9CLG9DQUF3Qjs7Ozs7SUFFWixxQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIsIEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCxcclxuICBPbkluaXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzTnVtYmVyLCBwYXJzZUludCwgdHJpbSB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJhd2VyQ29udGVudEhvc3RdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyYXdlckNvbnRlbnREaXJlY3RpdmUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdmYWRlSW5PdXQnLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoe2Rpc3BsYXk6ICdibG9jaycsIG9wYWNpdHk6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdpbicsIHN0eWxlKHtkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAwLjZ9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gKicsIGFuaW1hdGUoJzMwMG1zIGVhc2UnKSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ2ZseUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgnbGVmdC12b2lkJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJywgbGVmdDogMH0pKSxcclxuICAgICAgc3RhdGUoJ2xlZnQtaW4nLCBzdHlsZSh7dHJhbnNmb3JtOiAnbm9uZScsIGxlZnQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdyaWdodC12b2lkJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknLCByaWdodDogMH0pKSxcclxuICAgICAgc3RhdGUoJ3JpZ2h0LWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ25vbmUnLCByaWdodDogMH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignKiA9PiAqJywgYW5pbWF0ZSgnMzAwbXMgZWFzZScpKSxcclxuICAgIF0pLFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBhbmltYXRlU3RhdGUgPSAndm9pZCc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB3aWR0aCA9ICczMDBweCc7XHJcbiAgQElucHV0KCkgaXNDb3ZlciA9IHRydWU7XHJcbiAgQElucHV0KCkgZnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoRHJhd2VyQ29udGVudERpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgZHJhd2VyQ29udGVudEhvc3Q6IERyYXdlckNvbnRlbnREaXJlY3RpdmU7XHJcbiAgQElucHV0KCkgYmFja2Ryb3BDbG9zZWFibGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZXNjS2V5Q2xvc2VhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGJlZm9yZUhpZGRlbjogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBJbnB1dCgpIGNsaWNrRG9tczogYW55ID0gW107XHJcbiAgLy8gV2lsbCBvdmVyd3JpdGUgYnkgZHJhd2VyIHNlcnZpY2VcclxuICBASW5wdXQoKSBhZnRlck9wZW5lZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgcG9zaXRpb246ICdyaWdodCcgfCAnbGVmdCc7XHJcbiAgQElucHV0KCkgYm9keVNjcm9sbGFibGU6IGJvb2xlYW47IC8vIGRyYXdlcuaJk+W8gGJvZHnmmK/lkKblj6/mu5rliqhcclxuICBfd2lkdGg6IHN0cmluZztcclxuICAvLyDlhajlsY/ml7bnlKjmnaXorrDlvZXkuYvliY3nmoTlrr3luqbvvIzlm6DkuLrmsqHpga7nvannmoTmg4XlhrXkuIt3aWR0aOS4jeiDveaYr+eZvuWIhuavlFxyXG4gIG9sZFdpZHRoOiBzdHJpbmc7XHJcbiAgX2lzQ292ZXI6IGJvb2xlYW47XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGFuaW1hdGlvbkRvbmUgPSBuZXcgU3ViamVjdDxBbmltYXRpb25FdmVudD4oKTtcclxuICBhbmltYXRpb25Eb25lU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcmVzaXplU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgdGhpcy5faXNDb3ZlciA9IHRoaXMuaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMuaXNDb3ZlcjtcclxuXHJcbiAgICAvLyBzb21lIGJyb3dzZXJzKGllMTEgJiBlZGdlKSBmaXJlIHRoZSBhbmltYXRpb24gZG9uZSBldmVudCB0d2ljZVxyXG4gICAgdGhpcy5hbmltYXRpb25Eb25lU3ViID0gdGhpcy5hbmltYXRpb25Eb25lLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IHtcclxuICAgICAgcmV0dXJuIHguZnJvbVN0YXRlID09PSB5LmZyb21TdGF0ZSAmJiB4LnRvU3RhdGUgPT09IHkudG9TdGF0ZTtcclxuICAgIH0pKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLm9uQW5pbWF0aW9uRW5kKGV2ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0V2lkdGgod2lkdGg6IHN0cmluZykge1xyXG4gICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA+PSAwKSB7XHJcbiAgICAgIGNvbnN0IHdpZHRoU3RyID0gdHJpbSh3aWR0aCwgJyUnKTtcclxuICAgICAgY29uc3Qgd2lkdGhOdW0gPSBwYXJzZUludCh3aWR0aFN0ciwgMTApO1xyXG4gICAgICB0aGlzLl93aWR0aCA9IGlzTnVtYmVyKHdpZHRoTnVtKSA/ICh3aWR0aE51bSAqIHdpbmRvdy5pbm5lcldpZHRoIC8gMTAwICsgJ3B4JykgOiAnMHB4JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9sZFdpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkRvbmVTdWIpIHtcclxuICAgICAgdGhpcy5hbmltYXRpb25Eb25lU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZXNpemVTdWIpIHtcclxuICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkga2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmVzY0tleUNsb3NlYWJsZSAmJiAhdGhpcy5pc0hhdmVEaWFsb2dPclVwbG9hZCgpKSB7XHJcbiAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25BbmltYXRpb25FbmQoZXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGVTdGF0ZSA9PT0gJ3ZvaWQnKSB7XHJcbiAgICAgIHRoaXMub25IaWRkZW4oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFuaW1hdGVTdGF0ZSA9PT0gJ2luJyAmJiB0aGlzLmFmdGVyT3BlbmVkKSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJPcGVuZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgb25IaWRkZW4oKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIGlmICghdGhpcy5ib2R5U2Nyb2xsYWJsZSkge1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbmltYXRlU3RhdGUgPSAnaW4nO1xyXG4gICAgdGhpcy5pc0NvdmVyID0gdGhpcy5pc0NvdmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5pc0NvdmVyO1xyXG4gICAgaWYgKCF0aGlzLmJhY2tkcm9wQ2xvc2VhYmxlIHx8IHRoaXMuaXNDb3Zlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkb2N1bWVudENsaWNrID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAnY2xpY2snKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGRvY3VtZW50Q2xpY2suc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jbGlja0RvbXMgJiYgdGhpcy5jbGlja0RvbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5jbGlja0RvbXMuZm9yRWFjaChkb20gPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9tICE9PSBudWxsICYmIGRvbS5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAvLyDkuIDlrpropoFkb2N1bWVudC5jb250YWlucyhldmVudC50YXJnZXQp77yM5Zug5Li6ZXZlbnQudGFyZ2V05Y+v6IO95bey57uP5LiN5ZyoZG9jdW1lbnTph4zkuobvvIzov5nkuKrml7blgJnlsLHkuI3og73ov5toaWRl5LqGXHJcbiAgICAgICAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICdpbicgJiYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSlcclxuICAgICAgICAgICAgJiYgIXRoaXMuaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5jYW5IaWRlTW9kZWwoKS50aGVuKChjYW5IaWRlKSA9PiB7XHJcbiAgICAgIGlmICghY2FuSGlkZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuYm9keVNjcm9sbGFibGUpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYW5pbWF0ZVN0YXRlID0gJ3ZvaWQnO1xyXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgICBkZXN0cm95KCkge31cclxuXHJcbiAgaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSB7XHJcbiAgICBjb25zdCBkaWFsb2c6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21vZGFsLWRpYWxvZycpO1xyXG4gICAgY29uc3QgdXBsb2FkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZC11cGxvYWQtdGVtcCcpO1xyXG4gICAgcmV0dXJuIChkaWFsb2cgJiYgZGlhbG9nLmxlbmd0aCA+IDApIHx8IHVwbG9hZDtcclxuICB9XHJcblxyXG4gIGNhbkhpZGVNb2RlbCgpIHtcclxuICAgIGxldCBoaWRkZW5SZXN1bHQgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlSGlkZGVuKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5iZWZvcmVIaWRkZW4oKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC50aGVuKSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3Vic2NyaWJlKSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSAocmVzdWx0IGFzIE9ic2VydmFibGU8Ym9vbGVhbj4pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGlkZGVuUmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RnVsbFNjcmVlbihmdWxsU2NyZWVuPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3dpZHRoID09PSB0aGlzLm9sZFdpZHRoKSB7XHJcbiAgICAgIGlmIChmdWxsU2NyZWVuID09PSB0cnVlIHx8IGZ1bGxTY3JlZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5faXNDb3ZlciA/ICcxMDAlJyA6IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JztcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ292ZXIpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc2l6ZUV2ID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzaXplRXYucGlwZShkZWJvdW5jZVRpbWUoMTAwKSk7XHJcbiAgICAgICAgICB0aGlzLnJlc2l6ZVN1YiA9IHJlc3VsdC5zdWJzY3JpYmUoZXYgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFmdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLm9sZFdpZHRoO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVN1Yikge1xyXG4gICAgICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVGdWxsU2NyZWVuKCkge1xyXG4gICAgdGhpcy5fc2V0RnVsbFNjcmVlbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2V0RnVsbFNjcmVlbihmdWxsU2NyZWVuKTtcclxuICB9XHJcbn1cclxuIl19