@zthun/romulator-api 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/files/files-module.d.mts +5 -0
- package/dist/files/files-service.d.mts +90 -4
- package/dist/main.cjs +188 -119
- package/dist/main.cjs.map +1 -1
- package/dist/main.js +191 -122
- package/dist/main.js.map +1 -1
- package/dist/systems/systems-service.d.mts +4 -5
- package/package.json +7 -7
package/dist/main.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.cjs","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/files/files-service.mts","../src/files/files-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .generation(3)\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .generation(4)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .generation(5)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .generation(6)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .generation(7)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .generation(8)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .generation(9)\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n\n const data = await source.retrieve($request);\n const count = await source.count($request);\n\n return new ZPageBuilder().count(count).data(data).build();\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const { data: games } = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorGame>> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport type { IZFileRepository, IZFileSystemNode } from \"@zthun/crumbtrail-fs\";\nimport { ZFileRepository, ZStreamFolder } from \"@zthun/crumbtrail-fs\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport {\n ZDataRequestBuilder,\n ZFilterBinaryBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport { trimEnd } from \"lodash-es\";\nimport { resolve, sep } from \"node:path\";\nimport { env } from \"node:process\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\n\nexport const ZRomulatorFilesToken = Symbol(\"files\");\n\nexport interface IZRomulatorFilesService {\n media(): Promise<IZFileSystemNode[]>;\n}\n\n@Injectable()\nexport class ZRomulatorFilesService implements IZRomulatorFilesService {\n private static readonly MediaFolderName = \".media\";\n private static readonly InfoFolderName = \".info\";\n\n private _repository: ZFileRepository = new ZFileRepository();\n private _folderWriter = new ZStreamFolder();\n private _globs: string[];\n\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {\n const slugs = Object.values(ZRomulatorSystemId);\n this._globs = [\".media/**\", \".info/**\", ...slugs.map((s) => `${s}/*.*`)];\n }\n\n private async gamesFolder() {\n const config = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(config.contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _gamesFolder = firstDefined(fallback.gamesFolder, gamesFolder);\n return detokenize(_gamesFolder, env);\n }\n\n private async mediaFolder() {\n const gamesFolder = await this.gamesFolder();\n return resolve(gamesFolder, ZRomulatorFilesService.MediaFolderName);\n }\n\n private async infoFolder() {\n const gamesFolder = await this.gamesFolder();\n return resolve(gamesFolder, ZRomulatorFilesService.InfoFolderName);\n }\n\n private async repository(): Promise<IZFileRepository> {\n const path = await this.gamesFolder();\n\n if (this._repository.path !== path) {\n await this._folderWriter.write(await this.mediaFolder());\n await this._folderWriter.write(await this.infoFolder());\n await this._repository.initialize(path, this._globs);\n }\n\n return this._repository;\n }\n\n public async media(): Promise<IZFileSystemNode[]> {\n const repository = await this.repository();\n const prefix = trimEnd(await this.mediaFolder(), \"/\");\n const folder = `${prefix}${sep}`;\n\n const filter = new ZFilterBinaryBuilder()\n .subject(\"path\")\n .startsWith()\n .value(folder)\n .build();\n\n const sort = new ZSortBuilder().ascending(\"path\").build();\n\n const request = new ZDataRequestBuilder().filter(filter).sort(sort).build();\n return repository.retrieve(request);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport {\n ZRomulatorFilesService,\n ZRomulatorFilesToken,\n} from \"./files-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule],\n providers: [\n { provide: ZRomulatorFilesToken, useClass: ZRomulatorFilesService },\n ],\n exports: [ZRomulatorFilesToken],\n})\nexport class ZRomulatorFilesModule {}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport { createError, firstDefined, firstTruthy } from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport type { IZRomulatorFilesService } from \"../files/files-service.mjs\";\nimport { ZRomulatorFilesToken } from \"../files/files-service.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZRomulatorFilesToken) private _files: IZRomulatorFilesService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async findAllMedia(): Promise<IZRomulatorMedia[]> {\n const files = await this._files.media();\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n let msg = `Querying media`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia();\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia();\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiQuery, ApiResponse, ApiTags } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@ApiTags(\"Media\")\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @ApiQuery({\n name: \"page\",\n required: false,\n type: Number,\n example: 1,\n description: \"Page number (1-based)\",\n })\n @ApiQuery({\n name: \"size\",\n required: false,\n type: Number,\n example: 20,\n description: \"Items per page. Defaults to Infinity\",\n })\n @ApiQuery({\n name: \"search\",\n required: false,\n type: String,\n description: \"Search query\",\n })\n @ApiQuery({\n name: \"sort\",\n required: false,\n type: String,\n description: \"Sort criterion\",\n })\n @ApiQuery({\n name: \"filter\",\n required: false,\n type: String,\n description: \"Filter criterion\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the requested page of media and the total count\",\n })\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorFilesModule } from \"../files/files-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZLoggerModule, ZRomulatorFilesModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { find } from \"lodash-es\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"./system-known.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const { contents } = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = contents;\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _folder = firstDefined(fallback, gamesFolder);\n\n const cwd = detokenize(_folder, process.env);\n msg = `Looking for systems in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const searchOptions = { cwd };\n const folders = await this._file.search(\"*/\", searchOptions);\n\n const systems = folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .map((slug) => this._createSystemFromSlug(slug))\n .filter((system) => system != null);\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder().data(data).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n const all = await this.list(new ZDataRequestBuilder().build());\n const system = find(all.data, (system) => system.id === id);\n\n if (!system) {\n throw new NotFoundException(`Unable to find system with id, ${id}.`);\n }\n\n return system;\n }\n\n private _createSystemFromSlug(slug: string): IZRomulatorSystem | null {\n // A romulator system's slug should read the metadata.json file from the root\n return ZRomulatorSystemKnown.from(slug);\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","generation","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorFilesToken","ZRomulatorFilesService","MediaFolderName","InfoFolderName","_repository","ZFileRepository","_folderWriter","ZStreamFolder","_globs","slugs","values","_gamesFolder","mediaFolder","infoFolder","repository","write","initialize","media","prefix","trimEnd","folder","sep","ZFilterBinaryBuilder","subject","startsWith","value","ZRomulatorFilesModule","ZRomulatorMediaToken","ZRomulatorMediaService","_files","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","required","Number","example","String","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_folder","searchOptions","folders","slug","_createSystemFromSlug","sourceOptions","ZRomulatorSystemsController","_systems","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAMA,yBAAAA,CAAAA;IAOXC,QAAY;AACd;;;QALiBC,IAAM,EAAA,QAAA;AAAUC,QAAAA,UAAAA,EAAY;;;QAC9BC,OAAS,EAAA;;;QACVA,OAAS,EAAA;;;;;;ACLhB,MAAeC,IAAAA,CAAAA;AACpB,IAAA,OAAcC,WAAc,GAAA;QAC1B,OAAOC,iBAAAA,CAAQC,mBAAW,aAAe,EAAA,WAAA,CAAA;AAC3C;AAEA,IAAA,OAAcC,OAAU,GAAA;QACtB,OAAOF,iBAAAA,CAAQF,IAAKC,CAAAA,WAAW,EAAI,EAAA,SAAA,CAAA;AACrC;AACF;;ACHO,MAAeI,qBAAAA,CAAAA;AACpB,IAAA,OAAcC,GAAM,GAAA;QAClB,OAAO;AAACD,YAAAA,qBAAAA,CAAsBE,KAAK;AAAG,SAAA;AACxC;IAEA,OAAeC,MAAAA,CAAOC,EAAsB,EAAE;QAC5C,MAAMC,IAAAA,GAAOR,kBAAQF,IAAKI,CAAAA,OAAO,IAAI,CAAGK,EAAAA,EAAAA,CAAG,KAAK,CAAC,CAAA;AACjD,QAAA,OAAO,IAAIE,uCAA0BF,EAAAA,CAAAA,EAAE,CAACA,EAAAA,CAAAA,CAAIC,IAAI,CAACA,IAAAA,CAAAA;AACnD;AAEA,IAAA,OAAcH,KAAQ,GAAA;QACpB,OAAOF,qBAAAA,CAAsBG,MAAM,CAACI,kCAAAA,CAAmBC,KAAK,CACzDC,CAAAA,IAAI,CAAC,eACLC,CAAAA,CAAAA,WAAW,CAAC,yDACZC,CAAAA,CAAAA,MAAM,CAAC,SACPC,CAAAA,CAAAA,QAAQ,CAACC,6CAA8BZ,CAAAA,GAAG,IAC1Ca,KAAK,EAAA;AACV;AACF;;;;;;;;;;;;;;;;ACEO,MAAMC,sBAAyBC,GAAAA,MAAAA,CAAO,SAAW,CAAA;AASjD,MAAMC,wBAAAA,CAAAA;IACHC,OAAkB;IAE1B,WAAmB,CAAsBA,OAAiB,CAAE;AAC1D,QAAA,IAAI,CAACA,OAAO,GAAG,IAAIC,8BAAe,0BAA4BD,EAAAA,OAAAA,CAAAA;AAChE;IAEA,MAAaE,IAAAA,CAAKC,GAAkB,EAAsC;AACxE,QAAA,MAAMC,IAAOC,GAAAA,sBAAAA,CAAa,CAAGF,EAAAA,GAAAA,CAAIC,IAAI,CAAA;AACrC,QAAA,MAAME,IAAOD,GAAAA,sBAAAA,CAAaE,QAAUJ,EAAAA,GAAAA,CAAIG,IAAI,CAAA;AAC5C,QAAA,IAAIE,MAAM,CAAC,yBAAyB,EAAEJ,IAAK,CAAA,aAAa,EAAEE,IAAM,CAAA,CAAA;AAChE,QAAA,IAAI,CAACN,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;QAEjE,MAAMf,OAAAA,GAAUC,sBAAsBC,GAAG,EAAA;AACzC,QAAA,MAAM6B,UAAU,IAAIC,4CAAAA,EAAAA,CACjBC,MAAM,CAAC,IAAIC,kCACXnB,KAAK,EAAA;QACR,MAAMoB,MAAAA,GAAS,IAAIC,8BAAAA,CAAqCpC,OAAS+B,EAAAA,OAAAA,CAAAA;AAEjE,QAAA,MAAMM,IAAO,GAAA,MAAMF,MAAOG,CAAAA,QAAQ,CAAChB,GAAAA,CAAAA;AACnC,QAAA,MAAMiB,KAAQ,GAAA,MAAMJ,MAAOI,CAAAA,KAAK,CAACjB,GAAAA,CAAAA;QAEjCK,GAAM,GAAA,CAAC,gBAAgB,EAAEU,IAAKG,CAAAA,MAAM,CAAC,gBAAgB,EAAED,KAAM,CAAA,MAAM,CAAC;AACpE,QAAA,IAAI,CAACpB,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;QAEjE,OAAO,IAAI0B,4BACRJ,IAAI,CAACA,MACLE,KAAK,CAACA,OACNxB,KAAK,EAAA;AACV;IAEA,MAAa2B,GAAAA,CACXrC,EAAsB,EACmB;AACzC,QAAA,MAAMsC,MAAS,GAAA,MAAM,IAAI,CAACC,KAAK,CAACvC,EAAAA,CAAAA;AAChC,QAAA,IAAIsB,MAAM,CAAC,iDAAiD,EAAEtB,EAAAA,CAAG,CAAC,CAAC;AACnE,QAAA,IAAIb,WAAgB,EAAC;QAErB,IAAI;AACF,YAAA,IAAI,CAAC2B,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AACjE,YAAA,MAAM8B,MAAS,GAAA,MAAMC,iBAASH,CAAAA,MAAAA,CAAOrC,IAAI,CAAA;YACzC,MAAMyC,IAAAA,GAAOF,MAAOG,CAAAA,QAAQ,CAAC,OAAA,CAAA;YAC7BxD,QAAWyD,GAAAA,IAAAA,CAAKC,KAAK,CAACH,IAAAA,CAAAA;AACtBpB,YAAAA,GAAAA,GAAM,CAAC,kCAAkC,EAAEkB,OAAOM,UAAU,CAAC,OAAO,CAAC;AACrE,YAAA,IAAI,CAAChC,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AACnE,SAAA,CAAE,OAAOqC,CAAG,EAAA;YACVzB,GAAM0B,GAAAA,qBAAAA,CAAYD,GAAGzD,OAAO;AAC5B,YAAA,IAAI,CAACwB,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmByB,EAAAA,CAAAA,OAAO,EAAG3D,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AACtE;QAEA,MAAMwC,MAAAA,GAAS,IAAIhD,uCAChBiD,EAAAA,CAAAA,IAAI,CAACb,MACLnD,CAAAA,CAAAA,QAAQ,CAACA,QAAAA,CAAAA,CACTuB,KAAK,EAAA;QAER,OAAO0C,OAAAA,CAAQ3D,OAAO,CAACyD,MAAAA,CAAAA;AACzB;AAEA,IAAA,MAAaG,MACXrD,CAAAA,EAAsB,EACtBsD,MAA2C,EACF;AACzC,QAAA,MAAMhB,MAAS,GAAA,MAAM,IAAI,CAACD,GAAG,CAAIrC,EAAAA,CAAAA;AAEjC,QAAA,IAAIsB,GAAM,GAAA,CAAC,sBAAsB,EAAEtB,EAAI,CAAA,CAAA;AACvC,QAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAEjE,QAAA,MAAM6C,IAAO,GAAA;AAAE,YAAA,GAAGjB,OAAOnD,QAAQ;AAAE,YAAA,GAAGmE,OAAOnE;AAAS,SAAA;QACtD,MAAMuD,IAAAA,GAAOE,IAAKY,CAAAA,SAAS,CAACD,IAAAA,CAAAA;QAE5B,IAAI;AACF,YAAA,MAAME,cAAMC,CAAAA,iBAAAA,CAAQpB,MAAOrC,CAAAA,IAAI,CAAG,EAAA;gBAAE0D,SAAW,EAAA;AAAK,aAAA,CAAA;YACpD,MAAMC,kBAAAA,CAAUtB,MAAOrC,CAAAA,IAAI,EAAEyC,IAAAA,CAAAA;YAC7B,OAAO,IAAIxC,0CACRiD,IAAI,CAACb,QACLnD,QAAQ,CAACoE,MACT7C,KAAK,EAAA;AACV,SAAA,CAAE,OAAOqC,CAAG,EAAA;AACV,YAAA,MAAMc,QAAQb,qBAAYD,CAAAA,CAAAA,CAAAA;AAC1BzB,YAAAA,GAAAA,GAAM,CAAC,oBAAoB,EAAEgB,MAAAA,CAAOrC,IAAI,CAAE,CAAA;AAC1C,YAAA,IAAI,CAACa,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBqC,EAAAA,CAAAA,KAAK,EAAGvE,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAClEY,YAAAA,GAAAA,GAAMuC,MAAMvE,OAAO;AACnB,YAAA,IAAI,CAACwB,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBqC,EAAAA,CAAAA,KAAK,EAAGvE,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAClE,YAAA,OAAO0C,OAAQU,CAAAA,MAAM,CAAC,IAAIC,mCAA6BF,CAAAA,KAAAA,CAAAA,CAAAA;AACzD;AACF;IAEA,MAActB,KAAAA,CAAMvC,EAAsB,EAA8B;AACtE,QAAA,IAAIsB,GAAM,GAAA,CAAC,+BAA+B,EAAEtB,EAAI,CAAA,CAAA;AAChD,QAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;QACjE,MAAMf,OAAAA,GAAUC,sBAAsBC,GAAG,EAAA;AACzC,QAAA,MAAMyC,SAAS0B,aAAKrE,CAAAA,OAAAA,EAAS,CAACsE,CAAMA,GAAAA,CAAAA,CAAEjE,EAAE,KAAKA,EAAAA,CAAAA;AAE7C,QAAA,IAAIsC,UAAU,IAAM,EAAA;YAClBhB,GAAM,GAAA,CAAC,uBAAuB,EAAEtB,EAAI,CAAA,CAAA;AACpC,YAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBqC,EAAAA,CAAAA,KAAK,EAAGvE,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAClE,YAAA,OAAO0C,OAAQU,CAAAA,MAAM,CAAC,IAAII,wBAAkB5C,CAAAA,GAAAA,CAAAA,CAAAA;AAC9C;AAEAA,QAAAA,GAAAA,GAAM,CAAC,QAAQ,EAAEtB,EAAAA,CAAG,OAAO,CAAC;AAC5B,QAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;QAEjE,OAAO4B,MAAAA;AACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;ACtHO,MAAM6B,2BAAAA,CAAAA;;IACX,WACE,CACiBC,QAAmC,CACpD;aADiBA,QAAAA,GAAAA,QAAAA;AAChB;IAEH,MACapD,IAAAA,CACX,KAAkC,EACE;AACpC,QAAA,MAAMqD,UAAU,IAAIC,gCAAAA,EAAAA,CAAsBC,KAAK,CAACA,OAAO7D,KAAK,EAAA;AAC5D,QAAA,OAAO,IAAI,CAAC0D,QAAQ,CAACpD,IAAI,CAACqD,OAAAA,CAAAA;AAC5B;AAEA,IAAA,MAkBahB,OACX,cAA2D,EACnDmB,OAAkC,EACd;AAC5B,QAAA,OAAO,IAAI,CAACJ,QAAQ,CAACf,MAAM,CAACoB,cAAgBD,EAAAA,OAAAA,CAAAA;AAC9C;IAEA,MAManC,GAAAA,CACX,cAA2D,EAC/B;AAC5B,QAAA,OAAO,MAAM,IAAI,CAAC+B,QAAQ,CAAC/B,GAAG,CAACoC,cAAAA,CAAAA;AACjC;AACF;;;;;;;;;;;;QAnCIrF,IAAM,EAAA,QAAA;QACNiB,IAAM,EAAA,gBAAA;QACNC,WAAa,EAAA;;;QAGblB,IAAMF,EAAAA;;;wBAIFwF,qBAAe,CAAA;QACjBC,SAAW,EAAA,IAAA;QACXC,SAAW,EAAA,IAAA;QACXC,qBAAuB,EAAA,KAAA;QACvBC,kBAAoB,EAAA,KAAA;QACpBC,uBAAyB,EAAA;AAC3B,KAAA,CAAA,CAAA;;;;;;;;;;;;QAUA3F,IAAM,EAAA,QAAA;QACNiB,IAAM,EAAA,gBAAA;QACNC,WAAa,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;AChDV,MAAM0E,uBAAAA,CAAAA;AAAyB;;;QAPpCC,OAAS,EAAA;AAACC,YAAAA,gCAAAA;AAAmBC,YAAAA;AAAc,SAAA;QAC3CC,WAAa,EAAA;AAACjB,YAAAA;AAA4B,SAAA;QAC1CkB,SAAW,EAAA;AACT,YAAA;gBAAEC,OAAS3E,EAAAA,sBAAAA;gBAAwB4E,QAAU1E,EAAAA;AAAyB;AACvE,SAAA;QACD2E,OAAS,EAAA;AAAC7E,YAAAA;AAAuB;;;;;;;;;;;;;ACPnC,MAAM8E,WAAc,GAAA,oCAAA;AAEpB;;AAEC,IACM,MAAeC,qBAAAA,CAAAA;AACpB;;;;;AAKC,MACD,OAAc7F,GAAM,GAAA;QAClB,MAAMR,UAAAA,GAAasG,MAAOC,CAAAA,mBAAmB,CAACF,qBAAAA,CAAAA;QAC9C,MAAMG,OAAAA,GAAUxG,WACbyG,MAAM,CAAC,CAACC,CAAMC,GAAAA,0BAAAA,CAASP,aAAaC,qBAAuBK,EAAAA,CAAAA,CAAAA,CAAAA,CAC3DE,GAAG,CAAC,CAACF,IAAML,qBAAqB,CAACK,EAAE,CACnCE,CAAAA,GAAG,CAAC,CAACC,CAAMA,GAAAA,CAAAA,CAAAA;AACd,QAAA,OAAOL,QAAQI,GAAG,CAAC,CAACE,CAAMA,GAAAA,CAAAA,CAAEC,IAAI,CAAC,IAAA,CAAA,CAAA;AACnC;AAEA;;;;;;;AAOC,MACD,OACcC,GAAM,GAAA;AAClB,QAAA,OAAO,IAAIC,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBC,QAAQ,CAAA,CAC9BC,OAAO,EAAA,CACPpG,IAAI,CAAC,+BAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACciG,IAAO,GAAA;AACnB,QAAA,OAAO,IAAIL,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBK,aAAa,CAAA,CACnCH,OAAO,EAAA,CACPpG,IAAI,CAAC,qCAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACcmG,GAAM,GAAA;AAClB,QAAA,OAAO,IAAIP,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBO,UAAU,CAAA,CAChCL,OAAO,EAAA,CACPpG,IAAI,CAAC,aAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACcqG,EAAK,GAAA;AACjB,QAAA,OAAO,IAAIT,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBS,QAAQ,CAAA,CAC9BP,OAAO,EAAA,CACPpG,IAAI,CAAC,mBAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACcuG,GAAM,GAAA;AAClB,QAAA,OAAO,IAAIX,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBW,GAAG,CAAA,CACzBT,OAAO,EAAA,CACPpG,IAAI,CAAC,cAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACcyG,IAAO,GAAA;AACnB,QAAA,OAAO,IAAIb,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBa,IAAI,CAAA,CAC1BX,OAAO,EAAA,CACPpG,IAAI,CAAC,gBAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;AAMC,MACD,OACc2G,MAAS,GAAA;AACrB,QAAA,OAAO,IAAIf,uCAAAA,EAAAA,CACRtG,EAAE,CAACuG,mCAAmBe,MAAM,CAAA,CAC5Bb,OAAO,EAAA,CACPpG,IAAI,CAAC,iBAAA,CAAA,CACLqG,UAAU,CAAC,GACXhG,KAAK,EAAA;AACV;AAEA;;;;;;;;MASA,OAAc6G,IAAKvH,CAAAA,EAAU,EAA4B;QACvD,IAAIgG,0BAAAA,CAASP,WAAaC,EAAAA,qBAAAA,EAAuB1F,EAAK,CAAA,EAAA;YACpD,OAAO0F,qBAAqB,CAAC1F,EAAG,CAAA,EAAA;AAClC;QAEA,OAAO,IAAA;AACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChKA;;;AAGC,IACM,MAAMwH,uBAAAA,CAAAA;IAGJC,KAAMzF,CAAAA,IAAqB,EAAE8D,MAAc,EAAW;QAC3D,MAAM4B,MAAAA,GAAS5B,QAAQ6B,IAAOC,EAAAA,CAAAA,WAAAA,EAAAA;AAC9B,QAAA,MAAM,EAAEvH,IAAO,GAAA,EAAE,EAAEwH,MAAS,GAAA,EAAE,EAAE,GAAG7F,IAAAA;QACnC,MAAM8F,MAAAA,GAASpC,qBAAsB6B,CAAAA,IAAI,CAACM,MAAAA,CAAAA;QAC1C,MAAME,UAAAA,GAAaC,qBAAY,CAAA,EAAA,EAAIF,MAAQzH,EAAAA,IAAAA,CAAAA;QAE3C,IAAI,CAACqH,QAAQvF,MAAQ,EAAA;YACnB,OAAO,IAAA;AACT;QAEA,OAAO;AAAC9B,YAAAA,IAAAA;AAAMwH,YAAAA,MAAAA;AAAQE,YAAAA;AAAW,SAAA,CAC9BjC,MAAM,CAAC,CAACmC,CAAAA,GAAMA,EAAE9F,MAAM,CAAA,CACtB+F,IAAI,CAAC,CAACC,CAAMA,GAAAA,CAAAA,CAAEP,WAAW,EAAA,CAAGQ,QAAQ,CAACV,MAAAA,CAAAA,CAAAA;AAC1C;AACF;;;;;;;;;;;;;;;;ACUO,MAAMW,oBAAuBzH,GAAAA,MAAAA,CAAO,yBAA2B,CAAA;AAO/D,MAAM0H,sBAAAA,CAAAA;;;IACMxH,OAAkB;IAEnC,WACE,CACiByH,KAA0B,EAE1BC,OAAkC,EAC7BC,MAAgB,CACtC;aAJiBF,KAAAA,GAAAA,KAAAA;aAEAC,OAAAA,GAAAA,OAAAA;AAGjB,QAAA,IAAI,CAAC1H,OAAO,GAAG,IAAIC,8BAAe,wBAA0B0H,EAAAA,MAAAA,CAAAA;AAC9D;IAEA,MAAazH,IAAAA,CAAKC,GAAkB,EAAoC;QACtE,MAAMqB,MAAAA,GAAS1C,sBAAsBE,KAAK,EAAA;AAC1C,QAAA,MAAM,EAAEX,QAAQ,EAAE,GAAG,MAAM,IAAI,CAACqJ,OAAO,CAACnG,GAAG,CAACC,MAAAA,CAAOtC,EAAE,CAAA;QACrD,MAAM,EAAE0I,WAAW,EAAE,GAAG,IAAIC,4CACzBxF,EAAAA,CAAAA,IAAI,CAAChE,QAAAA,CAAAA,CACLuB,KAAK,EAAA;AACR,QAAA,MAAM,EAAEkI,QAAQ,EAAE,GAAGnI,8CAA8BiI,WAAW,EAAA;AAE9D,QAAA,MAAMG,MAAMC,oBAAW3H,CAAAA,sBAAAA,CAAayH,QAAUF,EAAAA,WAAAA,CAAAA,EAAcK,QAAQC,GAAG,CAAA;AACvE,QAAA,MAAMC,OAAO,IAAIC,IAAAA,EAAAA;AAEjB,QAAA,IAAI5H,GAAM,GAAA,CAAC,uBAAuB,EAAEuH,GAAK,CAAA,CAAA;AACzC,QAAA,IAAI,CAAC/H,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;QAEjE,MAAMyI,OAAAA,GAAUzD,sBAAsB7F,GAAG,EAAA,CAAGoG,GAAG,CAAC,CAAC4B,MAAWA,GAAAA,MAAAA,CAAO7H,EAAE,CAAA;QACrE,MAAMoJ,IAAAA,GAAO,CAAC,CAAC,EAAED,QAAQE,IAAI,CAAC,GAAK,CAAA,CAAA,UAAU,CAAC;QAC9C,MAAMC,KAAAA,GAAQ,MAAM,IAAI,CAACf,KAAK,CAAC3G,MAAM,CAACwH,IAAM,EAAA;AAAEP,YAAAA,GAAAA;YAAKU,IAAM,EAAA;AAAM,SAAA,CAAA;AAC/D,QAAA,MAAMC,OAAO,IAAIN,IAAAA,EAAAA,CAAOO,OAAO,EAAA,GAAKR,KAAKQ,OAAO,EAAA;QAEhDnI,GAAM,GAAA,CAAC,MAAM,EAAEgI,KAAMnH,CAAAA,MAAM,CAAC,oBAAoB,EAAEqH,IAAK,CAAA,cAAc,CAAC;AACtE,QAAA,IAAI,CAAC1I,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAEjE,QAAA,MAAMZ,QAAQwJ,KAAMrD,CAAAA,GAAG,CAAC,CAAC,EAAEyD,IAAI,EAAE,GAAA;YAC/B,MAAMC,GAAAA,GAAMC,mBAASlG,iBAAQgG,CAAAA,IAAAA,CAAAA,CAAAA;AAC7B,YAAA,MAAM,EAAErJ,IAAAA,EAAMJ,IAAI,EAAE,GAAG4C,eAAM6G,CAAAA,IAAAA,CAAAA;AAC7B,YAAA,MAAM1J,KAAK,CAAG2J,EAAAA,GAAAA,CAAI,CAAC,EAAEE,mBAAU5J,IAAO,CAAA,CAAA,CAAA;AAEtC,YAAA,OAAO,IAAI6J,qCAAAA,EAAAA,CACR9J,EAAE,CAACA,IACH6H,MAAM,CAAC8B,GACP1J,CAAAA,CAAAA,IAAI,CAACyJ,IAAAA,CAAAA,CACLrJ,IAAI,CAACJ,MACLS,KAAK,EAAA;AACV,SAAA,CAAA;AAEA,QAAA,MAAMgB,UAAU,IAAIC,4CAAAA,EAAAA,CACjBC,MAAM,CAAC,IAAI4F,2BACX9G,KAAK,EAAA;QACR,MAAMoB,MAAAA,GAAS,IAAIC,8BAAAA,CAAkBjC,KAAO4B,EAAAA,OAAAA,CAAAA;AAE5C,QAAA,MAAMqI,QAAQ,IAAIC,yBAAAA,EAAAA,CACfC,KAAK,CAAC9I,uBAAa,EAAE,EAAEF,GAAIiJ,CAAAA,IAAI,GAC/BC,SAAS,CAAC,UACVA,SAAS,CAAC,QACVzJ,KAAK,EAAA;QACR,MAAM0J,QAAAA,GAAW,IAAI9F,gCAAsBnB,EAAAA,CAAAA,IAAI,CAAClC,GAAKiJ,CAAAA,CAAAA,IAAI,CAACH,KAAAA,CAAAA,CAAOrJ,KAAK,EAAA;AAEtE,QAAA,MAAMsB,IAAO,GAAA,MAAMF,MAAOG,CAAAA,QAAQ,CAACmI,QAAAA,CAAAA;AACnC,QAAA,MAAMlI,KAAQ,GAAA,MAAMJ,MAAOI,CAAAA,KAAK,CAACkI,QAAAA,CAAAA;QAEjC,OAAO,IAAIhI,4BAAeF,KAAK,CAACA,OAAOF,IAAI,CAACA,MAAMtB,KAAK,EAAA;AACzD;IAEA,MAAa2B,GAAAA,CAAIrC,EAAU,EAA4B;AACrD,QAAA,MAAM,EAAEgC,IAAAA,EAAMlC,KAAK,EAAE,GAAG,MAAM,IAAI,CAACkB,IAAI,CAAC,IAAIsD,gCAAAA,EAAAA,CAAsB5D,KAAK,EAAA,CAAA;QACvE,MAAM+G,KAAAA,GAAQ3H,MAAMkE,IAAI,CAAC,CAACqG,IAASA,GAAAA,IAAAA,CAAKrK,EAAE,KAAKA,EAAAA,CAAAA;AAE/C,QAAA,IAAI,CAACyH,KAAO,EAAA;AACV,YAAA,MAAM,IAAIvD,wBAAkB,CAAA,CAAC,6BAA6B,EAAElE,EAAAA,CAAG,CAAC,CAAC,CAAA;AACnE;QAEA,OAAOyH,KAAAA;AACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/GO,MAAM6C,yBAAAA,CAAAA;;IACX,WACE,CACiBC,MAA+B,CAChD;aADiBA,MAAAA,GAAAA,MAAAA;AAChB;IAGIvJ,IACL,CAASuD,KAAyB,EACA;QAClC,OAAO,IAAI,CAACgG,MAAM,CAACvJ,IAAI,CAAC,IAAIsD,gCAAsBC,EAAAA,CAAAA,KAAK,CAACA,KAAAA,CAAAA,CAAO7D,KAAK,EAAA,CAAA;AACtE;IAGO2B,GAAI,CAAyBoC,cAAsB,EAAE;AAC1D,QAAA,OAAO,IAAI,CAAC8F,MAAM,CAAClI,GAAG,CAACoC,cAAAA,CAAAA;AACzB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLO,MAAM+F,qBAAAA,CAAAA;AAAuB;;;QATlCvF,OAAS,EAAA;AAACD,YAAAA,uBAAAA;AAAyBE,YAAAA,gCAAAA;AAAmBC,YAAAA;AAAc,SAAA;QACpEC,WAAa,EAAA;AAACkF,YAAAA;AAA0B,SAAA;QACxCjF,SAAW,EAAA;AACT,YAAA;gBACEC,OAAS+C,EAAAA,oBAAAA;gBACT9C,QAAU+C,EAAAA;AACZ;AACD;;;;;;;;;;;;;;;;;;ACGI,MAAMmC,oBAAuB7J,GAAAA,MAAAA,CAAO,OAAS,CAAA;AAO7C,MAAM8J,sBAAAA,CAAAA;;AACX,IAAA,OAAwBC,kBAAkB,QAAS;AACnD,IAAA,OAAwBC,iBAAiB,OAAQ;AAEzCC,IAAAA,WAAAA,GAA+B,IAAIC,4BAAkB,EAAA;AACrDC,IAAAA,aAAAA,GAAgB,IAAIC,0BAAgB,EAAA;IACpCC,MAAiB;IAEzB,WACE,CACiB7G,QAAmC,CACpD;aADiBA,QAAAA,GAAAA,QAAAA;QAEjB,MAAM8G,KAAAA,GAAQvF,MAAOwF,CAAAA,MAAM,CAAC5E,kCAAAA,CAAAA;QAC5B,IAAI,CAAC0E,MAAM,GAAG;AAAC,YAAA,WAAA;AAAa,YAAA,UAAA;AAAeC,YAAAA,GAAAA,KAAAA,CAAMjF,GAAG,CAAC,CAACgC,IAAM,CAAGA,EAAAA,CAAAA,CAAE,IAAI,CAAC;AAAE,SAAA;AAC1E;AAEA,IAAA,MAAcS,WAAc,GAAA;QAC1B,MAAMpG,MAAAA,GAAS,MAAM,IAAI,CAAC8B,QAAQ,CAAC/B,GAAG,CAAClC,kCAAAA,CAAmBC,KAAK,CAAA;QAC/D,MAAM,EAAEsI,WAAW,EAAE,GAAG,IAAIC,4CACzBxF,EAAAA,CAAAA,IAAI,CAACb,MAAAA,CAAOnD,QAAQ,CAAA,CACpBuB,KAAK,EAAA;AACR,QAAA,MAAM,EAAEkI,QAAQ,EAAE,GAAGnI,8CAA8BiI,WAAW,EAAA;AAC9D,QAAA,MAAM0C,YAAejK,GAAAA,sBAAAA,CAAayH,QAASF,CAAAA,WAAW,EAAEA,WAAAA,CAAAA;AACxD,QAAA,OAAOI,qBAAWsC,YAAcpC,EAAAA,gBAAAA,CAAAA;AAClC;AAEA,IAAA,MAAcqC,WAAc,GAAA;AAC1B,QAAA,MAAM3C,WAAc,GAAA,MAAM,IAAI,CAACA,WAAW,EAAA;QAC1C,OAAOjJ,iBAAAA,CAAQiJ,WAAagC,EAAAA,sBAAAA,CAAuBC,eAAe,CAAA;AACpE;AAEA,IAAA,MAAcW,UAAa,GAAA;AACzB,QAAA,MAAM5C,WAAc,GAAA,MAAM,IAAI,CAACA,WAAW,EAAA;QAC1C,OAAOjJ,iBAAAA,CAAQiJ,WAAagC,EAAAA,sBAAAA,CAAuBE,cAAc,CAAA;AACnE;AAEA,IAAA,MAAcW,UAAwC,GAAA;AACpD,QAAA,MAAM7B,IAAO,GAAA,MAAM,IAAI,CAAChB,WAAW,EAAA;AAEnC,QAAA,IAAI,IAAI,CAACmC,WAAW,CAACnB,IAAI,KAAKA,IAAM,EAAA;YAClC,MAAM,IAAI,CAACqB,aAAa,CAACS,KAAK,CAAC,MAAM,IAAI,CAACH,WAAW,EAAA,CAAA;YACrD,MAAM,IAAI,CAACN,aAAa,CAACS,KAAK,CAAC,MAAM,IAAI,CAACF,UAAU,EAAA,CAAA;YACpD,MAAM,IAAI,CAACT,WAAW,CAACY,UAAU,CAAC/B,IAAAA,EAAM,IAAI,CAACuB,MAAM,CAAA;AACrD;QAEA,OAAO,IAAI,CAACJ,WAAW;AACzB;AAEA,IAAA,MAAaa,KAAqC,GAAA;AAChD,QAAA,MAAMH,UAAa,GAAA,MAAM,IAAI,CAACA,UAAU,EAAA;AACxC,QAAA,MAAMI,SAASC,gBAAQ,CAAA,MAAM,IAAI,CAACP,WAAW,EAAI,EAAA,GAAA,CAAA;QACjD,MAAMQ,MAAAA,GAAS,CAAGF,EAAAA,MAAAA,CAAAA,EAASG,aAAK,CAAA,CAAA;QAEhC,MAAMhG,MAAAA,GAAS,IAAIiG,iCAAAA,EAAAA,CAChBC,OAAO,CAAC,MACRC,CAAAA,CAAAA,UAAU,EACVC,CAAAA,KAAK,CAACL,MAAAA,CAAAA,CACNnL,KAAK,EAAA;AAER,QAAA,MAAMwJ,OAAO,IAAIF,yBAAAA,EAAAA,CAAeG,SAAS,CAAC,QAAQzJ,KAAK,EAAA;QAEvD,MAAM2D,OAAAA,GAAU,IAAIC,gCAAsBwB,EAAAA,CAAAA,MAAM,CAACA,MAAQoE,CAAAA,CAAAA,IAAI,CAACA,IAAAA,CAAAA,CAAMxJ,KAAK,EAAA;QACzE,OAAO6K,UAAAA,CAAWtJ,QAAQ,CAACoC,OAAAA,CAAAA;AAC7B;AACF;;;;;;;;;;;;;;;;AC9EO,MAAM8H,qBAAAA,CAAAA;AAAuB;;;QANlClH,OAAS,EAAA;AAACD,YAAAA;AAAwB,SAAA;QAClCK,SAAW,EAAA;AACT,YAAA;gBAAEC,OAASmF,EAAAA,oBAAAA;gBAAsBlF,QAAUmF,EAAAA;AAAuB;AACnE,SAAA;QACDlF,OAAS,EAAA;AAACiF,YAAAA;AAAqB;;;;;;;;;;;;;;;;;;ACwB1B,MAAM2B,oBAAuBxL,GAAAA,MAAAA,CAAO,yBAA2B,CAAA;AAU/D,MAAMyL,sBAAAA,CAAAA;;IACHvL,OAAkB;AAE1B,IAAA,WAAA,CACE,MAAqE,EAC/C2H,MAAgB,CACtC;aAFsC6D,MAAAA,GAAAA,MAAAA;AAGtC,QAAA,IAAI,CAACxL,OAAO,GAAG,IAAIC,8BAAe,wBAA0B0H,EAAAA,MAAAA,CAAAA;AAC9D;AAEA,IAAA,MAAc8D,YAA4C,GAAA;AACxD,QAAA,MAAMC,QAAQ,MAAM,IAAI,CAACF,MAAM,CAACZ,KAAK,EAAA;QAErC,OAAOc,KAAAA,CACJvG,GAAG,CAAC,CAACC,IAAM,IAAIuG,sCAAAA,EAAAA,CAAyBlF,IAAI,CAACrB,CAAAA,CAAEwD,IAAI,CAAEhJ,CAAAA,KAAK,IAC1DoF,MAAM,CAAC,CAAC4F,KAAU,GAAA,CAAC,CAACA,KAAAA,CAAM1L,EAAE,CAAA;AACjC;IAEA,MAAagB,IAAAA,CAAKC,GAAkB,EAAqC;QACvE,IAAIK,GAAAA,GAAM,CAAC,cAAc,CAAC;AAC1B,QAAA,IAAI,CAACR,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AACjE,QAAA,MAAMuI,OAAO,IAAIC,IAAAA,EAAAA;AACjB,QAAA,MAAMwD,SAAY,GAAA,MAAM,IAAI,CAACH,YAAY,EAAA;AACzC,QAAA,MAAM/C,OAAO,IAAIN,IAAAA,EAAAA,CAAOO,OAAO,EAAA,GAAKR,KAAKQ,OAAO,EAAA;QAChDnI,GAAM,GAAA,CAAC,MAAM,EAAEoL,SAAUvK,CAAAA,MAAM,CAAC,0BAA0B,EAAEqH,IAAK,CAAA,aAAa,CAAC;AAC/E,QAAA,IAAI,CAAC1I,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAEjE,QAAA,MAAMgB,UAAU,IAAIC,4CAAAA,EAAAA,CACjBC,MAAM,CAAC,IAAIC,kCACXnB,KAAK,EAAA;QACR,MAAMoB,MAAAA,GAAS,IAAIC,8BAAAA,CAAkB2K,SAAWhL,EAAAA,OAAAA,CAAAA;AAChD,QAAA,MAAMR,IAAO,GAAA,MAAMY,MAAOG,CAAAA,QAAQ,CAAChB,GAAAA,CAAAA;AACnC,QAAA,MAAMiB,KAAQ,GAAA,MAAMJ,MAAOI,CAAAA,KAAK,CAACjB,GAAAA,CAAAA;QAEjC,OAAO,IAAImB,4BAAiCJ,IAAI,CAACd,MAAMgB,KAAK,CAACA,OAAOxB,KAAK,EAAA;AAC3E;IAEA,MAAa2B,GAAAA,CAAIrC,EAAU,EAA6B;AACtD,QAAA,MAAMiJ,OAAO,IAAIC,IAAAA,EAAAA;AACjB,QAAA,IAAI3H,MAAM,CAAC,4BAA4B,EAAEvB,EAAAA,CAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;AACjE,QAAA,MAAMgM,SAAY,GAAA,MAAM,IAAI,CAACH,YAAY,EAAA;AACzC,QAAA,MAAMI,QAAQC,kBAAUF,CAAAA,SAAAA,EAAW,CAACvG,CAAMA,GAAAA,CAAAA,CAAEnG,EAAE,KAAKA,EAAAA,CAAAA;AACnD,QAAA,MAAMwJ,OAAO,IAAIN,IAAAA,EAAAA,CAAOO,OAAO,EAAA,GAAKR,KAAKQ,OAAO,EAAA;AAEhD,QAAA,IAAIkD,QAAQ,CAAG,EAAA;AACb,YAAA,MAAMrL,MAAM,CAAC,kCAAkC,EAAEtB,EAAAA,CAAG,CAAC,CAAC;AACtDuB,YAAAA,GAAAA,GAAM,GAAGD,GAAI,CAAA,aAAa,EAAEkI,IAAAA,CAAK,aAAa,CAAC;AAC/C,YAAA,IAAI,CAAC1I,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmByB,EAAAA,CAAAA,OAAO,EAAG3D,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;AACpE,YAAA,MAAM,IAAIwD,wBAAkB5C,CAAAA,GAAAA,CAAAA;AAC9B;QAEA,MAAMoK,KAAAA,GAAQgB,SAAS,CAACC,KAAM,CAAA;QAC9BpL,GAAM,GAAA,CAAC,aAAa,EAAEmK,KAAMmB,CAAAA,GAAG,CAAC,OAAO,EAAErD,IAAK,CAAA,aAAa,CAAC;AAC5D,QAAA,IAAI,CAAC1I,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;QAEjE,OAAOgL,KAAAA;AACT;AAEA,IAAA,MAAaoB,QAAS9M,CAAAA,EAAU,EAAE+M,MAAc,EAA2B;AACzE,QAAA,IAAIxL,GAAM,GAAA,CAAC,8BAA8B,EAAEvB,EAAI,CAAA,CAAA;AAC/C,QAAA,IAAI,CAACc,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;QACjE,MAAMkI,QAAAA,GAAWoE,iCAAqBC,WAAW;QACjD,MAAM,EAAEC,QAAQ,EAAEL,GAAG,EAAE,GAAG,MAAM,IAAI,CAACxK,GAAG,CAACrC,EAAAA,CAAAA;QACzC,MAAMmN,YAAAA,GAAeC,gBAAOjM,CAAAA,sBAAAA,CAAa,EAAI+L,EAAAA,QAAAA,CAAAA,CAAAA;QAC7C,MAAMG,IAAAA,GAAOrF,sBAAYY,QAAUuE,EAAAA,YAAAA,CAAAA;AACnC,QAAA,MAAMG,UAAUP,MAAOQ,CAAAA,KAAK,CAAC,GAAA,CAAA,CAAKtH,GAAG,CAAC,CAACuH,CAAMA,GAAAA,CAAAA,CAAED,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC5F,IAAI,EAAA,CAAA;AAEjE,QAAA,MAAM8F,UAAaH,GAAAA,OAAAA,CAAQpF,IAAI,CAAC,CAACwF,CAAAA,GAAAA;AAC/B,YAAA,IAAIA,MAAM,KAAO,EAAA;gBACf,OAAO,IAAA;AACT;YACA,IAAIA,CAAAA,CAAEC,QAAQ,CAAC,IAAO,CAAA,EAAA;AACpB,gBAAA,OAAON,KAAKpB,UAAU,CAACyB,EAAEE,KAAK,CAAC,GAAG,EAAC,CAAA,CAAA;AACrC;AACA,YAAA,OAAOF,CAAML,KAAAA,IAAAA;AACf,SAAA,CAAA;AAEA,QAAA,IAAI,CAACI,UAAY,EAAA;AACf,YAAA,MAAMnM,GACJ,GAAA,CAAC,+BAA+B,EAAE+L,IAAK,CAAA,EAAE,CAAC,GAC1C,CAAC,yBAAyB,EAAEN,MAAAA,CAAO,CAAC,CAAC;AACvC,YAAA,IAAI,CAACjM,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBqC,EAAAA,CAAAA,KAAK,EAAGvE,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAClE,YAAA,MAAM,IAAImN,6BAAuBvM,CAAAA,GAAAA,CAAAA;AACnC;QAEAC,GAAM,GAAA,CAAC,UAAU,EAAEsL,GAAK,CAAA,CAAA;AACxB,QAAA,IAAI,CAAC/L,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;AAEjE,QAAA,OAAO,IAAIoN,qBAAAA,CAAeC,wBAAiB5M,CAAAA,sBAAAA,CAAa,IAAI0L,GAAO,CAAA,CAAA,EAAA;YACjEzN,IAAMiO,EAAAA,IAAAA;YACNW,WAAa,EAAA,CAAC,iBAAiB,EAAEd,QAAU,CAAA;AAC7C,SAAA,CAAA;AACF;IAEA,MAAae,MAAAA,CAAOjO,EAAU,EAAiB;QAC7C,MAAM,EAAE6M,GAAG,EAAE,GAAG,MAAM,IAAI,CAACxK,GAAG,CAACrC,EAAAA,CAAAA;QAC/B,MAAMkO,IAAAA,GAAO/M,uBAAa,EAAI0L,EAAAA,GAAAA,CAAAA;AAE9B,QAAA,IAAItL,GAAM,GAAA,CAAC,0BAA0B,EAAE2M,IAAM,CAAA,CAAA;AAC7C,QAAA,IAAI,CAACpN,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;QAEjE,IAAI;AACF,YAAA,MAAMyN,eAAOD,CAAAA,IAAAA,CAAAA;AACf,SAAA,CAAE,OAAOE,GAAK,EAAA;AACZ,YAAA,MAAM,EAAE9O,OAAO,EAAE,GAAG0D,qBAAYoL,CAAAA,GAAAA,CAAAA;AAChC,YAAA,IAAI,CAACtN,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBqC,EAAAA,CAAAA,KAAK,EAAGvE,CAAAA,OAAO,CAACA,OAAAA,CAAAA,CAASoB,KAAK,EAAA,CAAA;AACtE,YAAA,MAAM,IAAI2N,yBAAmB/O,CAAAA,OAAAA,CAAAA;AAC/B;QAEAiC,GAAM,GAAA,CAAC,QAAQ,EAAEsL,GAAK,CAAA,CAAA;AACtB,QAAA,IAAI,CAAC/L,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACiC,GAAAA,CAAAA,CAAKb,KAAK,EAAA,CAAA;AACnE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AC1IO,MAAM4N,yBAAAA,CAAAA;;IACX,WACE,CACQC,MAA+B,CACvC;aADQA,MAAAA,GAAAA,MAAAA;AACP;IAuCIvN,IAAK,CAASwN,MAA0B,EAAE;AAC/C,QAAA,MAAMnK,UAAU,IAAIC,gCAAAA,EAAAA,CAAsBC,KAAK,CAACiK,QAAQ9N,KAAK,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC6N,MAAM,CAACvN,IAAI,CAACqD,OAAAA,CAAAA;AAC1B;AAEA,IAAA,MA0BahC,IACX,cAA+C,EACxCpB,GAAY,EACnB;AACA,QAAA,MAAM,EAAE8L,MAAS,GAAA,KAAK,EAAE,GAAG9L,IAAIwN,OAAO;AAEtC,QAAA,OAAO1B,OAAO3E,QAAQ,CAAC,kBACnB,CAAA,GAAA,IAAI,CAACmG,MAAM,CAAClM,GAAG,CAACoC,kBAChB,IAAI,CAAC8J,MAAM,CAACzB,QAAQ,CAACrI,cAAgBsI,EAAAA,MAAAA,CAAAA;AAC3C;IAEA,MAMakB,MAAAA,CAAO,cAA+C,EAAE;AACnE,QAAA,MAAM,IAAI,CAACM,MAAM,CAACN,MAAM,CAACxJ,cAAAA,CAAAA;AAC3B;AACF;;;QAvFIpE,IAAM,EAAA,MAAA;QACNqO,QAAU,EAAA,KAAA;QACVtP,IAAMuP,EAAAA,MAAAA;QACNC,OAAS,EAAA,CAAA;QACTtO,WAAa,EAAA;;;QAGbD,IAAM,EAAA,MAAA;QACNqO,QAAU,EAAA,KAAA;QACVtP,IAAMuP,EAAAA,MAAAA;QACNC,OAAS,EAAA,EAAA;QACTtO,WAAa,EAAA;;;QAGbD,IAAM,EAAA,QAAA;QACNqO,QAAU,EAAA,KAAA;QACVtP,IAAMyP,EAAAA,MAAAA;QACNvO,WAAa,EAAA;;;QAGbD,IAAM,EAAA,MAAA;QACNqO,QAAU,EAAA,KAAA;QACVtP,IAAMyP,EAAAA,MAAAA;QACNvO,WAAa,EAAA;;;QAGbD,IAAM,EAAA,QAAA;QACNqO,QAAU,EAAA,KAAA;QACVtP,IAAMyP,EAAAA,MAAAA;QACNvO,WAAa,EAAA;;;AAGbwO,QAAAA,MAAAA,EAAQC,8BAAiBC,EAAE;QAC3B1O,WAAa,EAAA;;;;;;;;;;;;QASblB,IAAM,EAAA,QAAA;QACNiB,IAAM,EAAA,gBAAA;QACNC,WAAa,EAAA;;;AAGbwO,QAAAA,MAAAA,EAAQC,8BAAiBC,EAAE;QAC3B1O,WAAa,EAAA,mBAAA;QACb2O,OAAS,EAAA;AACP,YAAA,KAAA,EAAO,EAAC;AACR,YAAA,SAAA,EAAW,EAAC;AACZ,YAAA,WAAA,EAAa,EAAC;AACd,YAAA,YAAA,EAAc,EAAC;AACf,YAAA,iBAAA,EAAmB,EAAC;AACpB,YAAA,kBAAA,EAAoB;AACtB;;;AAGAH,QAAAA,MAAAA,EAAQI,6BAAgBC,QAAQ;QAChC7O,WAAa,EAAA;;;AAGbwO,QAAAA,MAAAA,EAAQI,6BAAgBE,aAAa;QACrC9O,WAAa,EAAA;;;;;;;;;;;;;;QAeblB,IAAM,EAAA,QAAA;QACNiB,IAAM,EAAA,gBAAA;QACNC,WAAa,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AC7FV,MAAM+O,qBAAAA,CAAAA;AAAuB;;;QANlCpK,OAAS,EAAA;AAACE,YAAAA,6BAAAA;AAAegH,YAAAA;AAAsB,SAAA;QAC/C/G,WAAa,EAAA;AAACkJ,YAAAA;AAA0B,SAAA;QACxCjJ,SAAW,EAAA;AACT,YAAA;gBAAEC,OAAS8G,EAAAA,oBAAAA;gBAAsB7G,QAAU8G,EAAAA;AAAuB;AACnE;;;;;;;;;;;;;;;;;;ACeI,MAAMiD,sBAAyB1O,GAAAA,MAAAA,CAAO,2BAA6B,CAAA;AAQnE,MAAM2O,wBAAAA,CAAAA;;;;IACHzO,OAAkB;IAE1B,WACE,CACiByH,KAA0B,EAE1BnE,QAAmC,EACrBqE,MAAgB,CAC/C;aAJiBF,KAAAA,GAAAA,KAAAA;aAEAnE,QAAAA,GAAAA,QAAAA;aACcqE,MAAAA,GAAAA,MAAAA;AAE/B,QAAA,IAAI,CAAC3H,OAAO,GAAG,IAAIC,8BAAe,0BAA4B0H,EAAAA,MAAAA,CAAAA;AAChE;IAEA,MAAazH,IAAAA,CAAKC,GAAkB,EAAsC;AACxE,QAAA,MAAMC,IAAOC,GAAAA,sBAAAA,CAAa,CAAGF,EAAAA,GAAAA,CAAIC,IAAI,CAAA;AACrC,QAAA,MAAME,IAAOD,GAAAA,sBAAAA,CAAaE,QAAUJ,EAAAA,GAAAA,CAAIG,IAAI,CAAA;QAC5C,IAAIE,GAAAA,GAAM,CAAC,yBAAyB,EAAEJ,KAAK,aAAa,EAAEE,IAAK,CAAA,CAAC,CAAC;AACjE,QAAA,IAAI,CAACN,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAEjE,QAAA,MAAM,EAAEvB,QAAQ,EAAE,GAAG,MAAM,IAAI,CAACiF,QAAQ,CAAC/B,GAAG,CAAClC,kCAAAA,CAAmBC,KAAK,CAAA;QACrE,MAAM,EAAEsI,WAAW,EAAE,GAAGvJ,QAAAA;AACxB,QAAA,MAAM,EAAEyJ,QAAQ,EAAE,GAAGnI,8CAA8BiI,WAAW,EAAA;QAC9D,MAAM8G,OAAAA,GAAUrO,uBAAayH,QAAUF,EAAAA,WAAAA,CAAAA;AAEvC,QAAA,MAAMG,GAAMC,GAAAA,oBAAAA,CAAW0G,OAASzG,EAAAA,OAAAA,CAAQC,GAAG,CAAA;QAC3C1H,GAAM,GAAA,CAAC,uBAAuB,EAAEuH,GAAK,CAAA,CAAA;AACrC,QAAA,IAAI,CAAC/H,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AACjE,QAAA,MAAM+O,aAAgB,GAAA;AAAE5G,YAAAA;AAAI,SAAA;QAC5B,MAAM6G,OAAAA,GAAU,MAAM,IAAI,CAACnH,KAAK,CAAC3G,MAAM,CAAC,IAAM6N,EAAAA,aAAAA,CAAAA;AAE9C,QAAA,MAAMtG,OAAUuG,GAAAA,OAAAA,CACbzJ,GAAG,CAAC,CAAC4F,MAAAA,GAAWA,MAAOnC,CAAAA,IAAI,CAC3BzD,CAAAA,GAAG,CAAC,CAACyD,IAASE,GAAAA,kBAAAA,CAASF,IACvBzD,CAAAA,CAAAA,CAAAA,GAAG,CAAC,CAAC0J,IAAS,GAAA,IAAI,CAACC,qBAAqB,CAACD,IAAAA,CAAAA,CAAAA,CACzC7J,MAAM,CAAC,CAAC+B,MAAAA,GAAWA,MAAU,IAAA,IAAA,CAAA;AAEhCvG,QAAAA,GAAAA,GAAM,CAAC,MAAM,EAAE6H,QAAQhH,MAAM,CAAC,QAAQ,CAAC;AACvC,QAAA,IAAI,CAACrB,OAAO,CAACS,GAAG,CAAC,IAAIC,+BAAmBC,EAAAA,CAAAA,IAAI,EAAGnC,CAAAA,OAAO,CAACgC,GAAAA,CAAAA,CAAKZ,KAAK,EAAA,CAAA;AAEjE,QAAA,MAAMmP,gBAAgB,IAAIlO,4CAAAA,EAAAA,CACvBC,MAAM,CAAC,IAAIC,8BAAkB,CAAA;AAAC,YAAA,IAAA;AAAM,YAAA,MAAA;AAAQ,YAAA;AAAQ,SAAA,CAAA,CAAA,CACpDnB,KAAK,EAAA;QAER,MAAMoB,MAAAA,GAAS,IAAIC,8BAAAA,CACjBoH,OACA0G,EAAAA,aAAAA,CAAAA;AAGF,QAAA,MAAM7N,IAAO,GAAA,MAAMF,MAAOG,CAAAA,QAAQ,CAAChB,GAAAA,CAAAA;AACnC,QAAA,MAAMiB,KAAQ,GAAA,MAAMJ,MAAOI,CAAAA,KAAK,CAACjB,GAAAA,CAAAA;QAEjC,OAAO,IAAImB,4BAAeJ,IAAI,CAACA,MAAME,KAAK,CAACA,OAAOxB,KAAK,EAAA;AACzD;IAEA,MAAa2B,GAAAA,CAAIrC,EAAU,EAA8B;QACvD,MAAMH,GAAAA,GAAM,MAAM,IAAI,CAACmB,IAAI,CAAC,IAAIsD,mCAAsB5D,KAAK,EAAA,CAAA;QAC3D,MAAMmH,MAAAA,GAAS7D,cAAKnE,GAAImC,CAAAA,IAAI,EAAE,CAAC6F,MAAAA,GAAWA,MAAO7H,CAAAA,EAAE,KAAKA,EAAAA,CAAAA;AAExD,QAAA,IAAI,CAAC6H,MAAQ,EAAA;AACX,YAAA,MAAM,IAAI3D,wBAAkB,CAAA,CAAC,+BAA+B,EAAElE,EAAAA,CAAG,CAAC,CAAC,CAAA;AACrE;QAEA,OAAO6H,MAAAA;AACT;AAEQ+H,IAAAA,qBAAAA,CAAsBD,IAAY,EAA4B;;QAEpE,OAAOjK,qBAAAA,CAAsB6B,IAAI,CAACoI,IAAAA,CAAAA;AACpC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjGO,MAAMG,2BAAAA,CAAAA;;IACX,WACE,CACiBC,QAAmC,CACpD;aADiBA,QAAAA,GAAAA,QAAAA;AAChB;IAGI/O,IACL,CAASuD,KAAyB,EACE;QACpC,OAAO,IAAI,CAACwL,QAAQ,CAAC/O,IAAI,CAAC,IAAIsD,gCAAsBC,EAAAA,CAAAA,KAAK,CAACA,KAAAA,CAAAA,CAAO7D,KAAK,EAAA,CAAA;AACxE;IAQO2B,GAAI,CAAyBoC,cAAsB,EAAE;AAC1D,QAAA,OAAO,IAAI,CAACsL,QAAQ,CAAC1N,GAAG,CAACoC,cAAAA,CAAAA;AAC3B;AACF;;;;;;;;;;;;QARIrF,IAAM,EAAA,QAAA;QACNiB,IAAM,EAAA,gBAAA;QACNC,WAAa,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;ACRV,MAAM0P,uBAAAA,CAAAA;AAAyB;;;QANpC/K,OAAS,EAAA;AAACD,YAAAA,uBAAAA;AAAyBE,YAAAA,gCAAAA;AAAmBC,YAAAA;AAAc,SAAA;QACpEC,WAAa,EAAA;AAAC0K,YAAAA;AAA4B,SAAA;QAC1CzK,SAAW,EAAA;AACT,YAAA;gBAAEC,OAASgK,EAAAA,sBAAAA;gBAAwB/J,QAAUgK,EAAAA;AAAyB;AACvE;;;;ACfH,wCAAqC,SAAA,YAAA,CAAA,UAAA,EAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA;;;;;;AAe9B,MAAMU,gBAAAA,CAAAA;AAAkB;;;QAP7BhL,OAAS,EAAA;AACP+K,YAAAA,uBAAAA;AACAhL,YAAAA,uBAAAA;AACAqK,YAAAA,qBAAAA;AACA7E,YAAAA;AACD;;;;ACTH,MAAM0F,IAAO,GAAA,IAAA;AAEZ,CAAA,iBAAA;AACC,IAAA,MAAMC,GAAM,GAAA,MAAMC,gBAAYrQ,CAAAA,MAAM,CAACkQ,gBAAAA,CAAAA;AACrCE,IAAAA,GAAAA,CAAIE,eAAe,CAAC,KAAA,CAAA;AACpBF,IAAAA,GAAAA,CAAIG,UAAU,EAAA;AAEd,IAAA,MAAMhO,MAAS,GAAA,IAAIiO,uBAChBC,EAAAA,CAAAA,QAAQ,CAAC,eAAA,CAAA,CACTC,cAAc,CAAC,mBACfC,CAAAA,CAAAA,UAAU,CAAC,GAAA,CAAA,CACXhQ,KAAK,EAAA;AAER,IAAA,MAAMiQ,QAAW,GAAA,IAAMC,qBAAcC,CAAAA,cAAc,CAACV,GAAK7N,EAAAA,MAAAA,CAAAA;IACzDsO,qBAAcE,CAAAA,KAAK,CAAC,UAAA,EAAYX,GAAKQ,EAAAA,QAAAA,CAAAA;IAErC,MAAMR,GAAAA,CAAIY,MAAM,CAACb,IAAAA,CAAAA;AACnB,CAAA,GAAA;;"}
|
|
1
|
+
{"version":3,"file":"main.cjs","sources":["../src/config/config-update.mts","../src/dir/dir.ts","../src/config/config-known.mts","../src/config/configs-service.mts","../src/config/configs-controller.mts","../src/config/configs-module.mts","../src/systems/system-known.mts","../src/games/data-match-game.mts","../src/games/games-service.mts","../src/games/games-controller.mts","../src/games/games-module.mts","../src/files/files-service.mts","../src/files/files-module.mts","../src/media/media-service.mts","../src/media/media-controller.mts","../src/media/media-module.mts","../src/systems/systems-service.mts","../src/systems/systems-controller.mts","../src/systems/systems-module.mts","../src/app/app-module.mts","../src/main.mts"],"sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { IsDefined, IsNotEmptyObject, IsObject } from \"class-validator\";\n\nexport class ZRomulatorConfigUpdateDto<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n @ApiProperty({ type: \"object\", properties: {} })\n @IsDefined({ message: \"The contents of the config is required\" })\n @IsObject({ message: \"The contents of the config must be an object \" })\n @IsNotEmptyObject()\n contents: T;\n}\n","import { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\n\nexport abstract class ZDir {\n public static application() {\n return resolve(homedir(), \".zthunworks\", \"romulator\");\n }\n\n public static configs() {\n return resolve(ZDir.application(), \"configs\");\n }\n}\n","import {\n ZRomulatorConfigBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { resolve } from \"node:path\";\nimport { ZDir } from \"../dir/dir.js\";\n\nexport abstract class ZRomulatorConfigKnown {\n public static all() {\n return [ZRomulatorConfigKnown.games()];\n }\n\n private static create(id: ZRomulatorConfigId) {\n const file = resolve(ZDir.configs(), `${id}.json`);\n return new ZRomulatorConfigBuilder().id(id).file(file);\n }\n\n public static games() {\n return ZRomulatorConfigKnown.create(ZRomulatorConfigId.Games)\n .name(\"Game Settings\")\n .description(\"Modify where your games are stored and related settings\")\n .avatar(\"gamepad\")\n .metadata(ZRomulatorConfigGamesMetadata.all())\n .build();\n }\n}\n","import {\n Inject,\n Injectable,\n InternalServerErrorException,\n NotFoundException,\n} from \"@nestjs/common\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport type { IZLogger } from \"@zthun/lumberjacky-log\";\nimport { ZLogEntryBuilder, ZLoggerContext } from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigBuilder } from \"@zthun/romulator-client\";\nimport type { IZRestfulGet, IZRestfulUpdate } from \"@zthun/webigail-rest\";\nimport { find } from \"lodash-es\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"./config-known.mjs\";\n\nexport const ZRomulatorConfigsToken = Symbol(\"configs\");\n\nexport interface IZRomulatorConfigsService\n extends IZRestfulUpdate<IZRomulatorConfig>,\n IZRestfulGet<IZRomulatorConfig> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>>;\n}\n\n@Injectable()\nexport class ZRomulatorConfigsService implements IZRomulatorConfigsService {\n private _logger: IZLogger;\n\n public constructor(@Inject(ZLoggerToken) _logger: IZLogger) {\n this._logger = new ZLoggerContext(\"ZRomulatorConfigsService\", _logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorConfig>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving configs page, ${page}, with size, ${size}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const configs = ZRomulatorConfigKnown.all();\n const options = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic<IZRomulatorConfig>(configs, options);\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n msg = `Responding with ${data.length} configs out of ${count} total`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return new ZPageBuilder<IZRomulatorConfig>()\n .data(data)\n .count(count)\n .build();\n }\n\n public async get<T>(\n id: ZRomulatorConfigId,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this._find(id);\n let msg = `Attempting to read the file contents for config, ${id}.`;\n let contents: any = {};\n\n try {\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const buffer = await readFile(config.file);\n const json = buffer.toString(\"utf-8\");\n contents = JSON.parse(json);\n msg = `Finished reading config contents (${buffer.byteLength} bytes)`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n } catch (e) {\n msg = createError(e).message;\n this._logger.log(new ZLogEntryBuilder().warning().message(msg).build());\n }\n\n const result = new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(contents)\n .build();\n\n return Promise.resolve(result as Required<IZRomulatorConfig<T>>);\n }\n\n public async update<T>(\n id: ZRomulatorConfigId,\n record: Pick<IZRomulatorConfig, \"contents\">,\n ): Promise<Required<IZRomulatorConfig<T>>> {\n const config = await this.get<T>(id);\n\n let msg = `Updating config file, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const next = { ...config.contents, ...record.contents };\n const json = JSON.stringify(next);\n\n try {\n await mkdir(dirname(config.file), { recursive: true });\n await writeFile(config.file, json);\n return new ZRomulatorConfigBuilder()\n .copy(config)\n .contents(next)\n .build() as Required<IZRomulatorConfig<T>>;\n } catch (e) {\n const error = createError(e);\n msg = `Unable to write to, ${config.file}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n msg = error.message;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new InternalServerErrorException(error));\n }\n }\n\n private async _find(id: ZRomulatorConfigId): Promise<IZRomulatorConfig> {\n let msg = `Attempting to retrieve config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const configs = ZRomulatorConfigKnown.all();\n const config = find(configs, (c) => c.id === id);\n\n if (config == null) {\n msg = `Could not find config, ${id}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return Promise.reject(new NotFoundException(msg));\n }\n\n msg = `Config, ${id}, found`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n return config;\n }\n}\n","import {\n Body,\n Controller,\n Get,\n Inject,\n Param,\n Patch,\n Query,\n UsePipes,\n ValidationPipe,\n} from \"@nestjs/common\";\nimport { ApiBody, ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type {\n IZRomulatorConfig,\n ZRomulatorConfigId,\n} from \"@zthun/romulator-client\";\nimport { ZRomulatorConfigUpdateDto } from \"./config-update.mjs\";\nimport type { IZRomulatorConfigsService } from \"./configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"./configs-service.mjs\";\n\n@Controller(\"configs\")\nexport class ZRomulatorConfigsController {\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n ) {}\n\n @Get()\n public async list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorConfig>> {\n const request = new ZDataRequestBuilder().query(query).build();\n return this._configs.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @ApiBody({\n type: ZRomulatorConfigUpdateDto,\n })\n @Patch(\":identification\")\n @UsePipes(\n new ValidationPipe({\n transform: true,\n whitelist: true,\n skipMissingProperties: false,\n skipNullProperties: false,\n skipUndefinedProperties: false,\n }),\n )\n public async update(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n @Body() payload: ZRomulatorConfigUpdateDto,\n ): Promise<IZRomulatorConfig> {\n return this._configs.update(identification, payload);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the config\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: ZRomulatorConfigId,\n ): Promise<IZRomulatorConfig> {\n return await this._configs.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsController } from \"./configs-controller.mjs\";\nimport {\n ZRomulatorConfigsService,\n ZRomulatorConfigsToken,\n} from \"./configs-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorConfigsController],\n providers: [\n { provide: ZRomulatorConfigsToken, useClass: ZRomulatorConfigsService },\n ],\n exports: [ZRomulatorConfigsToken],\n})\nexport class ZRomulatorConfigsModule {}\n","import { isTagged, ZTag } from \"@zthun/helpful-reflection\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport \"reflect-metadata\";\n\nconst KnownSystem = \"@zthunworks/romulator/known-system\";\n\n/**\n * A helper factory class for creating supported systems.\n */\nexport abstract class ZRomulatorSystemKnown {\n /**\n * Returns all known systems.\n *\n * @returns\n * All supported systems.\n */\n public static all() {\n const properties = Object.getOwnPropertyNames(ZRomulatorSystemKnown);\n const methods = properties\n .filter((p) => isTagged(KnownSystem, ZRomulatorSystemKnown, p))\n .map((p) => ZRomulatorSystemKnown[p])\n .map((f) => f as () => IZRomulatorSystem);\n return methods.map((m) => m.call(null));\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Entertainment System (NES).\n *\n * @returns\n * A {@link ZRomulatorSystemBuilder} instance that has\n * built the nes.\n */\n @ZTag(KnownSystem)\n public static nes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo)\n .console()\n .name(\"Nintendo Entertainment System\")\n .generation(3)\n .build();\n }\n\n /**\n * Creates a system that represents the Super\n * Nintendo Entertainment System (SNES).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static snes() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.SuperNintendo)\n .console()\n .name(\"Super Nintendo Entertainment System\")\n .generation(4)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * 64 (N64).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static n64() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Nintendo64)\n .console()\n .name(\"Nintendo 64\")\n .generation(5)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * GameCube (GC).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static gc() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.GameCube)\n .console()\n .name(\"Nintendo GameCube\")\n .generation(6)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii (Wii).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wii() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Wii)\n .console()\n .name(\"Nintendo Wii\")\n .generation(7)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Wii U (WiiU).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static wiiu() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.WiiU)\n .console()\n .name(\"Nintendo Wii U\")\n .generation(8)\n .build();\n }\n\n /**\n * Creates a system that represents the Nintendo\n * Switch (Switch).\n *\n * @returns\n * This instance.\n */\n @ZTag(KnownSystem)\n public static switch() {\n return new ZRomulatorSystemBuilder()\n .id(ZRomulatorSystemId.Switch)\n .console()\n .name(\"Nintendo Switch\")\n .generation(9)\n .build();\n }\n\n /**\n * Creates a system from an id slug.\n *\n * @param id -\n * The id slug of the system to create.\n *\n * @return\n * The system, or null if the id is not known.\n */\n public static from(id: string): IZRomulatorSystem | null {\n if (isTagged(KnownSystem, ZRomulatorSystemKnown, id)) {\n return ZRomulatorSystemKnown[id]();\n }\n\n return null;\n }\n}\n","import { firstTruthy } from \"@zthun/helpful-fn\";\nimport type { IZDataMatch } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\n\n/**\n * A data match function which matches a string (search) filter\n * to a game's name, system slug, or system name.\n */\nexport class ZRomulatorDataMatchGame\n implements IZDataMatch<IZRomulatorGame, string>\n{\n public match(data: IZRomulatorGame, filter: string): boolean {\n const needle = filter?.trim().toLowerCase();\n const { name = \"\", system = \"\" } = data;\n const target = ZRomulatorSystemKnown.from(system);\n const systemName = firstTruthy(\"\", target?.name);\n\n if (!needle?.length) {\n return true;\n }\n\n return [name, system, systemName]\n .filter((s) => s.length)\n .some((k) => k.toLowerCase().includes(needle));\n }\n}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport type { IZFileSystemService } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataRequestBuilder,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type {\n IZRomulatorGame,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorGameBuilder,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { kebabCase } from \"lodash-es\";\nimport { basename, dirname, parse } from \"node:path\";\nimport { ZRomulatorConfigKnown } from \"../config/config-known.mjs\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\nimport { ZRomulatorSystemKnown } from \"../systems/system-known.mjs\";\nimport { ZRomulatorDataMatchGame } from \"./data-match-game.mjs\";\n\nexport const ZRomulatorGamesToken = Symbol(\"romulator-games-service\");\n\nexport interface IZRomulatorGamesService extends IZRestfulGet<IZRomulatorGame> {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>>;\n}\n\n@Injectable()\nexport class ZRomulatorGamesService implements IZRomulatorGamesService {\n private readonly _logger: IZLogger;\n\n public constructor(\n @Inject(ZFileSystemToken)\n private readonly _file: IZFileSystemService,\n @Inject(ZRomulatorConfigsToken)\n private readonly _config: IZRomulatorConfigsService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorGamesService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorGame>> {\n const config = ZRomulatorConfigKnown.games();\n const { contents } = await this._config.get(config.id);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n\n const cwd = detokenize(firstDefined(fallback, gamesFolder), process.env);\n const time = new Date();\n\n let msg = `Searching for games in ${cwd}`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const systems = ZRomulatorSystemKnown.all().map((system) => system.id);\n const glob = `{${systems.join(\",\")}}/**/*.zip`;\n const nodes = await this._file.search(glob, { cwd, stat: false });\n const span = new Date().getTime() - time.getTime();\n\n msg = `Found ${nodes.length} games. Search took ${span} milliseconds.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const games = nodes.map(({ path }) => {\n const dir = basename(dirname(path)) as ZRomulatorSystemId;\n const { name: file } = parse(path);\n const id = `${dir}-${kebabCase(file)}`;\n\n return new ZRomulatorGameBuilder()\n .id(id)\n .system(dir)\n .file(path)\n .name(file)\n .build();\n });\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorGame>()\n .search(new ZRomulatorDataMatchGame())\n .build();\n const source = new ZDataSourceStatic(games, options);\n\n const $sort = new ZSortBuilder()\n .sorts(firstDefined([], req.sort))\n .ascending(\"system\")\n .ascending(\"name\")\n .build();\n const $request = new ZDataRequestBuilder().copy(req).sort($sort).build();\n\n const data = await source.retrieve($request);\n const count = await source.count($request);\n\n return new ZPageBuilder().count(count).data(data).build();\n }\n\n public async get(id: string): Promise<IZRomulatorGame> {\n const { data: games } = await this.list(new ZDataRequestBuilder().build());\n const match = games.find((game) => game.id === id);\n\n if (!match) {\n throw new NotFoundException(`Unable to find game with id, ${id}.`);\n }\n\n return match;\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorGame } from \"@zthun/romulator-client\";\nimport type { IZRomulatorGamesService } from \"./games-service.mjs\";\nimport { ZRomulatorGamesToken } from \"./games-service.mjs\";\n\n@Controller(\"games\")\nexport class ZRomulatorGamesController {\n public constructor(\n @Inject(ZRomulatorGamesToken)\n private readonly _games: IZRomulatorGamesService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorGame>> {\n return this._games.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._games.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesController } from \"./games-controller.mjs\";\nimport {\n ZRomulatorGamesService,\n ZRomulatorGamesToken,\n} from \"./games-service.mjs\";\n\n@Module({\n imports: [ZRomulatorConfigsModule, ZFileSystemModule, ZLoggerModule],\n controllers: [ZRomulatorGamesController],\n providers: [\n {\n provide: ZRomulatorGamesToken,\n useClass: ZRomulatorGamesService,\n },\n ],\n})\nexport class ZRomulatorGamesModule {}\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport type {\n IZFileRepository,\n IZFileSystemNode,\n IZFileSystemService,\n} from \"@zthun/crumbtrail-fs\";\nimport { ZFileRepository, ZStreamFolder } from \"@zthun/crumbtrail-fs\";\nimport { ZFileSystemToken } from \"@zthun/crumbtrail-nest\";\nimport { detokenize, firstDefined } from \"@zthun/helpful-fn\";\nimport {\n ZDataRequestBuilder,\n ZFilterBinaryBuilder,\n ZSortBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZRomulatorConfigGamesBuilder,\n ZRomulatorConfigGamesMetadata,\n ZRomulatorConfigId,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport { first, trimEnd } from \"lodash-es\";\nimport { resolve, sep } from \"node:path\";\nimport { env } from \"node:process\";\nimport type { IZRomulatorConfigsService } from \"../config/configs-service.mjs\";\nimport { ZRomulatorConfigsToken } from \"../config/configs-service.mjs\";\n\nexport const ZRomulatorFilesToken = Symbol(\"files\");\n\n/**\n * Represents the service that you can use to\n * scan the games folder for media, info, games, and systems.\n */\nexport interface IZRomulatorFilesService {\n /**\n * Retrieves all media found in the games .media folder.\n *\n * @returns\n * A list of all media found in the game media folder.\n */\n media(): Promise<IZFileSystemNode[]>;\n\n /**\n * Retrieves a single media node found in the .media folder.\n *\n * @param path -\n * The path of the media node to retrieve. This will\n * be relative to the configured games directory. If this\n * starts with a root OS folder, then the path by itself\n * is used.\n *\n * @returns\n * The node with the given path or null if no such\n * file exists.\n */\n media(path: string): Promise<IZFileSystemNode | null>;\n\n /**\n * Retrieves all systems found in the games folder.\n *\n * A system is a root folder that is a slug of a supported\n * system.\n *\n * @returns\n * A list of all systems found in the games folder.\n */\n systems(): Promise<IZFileSystemNode[]>;\n\n /**\n * Retrieves a single system found in the games folder.\n *\n * @param path -\n * The id of the system, which is also the name of the folder.\n *\n * @returns\n * The node that represents the system slug. Returns null if\n * the folder does not exist or is not supported. Note\n * that the path is relative to the configured games folder. If you\n * want to supply a fully qualified absolute path, then this string\n * should start with the root of an OS drive (not recommended).\n */\n systems(path: string): Promise<IZFileSystemNode | null>;\n\n /**\n * Retrieves all info found in the games .info folder.\n *\n * Info is the metadata scraped from a scraper service.\n * The data format is stored in json.\n *\n * @returns\n * A list of all info found in the games folder.\n */\n info(): Promise<IZFileSystemNode[]>;\n\n /**\n * Retrieves specific information found in the games .info folder.\n *\n * @param path -\n * The path of the info node to retrieve.\n *\n * @returns\n * The node with the given path or null if no such file exists.\n */\n info(path: string): Promise<IZFileSystemNode | null>;\n\n /**\n * Initializes the file repository.\n */\n init(): Promise<void>;\n\n /**\n * Cleans up internal resources.\n */\n dispose(): Promise<void>;\n}\n\n@Injectable()\nexport class ZRomulatorFilesService implements IZRomulatorFilesService {\n private static readonly MediaFolderName = \".media\";\n private static readonly InfoFolderName = \".info\";\n\n private _repository: ZFileRepository = new ZFileRepository();\n private _folderStream = new ZStreamFolder();\n private _globs: string[];\n private _systems: string[];\n\n public constructor(\n @Inject(ZRomulatorConfigsToken)\n private readonly _configs: IZRomulatorConfigsService,\n @Inject(ZFileSystemToken)\n private readonly _fileSystem: IZFileSystemService,\n ) {\n const slugs = Object.values(ZRomulatorSystemId);\n this._globs = [\".media/**\", \".info/**\", ...slugs.map((s) => `${s}/*.*`)];\n this._systems = Object.values(ZRomulatorSystemId);\n }\n\n private async gamesFolder() {\n const config = await this._configs.get(ZRomulatorConfigId.Games);\n const { gamesFolder } = new ZRomulatorConfigGamesBuilder()\n .copy(config.contents)\n .build();\n const { fallback } = ZRomulatorConfigGamesMetadata.gamesFolder();\n const _gamesFolder = firstDefined(fallback.gamesFolder, gamesFolder);\n return detokenize(_gamesFolder, env);\n }\n\n private async mediaFolder() {\n const gamesFolder = await this.gamesFolder();\n return resolve(gamesFolder, ZRomulatorFilesService.MediaFolderName);\n }\n\n private async infoFolder() {\n const gamesFolder = await this.gamesFolder();\n return resolve(gamesFolder, ZRomulatorFilesService.InfoFolderName);\n }\n\n private async contents(\n root: string,\n path?: string,\n ): Promise<IZFileSystemNode[] | IZFileSystemNode | null> {\n const repository = await this.seed();\n const prefix = trimEnd(root, \"/\");\n const folder = `${prefix}${sep}`;\n\n let filter = new ZFilterBinaryBuilder().subject(\"path\");\n filter =\n path == null\n ? filter.startsWith().value(folder)\n : filter.equal().value(resolve(folder, path));\n\n const sort = new ZSortBuilder().ascending(\"path\").build();\n\n const request = new ZDataRequestBuilder()\n .filter(filter.build())\n .sort(sort)\n .build();\n\n const nodes = await repository.retrieve(request);\n\n return path == null ? nodes : firstDefined(null, first(nodes));\n }\n\n public async init() {\n await this.seed();\n }\n\n public async dispose() {\n await this._repository.reset();\n }\n\n public async seed(): Promise<IZFileRepository> {\n const path = await this.gamesFolder();\n\n if (this._repository.path !== path) {\n await this._folderStream.write(await this.mediaFolder());\n await this._folderStream.write(await this.infoFolder());\n await this._repository.initialize(path, this._globs);\n }\n\n return this._repository;\n }\n\n public media(): Promise<IZFileSystemNode[]>;\n public media(path: string): Promise<IZFileSystemNode | null>;\n public async media(path?: string) {\n return this.contents(await this.mediaFolder(), path);\n }\n\n public systems(): Promise<IZFileSystemNode[]>;\n public systems(path: string): Promise<IZFileSystemNode | null>;\n public async systems(path?: string) {\n // Systems use directories. There's a maximum limit of about 200 systems.\n // Since we don't actually need to read any metadata or scan through thousands\n // of unknown folders, we can use the supported system ids to just grab the\n // systems that we need. Since the file repository does a stat anyway, we can just\n // grab the systems from the file system and it should be fast enough. These are all\n // folders, so we don't even need the stats for them and we can assume folders.\n const games = await this.gamesFolder();\n const folders =\n path == null ? this._systems.map((s) => `${s}/`) : resolve(games, path);\n const items = await this._fileSystem.search(folders, { cwd: games });\n\n return path == null ? items : firstDefined(null, first(items));\n }\n\n public info(): Promise<IZFileSystemNode[]>;\n public info(path: string): Promise<IZFileSystemNode | null>;\n public async info(path?: string) {\n return this.contents(await this.infoFolder(), path);\n }\n}\n","import { Inject, Module } from \"@nestjs/common\";\nimport { ZFileSystemModule } from \"@zthun/crumbtrail-nest\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport type { IZRomulatorFilesService } from \"./files-service.mjs\";\nimport {\n ZRomulatorFilesService,\n ZRomulatorFilesToken,\n} from \"./files-service.mjs\";\n\n@Module({\n imports: [ZFileSystemModule, ZRomulatorConfigsModule],\n providers: [\n { provide: ZRomulatorFilesToken, useClass: ZRomulatorFilesService },\n ],\n exports: [ZRomulatorFilesToken],\n})\nexport class ZRomulatorFilesModule {\n public constructor(\n @Inject(ZRomulatorFilesToken)\n private readonly _files: IZRomulatorFilesService,\n ) {}\n\n public async onModuleInit() {\n await this._files.init();\n }\n\n public async onModuleDestroy() {\n await this._files.dispose();\n }\n}\n","import {\n ForbiddenException,\n Inject,\n Injectable,\n NotAcceptableException,\n NotFoundException,\n StreamableFile,\n} from \"@nestjs/common\";\nimport { createError, firstDefined, firstTruthy } from \"@zthun/helpful-fn\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n type IZDataRequest,\n type IZPage,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport {\n ZRomulatorMediaBuilder,\n type IZRomulatorMedia,\n} from \"@zthun/romulator-client\";\nimport type { IZRestfulDelete, IZRestfulGet } from \"@zthun/webigail-rest\";\nimport { ZMimeTypeApplication } from \"@zthun/webigail-url\";\nimport { findIndex } from \"lodash-es\";\nimport { lookup } from \"mime-types\";\nimport { createReadStream } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport type { IZRomulatorFilesService } from \"../files/files-service.mjs\";\nimport { ZRomulatorFilesToken } from \"../files/files-service.mjs\";\n\nexport const ZRomulatorMediaToken = Symbol(\"romulator-media-service\");\n\nexport interface IZRomulatorMediaService\n extends IZRestfulGet<IZRomulatorMedia>,\n IZRestfulDelete {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>>;\n download(id: string, accept: string): Promise<StreamableFile>;\n}\n\n@Injectable()\nexport class ZRomulatorMediaService implements IZRomulatorMediaService {\n private _logger: IZLogger;\n\n public constructor(\n @Inject(ZRomulatorFilesToken) private _files: IZRomulatorFilesService,\n @Inject(ZLoggerToken) logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorMediaService\", logger);\n }\n\n private async findAllMedia(): Promise<IZRomulatorMedia[]> {\n const files = await this._files.media();\n\n return files\n .map((f) => new ZRomulatorMediaBuilder().from(f.path).build())\n .filter((media) => !!media.id);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorMedia>> {\n let msg = `Querying media`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n const time = new Date();\n const mediaList = await this.findAllMedia();\n const span = new Date().getTime() - time.getTime();\n msg = `Found ${mediaList.length} media files. Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const options = new ZDataSourceStaticOptionsBuilder<IZRomulatorMedia>()\n .search(new ZDataSearchFields())\n .build();\n const source = new ZDataSourceStatic(mediaList, options);\n const page = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder<IZRomulatorMedia>().data(page).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorMedia> {\n const time = new Date();\n let log = `Searching for media with id ${id}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const mediaList = await this.findAllMedia();\n const index = findIndex(mediaList, (m) => m.id === id);\n const span = new Date().getTime() - time.getTime();\n\n if (index < 0) {\n const msg = `Could not find any media with id, ${id}.`;\n log = `${msg} Search took ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().warning().message(log).build());\n throw new NotFoundException(msg);\n }\n\n const media = mediaList[index];\n log = `Found media, ${media.url} after ${span} milliseconds`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return media;\n }\n\n public async download(id: string, accept: string): Promise<StreamableFile> {\n let log = `Download request received for ${id}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n const fallback = ZMimeTypeApplication.OctetStream;\n const { fileName, url } = await this.get(id);\n const lookupResult = lookup(firstDefined(\"\", fileName));\n const mime = firstTruthy(fallback, lookupResult) as string;\n const accepts = accept.split(\",\").map((h) => h.split(\";\")[0].trim());\n\n const acceptable = accepts.some((a) => {\n if (a === \"*/*\") {\n return true;\n }\n if (a.endsWith(\"/*\")) {\n return mime.startsWith(a.slice(0, -1));\n }\n return a === mime;\n });\n\n if (!acceptable) {\n const msg =\n `The media requested is of type ${mime}. ` +\n `The request only accepts ${accept}.`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n throw new NotAcceptableException(msg);\n }\n\n log = `Streaming ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n return new StreamableFile(createReadStream(firstDefined(\"\", url)), {\n type: mime,\n disposition: `inline; filename=${fileName}`,\n });\n }\n\n public async delete(id: string): Promise<void> {\n const { url } = await this.get(id);\n const _url = firstDefined(\"\", url);\n\n let log = `Attempting to delete file ${_url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n\n try {\n await unlink(_url);\n } catch (err) {\n const { message } = createError(err);\n this._logger.log(new ZLogEntryBuilder().error().message(message).build());\n throw new ForbiddenException(message);\n }\n\n log = `Deleted ${url}`;\n this._logger.log(new ZLogEntryBuilder().info().message(log).build());\n }\n}\n","import {\n Controller,\n Delete,\n Get,\n Inject,\n Param,\n Query,\n Req,\n} from \"@nestjs/common\";\nimport { ApiParam, ApiQuery, ApiResponse, ApiTags } from \"@nestjs/swagger\";\nimport {\n ZDataRequestBuilder,\n type IZDataRequestQuery,\n} from \"@zthun/helpful-query\";\nimport { ZHttpCodeClient, ZHttpCodeSuccess } from \"@zthun/webigail-http\";\nimport type { Request } from \"express\";\nimport type { IZRomulatorMediaService } from \"./media-service.mjs\";\nimport { ZRomulatorMediaToken } from \"./media-service.mjs\";\n\n@ApiTags(\"Media\")\n@Controller(\"media\")\nexport class ZRomulatorMediaController {\n public constructor(\n @Inject(ZRomulatorMediaToken)\n private _media: IZRomulatorMediaService,\n ) {}\n\n @ApiQuery({\n name: \"page\",\n required: false,\n type: Number,\n example: 1,\n description: \"Page number (1-based)\",\n })\n @ApiQuery({\n name: \"size\",\n required: false,\n type: Number,\n example: 20,\n description: \"Items per page. Defaults to Infinity\",\n })\n @ApiQuery({\n name: \"search\",\n required: false,\n type: String,\n description: \"Search query\",\n })\n @ApiQuery({\n name: \"sort\",\n required: false,\n type: String,\n description: \"Sort criterion\",\n })\n @ApiQuery({\n name: \"filter\",\n required: false,\n type: String,\n description: \"Filter criterion\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the requested page of media and the total count\",\n })\n @Get()\n public list(@Query() params: IZDataRequestQuery) {\n const request = new ZDataRequestBuilder().query(params).build();\n return this._media.list(request);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @ApiResponse({\n status: ZHttpCodeSuccess.OK,\n description: \"Returns the media\",\n content: {\n \"*/*\": {},\n \"image/*\": {},\n \"image/png\": {},\n \"image/jpeg\": {},\n \"application/mp4\": {},\n \"application/json\": {},\n },\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotFound,\n description: \"Media not found\",\n })\n @ApiResponse({\n status: ZHttpCodeClient.NotAcceptable,\n description: \"Unsupported Accept header\",\n })\n @Get(\":identification\")\n public async get(\n @Param(\"identification\") identification: string,\n @Req() req: Request,\n ) {\n const { accept = \"*/*\" } = req.headers;\n\n return accept.includes(\"application/json\")\n ? this._media.get(identification)\n : this._media.download(identification, accept);\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the media\",\n })\n @Delete(\":identification\")\n public async delete(@Param(\"identification\") identification: string) {\n await this._media.delete(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorFilesModule } from \"../files/files-module.mjs\";\nimport { ZRomulatorMediaController } from \"./media-controller.mjs\";\nimport {\n ZRomulatorMediaService,\n ZRomulatorMediaToken,\n} from \"./media-service.mjs\";\n\n@Module({\n imports: [ZLoggerModule, ZRomulatorFilesModule],\n controllers: [ZRomulatorMediaController],\n providers: [\n { provide: ZRomulatorMediaToken, useClass: ZRomulatorMediaService },\n ],\n})\nexport class ZRomulatorMediaModule {}\n","import { Inject, Injectable, NotFoundException } from \"@nestjs/common\";\nimport { ZStreamFile } from \"@zthun/crumbtrail-fs\";\nimport { createError, firstDefined } from \"@zthun/helpful-fn\";\nimport type { IZDataRequest, IZPage } from \"@zthun/helpful-query\";\nimport {\n ZDataSearchFields,\n ZDataSourceStatic,\n ZDataSourceStaticOptionsBuilder,\n ZPageBuilder,\n} from \"@zthun/helpful-query\";\nimport {\n ZLogEntryBuilder,\n ZLoggerContext,\n type IZLogger,\n} from \"@zthun/lumberjacky-log\";\nimport { ZLoggerToken } from \"@zthun/lumberjacky-nest\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport {\n isSystemId,\n ZRomulatorSystemBuilder,\n ZRomulatorSystemId,\n} from \"@zthun/romulator-client\";\nimport { basename } from \"node:path\";\nimport type { IZRomulatorFilesService } from \"../files/files-service.mjs\";\nimport { ZRomulatorFilesToken } from \"../files/files-service.mjs\";\n\nexport const ZRomulatorSystemsToken = Symbol(\"romulator-systems-service\");\n\nexport interface IZRomulatorSystemsService {\n list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>>;\n get(id: string): Promise<IZRomulatorSystem>;\n}\n\n@Injectable()\nexport class ZRomulatorSystemsService implements IZRomulatorSystemsService {\n private _logger: IZLogger;\n private _fileStream = new ZStreamFile({\n cache: { maxFiles: Object.keys(ZRomulatorSystemId).length + 1 },\n });\n\n public constructor(\n @Inject(ZRomulatorFilesToken)\n private readonly _files: IZRomulatorFilesService,\n @Inject(ZLoggerToken) readonly logger: IZLogger,\n ) {\n this._logger = new ZLoggerContext(\"ZRomulatorSystemsService\", logger);\n }\n\n public async list(req: IZDataRequest): Promise<IZPage<IZRomulatorSystem>> {\n const page = firstDefined(1, req.page);\n const size = firstDefined(Infinity, req.size);\n let msg = `Retrieving systems page, ${page}, with size, ${size}.`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const folders = await this._files.systems();\n\n const systems = await Promise.all(\n folders\n .map((folder) => folder.path)\n .map((path) => basename(path))\n .filter((slug) => isSystemId(slug))\n .map((slug) => this._createSystemFromSlug(slug)),\n );\n\n msg = `Found ${systems.length} systems`;\n this._logger.log(new ZLogEntryBuilder().info().message(msg).build());\n\n const sourceOptions = new ZDataSourceStaticOptionsBuilder()\n .search(new ZDataSearchFields([\"id\", \"name\", \"short\"]))\n .build();\n\n const source = new ZDataSourceStatic<IZRomulatorSystem>(\n systems,\n sourceOptions,\n );\n\n const data = await source.retrieve(req);\n const count = await source.count(req);\n\n return new ZPageBuilder().data(data).count(count).build();\n }\n\n public async get(id: string): Promise<IZRomulatorSystem> {\n // The system path should be the slug itself.\n if (!isSystemId(id)) {\n const message = `The specified system slug, ${id}, is not supported.`;\n throw new NotFoundException(message);\n }\n\n const node = await this._files.systems(id);\n\n if (node == null) {\n const message = `System with slug, ${id}, was not found.`;\n throw new NotFoundException(message);\n }\n\n return this._createSystemFromSlug(id);\n }\n\n private async _createSystemFromSlug(\n slug: ZRomulatorSystemId,\n ): Promise<IZRomulatorSystem> {\n const system = new ZRomulatorSystemBuilder().id(slug);\n const path = `${slug}/info.json`;\n const info = await this._files.info(path);\n\n if (info == null) {\n // Best we can do right now.\n return system.build();\n }\n\n try {\n const contents = await this._fileStream.read(info.path);\n const json = JSON.parse(contents.toString());\n return system.assign(json).redact().build();\n } catch (e) {\n // Best we can do\n const err = createError(e);\n const msg = `Cannot read system metadata, ${err.message}`;\n this._logger.log(new ZLogEntryBuilder().error().message(msg).build());\n return system.build();\n }\n }\n}\n","import { Controller, Get, Inject, Param, Query } from \"@nestjs/common\";\nimport { ApiParam } from \"@nestjs/swagger\";\nimport type { IZDataRequestQuery, IZPage } from \"@zthun/helpful-query\";\nimport { ZDataRequestBuilder } from \"@zthun/helpful-query\";\nimport type { IZRomulatorSystem } from \"@zthun/romulator-client\";\nimport type { IZRomulatorSystemsService } from \"./systems-service.mjs\";\nimport { ZRomulatorSystemsToken } from \"./systems-service.mjs\";\n\n@Controller(\"systems\")\nexport class ZRomulatorSystemsController {\n public constructor(\n @Inject(ZRomulatorSystemsToken)\n private readonly _systems: IZRomulatorSystemsService,\n ) {}\n\n @Get()\n public list(\n @Query() query: IZDataRequestQuery,\n ): Promise<IZPage<IZRomulatorSystem>> {\n return this._systems.list(new ZDataRequestBuilder().query(query).build());\n }\n\n @ApiParam({\n type: \"string\",\n name: \"identification\",\n description: \"The id of the system\",\n })\n @Get(\":identification\")\n public get(@Param(\"identification\") identification: string) {\n return this._systems.get(identification);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ZLoggerModule } from \"@zthun/lumberjacky-nest\";\nimport { ZRomulatorFilesModule } from \"../files/files-module.mjs\";\nimport { ZRomulatorSystemsController } from \"./systems-controller.mjs\";\nimport {\n ZRomulatorSystemsService,\n ZRomulatorSystemsToken,\n} from \"./systems-service.mjs\";\n\n@Module({\n imports: [ZRomulatorFilesModule, ZLoggerModule],\n controllers: [ZRomulatorSystemsController],\n providers: [\n { provide: ZRomulatorSystemsToken, useClass: ZRomulatorSystemsService },\n ],\n})\nexport class ZRomulatorSystemsModule {}\n","/* istanbul ignore file -- @preserve */\nimport { Module } from \"@nestjs/common\";\nimport { ZRomulatorConfigsModule } from \"../config/configs-module.mjs\";\nimport { ZRomulatorGamesModule } from \"../games/games-module.mjs\";\nimport { ZRomulatorMediaModule } from \"../media/media-module.mjs\";\nimport { ZRomulatorSystemsModule } from \"../systems/systems-module.mjs\";\n\n@Module({\n imports: [\n ZRomulatorSystemsModule,\n ZRomulatorConfigsModule,\n ZRomulatorMediaModule,\n ZRomulatorGamesModule,\n ],\n})\nexport class ZRomulatorModule {}\n","import { NestFactory } from \"@nestjs/core\";\nimport { DocumentBuilder, SwaggerModule } from \"@nestjs/swagger\";\nimport { ZRomulatorModule } from \"./app/app-module.mjs\";\n\nconst PORT = 3000;\n\n(async function () {\n const app = await NestFactory.create(ZRomulatorModule);\n app.setGlobalPrefix(\"api\");\n app.enableCors();\n\n const config = new DocumentBuilder()\n .setTitle(\"Romulator API\")\n .setDescription(\"The Romulator API\")\n .setVersion(\"1\")\n .build();\n\n const document = () => SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n await app.listen(PORT);\n})();\n"],"names":["ZRomulatorConfigUpdateDto","contents","type","properties","message","ZDir","application","resolve","homedir","configs","ZRomulatorConfigKnown","all","games","create","id","file","ZRomulatorConfigBuilder","ZRomulatorConfigId","Games","name","description","avatar","metadata","ZRomulatorConfigGamesMetadata","build","ZRomulatorConfigsToken","Symbol","ZRomulatorConfigsService","_logger","ZLoggerContext","list","req","page","firstDefined","size","Infinity","msg","log","ZLogEntryBuilder","info","options","ZDataSourceStaticOptionsBuilder","search","ZDataSearchFields","source","ZDataSourceStatic","data","retrieve","count","length","ZPageBuilder","get","config","_find","buffer","readFile","json","toString","JSON","parse","byteLength","e","createError","warning","result","copy","Promise","update","record","next","stringify","mkdir","dirname","recursive","writeFile","error","reject","InternalServerErrorException","find","c","NotFoundException","ZRomulatorConfigsController","_configs","request","ZDataRequestBuilder","query","payload","identification","ValidationPipe","transform","whitelist","skipMissingProperties","skipNullProperties","skipUndefinedProperties","ZRomulatorConfigsModule","imports","ZFileSystemModule","ZLoggerModule","controllers","providers","provide","useClass","exports","KnownSystem","ZRomulatorSystemKnown","Object","getOwnPropertyNames","methods","filter","p","isTagged","map","f","m","call","nes","ZRomulatorSystemBuilder","ZRomulatorSystemId","Nintendo","console","generation","snes","SuperNintendo","n64","Nintendo64","gc","GameCube","wii","Wii","wiiu","WiiU","switch","Switch","from","ZRomulatorDataMatchGame","match","needle","trim","toLowerCase","system","target","systemName","firstTruthy","s","some","k","includes","ZRomulatorGamesToken","ZRomulatorGamesService","_file","_config","logger","gamesFolder","ZRomulatorConfigGamesBuilder","fallback","cwd","detokenize","process","env","time","Date","systems","glob","join","nodes","stat","span","getTime","path","dir","basename","kebabCase","ZRomulatorGameBuilder","$sort","ZSortBuilder","sorts","sort","ascending","$request","game","ZRomulatorGamesController","_games","ZRomulatorGamesModule","ZRomulatorFilesToken","ZRomulatorFilesService","MediaFolderName","InfoFolderName","_repository","ZFileRepository","_folderStream","ZStreamFolder","_globs","_systems","_fileSystem","slugs","values","_gamesFolder","mediaFolder","infoFolder","root","repository","seed","prefix","trimEnd","folder","sep","ZFilterBinaryBuilder","subject","startsWith","value","equal","first","init","dispose","reset","write","initialize","media","folders","items","ZRomulatorFilesModule","_files","onModuleInit","onModuleDestroy","ZRomulatorMediaToken","ZRomulatorMediaService","findAllMedia","files","ZRomulatorMediaBuilder","mediaList","index","findIndex","url","download","accept","ZMimeTypeApplication","OctetStream","fileName","lookupResult","lookup","mime","accepts","split","h","acceptable","a","endsWith","slice","NotAcceptableException","StreamableFile","createReadStream","disposition","delete","_url","unlink","err","ForbiddenException","ZRomulatorMediaController","_media","params","headers","required","Number","example","String","status","ZHttpCodeSuccess","OK","content","ZHttpCodeClient","NotFound","NotAcceptable","ZRomulatorMediaModule","ZRomulatorSystemsToken","ZRomulatorSystemsService","_fileStream","ZStreamFile","cache","maxFiles","keys","slug","isSystemId","_createSystemFromSlug","sourceOptions","node","read","assign","redact","ZRomulatorSystemsController","ZRomulatorSystemsModule","ZRomulatorModule","PORT","app","NestFactory","setGlobalPrefix","enableCors","DocumentBuilder","setTitle","setDescription","setVersion","document","SwaggerModule","createDocument","setup","listen"],"mappings":"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"}
|