ngx-party-parrots
Version:
This gonna be easter egg library
336 lines • 31.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, HostListener, Input, NgZone, ViewChild } from '@angular/core';
import { config } from '../../config';
/** @enum {string} */
var SlalomDirection = {
RIGHT: 'RIGHT',
LEFT: 'LEFT',
};
var NgxPartyParrotsComponent = /** @class */ (function () {
function NgxPartyParrotsComponent(ngZone) {
var _this = this;
this.ngZone = ngZone;
this.parrotsSprites = [];
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
/** @type {?} */
var loop = (/**
* @return {?}
*/
function () {
_this.context.clearRect(0, 0, _this.canvasWidth, _this.canvasHeight);
_this.parrotsSprites.forEach((/**
* @param {?} parrot
* @return {?}
*/
function (parrot) {
parrot.update();
parrot.render();
}));
_this.windowAnimationFrame = requestAnimationFrame(loop);
});
_this.windowAnimationFrame = requestAnimationFrame(loop);
}));
}
Object.defineProperty(NgxPartyParrotsComponent.prototype, "mode", {
set: /**
* @param {?} mode
* @return {?}
*/
function (mode) {
this.opacity = this.opacity || config.modes[mode].opacity;
this.parrotsAmount = this.parrotsAmount || config.modes[mode].parrotsAmount;
this.parrotsData = this.parrotsData || config.modes[mode].parrotsData;
this.speed = this.speed || config.modes[mode].speed;
this.skiingMode = this.skiingMode || config.modes[mode].skiingMode;
this.slalomLength = this.slalomLength || config.modes[mode].slalomLength;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxPartyParrotsComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.prepareCanvas();
this.parrotsSprites = Array.from({ length: this.parrotsAmount })
.map((/**
* @return {?}
*/
function () { return _this.createSprite(); }));
};
/**
* @return {?}
*/
NgxPartyParrotsComponent.prototype.prepareCanvas = /**
* @return {?}
*/
function () {
this.canvasWidth = window.innerWidth;
this.canvasHeight = window.innerHeight;
// resize canvas to match whole window
this.canvas.nativeElement.width = this.canvasWidth;
this.canvas.nativeElement.height = this.canvasHeight;
// save canvas context
this.context = this.canvas.nativeElement.getContext('2d');
this.context.globalAlpha = this.opacity;
};
/**
* @param {?} src
* @return {?}
*/
NgxPartyParrotsComponent.prototype.createImage = /**
* @param {?} src
* @return {?}
*/
function (src) {
/** @type {?} */
var parrotImage = new Image();
parrotImage.src = src;
return parrotImage;
};
/**
* @return {?}
*/
NgxPartyParrotsComponent.prototype.createSprite = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var randomParrot = this.randomNumberFromMinToMax(0, this.parrotsData.length);
/** @type {?} */
var options = (/**
* @param {?} randomParrot
* @return {?}
*/
function (randomParrot) {
return {
frameIndex: 0,
tickCount: 0,
ticksPerFrame: 1,
positionX: _this.randomNumberFromMinToMax(0, _this.canvasWidth),
positionY: _this.randomNumberFromMinToMax(_this.randomNumberFromMinToMax(-150, -100), 0),
slalomMovementLength: _this.randomNumberFromMinToMax(_this.slalomLength.min, _this.slalomLength.max),
slalomMovementDirection: SlalomDirection.RIGHT,
speed: _this.randomNumberFromMinToMax(_this.speed.min, _this.speed.max),
scaleFactor: _this.getScalingFactorForWidth(_this.parrotsData[randomParrot].width),
context: _this.context,
image: _this.createImage(_this.parrotsData[randomParrot].imageSrc)
};
});
/** @type {?} */
var sprite = tslib_1.__assign({}, this.parrotsData[randomParrot], options(randomParrot));
sprite.render = (/**
* @return {?}
*/
function () {
sprite.context.drawImage(sprite.image, sprite.frameIndex * sprite.width / sprite.numberOfFrames, 0, sprite.width / sprite.numberOfFrames, sprite.height, sprite.positionX, sprite.positionY, sprite.width / sprite.scaleFactor / sprite.numberOfFrames, sprite.height / sprite.scaleFactor);
});
sprite.updatePosition = (/**
* @return {?}
*/
function () {
if (sprite.positionY < _this.canvasHeight) {
sprite.positionY = sprite.positionY + sprite.speed;
if (_this.skiingMode === 'yes') {
_this.setSlalomDirection(sprite);
}
}
else {
randomParrot = _this.randomNumberFromMinToMax(0, _this.parrotsData.length);
sprite = tslib_1.__assign({}, sprite, _this.parrotsData[randomParrot], options(randomParrot));
// sprite.positionX = this.randomNumberFromMinToMax(0, this.canvasWidth);
// sprite.positionY = this.randomNumberFromMinToMax(-200, 0);
}
});
sprite.updateFrames = (/**
* @return {?}
*/
function () {
// If the current frame index is in range
if (sprite.frameIndex < sprite.numberOfFrames - 1) {
sprite.frameIndex += 1;
}
else {
sprite.frameIndex = 0;
}
});
sprite.update = (/**
* @return {?}
*/
function () {
sprite.tickCount += 1;
if (sprite.tickCount > sprite.ticksPerFrame) {
sprite.tickCount = 0;
sprite.updateFrames();
sprite.updatePosition();
}
});
return sprite;
};
/**
* @param {?} min
* @param {?} max
* @return {?}
*/
NgxPartyParrotsComponent.prototype.randomNumberFromMinToMax = /**
* @param {?} min
* @param {?} max
* @return {?}
*/
function (min, max) {
return Math.floor(Math.random() * max) + min;
};
/**
* @param {?} width
* @return {?}
*/
NgxPartyParrotsComponent.prototype.getScalingFactorForWidth = /**
* @param {?} width
* @return {?}
*/
function (width) {
if (width < 1280) {
return 1;
}
else {
return Number((Math.random() * (2 - 1) + 2).toFixed(2));
}
};
/**
* @param {?} sprite
* @return {?}
*/
NgxPartyParrotsComponent.prototype.setSlalomDirection = /**
* @param {?} sprite
* @return {?}
*/
function (sprite) {
// if out of the board from the right
if (sprite.positionX > this.canvasWidth) {
sprite.slalomMovementDirection = SlalomDirection.LEFT;
sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max);
}
// if out of the board from the left
if (sprite.positionX < 0) {
sprite.slalomMovementDirection = SlalomDirection.RIGHT;
sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max);
}
if (sprite.slalomMovementDirection === SlalomDirection.LEFT && sprite.slalomMovementLength) {
sprite.positionX = sprite.positionX - sprite.speed;
sprite.slalomMovementLength--;
}
if (sprite.slalomMovementDirection === SlalomDirection.RIGHT && sprite.slalomMovementLength) {
sprite.positionX = sprite.positionX + sprite.speed;
sprite.slalomMovementLength--;
}
if (sprite.slalomMovementLength === 0) {
// change direction
if (sprite.slalomMovementDirection === SlalomDirection.RIGHT) {
sprite.slalomMovementDirection = SlalomDirection.LEFT;
}
else {
sprite.slalomMovementDirection = SlalomDirection.RIGHT;
}
sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max);
}
};
/**
* @return {?}
*/
NgxPartyParrotsComponent.prototype.onResize = /**
* @return {?}
*/
function () {
this.canvasWidth = window.innerWidth;
this.canvasHeight = window.innerHeight;
// update canvas size (possibly window resized)
this.canvas.nativeElement.width = this.canvasWidth;
this.canvas.nativeElement.height = this.canvasHeight;
};
/**
* @return {?}
*/
NgxPartyParrotsComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
cancelAnimationFrame(this.windowAnimationFrame);
};
NgxPartyParrotsComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-pp-party-parrots',
template: "<canvas class=\"parrot-rain\" #canvas></canvas>\n",
styles: [".parrot-rain{width:100vw;height:100vh;background:0 0;margin:0;padding:0;position:fixed;left:0;top:0;z-index:100;pointer-events:none}"]
}] }
];
/** @nocollapse */
NgxPartyParrotsComponent.ctorParameters = function () { return [
{ type: NgZone }
]; };
NgxPartyParrotsComponent.propDecorators = {
canvas: [{ type: ViewChild, args: ['canvas',] }],
parrotsAmount: [{ type: Input }],
opacity: [{ type: Input }],
parrotsData: [{ type: Input }],
speed: [{ type: Input }],
skiingMode: [{ type: Input }],
slalomLength: [{ type: Input }],
mode: [{ type: Input, args: ['mode',] }],
onResize: [{ type: HostListener, args: ['window:resize',] }]
};
return NgxPartyParrotsComponent;
}());
export { NgxPartyParrotsComponent };
if (false) {
/** @type {?} */
NgxPartyParrotsComponent.prototype.canvas;
/** @type {?} */
NgxPartyParrotsComponent.prototype.parrotsAmount;
/** @type {?} */
NgxPartyParrotsComponent.prototype.opacity;
/** @type {?} */
NgxPartyParrotsComponent.prototype.parrotsData;
/** @type {?} */
NgxPartyParrotsComponent.prototype.speed;
/** @type {?} */
NgxPartyParrotsComponent.prototype.skiingMode;
/** @type {?} */
NgxPartyParrotsComponent.prototype.slalomLength;
/**
* @type {?}
* @private
*/
NgxPartyParrotsComponent.prototype.canvasWidth;
/**
* @type {?}
* @private
*/
NgxPartyParrotsComponent.prototype.canvasHeight;
/**
* @type {?}
* @private
*/
NgxPartyParrotsComponent.prototype.context;
/**
* @type {?}
* @private
*/
NgxPartyParrotsComponent.prototype.windowAnimationFrame;
/** @type {?} */
NgxPartyParrotsComponent.prototype.parrotsSprites;
/** @type {?} */
NgxPartyParrotsComponent.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBhcnR5LXBhcnJvdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXBhcnR5LXBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9uZ3gtcGFydHktcGFycm90cy9uZ3gtcGFydHktcGFycm90cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQzs7O0lBS3BDLE9BQVEsT0FBTztJQUNmLE1BQU8sTUFBTTs7QUFHZjtJQThCRSxrQ0FBbUIsTUFBYztRQUFqQyxpQkFjQztRQWRrQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRmpDLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBR2xCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCOzs7UUFBQzs7Z0JBQ3RCLElBQUk7OztZQUFHO2dCQUNYLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSSxDQUFDLFdBQVcsRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xFLEtBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztnQkFBQyxVQUFDLE1BQU07b0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixDQUFDLEVBQUMsQ0FBQztnQkFDSCxLQUFJLENBQUMsb0JBQW9CLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUQsQ0FBQyxDQUFBO1lBRUQsS0FBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQTdC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SyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDdkQsQ0FBQzs7OztJQUVELDhDQUFXOzs7SUFBWDtRQUNFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7O2dCQWpORixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsNkRBQWlEOztpQkFFbEQ7Ozs7Z0JBZHdDLE1BQU07Ozt5QkFpQjVDLFNBQVMsU0FBQyxRQUFRO2dDQUNsQixLQUFLOzBCQUNMLEtBQUs7OEJBQ0wsS0FBSzt3QkFDTCxLQUFLOzZCQUNMLEtBQUs7K0JBQ0wsS0FBSzt1QkFFTCxLQUFLLFNBQUMsTUFBTTsyQkFzTFosWUFBWSxTQUFDLGVBQWU7O0lBYy9CLCtCQUFDO0NBQUEsQUFuTkQsSUFtTkM7U0E5TVksd0JBQXdCOzs7SUFFbkMsMENBQTRCOztJQUM1QixpREFBK0I7O0lBQy9CLDJDQUF5Qjs7SUFDekIsK0NBQW9DOztJQUNwQyx5Q0FBNkM7O0lBQzdDLDhDQUE0Qjs7SUFDNUIsZ0RBQW9EOzs7OztJQVdwRCwrQ0FBNEI7Ozs7O0lBQzVCLGdEQUE2Qjs7Ozs7SUFDN0IsMkNBQTBDOzs7OztJQUMxQyx3REFBcUM7O0lBQ3JDLGtEQUFvQjs7SUFFUiwwQ0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IFBhcnJvdE1vZGVsIH0gZnJvbSAnLi4vLi4vcGFycm90cy9wYXJyb3QubW9kZWwnO1xuXG5cbmVudW0gU2xhbG9tRGlyZWN0aW9uIHtcbiAgUklHSFQgPSAnUklHSFQnLFxuICBMRUZUID0gJ0xFRlQnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wcC1wYXJ0eS1wYXJyb3RzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1wYXJ0eS1wYXJyb3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXBhcnR5LXBhcnJvdHMuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neFBhcnR5UGFycm90c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdjYW52YXMnKSBjYW52YXM7XG4gIEBJbnB1dCgpIHBhcnJvdHNBbW91bnQ6IG51bWJlcjtcbiAgQElucHV0KCkgb3BhY2l0eTogbnVtYmVyO1xuICBASW5wdXQoKSBwYXJyb3RzRGF0YTogUGFycm90TW9kZWxbXTtcbiAgQElucHV0KCkgc3BlZWQ6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyIH07XG4gIEBJbnB1dCgpIHNraWluZ01vZGU6IHN0cmluZztcbiAgQElucHV0KCkgc2xhbG9tTGVuZ3RoOiB7IG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciB9O1xuXG4gIEBJbnB1dCgnbW9kZScpIHNldCBtb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMub3BhY2l0eSA9IHRoaXMub3BhY2l0eSB8fCBjb25maWcubW9kZXNbbW9kZV0ub3BhY2l0eTtcbiAgICB0aGlzLnBhcnJvdHNBbW91bnQgPSB0aGlzLnBhcnJvdHNBbW91bnQgfHwgY29uZmlnLm1vZGVzW21vZGVdLnBhcnJvdHNBbW91bnQ7XG4gICAgdGhpcy5wYXJyb3RzRGF0YSA9IHRoaXMucGFycm90c0RhdGEgfHwgY29uZmlnLm1vZGVzW21vZGVdLnBhcnJvdHNEYXRhO1xuICAgIHRoaXMuc3BlZWQgPSB0aGlzLnNwZWVkIHx8IGNvbmZpZy5tb2Rlc1ttb2RlXS5zcGVlZDtcbiAgICB0aGlzLnNraWluZ01vZGUgPSB0aGlzLnNraWluZ01vZGUgfHwgY29uZmlnLm1vZGVzW21vZGVdLnNraWluZ01vZGU7XG4gICAgdGhpcy5zbGFsb21MZW5ndGggPSB0aGlzLnNsYWxvbUxlbmd0aCB8fCBjb25maWcubW9kZXNbbW9kZV0uc2xhbG9tTGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW52YXNXaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIGNhbnZhc0hlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSB3aW5kb3dBbmltYXRpb25GcmFtZTogbnVtYmVyO1xuICBwYXJyb3RzU3ByaXRlcyA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpO1xuICAgICAgICB0aGlzLnBhcnJvdHNTcHJpdGVzLmZvckVhY2goKHBhcnJvdCkgPT4ge1xuICAgICAgICAgIHBhcnJvdC51cGRhdGUoKTtcbiAgICAgICAgICBwYXJyb3QucmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuXG4gICAgICB9O1xuXG4gICAgICB0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wcmVwYXJlQ2FudmFzKCk7XG4gICAgdGhpcy5wYXJyb3RzU3ByaXRlcyA9IEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5wYXJyb3RzQW1vdW50fSlcbiAgICAgIC5tYXAoKCkgPT4gdGhpcy5jcmVhdGVTcHJpdGUoKSk7XG4gIH1cblxuICBwcmVwYXJlQ2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FudmFzV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIC8vIHJlc2l6ZSBjYW52YXMgdG8gbWF0Y2ggd2hvbGUgd2luZG93XG4gICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC53aWR0aCA9IHRoaXMuY2FudmFzV2lkdGg7XG4gICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5oZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodDtcblxuICAgIC8vIHNhdmUgY2FudmFzIGNvbnRleHRcbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XG4gICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gdGhpcy5vcGFjaXR5O1xuICB9XG4gIGNyZWF0ZUltYWdlKHNyYyk6IEhUTUxJbWFnZUVsZW1lbnQge1xuICAgIGNvbnN0IHBhcnJvdEltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgcGFycm90SW1hZ2Uuc3JjID0gc3JjO1xuICAgIHJldHVybiBwYXJyb3RJbWFnZTtcbiAgfVxuICBjcmVhdGVTcHJpdGUoKSB7XG4gICAgbGV0IHJhbmRvbVBhcnJvdDogbnVtYmVyID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoMCwgdGhpcy5wYXJyb3RzRGF0YS5sZW5ndGgpO1xuXG4gICAgbGV0IG9wdGlvbnMgPSAocmFuZG9tUGFycm90KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcmFtZUluZGV4OiAwLFxuICAgICAgICB0aWNrQ291bnQ6IDAsXG4gICAgICAgIHRpY2tzUGVyRnJhbWU6IDEsXG4gICAgICAgIHBvc2l0aW9uWDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoMCwgdGhpcy5jYW52YXNXaWR0aCksXG4gICAgICAgIHBvc2l0aW9uWTogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoLTE1MCwgLTEwMCksIDApLFxuICAgICAgICBzbGFsb21Nb3ZlbWVudExlbmd0aDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zbGFsb21MZW5ndGgubWluLCB0aGlzLnNsYWxvbUxlbmd0aC5tYXgpLFxuICAgICAgICBzbGFsb21Nb3ZlbWVudERpcmVjdGlvbjogU2xhbG9tRGlyZWN0aW9uLlJJR0hULFxuICAgICAgICBzcGVlZDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zcGVlZC5taW4sIHRoaXMuc3BlZWQubWF4KSxcbiAgICAgICAgc2NhbGVGYWN0b3I6IHRoaXMuZ2V0U2NhbGluZ0ZhY3RvckZvcldpZHRoKHRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XS53aWR0aCksXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgICAgaW1hZ2U6IHRoaXMuY3JlYXRlSW1hZ2UodGhpcy5wYXJyb3RzRGF0YVtyYW5kb21QYXJyb3RdLmltYWdlU3JjKVxuICAgICAgfVxuXG4gICAgfTtcblxuICAgIGxldCBzcHJpdGU6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XSxcbiAgICAgIC4uLm9wdGlvbnMocmFuZG9tUGFycm90KVxuICAgIH07XG5cbiAgICBzcHJpdGUucmVuZGVyID0gKCkgPT4ge1xuICAgICAgc3ByaXRlLmNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBzcHJpdGUuaW1hZ2UsXG4gICAgICAgIHNwcml0ZS5mcmFtZUluZGV4ICogc3ByaXRlLndpZHRoIC8gc3ByaXRlLm51bWJlck9mRnJhbWVzLFxuICAgICAgICAwLFxuICAgICAgICBzcHJpdGUud2lkdGggLyBzcHJpdGUubnVtYmVyT2ZGcmFtZXMsXG4gICAgICAgIHNwcml0ZS5oZWlnaHQsXG4gICAgICAgIHNwcml0ZS5wb3NpdGlvblgsXG4gICAgICAgIHNwcml0ZS5wb3NpdGlvblksXG4gICAgICAgIHNwcml0ZS53aWR0aCAvIHNwcml0ZS5zY2FsZUZhY3RvciAvIHNwcml0ZS5udW1iZXJPZkZyYW1lcyxcbiAgICAgICAgc3ByaXRlLmhlaWdodCAvIHNwcml0ZS5zY2FsZUZhY3Rvcik7XG4gICAgfTtcblxuICAgIHNwcml0ZS51cGRhdGVQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChzcHJpdGUucG9zaXRpb25ZIDwgdGhpcy5jYW52YXNIZWlnaHQpIHtcbiAgICAgICAgc3ByaXRlLnBvc2l0aW9uWSA9IHNwcml0ZS5wb3NpdGlvblkgKyBzcHJpdGUuc3BlZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2tpaW5nTW9kZSA9PT0gJ3llcycpIHtcbiAgICAgICAgICB0aGlzLnNldFNsYWxvbURpcmVjdGlvbihzcHJpdGUpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmRvbVBhcnJvdCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KDAsIHRoaXMucGFycm90c0RhdGEubGVuZ3RoKTtcblxuICAgICAgICBzcHJpdGUgPSB7XG4gICAgICAgICAgLi4uc3ByaXRlLFxuICAgICAgICAgIC4uLnRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XSxcbiAgICAgICAgICAuLi5vcHRpb25zKHJhbmRvbVBhcnJvdClcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gc3ByaXRlLnBvc2l0aW9uWCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KDAsIHRoaXMuY2FudmFzV2lkdGgpO1xuICAgICAgICAvLyBzcHJpdGUucG9zaXRpb25ZID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoLTIwMCwgMCk7XG5cblxuICAgICAgfVxuICAgIH07XG5cbiAgICBzcHJpdGUudXBkYXRlRnJhbWVzID0gKCkgPT4ge1xuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZnJhbWUgaW5kZXggaXMgaW4gcmFuZ2VcbiAgICAgIGlmIChzcHJpdGUuZnJhbWVJbmRleCA8IHNwcml0ZS5udW1iZXJPZkZyYW1lcyAtIDEpIHtcbiAgICAgICAgc3ByaXRlLmZyYW1lSW5kZXggKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwcml0ZS5mcmFtZUluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3ByaXRlLnVwZGF0ZSA9ICgpID0+IHtcblxuICAgICAgc3ByaXRlLnRpY2tDb3VudCArPSAxO1xuXG4gICAgICBpZiAoc3ByaXRlLnRpY2tDb3VudCA+IHNwcml0ZS50aWNrc1BlckZyYW1lKSB7XG4gICAgICAgIHNwcml0ZS50aWNrQ291bnQgPSAwO1xuICAgICAgICBzcHJpdGUudXBkYXRlRnJhbWVzKCk7XG4gICAgICAgIHNwcml0ZS51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNwcml0ZTtcbiAgfVxuXG4gIHJhbmRvbU51bWJlckZyb21NaW5Ub01heChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpICsgbWluO1xuICB9XG5cbiAgZ2V0U2NhbGluZ0ZhY3RvckZvcldpZHRoKHdpZHRoKTogbnVtYmVyIHtcbiAgICBpZiAod2lkdGggPCAxMjgwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE51bWJlcigoTWF0aC5yYW5kb20oKSAqICgyIC0gMSkgKyAyKS50b0ZpeGVkKDIpKTtcbiAgICB9XG4gIH1cbiAgc2V0U2xhbG9tRGlyZWN0aW9uKHNwcml0ZSkge1xuICAgIC8vIGlmIG91dCBvZiB0aGUgYm9hcmQgZnJvbSB0aGUgcmlnaHRcbiAgICBpZiAoc3ByaXRlLnBvc2l0aW9uWCA+IHRoaXMuY2FudmFzV2lkdGgpIHtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9IFNsYWxvbURpcmVjdGlvbi5MRUZUO1xuICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zbGFsb21MZW5ndGgubWluLCB0aGlzLnNsYWxvbUxlbmd0aC5tYXgpO1xuICAgIH1cbiAgICAvLyBpZiBvdXQgb2YgdGhlIGJvYXJkIGZyb20gdGhlIGxlZnRcbiAgICBpZiAoc3ByaXRlLnBvc2l0aW9uWCA8IDApIHtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9IFNsYWxvbURpcmVjdGlvbi5SSUdIVDtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudExlbmd0aCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KHRoaXMuc2xhbG9tTGVuZ3RoLm1pbiwgdGhpcy5zbGFsb21MZW5ndGgubWF4KTtcbiAgICB9XG5cbiAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID09PSBTbGFsb21EaXJlY3Rpb24uTEVGVCAmJiBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGgpIHtcbiAgICAgIHNwcml0ZS5wb3NpdGlvblggPSBzcHJpdGUucG9zaXRpb25YIC0gc3ByaXRlLnNwZWVkO1xuICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoLS07XG4gICAgfVxuXG4gICAgaWYgKHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9PT0gU2xhbG9tRGlyZWN0aW9uLlJJR0hUICYmIHNwcml0ZS5zbGFsb21Nb3ZlbWVudExlbmd0aCkge1xuICAgICAgc3ByaXRlLnBvc2l0aW9uWCA9IHNwcml0ZS5wb3NpdGlvblggKyBzcHJpdGUuc3BlZWQ7XG4gICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGgtLTtcbiAgICB9XG5cbiAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBjaGFuZ2UgZGlyZWN0aW9uXG4gICAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID09PSBTbGFsb21EaXJlY3Rpb24uUklHSFQpIHtcbiAgICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID0gU2xhbG9tRGlyZWN0aW9uLkxFRlQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnREaXJlY3Rpb24gPSBTbGFsb21EaXJlY3Rpb24uUklHSFQ7XG4gICAgICB9XG4gICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGggPSB0aGlzLnJhbmRvbU51bWJlckZyb21NaW5Ub01heCh0aGlzLnNsYWxvbUxlbmd0aC5taW4sIHRoaXMuc2xhbG9tTGVuZ3RoLm1heCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhc1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgdGhpcy5jYW52YXNIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAvLyB1cGRhdGUgY2FudmFzIHNpemUgKHBvc3NpYmx5IHdpbmRvdyByZXNpemVkKVxuICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoO1xuICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lKTtcbiAgfVxuXG59XG4iXX0=