bp-space-invaders
Version:
The BP Space Invaders Game
160 lines • 25.2 kB
JavaScript
import { AssetClass } from '../../asset/asset.class';
import { ObservableTypeEnum } from '../../enum/observable-type.enum';
import { COLORS, DESTRUCTION_ANIMATION, KEY } from './spaceship-constants';
export class SpaceshipClass extends AssetClass {
constructor(gameService, ctx, boundarySetup, isPrimary) {
super(gameService, ctx, boundarySetup, 0);
this.isPrimary = isPrimary;
this.moves = {
[KEY.LEFT]: (asset) => ({ ...asset, x: asset.x - 3 }),
[KEY.RIGHT]: (asset) => ({ ...asset, x: asset.x + 3 }),
[KEY.SPACE]: true
};
this.missileFired = false;
this.missileTimer = {
start: performance.now(),
elapsed: 0
};
}
keyDownMove(eventCode) {
const asset = this.moves[eventCode](this);
if (this.gameService.valid(asset, this.boundary)) {
this.move(asset);
}
else {
clearInterval(this.keyDownInterval);
this.keyDownInterval = undefined;
}
}
processKeyStroke(event) {
if (this.isPrimary) {
const eventCode = event.stringData;
const keyDown = event.type === ObservableTypeEnum.keyDownEvent;
if (this.moves[eventCode]) {
if (eventCode === KEY.SPACE && keyDown) {
this.missileFired = true;
}
else {
if ((keyDown && this.currentKeyDown !== eventCode) || (!keyDown && this.currentKeyDown === eventCode)) {
clearInterval(this.keyDownInterval);
this.keyDownInterval = undefined;
this.currentKeyDown = undefined;
}
if (keyDown && this.currentKeyDown !== eventCode) {
this.currentKeyDown = eventCode;
this.keyDownMove(eventCode);
this.keyDownInterval = window.setInterval(() => {
this.keyDownMove(eventCode);
}, 50);
}
}
}
}
}
spawn() {
this.assetAnimation = this.assetAnimations[0];
this.engineAnimation = this.engineAnimations[0];
this.destructionAnimations = DESTRUCTION_ANIMATION;
this.destructionAnimation = this.destructionAnimations[0];
super.spawn();
}
draw() {
this.ctx.save();
this.ctx.translate(this.x, this.y);
this.drawSpaceship();
this.drawEngine();
this.ctx.restore();
}
drawSpaceship() {
this.assetAnimation.forEach((row, y) => {
row.forEach((value, x) => {
if (value > 0) {
this.ctx.fillStyle = COLORS[value];
this.ctx.fillRect(x, y, 1, 1);
}
});
});
}
drawEngine() {
this.engineAnimation.forEach((row, y) => {
row.forEach((value, x) => {
if (value > 0) {
this.ctx.fillStyle = COLORS[value];
this.ctx.fillRect(this.x + this.engineXOffset + x, this.y + this.engineYOffset + y, 1, 1);
}
});
});
}
isHit(alienBombAsset) {
if (!this.isDestroyed) {
this.isDestroyed = this.gameService.isHit({
x: this.x,
y: this.y,
shape: this.shape
}, alienBombAsset);
if (this.isDestroyed) {
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.spaceshipDestroyed,
booleanData: true
});
alienBombAsset.isDestroyed = true;
}
}
}
drawSpaceshipDestruction() {
this.destructionAnimation.forEach((row, y) => {
row.forEach((value, x) => {
if (value > 0) {
this.ctx.fillStyle = COLORS[value];
this.ctx.fillRect(this.x + x, this.y + y, 1, 1);
}
});
});
}
destructionAnimate(now = 0) {
this.ctx.clearRect(this.x - 10, this.y, this.getAssetWidth() + 20, this.getAssetHeight());
this.destructionTimer.elapsed = now - this.destructionTimer.start;
if (this.destructionAnimationCounter === this.destructionAnimations.length) {
cancelAnimationFrame(this.destructionRequestId);
return;
}
if (this.destructionTimer.elapsed > 50) {
this.destructionTimer.start = now;
this.destructionAnimation =
this.destructionAnimations[this.destructionAnimationCounter++ % this.destructionAnimations.length];
}
this.drawSpaceshipDestruction();
this.destructionRequestId = requestAnimationFrame(this.destructionAnimate.bind(this));
}
animate(now = 0) {
this.assetTimer.elapsed = now - this.assetTimer.start;
this.engineTimer.elapsed = now - this.engineTimer.start;
this.missileTimer.elapsed = now - this.missileTimer.start;
if (this.isDestroyed) {
this.destructionAnimate();
return;
}
this.destructionAnimationCounter = 0;
if (this.assetTimer.elapsed > 1000) {
this.assetTimer.start = now;
this.assetAnimation = this.assetAnimations[this.animationCounter++ % this.assetAnimations.length];
}
if (this.missileTimer.elapsed > 500 && this.missileFired) {
this.missileFired = false;
this.missileTimer.start = now;
this.gameService.emitMasterObservableEvent({
type: ObservableTypeEnum.missileShot,
assetCoordinateData: {
x: this.x + this.getAssetWidth() / 2 - 1,
y: this.y + 5
}
});
}
if (this.engineTimer.elapsed > 200 && this.engineAnimations.length > 0) {
this.engineTimer.start = now;
this.engineAnimation = this.engineAnimations[this.engineAnimationCounter++ % this.engineAnimations.length];
}
this.draw();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VzaGlwLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BhY2UtaW52YWRlcnMvc3JjL2xpYi9zcGFjZXNoaXBzL3NwYWNlc2hpcC9zcGFjZXNoaXAuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTXJFLE9BQU8sRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLM0UsTUFBTSxPQUFnQixjQUFlLFNBQVEsVUFBVTtJQXFDckQsWUFDRSxXQUF3QixFQUN4QixHQUE2QixFQUM3QixhQUFpQyxFQUN6QixTQUFrQjtRQUUxQixLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFGbEMsY0FBUyxHQUFULFNBQVMsQ0FBUztRQXBDcEIsVUFBSyxHQUEyQjtZQUN0QyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSTtTQUNsQixDQUFDO1FBb0NBLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdB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LElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNzZXRDbGFzcyB9IGZyb20gJy4uLy4uL2Fzc2V0L2Fzc2V0LmNsYXNzJztcbmltcG9ydCB7IE9ic2VydmFibGVUeXBlRW51bSB9IGZyb20gJy4uLy4uL2VudW0vb2JzZXJ2YWJsZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgSUFzc2V0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL2Fzc2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBCb3VuZGFyeVNldHVwTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9ib3VuZGFyeS1zZXQubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvb2JzZXJ2YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUaW1lck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdGltZXIubW9kZWwnO1xuaW1wb3J0IHsgR2FtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2dhbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDT0xPUlMsIERFU1RSVUNUSU9OX0FOSU1BVElPTiwgS0VZIH0gZnJvbSAnLi9zcGFjZXNoaXAtY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaGUgU3BhY2VzaGlwIENsYXNzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTcGFjZXNoaXBDbGFzcyBleHRlbmRzIEFzc2V0Q2xhc3Mge1xuICAvKipcbiAgICogbW92ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgbW92ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgW0tFWS5MRUZUXTogKGFzc2V0OiBJQXNzZXQpOiBJQXNzZXQgPT4gKHsgLi4uYXNzZXQsIHg6IGFzc2V0LnggLSAzIH0pLFxuICAgIFtLRVkuUklHSFRdOiAoYXNzZXQ6IElBc3NldCk6IElBc3NldCA9PiAoeyAuLi5hc3NldCwgeDogYXNzZXQueCArIDMgfSksXG4gICAgW0tFWS5TUEFDRV06IHRydWVcbiAgfTtcblxuICAvKipcbiAgICogSWYgdGhlIG1pc3NpbGUgaGFzIGJlZW4gZmlyZWRcbiAgICovXG4gIHByaXZhdGUgbWlzc2lsZUZpcmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgTWlzc2lsZSBUaW1lclxuICAgKi9cbiAgcHJpdmF0ZSBtaXNzaWxlVGltZXI6IFRpbWVyTW9kZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBLZXkgRG93biBJbnRlcnZhbFxuICAgKi9cbiAgcHJpdmF0ZSBrZXlEb3duSW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgS2V5IGRvd25cbiAgICovXG4gIHByaXZhdGUgY3VycmVudEtleURvd246IHN0cmluZztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGdhbWVTZXJ2aWNlIFRoZSBHYW1lU2VydmljZVxuICAgKiBAcGFyYW0gY3R4IFRoZSBjdHhcbiAgICogQHBhcmFtIGJvdW5kYXJ5U2V0dXAgVGhlIEJvdW5kYXJ5U2V0dXBNb2RlbFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZ2FtZVNlcnZpY2U6IEdhbWVTZXJ2aWNlLFxuICAgIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICAgIGJvdW5kYXJ5U2V0dXA6IEJvdW5kYXJ5U2V0dXBNb2RlbCxcbiAgICBwcml2YXRlIGlzUHJpbWFyeTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihnYW1lU2VydmljZSwgY3R4LCBib3VuZGFyeVNldHVwLCAwKTtcblxuICAgIHRoaXMubWlzc2lsZUZpcmVkID0gZmFsc2U7XG4gICAgdGhpcy5taXNzaWxlVGltZXIgPSB7XG4gICAgICBzdGFydDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBlbGFwc2VkOiAwXG4gICAgfSBhcyBUaW1lck1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleSBEb3duIE1vdmVcbiAgICogQHBhcmFtIGV2ZW50Q29kZSBUaGUgZXZlbnQgY29kZVxuICAgKi9cbiAgcHJpdmF0ZSBrZXlEb3duTW92ZShldmVudENvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGxcbiAgICBjb25zdCBhc3NldCA9IHRoaXMubW92ZXNbZXZlbnRDb2RlXSh0aGlzKSBhcyBJQXNzZXQ7XG4gICAgaWYgKHRoaXMuZ2FtZVNlcnZpY2UudmFsaWQoYXNzZXQsIHRoaXMuYm91bmRhcnkpKSB7XG4gICAgICB0aGlzLm1vdmUoYXNzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5rZXlEb3duSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5rZXlEb3duSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXNzIEtleSBTdHJva2VcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBLZXkgZXZlbnRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzS2V5U3Ryb2tlKGV2ZW50OiBPYnNlcnZhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1ByaW1hcnkpIHtcbiAgICAgIGNvbnN0IGV2ZW50Q29kZSA9IGV2ZW50LnN0cmluZ0RhdGE7XG4gICAgICBjb25zdCBrZXlEb3duID0gZXZlbnQudHlwZSA9PT0gT2JzZXJ2YWJsZVR5cGVFbnVtLmtleURvd25FdmVudDtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodGhpcy5tb3Zlc1tldmVudENvZGVdKSB7XG4gICAgICAgIC8vIEdldCBuZXcgc3RhdGVcbiAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gS0VZLlNQQUNFICYmIGtleURvd24pIHtcbiAgICAgICAgICB0aGlzLm1pc3NpbGVGaXJlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKChrZXlEb3duICYmIHRoaXMuY3VycmVudEtleURvd24gIT09IGV2ZW50Q29kZSkgfHwgKCFrZXlEb3duICYmIHRoaXMuY3VycmVudEtleURvd24gPT09IGV2ZW50Q29kZSkpIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmtleURvd25JbnRlcnZhbCk7XG4gICAgICAgICAgICB0aGlzLmtleURvd25JbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEtleURvd24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleURvd24gJiYgdGhpcy5jdXJyZW50S2V5RG93biAhPT0gZXZlbnRDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRLZXlEb3duID0gZXZlbnRDb2RlO1xuICAgICAgICAgICAgdGhpcy5rZXlEb3duTW92ZShldmVudENvZGUpO1xuICAgICAgICAgICAgdGhpcy5rZXlEb3duSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmtleURvd25Nb3ZlKGV2ZW50Q29kZSk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXduIHRoZSBzcGFjZXNoaXBcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcGF3bigpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2V0QW5pbWF0aW9uID0gdGhpcy5hc3NldEFuaW1hdGlvbnNbMF07XG4gICAgdGhpcy5lbmdpbmVBbmltYXRpb24gPSB0aGlzLmVuZ2luZUFuaW1hdGlvbnNbMF07XG4gICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbnMgPSBERVNUUlVDVElPTl9BTklNQVRJT047XG4gICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbiA9IHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb25zWzBdO1xuICAgIHN1cGVyLnNwYXduKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyBldmVueXRoaW5nIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSh0aGlzLngsIHRoaXMueSk7XG4gICAgdGhpcy5kcmF3U3BhY2VzaGlwKCk7XG4gICAgdGhpcy5kcmF3RW5naW5lKCk7XG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHNwYWNlc2hpcFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3U3BhY2VzaGlwKCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXRBbmltYXRpb24uZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgICByb3cuZm9yRWFjaCgodmFsdWUsIHgpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IENPTE9SU1t2YWx1ZV07XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeCwgeSwgMSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGVuZ2luZVxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3RW5naW5lKCk6IHZvaWQge1xuICAgIHRoaXMuZW5naW5lQW5pbWF0aW9uLmZvckVhY2goKHJvdywgeSkgPT4ge1xuICAgICAgcm93LmZvckVhY2goKHZhbHVlLCB4KSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBDT0xPUlNbdmFsdWVdO1xuICAgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHRoaXMueCArIHRoaXMuZW5naW5lWE9mZnNldCArIHgsIHRoaXMueSArIHRoaXMuZW5naW5lWU9mZnNldCArIHksIDEsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgc3BhY2VzaGlwIGhhcyBiZWVuIGhpdFxuICAgKiBAcGFyYW0gYWxpZW5Cb21iQXNzZXQgVGhlIGFsaWVuIGJvbWIgYXNzZXRcbiAgICovXG4gIHB1YmxpYyBpc0hpdChhbGllbkJvbWJBc3NldDogSUFzc2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmlzRGVzdHJveWVkID0gdGhpcy5nYW1lU2VydmljZS5pc0hpdChcbiAgICAgICAge1xuICAgICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgICB5OiB0aGlzLnksXG4gICAgICAgICAgc2hhcGU6IHRoaXMuc2hhcGVcbiAgICAgICAgfSBhcyBJQXNzZXQsXG4gICAgICAgIGFsaWVuQm9tYkFzc2V0XG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLmdhbWVTZXJ2aWNlLmVtaXRNYXN0ZXJPYnNlcnZhYmxlRXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE9ic2VydmFibGVUeXBlRW51bS5zcGFjZXNoaXBEZXN0cm95ZWQsXG4gICAgICAgICAgYm9vbGVhbkRhdGE6IHRydWVcbiAgICAgICAgfSBhcyBPYnNlcnZhYmxlTW9kZWwpO1xuICAgICAgICBhbGllbkJvbWJBc3NldC5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGFsaWVuXG4gICAqL1xuICBwcml2YXRlIGRyYXdTcGFjZXNoaXBEZXN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uLmZvckVhY2goKHJvdywgeSkgPT4ge1xuICAgICAgcm93LmZvckVhY2goKHZhbHVlLCB4KSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBDT0xPUlNbdmFsdWVdO1xuICAgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHRoaXMueCArIHgsIHRoaXMueSArIHksIDEsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBzcGFjZXNoaXAgZGVzdHJ1Y3Rpb25cbiAgICogQHBhcmFtIG5vdyB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBwcml2YXRlIGRlc3RydWN0aW9uQW5pbWF0ZShub3cgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KHRoaXMueCAtIDEwLCB0aGlzLnksIHRoaXMuZ2V0QXNzZXRXaWR0aCgpICsgMjAsIHRoaXMuZ2V0QXNzZXRIZWlnaHQoKSk7XG4gICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLmVsYXBzZWQgPSBub3cgLSB0aGlzLmRlc3RydWN0aW9uVGltZXIuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbkNvdW50ZXIgPT09IHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb25zLmxlbmd0aCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZXN0cnVjdGlvblJlcXVlc3RJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5lbGFwc2VkID4gNTApIHtcbiAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5zdGFydCA9IG5vdztcbiAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRpb24gPVxuICAgICAgICB0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uc1t0aGlzLmRlc3RydWN0aW9uQW5pbWF0aW9uQ291bnRlcisrICUgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbnMubGVuZ3RoXTtcbiAgICB9XG5cbiAgICB0aGlzLmRyYXdTcGFjZXNoaXBEZXN0cnVjdGlvbigpO1xuICAgIHRoaXMuZGVzdHJ1Y3Rpb25SZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5kZXN0cnVjdGlvbkFuaW1hdGUuYmluZCh0aGlzKSBhcyBGcmFtZVJlcXVlc3RDYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZSB0aGUgc3BhY2VzaGlwXG4gICAqIEBwYXJhbSBub3cgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcHVibGljIGFuaW1hdGUobm93ID0gMCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXRUaW1lci5lbGFwc2VkID0gbm93IC0gdGhpcy5hc3NldFRpbWVyLnN0YXJ0O1xuICAgIHRoaXMuZW5naW5lVGltZXIuZWxhcHNlZCA9IG5vdyAtIHRoaXMuZW5naW5lVGltZXIuc3RhcnQ7XG4gICAgdGhpcy5taXNzaWxlVGltZXIuZWxhcHNlZCA9IG5vdyAtIHRoaXMubWlzc2lsZVRpbWVyLnN0YXJ0O1xuXG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25BbmltYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cnVjdGlvbkFuaW1hdGlvbkNvdW50ZXIgPSAwO1xuXG4gICAgaWYgKHRoaXMuYXNzZXRUaW1lci5lbGFwc2VkID4gMTAwMCkge1xuICAgICAgdGhpcy5hc3NldFRpbWVyLnN0YXJ0ID0gbm93O1xuICAgICAgdGhpcy5hc3NldEFuaW1hdGlvbiA9IHRoaXMuYXNzZXRBbmltYXRpb25zW3RoaXMuYW5pbWF0aW9uQ291bnRlcisrICUgdGhpcy5hc3NldEFuaW1hdGlvbnMubGVuZ3RoXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taXNzaWxlVGltZXIuZWxhcHNlZCA+IDUwMCAmJiB0aGlzLm1pc3NpbGVGaXJlZCkge1xuICAgICAgdGhpcy5taXNzaWxlRmlyZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMubWlzc2lsZVRpbWVyLnN0YXJ0ID0gbm93O1xuICAgICAgdGhpcy5nYW1lU2VydmljZS5lbWl0TWFzdGVyT2JzZXJ2YWJsZUV2ZW50KHtcbiAgICAgICAgdHlwZTogT2JzZXJ2YWJsZVR5cGVFbnVtLm1pc3NpbGVTaG90LFxuICAgICAgICBhc3NldENvb3JkaW5hdGVEYXRhOiB7XG4gICAgICAgICAgeDogdGhpcy54ICsgdGhpcy5nZXRBc3NldFdpZHRoKCkgLyAyIC0gMSxcbiAgICAgICAgICB5OiB0aGlzLnkgKyA1XG4gICAgICAgIH0gYXMgSUFzc2V0XG4gICAgICB9IGFzIE9ic2VydmFibGVNb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5naW5lVGltZXIuZWxhcHNlZCA+IDIwMCAmJiB0aGlzLmVuZ2luZUFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lbmdpbmVUaW1lci5zdGFydCA9IG5vdztcbiAgICAgIHRoaXMuZW5naW5lQW5pbWF0aW9uID0gdGhpcy5lbmdpbmVBbmltYXRpb25zW3RoaXMuZW5naW5lQW5pbWF0aW9uQ291bnRlcisrICUgdGhpcy5lbmdpbmVBbmltYXRpb25zLmxlbmd0aF07XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cbn1cbiJdfQ==