diff --git a/package.json b/package.json index 28359cf6..91c6c2d6 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,15 @@ "prettier:fix": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"", "prettier:ci": "prettier --check \"**/*.{js,jsx,ts,tsx,css}\"" }, - "dependencies": { - "@types/node": "^18.14.6", - "standard-version": "^9.5.0", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.3" - }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@types/node": "^18.18.11", "husky": "^8.0.3", "lint-staged": "^13.2.0", - "prettier": "^2.8.5" + "prettier": "^2.8.5", + "standard-version": "^9.5.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.3.3" }, "lint-staged": { "**/*.{js,ts}": [ diff --git a/packages/common/utils/config.ts b/packages/common/utils/config.ts index 43f9d4c5..eb387bab 100644 --- a/packages/common/utils/config.ts +++ b/packages/common/utils/config.ts @@ -118,7 +118,7 @@ export const watchConfigFile = ({ httpServer }: { httpServer: any }) => { refreshConfig(httpServer, false); updateConfigFile(); - fs.watchFile(configPath, (current, previous) => { + fs.watchFile(configPath, () => { refreshConfig(httpServer, true); }); }; @@ -162,6 +162,17 @@ export const refreshConfig = (httpServer: any, refresh: boolean) => { httpServer.restart(); } + const osuInstances: any = Object.values( + httpServer.instanceManager.osuInstances || {} + ); + if ( + osuInstances.length == 1 && + enableGosuOverlay == true && + updated == true + ) { + osuInstances[0].injectGameOverlay(); + } + config.debugLogging = debugLogging; config.calculatePP = calculatePP; config.enableKeyOverlay = enableKeyOverlay; diff --git a/packages/common/utils/downloader.ts b/packages/common/utils/downloader.ts index 93e58339..52600bd6 100644 --- a/packages/common/utils/downloader.ts +++ b/packages/common/utils/downloader.ts @@ -1,14 +1,26 @@ import fs from 'fs'; import https from 'https'; +import { colorText } from './logger'; + const progressBarWidth = 40; -const updateProgressBar = (progress: number): void => { +export const updateProgressBar = ( + title: string, + progress: number, + message: string = '' +): void => { + const colored_text = colorText('info'); + if (message) message = ` - ${message}`; + const filledWidth = Math.round(progressBarWidth * progress); const emptyWidth = progressBarWidth - filledWidth; const progressBar = '█'.repeat(filledWidth) + '░'.repeat(emptyWidth); + process.stdout.write( - `Downloading: [${progressBar}] ${(progress * 100).toFixed(2)}%\r` + `${colored_text} ${title}: [${progressBar}] ${(progress * 100).toFixed( + 2 + )}%${message}\r` ); if (progress === 1) { @@ -66,7 +78,7 @@ export const downloadFile = ( response.on('data', (data) => { downloadedSize += data.length; const progress = downloadedSize / totalSize; - updateProgressBar(progress); + updateProgressBar('Downloading', progress); }); response.pipe(file); diff --git a/packages/common/utils/logger.ts b/packages/common/utils/logger.ts index b8395d21..6f4329a5 100644 --- a/packages/common/utils/logger.ts +++ b/packages/common/utils/logger.ts @@ -9,25 +9,31 @@ const colors = { grey: '\x1b[90m' }; -function colorText(status: string, ...anything: any) { +export function colorText(status: string) { const colorCode = colors[status] || colors.reset; const timestamp = new Date().toISOString().split('T')[1].replace('Z', ''); const time = `${colors.grey}${timestamp}${colors.reset}`; - console.log( - time, - `${colorCode} ${status.toUpperCase()} ${colors.reset}`, - ...anything - ); + return `${time} ${colorCode} ${status.toUpperCase()} ${colors.reset}`; } export const wLogger = { - info: (...args: any) => colorText('info', ...args), + info: (...args: any) => { + const colored_text = colorText('info'); + console.log(colored_text, ...args); + }, debug: (...args: any) => { if (config.debugLogging != true) return; - colorText('debug', ...args); + const colored_text = colorText('debug'); + console.log(colored_text, ...args); + }, + error: (...args: any) => { + const colored_text = colorText('error'); + console.log(colored_text, ...args); }, - error: (...args: any) => colorText('error', ...args), - warn: (...args: any) => colorText('warn', ...args) + warn: (...args: any) => { + const colored_text = colorText('warn'); + console.log(colored_text, ...args); + } }; diff --git a/packages/game-overlay/package.json b/packages/game-overlay/package.json index 9b5b5334..c4486b77 100644 --- a/packages/game-overlay/package.json +++ b/packages/game-overlay/package.json @@ -9,7 +9,6 @@ "build": "tsc" }, "dependencies": { - "decompress": "^4.2.1", "tsprocess": "workspace:*", "@tosu/common": "workspace:*" } diff --git a/packages/game-overlay/src/index.ts b/packages/game-overlay/src/index.ts index f2da610b..4a998fba 100644 --- a/packages/game-overlay/src/index.ts +++ b/packages/game-overlay/src/index.ts @@ -1,21 +1,19 @@ -import { downloadFile, wLogger } from '@tosu/common'; -import decompress from 'decompress'; +import { downloadFile, unzip, wLogger } from '@tosu/common'; import { execFile } from 'node:child_process'; -import { existsSync, writeFileSync } from 'node:fs'; +import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import { mkdir, rm } from 'node:fs/promises'; import path from 'node:path'; import { Process } from 'tsprocess/dist/process'; +const configPath = path.join(process.cwd(), 'config.ini'); const checkGameOverlayConfig = () => { - const configPath = path.join(process.cwd(), 'config.ini'); if (!existsSync(configPath)) { writeFileSync( configPath, `[GameOverlay]; https://github.com/l3lackShark/gosumemory/wiki/GameOverlay -enabled = false gameWidth = 1920 gameHeight = 1080 -overlayURL = http://127.0.0.1:24050/InGame2/index.html +overlayURL = overlayWidth = 380 overlayHeight = 110 overlayOffsetX = 0 @@ -25,11 +23,28 @@ overlayScale = 10` } }; +const checkGosuConfig = (p: Process, checking?: boolean) => { + if (!existsSync(configPath)) return null; + + const read = readFileSync(configPath, 'utf8'); + const parseURL = /^overlayURL[ ]*=[ ]*(.*)$/m.exec(read); + if (!parseURL || !parseURL?.[1]) { + setTimeout(() => { + checkGosuConfig(p, true); + }, 1000); + return false; + } + + if (checking == true) injectGameOverlay(p); + return true; +}; + export const injectGameOverlay = async (p: Process) => { if (process.platform !== 'win32') { - throw new Error( - 'Gameoverlay can run only under windows, sorry linux/darwin user!' + wLogger.error( + `[gosu-overlay] Ingame overlay can run only under windows, sorry linux/darwin user!` ); + return; } // Check for DEPRECATED GOSU CONFIG, due its needed to read [GameOverlay] section from original configuration @@ -44,7 +59,8 @@ export const injectGameOverlay = async (p: Process) => { 'https://dl.kotworks.cyou/gosu-gameoverlay.zip', archivePath ); - await decompress(archivePath, gameOverlayPath); + + await unzip(archivePath, gameOverlayPath); await rm(archivePath); } @@ -53,8 +69,18 @@ export const injectGameOverlay = async (p: Process) => { path.join(process.cwd(), 'gameOverlay', 'gosumemoryoverlay.dll') ) ) { - wLogger.info('Please delete gameOverlay folder, and restart program!'); - process.exit(1); + wLogger.info( + '[gosu-overlay] Please delete gameOverlay folder, and restart program!' + ); + return; + } + + const overlayURLstatus = checkGosuConfig(p); + if (!overlayURLstatus) { + wLogger.warn( + `[gosu-overlay] Specify overlayURL for gameOverlay in config.ini` + ); + return; } return await new Promise((resolve, reject) => { diff --git a/packages/server/router/index.ts b/packages/server/router/index.ts index e7857b4e..8e4c9cfd 100644 --- a/packages/server/router/index.ts +++ b/packages/server/router/index.ts @@ -149,7 +149,7 @@ export default function buildBaseApi(app: HttpServer) { exec(`start "" "${folderPath}"`, (err, stdout, stderr) => { if (err) { - wLogger.error('Error opening file explorer:', err); + wLogger.error('Error opening file explorer:'); return sendJson(res, { error: `Error opening file explorer: ${err.message}` }); @@ -236,7 +236,6 @@ export default function buildBaseApi(app: HttpServer) { }); app.route('/homepage.min.css', 'GET', (req, res) => { - // FIXME: REMOVE THAT SHIT fs.readFile( path.join(pkgAssetsPath, 'homepage.min.css'), 'utf8', @@ -304,8 +303,6 @@ export default function buildBaseApi(app: HttpServer) { performance: calculator.performance(parseBeatmap) }); } catch (error) { - wLogger.error(error); - return sendJson(res, { error: (error as any).message }); diff --git a/packages/server/utils/counters.ts b/packages/server/utils/counters.ts index 89220a7b..0fb71cc3 100644 --- a/packages/server/utils/counters.ts +++ b/packages/server/utils/counters.ts @@ -1,4 +1,4 @@ -import { config, recursiveFilesSearch } from '@tosu/common'; +import { config, recursiveFilesSearch, wLogger } from '@tosu/common'; import fs from 'fs'; import http from 'http'; import path from 'path'; @@ -217,37 +217,43 @@ function rebuildJSON({ } function getLocalCounters() { - const staticPath = - config.staticFolderPath || path.join(pkgRunningFolder, 'static'); - - const countersListTXT = recursiveFilesSearch({ - dir: staticPath, - fileList: [], - filename: 'metadata.txt' - }); + try { + const staticPath = + config.staticFolderPath || path.join(pkgRunningFolder, 'static'); + + const countersListTXT = recursiveFilesSearch({ + dir: staticPath, + fileList: [], + filename: 'metadata.txt' + }); - const countersListHTML = recursiveFilesSearch({ - dir: staticPath, - fileList: [], - filename: 'index.html' - }); + const countersListHTML = recursiveFilesSearch({ + dir: staticPath, + fileList: [], + filename: 'index.html' + }); - const arrayOfLocal = countersListHTML - .filter((r) => { - const folder = path.dirname(r); - return ( - countersListTXT.find((s) => path.dirname(s) == folder) == null - ); - }) - .map((r) => ({ - name: path.basename(path.dirname(r)), - author: 'local', - resolution: [-2, '400'], - authorlinks: [] - })); - - const array = countersListTXT.map((r) => parseTXT(r)); - return array.concat(arrayOfLocal).filter((r) => r.name != ''); + const arrayOfLocal = countersListHTML + .filter((r) => { + const folder = path.dirname(r); + return ( + countersListTXT.find((s) => path.dirname(s) == folder) == + null + ); + }) + .map((r) => ({ + name: path.basename(path.dirname(r)), + author: 'local', + resolution: [-2, '400'], + authorlinks: [] + })); + + const array = countersListTXT.map((r) => parseTXT(r)); + return array.concat(arrayOfLocal).filter((r) => r.name != ''); + } catch (error) { + wLogger.error((error as any).message); + return []; + } } export function buildLocalCounters(res: http.ServerResponse, query?: string) { diff --git a/packages/tosu/src/api/types/v2.ts b/packages/tosu/src/api/types/v2.ts index 2d89cc9d..72ed1cbb 100644 --- a/packages/tosu/src/api/types/v2.ts +++ b/packages/tosu/src/api/types/v2.ts @@ -16,9 +16,20 @@ export enum Modes { } export enum BanchoStatusEnum { - Idle = 0, - Afk = 1, - Playing = 2 + Idle, + Afk, + Playing, + Editing, + Modding, + Multiplayer, + Watching, + Unknown, + Testing, + Submitting, + Paused, + Lobby, + Multiplaying, + OsuDirect } export enum UserLoginStatus { @@ -88,8 +99,43 @@ export enum ChatStatus { VisibleWithFriendsList } +export enum ProgressBarType { + Off, + Pie, + TopRight, + BottomRight, + Bottom +} + +export enum GameState { + Menu, + Edit, + Play, + Exit, + SelectEdit, + SelectPlay, + SelectDrawings, + ResultScreen, + Update, + Busy, + Unknown, + Lobby, + MatchSetup, + SelectMulti, + RankingVs, + OnlineSelection, + OptionsOffsetWizard, + RankingTagCoop, + RankingTeam, + BeatmapImport, + PackageUpdater, + Benchmark, + Tourney, + Charts +} + export interface ApiV2Answer { - state: number; + state: NumberName; session: Session; settings: Settings; profile: Profile; @@ -122,7 +168,7 @@ export interface Settings { chatVisibilityStatus: NumberName; leaderboard: SettingsLeaderboard; - progressBarType: boolean; + progressBar: NumberName; bassDensity: number; resolution: Resolution; diff --git a/packages/tosu/src/api/utils/buildResult.ts b/packages/tosu/src/api/utils/buildResult.ts index a4290488..bd25ef60 100644 --- a/packages/tosu/src/api/utils/buildResult.ts +++ b/packages/tosu/src/api/utils/buildResult.ts @@ -76,7 +76,7 @@ export const buildResult = ( return { settings: { - showInterface: settings.showInterface, + showInterface: allTimesData.ShowInterface, folders: { game: settings.gameFolder, skin: settings.skinFolder, diff --git a/packages/tosu/src/api/utils/buildResultV2.ts b/packages/tosu/src/api/utils/buildResultV2.ts index 5db53ffa..2452feef 100644 --- a/packages/tosu/src/api/utils/buildResultV2.ts +++ b/packages/tosu/src/api/utils/buildResultV2.ts @@ -13,10 +13,12 @@ import { BanchoStatusEnum, BeatmapStatuses, ChatStatus, + GameState, GroupType, Leaderboard, LeaderboardType, Modes, + ProgressBarType, ScoreMeterType, SortType, Tourney, @@ -100,13 +102,16 @@ export const buildResult = ( : allTimesData.MenuMods; return { - state: allTimesData.Status, + state: { + number: allTimesData.Status, + name: GameState[allTimesData.Status] + }, session: { playTime: allTimesData.GameTime, playCount: 0 // need counting }, settings: { - interfaceVisible: settings.showInterface, + interfaceVisible: allTimesData.ShowInterface, replayUIVisible: gamePlayData.isReplayUiHidden == false, chatVisibilityStatus: { number: allTimesData.ChatStatus, @@ -123,7 +128,10 @@ export const buildResult = ( } }, - progressBarType: settings.progressBarType, + progressBar: { + number: settings.progressBarType, + name: ProgressBarType[settings.progressBarType] + }, bassDensity: bassDensityData.density, resolution: settings.resolution, diff --git a/packages/tosu/src/entities/AbstractEntity/index.ts b/packages/tosu/src/entities/AbstractEntity/index.ts index 6cd1365f..3e308d62 100644 --- a/packages/tosu/src/entities/AbstractEntity/index.ts +++ b/packages/tosu/src/entities/AbstractEntity/index.ts @@ -7,7 +7,7 @@ export abstract class AbstractEntity { this.services = services; } - async updateState() { + updateState() { throw Error('Error: updateState not implemented'); } } diff --git a/packages/tosu/src/entities/AllTimesData/index.ts b/packages/tosu/src/entities/AllTimesData/index.ts index e4324b7c..34894de3 100644 --- a/packages/tosu/src/entities/AllTimesData/index.ts +++ b/packages/tosu/src/entities/AllTimesData/index.ts @@ -26,6 +26,245 @@ export class AllTimesData extends AbstractEntity { ShowInterface: boolean = false; IsWatchingReplay: number = 0; + bindingNames = new Map(); + + private configStateErrorAttempts: number = 0; + private bindingStateErrorAttempts: number = 0; + + private configList: Record = { + VolumeUniversal: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.master = value; + } + }, + VolumeEffect: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.effect = value; + } + }, + VolumeMusic: { + type: 'int', + setValue: (settings, value) => { + settings.audio.volume.music = value; + } + }, + _ReleaseStream: { + type: 'enum', + setValue: (settings, value) => { + settings.client.branch = value; + } + }, + DimLevel: { + type: 'int', + setValue: (settings, value) => { + settings.background.dim = value; + } + }, + ShowStoryboard: { + type: 'bool', + setValue: (settings, value) => { + settings.background.storyboard = value; + } + }, + ShowInterface: { + type: 'bool', + setValue: (settings, value) => { + settings.showInterface = value; + } + }, + BeatmapDirectory: { + type: 'bstring', + setValue: (settings, value) => { + settings.BeatmapDirectory = value; + } + }, + ScoreMeter: { + type: 'enum', + setValue: (settings, value) => { + settings.scoreMeter.type = value; + } + }, + ScoreMeterScale: { + type: 'double', + setValue: (settings, value) => { + settings.scoreMeter.size = parseFloat((value || 0).toFixed(2)); + } + }, + Offset: { + type: 'int', + setValue: (settings, value) => { + settings.offset.universal = value; + } + }, + CursorSize: { + type: 'double', + setValue: (settings, value) => { + settings.cursor.size = parseFloat((value || 0).toFixed(2)); + } + }, + MouseSpeed: { + type: 'double', + setValue: (settings, value) => { + settings.mouse.sensitivity = parseFloat( + (value || 0).toFixed(2) + ); + } + }, + Fullscreen: { + type: 'bool', + setValue: (settings, value) => { + settings.resolution.fullscreen = value; + } + }, + Width: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.width = value; + } + }, + Height: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.height = value; + } + }, + WidthFullscreen: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.widthFullscreen = value; + } + }, + HeightFullscreen: { + type: 'int', + setValue: (settings, value) => { + settings.resolution.heightFullscreen = value; + } + }, + AutomaticCursorSizing: { + type: 'bool', + setValue: (settings, value) => { + settings.cursor.autoSize = value; + } + }, + IgnoreBeatmapSamples: { + type: 'bool', + setValue: (settings, value) => { + settings.audio.ignoreBeatmapSounds = value; + } + }, + SkinSamples: { + type: 'bool', + setValue: (settings, value) => { + settings.audio.useSkinSamples = value; + } + }, + LastVersion: { + type: 'bstring', + setValue: (settings, value) => { + settings.client.version = value; + } + }, + ManiaSpeedBPMScale: { + type: 'bool', + setValue: (settings, value) => { + settings.mania.speedBPMScale = value; + } + }, + UsePerBeatmapManiaSpeed: { + type: 'bool', + setValue: (settings, value) => { + settings.mania.usePerBeatmapSpeedScale = value; + } + }, + MouseDisableButtons: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.disableButtons = value; + } + }, + MouseDisableWheel: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.disableWheel = value; + } + }, + ProgressBarType: { + type: 'enum', + setValue: (settings, value) => { + settings.progressBarType = value; + } + }, + RankType: { + type: 'enum', + setValue: (settings, value) => { + settings.leaderboardType = value; + } + }, + UpdatePending: { + type: 'bool', + setValue: (settings, value) => { + settings.client.updateAvailable = value; + } + }, + + UseSkinCursor: { + type: 'bool', + setValue: (settings, value) => { + settings.cursor.useSkinCursor = value; + } + }, + RawInput: { + type: 'bool', + setValue: (settings, value) => { + settings.mouse.rawInput = value; + } + }, + TreeSortMode: { + type: 'enum', + setValue: (settings, value) => { + settings.groupType = value; + } + }, + TreeSortMode2: { + type: 'enum', + setValue: (settings, value) => { + settings.sortType = value; + } + }, + EditorDefaultSkin: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.useDefaultSkinInEditor = value; + } + }, + ComboColourSliderBall: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.tintSliderBall = value; + } + }, + IgnoreBeatmapSkins: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.ignoreBeatmapSkins = value; + } + }, + Skin: { + type: 'bstring', + setValue: (settings, value) => { + settings.skin.name = value; + } + }, + UseTaikoSkin: { + type: 'bool', + setValue: (settings, value) => { + settings.skin.useTaikoSkin = value; + } + } + }; + private bindingList: Record = { [Bindings.OsuLeft]: { setValue: (settings, value: number) => { @@ -88,6 +327,78 @@ export class AllTimesData extends AbstractEntity { super(services); } + updateConfigState( + process: Process, + settings: Settings, + configurationAddr: number + ) { + try { + const rawSharpDictionary = + process.readSharpDictionary(configurationAddr); + for (let i = 0; i < rawSharpDictionary.length; i++) { + const current = rawSharpDictionary[i]; + const keyAddress = process.readInt(current); + let key; + if (this.bindingNames.has(keyAddress)) { + key = this.bindingNames.get(keyAddress); + } else { + key = process.readSharpString(keyAddress); + this.bindingNames.set(keyAddress, key); + } + const bindable = process.readInt(current + 0x4); + + if (!(key in this.configList)) { + continue; + } + let value: any; + + switch (this.configList[key].type) { + case 'byte': + value = process.readByte(bindable + 0xc); + break; + case 'bool': + value = Boolean(process.readByte(bindable + 0xc)); + break; + case 'int': + case 'double': + value = process.readDouble(bindable + 0x4); + break; + case 'string': + value = process.readSharpString( + process.readInt(current + 0x4) + ); + break; + case 'bstring': + value = process.readSharpString( + process.readInt(bindable + 0x4) + ); + break; + case 'enum': + value = process.readInt(bindable + 0xc); + break; + default: + break; + } + + if (value != null) { + this.configList[key].setValue(settings, value); + } + } + + if (this.configStateErrorAttempts != 0) + this.configStateErrorAttempts = 0; + } catch (exc) { + this.configStateErrorAttempts += 1; + + if (this.configStateErrorAttempts > 5) { + wLogger.error( + "ATD(updateConfigState) Can't update config state" + ); + wLogger.debug(exc); + } + } + } + updateBindingState( process: Process, settings: Settings, @@ -106,84 +417,106 @@ export class AllTimesData extends AbstractEntity { bindable.setValue(settings, value); } } + + if (this.bindingStateErrorAttempts != 0) + this.bindingStateErrorAttempts = 0; } catch (exc) { - wLogger.error( - "ATD(updateBindingState) Can't update binding state", - exc - ); + this.bindingStateErrorAttempts += 1; + + if (this.bindingStateErrorAttempts > 5) { + wLogger.error( + "ATD(updateBindingState) Can't update binding state" + ); + wLogger.debug(exc); + } } } - async updateState() { - const { process, patterns, settings } = this.services.getServices([ - 'process', - 'patterns', - 'settings' - ]); - - const { - statusPtr, - playTimeAddr, - menuModsPtr, - chatCheckerAddr, - skinDataAddr, - settingsClassAddr, - configurationAddr, - bindingsAddr, - canRunSlowlyAddr, - gameTimePtr - } = patterns.getPatterns([ - 'statusPtr', - 'playTimeAddr', - 'menuModsPtr', - 'chatCheckerAddr', - 'skinDataAddr', - 'settingsClassAddr', - 'configurationAddr', - 'bindingsAddr', - 'canRunSlowlyAddr', - 'gameTimePtr' - ]); - - const skinOsuAddr = process.readInt(skinDataAddr + 0x7); - if (skinOsuAddr === 0) { - return; - } - const skinOsuBase = process.readInt(skinOsuAddr); - - // [Status - 0x4] - this.Status = process.readPointer(statusPtr); - // [PlayTime + 0x5] - this.PlayTime = process.readInt(process.readInt(playTimeAddr + 0x5)); - this.GameTime = process.readPointer(gameTimePtr); - // [MenuMods + 0x9] - this.MenuMods = process.readPointer(menuModsPtr); - // ChatChecker - 0x20 - this.ChatStatus = process.readByte(chatCheckerAddr - 0x20); - this.SkinFolder = process.readSharpString( - process.readInt(skinOsuBase + 0x44) - ); - this.IsWatchingReplay = process.readByte( - process.readInt(canRunSlowlyAddr + 0x46) - ); - this.SongsFolder = process.readSharpString( - process.readInt( + updateState() { + try { + const { process, patterns, settings } = this.services.getServices([ + 'process', + 'patterns', + 'settings' + ]); + + const { + statusPtr, + playTimeAddr, + menuModsPtr, + chatCheckerAddr, + skinDataAddr, + settingsClassAddr, + configurationAddr, + bindingsAddr, + canRunSlowlyAddr, + gameTimePtr + } = patterns.getPatterns([ + 'statusPtr', + 'playTimeAddr', + 'menuModsPtr', + 'chatCheckerAddr', + 'skinDataAddr', + 'settingsClassAddr', + 'configurationAddr', + 'bindingsAddr', + 'canRunSlowlyAddr', + 'gameTimePtr' + ]); + + const skinOsuAddr = process.readInt(skinDataAddr + 0x7); + if (skinOsuAddr === 0) { + return; + } + const skinOsuBase = process.readInt(skinOsuAddr); + + // [Status - 0x4] + this.Status = process.readPointer(statusPtr); + // [PlayTime + 0x5] + this.PlayTime = process.readInt( + process.readInt(playTimeAddr + 0x5) + ); + this.GameTime = process.readPointer(gameTimePtr); + // [MenuMods + 0x9] + this.MenuMods = process.readPointer(menuModsPtr); + // ChatChecker - 0x20 + this.ChatStatus = process.readByte(chatCheckerAddr - 0x20); + this.SkinFolder = process.readSharpString( + process.readInt(skinOsuBase + 0x44) + ); + this.IsWatchingReplay = process.readByte( + process.readInt(canRunSlowlyAddr + 0x46) + ); + this.SongsFolder = process.readSharpString( process.readInt( - process.readInt(settingsClassAddr + 0x8) + 0xb8 - ) + 0x4 - ) - ); - - // this.updateConfigState( - // process, - // settings, - // process.readPointer(configurationAddr) - // ); - - this.updateBindingState( - process, - settings, - process.readPointer(bindingsAddr) - ); + process.readInt( + process.readInt(settingsClassAddr + 0x8) + 0xb8 + ) + 0x4 + ) + ); + + // [[SettingsClass + 0x8] + 0x4] + 0xC + this.ShowInterface = Boolean( + process.readByte( + process.readInt( + process.readInt(settingsClassAddr + 0x8) + 0x4 + ) + 0xc + ) + ); + + // this.updateConfigState( + // process, + // settings, + // process.readPointer(configurationAddr) + // ); + + // this.updateBindingState( + // process, + // settings, + // process.readPointer(bindingsAddr) + // ); + } catch (exc) { + wLogger.error(`ATD(updateState) ${(exc as any).message}`, exc); + } } } diff --git a/packages/tosu/src/entities/BassDensityData/index.ts b/packages/tosu/src/entities/BassDensityData/index.ts index e579e9e9..c09233d0 100644 --- a/packages/tosu/src/entities/BassDensityData/index.ts +++ b/packages/tosu/src/entities/BassDensityData/index.ts @@ -9,69 +9,84 @@ export class BassDensityData extends AbstractEntity { currentAudioVelocity: number = 0.0; density: number = 0.0; + private updateStateErrorAttempts: number = 0; + constructor(services: DataRepo) { super(services); } - async updateState() { - const { process: osuProcess, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); - if (osuProcess === null) { - throw new Error('Process not found'); - } + updateState() { + try { + const { process: osuProcess, patterns } = this.services.getServices( + ['process', 'patterns'] + ); + if (osuProcess === null) { + throw new Error('Process not found'); + } - const isWin = process.platform === 'win32'; - const leaderStart = isWin ? 0x8 : 0xc; + const isWin = process.platform === 'win32'; + const leaderStart = isWin ? 0x8 : 0xc; - // Ruleset = [[Rulesets - 0xB] + 0x4] - const rulesetAddr = osuProcess.readInt( - osuProcess.readInt(patterns.getPattern('rulesetsAddr') - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('BDD(updateState) rulesetAddr is zero'); - return; - } + // Ruleset = [[Rulesets - 0xB] + 0x4] + const rulesetAddr = osuProcess.readInt( + osuProcess.readInt(patterns.getPattern('rulesetsAddr') - 0xb) + + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('BDD(updateState) rulesetAddr is zero'); + return; + } - // [Ruleset + 0x44] + 0x10 - const audioVelocityBase = osuProcess.readInt( - osuProcess.readInt(rulesetAddr + 0x44) + 0x10 - ); + // [Ruleset + 0x44] + 0x10 + const audioVelocityBase = osuProcess.readInt( + osuProcess.readInt(rulesetAddr + 0x44) + 0x10 + ); - const bassDensityLength = osuProcess.readInt(audioVelocityBase + 0x4); - if (bassDensityLength < 40) { - wLogger.debug( - 'BDD(updateState) bassDensity length less than 40 (basically it have 1024 values)' + const bassDensityLength = osuProcess.readInt( + audioVelocityBase + 0x4 ); - return; - } + if (bassDensityLength < 40) { + wLogger.debug( + 'BDD(updateState) bassDensity length less than 40 (basically it have 1024 values)' + ); + return; + } - let bass = 0.0; - let currentAudioVelocity = this.currentAudioVelocity; - for (let i = 0; i < 40; i++) { - const current = audioVelocityBase + leaderStart + 0x4 * i; + let bass = 0.0; + let currentAudioVelocity = this.currentAudioVelocity; + for (let i = 0; i < 40; i++) { + const current = audioVelocityBase + leaderStart + 0x4 * i; - const value = osuProcess.readFloat(current); - if (value < 0) { + const value = osuProcess.readFloat(current); + if (value < 0) { + this.density = 0.5; + return; + } + bass += (2 * value * (40 - i)) / 40; + } + + if (isNaN(currentAudioVelocity) || isNaN(bass)) { + this.currentAudioVelocity = 0; this.density = 0.5; return; } - bass += (2 * value * (40 - i)) / 40; - } + currentAudioVelocity = Math.max( + currentAudioVelocity, + Math.min(bass * 1.5, 6) + ); + currentAudioVelocity *= 0.95; + + this.currentAudioVelocity = currentAudioVelocity; + this.density = (1 + currentAudioVelocity) * 0.5; - if (isNaN(currentAudioVelocity) || isNaN(bass)) { - this.currentAudioVelocity = 0; - this.density = 0.5; - return; + if (this.updateStateErrorAttempts != 0) + this.updateStateErrorAttempts = 0; + } catch (exc) { + this.updateStateErrorAttempts += 1; + + if (this.updateStateErrorAttempts > 5) { + wLogger.error(`BDD(updateState) ${(exc as any).message}`, exc); + } } - currentAudioVelocity = Math.max( - currentAudioVelocity, - Math.min(bass * 1.5, 6) - ); - currentAudioVelocity *= 0.95; - - this.currentAudioVelocity = currentAudioVelocity; - this.density = (1 + currentAudioVelocity) * 0.5; } } diff --git a/packages/tosu/src/entities/BeatmapPpData/index.ts b/packages/tosu/src/entities/BeatmapPpData/index.ts index 8d7ecc5f..5184e98d 100644 --- a/packages/tosu/src/entities/BeatmapPpData/index.ts +++ b/packages/tosu/src/entities/BeatmapPpData/index.ts @@ -1,5 +1,6 @@ import { Beatmap, Calculator } from '@kotrikd/rosu-pp'; import { config, wLogger } from '@tosu/common'; +import fs from 'fs'; import { Beatmap as ParsedBeatmap } from 'osu-classes'; import { BeatmapDecoder } from 'osu-parsers'; import path from 'path'; @@ -56,6 +57,7 @@ interface BeatmapPPTimings { export class BeatmapPPData extends AbstractEntity { beatmap?: Beatmap; + beatmapContent?: string; strains: number[]; strainsAll: BeatmapStrains; commonBPM: number; @@ -186,7 +188,7 @@ export class BeatmapPPData extends AbstractEntity { return this.beatmap; } - async updateMapMetadata(currentMods: number) { + updateMapMetadata(currentMods: number) { const start_time = performance.now(); const { menuData, settings } = this.services.getServices([ @@ -200,19 +202,22 @@ export class BeatmapPPData extends AbstractEntity { menuData.Folder, menuData.Path ); + try { - this.beatmap = new Beatmap({ - path: mapPath, - ar: menuData.AR, - od: menuData.OD, - cs: menuData.CS, - hp: menuData.HP - }); - } catch (_) { + this.beatmapContent = fs.readFileSync(mapPath, 'utf8'); + } catch (error) { wLogger.debug(`BPPD(updateMapMetadata) Can't get map: ${mapPath}`); return; } + this.beatmap = new Beatmap({ + content: this.beatmapContent, + ar: menuData.AR, + od: menuData.OD, + cs: menuData.CS, + hp: menuData.HP + }); + const beatmap_check_time = performance.now(); wLogger.debug( `BPPD(updateMapMetadata) [${( @@ -252,12 +257,15 @@ export class BeatmapPPData extends AbstractEntity { try { const decoder = new BeatmapDecoder(); - lazerBeatmap = await decoder.decodeFromPath(mapPath, { + lazerBeatmap = decoder.decodeFromString(this.beatmapContent, { + parseEvents: true, + parseTimingPoints: true, + parseColours: false, parseDifficulty: false, parseEditor: false, - parseEvents: true, parseGeneral: false, + parseStoryboard: false, parseMetadata: false }); @@ -285,9 +293,9 @@ export class BeatmapPPData extends AbstractEntity { this.updateTimings(firstObj, full); } catch (exc) { wLogger.error( - "BPPD(updateMapMetadata) Something happend, when we're tried to parse beatmap", - exc + "BPPD(updateMapMetadata) Something happend, when we're tried to parse beatmap" ); + wLogger.debug(exc); return; } @@ -421,4 +429,55 @@ export class BeatmapPPData extends AbstractEntity { hitWindow: (fcPerformance.difficulty as any).hitWindow }); } + + updateEditorPP() { + if (!this.beatmap || !this.beatmapContent) { + return; + } + + const start_time = performance.now(); + + const { allTimesData } = this.services.getServices(['allTimesData']); + + const decoder = new BeatmapDecoder().decodeFromString( + this.beatmapContent, + { + parseHitObjects: true, + + parseColours: false, + parseDifficulty: false, + parseEditor: false, + parseEvents: true, + parseGeneral: false, + parseMetadata: false, + parseStoryboard: false, + parseTimingPoints: false + } + ); + + const beatmap_parse_time = performance.now(); + wLogger.debug( + `(updateEditorPP) Spend:${(beatmap_parse_time - start_time).toFixed( + 2 + )}ms on beatmap parsing` + ); + + const passedObjects = decoder.hitObjects.filter( + (r) => r.startTime <= allTimesData.PlayTime + ); + + const curPerformance = new Calculator({ + passedObjects: passedObjects.length + }).performance(this.beatmap); + + const calculate_time = performance.now(); + + this.currAttributes.pp = curPerformance.pp; + + wLogger.debug( + `(updateEditorPP) Spend:${( + calculate_time - beatmap_parse_time + ).toFixed(2)}ms on calculating performance` + ); + } } diff --git a/packages/tosu/src/entities/GamePlayData/index.ts b/packages/tosu/src/entities/GamePlayData/index.ts index bf3a499f..756a2297 100644 --- a/packages/tosu/src/entities/GamePlayData/index.ts +++ b/packages/tosu/src/entities/GamePlayData/index.ts @@ -107,132 +107,148 @@ export class GamePlayData extends AbstractEntity { this.Leaderboard = undefined; } - async updateState() { - const { process, patterns, allTimesData, menuData } = - this.services.getServices([ - 'process', - 'patterns', - 'allTimesData', - 'menuData' + updateState() { + try { + const { process, patterns, allTimesData, menuData } = + this.services.getServices([ + 'process', + 'patterns', + 'allTimesData', + 'menuData' + ]); + + const { baseAddr, rulesetsAddr } = patterns.getPatterns([ + 'baseAddr', + 'rulesetsAddr' ]); - const { baseAddr, rulesetsAddr } = patterns.getPatterns([ - 'baseAddr', - 'rulesetsAddr' - ]); + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('GD(updateState) RulesetAddr is 0'); + return; + } - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('GD(updateState) RulesetAddr is 0'); - return; - } + const gameplayBase = process.readInt(rulesetAddr + 0x68); + if (gameplayBase === 0) { + wLogger.debug('GD(updateState) gameplayBase is zero'); + return; + } - const gameplayBase = process.readInt(rulesetAddr + 0x68); - if (gameplayBase === 0) { - wLogger.debug('GD(updateState) gameplayBase is zero'); - return; - } + const scoreBase = process.readInt(gameplayBase + 0x38); + if (scoreBase === 0) { + wLogger.debug('GD(updateState) scoreBase is zero'); + return; + } - const scoreBase = process.readInt(gameplayBase + 0x38); - if (scoreBase === 0) { - wLogger.debug('GD(updateState) scoreBase is zero'); - return; - } + let hpBarBase = process.readInt(gameplayBase + 0x40); + if (hpBarBase === 0) { + wLogger.debug('GD(updateState) hpBar is zero'); + return; + } - let hpBarBase = process.readInt(gameplayBase + 0x40); - if (hpBarBase === 0) { - wLogger.debug('GD(updateState) hpBar is zero'); - return; - } + // Resetting default state value, to define other componenets that we have touched gamePlayData + // needed for ex like you done with replay watching/gameplay and return to mainMenu, you need alteast one reset to gamePlayData/resultsScreenData + this.isDefaultState = false; - // Resetting default state value, to define other componenets that we have touched gamePlayData - // needed for ex like you done with replay watching/gameplay and return to mainMenu, you need alteast one reset to gamePlayData/resultsScreenData - this.isDefaultState = false; + if (allTimesData.IsWatchingReplay) { + // rulesetAddr mean ReplayWatcher... Sooo.... + // Ruleset + 0x1d8 + this.isReplayUiHidden = Boolean( + process.readByte(rulesetAddr + 0x1d8) + ); + } else { + this.isReplayUiHidden = false; + } - if (allTimesData.IsWatchingReplay) { - // rulesetAddr mean ReplayWatcher... Sooo.... - // Ruleset + 0x1d8 - this.isReplayUiHidden = Boolean( - process.readByte(rulesetAddr + 0x1d8) + // [Base - 0x33] + 0x8 + this.Retries = process.readInt( + process.readInt(baseAddr - 0x33) + 0x8 + ); + // [[[Ruleset + 0x68] + 0x38] + 0x28] + this.PlayerName = process.readSharpString( + process.readInt(scoreBase + 0x28) + ); + // [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0xC ^ [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0x8 + this.Mods = + process.readInt(process.readInt(scoreBase + 0x1c) + 0xc) ^ + process.readInt(process.readInt(scoreBase + 0x1c) + 0x8); + // [[Ruleset + 0x68] + 0x38] + 0x64 + this.Mode = process.readInt(scoreBase + 0x64); + // [[Ruleset + 0x68] + 0x38] + 0x68 + this.MaxCombo = process.readShort(scoreBase + 0x68); + // [[Ruleset + 0x68] + 0x38] + 0x78 + this.Score = process.readInt(rulesetAddr + 0x100); + // [[Ruleset + 0x68] + 0x38] + 0x88 + this.Hit100 = process.readShort(scoreBase + 0x88); + // [[Ruleset + 0x68] + 0x38] + 0x8A + this.Hit300 = process.readShort(scoreBase + 0x8a); + // [[Ruleset + 0x68] + 0x38] + 0x8C + this.Hit50 = process.readShort(scoreBase + 0x8c); + // [[Ruleset + 0x68] + 0x38] + 0x8E + this.HitGeki = process.readShort(scoreBase + 0x8e); + // [[Ruleset + 0x68] + 0x38] + 0x90 + this.HitKatu = process.readShort(scoreBase + 0x90); + // [[Ruleset + 0x68] + 0x38] + 0x92 + this.HitMiss = process.readShort(scoreBase + 0x92); + // [[Ruleset + 0x68] + 0x38] + 0x94 + this.Combo = process.readShort(scoreBase + 0x94); + // [[Ruleset + 0x68] + 0x40] + 0x14 + this.PlayerHPSmooth = process.readDouble(hpBarBase + 0x14) || 0; + // [[Ruleset + 0x68] + 0x40] + 0x1C + this.PlayerHP = process.readDouble(hpBarBase + 0x1c); + // [[Ruleset + 0x68] + 0x48] + 0xC + this.Accuracy = process.readDouble( + process.readInt(gameplayBase + 0x48) + 0xc ); - } else { - this.isReplayUiHidden = false; - } - // [Base - 0x33] + 0x8 - this.Retries = process.readInt(process.readInt(baseAddr - 0x33) + 0x8); - // [[[Ruleset + 0x68] + 0x38] + 0x28] - this.PlayerName = process.readSharpString( - process.readInt(scoreBase + 0x28) - ); - // [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0xC ^ [[[Ruleset + 0x68] + 0x38] + 0x1C] + 0x8 - this.Mods = - process.readInt(process.readInt(scoreBase + 0x1c) + 0xc) ^ - process.readInt(process.readInt(scoreBase + 0x1c) + 0x8); - // [[Ruleset + 0x68] + 0x38] + 0x64 - this.Mode = process.readInt(scoreBase + 0x64); - // [[Ruleset + 0x68] + 0x38] + 0x68 - this.MaxCombo = process.readShort(scoreBase + 0x68); - // [[Ruleset + 0x68] + 0x38] + 0x78 - this.Score = process.readInt(rulesetAddr + 0x100); - // [[Ruleset + 0x68] + 0x38] + 0x88 - this.Hit100 = process.readShort(scoreBase + 0x88); - // [[Ruleset + 0x68] + 0x38] + 0x8A - this.Hit300 = process.readShort(scoreBase + 0x8a); - // [[Ruleset + 0x68] + 0x38] + 0x8C - this.Hit50 = process.readShort(scoreBase + 0x8c); - // [[Ruleset + 0x68] + 0x38] + 0x8E - this.HitGeki = process.readShort(scoreBase + 0x8e); - // [[Ruleset + 0x68] + 0x38] + 0x90 - this.HitKatu = process.readShort(scoreBase + 0x90); - // [[Ruleset + 0x68] + 0x38] + 0x92 - this.HitMiss = process.readShort(scoreBase + 0x92); - // [[Ruleset + 0x68] + 0x38] + 0x94 - this.Combo = process.readShort(scoreBase + 0x94); - // [[Ruleset + 0x68] + 0x40] + 0x14 - this.PlayerHPSmooth = process.readDouble(hpBarBase + 0x14) || 0; - // [[Ruleset + 0x68] + 0x40] + 0x1C - this.PlayerHP = process.readDouble(hpBarBase + 0x1c); - // [[Ruleset + 0x68] + 0x48] + 0xC - this.Accuracy = process.readDouble( - process.readInt(gameplayBase + 0x48) + 0xc - ); + if (this.MaxCombo > 0) { + const baseUR = this.calculateUR(); + if ((this.Mods & OsuMods.DoubleTime) === OsuMods.DoubleTime) { + this.UnstableRate = baseUR / 1.5; + } else if ( + (this.Mods & OsuMods.HalfTime) === + OsuMods.HalfTime + ) { + this.UnstableRate = baseUR * 1.33; + } else { + this.UnstableRate = baseUR; + } + } - if (this.MaxCombo > 0) { - const baseUR = this.calculateUR(); - if ((this.Mods & OsuMods.DoubleTime) === OsuMods.DoubleTime) { - this.UnstableRate = baseUR / 1.5; - } else if ((this.Mods & OsuMods.HalfTime) === OsuMods.HalfTime) { - this.UnstableRate = baseUR * 1.33; - } else { - this.UnstableRate = baseUR; + if (this.ComboPrev > this.MaxCombo) { + this.ComboPrev = 0; } - } + if ( + this.Combo < this.ComboPrev && + this.HitMiss === this.HitMissPrev + ) { + this.HitSB += 1; + } + this.HitMissPrev = this.HitMiss; + this.ComboPrev = this.Combo; + + // [[[Ruleset + 0x68] + 0x38] + 0x38] + this.HitErrors = this.getHitErrors( + process, + patterns.getLeaderStart(), + scoreBase + ); - if (this.ComboPrev > this.MaxCombo) { - this.ComboPrev = 0; - } - if (this.Combo < this.ComboPrev && this.HitMiss === this.HitMissPrev) { - this.HitSB += 1; + this.updateLeaderboard( + process, + patterns.getLeaderStart(), + rulesetAddr + ); + this.updateGrade(menuData); + this.updateStarsAndPerformance(); + } catch (exc) { + wLogger.error(`GPD(updateState) ${(exc as any).message}`, exc); } - this.HitMissPrev = this.HitMiss; - this.ComboPrev = this.Combo; - - // [[[Ruleset + 0x68] + 0x38] + 0x38] - this.HitErrors = this.getHitErrors( - process, - patterns.getLeaderStart(), - scoreBase - ); - - this.updateLeaderboard(process, patterns.getLeaderStart(), rulesetAddr); - this.updateGrade(menuData); - this.updateStarsAndPerformance(); } - async updateKeyOverlay() { + updateKeyOverlay() { const { process, patterns } = this.services.getServices([ 'process', 'patterns' diff --git a/packages/tosu/src/entities/MenuData/index.ts b/packages/tosu/src/entities/MenuData/index.ts index 6c332b9c..f8e9bd28 100644 --- a/packages/tosu/src/entities/MenuData/index.ts +++ b/packages/tosu/src/entities/MenuData/index.ts @@ -32,113 +32,137 @@ export class MenuData extends AbstractEntity { previousMD5: string = ''; + private mp3ErrorAttempts: number = 0; + constructor(services: DataRepo) { super(services); } - async updateState() { - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); + updateState() { + try { + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); - const baseAddr = patterns.getPattern('baseAddr'); + const baseAddr = patterns.getPattern('baseAddr'); - const beatmapAddr = process.readPointer(baseAddr - 0xc); - if (beatmapAddr === 0) { - wLogger.debug('MD(updateState) beatmapAddr is 0'); - return; - } - // [[Beatmap] + 0x6C] - this.MD5 = process.readSharpString(process.readInt(beatmapAddr + 0x6c)); - // [[Beatmap] + 0x90] - this.Path = process.readSharpString( - process.readInt(beatmapAddr + 0x90) - ); - // [Base - 0x33] - this.MenuGameMode = process.readPointer(baseAddr - 0x33); - - if (this.MD5 === this.previousMD5 || !this.Path.endsWith('.osu')) { - return; - } + const beatmapAddr = process.readPointer(baseAddr - 0xc); + if (beatmapAddr === 0) { + wLogger.debug('MD(updateState) beatmapAddr is 0'); + return; + } + // [[Beatmap] + 0x6C] + this.MD5 = process.readSharpString( + process.readInt(beatmapAddr + 0x6c) + ); + // [[Beatmap] + 0x90] + this.Path = process.readSharpString( + process.readInt(beatmapAddr + 0x90) + ); + // [Base - 0x33] + this.MenuGameMode = process.readPointer(baseAddr - 0x33); + + if (this.MD5 === this.previousMD5 || !this.Path.endsWith('.osu')) { + return; + } + + // [Base - 0x33] + 0xC + this.Plays = process.readInt( + process.readInt(baseAddr - 0x33) + 0xc + ); + // [[Beatmap] + 0x18] + this.Artist = process.readSharpString( + process.readInt(beatmapAddr + 0x18) + ); + // // [[Beatmap] + 0x1C] + this.ArtistOriginal = process.readSharpString( + process.readInt(beatmapAddr + 0x1c) + ); + // // [[Beatmap] + 0x24] + this.Title = process.readSharpString( + process.readInt(beatmapAddr + 0x24) + ); + // // [[Beatmap] + 0x28] + this.TitleOriginal = process.readSharpString( + process.readInt(beatmapAddr + 0x28) + ); + + // [Beatmap] + 0x2C + this.AR = process.readFloat(beatmapAddr + 0x2c); + // [Beatmap] + 0x30 + this.CS = process.readFloat(beatmapAddr + 0x30); + // [Beatmap] + 0x34 + this.HP = process.readFloat(beatmapAddr + 0x34); + // [Beatmap] + 0x38 + this.OD = process.readFloat(beatmapAddr + 0x38); + // [[Beatmap] + 0x64] + this.AudioFilename = process.readSharpString( + process.readInt(beatmapAddr + 0x64) + ); + // // [[Beatmap] + 0x68] + this.BackgroundFilename = process.readSharpString( + process.readInt(beatmapAddr + 0x68) + ); + // this.BackgroundFilename = ""; + // [[Beatmap] + 0x78] + this.Folder = process.readSharpString( + process.readInt(beatmapAddr + 0x78) + ); + // [[Beatmap] + 0x7C] + this.Creator = process.readSharpString( + process.readInt(beatmapAddr + 0x7c) + ); + // [[Beatmap] + 0x80] + this.Name = process.readSharpString( + process.readInt(beatmapAddr + 0x80) + ); + // [[Beatmap] + 0xAC] + this.Difficulty = process.readSharpString( + process.readInt(beatmapAddr + 0xac) + ); + // [Beatmap] + 0xC8 + this.MapID = process.readInt(beatmapAddr + 0xc8); + // [Beatmap] + 0xCC + this.SetID = process.readInt(beatmapAddr + 0xcc); + // unknown, unsubmitted, pending/wip/graveyard, unused, ranked, approved, qualified + // [Beatmap] + 0x12C + this.RankedStatus = process.readInt(beatmapAddr + 0x12c); + // [Beatmap] + 0xF8 + this.ObjectCount = process.readInt(beatmapAddr + 0xf8); - // [Base - 0x33] + 0xC - this.Plays = process.readInt(process.readInt(baseAddr - 0x33) + 0xc); - // [[Beatmap] + 0x18] - this.Artist = process.readSharpString( - process.readInt(beatmapAddr + 0x18) - ); - // // [[Beatmap] + 0x1C] - this.ArtistOriginal = process.readSharpString( - process.readInt(beatmapAddr + 0x1c) - ); - // // [[Beatmap] + 0x24] - this.Title = process.readSharpString( - process.readInt(beatmapAddr + 0x24) - ); - // // [[Beatmap] + 0x28] - this.TitleOriginal = process.readSharpString( - process.readInt(beatmapAddr + 0x28) - ); - - // [Beatmap] + 0x2C - this.AR = process.readFloat(beatmapAddr + 0x2c); - // [Beatmap] + 0x30 - this.CS = process.readFloat(beatmapAddr + 0x30); - // [Beatmap] + 0x34 - this.HP = process.readFloat(beatmapAddr + 0x34); - // [Beatmap] + 0x38 - this.OD = process.readFloat(beatmapAddr + 0x38); - // [[Beatmap] + 0x64] - this.AudioFilename = process.readSharpString( - process.readInt(beatmapAddr + 0x64) - ); - // // [[Beatmap] + 0x68] - this.BackgroundFilename = process.readSharpString( - process.readInt(beatmapAddr + 0x68) - ); - // this.BackgroundFilename = ""; - // [[Beatmap] + 0x78] - this.Folder = process.readSharpString( - process.readInt(beatmapAddr + 0x78) - ); - // [[Beatmap] + 0x7C] - this.Creator = process.readSharpString( - process.readInt(beatmapAddr + 0x7c) - ); - // [[Beatmap] + 0x80] - this.Name = process.readSharpString( - process.readInt(beatmapAddr + 0x80) - ); - // [[Beatmap] + 0xAC] - this.Difficulty = process.readSharpString( - process.readInt(beatmapAddr + 0xac) - ); - // [Beatmap] + 0xC8 - this.MapID = process.readInt(beatmapAddr + 0xc8); - // [Beatmap] + 0xCC - this.SetID = process.readInt(beatmapAddr + 0xcc); - // unknown, unsubmitted, pending/wip/graveyard, unused, ranked, approved, qualified - // [Beatmap] + 0x12C - this.RankedStatus = process.readInt(beatmapAddr + 0x12c); - // [Beatmap] + 0xF8 - this.ObjectCount = process.readInt(beatmapAddr + 0xf8); - - this.previousMD5 = this.MD5; + this.previousMD5 = this.MD5; + } catch (exc) { + wLogger.error(`MB(updateState) ${(exc as any).message}`, exc); + } } updateMP3Length() { - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); - - // [[GetAudioLength + 0x7] + 0x4] - this.MP3Length = Math.round( - process.readDouble( - process.readPointer(patterns.getPattern('getAudioLengthPtr')) + - 0x4 - ) - ); + try { + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); + + // [[GetAudioLength + 0x7] + 0x4] + this.MP3Length = Math.round( + process.readDouble( + process.readPointer( + patterns.getPattern('getAudioLengthPtr') + ) + 0x4 + ) + ); + + this.mp3ErrorAttempts = 0; + } catch (exc) { + this.mp3ErrorAttempts += 1; + + if (this.mp3ErrorAttempts > 5) { + wLogger.error( + `Unable to parse beatmap mp3 length (you can ignore it)` + ); + wLogger.debug(exc); + } + } } } diff --git a/packages/tosu/src/entities/ResultsScreenData/index.ts b/packages/tosu/src/entities/ResultsScreenData/index.ts index ce4a4742..31de09d6 100644 --- a/packages/tosu/src/entities/ResultsScreenData/index.ts +++ b/packages/tosu/src/entities/ResultsScreenData/index.ts @@ -45,80 +45,87 @@ export class ResultsScreenData extends AbstractEntity { this.Date = ''; } - async updateState() { - const { process, patterns, allTimesData } = this.services.getServices([ - 'process', - 'patterns', - 'allTimesData' - ]); - if (process === null) { - throw new Error('Process not found'); - } - if (patterns === null) { - throw new Error('Bases repo not found'); - } - if (allTimesData === null) { - throw new Error('AllTimesData not found'); - } - - const { rulesetsAddr } = patterns.getPatterns(['rulesetsAddr']); + updateState() { + try { + const { process, patterns, allTimesData } = + this.services.getServices([ + 'process', + 'patterns', + 'allTimesData' + ]); + if (process === null) { + throw new Error('Process not found'); + } + if (patterns === null) { + throw new Error('Bases repo not found'); + } + if (allTimesData === null) { + throw new Error('AllTimesData not found'); + } - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('RSD(init) rulesetAddr is zero'); - return; - } + const { rulesetsAddr } = patterns.getPatterns(['rulesetsAddr']); - const resultScreenBase = process.readInt(rulesetAddr + 0x38); - if (resultScreenBase === 0) { - wLogger.debug('RSD(init) resultScreenBase is zero'); - return; - } + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 + ); + if (rulesetAddr === 0) { + wLogger.debug('RSD(init) rulesetAddr is zero'); + return; + } - // PlayerName string `mem:"[[Ruleset + 0x38] + 0x28]"` - this.PlayerName = process.readSharpString( - process.readInt(resultScreenBase + 0x28) - ); - // ModsXor1 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0xC"` ^ ModsXor2 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0x8"` - this.Mods = - process.readInt(process.readInt(resultScreenBase + 0x1c) + 0xc) ^ - process.readInt(process.readInt(resultScreenBase + 0x1c) + 0x8); - // Mode int32 `mem:"[Ruleset + 0x38] + 0x64"` - this.Mode = process.readInt(resultScreenBase + 0x64); - // MaxCombo int16 `mem:"[Ruleset + 0x38] + 0x68"` - this.MaxCombo = process.readShort(resultScreenBase + 0x68); - // Score int32 `mem:"[Ruleset + 0x38] + 0x78"` - this.Score = process.readInt(resultScreenBase + 0x78); - // Hit100 int16 `mem:"[Ruleset + 0x38] + 0x88"` - this.Hit100 = process.readShort(resultScreenBase + 0x88); - // Hit300 int16 `mem:"[Ruleset + 0x38] + 0x8A"` - this.Hit300 = process.readShort(resultScreenBase + 0x8a); - // Hit50 int16 `mem:"[Ruleset + 0x38] + 0x8C"` - this.Hit50 = process.readShort(resultScreenBase + 0x8c); - // HitGeki int16 `mem:"[Ruleset + 0x38] + 0x8E"` - this.HitGeki = process.readShort(resultScreenBase + 0x8e); - // HitKatu int16 `mem:"[Ruleset + 0x38] + 0x90"` - this.HitKatu = process.readShort(resultScreenBase + 0x90); - // HitMiss int16 `mem:"[Ruleset + 0x38] + 0x92"` - this.HitMiss = process.readShort(resultScreenBase + 0x92); - this.Grade = calculateGrade({ - mods: this.Mods, - mode: this.Mode, - hits: { - 300: this.Hit300, - geki: 0, - 100: this.Hit100, - katu: 0, - 50: this.Hit50, - 0: this.HitMiss + const resultScreenBase = process.readInt(rulesetAddr + 0x38); + if (resultScreenBase === 0) { + wLogger.debug('RSD(init) resultScreenBase is zero'); + return; } - }); - this.Date = netDateBinaryToDate( - process.readInt(resultScreenBase + 0xa4), - process.readInt(resultScreenBase + 0xa0) - ).toISOString(); + // PlayerName string `mem:"[[Ruleset + 0x38] + 0x28]"` + this.PlayerName = process.readSharpString( + process.readInt(resultScreenBase + 0x28) + ); + // ModsXor1 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0xC"` ^ ModsXor2 int32 `mem:"[[Ruleset + 0x38] + 0x1C] + 0x8"` + this.Mods = + process.readInt( + process.readInt(resultScreenBase + 0x1c) + 0xc + ) ^ + process.readInt(process.readInt(resultScreenBase + 0x1c) + 0x8); + // Mode int32 `mem:"[Ruleset + 0x38] + 0x64"` + this.Mode = process.readInt(resultScreenBase + 0x64); + // MaxCombo int16 `mem:"[Ruleset + 0x38] + 0x68"` + this.MaxCombo = process.readShort(resultScreenBase + 0x68); + // Score int32 `mem:"[Ruleset + 0x38] + 0x78"` + this.Score = process.readInt(resultScreenBase + 0x78); + // Hit100 int16 `mem:"[Ruleset + 0x38] + 0x88"` + this.Hit100 = process.readShort(resultScreenBase + 0x88); + // Hit300 int16 `mem:"[Ruleset + 0x38] + 0x8A"` + this.Hit300 = process.readShort(resultScreenBase + 0x8a); + // Hit50 int16 `mem:"[Ruleset + 0x38] + 0x8C"` + this.Hit50 = process.readShort(resultScreenBase + 0x8c); + // HitGeki int16 `mem:"[Ruleset + 0x38] + 0x8E"` + this.HitGeki = process.readShort(resultScreenBase + 0x8e); + // HitKatu int16 `mem:"[Ruleset + 0x38] + 0x90"` + this.HitKatu = process.readShort(resultScreenBase + 0x90); + // HitMiss int16 `mem:"[Ruleset + 0x38] + 0x92"` + this.HitMiss = process.readShort(resultScreenBase + 0x92); + this.Grade = calculateGrade({ + mods: this.Mods, + mode: this.Mode, + hits: { + 300: this.Hit300, + geki: 0, + 100: this.Hit100, + katu: 0, + 50: this.Hit50, + 0: this.HitMiss + } + }); + + this.Date = netDateBinaryToDate( + process.readInt(resultScreenBase + 0xa4), + process.readInt(resultScreenBase + 0xa0) + ).toISOString(); + } catch (exc) { + wLogger.error(`RSD(updateState) ${(exc as any).message}`, exc); + } } } diff --git a/packages/tosu/src/entities/Settings/index.ts b/packages/tosu/src/entities/Settings/index.ts index 7a6b5379..44231df9 100644 --- a/packages/tosu/src/entities/Settings/index.ts +++ b/packages/tosu/src/entities/Settings/index.ts @@ -145,7 +145,7 @@ export class Settings { sortType: number = 0; leaderboardType: number = 0; - progressBarType: boolean = false; + progressBarType: number = 0; showInterface: boolean = false; gameFolder: string = ''; diff --git a/packages/tosu/src/entities/TourneyManagerData/index.ts b/packages/tosu/src/entities/TourneyManagerData/index.ts index 4e2ae2fb..dc6ca8de 100644 --- a/packages/tosu/src/entities/TourneyManagerData/index.ts +++ b/packages/tosu/src/entities/TourneyManagerData/index.ts @@ -29,128 +29,133 @@ export class TourneyManagerData extends AbstractEntity { } async updateState() { - wLogger.debug(`TMD(updateState) Starting`); + try { + wLogger.debug(`TMD(updateState) Starting`); - const { process, patterns } = this.services.getServices([ - 'process', - 'patterns' - ]); + const { process, patterns } = this.services.getServices([ + 'process', + 'patterns' + ]); - const rulesetsAddr = patterns.getPattern('rulesetsAddr'); + const rulesetsAddr = patterns.getPattern('rulesetsAddr'); - const rulesetAddr = process.readInt( - process.readInt(rulesetsAddr - 0xb) + 0x4 - ); - if (rulesetAddr === 0) { - wLogger.debug('TMD(updateState) RulesetAddr is 0'); - return; - } - - if (this.ChatAreaAddr === 0) { - this.ChatAreaAddr = await process.scanAsync( - TOURNAMENT_CHAT_ENGINE, - true + const rulesetAddr = process.readInt( + process.readInt(rulesetsAddr - 0xb) + 0x4 ); - wLogger.debug('TMD(updateState) Chat area found'); - return; - } + if (rulesetAddr === 0) { + wLogger.debug('TMD(updateState) RulesetAddr is 0'); + return; + } - const teamLeftBase = process.readInt(rulesetAddr + 0x1c); - const teamRightBase = process.readInt(rulesetAddr + 0x20); - - // IPCState int32 `mem:"Ruleset + 0x54"` - this.IPCState = process.readInt(rulesetAddr + 0x54); - // LeftStars int32 `mem:"[Ruleset + 0x1C] + 0x2C"` - this.LeftStars = process.readInt(teamLeftBase + 0x2c); - // RightStars int32 `mem:"[Ruleset + 0x20] + 0x2C"` - this.RightStars = process.readInt(teamRightBase + 0x2c); - // BO int32 `mem:"[Ruleset + 0x20] + 0x30"` - this.BestOf = process.readInt(teamRightBase + 0x30); - // StarsVisible int8 `mem:"[Ruleset + 0x20] + 0x38"` - this.StarsVisible = Boolean(process.readByte(teamRightBase + 0x38)); - // ScoreVisible int8 `mem:"[Ruleset + 0x20] + 0x39"` - this.ScoreVisible = Boolean(process.readByte(teamRightBase + 0x39)); - // TeamOneName string `mem:"[[[Ruleset + 0x1C] + 0x20] + 0x144]"` - this.FirstTeamName = process.readSharpString( - process.readInt(process.readInt(teamLeftBase + 0x20) + 0x144) - ); - // TeamTwoName string `mem:"[[[Ruleset + 0x20] + 0x20] + 0x144]"` - this.SecondTeamName = process.readSharpString( - process.readInt(process.readInt(teamRightBase + 0x20) + 0x144) - ); - // TeamOneScore int32 `mem:"[Ruleset + 0x1C] + 0x28"` - this.FirstTeamScore = process.readInt(teamLeftBase + 0x28); - // TeamTwoScore int32 `mem:"[Ruleset + 0x20] + 0x28"` - this.SecondTeamScore = process.readInt(teamRightBase + 0x28); - // IPCBaseAddr uint32 `mem:"[[Ruleset + 0x34] + 0x4] + 0x4"` - this.IPCBaseAddr = process.readInt( - process.readInt(process.readInt(rulesetAddr + 0x34) + 0x4) + 0x4 - ); - - const channelsList = process.readPointer(this.ChatAreaAddr + 0x15); - const channelsItems = process.readInt(channelsList + 0x4); - - const channelsLength = process.readInt(channelsItems + 0x4); - // Reversing array is needed for make more fast search, - // because osu creates 40 channels with language topics, lobby, osu, etc... (bancho announces this to you) - // and 41 is commonly for multiplayer in tourney client - for (let i = channelsLength - 1; i >= 0; i--) { - const current = channelsItems + patterns.getLeaderStart() + 0x4 * i; - - const channelAddr = process.readInt(current); - if (channelAddr === 0) { - continue; + if (this.ChatAreaAddr === 0) { + this.ChatAreaAddr = await process.scanAsync( + TOURNAMENT_CHAT_ENGINE, + true + ); + wLogger.debug('TMD(updateState) Chat area found'); + return; } - const chatTag = process.readSharpString( - process.readInt(channelAddr + 0x4) + const teamLeftBase = process.readInt(rulesetAddr + 0x1c); + const teamRightBase = process.readInt(rulesetAddr + 0x20); + + // IPCState int32 `mem:"Ruleset + 0x54"` + this.IPCState = process.readInt(rulesetAddr + 0x54); + // LeftStars int32 `mem:"[Ruleset + 0x1C] + 0x2C"` + this.LeftStars = process.readInt(teamLeftBase + 0x2c); + // RightStars int32 `mem:"[Ruleset + 0x20] + 0x2C"` + this.RightStars = process.readInt(teamRightBase + 0x2c); + // BO int32 `mem:"[Ruleset + 0x20] + 0x30"` + this.BestOf = process.readInt(teamRightBase + 0x30); + // StarsVisible int8 `mem:"[Ruleset + 0x20] + 0x38"` + this.StarsVisible = Boolean(process.readByte(teamRightBase + 0x38)); + // ScoreVisible int8 `mem:"[Ruleset + 0x20] + 0x39"` + this.ScoreVisible = Boolean(process.readByte(teamRightBase + 0x39)); + // TeamOneName string `mem:"[[[Ruleset + 0x1C] + 0x20] + 0x144]"` + this.FirstTeamName = process.readSharpString( + process.readInt(process.readInt(teamLeftBase + 0x20) + 0x144) + ); + // TeamTwoName string `mem:"[[[Ruleset + 0x20] + 0x20] + 0x144]"` + this.SecondTeamName = process.readSharpString( + process.readInt(process.readInt(teamRightBase + 0x20) + 0x144) + ); + // TeamOneScore int32 `mem:"[Ruleset + 0x1C] + 0x28"` + this.FirstTeamScore = process.readInt(teamLeftBase + 0x28); + // TeamTwoScore int32 `mem:"[Ruleset + 0x20] + 0x28"` + this.SecondTeamScore = process.readInt(teamRightBase + 0x28); + // IPCBaseAddr uint32 `mem:"[[Ruleset + 0x34] + 0x4] + 0x4"` + this.IPCBaseAddr = process.readInt( + process.readInt(process.readInt(rulesetAddr + 0x34) + 0x4) + 0x4 ); - if (chatTag !== '#multiplayer') { - continue; - } - const result: ITourneyManagetChatItem[] = []; + const channelsList = process.readPointer(this.ChatAreaAddr + 0x15); + const channelsItems = process.readInt(channelsList + 0x4); - const messagesAddr = process.readInt(channelAddr + 0x10); + const channelsLength = process.readInt(channelsItems + 0x4); + // Reversing array is needed for make more fast search, + // because osu creates 40 channels with language topics, lobby, osu, etc... (bancho announces this to you) + // and 41 is commonly for multiplayer in tourney client + for (let i = channelsLength - 1; i >= 0; i--) { + const current = + channelsItems + patterns.getLeaderStart() + 0x4 * i; - const messagesItems = process.readInt(messagesAddr + 0x4); - const messagesSize = process.readInt(messagesAddr + 0xc); + const channelAddr = process.readInt(current); + if (channelAddr === 0) { + continue; + } - if (this.Messages.length === messagesSize) { - // Not needed an update - continue; - } + const chatTag = process.readSharpString( + process.readInt(channelAddr + 0x4) + ); + if (chatTag !== '#multiplayer') { + continue; + } - for (let i = 0; i < messagesSize; i++) { - const current = - messagesItems + patterns.getLeaderStart() + 0x4 * i; - const currentItem = process.readInt(current); + const result: ITourneyManagetChatItem[] = []; - // [Base + 0x4] - const content = process.readSharpString( - process.readInt(currentItem + 0x4) - ); - // NOTE: Check for empty, and !mp commands - if (content === '' || content.startsWith('!mp')) { + const messagesAddr = process.readInt(channelAddr + 0x10); + + const messagesItems = process.readInt(messagesAddr + 0x4); + const messagesSize = process.readInt(messagesAddr + 0xc); + + if (this.Messages.length === messagesSize) { + // Not needed an update continue; } - // [Base + 0x8] - const timeName = process.readSharpString( - process.readInt(currentItem + 0x8) - ); - const [time, name] = timeName.split(' '); - result.push({ - time: time.trim(), - name: name.substring(0, name.length - 1), - content - }); + for (let i = 0; i < messagesSize; i++) { + const current = + messagesItems + patterns.getLeaderStart() + 0x4 * i; + const currentItem = process.readInt(current); + + // [Base + 0x4] + const content = process.readSharpString( + process.readInt(currentItem + 0x4) + ); + // NOTE: Check for empty, and !mp commands + if (content === '' || content.startsWith('!mp')) { + continue; + } + // [Base + 0x8] + const timeName = process.readSharpString( + process.readInt(currentItem + 0x8) + ); + const [time, name] = timeName.split(' '); + + result.push({ + time: time.trim(), + name: name.substring(0, name.length - 1), + content + }); + } + + this.Messages = result; + wLogger.debug('TMD(updateState) Chat Updated'); } - this.Messages = result; - wLogger.debug('TMD(updateState) Chat Updated'); + wLogger.debug(`TMD(updateState) updated`); + } catch (exc) { + wLogger.error(`TMD(updateState) ${(exc as any).message}`, exc); } - - wLogger.debug(`TMD(updateState) updated`); } } diff --git a/packages/tosu/src/entities/TourneyUserProfileData/index.ts b/packages/tosu/src/entities/TourneyUserProfileData/index.ts index 5c7bd62d..71ff366f 100644 --- a/packages/tosu/src/entities/TourneyUserProfileData/index.ts +++ b/packages/tosu/src/entities/TourneyUserProfileData/index.ts @@ -18,7 +18,7 @@ export class TourneyUserProfileData extends AbstractEntity { super(services); } - async updateState() { + updateState() { wLogger.debug(`TUPD(updateState) Starting`); const { process, patterns } = this.services.getServices([ @@ -56,7 +56,8 @@ export class TourneyUserProfileData extends AbstractEntity { // UserDrawable + 0x70 this.UserID = process.readInt(spectatingUserDrawable + 0x70); } catch (exc) { - wLogger.error('TUPD(updateState) signature failed', exc); + wLogger.error('TUPD(updateState) signature failed'); + wLogger.debug(exc); } wLogger.debug(`TUPD(updateState) updated`); diff --git a/packages/tosu/src/entities/UserProfile/index.ts b/packages/tosu/src/entities/UserProfile/index.ts index f4c4dad5..850b670f 100644 --- a/packages/tosu/src/entities/UserProfile/index.ts +++ b/packages/tosu/src/entities/UserProfile/index.ts @@ -1,3 +1,5 @@ +import { wLogger } from '@tosu/common'; + import { AbstractEntity } from '../AbstractEntity'; import { DataRepo } from '../DataRepoList'; @@ -20,34 +22,38 @@ export class UserProfile extends AbstractEntity { super(services); } - async updateState() { - const { patterns, process } = this.services.getServices([ - 'patterns', - 'process' - ]); + updateState() { + try { + const { patterns, process } = this.services.getServices([ + 'patterns', + 'process' + ]); - const profileBase = process.readPointer( - patterns.getPattern('userProfilePtr') - ); + const profileBase = process.readPointer( + patterns.getPattern('userProfilePtr') + ); - this.rawLoginStatus = process.readPointer( - patterns.getPattern('rawLoginStatusPtr') - ); - this.rawBanchoStatus = process.readByte(profileBase + 0x88); + this.rawLoginStatus = process.readPointer( + patterns.getPattern('rawLoginStatusPtr') + ); + this.rawBanchoStatus = process.readByte(profileBase + 0x88); - this.name = process.readSharpString( - process.readInt(profileBase + 0x30) - ); - this.accuracy = process.readDouble(profileBase + 0x4); - this.rankedScore = process.readLong(profileBase + 0xc); - this.id = process.readInt(profileBase + 0x70); - this.level = process.readFloat(profileBase + 0x74); - this.playCount = process.readInt(profileBase + 0x7c); - this.playMode = process.readInt(profileBase + 0x80); - this.rank = process.readInt(profileBase + 0x84); - this.countryCode = process.readInt(profileBase + 0x98); - this.performancePoints = process.readShort(profileBase + 0x9c); - // ARGB, to convert use UserProfile.backgroundColour.toString(16) - this.backgroundColour = process.readUInt(profileBase + 0xac); + this.name = process.readSharpString( + process.readInt(profileBase + 0x30) + ); + this.accuracy = process.readDouble(profileBase + 0x4); + this.rankedScore = process.readLong(profileBase + 0xc); + this.id = process.readInt(profileBase + 0x70); + this.level = process.readFloat(profileBase + 0x74); + this.playCount = process.readInt(profileBase + 0x7c); + this.playMode = process.readInt(profileBase + 0x80); + this.rank = process.readInt(profileBase + 0x84); + this.countryCode = process.readInt(profileBase + 0x98); + this.performancePoints = process.readShort(profileBase + 0x9c); + // ARGB, to convert use UserProfile.backgroundColour.toString(16) + this.backgroundColour = process.readUInt(profileBase + 0xac); + } catch (exc) { + wLogger.error(`UP(updateState) ${(exc as any).message}`, exc); + } } } diff --git a/packages/tosu/src/index.ts b/packages/tosu/src/index.ts index 7d256a4a..cbac6a11 100644 --- a/packages/tosu/src/index.ts +++ b/packages/tosu/src/index.ts @@ -10,18 +10,17 @@ import { InstanceManager } from './objects/instanceManager/instanceManager'; const instanceManager = new InstanceManager(); const httpServer = new Server({ instanceManager }); - watchConfigFile({ httpServer }); - const { update } = argumetsParser(process.argv); - if ( process.env.NODE_ENV != 'development' && ((update != null && update == true) || update == null) ) await autoUpdater(); + watchConfigFile({ httpServer }); + wLogger.info('Searching for osu!'); - instanceManager.runWatcher(); httpServer.start(); + instanceManager.runWatcher(); })(); diff --git a/packages/tosu/src/objects/instanceManager/instanceManager.ts b/packages/tosu/src/objects/instanceManager/instanceManager.ts index ccd2cbd9..cc7f18a6 100644 --- a/packages/tosu/src/objects/instanceManager/instanceManager.ts +++ b/packages/tosu/src/objects/instanceManager/instanceManager.ts @@ -10,6 +10,8 @@ export class InstanceManager { constructor() { this.osuInstances = {}; + + this.runWatcher = this.runWatcher.bind(this); } private onProcessDestroy(pid: number) { @@ -52,15 +54,14 @@ export class InstanceManager { osuInstance.start(); } } catch (error) { - wLogger.error(error); + wLogger.error('InstanceManager', (error as any).message); + wLogger.debug(error); } } - async runWatcher() { - while (true) { - this.handleProcesses(); + runWatcher() { + this.handleProcesses(); - await sleep(5000); - } + setTimeout(this.runWatcher, 5000); } } diff --git a/packages/tosu/src/objects/instanceManager/osuInstance.ts b/packages/tosu/src/objects/instanceManager/osuInstance.ts index 0b654fb6..9bb5e21f 100644 --- a/packages/tosu/src/objects/instanceManager/osuInstance.ts +++ b/packages/tosu/src/objects/instanceManager/osuInstance.ts @@ -1,4 +1,4 @@ -import { config, sleep, wLogger } from '@tosu/common'; +import { config, sleep, updateProgressBar, wLogger } from '@tosu/common'; import { injectGameOverlay } from '@tosu/game-overlay'; import EventEmitter from 'events'; import fs from 'fs'; @@ -105,6 +105,9 @@ export class OsuInstance { ipcId: number = 0; + previousState: string = ''; + previousTime: number = 0; + emitter: EventEmitter; constructor(pid: number) { @@ -140,6 +143,10 @@ export class OsuInstance { new TourneyManagerData(this.entities) ); this.entities.set('userProfile', new UserProfile(this.entities)); + + this.watchProcessHealth = this.watchProcessHealth.bind(this); + this.updateMapMetadata = this.updateMapMetadata.bind(this); + this.updateKeyOverlay = this.updateKeyOverlay.bind(this); } setTourneyIpcId(ipcId: number) { @@ -150,10 +157,8 @@ export class OsuInstance { this.isTourneySpectator = newVal; } - async start() { - wLogger.info( - `Running memory chimera... RESOLVING PATTERNS FOR ${this.pid}` - ); + start() { + wLogger.info(`[${this.pid}] Running memory chimera..`); while (!this.isReady) { const patternsRepo = this.entities.get('patterns'); if (!patternsRepo) { @@ -163,12 +168,23 @@ export class OsuInstance { } try { + const total = Object.keys(SCAN_PATTERNS).length; + let completed = 0; for (const baseKey in SCAN_PATTERNS) { + const s1 = performance.now(); const patternValue = this.process.scanSync( SCAN_PATTERNS[baseKey].pattern, true ); + completed += 1; if (patternValue === 0) { + updateProgressBar( + `[${this.pid}] Scanning`, + completed / total, + `${(performance.now() - s1).toFixed( + 2 + )}ms ${baseKey}` + ); continue; } @@ -176,22 +192,27 @@ export class OsuInstance { baseKey as never, patternValue + (SCAN_PATTERNS[baseKey].offset || 0) ); + + updateProgressBar( + `[${this.pid}] Scanning`, + completed / total, + `${(performance.now() - s1).toFixed(2)}ms ${baseKey}` + ); } if (!patternsRepo.checkIsBasesValid()) { - wLogger.info('PATTERN RESOLVING FAILED, TRYING AGAIN....'); throw new Error('Memory resolve failed'); } wLogger.info( - 'ALL PATTERNS ARE RESOLVED, STARTING WATCHING THE DATA' + `[${this.pid}] ALL PATTERNS ARE RESOLVED, STARTING WATCHING THE DATA` ); this.isReady = true; } catch (exc) { wLogger.error( - 'PATTERN SCANNING FAILED, TRYING ONE MORE TIME...', - exc + `[${this.pid}] PATTERN SCANNING FAILED, TRYING ONE MORE TIME...` ); + wLogger.debug(exc); this.emitter.emit('onResolveFailed', this.pid); return; } @@ -201,17 +222,21 @@ export class OsuInstance { * ENABLING GOSU OVERLAY */ if (config.enableGosuOverlay) { - await injectGameOverlay(this.process); + this.injectGameOverlay(); } this.update(); if (config.enableKeyOverlay) { - this.updateKeyOverlay(); + this.initKeyOverlay(); } - this.updateMapMetadata(); + this.initMapMetadata(); this.watchProcessHealth(); } + async injectGameOverlay() { + await injectGameOverlay(this.process); + } + async update() { wLogger.debug('OI(update) starting'); @@ -239,13 +264,10 @@ export class OsuInstance { 'userProfile' ]); - let prevTime = 0; while (!this.isDestroyed) { try { - await Promise.all([ - allTimesData.updateState(), - menuData.updateState() - ]); + allTimesData.updateState(); + menuData.updateState(); // osu! calculates audioTrack length a little bit after updating menuData, sooo.. lets this thing run regardless of menuData updating if (menuData.Folder != '' && menuData.Folder != null) @@ -272,8 +294,19 @@ export class OsuInstance { switch (allTimesData.Status) { case 0: - await bassDensityData.updateState(); + bassDensityData.updateState(); break; + + // skip editor, to prevent constant data reset + case 1: + if (this.previousTime == allTimesData.PlayTime) break; + + this.previousTime = allTimesData.PlayTime; + beatmapPpData.updateEditorPP(); + break; + + // EditorSongSElect and SongSelect + case 4: case 5: // Reset Gameplay/ResultScreen data on joining to songSelect if (!gamePlayData.isDefaultState) { @@ -282,34 +315,38 @@ export class OsuInstance { beatmapPpData.resetCurrentAttributes(); } break; + case 2: // Reset gameplay data on retry - if (prevTime > allTimesData.PlayTime) { + if (this.previousTime > allTimesData.PlayTime) { gamePlayData.init(true); beatmapPpData.resetCurrentAttributes(); } - prevTime = allTimesData.PlayTime; + this.previousTime = allTimesData.PlayTime; if ( - allTimesData.PlayTime < 150 && + allTimesData.PlayTime < 0 && !gamePlayData.isDefaultState ) { gamePlayData.init(true); break; } - await gamePlayData.updateState(); + gamePlayData.updateState(); break; + case 7: - await resultsScreenData.updateState(); + resultsScreenData.updateState(); break; + case 22: if (!this.isTourneyManager) { this.isTourneyManager = true; } await tourneyManagerData.updateState(); break; + default: gamePlayData.init(); resultsScreenData.init(); @@ -317,19 +354,20 @@ export class OsuInstance { } if (this.isTourneySpectator) { - await tourneyUserProfileData.updateState(); + tourneyUserProfileData.updateState(); } - await userProfile.updateState(); + userProfile.updateState(); } catch (exc) { wLogger.error('error happend while another loop executed', exc); + wLogger.debug(exc); } await sleep(config.pollRate); } } - async updateKeyOverlay() { + initKeyOverlay() { wLogger.debug(`OI(updateKeyOverlay) starting`); const { allTimesData, gamePlayData } = this.entities.getServices([ @@ -337,91 +375,105 @@ export class OsuInstance { 'gamePlayData' ]); - while (!this.isDestroyed) { - try { - switch (allTimesData.Status) { - case 2: - if (allTimesData.PlayTime < 150) { - break; - } + this.updateKeyOverlay(allTimesData, gamePlayData); + } + + updateKeyOverlay(allTimesData: AllTimesData, gamePlayData: GamePlayData) { + if (this.isDestroyed == true) return; - await gamePlayData.updateKeyOverlay(); - // await + try { + switch (allTimesData.Status) { + case 2: + if (allTimesData.PlayTime < 150) { break; - default: - // no-default - } + } - await sleep(config.keyOverlayPollRate); - } catch (exc) { - wLogger.error( - 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse', - exc - ); + gamePlayData.updateKeyOverlay(); + break; + default: + // no-default } + } catch (exc) { + wLogger.error( + 'OI(updateKeyOverlay) error happend while keyboard overlay attempted to parse' + ); + wLogger.debug(exc); } + + setTimeout(() => { + this.updateKeyOverlay(allTimesData, gamePlayData); + }, config.keyOverlayPollRate); } - async updateMapMetadata() { + initMapMetadata() { wLogger.debug(`OI(updateMapMetadata) Starting`); - let previousState = ''; - - while (true) { - const { - menuData, - allTimesData, - settings, - gamePlayData, - beatmapPpData - } = this.entities.getServices([ - 'menuData', - 'allTimesData', - 'settings', - 'gamePlayData', - 'beatmapPpData' - ]); - - const currentMods = - allTimesData.Status === 2 || allTimesData.Status === 7 - ? gamePlayData.Mods - : allTimesData.MenuMods; - - const currentTimeMD5 = `${menuData.MD5}:${menuData.MenuGameMode}:${currentMods}:${menuData.MP3Length}`; - - if ( - menuData.Path?.endsWith('.osu') && - settings.gameFolder && - previousState !== currentTimeMD5 - ) { - previousState = currentTimeMD5; - - try { - await beatmapPpData.updateMapMetadata(currentMods); - } catch (exc) { - wLogger.error( - "OI(updateMapMetadata) Can't update beatmap metadata", - exc - ); - } - } + const entities = this.entities.getServices([ + 'menuData', + 'allTimesData', + 'settings', + 'gamePlayData', + 'beatmapPpData' + ]); - await sleep(config.pollRate); - } + this.updateMapMetadata(entities); } - async watchProcessHealth() { - while (!this.isDestroyed) { - if (!Process.isProcessExist(this.process.handle)) { - this.isDestroyed = true; - wLogger.info( - `OI(watchProcessHealth) osu!.exe at ${this.pid} got destroyed` + updateMapMetadata(entries: { + menuData: MenuData; + allTimesData: AllTimesData; + settings: Settings; + gamePlayData: GamePlayData; + beatmapPpData: BeatmapPPData; + }) { + const { + menuData, + allTimesData, + settings, + gamePlayData, + beatmapPpData + } = entries; + const currentMods = + allTimesData.Status === 2 || allTimesData.Status === 7 + ? gamePlayData.Mods + : allTimesData.MenuMods; + + const currentState = `${menuData.MD5}:${menuData.MenuGameMode}:${currentMods}:${menuData.MP3Length}`; + + if ( + menuData.Path?.endsWith('.osu') && + settings.gameFolder && + this.previousState !== currentState + ) { + this.previousState = currentState; + + try { + beatmapPpData.updateMapMetadata(currentMods); + } catch (exc) { + wLogger.error( + "OI(updateMapMetadata) Can't update beatmap metadata" ); - this.emitter.emit('onDestroy', this.pid); + wLogger.debug(exc); } + } - await sleep(config.pollRate); + setTimeout(() => { + this.updateMapMetadata(entries); + }, config.pollRate); + } + + watchProcessHealth() { + if (this.isDestroyed == true) return; + + if (!Process.isProcessExist(this.process.handle)) { + this.isDestroyed = true; + wLogger.info( + `OI(watchProcessHealth) osu!.exe at ${this.pid} got destroyed` + ); + this.emitter.emit('onDestroy', this.pid); } + + setTimeout(this.watchProcessHealth, config.pollRate); } getState(instanceManager: InstanceManager) { diff --git a/packages/updater/index.ts b/packages/updater/index.ts index e1fbf14a..df54a7db 100644 --- a/packages/updater/index.ts +++ b/packages/updater/index.ts @@ -59,11 +59,13 @@ export const autoUpdater = () => if (versionName.includes(currentVersion)) { wLogger.info(`You're using latest version [${currentVersion}] `); - if (fs.existsSync(fileDestination)) + if (fs.existsSync(fileDestination)) { await deleteNotLocked(fileDestination); - await sleep(5 * 1000); - if (fs.existsSync(backupExecutablePath)) + } + + if (fs.existsSync(backupExecutablePath)) { await deleteNotLocked(backupExecutablePath); + } resolve('exact'); return; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dda8d9c..9a15a4f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,23 +7,13 @@ settings: importers: .: - dependencies: - '@types/node': - specifier: ^18.14.6 - version: 18.18.11 - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^4.1.1 version: 4.3.0(prettier@2.8.8) + '@types/node': + specifier: ^18.18.11 + version: 18.18.11 husky: specifier: ^8.0.3 version: 8.0.3 @@ -33,6 +23,15 @@ importers: prettier: specifier: ^2.8.5 version: 2.8.8 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 packages/common: dependencies: @@ -48,9 +47,6 @@ importers: '@tosu/common': specifier: workspace:* version: link:../common - decompress: - specifier: ^4.2.1 - version: 4.2.1 tsprocess: specifier: workspace:* version: link:../tsprocess @@ -155,6 +151,7 @@ packages: dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 + dev: true /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} @@ -219,6 +216,7 @@ packages: /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -227,6 +225,7 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + dev: true /@babel/parser@7.18.4: resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} @@ -307,7 +306,7 @@ packages: /@hutson/parse-repository-url@3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - dev: false + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -451,16 +450,17 @@ packages: /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: false + dev: true /@types/node@18.18.11: resolution: {integrity: sha512-c1vku6qnTeujJneYH94/4aq73XrVcsJe35UPyAsSok1ijiKrkRzK+AxQPSpNMUnC03roWBBwJx/9I8V7lQoxmA==} dependencies: undici-types: 5.26.5 + dev: true /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: false + dev: true /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} @@ -479,7 +479,7 @@ packages: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: false + dev: true /abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -499,7 +499,7 @@ packages: /add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: false + dev: true /adm-zip@0.5.10: resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} @@ -552,6 +552,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -569,7 +570,7 @@ packages: /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: false + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -579,7 +580,7 @@ packages: /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -588,17 +589,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: false + dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -613,7 +607,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: false + dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -628,34 +622,16 @@ packages: fill-range: 7.0.1 dev: true - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: false - - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: false - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false - - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: false - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: true /cacache@18.0.2: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} @@ -682,12 +658,12 @@ packages: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: false + dev: true /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: false + dev: true /cargo-cp-artifact@0.1.8: resolution: {integrity: sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==} @@ -701,6 +677,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -750,11 +727,13 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -764,6 +743,7 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -777,10 +757,6 @@ packages: engines: {node: '>=16'} dev: true - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -791,11 +767,11 @@ packages: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: false + dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false + dev: true /concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} @@ -805,7 +781,7 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: false + dev: true /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} @@ -813,25 +789,25 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: false + dev: true /conventional-changelog-atom@2.0.8: resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-codemirror@2.0.8: resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-config-spec@2.1.0: resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: false + dev: true /conventional-changelog-conventionalcommits@4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} @@ -840,7 +816,7 @@ packages: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: false + dev: true /conventional-changelog-core@4.2.4: resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} @@ -860,35 +836,35 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: false + dev: true /conventional-changelog-ember@2.0.9: resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-eslint@3.0.9: resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-express@2.0.6: resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-jquery@3.0.11: resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: false + dev: true /conventional-changelog-jshint@2.0.9: resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} @@ -896,12 +872,12 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: false + dev: true /conventional-changelog-preset-loader@2.3.4: resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} engines: {node: '>=10'} - dev: false + dev: true /conventional-changelog-writer@5.0.1: resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} @@ -917,7 +893,7 @@ packages: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 - dev: false + dev: true /conventional-changelog@3.1.25: resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} @@ -934,7 +910,7 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: false + dev: true /conventional-commits-filter@2.0.7: resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} @@ -942,7 +918,7 @@ packages: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: false + dev: true /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} @@ -955,7 +931,7 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: false + dev: true /conventional-recommended-bump@6.1.0: resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} @@ -970,10 +946,11 @@ packages: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 - dev: false + dev: true /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -998,11 +975,11 @@ packages: /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dev: false + dev: true /dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: false + dev: true /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1021,12 +998,12 @@ packages: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: false + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1035,59 +1012,6 @@ packages: mimic-response: 3.1.0 dev: true - /decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} - dependencies: - file-type: 5.2.0 - is-stream: 1.1.0 - tar-stream: 1.6.2 - dev: false - - /decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 6.2.0 - is-stream: 1.1.0 - seek-bzip: 1.0.6 - unbzip2-stream: 1.4.3 - dev: false - - /decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 5.2.0 - is-stream: 1.1.0 - dev: false - - /decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} - dependencies: - file-type: 3.9.0 - get-stream: 2.3.1 - pify: 2.3.0 - yauzl: 2.10.0 - dev: false - - /decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - decompress-tarbz2: 4.1.1 - decompress-targz: 4.1.1 - decompress-unzip: 4.0.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - pify: 2.3.0 - strip-dirs: 2.1.0 - dev: false - /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1096,7 +1020,7 @@ packages: /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - dev: false + dev: true /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} @@ -1106,7 +1030,7 @@ packages: /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - dev: false + dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -1125,7 +1049,7 @@ packages: engines: {node: '>=8'} dependencies: is-obj: 2.0.0 - dev: false + dev: true /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} @@ -1138,7 +1062,7 @@ packages: dependencies: find-up: 3.0.0 minimatch: 3.1.2 - dev: false + dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1161,6 +1085,7 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + dev: true /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -1175,15 +1100,17 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: false + dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + dev: true /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -1230,33 +1157,12 @@ packages: reusify: 1.0.4 dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: false - /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: false - - /file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - dev: false - - /file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - dev: false - - /file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - dev: false + dev: true /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -1276,14 +1182,14 @@ packages: engines: {node: '>=4'} dependencies: locate-path: 2.0.0 - dev: false + dev: true /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - dev: false + dev: true /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -1291,7 +1197,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: false + dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -1299,7 +1205,7 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: false + dev: true /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} @@ -1318,6 +1224,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -1345,6 +1252,7 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true /genversion@3.1.1: resolution: {integrity: sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==} @@ -1358,6 +1266,7 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + dev: true /get-pkg-repo@4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} @@ -1368,15 +1277,7 @@ packages: hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: false - - /get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - dev: false + dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -1393,7 +1294,7 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: false + dev: true /git-remote-origin-url@2.0.0: resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} @@ -1401,7 +1302,7 @@ packages: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: false + dev: true /git-semver-tags@4.1.1: resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} @@ -1410,13 +1311,13 @@ packages: dependencies: meow: 8.1.2 semver: 6.3.1 - dev: false + dev: true /gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} dependencies: ini: 1.3.8 - dev: false + dev: true /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -1472,16 +1373,17 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: false + dev: true /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - dev: false + dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1498,17 +1400,18 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + dev: true /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: false + dev: true /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 - dev: false + dev: true /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -1566,6 +1469,7 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} @@ -1580,13 +1484,14 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: false /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true /into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} @@ -1602,12 +1507,13 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 + dev: true /is-core-module@2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} @@ -1640,10 +1546,6 @@ packages: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: false - /is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: false - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1652,17 +1554,12 @@ packages: /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - dev: false + dev: true /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - dev: false - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + dev: true /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} @@ -1674,10 +1571,11 @@ packages: engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 - dev: false + dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1702,6 +1600,7 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -1711,21 +1610,21 @@ packages: /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false + dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false + dev: true /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + dev: true /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: false + dev: true /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -1738,12 +1637,12 @@ packages: /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - dev: false + dev: true /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: false + dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -1752,7 +1651,7 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + dev: true /lint-staged@13.3.0: resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} @@ -1799,7 +1698,7 @@ packages: parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: false + dev: true /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} @@ -1807,7 +1706,7 @@ packages: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: false + dev: true /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} @@ -1815,28 +1714,29 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: false + dev: true /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: false + dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: false + dev: true /lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: false + dev: true /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} @@ -1864,13 +1764,6 @@ packages: resolution: {integrity: sha512-dHjXHlgcS8r2K+4t8kAycGE4xMVQxPzMTCrrYhaFEtQDmjXh/A7xq4D88oOfEtjTR9XFzTAML9AuBrm4jXLigA==} dev: false - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: false - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -1897,12 +1790,12 @@ packages: /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} - dev: false + dev: true /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - dev: false + dev: true /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} @@ -1919,7 +1812,7 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: false + dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1956,13 +1849,13 @@ packages: /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - dev: false + dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: false + dev: true /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -1978,10 +1871,11 @@ packages: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: false + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true /minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} @@ -2060,7 +1954,7 @@ packages: /modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} - dev: false + dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2083,7 +1977,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false + dev: true /node-abi@3.51.0: resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} @@ -2142,7 +2036,7 @@ packages: resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: false + dev: true /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} @@ -2152,7 +2046,7 @@ packages: is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 - dev: false + dev: true /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} @@ -2161,15 +2055,11 @@ packages: path-key: 4.0.0 dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -2240,49 +2130,49 @@ packages: engines: {node: '>=4'} dependencies: p-try: 1.0.0 - dev: false + dev: true /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 - dev: false + dev: true /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - dev: false + dev: true /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} dependencies: p-limit: 1.3.0 - dev: false + dev: true /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - dev: false + dev: true /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - dev: false + dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: false + dev: true /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -2294,12 +2184,12 @@ packages: /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} - dev: false + dev: true /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: false + dev: true /parents@1.0.1: resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==} @@ -2313,7 +2203,7 @@ packages: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: false + dev: true /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -2323,17 +2213,17 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false + dev: true /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: false + dev: true /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: false + dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -2346,6 +2236,7 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-platform@0.11.15: resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==} @@ -2365,7 +2256,7 @@ packages: engines: {node: '>=4'} dependencies: pify: 3.0.0 - dev: false + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2377,10 +2268,6 @@ packages: engines: {node: '>=14', npm: '>=7'} dev: false - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: false - /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2395,24 +2282,12 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: false + dev: true /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - dev: false - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: false - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + dev: true /pkg-fetch@3.4.2: resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} @@ -2491,6 +2366,7 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -2515,7 +2391,7 @@ packages: /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: false + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2524,7 +2400,7 @@ packages: /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - dev: false + dev: true /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -2542,7 +2418,7 @@ packages: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: false + dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -2551,7 +2427,7 @@ packages: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: false + dev: true /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} @@ -2560,7 +2436,7 @@ packages: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: false + dev: true /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} @@ -2570,7 +2446,7 @@ packages: normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: false + dev: true /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2582,6 +2458,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -2590,6 +2467,7 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: true /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -2597,11 +2475,12 @@ packages: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: false + dev: true /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + dev: true /resedit@2.0.0: resolution: {integrity: sha512-vrrJCabKxAW4MT1QivtAAb0poGp8KT2qhnSzfN9tFIxb2rQu1hRHNn1VgGSZR7nmxGaW5Yz0YeW1bjgvRfNoKA==} @@ -2617,6 +2496,7 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} @@ -2648,9 +2528,11 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2658,22 +2540,15 @@ packages: dev: false optional: true - /seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: false - /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: false + dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: false + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -2758,41 +2633,41 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false + dev: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: false + dev: true /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: false + dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: false + dev: true /spdx-license-ids@3.0.16: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: false + dev: true /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 - dev: false + dev: true /split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 - dev: false + dev: true /ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} @@ -2820,7 +2695,7 @@ packages: semver: 7.5.4 stringify-package: 1.0.1 yargs: 16.2.0 - dev: false + dev: true /stream-meter@1.0.4: resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} @@ -2853,16 +2728,18 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: true /stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: false + dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -2879,13 +2756,7 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: false - - /strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} - dependencies: - is-natural-number: 4.0.1 - dev: false + dev: true /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} @@ -2897,7 +2768,7 @@ packages: engines: {node: '>=8'} dependencies: min-indent: 1.0.1 - dev: false + dev: true /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -2909,6 +2780,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2920,6 +2792,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -2930,19 +2803,6 @@ packages: tar-stream: 2.2.0 dev: true - /tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.1.1 - xtend: 4.0.2 - dev: false - /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -2969,28 +2829,24 @@ packages: /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} - dev: false + dev: true /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false + dev: true /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 - dev: false + dev: true /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - - /to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: false + dev: true /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -3011,7 +2867,7 @@ packages: /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} - dev: false + dev: true /ts-node@10.9.1(@types/node@18.18.11)(typescript@5.3.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -3051,7 +2907,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false + dev: true /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3062,17 +2918,17 @@ packages: /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} - dev: false + dev: true /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} - dev: false + dev: true /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - dev: false + dev: true /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} @@ -3081,30 +2937,25 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false + dev: true /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + dev: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true - dev: false + dev: true optional: true - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - dev: false - /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} @@ -3127,6 +2978,7 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -3137,7 +2989,7 @@ packages: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: false + dev: true /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3167,7 +3019,7 @@ packages: /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: false + dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -3187,6 +3039,7 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true /ws@8.16.0: resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} @@ -3204,11 +3057,12 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false + dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3221,6 +3075,7 @@ packages: /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: true /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} @@ -3233,13 +3088,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: false + dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -3249,4 +3098,4 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: false + dev: true