bp-prism-game
Version:
The BP Prism Game
124 lines • 18.9 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { Alien1Class } from '../../alien-1/alien-1.class';
import { BLOCK_SIZE } from '../../../gameboard/gameboard-constants';
import { PathService } from '../../../service/path.service';
import { Alien2Class } from '../../alien-2/alien-2.class';
import { AlienDropshipClass } from '../../alien-dropship/alien-dropship.class';
import * as i0 from "@angular/core";
import * as i1 from "../../../service/game.service";
import * as i2 from "@angular/common";
/**
* The Alien Component
*/
export class AlienComponent {
/**
* The Constructor
* @param gameService The GameService from DI
*/
constructor(gameService) {
this.gameService = gameService;
this.isAnimateOnce = true;
this.pathService = new PathService();
this.assets = [
{
key: 'alien1',
name: 'A-1'
},
{
key: 'alien2',
name: 'A-2'
},
{
key: 'alien3',
name: 'AD-1'
}
];
}
/**
* On Init
*/
ngOnInit() {
const rows = 100;
const columns = 100;
this.gameBoard = Array.from({ length: rows }, () => Array(columns).fill(0));
this.gameBoard[9][5] = 10;
this.ctx = this.gameService.initBoard(this.canvas, rows, columns, BLOCK_SIZE, this.gameBoard);
this.addAliens();
this.animate(0);
}
/**
* Add the aliens
*/
addAliens() {
this.aliens = [];
const alien1 = new Alien1Class(this.gameService, this.ctx, 1);
alien1.assetScale = { x: 1, y: 1 };
alien1.setCreepPath(this.pathService.findShortestPath({ x: 10, y: 10 }, this.gameService.getGameBoard()));
alien1.isDestroyed = false;
this.aliens.push(alien1);
const alien2 = new Alien2Class(this.gameService, this.ctx, 1);
this.aliens.push(alien2);
const alien3 = new AlienDropshipClass(this.gameService, this.ctx, 1);
this.aliens.push(alien3);
this.alien = this.aliens[0];
}
/**
* Animate the object once
*/
animateAsset(now = 0) {
this.alien.assetScale = { x: 1, y: 1 };
this.alien.setCreepPath(this.pathService.findShortestPath({ x: 10, y: 10 }, this.gameService.getGameBoard()));
this.isAnimateOnce = !this.isAnimateOnce;
this.alien.isDestroyed = false;
cancelAnimationFrame(this.requestId);
this.animate(now);
}
/**
* Draw the board
*/
draw() {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.gameService.addOutlines(this.ctx, 5, 0.1);
}
/**
* Animate
* @param now the current time
*/
animate(now = 0) {
this.draw();
this.alien.animate(now);
if (!this.isAnimateOnce) {
this.requestId = requestAnimationFrame(this.animate.bind(this));
}
}
/**
* toggleAssets
*
* @param key The asset to display
*/
toggleAssets(key) {
this.alien.isDestroyed = true;
this.draw();
let index = 0;
this.aliens.map((alien) => {
alien.isDestroyed = true;
});
this.assets.map((asset, $index) => {
if (key === asset.key) {
index = $index;
}
});
this.alien = this.aliens[index];
this.animateAsset();
}
}
AlienComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AlienComponent, deps: [{ token: i1.GameService }], target: i0.ɵɵFactoryTarget.Component });
AlienComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: AlienComponent, selector: "bp-prism-alien", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Alien</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: AlienComponent, decorators: [{
type: Component,
args: [{ selector: 'bp-prism-alien', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Alien</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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9hbGllbnMvYWxpZW4vdGVzdC1jb21wb25lbnQvYWxpZW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9hbGllbnMvYWxpZW4vdGVzdC1jb21wb25lbnQvYWxpZW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7OztBQUcvRTs7R0FFRztBQU1ILE1BQU0sT0FBTyxjQUFjO0lBOEN6Qjs7O09BR0c7SUFDSCxZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaO2dCQUNFLEdBQUcsRUFBRSxRQUFRO2dCQUNiLElBQUksRUFBRSxLQUFLO2FBQ2U7WUFDNUI7Z0JBQ0UsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsSUFBSSxFQUFFLEtBQUs7YUFDZTtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsUUFBUTtnQkFDYixJQUFJLEVBQUUsTUFB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QUFLLENBQUMsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEdBQUcsTUFBTSxDQUFDO2FBQ2hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7OzJHQS9KVSxjQUFjOytGQUFkLGNBQWMscUtDckIzQix5ZkFjQTsyRkRPYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGdCQUFnQjtrR0FTMUIsTUFBTTtzQkFETCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEdhbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nYW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEFsaWVuQ2xhc3MgfSBmcm9tICcuLi9hbGllbi5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbjFDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLTEvYWxpZW4tMS5jbGFzcyc7XG5pbXBvcnQgeyBJQXNzZXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2UvYXNzZXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJMT0NLX1NJWkUgfSBmcm9tICcuLi8uLi8uLi9nYW1lYm9hcmQvZ2FtZWJvYXJkLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBQYXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvcGF0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEFsaWVuMkNsYXNzIH0gZnJvbSAnLi4vLi4vYWxpZW4tMi9hbGllbi0yLmNsYXNzJztcbmltcG9ydCB7IEFsaWVuRHJvcHNoaXBDbGFzcyB9IGZyb20gJy4uLy4uL2FsaWVuLWRyb3BzaGlwL2FsaWVuLWRyb3BzaGlwLmNsYXNzJztcbmltcG9ydCB7IEFzc2V0U2NhbGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2Fzc2V0LXNjYWxlLm1vZGUnO1xuXG4vKipcbiAqIFRoZSBBbGllbiBDb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnAtcHJpc20tYWxpZW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxpZW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hbGllbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEFsaWVuQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIFRoZSBjYW52YXNcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2JvYXJkJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICAvKipcbiAgICogQ1RTXG4gICAqL1xuICBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIC8qKlxuICAgKiByZXF1ZXN0IElkXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RJZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBhbGllbnNcbiAgICovXG4gIHByaXZhdGUgYWxpZW5zOiBBbGllbkNsYXNzW107XG5cbiAgLyoqXG4gICAqIFRoZSBhbGllblxuICAgKi9cbiAgcHJpdmF0ZSBhbGllbjogQWxpZW5DbGFzcztcblxuICAvKipcbiAgICogRGVidWcgQXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzZXRzOiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xuICAvKipcbiAgICogR2FtZWJvYXJkXG4gICAqL1xuICBwcml2YXRlIGdhbWVCb2FyZDogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogcGF0aCBzZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIHBhdGhTZXJ2aWNlOiBQYXRoU2VydmljZTtcblxuICAvKipcbiAgICogQW5pbWF0ZSBPbmNlXG4gICAqL1xuICBwcml2YXRlIGlzQW5pbWF0ZU9uY2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gZ2FtZVNlcnZpY2UgVGhlIEdhbWVTZXJ2aWNlIGZyb20gRElcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ2FtZVNlcnZpY2U6IEdhbWVTZXJ2aWNlKSB7XG4gICAgdGhpcy5pc0FuaW1hdGVPbmNlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdGhTZXJ2aWNlID0gbmV3IFBhdGhTZXJ2aWNlKCk7XG4gICAgdGhpcy5hc3NldHMgPSBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ2FsaWVuMScsXG4gICAgICAgIG5hbWU6ICdBLTEnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdhbGllbjInLFxuICAgICAgICBuYW1lOiAnQS0yJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYWxpZW4zJyxcbiAgICAgICAgbmFtZTogJ0FELTEnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBJbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCByb3dzID0gMTAwO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAxMDA7XG4gICAgdGhpcy5nYW1lQm9hcmQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiByb3dzIH0sICgpID0+IEFycmF5KGNvbHVtbnMpLmZpbGwoMCkgYXMgbnVtYmVyW10pO1xuICAgIHRoaXMuZ2FtZUJvYXJkWzldWzVdID0gMTA7XG5cbiAgICB0aGlzLmN0eCA9IHRoaXMuZ2FtZVNlcnZpY2UuaW5pdEJvYXJkKHRoaXMuY2FudmFzLCByb3dzLCBjb2x1bW5zLCBCTE9DS19TSVpFLCB0aGlzLmdhbWVCb2FyZCk7XG5cbiAgICB0aGlzLmFkZEFsaWVucygpO1xuICAgIHRoaXMuYW5pbWF0ZSgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGFsaWVuc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRBbGllbnMoKTogdm9pZCB7XG4gICAgdGhpcy5hbGllbnMgPSBbXTtcblxuICAgIGNvbnN0IGFsaWVuMSA9IG5ldyBBbGllbjFDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgMSk7XG4gICAgYWxpZW4xLmFzc2V0U2NhbGUgPSB7IHg6IDEsIHk6IDEgfSBhcyBBc3NldFNjYWxlTW9kZWw7XG4gICAgYWxpZW4xLnNldENyZWVwUGF0aCh0aGlzLnBhdGhTZXJ2aWNlLmZpbmRTaG9ydGVzdFBhdGgoeyB4OiAxMCwgeTogMTAgfSBhcyBJQXNzZXQsIHRoaXMuZ2FtZVNlcnZpY2UuZ2V0R2FtZUJvYXJkKCkpKTtcbiAgICBhbGllbjEuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmFsaWVucy5wdXNoKGFsaWVuMSk7XG5cbiAgICBjb25zdCBhbGllbjIgPSBuZXcgQWxpZW4yQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIDEpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW4yKTtcblxuICAgIGNvbnN0IGFsaWVuMyA9IG5ldyBBbGllbkRyb3BzaGlwQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIDEpO1xuICAgIHRoaXMuYWxpZW5zLnB1c2goYWxpZW4zKTtcblxuICAgIHRoaXMuYWxpZW4gPSB0aGlzLmFsaWVuc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBvYmplY3Qgb25jZVxuICAgKi9cbiAgYW5pbWF0ZUFzc2V0KG5vdyA9IDApOiB2b2lkIHtcbiAgICB0aGlzLmFsaWVuLmFzc2V0U2NhbGUgPSB7IHg6IDEsIHk6IDEgfSBhcyBBc3NldFNjYWxlTW9kZWw7XG4gICAgdGhpcy5hbGllbi5zZXRDcmVlcFBhdGgoXG4gICAgICB0aGlzLnBhdGhTZXJ2aWNlLmZpbmRTaG9ydGVzdFBhdGgoeyB4OiAxMCwgeTogMTAgfSBhcyBJQXNzZXQsIHRoaXMuZ2FtZVNlcnZpY2UuZ2V0R2FtZUJvYXJkKCkpXG4gICAgKTtcbiAgICB0aGlzLmlzQW5pbWF0ZU9uY2UgPSAhdGhpcy5pc0FuaW1hdGVPbmNlO1xuICAgIHRoaXMuYWxpZW4uaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlcXVlc3RJZCk7XG4gICAgdGhpcy5hbmltYXRlKG5vdyk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgYm9hcmRcbiAgICovXG4gIHByaXZhdGUgZHJhdygpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmdhbWVTZXJ2aWNlLmFkZE91dGxpbmVzKHRoaXMuY3R4LCA1LCAwLjEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGVcbiAgICogQHBhcmFtIG5vdyB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZShub3cgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5hbGllbi5hbmltYXRlKG5vdyk7XG4gICAgaWYgKCF0aGlzLmlzQW5pbWF0ZU9uY2UpIHtcbiAgICAgIHRoaXMucmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpIGFzIEZyYW1lUmVxdWVzdENhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlQXNzZXRzXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGFzc2V0IHRvIGRpc3BsYXlcbiAgICovXG4gIHRvZ2dsZUFzc2V0cyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWxpZW4uaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZHJhdygpO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgdGhpcy5hbGllbnMubWFwKChhbGllbjogQWxpZW5DbGFzcykgPT4ge1xuICAgICAgYWxpZW4uaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuYXNzZXRzLm1hcCgoYXNzZXQ6IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLCAkaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gYXNzZXQua2V5KSB7XG4gICAgICAgIGluZGV4ID0gJGluZGV4O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hbGllbiA9IHRoaXMuYWxpZW5zW2luZGV4XTtcbiAgICB0aGlzLmFuaW1hdGVBc3NldCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2FtZS1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFzc2V0LXRpdGxlXCI+QWxpZW48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImdhbWUtYm9hcmQtY29udGFpbmVyXCI+XG4gICAgPGNhbnZhcyAjYm9hcmQgY2xhc3M9XCJnYW1lLWJvYXJkXCI+PC9jYW52YXM+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImFuaW1hdGVBc3NldCgpXCIgY2xhc3M9XCJhbmltYXRpb24tYnV0dG9uIGJ1dHRvblwiPkFuaW1hdGU8L2J1dHRvbj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhc3NldCBvZiBhc3NldHNcIj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZUFzc2V0cyhhc3NldC5rZXkpXCIgY2xhc3M9XCJhbmltYXRpb24tYnV0dG9uIGJ1dHRvblwiPlxuICAgICAgICB7eyBhc3NldC5uYW1lIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==