UNPKG

bp-space-invaders

Version:
101 lines 18.6 kB
import { Component, ElementRef, ViewChild } from '@angular/core'; import { GameService } from '../../../service/game.service'; import { AssetAlignVerticalEnum } from '../../../asset/enum/asset-align-vertical.enum'; import { AssetAlignEnum } from '../../../asset/enum/asset-align.enum'; import { AlienBoss1Class } from '../../alien-boss-1/alien-boss-1.class'; import { AlienBoss2Class } from '../../alien-boss-2/alien-boss-2.class'; import { GameCookieService } from '../../../service/game-cookie.service'; import * as i0 from "@angular/core"; import * as i1 from "../../../service/game.service"; import * as i2 from "../../../service/game-cookie.service"; import * as i3 from "@angular/common"; export class AlienBossComponent { constructor(gameService, gameCookieService) { this.gameService = gameService; this.gameCookieService = gameCookieService; this.isAnimateOnce = true; this.assets = [ { key: 'alienBoss', name: 'Boss' }, { key: 'alienBoss2', name: 'Boss 2' } ]; } ngOnInit() { const columns = 20; const rows = 20; this.ctx = this.gameService.initBoard(this.canvas, rows, columns, 25); this.addAlienBosses({ x: 0, y: 0, height: rows, width: columns }); this.toggleAssets(this.gameCookieService.getSecondaryDebugData()); this.animate(); } addAlienBosses(boundary) { this.alienBosses = []; const boss = new AlienBoss1Class(this.gameService, this.ctx, boundary, 1); boss.move(boss.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle)); boss.isAnimateOnce = true; this.alienBosses.push(boss); const boss2 = new AlienBoss2Class(this.gameService, this.ctx, boundary, 1); boss2.move(boss2.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle)); boss2.isAnimateOnce = true; this.alienBosses.push(boss2); this.alienBoss = this.alienBosses[1]; this.alienBoss.isAnimateOnce = true; this.alienBoss.isDestroyed = false; } animateAsset() { this.isAnimateOnce = !this.isAnimateOnce; this.alienBoss.isDestroyed = false; this.alienBoss.move(this.alienBoss.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle)); cancelAnimationFrame(this.requestId); this.animate(); } draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.gameService.addOutlines(this.ctx, 1, 0.025); } animate() { this.draw(); this.alienBoss.animate(); if (!this.isAnimateOnce) { this.requestId = requestAnimationFrame(this.animate.bind(this)); } } toggleAssets(key) { this.alienBoss.isDestroyed = true; this.draw(); let index = 0; this.alienBosses.map((alienBoss) => { alienBoss.isDestroyed = true; }); this.assets.map((asset, $index) => { if (key === asset.key) { index = $index; this.gameCookieService.setDebugData({ secondaryAssetName: key }); } }); this.alienBoss = this.alienBosses[index]; this.animateAsset(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: AlienBossComponent, deps: [{ token: i1.GameService }, { token: i2.GameCookieService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: AlienBossComponent, selector: "bp-alien-boss", 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: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-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{font-size:16px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: AlienBossComponent, decorators: [{ type: Component, args: [{ selector: 'bp-alien-boss', 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: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-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{font-size:16px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }] }], ctorParameters: () => [{ type: i1.GameService }, { type: i2.GameCookieService }], propDecorators: { canvas: [{ type: ViewChild, args: ['board', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZW4tYm9zcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGFjZS1pbnZhZGVycy9zcmMvbGliL2FsaWVucy9hbGllbi1ib3NzL3Rlc3QtY29tcG9uZW50L2FsaWVuLWJvc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BhY2UtaW52YWRlcnMvc3JjL2xpYi9hbGllbnMvYWxpZW4tYm9zcy90ZXN0LWNvbXBvbmVudC9hbGllbi1ib3NzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBVXpFLE1BQU0sT0FBTyxrQkFBa0I7SUEwQzdCLFlBQW9CLFdBQXdCLEVBQVUsaUJBQW9DO1FBQXRFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN4RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1o7Z0JBQ0UsR0FBRyxFQUFFLFdBQVc7Z0JBQ2hCLElBQUksRUFBRSxNQUFNO2FBQ2M7WUFDNUI7Z0JBQ0UsR0FBRyxFQUFFLFlB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QU07c0JBREwsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLXZlcnRpY2FsLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnbkVudW0gfSBmcm9tICcuLi8uLi8uLi9hc3NldC9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hc3NldC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEJvdW5kYXJ5U2V0dXBNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2JvdW5kYXJ5LXNldC5tb2RlbCc7XG5pbXBvcnQgeyBBbGllbkJvc3MxQ2xhc3MgfSBmcm9tICcuLi8uLi9hbGllbi1ib3NzLTEvYWxpZW4tYm9zcy0xLmNsYXNzJztcbmltcG9ydCB7IEFsaWVuQm9zc0NsYXNzIH0gZnJvbSAnLi4vYWxpZW4tYm9zcy5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbkJvc3MyQ2xhc3MgfSBmcm9tICcuLi8uLi9hbGllbi1ib3NzLTIvYWxpZW4tYm9zcy0yLmNsYXNzJztcbmltcG9ydCB7IERlYnVnRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZGVidWctZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBHYW1lQ29va2llU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvZ2FtZS1jb29raWUuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIEFsaWVuIENvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdicC1hbGllbi1ib3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsaWVuLWJvc3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hbGllbi1ib3NzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQWxpZW5Cb3NzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIFRoZSBjYW52YXNcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2JvYXJkJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICAvKipcbiAgICogQ1RTXG4gICAqL1xuICBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIC8qKlxuICAgKiByZXF1ZXN0IElkXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RJZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGlzQW5pbWF0ZU9uY2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGFsaWVuc1xuICAgKi9cbiAgcHJpdmF0ZSBhbGllbkJvc3NlczogQWxpZW5Cb3NzQ2xhc3NbXTtcblxuICAvKipcbiAgICogVGhlIGFsaWVuXG4gICAqL1xuICBwcml2YXRlIGFsaWVuQm9zczogQWxpZW5Cb3NzQ2xhc3M7XG5cbiAgLyoqXG4gICAqIERlYnVnIEFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzc2V0czogQXNzZXRDb25maWd1cmF0aW9uTW9kZWxbXTtcblxuICAvKipcbiAgICogVGhlIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgR2FtZVNlcnZpY2UgZnJvbSBESVxuICAgKiBAcGFyYW0gZ2FtZUNvb2tpZSBUaGUgR2FtZSBDb29raWUgU2VydmljZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UsIHByaXZhdGUgZ2FtZUNvb2tpZVNlcnZpY2U6IEdhbWVDb29raWVTZXJ2aWNlKSB7XG4gICAgdGhpcy5pc0FuaW1hdGVPbmNlID0gdHJ1ZTtcbiAgICB0aGlzLmFzc2V0cyA9IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYWxpZW5Cb3NzJyxcbiAgICAgICAgbmFtZTogJ0Jvc3MnXG4gICAgICB9IGFzIEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLFxuICAgICAge1xuICAgICAgICBrZXk6ICdhbGllbkJvc3MyJyxcbiAgICAgICAgbmFtZTogJ0Jvc3MgMidcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIEluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSAyMDtcbiAgICBjb25zdCByb3dzID0gMjA7XG4gICAgdGhpcy5jdHggPSB0aGlzLmdhbWVTZXJ2aWNlLmluaXRCb2FyZCh0aGlzLmNhbnZhcywgcm93cywgY29sdW1ucywgMjUpO1xuICAgIHRoaXMuYWRkQWxpZW5Cb3NzZXMoe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBoZWlnaHQ6IHJvd3MsXG4gICAgICB3aWR0aDogY29sdW1uc1xuICAgIH0gYXMgQm91bmRhcnlTZXR1cE1vZGVsKTtcblxuICAgIHRoaXMudG9nZ2xlQXNzZXRzKHRoaXMuZ2FtZUNvb2tpZVNlcnZpY2UuZ2V0U2Vjb25kYXJ5RGVidWdEYXRhKCkpO1xuXG4gICAgdGhpcy5hbmltYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBhbGllbnNcbiAgICovXG4gIHByaXZhdGUgYWRkQWxpZW5Cb3NzZXMoYm91bmRhcnk6IEJvdW5kYXJ5U2V0dXBNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuYWxpZW5Cb3NzZXMgPSBbXTtcblxuICAgIGNvbnN0IGJvc3MgPSBuZXcgQWxpZW5Cb3NzMUNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCBib3VuZGFyeSwgMSk7XG4gICAgYm9zcy5tb3ZlKGJvc3MucG9zaXRpb25Bc3NldChBc3NldEFsaWduRW51bS5jZW50ZXIsIEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0ubWlkZGxlKSk7XG4gICAgYm9zcy5pc0FuaW1hdGVPbmNlID0gdHJ1ZTtcbiAgICB0aGlzLmFsaWVuQm9zc2VzLnB1c2goYm9zcyk7XG5cbiAgICBjb25zdCBib3NzMiA9IG5ldyBBbGllbkJvc3MyQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIGJvdW5kYXJ5LCAxKTtcbiAgICBib3NzMi5tb3ZlKGJvc3MyLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIGJvc3MyLmlzQW5pbWF0ZU9uY2UgPSB0cnVlO1xuICAgIHRoaXMuYWxpZW5Cb3NzZXMucHVzaChib3NzMik7XG5cbiAgICB0aGlzLmFsaWVuQm9zcyA9IHRoaXMuYWxpZW5Cb3NzZXNbMV07XG4gICAgdGhpcy5hbGllbkJvc3MuaXNBbmltYXRlT25jZSA9IHRydWU7XG4gICAgdGhpcy5hbGllbkJvc3MuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBvYmplY3Qgb25jZVxuICAgKi9cbiAgYW5pbWF0ZUFzc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNBbmltYXRlT25jZSA9ICF0aGlzLmlzQW5pbWF0ZU9uY2U7XG4gICAgdGhpcy5hbGllbkJvc3MuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmFsaWVuQm9zcy5tb3ZlKHRoaXMuYWxpZW5Cb3NzLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVxdWVzdElkKTtcbiAgICB0aGlzLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBib2FyZFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3KCkge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuYWRkT3V0bGluZXModGhpcy5jdHgsIDEsIDAuMDI1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLmFsaWVuQm9zcy5hbmltYXRlKCk7XG4gICAgaWYgKCF0aGlzLmlzQW5pbWF0ZU9uY2UpIHtcbiAgICAgIHRoaXMucmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpIGFzIEZyYW1lUmVxdWVzdENhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlQXNzZXRzXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGFzc2V0IHRvIGRpc3BsYXlcbiAgICovXG4gIHRvZ2dsZUFzc2V0cyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWxpZW5Cb3NzLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHRoaXMuYWxpZW5Cb3NzZXMubWFwKChhbGllbkJvc3M6IEFsaWVuQm9zc0NsYXNzKSA9PiB7XG4gICAgICBhbGllbkJvc3MuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuYXNzZXRzLm1hcCgoYXNzZXQ6IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsLCAkaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gYXNzZXQua2V5KSB7XG4gICAgICAgIGluZGV4ID0gJGluZGV4O1xuICAgICAgICB0aGlzLmdhbWVDb29raWVTZXJ2aWNlLnNldERlYnVnRGF0YSh7XG4gICAgICAgICAgc2Vjb25kYXJ5QXNzZXROYW1lOiBrZXlcbiAgICAgICAgfSBhcyBEZWJ1Z0RhdGFNb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsaWVuQm9zcyA9IHRoaXMuYWxpZW5Cb3NzZXNbaW5kZXhdO1xuICAgIHRoaXMuYW5pbWF0ZUFzc2V0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnYW1lLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiYXNzZXQtdGl0bGVcIj5BbGllbjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ2FtZS1ib2FyZC1jb250YWluZXJcIj5cbiAgICA8Y2FudmFzICNib2FyZCBjbGFzcz1cImdhbWUtYm9hcmRcIj48L2NhbnZhcz5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYW5pbWF0ZUFzc2V0KClcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+QW5pbWF0ZTwvYnV0dG9uPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGFzc2V0IG9mIGFzc2V0c1wiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlQXNzZXRzKGFzc2V0LmtleSlcIiBjbGFzcz1cImFuaW1hdGlvbi1idXR0b24gYnV0dG9uXCI+XG4gICAgICAgIHt7IGFzc2V0Lm5hbWUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19