UNPKG

bp-prism-game

Version:
156 lines 23.1 kB
import { Component, ViewChild } from '@angular/core'; import { WaterClass } from '../water/water.class'; import { BLOCK_SIZE } from '../../gameboard/gameboard-constants'; import { AssetAlignEnum } from '../../asset/enum/asset-align.enum'; import { AssetAlignVerticalEnum } from '../../asset/enum/asset-align-vertical.enum'; import { TreeClass } from '../tree/tree.class'; import { RockClass } from '../rock/rock.class'; import { GrassClass } from '../grass/grass.class'; import { SlimeClass } from '../slime/slime.class'; import { LavaClass } from '../lava/lava.class'; import { ImageLoadedEnum } from '../../enum/image-loaded.enum'; import * as i0 from "@angular/core"; import * as i1 from "../../service/game.service"; import * as i2 from "@angular/common"; /** * The Scenery Component */ export class SceneryComponent { /** * The Constructor * @param gameService The GameService from DI */ constructor(gameService) { this.gameService = gameService; this.assets = [ { key: 'grass', name: 'Grass' }, { key: 'lava', name: 'Lava' }, { key: 'rock', name: 'Rock' }, { key: 'slime', name: 'Slime' }, { key: 'tree', name: 'Tree' }, { key: 'water', name: 'Water' } ]; } /** * On Init */ ngOnInit() { const rows = 25; const columns = 25; this.gameBoard = Array.from({ length: rows }, () => Array(columns).fill(0)); this.ctx = this.gameService.initBoard(this.canvas, rows, columns, BLOCK_SIZE * 5, this.gameBoard); this.addScenery(); this.animate(); } /** * Calculate the center posision */ calculatePosition() { const position = this.scenery.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle); (position.x -= BLOCK_SIZE / 2), (position.y -= BLOCK_SIZE / 2); return position; } /** * Add the prismBases */ addScenery() { this.sceneries = []; const grass = new GrassClass(this.gameService, this.ctx, 1); this.sceneries.push(grass); const lava = new LavaClass(this.gameService, this.ctx, 1); this.sceneries.push(lava); const rock = new RockClass(this.gameService, this.ctx, 1); this.sceneries.push(rock); const slime = new SlimeClass(this.gameService, this.ctx, 1); this.sceneries.push(slime); const tree = new TreeClass(this.gameService, this.ctx, 1); this.sceneries.push(tree); const water = new WaterClass(this.gameService, this.ctx, 1, ImageLoadedEnum.water0); this.sceneries.push(water); this.scenery = this.sceneries[5]; this.scenery.move(this.calculatePosition()); } /** * Animate the object once */ animateAsset() { this.scenery.move(this.calculatePosition()); this.scenery.isDestroyed = false; cancelAnimationFrame(this.requestId); this.animate(); } /** * Draw the board */ draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.ctx.fillStyle = 'red'; const position = this.calculatePosition(); const lineSize = 0.1; // Top this.ctx.fillRect(position.x - lineSize, position.y - lineSize, BLOCK_SIZE + lineSize * 2, lineSize); // Left this.ctx.fillRect(position.x - lineSize, position.y - lineSize, lineSize, BLOCK_SIZE + lineSize * 2); // Right this.ctx.fillRect(position.x + BLOCK_SIZE + lineSize, position.y - lineSize, lineSize, BLOCK_SIZE + lineSize * 2); // Bottom this.ctx.fillRect(position.x - lineSize, position.y + BLOCK_SIZE + lineSize, BLOCK_SIZE + lineSize * 2, lineSize); this.gameService.addOutlines(this.ctx, 1, lineSize); } /** * Animate */ animate() { this.draw(); this.scenery.animate(); this.requestId = requestAnimationFrame(this.animate.bind(this)); } /** * toggleAssets * * @param key The asset to display */ toggleAssets(key) { this.scenery.isDestroyed = true; this.draw(); let index = 0; this.sceneries.map((prismBase) => { prismBase.isDestroyed = true; }); this.assets.map((asset, $index) => { if (key === asset.key) { index = $index; } }); this.scenery = this.sceneries[index]; this.animateAsset(); } } SceneryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SceneryComponent, deps: [{ token: i1.GameService }], target: i0.ɵɵFactoryTarget.Component }); SceneryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SceneryComponent, selector: "bp-prism-scenery", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Scenery</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin-bottom:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SceneryComponent, decorators: [{ type: Component, args: [{ selector: 'bp-prism-scenery', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Scenery</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin-bottom:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }] }], ctorParameters: function () { return [{ type: i1.GameService }]; }, propDecorators: { canvas: [{ type: ViewChild, args: ['board', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL3NjZW5lcnkvdGVzdC1jb21wb25lbnQvc2NlbmVyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL3NjZW5lcnkvdGVzdC1jb21wb25lbnQvc2NlbmVyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFzQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFFL0Q7O0dBRUc7QUFNSCxNQUFNLE9BQU8sZ0JBQWdCO0lBb0MzQjs7O09BR0c7SUFDSCxZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1o7Z0JBQ0UsR0FBRyxFQUFFLE9BQU87Z0JBQ1osSUFBSSxFQUFFLE9BQU87YUFDYTtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsTUFBTTthQUNjO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxNQUFNO2dCQUNYLElBQUksRUFBRSxNQUFNO2FBQ2M7WUFDNUI7Z0JBQ0UsR0FBRyxFQUFFLE9BQU87Z0JBQ1osSUFBSSxFQUFFLE9BQU87YUFDYTtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsTUFBTTtnQkFDWCxJQUFJLEVBQUUsTUFBTTthQUNjO1lBQzVCO2dCQUNFLEdBQUcsRUFBRSxPQUFPO2dCQUNaLElBQUksRUFBRSxPQUFPO2FBQ2E7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYSxDQUFDLENBQUM7UUFFeEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVwQixNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFCLE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQixNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFCLE1BQU0sS0FBSyxHQUFH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QUFDO1FBQ1osSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFxQixFQUFFLEVBQUU7WUFDM0MsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQThCLEVBQUUsTUFBYyxFQUFFLEVBQUU7WUFDakUsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsS0FBSyxHQUFHLE1BQU0sQ0FBQzthQUNoQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs2R0FsTFUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsdUtDeEI3QiwyZkFjQTsyRkRVYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0Usa0JBQWtCO2tHQVM1QixNQUFNO3NCQURMLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdhbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9nYW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IFdhdGVyQ2xhc3MgfSBmcm9tICcuLi93YXRlci93YXRlci5jbGFzcyc7XG5pbXBvcnQgeyBTY2VuZXJ5Q2xhc3MgfSBmcm9tICcuLi9zY2VuZXJ5LmNsYXNzJztcbmltcG9ydCB7IEJMT0NLX1NJWkUgfSBmcm9tICcuLi8uLi9nYW1lYm9hcmQvZ2FtZWJvYXJkLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBBc3NldEFsaWduRW51bSB9IGZyb20gJy4uLy4uL2Fzc2V0L2VudW0vYXNzZXQtYWxpZ24uZW51bSc7XG5pbXBvcnQgeyBBc3NldEFsaWduVmVydGljYWxFbnVtIH0gZnJvbSAnLi4vLi4vYXNzZXQvZW51bS9hc3NldC1hbGlnbi12ZXJ0aWNhbC5lbnVtJztcbmltcG9ydCB7IFRyZWVDbGFzcyB9IGZyb20gJy4uL3RyZWUvdHJlZS5jbGFzcyc7XG5pbXBvcnQgeyBSb2NrQ2xhc3MgfSBmcm9tICcuLi9yb2NrL3JvY2suY2xhc3MnO1xuaW1wb3J0IHsgR3Jhc3NDbGFzcyB9IGZyb20gJy4uL2dyYXNzL2dyYXNzLmNsYXNzJztcbmltcG9ydCB7IFNsaW1lQ2xhc3MgfSBmcm9tICcuLi9zbGltZS9zbGltZS5jbGFzcyc7XG5pbXBvcnQgeyBMYXZhQ2xhc3MgfSBmcm9tICcuLi9sYXZhL2xhdmEuY2xhc3MnO1xuaW1wb3J0IHsgSUFzc2V0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL2Fzc2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZUxvYWRlZEVudW0gfSBmcm9tICcuLi8uLi9lbnVtL2ltYWdlLWxvYWRlZC5lbnVtJztcblxuLyoqXG4gKiBUaGUgU2NlbmVyeSBDb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnAtcHJpc20tc2NlbmVyeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2VuZXJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2NlbmVyeS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNjZW5lcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbnZhc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9hcmQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBDVFNcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3QgSWRcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJhc2VzXG4gICAqL1xuICBwcml2YXRlIHNjZW5lcmllczogU2NlbmVyeUNsYXNzW107XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlXG4gICAqL1xuICBwcml2YXRlIHNjZW5lcnk6IFNjZW5lcnlDbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzZXRzOiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xuICAvKipcbiAgICogR2FtZWJvYXJkXG4gICAqL1xuICBwcml2YXRlIGdhbWVCb2FyZDogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogVGhlIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2UgZnJvbSBESVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UpIHtcbiAgICB0aGlzLmFzc2V0cyA9IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZ3Jhc3MnLFxuICAgICAgICBuYW1lOiAnR3Jhc3MnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdsYXZhJyxcbiAgICAgICAgbmFtZTogJ0xhdmEnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdyb2NrJyxcbiAgICAgICAgbmFtZTogJ1JvY2snXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzbGltZScsXG4gICAgICAgIG5hbWU6ICdTbGltZSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3RyZWUnLFxuICAgICAgICBuYW1lOiAnVHJlZSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3dhdGVyJyxcbiAgICAgICAgbmFtZTogJ1dhdGVyJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogT24gSW5pdFxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgcm93cyA9IDI1O1xuICAgIGNvbnN0IGNvbHVtbnMgPSAyNTtcbiAgICB0aGlzLmdhbWVCb2FyZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJvd3MgfSwgKCkgPT4gQXJyYXkoY29sdW1ucykuZmlsbCgwKSBhcyBudW1iZXJbXSk7XG5cbiAgICB0aGlzLmN0eCA9IHRoaXMuZ2FtZVNlcnZpY2UuaW5pdEJvYXJkKHRoaXMuY2FudmFzLCByb3dzLCBjb2x1bW5zLCBCTE9DS19TSVpFICogNSwgdGhpcy5nYW1lQm9hcmQpO1xuXG4gICAgdGhpcy5hZGRTY2VuZXJ5KCk7XG4gICAgdGhpcy5hbmltYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBjZW50ZXIgcG9zaXNpb25cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlUG9zaXRpb24oKTogSUFzc2V0IHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2NlbmVyeS5wb3NpdGlvbkFzc2V0KEFzc2V0QWxpZ25FbnVtLmNlbnRlciwgQXNzZXRBbGlnblZlcnRpY2FsRW51bS5taWRkbGUpO1xuICAgIChwb3NpdGlvbi54IC09IEJMT0NLX1NJWkUgLyAyKSwgKHBvc2l0aW9uLnkgLT0gQkxPQ0tfU0laRSAvIDIpO1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHByaXNtQmFzZXNcbiAgICovXG4gIHByaXZhdGUgYWRkU2NlbmVyeSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjZW5lcmllcyA9IFtdO1xuXG4gICAgY29uc3QgZ3Jhc3MgPSBuZXcgR3Jhc3NDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG4gICAgdGhpcy5zY2VuZXJpZXMucHVzaChncmFzcyk7XG5cbiAgICBjb25zdCBsYXZhID0gbmV3IExhdmFDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG4gICAgdGhpcy5zY2VuZXJpZXMucHVzaChsYXZhKTtcblxuICAgIGNvbnN0IHJvY2sgPSBuZXcgUm9ja0NsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCAxKTtcbiAgICB0aGlzLnNjZW5lcmllcy5wdXNoKHJvY2spO1xuXG4gICAgY29uc3Qgc2xpbWUgPSBuZXcgU2xpbWVDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG4gICAgdGhpcy5zY2VuZXJpZXMucHVzaChzbGltZSk7XG5cbiAgICBjb25zdCB0cmVlID0gbmV3IFRyZWVDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG4gICAgdGhpcy5zY2VuZXJpZXMucHVzaCh0cmVlKTtcblxuICAgIGNvbnN0IHdhdGVyID0gbmV3IFdhdGVyQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIDEsIEltYWdlTG9hZGVkRW51bS53YXRlcjApO1xuICAgIHRoaXMuc2NlbmVyaWVzLnB1c2god2F0ZXIpO1xuXG4gICAgdGhpcy5zY2VuZXJ5ID0gdGhpcy5zY2VuZXJpZXNbNV07XG4gICAgdGhpcy5zY2VuZXJ5Lm1vdmUodGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBvYmplY3Qgb25jZVxuICAgKi9cbiAgYW5pbWF0ZUFzc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc2NlbmVyeS5tb3ZlKHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oKSk7XG4gICAgdGhpcy5zY2VuZXJ5LmlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0SWQpO1xuICAgIHRoaXMuYW5pbWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGRyYXcoKSB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ3JlZCc7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKCk7XG4gICAgY29uc3QgbGluZVNpemUgPSAwLjE7XG4gICAgLy8gVG9wXG4gICAgdGhpcy5jdHguZmlsbFJlY3QocG9zaXRpb24ueCAtIGxpbmVTaXplLCBwb3NpdGlvbi55IC0gbGluZVNpemUsIEJMT0NLX1NJWkUgKyBsaW5lU2l6ZSAqIDIsIGxpbmVTaXplKTtcbiAgICAvLyBMZWZ0XG4gICAgdGhpcy5jdHguZmlsbFJlY3QocG9zaXRpb24ueCAtIGxpbmVTaXplLCBwb3NpdGlvbi55IC0gbGluZVNpemUsIGxpbmVTaXplLCBCTE9DS19TSVpFICsgbGluZVNpemUgKiAyKTtcbiAgICAvLyBSaWdodFxuICAgIHRoaXMuY3R4LmZpbGxSZWN0KHBvc2l0aW9uLnggKyBCTE9DS19TSVpFICsgbGluZVNpemUsIHBvc2l0aW9uLnkgLSBsaW5lU2l6ZSwgbGluZVNpemUsIEJMT0NLX1NJWkUgKyBsaW5lU2l6ZSAqIDIpO1xuICAgIC8vIEJvdHRvbVxuICAgIHRoaXMuY3R4LmZpbGxSZWN0KHBvc2l0aW9uLnggLSBsaW5lU2l6ZSwgcG9zaXRpb24ueSArIEJMT0NLX1NJWkUgKyBsaW5lU2l6ZSwgQkxPQ0tfU0laRSArIGxpbmVTaXplICogMiwgbGluZVNpemUpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuYWRkT3V0bGluZXModGhpcy5jdHgsIDEsIGxpbmVTaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLnNjZW5lcnkuYW5pbWF0ZSgpO1xuICAgIHRoaXMucmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpIGFzIEZyYW1lUmVxdWVzdENhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVBc3NldHNcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgYXNzZXQgdG8gZGlzcGxheVxuICAgKi9cbiAgdG9nZ2xlQXNzZXRzKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY2VuZXJ5LmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHRoaXMuc2NlbmVyaWVzLm1hcCgocHJpc21CYXNlOiBXYXRlckNsYXNzKSA9PiB7XG4gICAgICBwcmlzbUJhc2UuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuYXNzZXRzLm1hcCgoYXNzZXQ6IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLCAkaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gYXNzZXQua2V5KSB7XG4gICAgICAgIGluZGV4ID0gJGluZGV4O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zY2VuZXJ5ID0gdGhpcy5zY2VuZXJpZXNbaW5kZXhdO1xuICAgIHRoaXMuYW5pbWF0ZUFzc2V0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnYW1lLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiYXNzZXQtdGl0bGVcIj5TY2VuZXJ5PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYW1lLWJvYXJkLWNvbnRhaW5lclwiPlxuICAgIDxjYW52YXMgI2JvYXJkIGNsYXNzPVwiZ2FtZS1ib2FyZFwiPjwvY2FudmFzPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhbmltYXRlQXNzZXQoKVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5BbmltYXRlPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgYXNzZXRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVBc3NldHMoYXNzZXQua2V5KVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAge3sgYXNzZXQubmFtZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=