From 1adf8d00facf344f318ffa8bf54b1a62f97f8dcb Mon Sep 17 00:00:00 2001 From: IDCs Date: Tue, 13 Aug 2024 10:05:10 +0100 Subject: [PATCH 1/5] Added support for the new mod type - Removed old XBox directory creation logic as it was no longer applicable. closes nexus-mods/vortex#13745 closes nexus-mods/vortex#14077 --- game-masterchiefcollection/common.js | 29 ++ game-masterchiefcollection/common.ts | 33 ++ game-masterchiefcollection/index.js | 612 ++++++++--------------- game-masterchiefcollection/index.ts | 231 +++++++++ game-masterchiefcollection/info.json | 2 +- game-masterchiefcollection/installers.js | 173 +++++++ game-masterchiefcollection/installers.ts | 141 ++++++ game-masterchiefcollection/modTypes.js | 25 + game-masterchiefcollection/modTypes.ts | 8 + game-masterchiefcollection/types.js | 3 + game-masterchiefcollection/types.ts | 51 ++ game-masterchiefcollection/util.js | 60 +++ game-masterchiefcollection/util.ts | 47 ++ 13 files changed, 1019 insertions(+), 396 deletions(-) create mode 100644 game-masterchiefcollection/common.js create mode 100644 game-masterchiefcollection/common.ts create mode 100644 game-masterchiefcollection/index.ts create mode 100644 game-masterchiefcollection/installers.js create mode 100644 game-masterchiefcollection/installers.ts create mode 100644 game-masterchiefcollection/modTypes.js create mode 100644 game-masterchiefcollection/modTypes.ts create mode 100644 game-masterchiefcollection/types.js create mode 100644 game-masterchiefcollection/types.ts create mode 100644 game-masterchiefcollection/util.js create mode 100644 game-masterchiefcollection/util.ts diff --git a/game-masterchiefcollection/common.js b/game-masterchiefcollection/common.js new file mode 100644 index 0000000..449ae7e --- /dev/null +++ b/game-masterchiefcollection/common.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HALO_GAMES = exports.MODTYPE_PLUG_AND_PLAY = exports.MAP_EXT = exports.ASSEMBLY_EXT = exports.MOD_CONFIG_DEST_ELEMENT = exports.MOD_CONFIG_FILE = exports.GAME_ID = exports.STEAM_ID = exports.MS_APPID = exports.MOD_INFO_JSON_FILE = exports.MOD_MANIFEST_FILE_PATH = exports.MOD_MANIFEST_FILE = exports.MCC_LOCAL_LOW = void 0; +const path_1 = __importDefault(require("path")); +const vortex_api_1 = require("vortex-api"); +exports.MCC_LOCAL_LOW = path_1.default.resolve(vortex_api_1.util.getVortexPath('appData'), '..', 'LocalLow', 'MCC'); +exports.MOD_MANIFEST_FILE = 'ModManifest.txt'; +exports.MOD_MANIFEST_FILE_PATH = path_1.default.join(exports.MCC_LOCAL_LOW, 'Config', exports.MOD_MANIFEST_FILE); +exports.MOD_INFO_JSON_FILE = 'modinfo.json'; +exports.MS_APPID = 'Microsoft.Chelan'; +exports.STEAM_ID = '976730'; +exports.GAME_ID = 'halothemasterchiefcollection'; +exports.MOD_CONFIG_FILE = 'modpack_config.cfg'; +exports.MOD_CONFIG_DEST_ELEMENT = '$MCC_home\\'; +exports.ASSEMBLY_EXT = '.asmp'; +exports.MAP_EXT = '.map'; +exports.MODTYPE_PLUG_AND_PLAY = 'halo-mcc-plug-and-play-modtype'; +exports.HALO_GAMES = { + halo1: { internalId: '1', name: 'Halo: CE', modsPath: 'halo1', img: path_1.default.join(__dirname, 'halo1.png') }, + halo2: { internalId: '2', name: 'Halo 2', modsPath: 'halo2', img: path_1.default.join(__dirname, 'halo2.png') }, + halo3: { internalId: '3', name: 'Halo 3', modsPath: 'halo3', img: path_1.default.join(__dirname, 'halo3.png') }, + odst: { internalId: '4', name: 'ODST', modsPath: 'halo3odst', img: path_1.default.join(__dirname, 'odst.png') }, + halo4: { internalId: '5', name: 'Halo 4', modsPath: 'halo4', img: path_1.default.join(__dirname, 'halo4.png') }, + haloreach: { internalId: '6', name: 'Reach', modsPath: 'haloreach', img: path_1.default.join(__dirname, 'haloreach.png') }, +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGdEQUF3QjtBQUN4QiwyQ0FBa0M7QUFJckIsUUFBQSxhQUFhLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLFFBQUEsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFDdEMsUUFBQSxzQkFBc0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFhLEVBQUUsUUFBUSxFQUFFLHlCQUFpQixDQUFDLENBQUM7QUFDL0UsUUFBQSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUFFcEMsUUFBQSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7QUFDOUIsUUFBQSxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3BCLFFBQUEsT0FBTyxHQUFHLDhCQUE4QixDQUFDO0FBRXpDLFFBQUEsZUFBZSxHQUFHLG9CQUFvQixDQUFDO0FBQ3ZDLFFBQUEsdUJBQXVCLEdBQUcsYUFBYSxDQUFDO0FBQ3hDLFFBQUEsWUFBWSxHQUFHLE9BQU8sQ0FBQztBQUN2QixRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFFakIsUUFBQSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUl6RCxRQUFBLFVBQVUsR0FBaUM7SUFDdEQsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFO0lBQ3ZHLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRTtJQUNyRyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUU7SUFFckcsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ3JHLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRTtJQUNyRyxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEVBQUU7Q0FDakgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBJSGFsb0dhbWUgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBjb25zdCBNQ0NfTE9DQUxfTE9XID0gcGF0aC5yZXNvbHZlKHV0aWwuZ2V0Vm9ydGV4UGF0aCgnYXBwRGF0YScpLCAnLi4nLCAnTG9jYWxMb3cnLCAnTUNDJyk7XHJcbmV4cG9ydCBjb25zdCBNT0RfTUFOSUZFU1RfRklMRSA9ICdNb2RNYW5pZmVzdC50eHQnO1xyXG5leHBvcnQgY29uc3QgTU9EX01BTklGRVNUX0ZJTEVfUEFUSCA9IHBhdGguam9pbihNQ0NfTE9DQUxfTE9XLCAnQ29uZmlnJywgTU9EX01BTklGRVNUX0ZJTEUpO1xyXG5leHBvcnQgY29uc3QgTU9EX0lORk9fSlNPTl9GSUxFID0gJ21vZGluZm8uanNvbic7XHJcblxyXG5leHBvcnQgY29uc3QgTVNfQVBQSUQgPSAnTWljcm9zb2Z0LkNoZWxhbic7XHJcbmV4cG9ydCBjb25zdCBTVEVBTV9JRCA9ICc5NzY3MzAnO1xyXG5leHBvcnQgY29uc3QgR0FNRV9JRCA9ICdoYWxvdGhlbWFzdGVyY2hpZWZjb2xsZWN0aW9uJztcclxuXHJcbmV4cG9ydCBjb25zdCBNT0RfQ09ORklHX0ZJTEUgPSAnbW9kcGFja19jb25maWcuY2ZnJztcclxuZXhwb3J0IGNvbnN0IE1PRF9DT05GSUdfREVTVF9FTEVNRU5UID0gJyRNQ0NfaG9tZVxcXFwnO1xyXG5leHBvcnQgY29uc3QgQVNTRU1CTFlfRVhUID0gJy5hc21wJztcclxuZXhwb3J0IGNvbnN0IE1BUF9FWFQgPSAnLm1hcCc7XHJcblxyXG5leHBvcnQgY29uc3QgTU9EVFlQRV9QTFVHX0FORF9QTEFZID0gJ2hhbG8tbWNjLXBsdWctYW5kLXBsYXktbW9kdHlwZSc7XHJcblxyXG4vLyBBdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgZXh0ZW5zaW9uLCBvbmx5IEhhbG86IENvbWJhdCBFdm9sdmVkIGFuZCBIYWxvIFJlYWNoIHdlcmUgYXZhaWxhYmxlLlxyXG4vLyAgV2UgbWF5IGhhdmUgdG8gY29tZSBiYWNrIHRvIHRoaXMgb2JqZWN0IGFzIG1vcmUgb2YgdGhlIGdhbWVzIGdldCByZWxlYXNlZC5cclxuZXhwb3J0IGNvbnN0IEhBTE9fR0FNRVM6IHsgW2tleTogc3RyaW5nXTogSUhhbG9HYW1lIH0gPSB7XHJcbiAgaGFsbzE6IHsgaW50ZXJuYWxJZDogJzEnLCBuYW1lOiAnSGFsbzogQ0UnLCBtb2RzUGF0aDogJ2hhbG8xJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzEucG5nJykgfSxcclxuICBoYWxvMjogeyBpbnRlcm5hbElkOiAnMicsIG5hbWU6ICdIYWxvIDInLCBtb2RzUGF0aDogJ2hhbG8yJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzIucG5nJykgfSxcclxuICBoYWxvMzogeyBpbnRlcm5hbElkOiAnMycsIG5hbWU6ICdIYWxvIDMnLCBtb2RzUGF0aDogJ2hhbG8zJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzMucG5nJykgfSxcclxuICAvLyBTb21lb25lIHNob3VsZCBnZXQgTWlrZSBhIGNvb2tpZSBmb3IgaGlzIHByZW1vbml0aW9uIHNraWxsc1xyXG4gIG9kc3Q6IHsgaW50ZXJuYWxJZDogJzQnLCBuYW1lOiAnT0RTVCcsIG1vZHNQYXRoOiAnaGFsbzNvZHN0JywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnb2RzdC5wbmcnKSB9LFxyXG4gIGhhbG80OiB7IGludGVybmFsSWQ6ICc1JywgbmFtZTogJ0hhbG8gNCcsIG1vZHNQYXRoOiAnaGFsbzQnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvNC5wbmcnKSB9LFxyXG4gIGhhbG9yZWFjaDogeyBpbnRlcm5hbElkOiAnNicsIG5hbWU6ICdSZWFjaCcsIG1vZHNQYXRoOiAnaGFsb3JlYWNoJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsb3JlYWNoLnBuZycpIH0sXHJcbn07Il19 \ No newline at end of file diff --git a/game-masterchiefcollection/common.ts b/game-masterchiefcollection/common.ts new file mode 100644 index 0000000..d28fb11 --- /dev/null +++ b/game-masterchiefcollection/common.ts @@ -0,0 +1,33 @@ +/* eslint-disable */ +import path from 'path'; +import { util } from 'vortex-api'; + +import { IHaloGame } from './types'; + +export const MCC_LOCAL_LOW = path.resolve(util.getVortexPath('appData'), '..', 'LocalLow', 'MCC'); +export const MOD_MANIFEST_FILE = 'ModManifest.txt'; +export const MOD_MANIFEST_FILE_PATH = path.join(MCC_LOCAL_LOW, 'Config', MOD_MANIFEST_FILE); +export const MOD_INFO_JSON_FILE = 'modinfo.json'; + +export const MS_APPID = 'Microsoft.Chelan'; +export const STEAM_ID = '976730'; +export const GAME_ID = 'halothemasterchiefcollection'; + +export const MOD_CONFIG_FILE = 'modpack_config.cfg'; +export const MOD_CONFIG_DEST_ELEMENT = '$MCC_home\\'; +export const ASSEMBLY_EXT = '.asmp'; +export const MAP_EXT = '.map'; + +export const MODTYPE_PLUG_AND_PLAY = 'halo-mcc-plug-and-play-modtype'; + +// At the time of writing this extension, only Halo: Combat Evolved and Halo Reach were available. +// We may have to come back to this object as more of the games get released. +export const HALO_GAMES: { [key: string]: IHaloGame } = { + halo1: { internalId: '1', name: 'Halo: CE', modsPath: 'halo1', img: path.join(__dirname, 'halo1.png') }, + halo2: { internalId: '2', name: 'Halo 2', modsPath: 'halo2', img: path.join(__dirname, 'halo2.png') }, + halo3: { internalId: '3', name: 'Halo 3', modsPath: 'halo3', img: path.join(__dirname, 'halo3.png') }, + // Someone should get Mike a cookie for his premonition skills + odst: { internalId: '4', name: 'ODST', modsPath: 'halo3odst', img: path.join(__dirname, 'odst.png') }, + halo4: { internalId: '5', name: 'Halo 4', modsPath: 'halo4', img: path.join(__dirname, 'halo4.png') }, + haloreach: { internalId: '6', name: 'Reach', modsPath: 'haloreach', img: path.join(__dirname, 'haloreach.png') }, +}; \ No newline at end of file diff --git a/game-masterchiefcollection/index.js b/game-masterchiefcollection/index.js index ebd2ea5..0f43ba6 100644 --- a/game-masterchiefcollection/index.js +++ b/game-masterchiefcollection/index.js @@ -1,406 +1,228 @@ -//const { app, remote } = require('electron'); -const path = require('path'); -const Promise = require('bluebird'); -const { actions, fs, FlexLayout, OptionsFilter, log, selectors, util } = require('vortex-api'); -const rjson = require('relaxed-json'); - -const React = require('react'); - -// These are all used when attempting to find a user's xbox id. -// currently unused. -// const appUni = app || remote.app; -// const MCC_LOCAL_LOW = path.resolve(appUni.getPath('appData'), '..', 'LocalLow', 'MCC'); -// const REPORT_PATH = path.join(MCC_LOCAL_LOW, 'Temporary'); -// const REPORT_PATTERN = /campaigncarnagereport.*.xml/; - -// Game Ids for different game stores and the nexus game Id. -const MS_APPID = 'Microsoft.Chelan'; -const STEAM_ID = '976730'; -const GAME_ID = 'halothemasterchiefcollection'; - -const MOD_CONFIG_FILE = 'modpack_config.cfg'; -const MOD_CONFIG_DEST_ELEMENT = '$MCC_home\\'; -const ASSEMBLY_EXT = '.asmp'; -const MAP_EXT = '.map'; - -// At the time of writing this extension, only Halo: Combat Evolved and Halo Reach were available. -// We may have to come back to this object as more of the games get released. -const HALO_GAMES = { - halo1: { internalId: '1', name: 'Halo: CE', modsPath: 'halo1', img: path.join(__dirname, 'halo1.png') }, - halo2: { internalId: '2', name: 'Halo 2', modsPath: 'halo2', img: path.join(__dirname, 'halo2.png') }, - halo3: { internalId: '3', name: 'Halo 3', modsPath: 'halo3', img: path.join(__dirname, 'halo3.png') }, - // Someone should get Mike a cookie for his premonition skills - odst: { internalId: '4', name: 'ODST', modsPath: 'halo3odst', img: path.join(__dirname, 'odst.png') }, - halo4: { internalId: '5', name: 'Halo 4', modsPath: 'halo4', img: path.join(__dirname, 'halo4.png') }, - haloreach: { internalId: '6', name: 'Reach', modsPath: 'haloreach', img: path.join(__dirname, 'haloreach.png') }, +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; }; - +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __importDefault(require("path")); +const vortex_api_1 = require("vortex-api"); +const React = __importStar(require("react")); +const common_1 = require("./common"); +const modTypes_1 = require("./modTypes"); +const installers_1 = require("./installers"); +const util_1 = require("./util"); let _GAME_STORE_ID; - -// Master chef collection class MasterChiefCollectionGame { - constructor(context) { - this.context = context; - this.id = GAME_ID; - this.name = 'Halo: The Master Chief Collection'; - this.shortName = 'Halo: MCC'; - this.logo = 'gameart.jpg'; - this.api = context.api; - this.getGameVersion = resolveGameVersion, - this.requiredFiles = [ - this.executable(), - ]; - this.supportedTools = [ - { - id: 'haloassemblytool', - name: 'Assembly', - logo: 'assemblytool.png', - executable: () => 'Assembly.exe', - requiredFiles: [ - 'Assembly.exe', - ], - relative: true, - }, - ]; - this.environment = { - SteamAPPId: STEAM_ID, - }; - this.details = { - steamAppId: parseInt(STEAM_ID, 10), - }; - this.mergeMods = true; - } - - queryModPath(gamePath) { - return '.'; - } - - executable() { - return 'mcclauncher.exe'; - } - - prepareXboxId() { - // if (_GAME_STORE_ID === undefined) { - // return this.queryPath(); - // } - // const runGameNotif = () => { - // this.context.api.showErrorNotification('Unable to resolve Xbox user ID', - // 'Please run the game at least once before modding it.', - // { allowReport: false }); - // }; - // return fs.readdirAsync(REPORT_PATH).then(entries => { - // const reports = entries.filter(entry => entry.match(REPORT_PATTERN)); - // return Promise.each(reports, report => (!!this.fullModsPath) - // ? Promise.resolve() - // : getXboxId(this.internalId, path.join(REPORT_PATH, report), 'utf-8') - // .catch(util.DataInvalid, err => Promise.resolve()) - // .then(xboxId => { - // this.fullModsPath = path.join(MCC_LOCAL_LOW, 'LocalFiles', xboxId, this.modsFolder); - // return fs.ensureDirWritableAsync(this.fullModsPath, () => Promise.resolve()); - // })) - // .catch(err => { - // runGameNotif(); - // return Promise.reject(new Error('Unable to resolve mods path')); - // }) - // }) - } - - async setup(discovery) { - const xboxWarning = () => { - this.context.api.showDialog('warn', 'Xbox Store Permissions', { - bbcode: 'Halo: MCC appears to be installed through the Xbox game store and your account ' - + 'does not have permissions to write new files. This needs to be resolved manually ' - + 'before mods can be deployed [url=https://wiki.nexusmods.com/index.php/Modding_Halo:_The_Master_Chief_Collection_with_Vortex]as seen here.[/url]', - }, [ - { label: 'Close' }, - ]); - - return Promise.resolve(); + constructor(context) { + this.requiresLauncer = vortex_api_1.util.toBlue((gamePath) => this.checkLauncher(gamePath)); + this.context = context; + this.id = common_1.GAME_ID; + this.name = 'Halo: The Master Chief Collection'; + this.shortName = 'Halo: MCC'; + this.logo = 'gameart.jpg'; + this.api = context.api; + this.getGameVersion = resolveGameVersion, + this.requiredFiles = [ + this.executable(), + ]; + this.supportedTools = [ + { + id: 'haloassemblytool', + name: 'Assembly', + logo: 'assemblytool.png', + executable: () => 'Assembly.exe', + requiredFiles: [ + 'Assembly.exe', + ], + relative: true, + }, + ]; + this.environment = { + SteamAPPId: common_1.STEAM_ID, + }; + this.details = { + steamAppId: +common_1.STEAM_ID, + }; + this.mergeMods = true; + } + queryModPath(gamePath) { + return '.'; } - - const createXboxModsPath = () => { - const segments = discovery.path.split(path.sep).filter(seg => !!seg); - const idx = segments.indexOf('WindowsApps'); - const progFiles = segments.splice(0, idx).join(path.sep); - return fs.ensureDirWritableAsync(path.join(progFiles, 'ModifiableWindowsApps', 'HaloMCC'), () => { - return this.api.showDialog('info', 'Need to change file permissions', { - text: 'Vortex needs to change the file permissions on the game mod directory so it ' - + 'can install mods. Windows will ask if you want to allow Vortex to make changes to your system. ', - }, [ - { label: 'Cancel' }, - { label: 'Continue' }, - ]) - .then(result => { - if (result.action === 'Cancel') { - return Promise.reject(new util.UserCanceled()); - } else { - return Promise.resolve(); - } + executable() { + return 'mcclauncher.exe'; + } + prepare(discovery) { + return __awaiter(this, void 0, void 0, function* () { + const xboxWarning = () => { + this.context.api.showDialog('info', 'Xbox Store Permissions', { + bbcode: 'Halo: MCC appears to be installed through the Xbox game store and your account ' + + 'does not have permissions to write new files. This needs to be resolved manually ' + + 'before mods can be deployed [url=https://wiki.nexusmods.com/index.php/Modding_Halo:_The_Master_Chief_Collection_with_Vortex]as seen here.[/url]', + }, [ + { label: 'Close' }, + ]); + return Promise.resolve(); + }; + const createXboxModsPath = () => { + const segments = discovery.path.split(path_1.default.sep).filter(seg => !!seg); + const idx = segments.indexOf('WindowsApps'); + const progFiles = segments.splice(0, idx).join(path_1.default.sep); + return vortex_api_1.fs.ensureDirWritableAsync(path_1.default.join(progFiles, 'ModifiableWindowsApps', 'HaloMCC'), () => { + return this.api.showDialog('info', 'Need to change file permissions', { + text: 'Vortex needs to change the file permissions on the game mod directory so it ' + + 'can install mods. Windows will ask if you want to allow Vortex to make changes to your system. ', + }, [ + { label: 'Cancel' }, + { label: 'Continue' }, + ]) + .then(result => { + if (result.action === 'Cancel') { + return Promise.reject(new vortex_api_1.util.UserCanceled()); + } + else { + return Promise.resolve(); + } + }); + }) + .catch(err => (err.code === 'EPERM') + ? xboxWarning() : Promise.reject(err)); + }; + return (_GAME_STORE_ID === 'xbox') + ? createXboxModsPath() + : Promise.resolve(); }); - }) - .catch(err => (err.code === 'EPERM') - ? xboxWarning() : Promise.reject(err)); } - - return (_GAME_STORE_ID === 'xbox') - ? createXboxModsPath() - : Promise.resolve(); - } - - queryPath() { - return util.GameStoreHelper.findByAppId([STEAM_ID, MS_APPID]) - .then(game => { - _GAME_STORE_ID = game.gameStoreId; - return game.gamePath - }); - } - - requiresLauncher(gamePath) { - if (_GAME_STORE_ID === 'xbox') { - return Promise.resolve({ - launcher: 'xbox', - addInfo: { - appId: MS_APPID, - parameters: [ - { appExecName: 'HaloMCCShippingNoEAC' }, - ], - } - }); - } else if (_GAME_STORE_ID === 'steam') { - return Promise.resolve({ - launcher: 'steam', - addInfo: { - appId: STEAM_ID, - parameters: ['option2'], - launchType: 'gamestore', - } - }); + queryPath() { + return vortex_api_1.util.GameStoreHelper.findByAppId([common_1.STEAM_ID, common_1.MS_APPID]) + .then(game => { + _GAME_STORE_ID = game.gameStoreId; + return game.gamePath; + }); } - - return Promise.resolve(undefined); - } -} - -// function getXboxId(internalId, filePath, encoding) { -// // This function will return the xbox id of the last player -// // who ran the game. This can potentially be used to mod the game -// // only for specific xbox ids while leaving others in an untampered state. (WIP) -// return fs.readFileAsync(filePath, { encoding }) -// .then(fileData => { -// let xmlDoc; -// try { -// xmlDoc = parseXmlString(fileData); -// } catch (err) { -// return Promise.reject(err); -// } - -// const generalData = xmlDoc.find('//CampaignCarnageReport/GeneralData'); -// if (generalData[0].attr('GameId').value() === internalId) { -// const players = xmlDoc.find('//CampaignCarnageReport/Players/PlayerInfo'); -// const mainPlayer = players.find(player => player.attr('isGuest').value() === 'false'); -// const xboxId = mainPlayer.attr('mXboxUserId').value(); -// // The userId is prefixed with "0x" which is not needed. -// return Promise.resolve(xboxId.substring(2)); -// } else { -// return Promise.reject(new util.DataInvalid('Wrong internal gameId')); -// } -// }); -// } - -function identifyHaloGames(files) { - // Function aims to identify the relevant halo game entry using the - // mod files. - const filtered = files.filter(file => path.extname(file) !== ''); - return Promise.reduce(Object.keys(HALO_GAMES), (accum, key) => { - const entry = HALO_GAMES[key]; - filtered.forEach(element => { - const segments = element.split(path.sep); - if (segments.includes(entry.modsPath)) { - accum.push(entry); - return Promise.resolve(accum); - } - }); - - return Promise.resolve(accum); - }, []); -} - -function testInstaller(files, gameId) { - return (gameId !== GAME_ID) - ? Promise.resolve({ supported: false, requiredFiles: [] }) - : identifyHaloGames(files).then(haloGames => Promise.resolve({ - supported: (haloGames.length > 0), - requiredFiles: [], - })); -} - -function install(context, files, destinationPath) { - return identifyHaloGames(files).then(haloGames => { - const internalIds = haloGames.map(game => game.internalId); - context.api.store.dispatch(actions.setModAttribute(GAME_ID, path.basename(destinationPath, '.installing'), 'haloGames', internalIds)); - - return Promise.reduce(haloGames, (accum, haloGame) => { - const filtered = files.filter(file => { - const segments = file.split(path.sep).filter(seg => !!seg); - return (path.extname(segments[segments.length - 1]) !== '') - && (segments.indexOf(haloGame.modsPath) !== -1); - }) - - filtered.forEach(element => { - const segments = element.split(path.sep).filter(seg => !!seg); - const rootIdx = segments.indexOf(haloGame.modsPath); - const destination = segments.splice(rootIdx).join(path.sep); - accum.push({ - type: 'copy', - source: element, - destination + checkLauncher(gamePath) { + return __awaiter(this, void 0, void 0, function* () { + if (_GAME_STORE_ID === 'xbox') { + return Promise.resolve({ + launcher: 'xbox', + addInfo: { + appId: common_1.MS_APPID, + parameters: [ + { appExecName: 'HaloMCCShippingNoEAC' }, + ], + } + }); + } + else if (_GAME_STORE_ID === 'steam') { + return Promise.resolve({ + launcher: 'steam', + addInfo: { + appId: common_1.STEAM_ID, + parameters: ['option2'], + launchType: 'gamestore', + } + }); + } + return Promise.resolve(undefined); }); - }); - return Promise.resolve(accum); - }, []).then(instructions => Promise.resolve({ instructions })); - }); -} - -function resolveGameVersion(discoveryPath) { - const versionPath = path.join(discoveryPath, 'build_tag.txt'); - return fs.readFileAsync(versionPath, { encoding: 'utf8' }) - .then((res) => Promise.resolve(res.split('\r\n')[0].trim())); -} - -function testModConfigInstaller(files, gameId) { - const isAssemblyOnlyMod = () => { - // The presense of an .asmp file without any .map files is a clear indication - // that this mod can only be installed using the Assembly tool which we've - // yet to integrate into Vortex. This installer will not install these mods. - return (files.find(file => path.extname(file) === ASSEMBLY_EXT) !== undefined) - && (files.find(file => path.extname(file) === MAP_EXT) === undefined); - }; - return (gameId !== GAME_ID) - ? Promise.resolve({ supported: false, requiredFiles: [] }) - : Promise.resolve({ - supported: (files.find(file => path.basename(file) === MOD_CONFIG_FILE) !== undefined) - && !isAssemblyOnlyMod(), - requiredFiles: [], - }); -} - -function installModConfig(files, destinationPath) { - // Find the mod config file and use it to build the instructions. - const modConfigFile = files.find(file => path.basename(file) === MOD_CONFIG_FILE); - const filtered = files.filter(file => { - // No directories, assembly tool files, readmes or mod config files. - const segments = file.split(path.sep); - const lastElementExt = path.extname(segments[segments.length - 1]); - return (modConfigFile !== file) && ['', '.txt', ASSEMBLY_EXT].indexOf(lastElementExt) === -1; - }); - return fs.readFileAsync(path.join(destinationPath, modConfigFile), { encoding: 'utf8' }) - .then(configData => { - let data; - try { - data = rjson.parse(util.deBOM(configData)); - } catch (err) { - log('error', 'Unable to parse modpack_config.cfg', err); - return Promise.reject(new util.DataInvalid('Invalid modpack_config.cfg file')); - } - - return (!!data.entries) - ? Promise.reduce(filtered, (accum, file) => { - const matchingEntry = data.entries.find(entry => - ('src' in entry) && (entry.src.toLowerCase() === file.toLowerCase())); - if (!!matchingEntry) { - const destination = matchingEntry.dest.substring(MOD_CONFIG_DEST_ELEMENT.length); - accum.push({ - type: 'copy', - source: file, - destination, - }); - } else { - // This may just be a pointless addition by the mod author - we're going to log - // this and continue. - log('warn', 'Failed to find matching manifest entry for file in archive', file); - } - - return accum; - }, []) - : Promise.reject(new util.DataInvalid('modpack_config.cfg file contains no entries')) - }).then(instructions => Promise.resolve({ instructions })); + } } - +const resolveGameVersion = (discoveryPath) => __awaiter(void 0, void 0, void 0, function* () { + const versionPath = path_1.default.join(discoveryPath, 'build_tag.txt'); + return vortex_api_1.fs.readFileAsync(versionPath, { encoding: 'utf8' }) + .then((res) => Promise.resolve(res.split('\r\n')[0].trim())); +}); module.exports = { - default: context => { - context.registerGame(new MasterChiefCollectionGame(context)); - - // let collator; - // const getCollator = (locale) => { - // if ((collator === undefined) || (locale !== lang)) { - // lang = locale; - // collator = new Intl.Collator(locale, { sensitivity: 'base' }); - // } - // return collator; - // }; - - context.registerInstaller('masterchiefmodconfiginstaller', - 20, testModConfigInstaller, installModConfig); - - context.registerInstaller('masterchiefinstaller', 25, testInstaller, - (files, destinationPath) => install(context, files, destinationPath)); - - context.registerTableAttribute('mods', { - id: 'gameType', - name: 'Game(s)', - description: 'Target Halo game(s) for this mod', - icon: 'inspect', - placement: 'table', - customRenderer: (mod) => { - const createImgDiv = (entry, idx) => { - return React.createElement('div', { className: 'halo-img-div', key: `${entry.internalId}-${idx}` }, - React.createElement('img', { className: 'halogameimg', src: `file://${entry.img}` }), - React.createElement('span', {}, entry.name)) - }; - - const internalIds = util.getSafe(mod, ['attributes', 'haloGames'], []); - const haloEntries = Object.keys(HALO_GAMES) - .filter(key => internalIds.includes(HALO_GAMES[key].internalId)) - .map(key => HALO_GAMES[key]); - - return React.createElement(FlexLayout, { type: 'row' }, - React.createElement(FlexLayout.Flex, { className: 'haloimglayout' }, haloEntries.map((entry, idx) => createImgDiv(entry, idx)))); - }, - calc: (mod) => util.getSafe(mod, ['attributes', 'haloGames'], undefined), - filter: new OptionsFilter( - [].concat([{ value: OptionsFilter.EMPTY, label: '' }], - Object.keys(HALO_GAMES) - .map(key => { - return { value: HALO_GAMES[key].internalId, label: HALO_GAMES[key].name }; - })) - , true, false), - isToggleable: true, - edit: {}, - isSortable: false, - isGroupable: (mod) => { - const internalIds = util.getSafe(mod, ['attributes', 'haloGames'], []); - const haloEntries = Object.keys(HALO_GAMES) - .filter(key => internalIds.includes(HALO_GAMES[key].internalId)) - .map(key => HALO_GAMES[key]); - - if (haloEntries.length > 1) { - return 'Multiple'; - } else { - return (!!haloEntries && (haloEntries.length > 0)) - ? haloEntries[0].name - : 'None'; - } - }, - isDefaultVisible: true, - //sortFunc: (lhs, rhs) => getCollator(locale).compare(lhs, rhs), - condition: () => { - const activeGameId = selectors.activeGameId(context.api.store.getState()); - return (activeGameId === GAME_ID); - } - }); - - context.once(() => { - context.api.setStylesheet('masterchiefstyle', path.join(__dirname, 'masterchief.scss')); - }); - } + default: (context) => { + context.registerGame(new MasterChiefCollectionGame(context)); + context.registerModType(common_1.MODTYPE_PLUG_AND_PLAY, 15, (gameId) => gameId === common_1.GAME_ID, () => undefined, modTypes_1.testPlugAndPlayModType, { + deploymentEssential: false, + mergeMods: true, + name: 'MCC Plug and Play mod', + noConflicts: true, + }); + context.registerInstaller('mcc-plug-and-play-installer', 15, installers_1.testPlugAndPlayInstaller, installers_1.installPlugAndPlay); + context.registerInstaller('masterchiefmodconfiginstaller', 20, installers_1.testModConfigInstaller, installers_1.installModConfig); + context.registerInstaller('masterchiefinstaller', 25, installers_1.testInstaller, installers_1.install); + context.registerTableAttribute('mods', { + id: 'gameType', + name: 'Game(s)', + description: 'Target Halo game(s) for this mod', + icon: 'inspect', + placement: 'table', + customRenderer: (mod) => { + const createImgDiv = (entry, idx) => { + return React.createElement('div', { className: 'halo-img-div', key: `${entry.internalId}-${idx}` }, React.createElement('img', { className: 'halogameimg', src: `file://${entry.img}` }), React.createElement('span', {}, entry.name)); + }; + const internalIds = vortex_api_1.util.getSafe(mod, ['attributes', 'haloGames'], []); + const haloEntries = Object.keys(common_1.HALO_GAMES) + .filter(key => internalIds.includes(common_1.HALO_GAMES[key].internalId)) + .map(key => common_1.HALO_GAMES[key]); + return React.createElement(vortex_api_1.FlexLayout, { type: 'row' }, React.createElement(vortex_api_1.FlexLayout.Flex, { className: 'haloimglayout' }, haloEntries.map((entry, idx) => createImgDiv(entry, idx)))); + }, + calc: (mod) => vortex_api_1.util.getSafe(mod, ['attributes', 'haloGames'], undefined), + filter: new vortex_api_1.OptionsFilter([].concat([{ value: vortex_api_1.OptionsFilter.EMPTY, label: '' }], Object.keys(common_1.HALO_GAMES) + .map(key => { + return { value: common_1.HALO_GAMES[key].internalId, label: common_1.HALO_GAMES[key].name }; + })), true, false), + isToggleable: true, + edit: {}, + isSortable: false, + isGroupable: (mod) => { + const internalIds = vortex_api_1.util.getSafe(mod, ['attributes', 'haloGames'], []); + const haloEntries = Object.keys(common_1.HALO_GAMES) + .filter(key => internalIds.includes(common_1.HALO_GAMES[key].internalId)) + .map(key => common_1.HALO_GAMES[key]); + if (haloEntries.length > 1) { + return 'Multiple'; + } + else { + return (!!haloEntries && (haloEntries.length > 0)) + ? haloEntries[0].name + : 'None'; + } + }, + isDefaultVisible: true, + condition: () => { + const activeGameId = vortex_api_1.selectors.activeGameId(context.api.store.getState()); + return (activeGameId === common_1.GAME_ID); + } + }); + context.once(() => { + context.api.setStylesheet('masterchiefstyle', path_1.default.join(__dirname, 'masterchief.scss')); + context.api.onAsync('did-deploy', (profileId) => __awaiter(void 0, void 0, void 0, function* () { return (0, util_1.applyToManifest)(context.api, true); })); + context.api.onAsync('did-purge', (profileId) => __awaiter(void 0, void 0, void 0, function* () { return (0, util_1.applyToManifest)(context.api, false); })); + }); + } }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDJDQUFtRjtBQUVuRiw2Q0FBK0I7QUFFL0IscUNBQTBGO0FBRTFGLHlDQUFvRDtBQUNwRCw2Q0FBOEk7QUFDOUksaUNBQXlDO0FBRXpDLElBQUksY0FBYyxDQUFDO0FBR25CLE1BQU0seUJBQXlCO0lBYzdCLFlBQVksT0FBTztRQTBGWixvQkFBZSxHQUFHLGlCQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBekZ2RixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxtQ0FBbUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0I7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQjtnQkFDRSxFQUFFLEVBQUUsa0JBQWtCO2dCQUN0QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWM7Z0JBQ2hDLGFBQWEsRUFBRTtvQkFDYixjQUFjO2lCQUNmO2dCQUNELFFBQVEsRUFBRSxJQUFJO2FB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bXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgZnMsIHR5cGVzLCBGbGV4TGF5b3V0LCBPcHRpb25zRmlsdGVyLCBzZWxlY3RvcnMsIHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEdBTUVfSUQsIEhBTE9fR0FNRVMsIE1TX0FQUElELCBTVEVBTV9JRCwgTU9EVFlQRV9QTFVHX0FORF9QTEFZIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYXVuY2hlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIH0gZnJvbSAnLi9tb2RUeXBlcyc7XHJcbmltcG9ydCB7IGluc3RhbGxQbHVnQW5kUGxheSwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyLCBpbnN0YWxsTW9kQ29uZmlnLCBpbnN0YWxsLCB0ZXN0SW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXJzJztcclxuaW1wb3J0IHsgYXBwbHlUb01hbmlmZXN0IH0gZnJvbSAnLi91dGlsJztcclxuXHJcbmxldCBfR0FNRV9TVE9SRV9JRDtcclxuXHJcbi8vIE1hc3RlciBjaGVmIGNvbGxlY3Rpb25cclxuY2xhc3MgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZSBpbXBsZW1lbnRzIHR5cGVzLklHYW1lIHtcclxuICBwdWJsaWMgY29udGV4dDogdHlwZXMuSUV4dGVuc2lvbkNvbnRleHQ7XHJcbiAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgc2hvcnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxvZ286IHN0cmluZztcclxuICBwdWJsaWMgYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpO1xyXG4gIHB1YmxpYyBnZXRHYW1lVmVyc2lvbjogKGRpc2NvdmVyeVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZXF1aXJlZEZpbGVzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgc3VwcG9ydGVkVG9vbHM6IGFueVtdO1xyXG4gIHB1YmxpYyBlbnZpcm9ubWVudDogYW55O1xyXG4gIHB1YmxpYyBkZXRhaWxzOiBhbnk7XHJcbiAgcHVibGljIG1lcmdlTW9kczogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuaWQgPSBHQU1FX0lEO1xyXG4gICAgdGhpcy5uYW1lID0gJ0hhbG86IFRoZSBNYXN0ZXIgQ2hpZWYgQ29sbGVjdGlvbic7XHJcbiAgICB0aGlzLnNob3J0TmFtZSA9ICdIYWxvOiBNQ0MnO1xyXG4gICAgdGhpcy5sb2dvID0gJ2dhbWVhcnQuanBnJztcclxuICAgIHRoaXMuYXBpID0gY29udGV4dC5hcGk7XHJcbiAgICB0aGlzLmdldEdhbWVWZXJzaW9uID0gcmVzb2x2ZUdhbWVWZXJzaW9uLFxyXG4gICAgdGhpcy5yZXF1aXJlZEZpbGVzID0gW1xyXG4gICAgICB0aGlzLmV4ZWN1dGFibGUoKSxcclxuICAgIF07XHJcbiAgICB0aGlzLnN1cHBvcnRlZFRvb2xzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdoYWxvYXNzZW1ibHl0b29sJyxcclxuICAgICAgICBuYW1lOiAnQXNzZW1ibHknLFxyXG4gICAgICAgIGxvZ286ICdhc3NlbWJseXRvb2wucG5nJyxcclxuICAgICAgICBleGVjdXRhYmxlOiAoKSA9PiAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICByZXF1aXJlZEZpbGVzOiBbXHJcbiAgICAgICAgICAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlbGF0aXZlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7XHJcbiAgICAgIFN0ZWFtQVBQSWQ6IFNURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGV0YWlscyA9IHtcclxuICAgICAgc3RlYW1BcHBJZDogK1NURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMubWVyZ2VNb2RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHF1ZXJ5TW9kUGF0aChnYW1lUGF0aCkge1xyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGV4ZWN1dGFibGUoKSB7XHJcbiAgICByZXR1cm4gJ21jY2xhdW5jaGVyLmV4ZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZShkaXNjb3Zlcnk6IHR5cGVzLklEaXNjb3ZlcnlSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHhib3hXYXJuaW5nID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbnRleHQuYXBpLnNob3dEaWFsb2coJ2luZm8nLCAnWGJveCBTdG9yZSBQZXJtaXNzaW9ucycsIHtcclxuICAgICAgICBiYmNvZGU6ICdIYWxvOiBNQ0MgYXBwZWFycyB0byBiZSBpbnN0YWxsZWQgdGhyb3VnaCB0aGUgWGJveCBnYW1lIHN0b3JlIGFuZCB5b3VyIGFjY291bnQgJyBcclxuICAgICAgICAgICAgICArICdkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHdyaXRlIG5ldyBmaWxlcy4gVGhpcyBuZWVkcyB0byBiZSByZXNvbHZlZCBtYW51YWxseSAnXHJcbiAgICAgICAgICAgICAgKyAnYmVmb3JlIG1vZHMgY2FuIGJlIGRlcGxveWVkIFt1cmw9aHR0cHM6Ly93aWtpLm5leHVzbW9kcy5jb20vaW5kZXgucGhwL01vZGRpbmdfSGFsbzpfVGhlX01hc3Rlcl9DaGllZl9Db2xsZWN0aW9uX3dpdGhfVm9ydGV4XWFzIHNlZW4gaGVyZS5bL3VybF0nLFxyXG4gICAgICB9LCBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3NlJyB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjcmVhdGVYYm94TW9kc1BhdGggPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGlzY292ZXJ5LnBhdGguc3BsaXQocGF0aC5zZXApLmZpbHRlcihzZWcgPT4gISFzZWcpO1xyXG4gICAgICBjb25zdCBpZHggPSBzZWdtZW50cy5pbmRleE9mKCdXaW5kb3dzQXBwcycpO1xyXG4gICAgICBjb25zdCBwcm9nRmlsZXMgPSBzZWdtZW50cy5zcGxpY2UoMCwgaWR4KS5qb2luKHBhdGguc2VwKTtcclxuICAgICAgcmV0dXJuIGZzLmVuc3VyZURpcldyaXRhYmxlQXN5bmMocGF0aC5qb2luKHByb2dGaWxlcywgJ01vZGlmaWFibGVXaW5kb3dzQXBwcycsICdIYWxvTUNDJyksICgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGkuc2hvd0RpYWxvZygnaW5mbycsICdOZWVkIHRvIGNoYW5nZSBmaWxlIHBlcm1pc3Npb25zJywge1xyXG4gICAgICAgICAgdGV4dDogJ1ZvcnRleCBuZWVkcyB0byBjaGFuZ2UgdGhlIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIGdhbWUgbW9kIGRpcmVjdG9yeSBzbyBpdCAnXHJcbiAgICAgICAgICAgICAgKyAnY2FuIGluc3RhbGwgbW9kcy4gV2luZG93cyB3aWxsIGFzayBpZiB5b3Ugd2FudCB0byBhbGxvdyBWb3J0ZXggdG8gbWFrZSBjaGFuZ2VzIHRvIHlvdXIgc3lzdGVtLiAnLFxyXG4gICAgICAgIH0sIFtcclxuICAgICAgICAgIHsgbGFiZWw6ICdDYW5jZWwnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnQ29udGludWUnIH0sXHJcbiAgICAgICAgXSlcclxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09ICdDYW5jZWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5Vc2VyQ2FuY2VsZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVyciA9PiAoZXJyLmNvZGUgPT09ICdFUEVSTScpXHJcbiAgICAgICAgICA/IHhib3hXYXJuaW5nKCkgOiBQcm9taXNlLnJlamVjdChlcnIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKF9HQU1FX1NUT1JFX0lEID09PSAneGJveCcpIFxyXG4gICAgICA/IGNyZWF0ZVhib3hNb2RzUGF0aCgpXHJcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcXVlcnlQYXRoKCkge1xyXG4gICAgcmV0dXJuIHV0aWwuR2FtZVN0b3JlSGVscGVyLmZpbmRCeUFwcElkKFtTVEVBTV9JRCwgTVNfQVBQSURdKVxyXG4gICAgICAudGhlbihnYW1lID0+IHtcclxuICAgICAgICBfR0FNRV9TVE9SRV9JRCA9IGdhbWUuZ2FtZVN0b3JlSWQ7XHJcbiAgICAgICAgcmV0dXJuIGdhbWUuZ2FtZVBhdGhcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWlyZXNMYXVuY2VyID0gdXRpbC50b0JsdWUoKGdhbWVQYXRoOiBzdHJpbmcpID0+IHRoaXMuY2hlY2tMYXVuY2hlcihnYW1lUGF0aCkpO1xyXG4gIHB1YmxpYyBhc3luYyBjaGVja0xhdW5jaGVyKGdhbWVQYXRoOiBzdHJpbmcpOiBMYXVuY2hlckNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoX0dBTUVfU1RPUkVfSUQgPT09ICd4Ym94Jykge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICBsYXVuY2hlcjogJ3hib3gnLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIGFwcElkOiBNU19BUFBJRCxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBhcHBFeGVjTmFtZTogJ0hhbG9NQ0NTaGlwcGluZ05vRUFDJyB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChfR0FNRV9TVE9SRV9JRCA9PT0gJ3N0ZWFtJykge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICBsYXVuY2hlcjogJ3N0ZWFtJyxcclxuICAgICAgICBhZGRJbmZvOiB7XHJcbiAgICAgICAgICBhcHBJZDogU1RFQU1fSUQsXHJcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbJ29wdGlvbjInXSxcclxuICAgICAgICAgIGxhdW5jaFR5cGU6ICdnYW1lc3RvcmUnLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gZ2V0WGJveElkKGludGVybmFsSWQsIGZpbGVQYXRoLCBlbmNvZGluZykge1xyXG4vLyAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHhib3ggaWQgb2YgdGhlIGxhc3QgcGxheWVyXHJcbi8vICAgLy8gIHdobyByYW4gdGhlIGdhbWUuIFRoaXMgY2FuIHBvdGVudGlhbGx5IGJlIHVzZWQgdG8gbW9kIHRoZSBnYW1lXHJcbi8vICAgLy8gIG9ubHkgZm9yIHNwZWNpZmljIHhib3ggaWRzIHdoaWxlIGxlYXZpbmcgb3RoZXJzIGluIGFuIHVudGFtcGVyZWQgc3RhdGUuIChXSVApXHJcbi8vICAgcmV0dXJuIGZzLnJlYWRGaWxlQXN5bmMoZmlsZVBhdGgsIHsgZW5jb2RpbmcgfSlcclxuLy8gICAgIC50aGVuKGZpbGVEYXRhID0+IHtcclxuLy8gICAgICAgbGV0IHhtbERvYztcclxuLy8gICAgICAgdHJ5IHtcclxuLy8gICAgICAgICB4bWxEb2MgPSBwYXJzZVhtbFN0cmluZyhmaWxlRGF0YSk7XHJcbi8vICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4vLyAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBjb25zdCBnZW5lcmFsRGF0YSA9IHhtbERvYy5maW5kKCcvL0NhbXBhaWduQ2FybmFnZVJlcG9ydC9HZW5lcmFsRGF0YScpO1xyXG4vLyAgICAgICBpZiAoZ2VuZXJhbERhdGFbMF0uYXR0cignR2FtZUlkJykudmFsdWUoKSA9PT0gaW50ZXJuYWxJZCkge1xyXG4vLyAgICAgICAgIGNvbnN0IHBsYXllcnMgPSB4bWxEb2MuZmluZCgnLy9DYW1wYWlnbkNhcm5hZ2VSZXBvcnQvUGxheWVycy9QbGF5ZXJJbmZvJyk7XHJcbi8vICAgICAgICAgY29uc3QgbWFpblBsYXllciA9IHBsYXllcnMuZmluZChwbGF5ZXIgPT4gcGxheWVyLmF0dHIoJ2lzR3Vlc3QnKS52YWx1ZSgpID09PSAnZmFsc2UnKTtcclxuLy8gICAgICAgICBjb25zdCB4Ym94SWQgPSBtYWluUGxheWVyLmF0dHIoJ21YYm94VXNlcklkJykudmFsdWUoKTtcclxuLy8gICAgICAgICAvLyBUaGUgdXNlcklkIGlzIHByZWZpeGVkIHdpdGggXCIweFwiIHdoaWNoIGlzIG5vdCBuZWVkZWQuXHJcbi8vICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh4Ym94SWQuc3Vic3RyaW5nKDIpKTtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHV0aWwuRGF0YUludmFsaWQoJ1dyb25nIGludGVybmFsIGdhbWVJZCcpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSk7XHJcbi8vIH1cclxuXHJcbmNvbnN0IHJlc29sdmVHYW1lVmVyc2lvbiA9IGFzeW5jIChkaXNjb3ZlcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5qb2luKGRpc2NvdmVyeVBhdGgsICdidWlsZF90YWcudHh0Jyk7XHJcbiAgcmV0dXJuIGZzLnJlYWRGaWxlQXN5bmModmVyc2lvblBhdGgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxyXG4gICAgLnRoZW4oKHJlcykgPT4gUHJvbWlzZS5yZXNvbHZlKHJlcy5zcGxpdCgnXFxyXFxuJylbMF0udHJpbSgpKSk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGRlZmF1bHQ6IChjb250ZXh0OiB0eXBlcy5JRXh0ZW5zaW9uQ29udGV4dCkgPT4ge1xyXG4gICAgY29udGV4dC5yZWdpc3RlckdhbWUobmV3IE1hc3RlckNoaWVmQ29sbGVjdGlvbkdhbWUoY29udGV4dCkpO1xyXG5cclxuICAgIC8vIGxldCBjb2xsYXRvcjtcclxuICAgIC8vIGNvbnN0IGdldENvbGxhdG9yID0gKGxvY2FsZSkgPT4ge1xyXG4gICAgLy8gICBpZiAoKGNvbGxhdG9yID09PSB1bmRlZmluZWQpIHx8IChsb2NhbGUgIT09IGxhbmcpKSB7XHJcbiAgICAvLyAgICAgbGFuZyA9IGxvY2FsZTtcclxuICAgIC8vICAgICBjb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKGxvY2FsZSwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHJldHVybiBjb2xsYXRvcjtcclxuICAgIC8vIH07XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3Rlck1vZFR5cGUoTU9EVFlQRV9QTFVHX0FORF9QTEFZLCAxNSxcclxuICAgICAgKGdhbWVJZDogc3RyaW5nKSA9PiBnYW1lSWQgPT09IEdBTUVfSUQsICgpID0+IHVuZGVmaW5lZCwgdGVzdFBsdWdBbmRQbGF5TW9kVHlwZSBhcyBhbnksIHtcclxuICAgICAgZGVwbG95bWVudEVzc2VudGlhbDogZmFsc2UsXHJcbiAgICAgIG1lcmdlTW9kczogdHJ1ZSxcclxuICAgICAgbmFtZTogJ01DQyBQbHVnIGFuZCBQbGF5IG1vZCcsXHJcbiAgICAgIG5vQ29uZmxpY3RzOiB0cnVlLFxyXG4gICAgfSlcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtY2MtcGx1Zy1hbmQtcGxheS1pbnN0YWxsZXInLFxyXG4gICAgICAxNSwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbFBsdWdBbmRQbGF5IGFzIGFueSk7XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3Rlckluc3RhbGxlcignbWFzdGVyY2hpZWZtb2Rjb25maWdpbnN0YWxsZXInLFxyXG4gICAgICAyMCwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciBhcyBhbnksIGluc3RhbGxNb2RDb25maWcgYXMgYW55KTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtYXN0ZXJjaGllZmluc3RhbGxlcicsXHJcbiAgICAgIDI1LCB0ZXN0SW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbCBhcyBhbnkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJUYWJsZUF0dHJpYnV0ZSgnbW9kcycsIHtcclxuICAgICAgaWQ6ICdnYW1lVHlwZScsXHJcbiAgICAgIG5hbWU6ICdHYW1lKHMpJyxcclxuICAgICAgZGVzY3JpcHRpb246ICdUYXJnZXQgSGFsbyBnYW1lKHMpIGZvciB0aGlzIG1vZCcsXHJcbiAgICAgIGljb246ICdpbnNwZWN0JyxcclxuICAgICAgcGxhY2VtZW50OiAndGFibGUnLFxyXG4gICAgICBjdXN0b21SZW5kZXJlcjogKG1vZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZUltZ0RpdiA9IChlbnRyeSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdoYWxvLWltZy1kaXYnLCBrZXk6IGAke2VudHJ5LmludGVybmFsSWR9LSR7aWR4fWAgfSwgXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2ltZycsIHsgY2xhc3NOYW1lOiAnaGFsb2dhbWVpbWcnLCBzcmM6IGBmaWxlOi8vJHtlbnRyeS5pbWd9YCB9KSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHt9LCBlbnRyeS5uYW1lKSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBpbnRlcm5hbElkcyA9IHV0aWwuZ2V0U2FmZShtb2QsIFsnYXR0cmlidXRlcycsICdoYWxvR2FtZXMnXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IGhhbG9FbnRyaWVzID0gT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGludGVybmFsSWRzLmluY2x1ZGVzKEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkKSlcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IEhBTE9fR0FNRVNba2V5XSk7XHJcblxyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQsIHsgdHlwZTogJ3JvdycgfSwgXHJcbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQuRmxleCwgeyBjbGFzc05hbWU6ICdoYWxvaW1nbGF5b3V0JyB9LCBoYWxvRW50cmllcy5tYXAoKGVudHJ5LCBpZHgpID0+IGNyZWF0ZUltZ0RpdihlbnRyeSwgaWR4KSkpKTtcclxuICAgICAgfSxcclxuICAgICAgY2FsYzogKG1vZCkgPT4gdXRpbC5nZXRTYWZlKG1vZCwgWydhdHRyaWJ1dGVzJywgJ2hhbG9HYW1lcyddLCB1bmRlZmluZWQpLFxyXG4gICAgICBmaWx0ZXI6IG5ldyBPcHRpb25zRmlsdGVyKFxyXG4gICAgICAgIFtdLmNvbmNhdChbeyB2YWx1ZTogT3B0aW9uc0ZpbHRlci5FTVBUWSwgbGFiZWw6ICc8Tm9uZT4nIH1dLFxyXG4gICAgICAgIE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCwgbGFiZWw6IEhBTE9fR0FNRVNba2V5XS5uYW1lIH07XHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICAsIHRydWUsIGZhbHNlKSxcclxuICAgICAgaXNUb2dnbGVhYmxlOiB0cnVlLFxyXG4gICAgICBlZGl0OiB7fSxcclxuICAgICAgaXNTb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgIGlzR3JvdXBhYmxlOiAobW9kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxJZHMgPSB1dGlsLmdldFNhZmUobW9kLCBbJ2F0dHJpYnV0ZXMnLCAnaGFsb0dhbWVzJ10sIFtdKTtcclxuICAgICAgICBjb25zdCBoYWxvRW50cmllcyA9IE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBpbnRlcm5hbElkcy5pbmNsdWRlcyhIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCkpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiBIQUxPX0dBTUVTW2tleV0pO1xyXG5cclxuICAgICAgICBpZiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuICdNdWx0aXBsZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAoISFoYWxvRW50cmllcyAmJiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMCkpXHJcbiAgICAgICAgICAgID8gaGFsb0VudHJpZXNbMF0ubmFtZVxyXG4gICAgICAgICAgICA6ICdOb25lJztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGlzRGVmYXVsdFZpc2libGU6IHRydWUsXHJcbiAgICAgIC8vc29ydEZ1bmM6IChsaHMsIHJocykgPT4gZ2V0Q29sbGF0b3IobG9jYWxlKS5jb21wYXJlKGxocywgcmhzKSxcclxuICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlR2FtZUlkID0gc2VsZWN0b3JzLmFjdGl2ZUdhbWVJZChjb250ZXh0LmFwaS5zdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgICAgICByZXR1cm4gKGFjdGl2ZUdhbWVJZCA9PT0gR0FNRV9JRCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnRleHQub25jZSgoKSA9PiB7XHJcbiAgICAgIGNvbnRleHQuYXBpLnNldFN0eWxlc2hlZXQoJ21hc3RlcmNoaWVmc3R5bGUnLCBwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWFzdGVyY2hpZWYuc2NzcycpKTtcclxuICAgICAgY29udGV4dC5hcGkub25Bc3luYygnZGlkLWRlcGxveScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCB0cnVlKSk7XHJcbiAgICAgIGNvbnRleHQuYXBpLm9uQXN5bmMoJ2RpZC1wdXJnZScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCBmYWxzZSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG4iXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/index.ts b/game-masterchiefcollection/index.ts new file mode 100644 index 0000000..df9bd6a --- /dev/null +++ b/game-masterchiefcollection/index.ts @@ -0,0 +1,231 @@ +/* eslint-disable */ +import path from 'path'; +import { fs, types, FlexLayout, OptionsFilter, selectors, util } from 'vortex-api'; + +import * as React from 'react'; + +import { GAME_ID, HALO_GAMES, MS_APPID, STEAM_ID, MODTYPE_PLUG_AND_PLAY } from './common'; +import { LauncherConfig } from './types'; +import { testPlugAndPlayModType } from './modTypes'; +import { installPlugAndPlay, testModConfigInstaller, testPlugAndPlayInstaller, installModConfig, install, testInstaller } from './installers'; +import { applyToManifest } from './util'; + +let _GAME_STORE_ID; + +// Master chef collection +class MasterChiefCollectionGame implements types.IGame { + public context: types.IExtensionContext; + public id: string; + public name: string; + public shortName: string; + public logo: string; + public api: types.IExtensionApi; + public getGameVersion: (discoveryPath: string) => Promise; + public requiredFiles: string[]; + public supportedTools: any[]; + public environment: any; + public details: any; + public mergeMods: boolean; + + constructor(context) { + this.context = context; + this.id = GAME_ID; + this.name = 'Halo: The Master Chief Collection'; + this.shortName = 'Halo: MCC'; + this.logo = 'gameart.jpg'; + this.api = context.api; + this.getGameVersion = resolveGameVersion, + this.requiredFiles = [ + this.executable(), + ]; + this.supportedTools = [ + { + id: 'haloassemblytool', + name: 'Assembly', + logo: 'assemblytool.png', + executable: () => 'Assembly.exe', + requiredFiles: [ + 'Assembly.exe', + ], + relative: true, + }, + ]; + this.environment = { + SteamAPPId: STEAM_ID, + }; + this.details = { + steamAppId: +STEAM_ID, + }; + this.mergeMods = true; + } + + queryModPath(gamePath) { + return '.'; + } + + executable() { + return 'mcclauncher.exe'; + } + + public async prepare(discovery: types.IDiscoveryResult): Promise { + return Promise.resolve(); + } + + public queryPath() { + return util.GameStoreHelper.findByAppId([STEAM_ID, MS_APPID]) + .then(game => { + _GAME_STORE_ID = game.gameStoreId; + return game.gamePath + }); + } + + public requiresLauncer = util.toBlue((gamePath: string) => this.checkLauncher(gamePath)); + public async checkLauncher(gamePath: string): LauncherConfig | undefined { + if (_GAME_STORE_ID === 'xbox') { + return Promise.resolve({ + launcher: 'xbox', + addInfo: { + appId: MS_APPID, + parameters: [ + { appExecName: 'HaloMCCShippingNoEAC' }, + ], + } + }); + } else if (_GAME_STORE_ID === 'steam') { + return Promise.resolve({ + launcher: 'steam', + addInfo: { + appId: STEAM_ID, + parameters: ['option2'], + launchType: 'gamestore', + } + }); + } + + return Promise.resolve(undefined); + } +} + +// function getXboxId(internalId, filePath, encoding) { +// // This function will return the xbox id of the last player +// // who ran the game. This can potentially be used to mod the game +// // only for specific xbox ids while leaving others in an untampered state. (WIP) +// return fs.readFileAsync(filePath, { encoding }) +// .then(fileData => { +// let xmlDoc; +// try { +// xmlDoc = parseXmlString(fileData); +// } catch (err) { +// return Promise.reject(err); +// } + +// const generalData = xmlDoc.find('//CampaignCarnageReport/GeneralData'); +// if (generalData[0].attr('GameId').value() === internalId) { +// const players = xmlDoc.find('//CampaignCarnageReport/Players/PlayerInfo'); +// const mainPlayer = players.find(player => player.attr('isGuest').value() === 'false'); +// const xboxId = mainPlayer.attr('mXboxUserId').value(); +// // The userId is prefixed with "0x" which is not needed. +// return Promise.resolve(xboxId.substring(2)); +// } else { +// return Promise.reject(new util.DataInvalid('Wrong internal gameId')); +// } +// }); +// } + +const resolveGameVersion = async (discoveryPath: string): Promise => { + const versionPath = path.join(discoveryPath, 'build_tag.txt'); + return fs.readFileAsync(versionPath, { encoding: 'utf8' }) + .then((res) => Promise.resolve(res.split('\r\n')[0].trim())); +} + +module.exports = { + default: (context: types.IExtensionContext) => { + context.registerGame(new MasterChiefCollectionGame(context)); + + // let collator; + // const getCollator = (locale) => { + // if ((collator === undefined) || (locale !== lang)) { + // lang = locale; + // collator = new Intl.Collator(locale, { sensitivity: 'base' }); + // } + // return collator; + // }; + + context.registerModType(MODTYPE_PLUG_AND_PLAY, 15, + (gameId: string) => gameId === GAME_ID, () => undefined, testPlugAndPlayModType as any, { + deploymentEssential: false, + mergeMods: true, + name: 'MCC Plug and Play mod', + noConflicts: true, + }) + + context.registerInstaller('mcc-plug-and-play-installer', + 15, testPlugAndPlayInstaller as any, installPlugAndPlay as any); + + context.registerInstaller('masterchiefmodconfiginstaller', + 20, testModConfigInstaller as any, installModConfig as any); + + context.registerInstaller('masterchiefinstaller', + 25, testInstaller as any, install as any); + + context.registerTableAttribute('mods', { + id: 'gameType', + name: 'Game(s)', + description: 'Target Halo game(s) for this mod', + icon: 'inspect', + placement: 'table', + customRenderer: (mod) => { + const createImgDiv = (entry, idx) => { + return React.createElement('div', { className: 'halo-img-div', key: `${entry.internalId}-${idx}` }, + React.createElement('img', { className: 'halogameimg', src: `file://${entry.img}` }), + React.createElement('span', {}, entry.name)) + }; + + const internalIds = util.getSafe(mod, ['attributes', 'haloGames'], []); + const haloEntries = Object.keys(HALO_GAMES) + .filter(key => internalIds.includes(HALO_GAMES[key].internalId)) + .map(key => HALO_GAMES[key]); + + return React.createElement(FlexLayout, { type: 'row' }, + React.createElement(FlexLayout.Flex, { className: 'haloimglayout' }, haloEntries.map((entry, idx) => createImgDiv(entry, idx)))); + }, + calc: (mod) => util.getSafe(mod, ['attributes', 'haloGames'], undefined), + filter: new OptionsFilter( + [].concat([{ value: OptionsFilter.EMPTY, label: '' }], + Object.keys(HALO_GAMES) + .map(key => { + return { value: HALO_GAMES[key].internalId, label: HALO_GAMES[key].name }; + })) + , true, false), + isToggleable: true, + edit: {}, + isSortable: false, + isGroupable: (mod) => { + const internalIds = util.getSafe(mod, ['attributes', 'haloGames'], []); + const haloEntries = Object.keys(HALO_GAMES) + .filter(key => internalIds.includes(HALO_GAMES[key].internalId)) + .map(key => HALO_GAMES[key]); + + if (haloEntries.length > 1) { + return 'Multiple'; + } else { + return (!!haloEntries && (haloEntries.length > 0)) + ? haloEntries[0].name + : 'None'; + } + }, + isDefaultVisible: true, + //sortFunc: (lhs, rhs) => getCollator(locale).compare(lhs, rhs), + condition: () => { + const activeGameId = selectors.activeGameId(context.api.store.getState()); + return (activeGameId === GAME_ID); + } + }); + + context.once(() => { + context.api.setStylesheet('masterchiefstyle', path.join(__dirname, 'masterchief.scss')); + context.api.onAsync('did-deploy', async (profileId: string) => applyToManifest(context.api, true)); + context.api.onAsync('did-purge', async (profileId: string) => applyToManifest(context.api, false)); + }); + } +}; diff --git a/game-masterchiefcollection/info.json b/game-masterchiefcollection/info.json index 6ee981b..6212a6e 100644 --- a/game-masterchiefcollection/info.json +++ b/game-masterchiefcollection/info.json @@ -1,6 +1,6 @@ { "name": "Game: Halo: The Master Chief Collection", "author": "Black Tree Gaming Ltd.", - "version": "1.0.2", + "version": "1.1.0", "description": "Support for Halo: The Master Chief Collection" } \ No newline at end of file diff --git a/game-masterchiefcollection/installers.js b/game-masterchiefcollection/installers.js new file mode 100644 index 0000000..e892dd7 --- /dev/null +++ b/game-masterchiefcollection/installers.js @@ -0,0 +1,173 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.install = exports.testInstaller = exports.installModConfig = exports.testModConfigInstaller = exports.installPlugAndPlay = exports.testPlugAndPlayInstaller = void 0; +const path_1 = __importDefault(require("path")); +const rjson = __importStar(require("relaxed-json")); +const vortex_api_1 = require("vortex-api"); +const common_1 = require("./common"); +const util_1 = require("./util"); +function testPlugAndPlayInstaller(files, gameId) { + return __awaiter(this, void 0, void 0, function* () { + const hasModInfoFile = files.some(file => path_1.default.basename(file).toLowerCase() === common_1.MOD_INFO_JSON_FILE); + return Promise.resolve({ supported: (gameId === common_1.GAME_ID) && hasModInfoFile, requiredFiles: [] }); + }); +} +exports.testPlugAndPlayInstaller = testPlugAndPlayInstaller; +function installPlugAndPlay(files, destinationPath) { + return __awaiter(this, void 0, void 0, function* () { + const modInfo = files.find(file => path_1.default.basename(file).toLowerCase() === common_1.MOD_INFO_JSON_FILE); + const modInfoData = yield vortex_api_1.fs.readFileAsync(path_1.default.join(destinationPath, modInfo), { encoding: 'utf8' }); + const parsed = rjson.parse(modInfoData); + const gameInstruction = { + type: 'attribute', + key: 'haloGames', + value: [common_1.HALO_GAMES[parsed.Engine.toLowerCase()].internalId], + }; + const infoSegments = modInfo.split(path_1.default.sep); + const modFolderIndex = infoSegments.length >= 2 ? infoSegments.length - 2 : 0; + const filtered = files.filter(file => path_1.default.extname(path_1.default.basename(file)) !== ''); + const instructions = filtered.map(file => { + const segments = file.split(path_1.default.sep); + const destination = segments.slice(modFolderIndex); + return { + type: 'copy', + source: file, + destination: destination.join(path_1.default.sep), + }; + }); + instructions.push(gameInstruction); + return Promise.resolve({ instructions }); + }); +} +exports.installPlugAndPlay = installPlugAndPlay; +function testModConfigInstaller(files, gameId) { + const isAssemblyOnlyMod = () => { + return (files.find(file => path_1.default.extname(file) === common_1.ASSEMBLY_EXT) !== undefined) + && (files.find(file => path_1.default.extname(file) === common_1.MAP_EXT) === undefined); + }; + return (gameId !== common_1.GAME_ID) + ? Promise.resolve({ supported: false, requiredFiles: [] }) + : Promise.resolve({ + supported: (files.find(file => path_1.default.basename(file) === common_1.MOD_CONFIG_FILE) !== undefined) + && !isAssemblyOnlyMod(), + requiredFiles: [], + }); +} +exports.testModConfigInstaller = testModConfigInstaller; +function installModConfig(files, destinationPath) { + return __awaiter(this, void 0, void 0, function* () { + const modConfigFile = files.find(file => path_1.default.basename(file) === common_1.MOD_CONFIG_FILE); + const filtered = files.filter(file => { + const segments = file.split(path_1.default.sep); + const lastElementExt = path_1.default.extname(segments[segments.length - 1]); + return (modConfigFile !== file) && ['', '.txt', common_1.ASSEMBLY_EXT].indexOf(lastElementExt) === -1; + }); + const configData = yield vortex_api_1.fs.readFileAsync(path_1.default.join(destinationPath, modConfigFile), { encoding: 'utf8' }); + let data; + try { + data = rjson.parse(vortex_api_1.util.deBOM(configData)); + } + catch (err) { + (0, vortex_api_1.log)('error', 'Unable to parse modpack_config.cfg', err); + return Promise.reject(new vortex_api_1.util.DataInvalid('Invalid modpack_config.cfg file')); + } + if (!data.entries) { + return Promise.reject(new vortex_api_1.util.DataInvalid('modpack_config.cfg file contains no entries')); + } + const instructions = filtered.reduce((accum, file) => { + const matchingEntry = data.entries.find(entry => ('src' in entry) && (entry.src.toLowerCase() === file.toLowerCase())); + if (!!matchingEntry) { + const destination = matchingEntry.dest.substring(common_1.MOD_CONFIG_DEST_ELEMENT.length); + accum.push({ + type: 'copy', + source: file, + destination, + }); + } + else { + (0, vortex_api_1.log)('warn', 'Failed to find matching manifest entry for file in archive', file); + } + return accum; + }, []); + return Promise.resolve({ instructions }); + }); +} +exports.installModConfig = installModConfig; +function testInstaller(files, gameId) { + if (gameId !== common_1.GAME_ID) { + return Promise.resolve({ supported: false, requiredFiles: [] }); + } + const haloGames = (0, util_1.identifyHaloGames)(files); + return Promise.resolve({ + supported: (haloGames.length > 0), + requiredFiles: [], + }); +} +exports.testInstaller = testInstaller; +function install(files, destinationPath) { + return __awaiter(this, void 0, void 0, function* () { + const haloGames = (0, util_1.identifyHaloGames)(files); + const internalIds = haloGames.map(game => game.internalId); + const attrInstruction = { + type: 'attribute', + key: 'haloGames', + value: internalIds, + }; + const instructions = haloGames.reduce((accum, haloGame) => { + const filtered = files.filter(file => { + const segments = file.split(path_1.default.sep).filter(seg => !!seg); + return (path_1.default.extname(segments[segments.length - 1]) !== '') + && (segments.indexOf(haloGame.modsPath) !== -1); + }); + filtered.forEach(element => { + const segments = element.split(path_1.default.sep).filter(seg => !!seg); + const rootIdx = segments.indexOf(haloGame.modsPath); + const destination = segments.splice(rootIdx).join(path_1.default.sep); + accum.push({ + type: 'copy', + source: element, + destination + }); + }); + return accum; + }, [attrInstruction]); + return Promise.resolve({ instructions }); + }); +} +exports.install = install; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluc3RhbGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsb0RBQXNDO0FBQ3RDLDJDQUFrRDtBQUVsRCxxQ0FBb0k7QUFFcEksaUNBQTJDO0FBRTNDLFNBQXNCLHdCQUF3QixDQUFDLEtBQWUsRUFBRSxNQUFjOztRQUM1RSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSywyQkFBa0IsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxnQkFBTyxDQUFDLElBQUksY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7Q0FBQTtBQUhELDREQUdDO0FBRUQsU0FBc0Isa0JBQWtCLENBQUMsS0FBZSxFQUFFLGVBQXVCOztRQUMvRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSywyQkFBa0IsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sTUFBTSxHQUFlLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFlLENBQUM7UUFDbEUsTUFBTSxlQUFlLEdBQXVCO1lBQzFDLElBQUks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QU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULElBQUksRUFBRSxNQUFNO29CQUNaLE1BQU0sRUFBRSxPQUFPO29CQUNmLFdBQVc7aUJBQ1osQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQUE7QUE3QkQsMEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIHJqc29uIGZyb20gJ3JlbGF4ZWQtanNvbic7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgbG9nLCB1dGlsIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBNT0RfQ09ORklHX0RFU1RfRUxFTUVOVCwgTU9EX0lORk9fSlNPTl9GSUxFLCBHQU1FX0lELCBNT0RfQ09ORklHX0ZJTEUsIEFTU0VNQkxZX0VYVCwgTUFQX0VYVCwgSEFMT19HQU1FUyB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgSU1vZENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBpZGVudGlmeUhhbG9HYW1lcyB9IGZyb20gJy4vdXRpbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyKGZpbGVzOiBzdHJpbmdbXSwgZ2FtZUlkOiBzdHJpbmcpIHtcclxuICBjb25zdCBoYXNNb2RJbmZvRmlsZSA9IGZpbGVzLnNvbWUoZmlsZSA9PiBwYXRoLmJhc2VuYW1lKGZpbGUpLnRvTG93ZXJDYXNlKCkgPT09IE1PRF9JTkZPX0pTT05fRklMRSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogKGdhbWVJZCA9PT0gR0FNRV9JRCkgJiYgaGFzTW9kSW5mb0ZpbGUsIHJlcXVpcmVkRmlsZXM6IFtdIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdBbmRQbGF5KGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBtb2RJbmZvID0gZmlsZXMuZmluZChmaWxlID0+IHBhdGguYmFzZW5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKSA9PT0gTU9EX0lORk9fSlNPTl9GSUxFKTtcclxuICBjb25zdCBtb2RJbmZvRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlQXN5bmMocGF0aC5qb2luKGRlc3RpbmF0aW9uUGF0aCwgbW9kSW5mbyksIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICBjb25zdCBwYXJzZWQ6IElNb2RDb25maWcgPSByanNvbi5wYXJzZShtb2RJbmZvRGF0YSkgYXMgSU1vZENvbmZpZztcclxuICBjb25zdCBnYW1lSW5zdHJ1Y3Rpb246IHR5cGVzLklJbnN0cnVjdGlvbiA9IHtcclxuICAgIHR5cGU6ICdhdHRyaWJ1dGUnLFxyXG4gICAga2V5OiAnaGFsb0dhbWVzJyxcclxuICAgIHZhbHVlOiBbSEFMT19HQU1FU1twYXJzZWQuRW5naW5lLnRvTG93ZXJDYXNlKCldLmludGVybmFsSWRdLFxyXG4gIH1cclxuICBjb25zdCBpbmZvU2VnbWVudHMgPSBtb2RJbmZvLnNwbGl0KHBhdGguc2VwKTtcclxuICBjb25zdCBtb2RGb2xkZXJJbmRleCA9IGluZm9TZWdtZW50cy5sZW5ndGggPj0gMiA/IGluZm9TZWdtZW50cy5sZW5ndGggLSAyIDogMDtcclxuICBjb25zdCBmaWx0ZXJlZCA9IGZpbGVzLmZpbHRlcihmaWxlID0+IHBhdGguZXh0bmFtZShwYXRoLmJhc2VuYW1lKGZpbGUpKSAhPT0gJycpO1xyXG4gIGNvbnN0IGluc3RydWN0aW9uczogdHlwZXMuSUluc3RydWN0aW9uW10gPSBmaWx0ZXJlZC5tYXAoZmlsZSA9PiB7XHJcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGUuc3BsaXQocGF0aC5zZXApO1xyXG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBzZWdtZW50cy5zbGljZShtb2RGb2xkZXJJbmRleCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0eXBlOiAnY29weScsXHJcbiAgICAgIHNvdXJjZTogZmlsZSxcclxuICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLmpvaW4ocGF0aC5zZXApLFxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgaW5zdHJ1Y3Rpb25zLnB1c2goZ2FtZUluc3RydWN0aW9uKTtcclxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgaW5zdHJ1Y3Rpb25zIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGVzdE1vZENvbmZpZ0luc3RhbGxlcihmaWxlcywgZ2FtZUlkKSB7XHJcbiAgY29uc3QgaXNBc3NlbWJseU9ubHlNb2QgPSAoKSA9PiB7XHJcbiAgICAvLyBUaGUgcHJlc2Vuc2Ugb2YgYW4gLmFzbXAgZmlsZSB3aXRob3V0IGFueSAubWFwIGZpbGVzIGlzIGEgY2xlYXIgaW5kaWNhdGlvblxyXG4gICAgLy8gIHRoYXQgdGhpcyBtb2QgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIHVzaW5nIHRoZSBBc3NlbWJseSB0b29sIHdoaWNoIHdlJ3ZlXHJcbiAgICAvLyAgeWV0IHRvIGludGVncmF0ZSBpbnRvIFZvcnRleC4gVGhpcyBpbnN0YWxsZXIgd2lsbCBub3QgaW5zdGFsbCB0aGVzZSBtb2RzLlxyXG4gICAgcmV0dXJuIChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5leHRuYW1lKGZpbGUpID09PSBBU1NFTUJMWV9FWFQpICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICYmIChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5leHRuYW1lKGZpbGUpID09PSBNQVBfRVhUKSA9PT0gdW5kZWZpbmVkKTtcclxuICB9O1xyXG4gIHJldHVybiAoZ2FtZUlkICE9PSBHQU1FX0lEKVxyXG4gICA/IFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogZmFsc2UsIHJlcXVpcmVkRmlsZXM6IFtdIH0pXHJcbiAgIDogUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICBzdXBwb3J0ZWQ6IChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5iYXNlbmFtZShmaWxlKSA9PT0gTU9EX0NPTkZJR19GSUxFKSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAmJiAhaXNBc3NlbWJseU9ubHlNb2QoKSxcclxuICAgICByZXF1aXJlZEZpbGVzOiBbXSxcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE1vZENvbmZpZyhmaWxlczogc3RyaW5nW10sIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nKSB7XHJcbiAgLy8gRmluZCB0aGUgbW9kIGNvbmZpZyBmaWxlIGFuZCB1c2UgaXQgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9ucy5cclxuICBjb25zdCBtb2RDb25maWdGaWxlID0gZmlsZXMuZmluZChmaWxlID0+IHBhdGguYmFzZW5hbWUoZmlsZSkgPT09IE1PRF9DT05GSUdfRklMRSk7XHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiB7XHJcbiAgICAvLyBObyBkaXJlY3RvcmllcywgYXNzZW1ibHkgdG9vbCBmaWxlcywgcmVhZG1lcyBvciBtb2QgY29uZmlnIGZpbGVzLlxyXG4gICAgY29uc3Qgc2VnbWVudHMgPSBmaWxlLnNwbGl0KHBhdGguc2VwKTtcclxuICAgIGNvbnN0IGxhc3RFbGVtZW50RXh0ID0gcGF0aC5leHRuYW1lKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKTtcclxuICAgIHJldHVybiAobW9kQ29uZmlnRmlsZSAhPT0gZmlsZSkgJiYgWycnLCAnLnR4dCcsIEFTU0VNQkxZX0VYVF0uaW5kZXhPZihsYXN0RWxlbWVudEV4dCkgPT09IC0xO1xyXG4gIH0pO1xyXG4gIGNvbnN0IGNvbmZpZ0RhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZUFzeW5jKHBhdGguam9pbihkZXN0aW5hdGlvblBhdGgsIG1vZENvbmZpZ0ZpbGUpLCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XHJcbiAgbGV0IGRhdGE7XHJcbiAgdHJ5IHtcclxuICAgIGRhdGEgPSByanNvbi5wYXJzZSh1dGlsLmRlQk9NKGNvbmZpZ0RhdGEpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGxvZygnZXJyb3InLCAnVW5hYmxlIHRvIHBhcnNlIG1vZHBhY2tfY29uZmlnLmNmZycsIGVycik7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHV0aWwuRGF0YUludmFsaWQoJ0ludmFsaWQgbW9kcGFja19jb25maWcuY2ZnIGZpbGUnKSk7XHJcbiAgfVxyXG5cclxuICBpZiAoIWRhdGEuZW50cmllcykge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyB1dGlsLkRhdGFJbnZhbGlkKCdtb2RwYWNrX2NvbmZpZy5jZmcgZmlsZSBjb250YWlucyBubyBlbnRyaWVzJykpXHJcbiAgfVxyXG5cclxuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmaWx0ZXJlZC5yZWR1Y2UoKGFjY3VtLCBmaWxlKSA9PiB7XHJcbiAgICBjb25zdCBtYXRjaGluZ0VudHJ5ID0gZGF0YS5lbnRyaWVzLmZpbmQoZW50cnkgPT5cclxuICAgICAgKCdzcmMnIGluIGVudHJ5KSAmJiAoZW50cnkuc3JjLnRvTG93ZXJDYXNlKCkgPT09IGZpbGUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgaWYgKCEhbWF0Y2hpbmdFbnRyeSkge1xyXG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG1hdGNoaW5nRW50cnkuZGVzdC5zdWJzdHJpbmcoTU9EX0NPTkZJR19ERVNUX0VMRU1FTlQubGVuZ3RoKTtcclxuICAgICAgYWNjdW0ucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ2NvcHknLFxyXG4gICAgICAgIHNvdXJjZTogZmlsZSxcclxuICAgICAgICBkZXN0aW5hdGlvbixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGlzIG1heSBqdXN0IGJlIGEgcG9pbnRsZXNzIGFkZGl0aW9uIGJ5IHRoZSBtb2QgYXV0aG9yIC0gd2UncmUgZ29pbmcgdG8gbG9nXHJcbiAgICAgIC8vICB0aGlzIGFuZCBjb250aW51ZS5cclxuICAgICAgbG9nKCd3YXJuJywgJ0ZhaWxlZCB0byBmaW5kIG1hdGNoaW5nIG1hbmlmZXN0IGVudHJ5IGZvciBmaWxlIGluIGFyY2hpdmUnLCBmaWxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWNjdW07XHJcbiAgICB9LCBbXSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGluc3RydWN0aW9ucyB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RJbnN0YWxsZXIoZmlsZXMsIGdhbWVJZCkge1xyXG4gIGlmIChnYW1lSWQgIT09IEdBTUVfSUQpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBzdXBwb3J0ZWQ6IGZhbHNlLCByZXF1aXJlZEZpbGVzOiBbXSB9KTtcclxuICB9XHJcbiAgY29uc3QgaGFsb0dhbWVzID0gaWRlbnRpZnlIYWxvR2FtZXMoZmlsZXMpO1xyXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgc3VwcG9ydGVkOiAoaGFsb0dhbWVzLmxlbmd0aCA+IDApLFxyXG4gICAgcmVxdWlyZWRGaWxlczogW10sXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsKGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBoYWxvR2FtZXMgPSAgaWRlbnRpZnlIYWxvR2FtZXMoZmlsZXMpO1xyXG4gIGNvbnN0IGludGVybmFsSWRzID0gaGFsb0dhbWVzLm1hcChnYW1lID0+IGdhbWUuaW50ZXJuYWxJZCk7XHJcbiAgY29uc3QgYXR0ckluc3RydWN0aW9uOiB0eXBlcy5JSW5zdHJ1Y3Rpb24gPSB7XHJcbiAgICB0eXBlOiAnYXR0cmlidXRlJyxcclxuICAgIGtleTogJ2hhbG9HYW1lcycsXHJcbiAgICB2YWx1ZTogaW50ZXJuYWxJZHMsXHJcbiAgfVxyXG4gICAgXHJcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5JSW5zdHJ1Y3Rpb25bXSA9IGhhbG9HYW1lcy5yZWR1Y2UoKGFjY3VtLCBoYWxvR2FtZSkgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKHNlZyA9PiAhIXNlZyk7XHJcbiAgICAgIHJldHVybiAocGF0aC5leHRuYW1lKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKSAhPT0gJycpXHJcbiAgICAgICAgJiYgKHNlZ21lbnRzLmluZGV4T2YoaGFsb0dhbWUubW9kc1BhdGgpICE9PSAtMSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmaWx0ZXJlZC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGVsZW1lbnQuc3BsaXQocGF0aC5zZXApLmZpbHRlcihzZWcgPT4gISFzZWcpO1xyXG4gICAgICBjb25zdCByb290SWR4ID0gc2VnbWVudHMuaW5kZXhPZihoYWxvR2FtZS5tb2RzUGF0aCk7XHJcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc2VnbWVudHMuc3BsaWNlKHJvb3RJZHgpLmpvaW4ocGF0aC5zZXApO1xyXG4gICAgICBhY2N1bS5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnY29weScsXHJcbiAgICAgICAgc291cmNlOiBlbGVtZW50LFxyXG4gICAgICAgIGRlc3RpbmF0aW9uXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYWNjdW07XHJcbiAgfSwgW2F0dHJJbnN0cnVjdGlvbl0pO1xyXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBpbnN0cnVjdGlvbnMgfSk7XHJcbn0iXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/installers.ts b/game-masterchiefcollection/installers.ts new file mode 100644 index 0000000..38057b5 --- /dev/null +++ b/game-masterchiefcollection/installers.ts @@ -0,0 +1,141 @@ +/* eslint-disable */ +import path from 'path'; +import * as rjson from 'relaxed-json'; +import { fs, types, log, util } from 'vortex-api'; + +import { MOD_CONFIG_DEST_ELEMENT, MOD_INFO_JSON_FILE, GAME_ID, MOD_CONFIG_FILE, ASSEMBLY_EXT, MAP_EXT, HALO_GAMES } from './common'; +import { IModConfig } from './types'; +import { identifyHaloGames } from './util'; + +export async function testPlugAndPlayInstaller(files: string[], gameId: string) { + const hasModInfoFile = files.some(file => path.basename(file).toLowerCase() === MOD_INFO_JSON_FILE); + return Promise.resolve({ supported: (gameId === GAME_ID) && hasModInfoFile, requiredFiles: [] }); +} + +export async function installPlugAndPlay(files: string[], destinationPath: string) { + const modInfo = files.find(file => path.basename(file).toLowerCase() === MOD_INFO_JSON_FILE); + const modInfoData = await fs.readFileAsync(path.join(destinationPath, modInfo), { encoding: 'utf8' }); + const parsed: IModConfig = rjson.parse(modInfoData) as IModConfig; + const gameInstruction: types.IInstruction = { + type: 'attribute', + key: 'haloGames', + value: [HALO_GAMES[parsed.Engine.toLowerCase()].internalId], + } + const infoSegments = modInfo.split(path.sep); + const modFolderIndex = infoSegments.length >= 2 ? infoSegments.length - 2 : 0; + const filtered = files.filter(file => path.extname(path.basename(file)) !== ''); + const instructions: types.IInstruction[] = filtered.map(file => { + const segments = file.split(path.sep); + const destination = segments.slice(modFolderIndex); + return { + type: 'copy', + source: file, + destination: destination.join(path.sep), + }; + }); + + instructions.push(gameInstruction); + return Promise.resolve({ instructions }); +} + +export function testModConfigInstaller(files, gameId) { + const isAssemblyOnlyMod = () => { + // The presense of an .asmp file without any .map files is a clear indication + // that this mod can only be installed using the Assembly tool which we've + // yet to integrate into Vortex. This installer will not install these mods. + return (files.find(file => path.extname(file) === ASSEMBLY_EXT) !== undefined) + && (files.find(file => path.extname(file) === MAP_EXT) === undefined); + }; + return (gameId !== GAME_ID) + ? Promise.resolve({ supported: false, requiredFiles: [] }) + : Promise.resolve({ + supported: (files.find(file => path.basename(file) === MOD_CONFIG_FILE) !== undefined) + && !isAssemblyOnlyMod(), + requiredFiles: [], + }); +} + +export async function installModConfig(files: string[], destinationPath: string) { + // Find the mod config file and use it to build the instructions. + const modConfigFile = files.find(file => path.basename(file) === MOD_CONFIG_FILE); + const filtered = files.filter(file => { + // No directories, assembly tool files, readmes or mod config files. + const segments = file.split(path.sep); + const lastElementExt = path.extname(segments[segments.length - 1]); + return (modConfigFile !== file) && ['', '.txt', ASSEMBLY_EXT].indexOf(lastElementExt) === -1; + }); + const configData = await fs.readFileAsync(path.join(destinationPath, modConfigFile), { encoding: 'utf8' }); + let data; + try { + data = rjson.parse(util.deBOM(configData)); + } catch (err) { + log('error', 'Unable to parse modpack_config.cfg', err); + return Promise.reject(new util.DataInvalid('Invalid modpack_config.cfg file')); + } + + if (!data.entries) { + return Promise.reject(new util.DataInvalid('modpack_config.cfg file contains no entries')) + } + + const instructions = filtered.reduce((accum, file) => { + const matchingEntry = data.entries.find(entry => + ('src' in entry) && (entry.src.toLowerCase() === file.toLowerCase())); + if (!!matchingEntry) { + const destination = matchingEntry.dest.substring(MOD_CONFIG_DEST_ELEMENT.length); + accum.push({ + type: 'copy', + source: file, + destination, + }); + } else { + // This may just be a pointless addition by the mod author - we're going to log + // this and continue. + log('warn', 'Failed to find matching manifest entry for file in archive', file); + } + + return accum; + }, []); + return Promise.resolve({ instructions }); +} + +export function testInstaller(files, gameId) { + if (gameId !== GAME_ID) { + return Promise.resolve({ supported: false, requiredFiles: [] }); + } + const haloGames = identifyHaloGames(files); + return Promise.resolve({ + supported: (haloGames.length > 0), + requiredFiles: [], + }); +} + +export async function install(files: string[], destinationPath: string) { + const haloGames = identifyHaloGames(files); + const internalIds = haloGames.map(game => game.internalId); + const attrInstruction: types.IInstruction = { + type: 'attribute', + key: 'haloGames', + value: internalIds, + } + + const instructions: types.IInstruction[] = haloGames.reduce((accum, haloGame) => { + const filtered = files.filter(file => { + const segments = file.split(path.sep).filter(seg => !!seg); + return (path.extname(segments[segments.length - 1]) !== '') + && (segments.indexOf(haloGame.modsPath) !== -1); + }); + + filtered.forEach(element => { + const segments = element.split(path.sep).filter(seg => !!seg); + const rootIdx = segments.indexOf(haloGame.modsPath); + const destination = segments.splice(rootIdx).join(path.sep); + accum.push({ + type: 'copy', + source: element, + destination + }); + }); + return accum; + }, [attrInstruction]); + return Promise.resolve({ instructions }); +} \ No newline at end of file diff --git a/game-masterchiefcollection/modTypes.js b/game-masterchiefcollection/modTypes.js new file mode 100644 index 0000000..9146e1f --- /dev/null +++ b/game-masterchiefcollection/modTypes.js @@ -0,0 +1,25 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.testPlugAndPlayModType = void 0; +const path_1 = __importDefault(require("path")); +const common_1 = require("./common"); +function testPlugAndPlayModType(instr) { + return __awaiter(this, void 0, void 0, function* () { + const modInfo = instr.find(instr => instr.type === 'copy' && path_1.default.basename(instr.source).toLowerCase() === common_1.MOD_INFO_JSON_FILE); + return modInfo !== undefined; + }); +} +exports.testPlugAndPlayModType = testPlugAndPlayModType; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2RUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBd0I7QUFFeEIscUNBQThDO0FBRTlDLFNBQXNCLHNCQUFzQixDQUFDLEtBQTJCOztRQUN0RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksY0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssMkJBQWtCLENBQUMsQ0FBQztRQUMvSCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUM7SUFDL0IsQ0FBQztDQUFBO0FBSEQsd0RBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuaW1wb3J0IHsgTU9EX0lORk9fSlNPTl9GSUxFIH0gZnJvbSAnLi9jb21tb24nO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RQbHVnQW5kUGxheU1vZFR5cGUoaW5zdHI6IHR5cGVzLklJbnN0cnVjdGlvbltdKSB7XHJcbiAgY29uc3QgbW9kSW5mbyA9IGluc3RyLmZpbmQoaW5zdHIgPT4gaW5zdHIudHlwZSA9PT0gJ2NvcHknICYmIHBhdGguYmFzZW5hbWUoaW5zdHIuc291cmNlKS50b0xvd2VyQ2FzZSgpID09PSBNT0RfSU5GT19KU09OX0ZJTEUpO1xyXG4gIHJldHVybiBtb2RJbmZvICE9PSB1bmRlZmluZWQ7XHJcbn0iXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/modTypes.ts b/game-masterchiefcollection/modTypes.ts new file mode 100644 index 0000000..2c9b38d --- /dev/null +++ b/game-masterchiefcollection/modTypes.ts @@ -0,0 +1,8 @@ +import path from 'path'; +import { types } from 'vortex-api'; +import { MOD_INFO_JSON_FILE } from './common'; + +export async function testPlugAndPlayModType(instr: types.IInstruction[]) { + const modInfo = instr.find(instr => instr.type === 'copy' && path.basename(instr.source).toLowerCase() === MOD_INFO_JSON_FILE); + return modInfo !== undefined; +} \ No newline at end of file diff --git a/game-masterchiefcollection/types.js b/game-masterchiefcollection/types.js new file mode 100644 index 0000000..c9f4058 --- /dev/null +++ b/game-masterchiefcollection/types.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSGFsb0dhbWUge1xyXG4gIGludGVybmFsSWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kc1BhdGg6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RJZGVudGlmaWVyIHtcclxuICBNb2RHdWlkOiBzdHJpbmc7XHJcbiAgSG9zdGVkTW9kSWRzOiB7XHJcbiAgICAgIFN0ZWFtV29ya3Nob3BJZDogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVmVyc2lvbiB7XHJcbiAgTWFqb3I6IG51bWJlcjtcclxuICBNaW5vcjogbnVtYmVyO1xyXG4gIFBhdGNoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVGl0bGVEZXNjcmlwdGlvbiB7XHJcbiAgTmV1dHJhbDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSU1vZENvbnRlbnRzIHtcclxuICBIYXNCYWNrZ3JvdW5kVmlkZW9zOiBib29sZWFuO1xyXG4gIEhhc05hbWVwbGF0ZXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FtZU1vZENvbnRlbnRzIHtcclxuICBIYXNTaGFyZWRGaWxlczogYm9vbGVhbjtcclxuICBIYXNDYW1wYWlnbjogYm9vbGVhbjtcclxuICBIYXNTcGFydGFuT3BzOiBib29sZWFuO1xyXG4gIE11bHRpcGxheWVyTWFwczogc3RyaW5nW107XHJcbiAgRmlyZWZpZ2h0TWFwczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU1vZENvbmZpZyB7XHJcbiAgTW9kSWRlbnRpZmllcjogSU1vZElkZW50aWZpZXI7XHJcbiAgTW9kVmVyc2lvbjogSVZlcnNpb247XHJcbiAgTWluQXBwVmVyc2lvbjogSVZlcnNpb247XHJcbiAgTWF4QXBwVmVyc2lvbjogSVZlcnNpb247XHJcbiAgRW5naW5lOiBzdHJpbmc7XHJcbiAgVGl0bGU6IElUaXRsZURlc2NyaXB0aW9uO1xyXG4gIERlc2NyaXB0aW9uOiBJVGl0bGVEZXNjcmlwdGlvbjtcclxuICBJbmhlcml0U2hhcmVkRmlsZXM6IHN0cmluZztcclxuICBNb2RDb250ZW50czogSU1vZENvbnRlbnRzO1xyXG4gIEdhbWVNb2RDb250ZW50czogSUdhbWVNb2RDb250ZW50cztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF1bmNoZXJDb25maWcgPSBQcm9taXNlPHtsYXVuY2hlcjogc3RyaW5nOyBhZGRJbmZvPzogYW55OyB9PjsiXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/types.ts b/game-masterchiefcollection/types.ts new file mode 100644 index 0000000..d9b4228 --- /dev/null +++ b/game-masterchiefcollection/types.ts @@ -0,0 +1,51 @@ +export interface IHaloGame { + internalId: string; + name: string; + modsPath: string; + img: string; +} + +interface IModIdentifier { + ModGuid: string; + HostedModIds: { + SteamWorkshopId: number; + }; +} + +interface IVersion { + Major: number; + Minor: number; + Patch: number; +} + +interface ITitleDescription { + Neutral: string; +} + +interface IModContents { + HasBackgroundVideos: boolean; + HasNameplates: boolean; +} + +interface IGameModContents { + HasSharedFiles: boolean; + HasCampaign: boolean; + HasSpartanOps: boolean; + MultiplayerMaps: string[]; + FirefightMaps: string[]; +} + +export interface IModConfig { + ModIdentifier: IModIdentifier; + ModVersion: IVersion; + MinAppVersion: IVersion; + MaxAppVersion: IVersion; + Engine: string; + Title: ITitleDescription; + Description: ITitleDescription; + InheritSharedFiles: string; + ModContents: IModContents; + GameModContents: IGameModContents; +} + +export type LauncherConfig = Promise<{launcher: string; addInfo?: any; }>; \ No newline at end of file diff --git a/game-masterchiefcollection/util.js b/game-masterchiefcollection/util.js new file mode 100644 index 0000000..174d6e7 --- /dev/null +++ b/game-masterchiefcollection/util.js @@ -0,0 +1,60 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.applyToManifest = exports.identifyHaloGames = void 0; +const path_1 = __importDefault(require("path")); +const vortex_api_1 = require("vortex-api"); +const common_1 = require("./common"); +function identifyHaloGames(files) { + const filtered = files.filter(file => path_1.default.extname(file) !== ''); + return Object.keys(common_1.HALO_GAMES).reduce((accum, key) => { + const entry = common_1.HALO_GAMES[key]; + filtered.forEach(element => { + const segments = element.split(path_1.default.sep); + if (segments.includes(entry.modsPath)) { + accum.push(entry); + return accum; + } + }); + return accum; + }, []); +} +exports.identifyHaloGames = identifyHaloGames; +function applyToManifest(api, apply) { + return __awaiter(this, void 0, void 0, function* () { + let manifestData = ''; + try { + manifestData = yield vortex_api_1.fs.readFileAsync(common_1.MOD_MANIFEST_FILE_PATH, { encoding: 'utf8' }); + } + catch (err) { + if (!['ENOENT'].includes(err.code)) { + api.showErrorNotification('Failed to read mod manifest file', err, { allowReport: err.code !== 'EPERM' }); + return; + } + } + const stagingPath = vortex_api_1.selectors.installPathForGame(api.getState(), common_1.GAME_ID); + const lines = manifestData.split('\r\n'); + const hasStagingFolderEntry = lines.some(line => line.includes(stagingPath)); + if (apply && !hasStagingFolderEntry) { + lines.push(stagingPath); + } + else if (!apply && hasStagingFolderEntry) { + lines.splice(lines.indexOf(stagingPath), 1); + } + yield vortex_api_1.fs.ensureDirWritableAsync(path_1.default.dirname(common_1.MOD_MANIFEST_FILE_PATH)); + yield vortex_api_1.fs.writeFileAsync(common_1.MOD_MANIFEST_FILE_PATH, lines.filter(line => !!line).join('\r\n')); + }); +} +exports.applyToManifest = applyToManifest; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDJDQUFrRDtBQUVsRCxxQ0FBdUU7QUFHdkUsU0FBZ0IsaUJBQWlCLENBQUMsS0FBZTtJQUcvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxtQkFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxLQUFLLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBaEJELDhDQWdCQztBQUlELFNBQXNCLGVBQWUsQ0FBQyxHQUF3QixFQUFFLEtBQWM7O1FBQzVFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJO1lBQ0YsWUFBWSxHQUFHLE1BQU0sZUFBRSxDQUFDLGFBQWEsQ0FBQywrQkFBc0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3JGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQyxHQUFHLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTzthQUNSO1NBQ0Y7UUFDRCxNQUFNLFdBQVcsR0FBRyxzQkFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBSSxLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsRUFBRTtZQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFDRCxNQUFNLGVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLCtCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGVBQUUsQ0FBQyxjQUFjLENBQUMsK0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0NBQUE7QUFwQkQsMENBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgc2VsZWN0b3JzIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBHQU1FX0lELCBIQUxPX0dBTUVTLCBNT0RfTUFOSUZFU1RfRklMRV9QQVRIIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBJSGFsb0dhbWUgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUhhbG9HYW1lcyhmaWxlczogc3RyaW5nW10pOiBJSGFsb0dhbWVbXSB7XHJcbiAgLy8gRnVuY3Rpb24gYWltcyB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgaGFsbyBnYW1lIGVudHJ5IHVzaW5nIHRoZVxyXG4gIC8vICBtb2QgZmlsZXMuXHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBwYXRoLmV4dG5hbWUoZmlsZSkgIT09ICcnKTtcclxuICByZXR1cm4gT2JqZWN0LmtleXMoSEFMT19HQU1FUykucmVkdWNlKChhY2N1bSwga2V5KSA9PiB7XHJcbiAgICBjb25zdCBlbnRyeSA9IEhBTE9fR0FNRVNba2V5XTtcclxuICAgIGZpbHRlcmVkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZWxlbWVudC5zcGxpdChwYXRoLnNlcCk7XHJcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcyhlbnRyeS5tb2RzUGF0aCkpIHtcclxuICAgICAgICBhY2N1bS5wdXNoKGVudHJ5KTtcclxuICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhY2N1bTtcclxuICB9LCBbXSk7XHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5VG9NYW5pZmVzdChhcGk6IHR5cGVzLklFeHRlbnNpb25BcGksIGFwcGx5OiBib29sZWFuKSB7XHJcbiAgbGV0IG1hbmlmZXN0RGF0YSA9ICcnO1xyXG4gIHRyeSB7XHJcbiAgICBtYW5pZmVzdERhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZUFzeW5jKE1PRF9NQU5JRkVTVF9GSUxFX1BBVEgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGlmICghWydFTk9FTlQnXS5pbmNsdWRlcyhlcnIuY29kZSkpIHtcclxuICAgICAgYXBpLnNob3dFcnJvck5vdGlmaWNhdGlvbignRmFpbGVkIHRvIHJlYWQgbW9kIG1hbmlmZXN0IGZpbGUnLCBlcnIsIHsgYWxsb3dSZXBvcnQ6IGVyci5jb2RlICE9PSAnRVBFUk0nIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IHN0YWdpbmdQYXRoID0gc2VsZWN0b3JzLmluc3RhbGxQYXRoRm9yR2FtZShhcGkuZ2V0U3RhdGUoKSwgR0FNRV9JRCk7XHJcbiAgY29uc3QgbGluZXMgPSBtYW5pZmVzdERhdGEuc3BsaXQoJ1xcclxcbicpO1xyXG4gIGNvbnN0IGhhc1N0YWdpbmdGb2xkZXJFbnRyeSA9IGxpbmVzLnNvbWUobGluZSA9PiBsaW5lLmluY2x1ZGVzKHN0YWdpbmdQYXRoKSk7XHJcbiAgaWYgKGFwcGx5ICYmICFoYXNTdGFnaW5nRm9sZGVyRW50cnkpIHtcclxuICAgIGxpbmVzLnB1c2goc3RhZ2luZ1BhdGgpO1xyXG4gIH0gZWxzZSBpZiAoIWFwcGx5ICYmIGhhc1N0YWdpbmdGb2xkZXJFbnRyeSkge1xyXG4gICAgbGluZXMuc3BsaWNlKGxpbmVzLmluZGV4T2Yoc3RhZ2luZ1BhdGgpLCAxKTtcclxuICB9XHJcbiAgYXdhaXQgZnMuZW5zdXJlRGlyV3JpdGFibGVBc3luYyhwYXRoLmRpcm5hbWUoTU9EX01BTklGRVNUX0ZJTEVfUEFUSCkpO1xyXG4gIGF3YWl0IGZzLndyaXRlRmlsZUFzeW5jKE1PRF9NQU5JRkVTVF9GSUxFX1BBVEgsIGxpbmVzLmZpbHRlcihsaW5lID0+ICEhbGluZSkuam9pbignXFxyXFxuJykpO1xyXG59Il19 \ No newline at end of file diff --git a/game-masterchiefcollection/util.ts b/game-masterchiefcollection/util.ts new file mode 100644 index 0000000..544d61e --- /dev/null +++ b/game-masterchiefcollection/util.ts @@ -0,0 +1,47 @@ +import path from 'path'; +import { fs, types, selectors } from 'vortex-api'; + +import { GAME_ID, HALO_GAMES, MOD_MANIFEST_FILE_PATH } from './common'; +import { IHaloGame } from './types'; + +export function identifyHaloGames(files: string[]): IHaloGame[] { + // Function aims to identify the relevant halo game entry using the + // mod files. + const filtered = files.filter(file => path.extname(file) !== ''); + return Object.keys(HALO_GAMES).reduce((accum, key) => { + const entry = HALO_GAMES[key]; + filtered.forEach(element => { + const segments = element.split(path.sep); + if (segments.includes(entry.modsPath)) { + accum.push(entry); + return accum; + } + }); + + return accum; + }, []); +} + + + +export async function applyToManifest(api: types.IExtensionApi, apply: boolean) { + let manifestData = ''; + try { + manifestData = await fs.readFileAsync(MOD_MANIFEST_FILE_PATH, { encoding: 'utf8' }); + } catch (err) { + if (!['ENOENT'].includes(err.code)) { + api.showErrorNotification('Failed to read mod manifest file', err, { allowReport: err.code !== 'EPERM' }); + return; + } + } + const stagingPath = selectors.installPathForGame(api.getState(), GAME_ID); + const lines = manifestData.split('\r\n'); + const hasStagingFolderEntry = lines.some(line => line.includes(stagingPath)); + if (apply && !hasStagingFolderEntry) { + lines.push(stagingPath); + } else if (!apply && hasStagingFolderEntry) { + lines.splice(lines.indexOf(stagingPath), 1); + } + await fs.ensureDirWritableAsync(path.dirname(MOD_MANIFEST_FILE_PATH)); + await fs.writeFileAsync(MOD_MANIFEST_FILE_PATH, lines.filter(line => !!line).join('\r\n')); +} \ No newline at end of file From f57f308d0354ee3a83bb3bc02acfd4b55e5c5d6e Mon Sep 17 00:00:00 2001 From: IDCs Date: Tue, 13 Aug 2024 10:21:06 +0100 Subject: [PATCH 2/5] MCC: fixed failure to run game without EAC --- game-masterchiefcollection/index.js | 54 ++++------------------------- game-masterchiefcollection/index.ts | 15 +++----- 2 files changed, 12 insertions(+), 57 deletions(-) diff --git a/game-masterchiefcollection/index.js b/game-masterchiefcollection/index.js index 0f43ba6..61e4e93 100644 --- a/game-masterchiefcollection/index.js +++ b/game-masterchiefcollection/index.js @@ -42,10 +42,9 @@ const common_1 = require("./common"); const modTypes_1 = require("./modTypes"); const installers_1 = require("./installers"); const util_1 = require("./util"); -let _GAME_STORE_ID; class MasterChiefCollectionGame { constructor(context) { - this.requiresLauncer = vortex_api_1.util.toBlue((gamePath) => this.checkLauncher(gamePath)); + this.requiresLauncher = vortex_api_1.util.toBlue((gamePath, store) => this.checkLauncher(gamePath, store)); this.context = context; this.id = common_1.GAME_ID; this.name = 'Halo: The Master Chief Collection'; @@ -84,55 +83,16 @@ class MasterChiefCollectionGame { } prepare(discovery) { return __awaiter(this, void 0, void 0, function* () { - const xboxWarning = () => { - this.context.api.showDialog('info', 'Xbox Store Permissions', { - bbcode: 'Halo: MCC appears to be installed through the Xbox game store and your account ' - + 'does not have permissions to write new files. This needs to be resolved manually ' - + 'before mods can be deployed [url=https://wiki.nexusmods.com/index.php/Modding_Halo:_The_Master_Chief_Collection_with_Vortex]as seen here.[/url]', - }, [ - { label: 'Close' }, - ]); - return Promise.resolve(); - }; - const createXboxModsPath = () => { - const segments = discovery.path.split(path_1.default.sep).filter(seg => !!seg); - const idx = segments.indexOf('WindowsApps'); - const progFiles = segments.splice(0, idx).join(path_1.default.sep); - return vortex_api_1.fs.ensureDirWritableAsync(path_1.default.join(progFiles, 'ModifiableWindowsApps', 'HaloMCC'), () => { - return this.api.showDialog('info', 'Need to change file permissions', { - text: 'Vortex needs to change the file permissions on the game mod directory so it ' - + 'can install mods. Windows will ask if you want to allow Vortex to make changes to your system. ', - }, [ - { label: 'Cancel' }, - { label: 'Continue' }, - ]) - .then(result => { - if (result.action === 'Cancel') { - return Promise.reject(new vortex_api_1.util.UserCanceled()); - } - else { - return Promise.resolve(); - } - }); - }) - .catch(err => (err.code === 'EPERM') - ? xboxWarning() : Promise.reject(err)); - }; - return (_GAME_STORE_ID === 'xbox') - ? createXboxModsPath() - : Promise.resolve(); + return Promise.resolve(); }); } queryPath() { return vortex_api_1.util.GameStoreHelper.findByAppId([common_1.STEAM_ID, common_1.MS_APPID]) - .then(game => { - _GAME_STORE_ID = game.gameStoreId; - return game.gamePath; - }); + .then(game => game.gamePath); } - checkLauncher(gamePath) { + checkLauncher(gamePath, store) { return __awaiter(this, void 0, void 0, function* () { - if (_GAME_STORE_ID === 'xbox') { + if (store === 'xbox') { return Promise.resolve({ launcher: 'xbox', addInfo: { @@ -143,7 +103,7 @@ class MasterChiefCollectionGame { } }); } - else if (_GAME_STORE_ID === 'steam') { + else if (store === 'steam') { return Promise.resolve({ launcher: 'steam', addInfo: { @@ -225,4 +185,4 @@ module.exports = { }); } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDJDQUFtRjtBQUVuRiw2Q0FBK0I7QUFFL0IscUNBQTBGO0FBRTFGLHlDQUFvRDtBQUNwRCw2Q0FBOEk7QUFDOUksaUNBQXlDO0FBRXpDLElBQUksY0FBYyxDQUFDO0FBR25CLE1BQU0seUJBQXlCO0lBYzdCLFlBQVksT0FBTztRQTBGWixvQkFBZSxHQUFHLGlCQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBekZ2RixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxtQ0FBbUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0I7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQjtnQkFDRSxFQUFFLEVBQUUsa0JBQWtCO2dCQUN0QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWM7Z0JBQ2hDLGFBQWEsRUFBRTtvQkFDYixjQUFjO2lCQUNmO2dCQUNELFFBQVEsRUFBRSxJQUFJO2FB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bXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgZnMsIHR5cGVzLCBGbGV4TGF5b3V0LCBPcHRpb25zRmlsdGVyLCBzZWxlY3RvcnMsIHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEdBTUVfSUQsIEhBTE9fR0FNRVMsIE1TX0FQUElELCBTVEVBTV9JRCwgTU9EVFlQRV9QTFVHX0FORF9QTEFZIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYXVuY2hlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIH0gZnJvbSAnLi9tb2RUeXBlcyc7XHJcbmltcG9ydCB7IGluc3RhbGxQbHVnQW5kUGxheSwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyLCBpbnN0YWxsTW9kQ29uZmlnLCBpbnN0YWxsLCB0ZXN0SW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXJzJztcclxuaW1wb3J0IHsgYXBwbHlUb01hbmlmZXN0IH0gZnJvbSAnLi91dGlsJztcclxuXHJcbmxldCBfR0FNRV9TVE9SRV9JRDtcclxuXHJcbi8vIE1hc3RlciBjaGVmIGNvbGxlY3Rpb25cclxuY2xhc3MgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZSBpbXBsZW1lbnRzIHR5cGVzLklHYW1lIHtcclxuICBwdWJsaWMgY29udGV4dDogdHlwZXMuSUV4dGVuc2lvbkNvbnRleHQ7XHJcbiAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgc2hvcnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxvZ286IHN0cmluZztcclxuICBwdWJsaWMgYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpO1xyXG4gIHB1YmxpYyBnZXRHYW1lVmVyc2lvbjogKGRpc2NvdmVyeVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZXF1aXJlZEZpbGVzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgc3VwcG9ydGVkVG9vbHM6IGFueVtdO1xyXG4gIHB1YmxpYyBlbnZpcm9ubWVudDogYW55O1xyXG4gIHB1YmxpYyBkZXRhaWxzOiBhbnk7XHJcbiAgcHVibGljIG1lcmdlTW9kczogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuaWQgPSBHQU1FX0lEO1xyXG4gICAgdGhpcy5uYW1lID0gJ0hhbG86IFRoZSBNYXN0ZXIgQ2hpZWYgQ29sbGVjdGlvbic7XHJcbiAgICB0aGlzLnNob3J0TmFtZSA9ICdIYWxvOiBNQ0MnO1xyXG4gICAgdGhpcy5sb2dvID0gJ2dhbWVhcnQuanBnJztcclxuICAgIHRoaXMuYXBpID0gY29udGV4dC5hcGk7XHJcbiAgICB0aGlzLmdldEdhbWVWZXJzaW9uID0gcmVzb2x2ZUdhbWVWZXJzaW9uLFxyXG4gICAgdGhpcy5yZXF1aXJlZEZpbGVzID0gW1xyXG4gICAgICB0aGlzLmV4ZWN1dGFibGUoKSxcclxuICAgIF07XHJcbiAgICB0aGlzLnN1cHBvcnRlZFRvb2xzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdoYWxvYXNzZW1ibHl0b29sJyxcclxuICAgICAgICBuYW1lOiAnQXNzZW1ibHknLFxyXG4gICAgICAgIGxvZ286ICdhc3NlbWJseXRvb2wucG5nJyxcclxuICAgICAgICBleGVjdXRhYmxlOiAoKSA9PiAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICByZXF1aXJlZEZpbGVzOiBbXHJcbiAgICAgICAgICAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlbGF0aXZlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7XHJcbiAgICAgIFN0ZWFtQVBQSWQ6IFNURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGV0YWlscyA9IHtcclxuICAgICAgc3RlYW1BcHBJZDogK1NURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMubWVyZ2VNb2RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHF1ZXJ5TW9kUGF0aChnYW1lUGF0aCkge1xyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGV4ZWN1dGFibGUoKSB7XHJcbiAgICByZXR1cm4gJ21jY2xhdW5jaGVyLmV4ZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZShkaXNjb3Zlcnk6IHR5cGVzLklEaXNjb3ZlcnlSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHhib3hXYXJuaW5nID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbnRleHQuYXBpLnNob3dEaWFsb2coJ2luZm8nLCAnWGJveCBTdG9yZSBQZXJtaXNzaW9ucycsIHtcclxuICAgICAgICBiYmNvZGU6ICdIYWxvOiBNQ0MgYXBwZWFycyB0byBiZSBpbnN0YWxsZWQgdGhyb3VnaCB0aGUgWGJveCBnYW1lIHN0b3JlIGFuZCB5b3VyIGFjY291bnQgJyBcclxuICAgICAgICAgICAgICArICdkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHdyaXRlIG5ldyBmaWxlcy4gVGhpcyBuZWVkcyB0byBiZSByZXNvbHZlZCBtYW51YWxseSAnXHJcbiAgICAgICAgICAgICAgKyAnYmVmb3JlIG1vZHMgY2FuIGJlIGRlcGxveWVkIFt1cmw9aHR0cHM6Ly93aWtpLm5leHVzbW9kcy5jb20vaW5kZXgucGhwL01vZGRpbmdfSGFsbzpfVGhlX01hc3Rlcl9DaGllZl9Db2xsZWN0aW9uX3dpdGhfVm9ydGV4XWFzIHNlZW4gaGVyZS5bL3VybF0nLFxyXG4gICAgICB9LCBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3NlJyB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjcmVhdGVYYm94TW9kc1BhdGggPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGlzY292ZXJ5LnBhdGguc3BsaXQocGF0aC5zZXApLmZpbHRlcihzZWcgPT4gISFzZWcpO1xyXG4gICAgICBjb25zdCBpZHggPSBzZWdtZW50cy5pbmRleE9mKCdXaW5kb3dzQXBwcycpO1xyXG4gICAgICBjb25zdCBwcm9nRmlsZXMgPSBzZWdtZW50cy5zcGxpY2UoMCwgaWR4KS5qb2luKHBhdGguc2VwKTtcclxuICAgICAgcmV0dXJuIGZzLmVuc3VyZURpcldyaXRhYmxlQXN5bmMocGF0aC5qb2luKHByb2dGaWxlcywgJ01vZGlmaWFibGVXaW5kb3dzQXBwcycsICdIYWxvTUNDJyksICgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGkuc2hvd0RpYWxvZygnaW5mbycsICdOZWVkIHRvIGNoYW5nZSBmaWxlIHBlcm1pc3Npb25zJywge1xyXG4gICAgICAgICAgdGV4dDogJ1ZvcnRleCBuZWVkcyB0byBjaGFuZ2UgdGhlIGZpbGUgcGVybWlzc2lvbnMgb24gdGhlIGdhbWUgbW9kIGRpcmVjdG9yeSBzbyBpdCAnXHJcbiAgICAgICAgICAgICAgKyAnY2FuIGluc3RhbGwgbW9kcy4gV2luZG93cyB3aWxsIGFzayBpZiB5b3Ugd2FudCB0byBhbGxvdyBWb3J0ZXggdG8gbWFrZSBjaGFuZ2VzIHRvIHlvdXIgc3lzdGVtLiAnLFxyXG4gICAgICAgIH0sIFtcclxuICAgICAgICAgIHsgbGFiZWw6ICdDYW5jZWwnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnQ29udGludWUnIH0sXHJcbiAgICAgICAgXSlcclxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09ICdDYW5jZWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5Vc2VyQ2FuY2VsZWQoKSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVyciA9PiAoZXJyLmNvZGUgPT09ICdFUEVSTScpXHJcbiAgICAgICAgICA/IHhib3hXYXJuaW5nKCkgOiBQcm9taXNlLnJlamVjdChlcnIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKF9HQU1FX1NUT1JFX0lEID09PSAneGJveCcpIFxyXG4gICAgICA/IGNyZWF0ZVhib3hNb2RzUGF0aCgpXHJcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcXVlcnlQYXRoKCkge1xyXG4gICAgcmV0dXJuIHV0aWwuR2FtZVN0b3JlSGVscGVyLmZpbmRCeUFwcElkKFtTVEVBTV9JRCwgTVNfQVBQSURdKVxyXG4gICAgICAudGhlbihnYW1lID0+IHtcclxuICAgICAgICBfR0FNRV9TVE9SRV9JRCA9IGdhbWUuZ2FtZVN0b3JlSWQ7XHJcbiAgICAgICAgcmV0dXJuIGdhbWUuZ2FtZVBhdGhcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWlyZXNMYXVuY2VyID0gdXRpbC50b0JsdWUoKGdhbWVQYXRoOiBzdHJpbmcpID0+IHRoaXMuY2hlY2tMYXVuY2hlcihnYW1lUGF0aCkpO1xyXG4gIHB1YmxpYyBhc3luYyBjaGVja0xhdW5jaGVyKGdhbWVQYXRoOiBzdHJpbmcpOiBMYXVuY2hlckNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoX0dBTUVfU1RPUkVfSUQgPT09ICd4Ym94Jykge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICBsYXVuY2hlcjogJ3hib3gnLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIGFwcElkOiBNU19BUFBJRCxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBhcHBFeGVjTmFtZTogJ0hhbG9NQ0NTaGlwcGluZ05vRUFDJyB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChfR0FNRV9TVE9SRV9JRCA9PT0gJ3N0ZWFtJykge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICAgICBsYXVuY2hlcjogJ3N0ZWFtJyxcclxuICAgICAgICBhZGRJbmZvOiB7XHJcbiAgICAgICAgICBhcHBJZDogU1RFQU1fSUQsXHJcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBbJ29wdGlvbjInXSxcclxuICAgICAgICAgIGxhdW5jaFR5cGU6ICdnYW1lc3RvcmUnLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gZ2V0WGJveElkKGludGVybmFsSWQsIGZpbGVQYXRoLCBlbmNvZGluZykge1xyXG4vLyAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHhib3ggaWQgb2YgdGhlIGxhc3QgcGxheWVyXHJcbi8vICAgLy8gIHdobyByYW4gdGhlIGdhbWUuIFRoaXMgY2FuIHBvdGVudGlhbGx5IGJlIHVzZWQgdG8gbW9kIHRoZSBnYW1lXHJcbi8vICAgLy8gIG9ubHkgZm9yIHNwZWNpZmljIHhib3ggaWRzIHdoaWxlIGxlYXZpbmcgb3RoZXJzIGluIGFuIHVudGFtcGVyZWQgc3RhdGUuIChXSVApXHJcbi8vICAgcmV0dXJuIGZzLnJlYWRGaWxlQXN5bmMoZmlsZVBhdGgsIHsgZW5jb2RpbmcgfSlcclxuLy8gICAgIC50aGVuKGZpbGVEYXRhID0+IHtcclxuLy8gICAgICAgbGV0IHhtbERvYztcclxuLy8gICAgICAgdHJ5IHtcclxuLy8gICAgICAgICB4bWxEb2MgPSBwYXJzZVhtbFN0cmluZyhmaWxlRGF0YSk7XHJcbi8vICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4vLyAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBjb25zdCBnZW5lcmFsRGF0YSA9IHhtbERvYy5maW5kKCcvL0NhbXBhaWduQ2FybmFnZVJlcG9ydC9HZW5lcmFsRGF0YScpO1xyXG4vLyAgICAgICBpZiAoZ2VuZXJhbERhdGFbMF0uYXR0cignR2FtZUlkJykudmFsdWUoKSA9PT0gaW50ZXJuYWxJZCkge1xyXG4vLyAgICAgICAgIGNvbnN0IHBsYXllcnMgPSB4bWxEb2MuZmluZCgnLy9DYW1wYWlnbkNhcm5hZ2VSZXBvcnQvUGxheWVycy9QbGF5ZXJJbmZvJyk7XHJcbi8vICAgICAgICAgY29uc3QgbWFpblBsYXllciA9IHBsYXllcnMuZmluZChwbGF5ZXIgPT4gcGxheWVyLmF0dHIoJ2lzR3Vlc3QnKS52YWx1ZSgpID09PSAnZmFsc2UnKTtcclxuLy8gICAgICAgICBjb25zdCB4Ym94SWQgPSBtYWluUGxheWVyLmF0dHIoJ21YYm94VXNlcklkJykudmFsdWUoKTtcclxuLy8gICAgICAgICAvLyBUaGUgdXNlcklkIGlzIHByZWZpeGVkIHdpdGggXCIweFwiIHdoaWNoIGlzIG5vdCBuZWVkZWQuXHJcbi8vICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh4Ym94SWQuc3Vic3RyaW5nKDIpKTtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHV0aWwuRGF0YUludmFsaWQoJ1dyb25nIGludGVybmFsIGdhbWVJZCcpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSk7XHJcbi8vIH1cclxuXHJcbmNvbnN0IHJlc29sdmVHYW1lVmVyc2lvbiA9IGFzeW5jIChkaXNjb3ZlcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5qb2luKGRpc2NvdmVyeVBhdGgsICdidWlsZF90YWcudHh0Jyk7XHJcbiAgcmV0dXJuIGZzLnJlYWRGaWxlQXN5bmModmVyc2lvblBhdGgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxyXG4gICAgLnRoZW4oKHJlcykgPT4gUHJvbWlzZS5yZXNvbHZlKHJlcy5zcGxpdCgnXFxyXFxuJylbMF0udHJpbSgpKSk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGRlZmF1bHQ6IChjb250ZXh0OiB0eXBlcy5JRXh0ZW5zaW9uQ29udGV4dCkgPT4ge1xyXG4gICAgY29udGV4dC5yZWdpc3RlckdhbWUobmV3IE1hc3RlckNoaWVmQ29sbGVjdGlvbkdhbWUoY29udGV4dCkpO1xyXG5cclxuICAgIC8vIGxldCBjb2xsYXRvcjtcclxuICAgIC8vIGNvbnN0IGdldENvbGxhdG9yID0gKGxvY2FsZSkgPT4ge1xyXG4gICAgLy8gICBpZiAoKGNvbGxhdG9yID09PSB1bmRlZmluZWQpIHx8IChsb2NhbGUgIT09IGxhbmcpKSB7XHJcbiAgICAvLyAgICAgbGFuZyA9IGxvY2FsZTtcclxuICAgIC8vICAgICBjb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKGxvY2FsZSwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHJldHVybiBjb2xsYXRvcjtcclxuICAgIC8vIH07XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3Rlck1vZFR5cGUoTU9EVFlQRV9QTFVHX0FORF9QTEFZLCAxNSxcclxuICAgICAgKGdhbWVJZDogc3RyaW5nKSA9PiBnYW1lSWQgPT09IEdBTUVfSUQsICgpID0+IHVuZGVmaW5lZCwgdGVzdFBsdWdBbmRQbGF5TW9kVHlwZSBhcyBhbnksIHtcclxuICAgICAgZGVwbG95bWVudEVzc2VudGlhbDogZmFsc2UsXHJcbiAgICAgIG1lcmdlTW9kczogdHJ1ZSxcclxuICAgICAgbmFtZTogJ01DQyBQbHVnIGFuZCBQbGF5IG1vZCcsXHJcbiAgICAgIG5vQ29uZmxpY3RzOiB0cnVlLFxyXG4gICAgfSlcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtY2MtcGx1Zy1hbmQtcGxheS1pbnN0YWxsZXInLFxyXG4gICAgICAxNSwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbFBsdWdBbmRQbGF5IGFzIGFueSk7XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3Rlckluc3RhbGxlcignbWFzdGVyY2hpZWZtb2Rjb25maWdpbnN0YWxsZXInLFxyXG4gICAgICAyMCwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciBhcyBhbnksIGluc3RhbGxNb2RDb25maWcgYXMgYW55KTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtYXN0ZXJjaGllZmluc3RhbGxlcicsXHJcbiAgICAgIDI1LCB0ZXN0SW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbCBhcyBhbnkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJUYWJsZUF0dHJpYnV0ZSgnbW9kcycsIHtcclxuICAgICAgaWQ6ICdnYW1lVHlwZScsXHJcbiAgICAgIG5hbWU6ICdHYW1lKHMpJyxcclxuICAgICAgZGVzY3JpcHRpb246ICdUYXJnZXQgSGFsbyBnYW1lKHMpIGZvciB0aGlzIG1vZCcsXHJcbiAgICAgIGljb246ICdpbnNwZWN0JyxcclxuICAgICAgcGxhY2VtZW50OiAndGFibGUnLFxyXG4gICAgICBjdXN0b21SZW5kZXJlcjogKG1vZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZUltZ0RpdiA9IChlbnRyeSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdoYWxvLWltZy1kaXYnLCBrZXk6IGAke2VudHJ5LmludGVybmFsSWR9LSR7aWR4fWAgfSwgXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2ltZycsIHsgY2xhc3NOYW1lOiAnaGFsb2dhbWVpbWcnLCBzcmM6IGBmaWxlOi8vJHtlbnRyeS5pbWd9YCB9KSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHt9LCBlbnRyeS5uYW1lKSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBpbnRlcm5hbElkcyA9IHV0aWwuZ2V0U2FmZShtb2QsIFsnYXR0cmlidXRlcycsICdoYWxvR2FtZXMnXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IGhhbG9FbnRyaWVzID0gT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGludGVybmFsSWRzLmluY2x1ZGVzKEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkKSlcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IEhBTE9fR0FNRVNba2V5XSk7XHJcblxyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQsIHsgdHlwZTogJ3JvdycgfSwgXHJcbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQuRmxleCwgeyBjbGFzc05hbWU6ICdoYWxvaW1nbGF5b3V0JyB9LCBoYWxvRW50cmllcy5tYXAoKGVudHJ5LCBpZHgpID0+IGNyZWF0ZUltZ0RpdihlbnRyeSwgaWR4KSkpKTtcclxuICAgICAgfSxcclxuICAgICAgY2FsYzogKG1vZCkgPT4gdXRpbC5nZXRTYWZlKG1vZCwgWydhdHRyaWJ1dGVzJywgJ2hhbG9HYW1lcyddLCB1bmRlZmluZWQpLFxyXG4gICAgICBmaWx0ZXI6IG5ldyBPcHRpb25zRmlsdGVyKFxyXG4gICAgICAgIFtdLmNvbmNhdChbeyB2YWx1ZTogT3B0aW9uc0ZpbHRlci5FTVBUWSwgbGFiZWw6ICc8Tm9uZT4nIH1dLFxyXG4gICAgICAgIE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCwgbGFiZWw6IEhBTE9fR0FNRVNba2V5XS5uYW1lIH07XHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICAsIHRydWUsIGZhbHNlKSxcclxuICAgICAgaXNUb2dnbGVhYmxlOiB0cnVlLFxyXG4gICAgICBlZGl0OiB7fSxcclxuICAgICAgaXNTb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgIGlzR3JvdXBhYmxlOiAobW9kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxJZHMgPSB1dGlsLmdldFNhZmUobW9kLCBbJ2F0dHJpYnV0ZXMnLCAnaGFsb0dhbWVzJ10sIFtdKTtcclxuICAgICAgICBjb25zdCBoYWxvRW50cmllcyA9IE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBpbnRlcm5hbElkcy5pbmNsdWRlcyhIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCkpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiBIQUxPX0dBTUVTW2tleV0pO1xyXG5cclxuICAgICAgICBpZiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuICdNdWx0aXBsZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAoISFoYWxvRW50cmllcyAmJiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMCkpXHJcbiAgICAgICAgICAgID8gaGFsb0VudHJpZXNbMF0ubmFtZVxyXG4gICAgICAgICAgICA6ICdOb25lJztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGlzRGVmYXVsdFZpc2libGU6IHRydWUsXHJcbiAgICAgIC8vc29ydEZ1bmM6IChsaHMsIHJocykgPT4gZ2V0Q29sbGF0b3IobG9jYWxlKS5jb21wYXJlKGxocywgcmhzKSxcclxuICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlR2FtZUlkID0gc2VsZWN0b3JzLmFjdGl2ZUdhbWVJZChjb250ZXh0LmFwaS5zdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgICAgICByZXR1cm4gKGFjdGl2ZUdhbWVJZCA9PT0gR0FNRV9JRCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnRleHQub25jZSgoKSA9PiB7XHJcbiAgICAgIGNvbnRleHQuYXBpLnNldFN0eWxlc2hlZXQoJ21hc3RlcmNoaWVmc3R5bGUnLCBwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWFzdGVyY2hpZWYuc2NzcycpKTtcclxuICAgICAgY29udGV4dC5hcGkub25Bc3luYygnZGlkLWRlcGxveScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCB0cnVlKSk7XHJcbiAgICAgIGNvbnRleHQuYXBpLm9uQXN5bmMoJ2RpZC1wdXJnZScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCBmYWxzZSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDJDQUFtRjtBQUVuRiw2Q0FBK0I7QUFFL0IscUNBQTBGO0FBRTFGLHlDQUFvRDtBQUNwRCw2Q0FBOEk7QUFDOUksaUNBQXlDO0FBR3pDLE1BQU0seUJBQXlCO0lBYzdCLFlBQVksT0FBTztRQWlEWixxQkFBZ0IsR0FBRyxpQkFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBaEQ5RyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxtQ0FBbUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0I7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQjtnQkFDRSxFQUFFLEVBQUUsa0JBQWtCO2dCQUN0QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWM7Z0JBQ2hDLGFBQWEsRUFBRTtvQkFDYixjQUFjO2lCQUNmO2dCQUNELFFBQVEsRUFBRSxJQUFJO2FB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QUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1lBQ25HLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1FBQ3JHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgZnMsIHR5cGVzLCBGbGV4TGF5b3V0LCBPcHRpb25zRmlsdGVyLCBzZWxlY3RvcnMsIHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEdBTUVfSUQsIEhBTE9fR0FNRVMsIE1TX0FQUElELCBTVEVBTV9JRCwgTU9EVFlQRV9QTFVHX0FORF9QTEFZIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYXVuY2hlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIH0gZnJvbSAnLi9tb2RUeXBlcyc7XHJcbmltcG9ydCB7IGluc3RhbGxQbHVnQW5kUGxheSwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyLCBpbnN0YWxsTW9kQ29uZmlnLCBpbnN0YWxsLCB0ZXN0SW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXJzJztcclxuaW1wb3J0IHsgYXBwbHlUb01hbmlmZXN0IH0gZnJvbSAnLi91dGlsJztcclxuXHJcbi8vIE1hc3RlciBjaGVmIGNvbGxlY3Rpb25cclxuY2xhc3MgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZSBpbXBsZW1lbnRzIHR5cGVzLklHYW1lIHtcclxuICBwdWJsaWMgY29udGV4dDogdHlwZXMuSUV4dGVuc2lvbkNvbnRleHQ7XHJcbiAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgc2hvcnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxvZ286IHN0cmluZztcclxuICBwdWJsaWMgYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpO1xyXG4gIHB1YmxpYyBnZXRHYW1lVmVyc2lvbjogKGRpc2NvdmVyeVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZXF1aXJlZEZpbGVzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgc3VwcG9ydGVkVG9vbHM6IGFueVtdO1xyXG4gIHB1YmxpYyBlbnZpcm9ubWVudDogYW55O1xyXG4gIHB1YmxpYyBkZXRhaWxzOiBhbnk7XHJcbiAgcHVibGljIG1lcmdlTW9kczogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuaWQgPSBHQU1FX0lEO1xyXG4gICAgdGhpcy5uYW1lID0gJ0hhbG86IFRoZSBNYXN0ZXIgQ2hpZWYgQ29sbGVjdGlvbic7XHJcbiAgICB0aGlzLnNob3J0TmFtZSA9ICdIYWxvOiBNQ0MnO1xyXG4gICAgdGhpcy5sb2dvID0gJ2dhbWVhcnQuanBnJztcclxuICAgIHRoaXMuYXBpID0gY29udGV4dC5hcGk7XHJcbiAgICB0aGlzLmdldEdhbWVWZXJzaW9uID0gcmVzb2x2ZUdhbWVWZXJzaW9uLFxyXG4gICAgdGhpcy5yZXF1aXJlZEZpbGVzID0gW1xyXG4gICAgICB0aGlzLmV4ZWN1dGFibGUoKSxcclxuICAgIF07XHJcbiAgICB0aGlzLnN1cHBvcnRlZFRvb2xzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdoYWxvYXNzZW1ibHl0b29sJyxcclxuICAgICAgICBuYW1lOiAnQXNzZW1ibHknLFxyXG4gICAgICAgIGxvZ286ICdhc3NlbWJseXRvb2wucG5nJyxcclxuICAgICAgICBleGVjdXRhYmxlOiAoKSA9PiAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICByZXF1aXJlZEZpbGVzOiBbXHJcbiAgICAgICAgICAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlbGF0aXZlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7XHJcbiAgICAgIFN0ZWFtQVBQSWQ6IFNURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGV0YWlscyA9IHtcclxuICAgICAgc3RlYW1BcHBJZDogK1NURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMubWVyZ2VNb2RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHF1ZXJ5TW9kUGF0aChnYW1lUGF0aCkge1xyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGV4ZWN1dGFibGUoKSB7XHJcbiAgICByZXR1cm4gJ21jY2xhdW5jaGVyLmV4ZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZShkaXNjb3Zlcnk6IHR5cGVzLklEaXNjb3ZlcnlSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBxdWVyeVBhdGgoKSB7XHJcbiAgICByZXR1cm4gdXRpbC5HYW1lU3RvcmVIZWxwZXIuZmluZEJ5QXBwSWQoW1NURUFNX0lELCBNU19BUFBJRF0pXHJcbiAgICAgIC50aGVuKGdhbWUgPT4gZ2FtZS5nYW1lUGF0aCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWlyZXNMYXVuY2hlciA9IHV0aWwudG9CbHVlKChnYW1lUGF0aDogc3RyaW5nLCBzdG9yZTogc3RyaW5nKSA9PiB0aGlzLmNoZWNrTGF1bmNoZXIoZ2FtZVBhdGgsIHN0b3JlKSk7XHJcbiAgcHVibGljIGFzeW5jIGNoZWNrTGF1bmNoZXIoZ2FtZVBhdGg6IHN0cmluZywgc3RvcmU6IHN0cmluZyk6IExhdW5jaGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChzdG9yZSA9PT0gJ3hib3gnKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAneGJveCcsXHJcbiAgICAgICAgYWRkSW5mbzoge1xyXG4gICAgICAgICAgYXBwSWQ6IE1TX0FQUElELFxyXG4gICAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IGFwcEV4ZWNOYW1lOiAnSGFsb01DQ1NoaXBwaW5nTm9FQUMnIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHN0b3JlID09PSAnc3RlYW0nKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAnc3RlYW0nLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIGFwcElkOiBTVEVBTV9JRCxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IFsnb3B0aW9uMiddLFxyXG4gICAgICAgICAgbGF1bmNoVHlwZTogJ2dhbWVzdG9yZScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBnZXRYYm94SWQoaW50ZXJuYWxJZCwgZmlsZVBhdGgsIGVuY29kaW5nKSB7XHJcbi8vICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgeGJveCBpZCBvZiB0aGUgbGFzdCBwbGF5ZXJcclxuLy8gICAvLyAgd2hvIHJhbiB0aGUgZ2FtZS4gVGhpcyBjYW4gcG90ZW50aWFsbHkgYmUgdXNlZCB0byBtb2QgdGhlIGdhbWVcclxuLy8gICAvLyAgb25seSBmb3Igc3BlY2lmaWMgeGJveCBpZHMgd2hpbGUgbGVhdmluZyBvdGhlcnMgaW4gYW4gdW50YW1wZXJlZCBzdGF0ZS4gKFdJUClcclxuLy8gICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZyB9KVxyXG4vLyAgICAgLnRoZW4oZmlsZURhdGEgPT4ge1xyXG4vLyAgICAgICBsZXQgeG1sRG9jO1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHhtbERvYyA9IHBhcnNlWG1sU3RyaW5nKGZpbGVEYXRhKTtcclxuLy8gICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbi8vICAgICAgIH1cclxuXHJcbi8vICAgICAgIGNvbnN0IGdlbmVyYWxEYXRhID0geG1sRG9jLmZpbmQoJy8vQ2FtcGFpZ25DYXJuYWdlUmVwb3J0L0dlbmVyYWxEYXRhJyk7XHJcbi8vICAgICAgIGlmIChnZW5lcmFsRGF0YVswXS5hdHRyKCdHYW1lSWQnKS52YWx1ZSgpID09PSBpbnRlcm5hbElkKSB7XHJcbi8vICAgICAgICAgY29uc3QgcGxheWVycyA9IHhtbERvYy5maW5kKCcvL0NhbXBhaWduQ2FybmFnZVJlcG9ydC9QbGF5ZXJzL1BsYXllckluZm8nKTtcclxuLy8gICAgICAgICBjb25zdCBtYWluUGxheWVyID0gcGxheWVycy5maW5kKHBsYXllciA9PiBwbGF5ZXIuYXR0cignaXNHdWVzdCcpLnZhbHVlKCkgPT09ICdmYWxzZScpO1xyXG4vLyAgICAgICAgIGNvbnN0IHhib3hJZCA9IG1haW5QbGF5ZXIuYXR0cignbVhib3hVc2VySWQnKS52YWx1ZSgpO1xyXG4vLyAgICAgICAgIC8vIFRoZSB1c2VySWQgaXMgcHJlZml4ZWQgd2l0aCBcIjB4XCIgd2hpY2ggaXMgbm90IG5lZWRlZC5cclxuLy8gICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHhib3hJZC5zdWJzdHJpbmcoMikpO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5EYXRhSW52YWxpZCgnV3JvbmcgaW50ZXJuYWwgZ2FtZUlkJykpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfVxyXG5cclxuY29uc3QgcmVzb2x2ZUdhbWVWZXJzaW9uID0gYXN5bmMgKGRpc2NvdmVyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLmpvaW4oZGlzY292ZXJ5UGF0aCwgJ2J1aWxkX3RhZy50eHQnKTtcclxuICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyh2ZXJzaW9uUGF0aCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pXHJcbiAgICAudGhlbigocmVzKSA9PiBQcm9taXNlLnJlc29sdmUocmVzLnNwbGl0KCdcXHJcXG4nKVswXS50cmltKCkpKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgZGVmYXVsdDogKGNvbnRleHQ6IHR5cGVzLklFeHRlbnNpb25Db250ZXh0KSA9PiB7XHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyR2FtZShuZXcgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZShjb250ZXh0KSk7XHJcblxyXG4gICAgLy8gbGV0IGNvbGxhdG9yO1xyXG4gICAgLy8gY29uc3QgZ2V0Q29sbGF0b3IgPSAobG9jYWxlKSA9PiB7XHJcbiAgICAvLyAgIGlmICgoY29sbGF0b3IgPT09IHVuZGVmaW5lZCkgfHwgKGxvY2FsZSAhPT0gbGFuZykpIHtcclxuICAgIC8vICAgICBsYW5nID0gbG9jYWxlO1xyXG4gICAgLy8gICAgIGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IobG9jYWxlLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScgfSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgcmV0dXJuIGNvbGxhdG9yO1xyXG4gICAgLy8gfTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyTW9kVHlwZShNT0RUWVBFX1BMVUdfQU5EX1BMQVksIDE1LFxyXG4gICAgICAoZ2FtZUlkOiBzdHJpbmcpID0+IGdhbWVJZCA9PT0gR0FNRV9JRCwgKCkgPT4gdW5kZWZpbmVkLCB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIGFzIGFueSwge1xyXG4gICAgICBkZXBsb3ltZW50RXNzZW50aWFsOiBmYWxzZSxcclxuICAgICAgbWVyZ2VNb2RzOiB0cnVlLFxyXG4gICAgICBuYW1lOiAnTUNDIFBsdWcgYW5kIFBsYXkgbW9kJyxcclxuICAgICAgbm9Db25mbGljdHM6IHRydWUsXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21jYy1wbHVnLWFuZC1wbGF5LWluc3RhbGxlcicsXHJcbiAgICAgIDE1LCB0ZXN0UGx1Z0FuZFBsYXlJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsUGx1Z0FuZFBsYXkgYXMgYW55KTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtYXN0ZXJjaGllZm1vZGNvbmZpZ2luc3RhbGxlcicsXHJcbiAgICAgIDIwLCB0ZXN0TW9kQ29uZmlnSW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbE1vZENvbmZpZyBhcyBhbnkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21hc3RlcmNoaWVmaW5zdGFsbGVyJyxcclxuICAgICAgMjUsIHRlc3RJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsIGFzIGFueSk7XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3RlclRhYmxlQXR0cmlidXRlKCdtb2RzJywge1xyXG4gICAgICBpZDogJ2dhbWVUeXBlJyxcclxuICAgICAgbmFtZTogJ0dhbWUocyknLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ1RhcmdldCBIYWxvIGdhbWUocykgZm9yIHRoaXMgbW9kJyxcclxuICAgICAgaWNvbjogJ2luc3BlY3QnLFxyXG4gICAgICBwbGFjZW1lbnQ6ICd0YWJsZScsXHJcbiAgICAgIGN1c3RvbVJlbmRlcmVyOiAobW9kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlSW1nRGl2ID0gKGVudHJ5LCBpZHgpID0+IHtcclxuICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ2hhbG8taW1nLWRpdicsIGtleTogYCR7ZW50cnkuaW50ZXJuYWxJZH0tJHtpZHh9YCB9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgnaW1nJywgeyBjbGFzc05hbWU6ICdoYWxvZ2FtZWltZycsIHNyYzogYGZpbGU6Ly8ke2VudHJ5LmltZ31gIH0pLFxyXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KCdzcGFuJywge30sIGVudHJ5Lm5hbWUpKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGludGVybmFsSWRzID0gdXRpbC5nZXRTYWZlKG1vZCwgWydhdHRyaWJ1dGVzJywgJ2hhbG9HYW1lcyddLCBbXSk7XHJcbiAgICAgICAgY29uc3QgaGFsb0VudHJpZXMgPSBPYmplY3Qua2V5cyhIQUxPX0dBTUVTKVxyXG4gICAgICAgICAgLmZpbHRlcihrZXkgPT4gaW50ZXJuYWxJZHMuaW5jbHVkZXMoSEFMT19HQU1FU1trZXldLmludGVybmFsSWQpKVxyXG4gICAgICAgICAgLm1hcChrZXkgPT4gSEFMT19HQU1FU1trZXldKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRmxleExheW91dCwgeyB0eXBlOiAncm93JyB9LCBcclxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRmxleExheW91dC5GbGV4LCB7IGNsYXNzTmFtZTogJ2hhbG9pbWdsYXlvdXQnIH0sIGhhbG9FbnRyaWVzLm1hcCgoZW50cnksIGlkeCkgPT4gY3JlYXRlSW1nRGl2KGVudHJ5LCBpZHgpKSkpO1xyXG4gICAgICB9LFxyXG4gICAgICBjYWxjOiAobW9kKSA9PiB1dGlsLmdldFNhZmUobW9kLCBbJ2F0dHJpYnV0ZXMnLCAnaGFsb0dhbWVzJ10sIHVuZGVmaW5lZCksXHJcbiAgICAgIGZpbHRlcjogbmV3IE9wdGlvbnNGaWx0ZXIoXHJcbiAgICAgICAgW10uY29uY2F0KFt7IHZhbHVlOiBPcHRpb25zRmlsdGVyLkVNUFRZLCBsYWJlbDogJzxOb25lPicgfV0sXHJcbiAgICAgICAgT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkLCBsYWJlbDogSEFMT19HQU1FU1trZXldLm5hbWUgfTtcclxuICAgICAgICAgIH0pKVxyXG4gICAgICAgICwgdHJ1ZSwgZmFsc2UpLFxyXG4gICAgICBpc1RvZ2dsZWFibGU6IHRydWUsXHJcbiAgICAgIGVkaXQ6IHt9LFxyXG4gICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgaXNHcm91cGFibGU6IChtb2QpID0+IHtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbElkcyA9IHV0aWwuZ2V0U2FmZShtb2QsIFsnYXR0cmlidXRlcycsICdoYWxvR2FtZXMnXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IGhhbG9FbnRyaWVzID0gT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGludGVybmFsSWRzLmluY2x1ZGVzKEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkKSlcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IEhBTE9fR0FNRVNba2V5XSk7XHJcblxyXG4gICAgICAgIGlmIChoYWxvRW50cmllcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ011bHRpcGxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuICghIWhhbG9FbnRyaWVzICYmIChoYWxvRW50cmllcy5sZW5ndGggPiAwKSlcclxuICAgICAgICAgICAgPyBoYWxvRW50cmllc1swXS5uYW1lXHJcbiAgICAgICAgICAgIDogJ05vbmUnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgaXNEZWZhdWx0VmlzaWJsZTogdHJ1ZSxcclxuICAgICAgLy9zb3J0RnVuYzogKGxocywgcmhzKSA9PiBnZXRDb2xsYXRvcihsb2NhbGUpLmNvbXBhcmUobGhzLCByaHMpLFxyXG4gICAgICBjb25kaXRpb246ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhY3RpdmVHYW1lSWQgPSBzZWxlY3RvcnMuYWN0aXZlR2FtZUlkKGNvbnRleHQuYXBpLnN0b3JlLmdldFN0YXRlKCkpO1xyXG4gICAgICAgIHJldHVybiAoYWN0aXZlR2FtZUlkID09PSBHQU1FX0lEKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29udGV4dC5vbmNlKCgpID0+IHtcclxuICAgICAgY29udGV4dC5hcGkuc2V0U3R5bGVzaGVldCgnbWFzdGVyY2hpZWZzdHlsZScsIHBhdGguam9pbihfX2Rpcm5hbWUsICdtYXN0ZXJjaGllZi5zY3NzJykpO1xyXG4gICAgICBjb250ZXh0LmFwaS5vbkFzeW5jKCdkaWQtZGVwbG95JywgYXN5bmMgKHByb2ZpbGVJZDogc3RyaW5nKSA9PiBhcHBseVRvTWFuaWZlc3QoY29udGV4dC5hcGksIHRydWUpKTtcclxuICAgICAgY29udGV4dC5hcGkub25Bc3luYygnZGlkLXB1cmdlJywgYXN5bmMgKHByb2ZpbGVJZDogc3RyaW5nKSA9PiBhcHBseVRvTWFuaWZlc3QoY29udGV4dC5hcGksIGZhbHNlKSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ== \ No newline at end of file diff --git a/game-masterchiefcollection/index.ts b/game-masterchiefcollection/index.ts index df9bd6a..c5ce456 100644 --- a/game-masterchiefcollection/index.ts +++ b/game-masterchiefcollection/index.ts @@ -10,8 +10,6 @@ import { testPlugAndPlayModType } from './modTypes'; import { installPlugAndPlay, testModConfigInstaller, testPlugAndPlayInstaller, installModConfig, install, testInstaller } from './installers'; import { applyToManifest } from './util'; -let _GAME_STORE_ID; - // Master chef collection class MasterChiefCollectionGame implements types.IGame { public context: types.IExtensionContext; @@ -73,15 +71,12 @@ class MasterChiefCollectionGame implements types.IGame { public queryPath() { return util.GameStoreHelper.findByAppId([STEAM_ID, MS_APPID]) - .then(game => { - _GAME_STORE_ID = game.gameStoreId; - return game.gamePath - }); + .then(game => game.gamePath); } - public requiresLauncer = util.toBlue((gamePath: string) => this.checkLauncher(gamePath)); - public async checkLauncher(gamePath: string): LauncherConfig | undefined { - if (_GAME_STORE_ID === 'xbox') { + public requiresLauncher = util.toBlue((gamePath: string, store: string) => this.checkLauncher(gamePath, store)); + public async checkLauncher(gamePath: string, store: string): LauncherConfig | undefined { + if (store === 'xbox') { return Promise.resolve({ launcher: 'xbox', addInfo: { @@ -91,7 +86,7 @@ class MasterChiefCollectionGame implements types.IGame { ], } }); - } else if (_GAME_STORE_ID === 'steam') { + } else if (store === 'steam') { return Promise.resolve({ launcher: 'steam', addInfo: { From c9cb4b8f12c66a77905e938127291d463ca08e44 Mon Sep 17 00:00:00 2001 From: IDCs Date: Tue, 13 Aug 2024 10:51:01 +0100 Subject: [PATCH 3/5] MCC: More lenient modinfo.json parsing --- .../game-masterchiefcollection.7z | Bin 0 -> 94680 bytes game-masterchiefcollection/types.js | 2 +- game-masterchiefcollection/types.ts | 38 +++++++++--------- game-masterchiefcollection/util.js | 2 +- game-masterchiefcollection/util.ts | 2 - 5 files changed, 21 insertions(+), 23 deletions(-) create mode 100644 game-masterchiefcollection/game-masterchiefcollection.7z diff --git a/game-masterchiefcollection/game-masterchiefcollection.7z b/game-masterchiefcollection/game-masterchiefcollection.7z new file mode 100644 index 0000000000000000000000000000000000000000..bfc45427f6d87e4885368200d4f89c5c045b581a GIT binary patch literal 94680 zcmV(yKwOs1;lzM z_V@0Ij!=+@v#QJ+E^`!0UPplQ08KI?^pz*GBV4t9Ez;}tQT265b#%s(>*9ns6b`#O zar2Gn{Ss|%AdS74;M0^xS2Y9SyM{@i{sDqgi9uZ>#BO?86h5*cLG}z4TerblU;d}^ zKzRCHFj>Ef8v;u)=?Jhih0KGXG<&RJZB1Ks36hb#*EJU${!ve5bV}hCS^7-ppFmgF z9#s{g!O&0Jq>+ffz~%W52D#n2KeGLl;=#9o|&gA zZw|*AR}zZ=rqx~j6l9&2qgf_sak8A_HquOd^K?JIL{Xh}XwtP#MP8Mx@V6BS?m1y_ zeoy%GbJ#r@S{u`bchY_NyYunWauEq(VS~oQs@~oCkjjC zg^4kJe&UG)0E%`bxYsYR`&}WU8wg=v!hWJ5Ny5^|2^rQlUh3x)bswpI+QovgwvGjR zs(B?=3&61_3*OP4dGfv27O{rgYLuu}1LQyC(OcuI_#s!MR)}@AXuNj`NGxNouZavS z-{c{CKe|d}fwHrfKe8gjZM0@XQDa&qL=XBM?bnzRwsMXmV=d?ImtVj!H)vh$?L-zy z-%r)5Ea1z!pRAn)0v5orpJm@+pI+}M+6vB*K^O1`E}jM1G$5$>NYc#M?V@Js zchbVG{)u;#;7ph42i5NN9!4R86jg1Wt&I-SsZ@>$9fl-mV!+T0b}R55ZX>n>EXhD+ zu>K&T@?j#3X#SA*!iqdO|C?4a354Kzo*Sn)dIME=v4dVUs6F|pnaugYvI;PNwPT>e z)d%({uI*TLs*d6tVEPnv>sFy;Gq(oE3laUtb>GOSjUE=?@aLRVJ5BU_T}$CA>Y^N$ zQsr@bYqvuyDd`UxXlHRmy1@~8oX24*;HJj#ube?WbI!{rAvGN_>Vg@q$iQYQ9~UwR ztoX z+UUg0Go1l3_zX=zx=|fbdCesD1lGj`8I0vj{Ptl{8Yo}0SE){T~S!$lPkeM`C~(+2sfAEF7<-Dp@k%0L3;kPW|ntFJpvJgRml`Jtl&WseMcFL zWQ7UN^GutdClN)5`1kBImd;EO!-+r7e!Y&Vj8^@3H`+)+{RK7OOwUP0fR}&T>iU<~ zE9shKe6aZ>3Fa8owd7>M(Xn`-uK@rSe;JiaB5`?W7;+%_%KDo6bbJJ(r%F@)t$NQ8 zB$idKkVtP3NFo5WFNOGwjhdNmKWddRi&Bz7n0UufrZ|1b7!SBvY>i`ArZYyMuvqrdmzZ#Q{0A4hQl+rH z*e9IEDc`0obyNhOV5tv-hVf@qlygNRc9!(`hN{ zxG>%zpME{c=bk*163AnKGmTzQEDAc9Wu&PJQ5ARCMCP^4yLhu{r3+h7w0Q3vTNf)* zg#!GhThig~pS(meJHnQTn2ikL*>gbq=O1C>xSj->Ojgv<;;#S!=bE2PM99trLZSKt zZ=pBY1!^fjYaCLy{X+;RZ;26~Jd&aI0B0{mYly0%~!sbVxY6|gUPpn+lOUrf}?w9<2grV<*03)%67aQhj&7z4) z_M1NG&3=VjHvNQ_>t*!`?&n(xiRh`W$06oR@2RRx@k3#ZcYie#0<@B(<_3nNu2Z(w zyMU{24@s#2+2b9^jLesUu~GB=GXw4AEMP{pXhjzV_%|eQn`DrUgNacDGfF<_Qu#;>XZ_5g5rB7V2*jX48>Jhywn6(#DvV z19q@h)tOO|NOBhR#Ffq8h0I!*?#a>MVcn;FLd7{Redt1dbu^t*4}(-bIxy#u_B8n- zIIx9p81i_ej(R~+zyw=fWES2jY~T&JB+d=n)eY1ud%T)R_CnK$02^a8c=qWP2~2EX zVWq$p60DX@9RO%%h}_0V>)|7gSM;RuoO&z&u}rXTN&5qJ*B_sl9&B4irRB-{G8JLP z{_jyuhuyuvlusV*tJdb=_}Pl}#;&)o-Z3U3L7G8RmXc=6MPD4wAwFnYHWj6!~hAZy6qIfrHD=efUPwqYPoqITgnHP_J35!m5ni0F?R zv#Z7Z_8?(zKlKh)eS<_G7n*}&lRnXtp%O9XW*Ie7SUE1o1QYjk7CC5@t+ujryI@V? zn|4y(yKMAz(pMcodZ2vk>skIg9ET1@u{Szb4isS7Hd=N9SMm&BEzeETGTP?U(`De@ zEElcdy@xUtNvvTEsb+s1inVnL0tO*TRe?SHUvcn)$}+`!5GmX?+Xj-ski*PjH$J<* zS}c^6{H%hN%t@habz@1dUI54mdIW#i8^7D2YE*ImHLtSw)`r0u5@&F9-T&GG?`xzP zfd`lG@;E!Ge(4xaM85KXlk0n7>l0U;G}ScOK$t|a#XdEcM^6F$XXSsp>cWabZ^?!R z7A)ad#Ik};`<3|W#IS|+w?p=0_~3!HJDm7r9^;4pbW|#E^gf9j9881>i=Vp#~-qv9qC z1`QhNNSvZ#-pNRo9I&__4Z?Fs$w?m4$sT^sy!GI;Ho*rceA-Uk&L0(bx5GprLZY-4 zb^5O>CltYBlofM-!S{LN9hTcLq*DWLuW;QR$gF6)lUB~h$a2EKyeRgXbvH0>X$i-8 z)(MA_qf{h1`942zq+u>3@cbY&0D}mJY}Q9?!qMsJ)1$s@N)0zF{R-9PswSUx(Xr{@ z`$qV3c4-xJJ8*oyHCa**)V#(7Yc;c`2=ozUn#OhHI>f){VSZnJxd>*<0|mHz zFT50#uRz&A-#na&Am<@Y^p*=*8M9hRuig{ zx-!yD2`V9<0Wta`uuZCvW_uhT(T?Dj4hQ)H5$Nb?H_C^1oFe9Rx0xy4(Se8y&$Cvi z;UFTYI;@SfoH!sP1=f~9<6b#F&vZW+06K^hU>r)<7n2=&;9LGk$-J14J0;X>*h z+W=Ak#ypiO`2JShMy&LgtGDXI>F)LdCm;%i`AQe0B3jQOM1E=6 zg$HIZUI?bgvDs|m!oK32`>0Umfff5!#w6W9Jo{b0RNh55uj`eBc`Q{QP1|IPb(mZ? zGGJX=LZ!=#k7Ml4Jy@#p_(i)OV3n~?>z&P(!E zaAJ>rn3G0uDadM+Rx{e!J!-0U_9EKk0gl12JW2Zhsf4E-n5x&29?tYEMH%Uv*l5^} zhZtVD95&l5Jd`SMxrP|K#)$A-%R<5KJLbIfYxdo&{yr~tz6;e74&R*0AvGdUAB;48 z>mQz-#EJ}> z6w1fO#Oco4NZ@n4UXV8n6hZ5cwF9BfpYxT?9E$}!P(5K9M%&~&cT=;%=OZCzneiT)sEE~D+Q_X_q2|!6M>uxKOxP78vtYP1uFkH6jNark-N|b66d@Hi8 z3m`nai6v~#ZnCzq+Ovd1+Hgyk6cXg9UvFus!iL)@D@;+(AyM>>_b13-t{wHDBFpQ` zhI^rC-AT`PkWEVKs{wztDwm*8!$sM+t{xX$-FrQHz$A++jw|1>{RCQ`kA#k;BrX+i zoS78>nWLU@q`_I}eLn7hm$ZRFV0)*efL*F9v!VYq;5@Kd4cSZA9ajBV9Cj-AL&h5Ct~|6T>PQ6;wED#)8V6PS zM%nvNto5N$-^9Gw^d1O+C~8^gplQO@lCqt*+$cQ7RWqMrpGZ-K()Am~?|#{y;d4eZ z5WT)QnzfZCBQ%toBJ6(scFU-~c{+iz<6^j~iSe5wp-c6hzU~IHI|Ti(cLmwK$r&z5 zZp0rm6@*XlQcxU+R7@cD>rroz-E#o5laVwaGbD0XH5M;*ktwb1)(%c0CN|7KF*ujw zhK=$34^*hdS=3tK6DH z0lL$*O=L_aWz?RZc>KInba6M8W;?)G*v5Alc+Ty_z_sIi)m~}YP_!I9CQ7#JagX&w zJ%|D=-I5v`YKMjfBP;t}gU zU;v&_3egXtZXBtbWK5K zqkJ*C*8nc_y0r4GJ>0;o;nZ~1J^c|!7hwZ<2|HgaE>_{|9tE>|SRwS8~vf;(j zZ41j4W|pq-<;>2+QrfXxZ}0hEKy!W_!w~eFOE}HAzL#hQWqD>a-$Y_U_a|)?H^^&e z|Lxut95wt2WQG+omAD3KV300FfA!} z$;dns;K61Zp}gWsSAfK5 z=+|*^ywBz{w=OdlpV!`gqv?wy_8rYXY4b=D-hhg)o?F(iAoyfj=H!KL07sd7T^pT& z#7UvL=2SU#%(a_SI^qC-f=$2`TX-e^R^d6=1!6J(@oJoTRZeOeHi&nvQs#t{U3m8U zC9~el`IqKS{;*$6`2>|Wgw?m6*Ku>8X)@_YBl!JW-hC(&; zr647d4t*Fh%1ubVSoWqtczj&G;n!XS>Ye%}I{zfUg0!u>7;ju2(GqKg2eKfhE3HTB zur!x-O%pFC3gfmr2k;r}qoQf~P}U{{C_(qa{Fx-0cZ5uhQi27k@oOd~DYd}qqRXow z&~%4?Srwfg6hW=M+O0(9Bo_#v@O-Xl?o#ScTbKl0hLab;Myn9mFN_4Ei$9mWWgJUO zN)T@|BjYJ_B*s**&up`OndOJB(Fmo=%pFGLZ(cHEwgccz*4Io--WjMdOT3Gl5$u>;(qTB5;nC9g)p|b^!n{eDY)p{i z=&MW6LGWVyZ*+wJf_N~P^Yei*ThssJv4;S-Xn8wS*33&I197H+H6qfWxD$wIzW->6 zD|S+FK2W70N5sQ2#aho(i?MzeSD;X32(>O4N$p1t#brp>r1D-;!=`!e8IM<21a?!$ z7jl;^EwOTMukL+1j4Uj;EuF)zs*ZG1_8-$h9{F4^xSU!bQe6DdV=V~$!$LUFq=7vF zX4Dft4jcad0ZlVlQsXSwdJ)PHwhP;eci9ZJAbnUiT^Xl+DcJ>Uz&&n;X7PF2{Pm|p ziJ?j!9t9zl6#SbV!q)2T;1Ab4cB#=dd)CN6(zT}^Q$l6%pK~!io$!O_|FVNc6e@o+ zhL2(gu*QIYHX_X#%&c2LkRC5bz--I9vai5V>?No-;^mhDYkP{_+;YC94rEdmsu0_} zw)rz`{4EFa0)hgs_*o3#9SBYT?jrT;_{RqRT0!Myk*V@5{pErE zm{e(|f-+QITINVpm{NzP2w4jE-ylwQCHh4yUX8ZjA|^3_ne042m`Ilw^yP`~atX)q zv&xcD1XMx~`^GfsN0*)K?LN)K=U4Yf+KQf7^eLL_>Q4wOE~*4f9)Mbd{G`Te;h8zD z@;@?2dOwqL>84|DMb0w;14HZK!FJ0 zUqKd)#YC={BwugBIe(cyVdyEw7l#>UE2GRfcdc@5~zOtOc4-$~Y3(hv}|lg52G zI$u+)^J9%2MK(kwKfQcK3wd5pm6UDMC6jKivl~*8RG){SpBu8aa-8WHd+;PzB|kcR zaQx};!_K3)(1Ki(As4@c2wPEj#CNBDqP2?vy?#T?oZ_-v!Atp+kHxrwOy3LQ4t%W< zoICg#*GP^DqoN+Xu&;9(^^t2+$?9|i&1uL!8UX1MXvXtVv^NQpN1x_;5<*~s62%c7 z8n+YyZlh%E#XiKJo=z)svu=c@VBE!S7)Z7IyWxGj&*lx>pX4NQHq zVa}&rm{?~<6j+5!p);>w2=F~Shdm~|{A%znUXi;hU~(?gz%v|qvrHz$5h+r&Y4*M~ zcI@dxJ^z=2gsLD>O;-IdH(Nh{56#Dn1)DxE(v+ab6TXv);7(%(Z;!&E3)xX%d|kOy zlz*k|YHlpQt;KuDCFBnGmLWEXFM&tR*Fzg9+qr_G?4CAdpZ$Oggg!F@odud!XX!NENF8FDbKQ~^%o(3WGn?Afx38o|*E`;xR9JULrX9^64s zYGFw>xV0QtE;Zri(zchm=o3qR32z)jL{0l51`Go5>_0RvK?A>#LSTN z->mx^S8j4NT?9>@5OaraOa9VPs#{B6f6yt5yE&fNwWIj|#oHOj;;icVB#^%A=>5T? z5sbhtEY|ddNm-!pEdzLfnV0E@FRir9Wbcu@-do-wk|81w`Yc~`_0cIuEEH&Z^`h0` zOJ*>fD(X6Vug|_mQ$B$=p9MhxKzEYyC01a>1`JnG&#Q|8&dz_``%{}onhIJs6bHFWf!zvdBd0NkM`orwfmAuvRindc@av8obsGEr zz@M(2V?`8Heygw+A;A>#f~}hDuPwQ58Y9YvZKonOKl166!jBIA9@$HC&)yqnRBJ_}dbCOFE zIe}509!F;=NkAx(17NJ9*v^Rlc_rdyv9?hB=UbqdpYCoSVO;7st#;C$bqg*C=%u75{+rL`E5NK)l%_BuGYQ@0)X zgP_hiJ#h7tVP-p78NUFi=ohQr{Zrl}f}EbKfhgd7EdWf#Bpe+t-*T}G>Nvt$Ld$Zi z4AbHQ^I$_N)Np_YVStHKfFY*-bNcvf>9)zffCNrSGF8GJO5Qopj~bZ*G6{+-N~kUV zjmbG|M;Jz%L@;f+i~K~9!>&?#EPxA(Z}Y+R2x^qYz`K1bBi2eV)ldZ2$iu0cVZrXL z-Ae+T184`sGIpeZK2R90Vs%=a=pL8Xx(>nY{SERAcEMrwm8Uv>CL3M%ZjStE~b!e2eZ3l%?A5k%A5@*~{>s)U#23z6$YB|V#GrQau)DfLIchVo1 z17A)43j`0*r`TPt6B-CZs8WrBQtwgI8e zb9J-K_)bb6VSo`wap2R2ynlohLPGp}NjUkJ;X^$OIu~poJT)R>YbL!&P6M8q)#SNa z7oAife7Vgt)RRG__mnMg2TKozi}6i6W<9fX2+$)#f|FU?JaJK-FM{Lp4S?%N=+)aE zBimm){RF7;q`%EO*!@HkgQR~EWX0O_st>h*_-&6KvtfV0jtXrD(hW&}xmXIuj9C}# zh-JTu2F2LQ4RnO4U=|$!)|l>|j{B~jWDnLzU31sWoYKI8ns+a(z4;f4*i&W#cc=K8 z<43rb0c8T)i%_t7jL9!3TcK0R8}BB*?{;@ayAfb{tWA(d1K9d@(-fai5Ny_Gh)&qE z=>~M*8l|c;97A9aRL-7~KVL7S5P%xyZ2uBV@9k!5%%t|1$!`=p1kDNx{O-k`?to?c z>&9xi;-xO3@>lO`MdQ~BhFWm!G!D~ z3S>6IjnYM~xYY@*dBH0kw9$*HFKH=&Htx+JoRc+re}m(|9&XegD&U2ax7Pa3{)9GV zI{p>ANY1dfG%)nQE!|u^Ww;F&gW2rJFxBes5Q!(R>^n*2r7NYKpw_E=J|87qtZ-*g2P$=UWpT<>vOEj>jU0 zIkp@yVll+7ip#~MnIM4w-_clongEQ}nhGWX*^bUOep5)%kZ({Vw01Dy<6CG1Mm}7z zf-3^FPR3eVKNlVH>wrvsGzN=N@|uL*F0f+TU07mRc4Khd%8X2e!O2A;d*Hom;%yQE?Ta;|K5W0E?8>t1YSDe&Uz0qhu^Hq&M+d~V72*$0nYLI-D8@sWM zg4O>=C7GuvzRcsaH<=+wcVhX_S!SGu05-Q7GDyAFnz{t(tp4hbeAsB9z$@-*d?o$j z^P$Sy8WwI$TN%~O=}+zgH`Zj|mXdFCuRBA{KX>f|6BZ$QAq1FR>eH6slp=w8WfzCG zgM`&M{CzTg^rD_Jz|6GW=^_$WZ}ja-L5OurDaY7uIDEl9za_A?k-=_FTX=QoTze z6q~XXDuqfmFyOeo*@RQF& zQa&>+IZ4NjvT8fCcTjOYge$~I?O z57d3sin8Voqj_LX{7zr29)wtQ$#&*Aqd!08HTlfwdxj&p+H}7xGUF^gjXOB22%5{+ zR(C7YRgiC2FFNt+stC>4P`{-V4rCZvBzw}#nD+x-*CVIeV?^SfaM76@o9iK< z`S#zV7JZOFUviT!(1+uW?c5Nu+i){dfNySXFs}`OP*M2j1kehhwh(2H#7mS`vl(_l zfN~f67IM)C1#5$27cZj^T2`UnTbtG#QIRYesGb**#&hGz_mKfT>$shw7g-8pVe753 zv0RG>dSdQ=TC@o`%`tOQ&q8FJWK#4Rk>v?p?|}?rF>evSO=%wkCJ1jJXo5XFQj-=x zpBclVG>A!mPCp&u&rmmDG~~$=+62+~+wZBMl2Tb-D&k~j4mpcbDQZBliNz^}d5-`* z4o;%;%7rrwFB??>r638S6hP>gGJC>4S%Emx-1OOY zRvRnQZf)6f(aZWF^jVO6!gwh-WnRvgm2o}wGhGcSffuSoKh zOK%J=>YYf{DGSjFdGi0cBf0_os!ewmmpm|sna7H^54Y0fMuGUw^~{G`4N$I-oh{3N zCAgh7D=p@-2>?Ff_r1)RleZ`C=+YfdJZIJnSE;Al;z((aX|XwbEXAAd>2T)i@Bs!w z7~W%09vs)a8EB+gSl1bo=ZFcRc#^IK7hh8rFqm9j-mOwu^&oHeDq|8-jz4$wX8!neAmJXKkgnWHWEqho7fq z{waKi#o&eqzs{U13aKDpP$GiyU=P=NDzt?NUaDcJlp4dXCookq1 zfX-xvm8GlyOHj86T^fbD#jdSpWHTm-qRcuq*kXQ?!&12l%aaVDjTxYHKsV6-KiJL8 zif9}P(<@|@nKf34Y5^HQVwtH+3Ik1jigIzVff04hjI$1)Y~)S3DPLB10D50Z@)Vq4 zH_j82`F)t=ws&i0J1VCelG~~$+{ku0ge})WU8Eo{x&q5ACvCvyC@^nGNzoot$2e#q zZ`YETUhp&6S~ccPC-=X$>_xyfJNc_o0i%vL5imRO(g;BE46+)qkN|LC9_!M~E$?5i=eboeH>N}Qa;fwc$uq2$E^14KGo#6DhZ zK1M42%(;Li93?H0{+Fu%D_dxeXPZuM*z(Y?*Z5~*kE3nkkA?Com?&lE58gD#wv*Q6 zT30;mGN)Djdniu8rZTWqCgaFT>ds+6q|~*FgpJ@;)@nh8dvSfO>xi)+B|3Y7aasWL zqON$sCKIhIVSYYXbNwL*iT7^#;7v|~gm!L^Hlni+b^D!AlKZ)h!goAWp=sSB0E4w0 z>Jr$MLy_@Fl|C26QGOSMsT9`KLIGLMfkYmDs9!^kyY)PP{v7#_=h2Fr4zV>svRv00 z1a?L6CkJ2v05re;n4b%6`a_Wicah{`I>J$)5>8Je&>?Ft4-@XX0puS)JT5q3=?A|u z>tvcr2e#=u-qw&!ZH~4O*$-Sv!FSrFt=3#iS7=_Kfte^_B*37k;S^6$7Ye%z0YUMO z(q9Rj7y+G@0VL<~;(&^|Fp=tD+yF!YgG(nDJ*jHb@3`)--e~Wo!t#c3e)#G(CG(Ky zx*QxGwJ*^P59QHXBDPe^n;Wx6*?}t5U^fpnpp9K{YuO1y`F#j(78?=Oa6J=7U%m_( zCi3{AakbQvm~FlI60(Chi|ME7H4Q6@i{a}#R*TL+S{cyX54uo+Z5Dh64#q9So$pMX zj~=q|wE5fRZ^qTDP`ibw%OX*{kSg@4W&*R6<}z`W2VrNowq6Bvgp$M4zXpbxr4%#l z3_^SMa=lARWkg36^v~;lnvD2?l8Ss;8VWq_XtN>Q)Bx;5+mrIMZ>tlc%Co_Uf~GZW zvN{Qd{eN}Ny-7=JDY1jdGQc4!QsZc41aGh<`kUjW@M6IUZSw)dD9PZJcfLCz>s`tr z9@|hmLpW8^0tDbX>B1G=)>sI&Nr7aZGtH*6HinH00iED@dSXx%|iv%x$X#t@3idp-b^XFWpJ%l74re{R;bAB+J+?Iz=^UThPS~wFsrd!2e4D1*r-JV_y zaov9rm-mEGFOB*7I1#*ruY8;ZjL{WcTzW?OMi4=i*?6Cev9#fwfdV@Ecc>?yi^4l( zt0btxjq4SrDFI?XN38OhL6T*Buhk-d1UueQ=%Nxx%5D>rFM?xsvy6xQT5UA^ou>vj1q%1!$XcxNDTWW}Nfe%5Tu+ zsXNR~VqE^_QsEmEqn~5kU}eq9+*;_<-PLhPuw(0zP*oVg)SuZ7U~X#c--Dn<-gCZ( zk;O&AgUDhFv`g$Ce@az!G`NK^GEA$*WE5H&=|PK;iqrTF)tMYh9UfzjMU zRUUGAJjb$k!S)u#s3it8C!JAxe$<|tsUfNfi1M9MBICoLXsAST_px_{=epm%w7l)) z1#C+6>;0jWrNbf1fQ&n>p+=;InIq2z!jyOu3A=WJ(y(}ykn)A4kf#tM)VRa$4rMS@ zoy%%nYa`A4m@YifxW)oh9ha_S4VVqaL31`W-h&}p6^dOK=WVeG;#-QHM9UOhU;n-1 zm~>gEjIsBZT?LR6uYx$2#~4klb*Ju`L4GXrhp$z8Tv-H5n3hZOwI>t|*_|^2)+HWN zv9w8`@^oTfLJi-~C~sO5#0C-7^!K^@`w!Q-w!zFp(^s-$TbONA^hs%yi$C6>#kOs^ znn~Q2JrjOA#1>VK_l&igzrc^;#;etlDwQQ%^J1a8c-0A_YZBIPlK}iJPyi96b68px zA%fIf1)mPQvW=2}&fH9TI)G4(#NQdMba&!!E+?dClP$o?4O3_mL$CS7+HPoHT6@^RmUFXhAt53FZN`3cKUkLnGuGcaE(6g(EnLkx zdm`#Vm>;CIQX=1LRUkA4C_z3l&=wZ;eNa=$J$-LUd-`8Vodt}_V(@d8__H{J=71RF z1l&03t|IMd)xNTYAw3J4Ns{|@p zNk>nbAitCio@=ItHS)hp?jYbg`YCB;Qa;vdJ?lQRO+h9aPhcVIrsp|x;MsC~Mnh`} zymO1PS0v{CV|22e^Q9LipOCJBdS1rV19Wk)6B0&_d^)dUK20E&j&db$*otLJ@|c{w zQ)|bs)o$42r_#t@6;W9JPd8qyMZ`NijTU1!2VNrvuSsN^^m z*`%JU*MS}?bts1+8+Q0DZ-57gZrsFP{2rp0gpv*orIAND;Zbcb5Ajo*-OYL)iuCYr z{Z;JxGdcem*tj0oWfh%fR4ayNOCQ+Q%R;CF^J9P9k~GYgj;_7|z94DO)E~&szllN) z!2l4h5}UC%H_#DsG)Ys^;%71)NMH_>kf}ox&t<{>!R_n5gK)5q+ooRCM3sywFyAvd zh!g3$6QsyotNOJ(4{qZ#tN?hT)l6P3=Bjr(DnQk*5oYH+QHG5jTDg7STt@wX%$e1t^ymE0Z3>_sU3Z|0s+j5nYzvA|huu1n@)S`{ zHZejDGH9!; zF&jyJWQ91+*>(V*$IhU_X^o3RXL#5vfPinutXSeIXcXPrMl1mq`Q6zHpSwp^io-Li z>DU|-aG6qh0`+E%X4jJz0Z^!gIqG8eATtBd1Zd|uoikY1+|7023k@(8<7I#O%F=r{ z7CTK1&6GUWCS_%5XN^$}AiDQD&jkfR^RjM_G~~N0F=F+$n0ZW-gJ^v-lULazI1Qvh zBXxHDWm#Zu54B2r+mtbw12*^B}FI!qYA$Sw(ae$ulfbFIYgHlg21asa+ktJ z_hTy~&=#}K3$*xu>Pc>4*5IY?R)5d9$GSZyK-fw`j7Gf|8n=Jx>&*PMCOgn~^sco> zH8l0ZS;#mgiD*dGNZMXt;)}sj;=pW^+RcGJH|WKv3NrKS#s*Y*C?Vx8WMm~KSAZbT ztb`Hit*C|!^sl|V=`zMIjlp=gI{5Jl0!#i=`JSdo%_|V4Zhp|j|>rtGhTZMx_X9(JD?8jrwl+qnP2OXQ1*N=@WjyuH_lnwMRFSb^(zZjySWRy zFX=nd)7w@t^?+;MKs27OJhDDU$%veN-qJM563nOqqggfm&P05#_3}zP8L6C;2vTw6 zEjMVfp)*XFU!E{T;*?S9wgx;lW-><)FYXaX*yHR>82&ladv<74O;yI^n$cSPlQvFY zN-o47_`jpcGb6zm=g#cy$R&@(es{{$IGSNk2BVCp+Art;*j8sEky|1z@kfw-au3d( zP-&O`rR1D}A|J|Rsin5J2pB5v5;nP@Te0v1`L3p5km+c#S4fO&^KuO{W*0H_Z0MdwPwY`cCDYtQLw6ZX6XyZy`I z2d{{$V00o4g8C!KHI7hroR$8zOqoN-DFGV5k7+Ro63Ld*UJ~$FXScM0Ese!9HwK-Z zR-9Ef9O@I@;TEnyw%y@J(dxq0@_GtiLL9hQYXK>ORSkv+a!gx66 zCd?PW#}sSFnmnH{Ax*&cMrLvXO#env)*chd8Uk>L9xKXf_b$ZtJo{x#(mm8`5?Aj3 z)W_S6%Sch=GpiTegdAWn@%~1V_9+zz{DlfaJf#O81^l|vWRywP%q;TX(o1-N&`txO zDFMKf-KB}4;v*V>%|>r%=1@2At?|?(&L80BNt$pv)|Zc<@Qeqk_1Iiy^2lIakdF0D zPTgh?N-0hb^%mzK`@2UBSbWqCP|6>>bE@$w3MTeJ#EN-*i{Q+<5%AA*T$CuA+vrED z^G9%Nm&7~LiQ*GFE!!kNi+on$O3ciCl+=Pj30oRr|EhKvXK#1Pe`(`dzlyi{!HwD^ z;oCB|82w;*;xJ-#X+k^Jr8I|T(8qjDKfVS8#n#Bj+qlC`t? z^EuwJTMbEycHd|MjU<$1bLa4^gt>XJ#=ZOMr%kjgW7Z~!hD85W6BaZ?^$ z9%ejd*^%9}tLgr^^tRRdVXkS|v_x|(Vb}DKLjW&_O^OZg6$wX0>yWU!(-%FhI}0!(AVcZ$WSH$8ojT zp|JTK(&vHkY*Ikf$__A@RuPxP?z`ihgdLSrlh~$0isy8zYW05!16SCNzz;)O90j6? z7mL}B?QtAla*CW+!Qoh=EF1rueyh_Ix^m}7^Ea0}*dPXJ{N9w7 zy}_^^4c5WLFNknh_60jQnXrO*QI;%l-T;j{=I#X~dE#j})bY2Y_%-33lL8aFEKxnN zigxwED?CB581+gCin>NVO>spivNUQQ_j=%>r)DQ`o`XW}kz8jG>K#~Mt>Wq0rLbB9 z;#U(s;au7}*c2AmR?FcQcwm)L>Yr(7wJxU^=ZFNr73l?>v)EkBC(Z1@NxhG%DM}SMq)^ z<4~Q=4CGlvJ%s-C#>joCZkof>fOqFsV-s|49r~vI|Elv~6}?r+PRTZ9 zpb@F6#)1bvKYOqbuL$JGuXQn;Bg;a>XLg8TVaLlf=m>*XngNKXz`rYN^=p_9G2qqe z`*o1Dh{4kZH(AFdg+8kif@CJa<#iyI6xSvmD6-e5!vj&Pd)3%XVAzT(-RlhkLaXSI z&#B}8cS~_!Iy64)q<}w{$T3#j&JVjiVwam%al>i!=CSHwFUPWf3)buMMHmvHdqcAb|-~_r6J|*o;hHS1{4HAb*r~=qORO?oezi-o4ua)EC+rVgTe4 zv>~}T;(+smyStY@nPFBmNMyJe1&oqQULNZAQEWv}151G^Qtvj(6Ie2OI^@?!v)t?@ zquRVZDJ)Q~95+zCol0OY@q$Ps+&6<=rLSomUR{}+LtMR0yhIu^k_%(FHr`DPe8}sm zx`l88!Ee`a=mD%y?0qmUBci?(SAlRmJ6LGOMA~fzbRv_ zpEFmVEZW~*cOvLn2Gs@|P<-m0x>TC17tk{D_Ukd0|_hd zg{nTkG!Hw42!091ATf{7H5Ua>sjHXK-kEAl0yWP55O0(}cdut>d=v&p;XpW3NJW)j zhqq)fPHF4gpkWvY0YWpuXNz{=T3u-Zz0sOZz)Irxg}yFi+vPYvWhN_BYwogIBC*EK z#LcOqA#HcOOwK|yrC=&ApR_oVYX4-MHZzp3SiL>G)pIiGoE4L^QP#x-lvncruK8#W z2pQ;YLQo(NBv8ioI9p-6e-}D^>{Jn30w0W%&c>dw0=<>mqc~L>hI>b8U;Mu&-@PHb z)LAm=q3F6T8pyO(J)wUImfV zd$ldVw|&gC%K!4YUB}%omjdYImE;hm4dJzDk2po)F|>>D^@Ug_x3-b(yfEV(4YcZ^ zu8+lz!xULpwl`5kR~;==*11md!IW&yQU*drJ!rc`_B~wI9N5-f6@uS}g*%tMq5$`E z@_)B$HAyL8#FmnvzB%${}w#tS*G_-3NYVly1rh zfxyNdFBIA>3ut4h9HeKT46(OK9aGR)EpjSG-Kd8&zRe|0j~ zNkUQ3fKATUVU`jTbT;;#(?4iUeIzn;Z3#=TD;fGvwrk-%Hd&O}^MU-S^&nlXBs`;q z4UILmkEZ$(5DIj=nS*W~m{V==6r_%46@RfH!bM8V1Pfggn=NYo3;<GLM7karF~z4~k`%bC6#<;>Jw-}U5$ zwAc^lS2n7JywNVysG@<2U72T;v&s4%EjbEoHkR@5(8BelU>4} z?D244?3I;@O<*iRenTPx7PA*K$;_&Gf5v~()ZokR+dlv4#&GUQnF6IRpjs> zVV5yL05M&;zdqSgJ#xpv-09arNu6+pIk#MB5-yZCm_oD1%RZo_l4oHjjG@h_U6iP# z3dwjSv9aeCGp;F!HNcC^RI|ctUhfJ3k7s@Oy0iB;uxJHgEr@n5tHE8^a%KIi@*n;q zC+++m<*Q%fs?PLg>ge-;G)MLi_EF~mM9x%7f+o|pEsg4FzhURzv|Q`yFL1w)S15qt zYKo0RYkFkwA=VcicCUz$nl~$f`{pPx-Mx_C3vk2bm(5T6ooDhiKIiWciWLLjfAD`v zAFM66$0h`ZZH~N$og-+ zy<-x@3kl8b1RCl#l1LgYMvJSt%hM64|2OwOy$u8#yiIl#{0cU{X91j$c!mToboYur zrB`m(#}yIx`sZMEUriaDLI)q`rueIHRY$0k{d1T0ubajSK%8I_ksnDr;90TGuCpt% zPITX1^!v?}fDrj}+>p}#KEsJEmH7k_JUb3^Fcjyf55muX^_?Np6&hM&k$Zc<2a1C> zNh-CVHxtHXo9A+uklYB)eICRO?3hJ*=h@~{-9N*SVvFyr?U*BNC1`swTTx|r%t{bM zUf;F(bz_}aD&sR{DR|32n!dYvNT76in{Q}#sT+6HlRd93^yd1IX_Lwnnp0PfWz}RP zX@s%Qw#Klq?6KZZ(LpDss|i=mJXfT}Tl*Sv^R=N8qm%^%HYOH%70s5vQr>Xb5ZxYfl;KfzInpPw?hwgqE|-r>)~e@=X`RlkK-fGn6?FcdRnYU9iYLBz zTJ-n<@lzB$VJ!Ul2sUQ8GxOE`Cf(D%`hB0!y|=}@V;s#Lr{}{h8GVSa^+Y2uJu15# z0%I?{;w5EymHhrWweIUC>Dwwy@T=opRwO4!8n&TxI4TL<_^5)2$y5bjPrH+-?wQQ$ zSFOb7_YI?VzFW?<3ZUOB=-%rh9>nUbaW`1i(t85pW0?*zEX4|biOFCMXZpVR^Qg`( zLft>1W5n{AoUgL)F4uxeel3hotfomT|jbe21dd_Emcp<+%dnq4+|q9 zxPN(6zBR#K{-jJud9dfo-yeB)+dHzMlptNM zNeV31Dnyrx)aT;RubB8m?TiS=+M=D-D`o2=aww?m)CxE?AKCvK8p${;R{(Ab)WVZ- zHFqx_J~~^Pq**{={iv@1A0ErrH%<#jZc$MD4*=z-&f(*Tb3<-rlvSd zM9WE#iuCr21Mlp$=JG^R&rb8Iu_1k$X$?l{M1nt}7W_Q1XU4iP1f3qtE0xPpE5qToat>O()?K-c@X8-3Pi9QF=aj!)pVCzV$N5 zIE9|GHrc|~X7`8le^CL>fp&P0O|_jI#jCo)AO(b`?pbZd)nhB zb+x(}Ux0Ga0z-#px*Qg)mte^q*1$Q86z(YyHMz#u=w!;^^vWTCnbecxN2O1#3>EB# z@5qb44S$seOXRs6FdJhtF`z8jio^zR2EDEe-v=oruusF%_VwWgo!u?v&HtC7=M8FF zw}d}S+@LVrVlBdsC@(aKzozn@7**z@eiy!Em;m>fT3=(f`z{uu0!9TB9RTLO9>i=q zP8_VONV^M-sOb6cI#=`x9?kTgNdcw81A-tK?wT)y>g}4|LDBWWKSkjCyxQDP z&)G4?uX&lCAa_j@2y5Xc3{VkWWVo&>y5&6N};f1SHMK8 z#Wa60otb2&@Q_}`(FjuNb=&7evMMLbqdmtI=+0(jkQ;0c_DsYocQZkGtMZ*G!&S1W zd$CW`OgS@|N>B_Vmg6~fS=(ymSd9H(gg<7HR-)=IYhNAmlXF^Id*OvmchJlBZ4d@KZ4da3W3et&iF1H$?Q{_{vu@d|E za4=a+u)86N^q|&%;oo_q*(}X*0X`S=rnBi21`ujsbGj`^Yfqppm`xjF#1PkE^Vlc{ zqN^1ZthxdVLg|hdV6ab5+xwuYMf4bfDZ6~@3g=yhHZpHq*hpQ^hfgZ*(<09`)Q4WO zUch5tQPrStX#2&ap|JU|l$70J!bnWf6Vg0G%>Z61v1EAj*W2n7s4=UD*7Hb%}oI@m|Of_h$?B)$oNbsmv|0WrqNg;QBgLg&j+#r_+fEkJOX*H#MEZ}C`W)bqj z=aNv%Vm}rBA~iE>uN5!Cm%uIwr!?^e_ejIfBOOr6H%}O;NRw2^c~zOllid{#2+kJG z<$@l^`d*l!Qu+^%6|%Tz*E>9?f!L_rvlZxVyhcs*V}1qUuRwU=!nSJ8hpN*q+00eC zpQ8h+gu_Fa3vpsY)N0Gr^@J6m`xAH1y->tY!0`Y=A&;SU)X|`qkBK_?qEyys^uCS} z+5ie^x4dU!71X(;hX3D38AzMf%!LWl*FT-C0PRN5t#*u>O59E>y=wWUjb+<-BPfFX zKPP*PZcZZI37@~Tv>=qWlaFRQN~*C<6S^^>pr0aHJT_5tpAQoew~2PNyS4DBP0ym6h9-}I|3U{o$&q^!5M%t)dTU(vC z%+K>2KLcuoeu@aaNG5&(PDU@XNdVwO-nV1`<{NhNYaZjb#B)=cYhGY~!qKFTVp zVHT*@zxUlg(`up5Lnr0KXh0gbpfeXep0;uuY3;_2wCbb8jPfu%+ecp9*;zh#!qNu< z3Aisu(lthfeN*%Umbshk?elo~oBqy5GT^jq|11n$`cJ&339~3;^{t~~SNGxPL>Hg_ z@6Kt{Ky=LZt^q3@9Y!g569Mt~0xP>9b|$dCwOo{QYQ1(_6o!#}3FWEU02M;^-zfDH zr1+a+_s4$w;FuDT_uckN)5(WA)oldW)1P!-_jTDk6Xo$vWLgp%QIdx!@^En4lmH?A zgZ8^+JUNROzQfJb7X?T0VZkhmw`aqp{A0V_dbXc>Ir^%|Gv3Wvj8PksZ>3vCd!@Xi& z8VwG4EA@@3AyMHHlxRj1<@Zkv6d!z{k0e@PbeM^k`+o`D+|Zb(D5I5U3Ipt)EHU9i zuH1TBEA^WBqwF#OUunn3<2eN?@*!QogXWO}bj@Byc0mrS8gVLop5aD|Ax=XOkBmq< zFOJ{+>T6b7vx31iv-5d>jPi&w$2J5*@{*tzheAT+297QM;r?{bF6uC`Tb|g}1E7sr zjQEy^zFE{4L{8jvoB8R~c8R1Uxa|HORD1uSTvD*X7;e)1ul>9VbwW)&S7J@agL6b=E zprgdh8Y`!!^}dQyC~`7<334nkDz!EP;y9)yxG_DydZ%QFgTr24RxfDv%78f|5D@0) zQ+xaU!oKS>hSDv5yE=Sah`#CJAEr?d@AN@y1d37vOBNkD3)S3@B+h(JJ{`n>*=|K| zs5JN0@@?jok5)vj&(~Ln%yGlu6~5+g2Wl^(g7>m)ewZ)&y};2d#>pQUAhPyKy=`Nk z?{usk_}%4KOW`XO^`B;@rQe_5%?}xwXZxt%R5iyo_l6v8>>`Tfb4()}WmWT=R28`1Ej4r$#F`lDmpmfX84p1e|-_1{F){v{lMtrvz*9FK~{-k615pibHB%e!o$+X^Au5*Uc(!PMsiaRj^zX#{ItR|&F8}iq9ifx zZxn{hy+LRuK~~?lUnO7n-%S2I2IIMia9&pQdN8hQ|8-~=cRSDs{s^>K;RcDpZXycN zx$fSQfh3%O2f_m@-fH$_t45_499^0br?gS)%#qbykxd`P8nlHbUu$*_5REY5 zH3gG`_Cc7uNMEA!jv=P0hGHL|fDEeB2m!ph-%g#2?%Eskk`dcsBtL(W;#EN`Cag;G z!BQ!)n^)q>Nq#IvDlClw+_}}nB zm?FfeRqR(vX%kDz1ZQgqpqzpjJQdMBT{McK=}(JZ#hV(dgbRvBM&F9C_;?JMU^o77t_qTaznxe=C5~C;aP@&fYxH zgP2VuP{7O(irlrtAQY|dRUv3Cr2tNLve_u?&l(MBwga22y`xdF(e7o*|6X%7Te z0RD^K?RW-iokk-?c}X>U_uWh-*^&ElBf28+T!~8zaIS#=ZUF8s=q4S4N0`(JiSfIh zB75DPG*qvAof{L{C{QhlVXQOt1&Bul02*GTDjt=)MD87~O_$8*OREKRS^+GnODEcx z&q=kPvwOik9o4u&p$|T=^oyVKbxI1BfJHit7}P6n97@cIXuI`%CX2(gv_48BZit5? zo$c5$zyfl4fcTpd*6nO*Kaoo_kINt*)bS!M!nph&d&0StI9ou?Th-K^0I1jTCzC_r zer1P7fKI!YVpIBJ{f1qHBIhz!S`i!vtcA4-hoHDE)DXZPa&4v8Qc-vTgf*LxR4wd-MpcEhqLG0(@#uZ?JY;Th!5!zXxQjX4@erpuL9clzm{hP8>{2lM zcI#>@xJ>4B3#6aK@`~A7*^tKI88g-NM zX&#XmjSIKU6*TF?lGe~{6spu@kB4-7 zR(QCRL#$LuQ#3=KG*Bsm-=I_JEk+qo4(-eOVODAjw6)eU32^>Q?KF7gG<3o!UQn#x zIRQBBL4Tczw}Z6EcQS%WJj?eX-ad_UR(em>^Rytm9(Z7R zIc4p9H|mItyBy|zrVEyTdrqk&piZc)GRq!*if@F_?2QZ zoOe7~7$mKhs%G=@olf~gV~I~TalnpjLr^(3 z03kbEPNgy(B*uLi*C{I;_U6MMpH0SHkL{O^aW^$89hPSc_@fec6duCXSlLh;W6VNx zqZo9VAn|e5+C=-@?2Ha6fiwqmwTt*t`9Zm4ebW74-pux~y?3W)j+=#yN%*(LWBEIt z)FJ;Lzy)rxz(VtR5kA+ZMQRPuC2lv2YR3}pBmNoyZ9{C>3F(290qkKeskA$TUX~qR zMg$%4rZS{vk_2M+`hx9cD&S$z@Jb$f)Mf;}g z3{%3!+2+Y~O9$x*K-_8ej@5c+5}f(CacaI~(clwG-+Hc#_^XyOpl}&&+Hg;unD=5% zE~!3l1oHD@nafi=`_(WFI`kMqP>RFE54ykr1{=Ey90M$Y!AY!;O=3sic^*6({jyG2s?hsA)k=0qZvMS# z6K~a}l=*yVb#^_mfD1QTBM#@`k5)U~5yh#|q9v|%%4U0?A^|Yua>4AaEhDPPf!WsQ zACYKN`nPp+2p+ynKQxGLruSZivW-5M;M+GShP zvm;)M%tFNl;3gSk8w_GX?UnuJyu$IApFd~%2-g(;1@dw!UAw(c(B511tzI+hMH%IuC_ zb99WsGftkzSYubN%(VkM!|YUvluzMTDe`NJ{?+%v_XA0J-IiEvJb%V)uDtNaBDn|P zYIg+bFbmZfAt#(7Y^jZ`u0_7&V7&Xhuefi^zUEH9h#C&pOlgd(eoH3RDCZGVP_)z* zk1~&Y-XX{s5Bg-c$}|4swIk4sb-oVAigP|Y9~)^keqn|>FvD+3cYj#7_xiR0O{d(C zvgbERcp)N~n{h%cl;ne1>!o4UnQ?=+C452fwr3^}s{h2I?z!FAQ&|1j_JAj$=$iLa zcWW&zsp+{jZc}rOFOS7_CQhvTcL^KtbpZP@na@CW{jA~9f(D=;q_qS6f<&AC9YoCX z4z(YddAZ$Hc{A@}_l5(|DN@4OJyImFcZ#SdC3D#MRB-x{NCNz(th-Aj>b3A$Fl&Ie zsD%`6fu^E|T|aHxUbi(K@;>1EXbJyp;HDL~(c=AOi1(SXyVLiY@yK6pzx$;ZeLciO zdMO|Mg94d+mAl#nhBuuuc|8g!0h0v=+#FYvDpsKac}yK?NWrCj!jhcKD+8J7?@z;& zQsIj=gi5TyRZ4?eQcGgtA_*K?BH8?Pot4gbgHF`2?v#5TiCp0`ij_dfTT=E1sw}2O z^HGunW+5Boe(YqT7S6Dt_3Hxl8OMC7x`d2YK#=j>=+FXY;lum-N^`Ki)-!3 zR9I&EuYLjrn)XebcC@pVpRwV;^{OSa2Bl%nIcL1@4LrF{muh#8-q{|vAB1P#KtKQd zN&Alez#laL+rZW(Xec-gIp8OPabh)en;3kxhf&0#Q)>7*&tT>99wxa@*>A`^RtB|6 z7`i<0I2I3u{7+%UbZ~J_#m@TEA3qi)UO?w(clI4yRR8(wMH?_}(ps4@m!hP4^9-?U zl`(Gwn{1;09eLKwy!ffooyI2>-o}FNTq1=|svVe;!(Iy&)~TukR8ww*dR|a-VdLtX zi}^(;J)gu=4bHI131>~fK+5C_L`jqo1{@Ow&aFBr1pHXvZOejMT*gYx5+|9r+Q5!W z^(@MX()vy-ODb%(=_OQ?kpmT_R4S#bo)qfvrdvcXx5L@IlOriATz~rz0jZ*4x2SWV z4Co3l;Vh#`1tgw|56Xuk7i?O8;<$)wWdfiu{c)$t=;2;}8a8YB^T&1#(CMaZfxWT6 zxV|}#JtX`+zgJi^+;c~5JqDbPH}%ssI3n(SEedPaLSI^#=@kQ5t_-P0t~yHR3;GD6 zGoY=)6<)uFLQhDnY3C}H^wlwi{$h87qS*C^Vk%!7BfO2k9y|`mhwSL?O^`{>S6SA_ zIY{BviyP>uZ}&wtxHRg={@jLkBBY3qCbO^7E|CTzYyTnvbWNNx3cW?I(r+?tnc!>Z ziu4I$Doq;7r-J}TZYQ1+4Z*^`C4B)};>$2$b@>&8 zQOu9kt}>^tkb0k0DJ#t3S72;k{H}32Qdyb@M+|YuhB$jo_Lme=mL=VvNo1WVJ&>NIMjz)*Gf$hF0fzo=KT$i_ye0H=EV;S0gb8dVRAtGZqw~d z^Qw&$h;Db7pMLlT92wtyfTjDfJ!Y>)u1oC29Uv+U^N$b4-H~&u6W>yS+IgsL^X>)0^9^Y|4(oH|S{By}v0s`>tJdz!9*anc zJV`o{w>ql~>Ns%UNCZ>AKDy*^(mAkXJRb24J(1h}nz8&aUkST^oz;)L%LXFe|T+E}-&+w-^90XV`tu zY=iyt+@!mMrt-h~S2HJl&L0Ai;&=d7!>$C$6-s322nse%CljAYIQ4H6iM!9s|pBO(+Zv=1U}GvA@59aS;&%xp0w(r zt{MJSw*slLNp&e5qlSFnjy!X`G3DHhK?*fO>^vqBO!SPG?1aGGGPMp>A{^#Sh?&nsb%ZeC z0rQjX}(RG${od!pld{eYU1@DZ(D^)bE!#mX?VF7XS2LT99y%1cJL>apJIu`?j}ZwRO^ut z7>j#?&I7U2n{+`KE+R?@je9{GbO|^2DVV8{5e}(*_9X>bScHN}CS95I--D<&SPNWg z>9DW6(};2awePow&R=jdfC=2#fWuA51;DEBK9bu$HyJ}b*v zyK*lR0E!jQd>W01Yr_}gCQ7pERttPzoRLgfDYj1q&k{%6`wiLv~Vc@p3}Z~3frKT(oEs{cq;$Z(fQ@Usrhd`t%j z>0Ejv7p@?IG1}8@Nzo}h1j~n4o0@n~$n3r2)`7-1_xRtwR_!qzEVaTQWr}Kf3=9Ed ztq+$)u-8y?gTRuQ*j!+P#1`q-clmraQmfI>iqQFY(>MsJG>x`LZLiEXx{I2 zPq@pf5E#Z=s0}XoDqB&CABmx%JZoyt<-r+98@6K6h?0(D^;o&+E?73 z-4t_vR*nV;w|W&!Cm@DQJ`Td%?{|)^Mw49_(xdNg*#KS)_ib?U0(UG2q%-2t5}}Fu z5FODdt;J)eWbzQDMM7PiV zU*sXM=S-(!QF~k(S$OS8?Z@?xw<{g~m3(ve5l?T`5Bwrf@8!tizQ@b!GHUwFS61Dz z*uJ=IXzuI@i7_fGBg~czrMZoF9z^;J?}{Tog)|f51p*xWV{(q-YOh>D^j@}Ju*43B zPO?H8E&TBtHnuVpJGP00Vg(9DC+i+zMt|u#j$g%E_aS-op4~2%bu) zEX-vm?|TmHyRTLq_J85$&?4L(K2X?V2Sd|;%bc<9_}oFGE!|C=Ezc|15?I38b%Pk@ z2=JVDYTomp%|~nNkRT-JI{gDkR@xphR!hiQDijGCl)CoJ0FdVqcQqMp~bx`Lc>t zqoh!Kp$;2RV-WbhD{14;Z?lzmKjt>NQOIVGdXFr?Q`5~>dRGl%wxX(Yb{<44!8!}c zE7dI^ISXV1Vx$^{iu%Olue*!OMKc<$5))dRZ!@y^8T;S%q1zQvajS7m^*2hs(F1FT zV+`*#=}cU3N-K!O*{A+pg2R!XWi9dkYYB)Oizeb&$a%eR#h4@>hFIw^5U{9OdB>8& z81mP(3C@3$wq~V=OAVsL+Fm`bWQ9vl99onMYx3>(Thp!KLeXS5od2Mg`6KEJjo7V7 zb}ZnNmyw&+gBz5mkCU*S?0~}u-LA1yyIs7KBdm5Nk(5pEdnrzR`Je6g*L5*4^jmNN z=4~{xQ-t2sFwkI*pEEEJb_oqbpvx}fWB(Y6Tzo-$(OuwDu+62E$oU>u+1awA#?EMP zM9gaqZu<^1_f;1fKQ}u@6^oPoV2tuzn4~srBl2|;&3JMXs`_fN`ZdK&JZd~KkV>$6 zIC}%7ckK1OFd4QS!28z)*c`%zI~0{JiN)MTI>ab+kiS%gLp%^A>`)imv`i&;fObm4 z*QI4RsyoXFUFeetp;Lox5ZZ;SE~_`D@`HlIOoKkNHt-O?K;=T%A|3vB)M6;P?uKy> z4Yk|53pNCeL$B5Le?3Y7uJi%QSCJt8@NeLE)8#echpK489ai6pwOd{Z6D=y!v+q7P zUAK%(`$RA@F)W*tLk;r7;fX6&H69>>*tLf|;@)K@1Wr!W)TnzX%2T{l8e2qV{y_Q^ zS~7lg-l1Fl@=R|WG5RcX%(@bhj32w>G!~-NKJ~>D4n3uC0b;q#$D#Ni`i%*zc>7Md z`#&}+4opmk!ZQi%q$Ft|=4}Rwp)1v$_1NF)#i^8mF(N_M`us@$#=qM)!h|)>GiE8w zK9Q>a>SF6Az27tXQE6=jWQ+7&k{wHVb_scS$90SILzmFxzXAx=^^UV&RcUkS_k-l# zQac31g>c*e;@&3uOiFSJs;78zPW#H}ae|k6x@JBG>D^*wbNS;0lnNiOGaWmlQf!lr z#x-DtWv?8Z(AuzAv02rB+H|t~X#vYS{gBn6n*V6eO9jO%#zI0pmn$H|WYq^6TeF<) zD(d%%*lOPuduL^fO7UdMEMc#;uSm=(fs|CUdZJxxMsqaxEtvj5(V_MBHtiX=mJ6wv zo}$S^upI-svOH6-s6s2bBBpu5uyG;HhpU<0>rO<;md3KFdg0HS>R)%pwh-2|~4 zl!oRg8`$gFQSoe%z^lHq;{s*akw8F>6TJU%IP0boBJ`8Lsc0V#XryHzx%Qqpjh0w) zuc{;s-H-!jGF*R0?-XqG%9MwH2bK9y)vV;5~U&VxQ8v38L}gw#P3JnP9~lGxl2h^ zjTC2)ya&eMUt?zg5-3blK)~+PzNzwS(^%T_4+ErNr`A;`!@U23QH0 ze>VX#1TBAB80u(THQ@px+DrLpfF6cy*W1bBok2qDmJbrJbxCwN+BNi?E>y(kILLoQ<_o2i(K|8gK0isIR~ zQBhz-jh^zO=A+Ml?)zO2bXq5vGls@>S%gt>X|GVFdA-hvg-zW>$+=nI-6<*}lNhl) zWih!Xwh=NP-Jocc`ur@5TI*$6c`g5s7ezO(pCBD|s&VPja__kEu0M~R-9dA{*#&)N ziS-`(0P?(pM}=i4>Cepqg|hIw^3^{$1YcvA?(ZwFGNA1#vTWT(<;KDft=)?!Wcr@V zy#1IniuzzIQ}1F)sXXgd>4jP30#L>)`OjApSLX8N?uL?y6FrXYmu0(jZhWoRm?**u zq=lfrYd}G3wz(~TkQA64(C(pQo}!;GJFWnex)VWGO19q%6^>#R9;fFxEwxDZ;md@p z6VLbpI-$j7m;8LWBHl>3DBZDIVVz!YMcPiB?$;kHC@fh-M6hu+LjL{$zgs-Twx4cx z>MCTVs2R((SC*!6Wz)U@=OGrP>=#2V@DFhd^g&_~V>C$^H{~&&{lYUdku*vzSBt;6 zX3nQ$V)ySX{|b!T0R!P?a(y)(C!no!^ze5x!qq?pozVpb#)Ufm6Q$7&SKA)M;gdkj z`yskwM|L207PCyG*Pocq#_Y?@Xlp!VQL(=_xPfU-(&~K;O?r%S@w$g;Nm&)x19VT> zKHhJsdfp|c4d#`%E7^#C;#5gcz`Y;A1>Fs)GH8Fv;=|I2Mz~%Hx3OJ-U{a_b;Ec#E z+4evnB+GpeBr2&t5`i(^gghw1fXc#MjQjUdVZ+at2D_OP@bbX%fHZo%)YJecGu%ye+#vz~ChH6EEG zA+Lo{w-dJwHl1CsG{d7W?NukEj7n1U-n3|%X>`?=*IBML+3^>r-92OAiia#}ESWW% zku3JMwi%*%P#?XjHIO440aF25h&!YHInoN+3?MpXrJZr3?Y_cfsf>Rc1>PX1vm3q7 zT%frs-B0eIpDs)^Wz?#SYbH1yYs^h1nFW#jw&~#PP6xFRASa-`S>715{pC0=b4RSbF`HGG{fTdvk!rsp z>F%`KSy;Ge@RcPRZeoD0sbnw|e8Cr=23zUU1cy&aWTKz&mmDC2 z>uvseGY3rn1>M8a?#x6~xa?5ASSuP+RQxbv#GvZ-x{%)N3cI<>JT|z}z*liXGNc#dvQ|?n4O6PYmO_3vPXij~M@Q9m!kF zI9?wooqY_8YW=on#~8fKYQL6Tm4iUu<4l0<-07Av+TnWZ&!f1JD_tvwE|;=v%_tOq z8ZrT&Vi^$9C6(e}Vn+KioP~}+!QmUmQwGg72;?E+Ni#}Vru<=uS{YDTx+1q>Ln{e#sUbJQuG+vZ}vDK zUeLk5pB0;Bg-1Soi`OM}W_Fsa3RtB`?ba`fV3>)q)EaCSp71P|u8KE3-7biVWIPn2 z3E2M04HG_Vn6Q(@roJt~?M1grQSh@hP&C z>&v?rNJ12LW4(3x6O-sxQ%{GDPblyl{x#L%E){C)cyIZ;8uHo~Y{x9a`PIiF5QDc_ zh#@pQ`*1guHDjc)x!8l{X=x%bsW~=xJ>Uzxs{1az5aE#TXKfI9%C1z+(mE$?p4AFq zlcns5)c80O7;V>G*dmGUi}D9IDwl2{LDpj=sWbO<O(kl0vWtgNn|8*`tW zQ}ETlI-~P&<0NTqi4kA#nEB<4Bf)!gnF7FHNFf?xirQM=u_VM{i46~KEPj>CC z`h)HUPY(spy)o8F8KvnOlzw)>`bVt1BzeLI#s&<4`31 zXC1a;dH9sddV+{QWIS_F@gPG1oI3Yvl=h1np*@|+cC5IW4(ftLj`WOeB`sZPnI&0P%5GvtM(pw{L za0L$0#{o^}Zs%M(BfHeEYX$t2fg2e_a`rT>>vT@S)LMwh!h?)Xh6#gE_N&cx_I=6C zstRMy+%MIkB2bjgggM2)mASggui?%eK?nZ|ne2^siafYtx(jq9Rr6qZpA}73@5&$9 zINTa%k=2d3XS?V?4CPl&S-_eFf?VP)OO=5$;^cRIS*=)y#0Tvs%yb8vx+cxnVCz^M z+!^IU^MF_JdfgsOksYapWc5Z&6=2Un8qKvAwECx4ye3Ex(zCd9Fv{oL@NojoV?;is z649BoKEqb>oAj8?7<&B&L@@bw-vze91Dc`f?t&jSTH4YB`HH z){=4q9J!c6=8BYiV9UZNR3&W}&PMRn!-Ay=W|^L_rnz6Keei;OMp)R1%D!s1@N5C8 zP(%c+wQ7CAaqkM?>TUyf5^!sG+SdZyMld}QMW&*cpM(?FXs}aTq)!TH?a8Fp-`;|6 zjxSOGgu##zy#~&RJ<2mbSY{sqve4GiW$tnBoGD43S+~GE=%i!{hk0r1>7(;+F^Qyf z@CKh}W!JJC9uPg{yE$^G$Y=t8H}5!2-fu9huH}n@_PoW!j$dZZEz3Naf_m%n9yz&d0! zdyoe_*R+vlExO85Su}J+Vz2`9z=a+R|8FN2Y?r7KUhOfuez!*^dKiYGv5v)f0|KRB zQSTfrH>0;f#8X+Y!8cFSSb35+amFYonjVf03T`8noL9n2r$Ydw73gK~uAT=>1UQ5e zwXs@b5XV?loJdYnxmUX8P9Bdbws8mu;Jq_gh&9wO*za{s9O?(NU;-_?myfv;^}EwX zP!GbQ@6jhPP%puZOEpF}SZVS!Hz&y06tF|$YV0+VS|i;3rhiS@(*ciQ_&VDIhiEZA zo2CGI+uvhGS()OLU5J;ui&ZP3bMz6X4vj5Yo;aG9omz~zP6m_$yU_%1 zk8UC#Q?E4BzeCbvZUR9Y>AvyCM5%iyKzwQA2nCv<($Sszq}~}q`Fl@nUQqvFoNkN{ zPI53KJWT#RYk_QLvYWBGH!RjgaZYJ^6+chm4|(csb8JLKMZ`K9upS6ji|Z&4vzFK` zX+h3#fWIi;Z(*vTQ(Wl8XiU-2GfeDTfSdf%HRu8(@J1aw>DLuT95D{RyN3=U&a=6` zq*rP}(W z2c(6dC9%YT_~Zm6W|j06ExTRWNu!PUOICe3xJ$EB{j4-!L4J0D0NmLJ-IXit=KBOQ zai+Pf+f$Y%E%OB<>A21~rBBRV@bjF^~q{wrM08~(M$S+s1 zuhPC>p_dCYibxwV$F~}!C9ma7GgZJE9J@vVl6YmYHS@wY-R+h?LPXr3@P$KdsA zpo=bJx1v%BkLoV4k-ex54U9g`S}-HqA)2WLL_9O{1ig!~1xN0zKFi2RMNrv$Dc?}D zNilx7ZItHC;c2S3MP1=F?R1K3FMic(_e)9iK&gf8VQnxra>W8Wj(9S1!t;f#Xbc+d z!Cyc zTP1mE=P?KvTqk|pP?jMMPu4ynJQ;IyK$?hVG+uhD8Yq~rXV7d$`hyxuJgCaXFEk1tT*z!7K=Xh}ly8SMZl1$4+H-0SuLu(x23l$H zE}(UuP{3w$kI3FeaHy0tpY&mT%8Gd@%IQm7X56j>oiepp}_5*)!Z2#Q5iW4fEpVyhBu(jVT80#-ztGBYwL>oSz zQK@A*_L3*qjy8~~dSk~wXodj*t2s$|TCB(cZ|ahe`ZbxXh4C>xf0@?&qf>?b=?1C- z;7PC60C{jGKY#q5Z-PUk1W`%{2j`x3dkp69Epvku(T9cq@8M|SGY+L%?Qh?!{$08> zUHKy2X+F>iB}@!;-cbh4D6rHHl=Rk3!0z-v)QAu#*;j^OKHV-wX*7<&r{+Q(j%Nuz z$t!^SLEVbawcx3Eb07cxSdC$o3+kC(L~ZPXB-Oonfed$IO!V*;y7(S4wq`~^b|>5I z3^pHPp6pahTdJ~(+);^PIoJAzBx1ZMv*G!VQ;VUObfIG3SbKH%>geeyY5PU+$mSw$ z-Ox++m?8nKpBeu8UPcXzWYTy25_TFj)e})3;se)lP3c*_UHsA1IXe$ts$iwMW{{Qe z?Hb7GUlpbPKh~HsrSBn9YS8^en%gEP{gr#wj`Rf}R|t3hD6voI&WD#ddN&-rGPa=XJrq#Jh9-;G#(I zHMg^Tm$%M?$Pz3AE`%8TVPsjcLA0kSGA2zyH^m|PZU-)!*#o}2Tj<}kwiF*jpev4E zi?Ut)r|lqk@_#vQf$Q%DyS5*m^=4&3MAuTvaMwc_h`<`rzJWD{1(2*JSlNvboIM44fV~PREsz zcj0HwrL1AS8lnXnI0>@=Mi&s^*5@}9JEdJ za|}|{wW#9B{_;KP?=RviEa~X>OYny6G7yBB%u38`_ZF#Rox+@~Urlfl4PF|rGK1M) zvi_)tc9*+yz0oTI3P~7^sM5^zP%%One5a|$%GW2oD(rsbI+`EU?iFvRhpQwL*f36M z1!;zr%Y4H)vJyU}vj1jWq2tO#cLcZuA>+|{?Y9&UwV?`Yu zC;4xjwMCp+<$4?EJw$_qC=Ch}qyd$^Kn>aaFw}rUf2SMX)&<`EF0Y*qZ4?dtRHu#R z5^cI6^MXpC4`<0T;GPubYOup8B@LD@d!Ch$jPO*KQ!)gd*>-UW?o^uI+#Qudwl zi<+~_3*=GfqqJ#mE+uI3W@l!ksx(g-Flp7=&A7Hn8Sg?$djooh3Za#-Yhbz~N;x-d zU^#i);y{d#frH8|b*Jn!aDoQ{^1^>Y903sEajHAn?A+7||L!w63>Zj+wrF?4#fU3Y;F-`2Ai~2#9dG7g@zV7DM#YL@{ zq+B;Q&ytW%nXS|KSh5z0C2zAl4SUHxuC0-$@@w18e>q-BAKXz%_o#t|^ZLq-3~gSo z(Eu=o{0(CAJ7~wGdylN{gVx#vK>TcXI+Qm2`Qp+w z^HoT|G=9&p@G=8D=t7FRzS|j^=o0r{gfs^osbS;{LVJK#cAAn+Zk6~}&H1zpRX#z( zyS<2EcR4&o?zksuK>RpT43OgDGmTgumQ{|o7|+hLf))FzNmv>zUjeZ!$;pO7&1RvR z5A5n0^WDT$NFg$qT(9b@0>$fzFGD*QG8n{`%QI-;h_c1u)HDd>5Mm)YK73tVzk~Ir zt6;9Q>eLFM3suV%b{m^duNuf0k)GXF{9MUW{dxev{A%0FU<)*Zot_p#XrTgh)f~&) zmc()NaRHu>4MMEkU?8rxg{qOlG~$=aKkXHJDp|b-WA}Rio2%s~VOvhkZ)Gw{Qp_5a zthD}FgdhbzoB)00_|#aur6n^jlHR7l?hndNxC5qkZA$y}FRPlg(c1L*&7;;48w`;1 z=uAStxFk5;mCt}^{Lfy1X09y~~-vVJko1)a@X)#tx#8 z8TZ?2Xd`mXu-Z1ONA?57{3=mmHm+i@+RgA=FUHkNw%i}l0%?QIAr0Rv|2%b`{a9L< zp>rpCTMn*4@8H?fEoX_b*Lw^Po=CZ2HxSQdsjgQZ2o316j@mAID5t3YU^}iE17xJ^ zAQK4wRW?j-pUkE0xJdBACO|lh1T+kN1mhWG(MrrsiPLp8azM;&$3hB%eolApc?Ek* z6n5Swe~CFt)RVDFQJ#e5j3=2CB<_jmCAb|YB%sAdMh2{l(kXp+IbKDG-F>sCsmbl7 z_)Fbz(!YzS;RFBL)LH0(VC2}W9|^vW&N42!!i0K63g&2KDx#jx4g~B5r5SdJ(4>hX zcJ{`a5SmOEa>p-LGQ;j<-R7Z|WHRhPNeD>7`=+$0WUm9G()o|SQDPdj$5)GvnWAOE z1&^-L5|#gZy(c)~7+{LdGFn%$X&u=KbI9Vn{5Nq&qg%6bZ9w)$hsf-3M2#-_|8BK2 zy3_!Yi+84!+zlVuC_F#XxcN*UcllFVpge)Tp7231ciP?uFe2m?2xmGk8=Pk&s;KA) zH$clB2Y4-8Ryn=8l2%;>@Q|6Qzy|frMd$)wME?f4zD#6p>(dHlcO z8wneuzx0`_iB<(%DGn~0-#6>qTXqr!vE}Ek`fAAhv`Ow<I4K+r5ZJ`Rh9|CPcfCH5g?)Xp^*7T)(|~Yzc2xHo47oU<04dm)X-_=Ae2` zN6m(1w3(w`Qoj>;hnlARh94dPb#_m<{A37ng>pJD?`BFnDk)&Svq78AK=>^=C9=|% zB0w7r_AB+SGvFv$-ZU$z7E-RTwTL@^Y%wO~TxU;p<`^`s<(ss!B~cu=MDy>$-TrY4 znM0d3u$RWwao74bMaSCtr9Ckdv&I~nyJ#2_v>blTA7%;VbNe0b#^Co5OLXS5mF$cO z)CLx#C;rCiwEsp~RGZ~uQGBOuK2TvaSAD6)vCZZGFNfqIDZ>zK{ki7ja~g=?;C3g% z)PXmQyEI#`iKkaPL?&S(p}wXYT`^#lsKdjBUBD0&?TtQnY{OH|s~th6Z4*%v$!4yR zDjnJXNEcqdCn`=f_w1G{v9yxwP`%o1gNG^fJz@hOFr09Gk_uznRAtetm*AZYwGsEn zDMvw7w)olow59&v+o(znY*dWVxCzpDekA4lAH__pYHm@?$BPzHl<~-F@?C$*casVoP${POMprpx6&gq`KqrQN2z-qQe-1j*sFsoMUV*yKg)fUzU z2P`;AYsB-_6Hp${ee;-6&WptyheK0({W+;2Qj(xXCbz3rR?Nf44#y^=NAm~=ltYq- zl_A~^`O#F4%jyrl0lEmZo1YVK;j-$GgyhwRg-dQEGS46LXuq2N9(3BRd+96OEatmK z`%XkM8}uejhjt)nqF49^t~`)yqcSrGdW)S@G{^rG{dA!-cCtRO&?kgt!}Vsl2y1Vy z%$q6ohKqd0Wpb4F8>Eq+R(}vXsq${S*(Y)mnLKNwmN8h%^{C&V_jNrBDMB-f`By1B$jNv4D!y_kyNOpKmO2LWVR zT&v7JvYfHK-;`F->Tk>|$Xtm1Fb^V|28fq}*+1dO89q?J%Tzay>R5eR>Bzbn2#1SM z5RKq8-qk*rKm8kju4pjQVxtL8tVw-|EQb)cTDr2yI6~C)kqxSaU@mr{f9l&Y3a+uu9g&D|EztUd{le=vXjTTV?(#t7z>I z%Lupg7%Z~3RDeIrPB2TpX|V@EH2?n6mMNaiz7( zgLpmld$`-{M`HXMGpVoa378?hq3X#H$q8PLT5?qf0tbF~K)Nz0JYTYeYvpwV#1lnB z$(g$&YVRxa51u(%Vw*w<;X&Wg%({tg-To|V;+GW8yxCoeWk%79gs&cA0eVDueeRu* z=&(fiFHjUAn~4#nH{teO3K@JP1);*D*apYpxYUYnn@SO$)~Y}5z7C$8GhSJG1Cbfj zY%uq-RAoDu&}>|W>F=hmQAUirhVlT#SntAAs@0YyF#_w%)Vsy_XdvzY*;}Rx2#$8* zhL!F3g#KM!v-xfD;KiN_mBwm)2XY#JG?&R?)v1r_VAR{QZs`pyXlo{ZpuX3u<86-l`Kue7Ev zFbVBGuaQLk1F=KC;!m5gagkijN&_9?LdA(VPqsd4LQB$!(m=EJ!q4Z(O~*5Y0l$pS zhk`~OB!a*JM*b(l7ik|xrTV%sHS6sE*|6u+vJePbz8jHA|A1>^m3U|g$%X`DXE2AY zTgsyyUk`DFyp+4}(Zv0+BfvUNo5yfy+O|u>a4nUS3>ho=y}fZQB6LP^i^gsHLwFl2 zlfbAV`0r&Q=36cO29k}RCCCg+Ew*-*zDdXi{Ssc8Vw;hDo*t?x!{a)HtoqN`cul07a2{A^7iRmWM(Dx4X|m|yX4JH=RI#k9_nkz)^#k!h zmhi+Y&=90*&YcjzYQ4~CMO=jS{AP8SSoKYDX;;C45tj#j`-2l{Izy)K3E28ms|Pip z&n{*7R;lJhOD2*U75kH~u~7%Bz}&2&q=i=1BOeBTv^=;c@2t2$trXk#8zcRzP;E1} zoDjUc`W#z4nV?5$!=sm_hDkpLq@GrYl4*pwP|Q*!?%ZPu(GMT|1!|J`2gM@_ zJQ?G)xP2c)bCqA@qamk-1>{>P_~t`ch!(lwHv4)j%_lm5Y!ewCDIYP4i4bw|;A^h< zk$I2W#S5O+;BKTbkTRf659H~4pfUYjy_lvGJOH2B_xinZ$*?u(SYCq;MKt!0AFhIy z6*mCKQP=bx#a)Se(OQ~&&-djkJvAF=9UEg2E+Ey|N4QQv|65~W4jWa0v!YEKFa#A6 z9Ok*=Mjd~^krS>IwGe;0>3$xNdk_r${G^(dn{%tq7kxNt+*KEO!`1pDmN1GTY^4Yy zomBBigHcrWyd+g%(etkJ8$OC`UYJ3f(sNx&KK>py>t~aBOm25-RR`wl!)!gvD?+dr zbP`z%tDDd5P@QNuz*E<;wO!r+6M#A#gQ|t3%9&Q0jG3W17}2F#v!HV zj8Q@k5O$d~GuF6}>^mRJZ8Rpgo&4sZEJgwQI&2K*(%3m3mvO??afeAJ-JWFO^!HX7 z?$~`J_mBBI(22Ljgd)lsAE~j5T_^#WUTtM~por#Yo>Dx}EHwfg9LJY&*rYoUR^t;( z{(48-aD?L1(F>$^7sG>NfC0E->-LvfYr-ZkW5O@{f!`XY7@?KhoAU$F{^e^W0pV4X zp-^7`gkynjo6*ghj;`rV8J=I4So~o;Ob6bE97^ja4_sq61}xC$cYQ^KEdnY<%_5*k_?-SW=52)hMMLbz4nW`gN60I zerb=l`->ibsR;DB&yvw%VejMD@Xt#P-9MRJ#)Wp5~82i_Fu+y@}1<1W_a zsV_NU$rht8ah7I_aUa0 zpt7kkhl@Eg9qU8sa+B{zi{*Xvv*)|U4SA84Jz2=8bq0$;4r-q{NYB)^B#PxLa_<7r zRLvOa8Z0dz0f+@k@|%)^mSS=$yH19jn1|{jQ+g*_Dk>QXZI>1pwkY3h8Mr?FA5-gh z-cE!h_0Wb8Gy;+|nC8|Ewh4_AnKXC#3xRzqGxH+2ZV1v$P51@GE=5b40$XWp(Nd|0 z;;SnKovRPdO-FZJ)C*%te1qOp*CK_Q0xr@y%R?mEN!If5NNj}TpuAAdrtwp%t=~FOzCZpg%u>7P-}o$mrTX#4XVY^b zagPu96(y0-e4|%+)ytQ>MxIk!r9$mfc)9C&b2lA_0@7@|bWV!kgB#UwZdHtk_krv* zZSH6c zl{Aa#`XUkAb;M|>1oj$>TY7Uf@|i}kLpf@g_sT(xL{+h|TW|-lnRsWwOu-;)axfXz zwJ$z58Xk<_nWi;c3_Mh)k1XJeIEOWlOG@rke{{kPXyxc(WC4q!b(s`P>$CqWuoZ_5 zky5D$??}9Sg887?Rw@TfMS>TinlTo(nD|Sx@%=)81NNTb<1}YQZSw2(zh5$^wuv-N z$mCo1qrw6|0Z71{ypEZ{rze6HK>5)$dXinV8Mmfy7f>5o8kOVa08}

5l734!%uP^+u?C4eVqql?LBY1vck2*R&T ziXE;a513Cl5{U=_q8W(308iz98WmZ5nW0GdQuE%dxrCQ(Z;c-kEZmyr?dV?G=G>i= zxPk;{>*GG$DEiXk(_=l|Vf#Bm`8B{$eee};3^upJEtRvK!Ue}}@r$-;dcX0A8tp_0 zn$L4fyKv|Ndo`n$F9CmLpXjC3ISeFKh=7O(A9YjA{43e9;bYO;mTqCagv`=8NSj2( zE)m;=D`kayFSw(1@F>GPnxj|wHQ>%r(|ve0T;Y9pcYqa^Ls()bJF2-qEvqL1_~0h8 z$5NmT#B+y%H|EQgc%?fS^-S?`yK?M_BpVI8sq{CoiMXx`isEu{nt|O%6airvU>%$_ z(fd6>6Y7?tR-&3&QT>xN98lF@BoQNO++7ht{jKw^FBGl^-4IScj%Ku{Xf0N z+<-+9q}ed8c}yd#3@Mj}kX#*;V(FLwO#+wCP7GG@%grJb`_1)){g+4>oB#aTzLZ7n zbc^JGRW$*|kWdR?v;ik}pUHnR#Yeuda7qIBER;qhs^T6@Eu%u4wTV-E!ijDBNaCj> zWi4P_)612-oe*-@2~8sU&d>0R0kkOWcAiwZ<*Oa2@ZPdJ$At<&!FMZk$Y=yzB|B?g zU8(CA3m!b(Y6}nMkfMe8TK_)K25gpMjyYn}O+I8#@b^$K*Qn(Qy$EwBYc~Eq-*Q8f z5|!0(V@9&3sNGMKZPpS@P<-|f%b8|sBqzHgmJjadl6eHnv!<@1<_$-A>gzHO$N zwC7vQAj@AFM`=@`Sm!?Y8;R5pE6nQTnqIA;K{~f&$zWCH$vF2YtLYmZ)|Hhma548SVBPr%Pp??YA#{ARfa`d$3b;wiw*yPvqD)$qj z9cS&3=?B~Y%$zrEZ}BCItmLzgTRSPd5L0!>lysDKa?g7r=oW8@z38}*{ z59vR99#k_X-MYT&#g*_|hv$%(xHBCn7+8RW{_(mmMceK0F7D4UK5>%D-d&AM>kAf( zs!=3^F)acyMs6g;?{t#=&Ywh&yEgIHdy9m_Tj#r|&sR`d&0KdL;G;ij$N=PT8e_4- z$OV{@tPOwtowq5Yw|`37VxtM@ExuYfB>IW%(?p|PvXhXcdaaz&zRTRXm0{@BkxZUM zNwZxexge{5j?lrW5ymb!lkCH_EseOyhJ0e!2&8i3iU&he#zx_wa1MwH$Vn4!v_;&G zwzqd1_~_AuXUKbF^@YCb0st!Kkr`{yv-ap=&=;^Np|wP*DiUNh={#F~17g13SaY9M z$aEa*1|3oEujqN%oxab0HjiOG;&H&i_H4-2Py~ZrX!kof$ri>D;&5q!;aQS3+{yJQ zH2gr0hx4T$AXR(o+ugbL5atdx=Z&l4&P{uN)s`yHGr-2NMRMdxqhTcsg@nVpi{xhDQ~ALqDde$t?6ghMpIH!Grb|m8 z8$4CZdN1s*DUzH~M(6&D3|a2|CB+)6nAkNYh52BI#C6LFF9W@&WW&+!vp#Ryy-=M6 zY8ms&q>x6L`{H6}@$pn-#5t30!-pnZL431li5Ep3gd%phKpsuMP+z(Z9T&h!2M;DLo2E{&c@E zqPp-+qOw5Ah)mwP$E*!&;SFq8@_K@qY*czCxUkY*&5gREKUJrsS^FUddgi^bvJK17 zyPIAO2cwU{QL7rdxH!xik`0i!InNFTq1|jn*{VFn`_GC3sx+-uAj1K9>vF85PW6S= zX=^15JCRrphH}GohZz}TmgGIBdU;fl8z%2RQi8UT7rgWiyNwN%0nLwr4|^E)JnvLP zC^O9vHG!&)jT5=>M)|>4BgM4!*OY*d?Q%@ckQG)X&A~^M{8PFpcX1ZMzV>4<^UEHc z=M9}L3K3TIw%J5P7CJ&cl?~|1lWZ{6Ud7Cp+H~x@6NVTu;A&!u?GLSh&70R|^4Mi= zebCVtBWuSVZr~FUU8C8gkHtJ#R@af!*eu1j7SqvuLJpvo z@tpYaImFo$LQf_2$O$H|ceSp{T;)k{+RL(}6}%{_Mawub8G_sA5_yu^9Sp4W}j<9%woUW_<2P4uA zA%+Cs7#A$Fu9y)0&tsKCrNb+hOkL*sHeL!)*$JVahy`HE&J@1}?UkXJgtbuBt0fi2`-WBn zlBlYZDyN15Z*=mPvtb5E5zrb^trRXjn|N!d7AD_4zB^b$$E-5}A_K;y(ck?E#YJKz ziH3^X=9Gq|LGzSpUfIiNvoCyZ!lp2+Cv%HLmcTsOHn$i^F4DRH&_Q5)U^j*~)Xf?o z!$fenn0xJ8o}ZXB{jqco2_@0=PtO}s_fd^d=Tp&Y0s=@QN$Qe<4_EBB0b#7dAn}H% zTwL>1{Hy_OU*UvB8g6X%BADxSgFRP)fLuS-O0a@2K@vEzP1FYtI(~=Klxv>h#G4bQ zCE}?(KZcp-rHK&G#t0NAqVM^Fv-`au`~0;5_7ePgsZ$*c?MbppK<|0G7@N)GWNVR& z)yDI$6U{EIr6-Rw-U9ReI|Xja*>QUxzUvu=J3?NOm+yFIIc*qS7jg^w50~Ko%)yQw z`K1xfAJf~7#PpQ|zi<=;zq2T|;j+wGw@MtJxYN$tsxtlSUIS<{s-=1w)6rXYgm>O0 zAF4f_ualcY-$da@!Jz$@S+5%C!stUQpG~Jpc%dIz|1wkSl2q$&pWoIz;|f1S7C*C3 zs9B-Qxd-^KS}tcJD0oP`=~F}9{xmu-uWI7rSptgdk|>^z%(ueEqoOGXP}w9aiv#){ z%)N%vU^UCj0l{q~8l@6R2J@Q@l>cD8f#;$-%j52VuMqmcWIJBO^Vd59UDIm~2;78V zP2rIyzE2yWjAW(VgnwT9*Wk|%;kM|Cz2KXUsO4D!s_b18-mU!6+{X36nZkb zLb6|Fx6`r-3rDG*kPxtQ1Sq%X(z)cyvfCh!d!>mw4f&`PLI$JbNZ}wOqEKj35&R;# zQ8i?sI!+bbY8C$QbNvT#@tE5%un)B$>(*MOCh~Z?5(*u*Si97&C;?YS6^^_-5+mZv ze#cB%*?rP3^U)rnm{B@YCI9w9N{uVG%=~{xu^9w}m)-g8n5wVmakFzanMS@Xy?-r& zb>4-e00*NUqq?*Ju52kXZ|D zq$D)_+r<7uu=*r!s?d9Iw~i|aIm-R+PP)?KhJ5foviq!*+{_ed6u_1Kq(WN zoXKR=_~+zla-Y!PhR`NcNMvG0Tgdr>+#xo+p3`F<2!e z1zWM=J>{F#Q)srON->RV;vlV+vt6Q-%5_l$rPgl|Exw|m$#{N88(oP%kC%RQqJ2@b zT1DCJzZ8Y$8SXK*Iek^XoeRKxaPb9Y8K=_14jJ;EdjC6R&SFkKp}Sbuby3Gb5rtGy zs#fd=iA5DUgbvoY$A92Q4wuS-D%}&Dwl8}slTBIWabjbtU79c zGi|(?5P+^WG$C{(zAY)=H|gAtzHi11AY1doKw+c@d(iirbA<;rsF4@5S$TZP6`U|b zIePO1hxdoRCP9R(7enKKdO;K6KT4?{*TE+Cdk~{9HDMyt}!N4I(pu)bV2?bbNnu z?^b`f))}k9_ z(&@@na5|jO>Hm7l0!e)9YWW05HKf?rFx_GR@aN@GJGioC-xVc+f2OO2|9`v$uUhS~ z*iqeR?PlFnNY6UE0p{OVFH$>Kh2}?J$!L0KSaw&M(P6=cav2(FW+Mt?Bs{hr+Aow_ zZEStZ?{FUwf47tFhum$X<1@768I)A4!-mnZ31p(SXk}) zELL85>dPh5+`des1mXppUDvsSZ4)DzeSD1)cb7oiSdbc)8yDRi4;xeZ_BrJ4nSJH4 z6WZ(RYP+JV&m?1_9!5O=Fsw1D$?t1965FBZxLJ-#{y_=SgJ`E~%gY)w(V#7xt&b1V z{Pt(QgXLd~o<$8eH?@*X?8U(8i-Fir%e$`Be;$!H#r2p>EMk?8dc9k##A*_^QHPGg3624ZXA}lDhsVd%ffV4Dh zohOl6Gr@-HB=c+uO$06=#j|Fe)GyS^UT@nawvXrC|KQfp&2ec#zl9A;2~>nQYfDg~MbD8Bd)X(jWzf_tKY1sj*M))nAeeWXzmxK|aWQ%Lnz1)5n%N~d6UYFbCA0p!D zw$fyStSNk0gdFD*skocHeQLs&rCruwO%18J-RU5wToTf>V%z(A%1nZK!uJz>sB(Rc z5d*oURalcrnVvwdkxv9H=griM4i31vj)JN&k={8BW(Ul~z?Jj@ zswnDlU!4l`ue;7}Z!N!=Yy9s+v!pkh6axWi*bCQvKymzzH3#j*X(>(B>3x;Tkx_7^ z7orFmRZeL7XzJc$>>QrXcCS}%7+~|fcvfe4@2tf<96#d8|3D_qZ9#}}T3|lymzYO| z$k*3DF8ZGxF#ZRu7%$7QgQ`wz+l@lpV){A3O4;Mb76nALDXU!+Vb3StVe` zf?Vnoy%>9NWKrFUt|G6K*6Ct~ok->XqsYGxB4H+E4CG zLi8y1bHNj~S<;5^{Aa$%1Fvh&NvagOsia zyKv{F^>W7`AzD1a{e-)3dNT(tBK=7)<=MTvx?%gigZMr(fgUW^^X3;rf7be|4?_VQ z>(H+w{f|WdbrN%11Li#%^k1g~jM{z^jAde++fC&e5&YHnw$PU zO+)bZ%3Yj0rjkMlWVu-WN6La{9cTT`-(3owt&3@*<=%3_f`5O$VWbP>J5u6>0Mv|3YFZ4 zEZ=o_US1~ru%H!&%y)kPWTH%Abwe90eridSNPj`zO!d+D?5ABfE@xc}Xw|h!!^!9{ zxiR#sr%H8qQ&2oy%6xt%o96w3p4E4Udzr@TL;=-PVzsBnAPf+9mq0nYM$^UG@PnB3 z2?Buyee&{c9fxg3*=mgxuh;%$nvhX z`(_xsJX07Tm@nF8ROnWdRcw&!W{KE=voIh!0Z)z!R@GzT!1VMxJYzRI**NK zgbXFe6fnWbFP5xPRPph{$LZ-o4!6dfHmbn_@5B#)DUESQ4{oJp?b+dRhxpBX*_BW} z-L3+HOTt)v99>~Yko+@7lnzNiQ#_>u(0Z;jCs!iJRLbVRB|&#x-IeI1TS_lx z*fm;C3Hp-5K`$FUrapT{t|p%hw+dxb-rOkfyx_M!t20GmlY!yaThY82%fdi zmUOCW!754;n14if-t}6N`oo5GAL*64#IJidiWiQ2%8yJkR`{_#@^Y`Q# zf%`PZUl0GMw2f)5qQ6T9^}@$2u{6*iT`?k#tljI9;ElLyMK`SRc9d-$>(Cl#muy${ zEiZ#zgY~IltS5lZ1B<*(-=w_NA%X&Ev~K;Er?AsU|8LszQC#SZGN>wzCMhgj)?UW!50B6N#riNquKGw6(AY z4M;~01%)-hLr*z&4W*#oA{-#JZgq)`s_K{;;492Q^W2HTbV@k#TJ6n?t}i`>zBnw{ z3J@B5;!)^ccJ4{oq@$mAIJfP+rXuG{fo@yB)-KR$|00LI9XnApcqatG(dnJqZN!uQ7fo6Bt`cSq8fg&^%)xA~{y&fZ?$G8T$A+5`m>?UIuKhujQ^ zCcD}1h}wlFY%za2uiP|zNK;y(yBZL6a3tgCf0?!(2!%V+RwO?P!H;O?rstm#ECCm9 zWfx^|^#k@m#6vPfKfnLXEM<$ogkLF6Y(ziA84a< z3z!CE@!=b2OeaR@d*NR-#bwjy<(@k4@49}1DJ20w35AWGAJq%2B?iJJ96m0Lq(2lv zCRv$!2TzbM1(p{{N%e^NUHHD0)wmdEfc^Z7boVQ%JB=g-YhTbRAd4|$27Q5~JgzcF zb|{+iyQ^9T{zXf7?s&Lz{$_Z@ z*gR_hyV>mdRa8J{)cX0(xPHeHgrU7xSQLi}8&_V?DkEqWiIO7s#bqEjhlYfGq#Dh3zX{F#SX;w_omYV^&!uG94H;9HT+9)j#Hb8+*Ku@ z!zf!ulgNKs{#8!9v)d&ePASa`HB10AhZF+DU8l#CM9;xZC(20R+6DD)2QP4PN1KYH zgFE2K&S(K~^1{klPTQi7Fu%0p8e_hUV|&Ex#!Yb0{@S;nkl0%>d?J8H??$=`F{`X8 z9b>XD5FUg&)}3AMsnR$C#`Nt+QIO&=x+WS@;8e1kOz*Af)|8B>X=rq@lOYh|^Av%1wKUN~vZ@?pXnL)RhoIXi1lU){3yJBhlM)+8AREdOp)y!drB z^F{;G<=dY3G_83-kFX%h%X|W?cpXcAr|8<%i&k8zq&qOrx!N$??^axhqIQLGA7IIu zH}YB!>IK-uLA(t|LI80l$F%cV19dF8!_9SYsIPHBO`OhYPS*v7Z`F`EKK>TWKuD^H}@ zcuu2Ec1vHDyvY*iV?0}ORQuu`f$-(8zW{HvvCX#jp*8+VF=ELPukUsU$aNvFt-r9y z@&~TF84}^|>t3qnb;QWCHZG-`MFun2tmSIXH3zGADq6y69xqNyX?p-qK(N2l%k_SM zw^8p(S%dp$j8B!2vbKw`Y1`>f{HtEu=kDi420ihxu0dG2sU7VaQ%puv)f-J%424@B z8a~oNyeW;~fT8QLmes$S!3yv|_BTtx7u>({2|Uh2da$vXlx>K`ekyM+zfi1G_^iuc zjX?14A^37F1V9)2sP=lWXeu7nQeohVEFkEo#^5G@^4?D{=`fJQ~=)$7U8~(U`E6gFjdEKQqBIz3O z-Dyh*`aYWh9h$YY5^wl*YpsL7-`4(bo>z*4V6%Gkm{JeAJSP*hWv4Xx*+BaS zgV@gG2$ZFFO4AAPm&nq(@$%C+6tt8_l?J5&iD2LutqV+Av$>!HVtn=r?A0A8tvHA3 z6g_-T|GeSICGB$>Ey6z|t8C36IjPM0qelpjqej2=T+5Q5KVvovv~`g+Qy@ehM%kc2`G+5(fpWnHvHzN(A|icty>52-K-Eg#0M*_OD2s|) zrN_dHrV>+Y+-Muv>6JwhKhOzh0YsJ;^|Y0&MK04OQJ#xcnWwb;1WE5^IpW87f5M- zpljD+SA#cR`{bh;nJVE|t}VX-$nAwpjhGqGGW~kF;96rce}`9&T7neu@J&JZewz=A zfiyB+wl^a*?-^p5aU2t8YR5u!LLR$0;M&aUA>6@>da=o7L#{HZNyX*XfWoIGF|&B% zpc(V+$wBPhnTXF5P66MfYa@?fvty7x4uyy#Qv`cz*i^J)H^`vWgAP&fE6;lJ#B zbUJP^4$6fPKUU@0%e+FVfP)+Pc=O?ILUS@|Z zdG)1oXSYMZW|qgt2#JbS-`>-6t9Lz^;~AxejaW9<9sCyX1e$TCDkIxX0<=N&);kKY zZk}De6XSoS-Ayr2`<1mh3E}GBFMZ7h|RL6j0 zjt_*B{HTLib5Gv$ESeF>4cv#*D@gpK+7Z&v=#0;(9)~s;!}k+$!*CgoayOV;0uK8S z6395}7A&&H5t2?GBC#o-x{@n?kE!|2o4i*$vsPEQEtIdH;;>Et{LGyLdhUL~zS~ok zNI_F*wj{J*m22M!AT0EnGc)F!y zY~!qU?xL)ugU<)wQ>I;S%jNRH2MEdiq*KD0fp}Mk!=Eui+ZIS`lCvko)+1DM_DOe! z`jBDT-eXNPsV+D@@?@u53Wx#HJh9UuZ;4w1 z1Jn(kb^7QZv^4o9SkJsF=%Sm|?dnyJ>p^6p>XQ=aBBFGOZ0PQ#C6;>)E@*3Y7mDF^ zUh?TmN1@w#Ok5`pJZB8EHHCD;3Ez)AD$l2^=$keaSZRcJ3KSB8B7KaYp+)W5RVzsB zeFV+Da)zc3eA`7@kNzAo&dK$rB%otCtCAC=Q9Xz^y>VSSE*bjoUGF!Sw);+ zY&Y{eD*?p^m{M~Xiu1i`g!pFMfKD6q>X`YO-@m#*p#V^vge^Db7kGmHn;t ziX#sTzd9rw`ZLY`BUGU-PTalvqj7Du?O$*b#snO|W^I?T*l+vH78s-Cyh~=C;Ole) z-cc$I1(j}mZVic>uH>Bf_NM`@=g{YnNwwTmx81J#j2UiUxR&vu)3&m`A)gmL1Z<#5 zcuV*a21L@r@!F!%|I0|i!h~KAoL(~V)xWN5r-SYQ0b4+^dm{T}P9nw|)i8RK5h-22 zyx26+1UTqGU-J6C4D}IJ3TH!hqaA;JDe8Zk5^h=?7?1yWg0P9Wl$kAMsxz zhaMOOx&uRz>j+l3f{=5kDr!+pWEBOc)lMc0vm2fLmH}d zPr}GyRiQXv+c{lH9<&9!9c^t4Zagjr) zbzbA{v$h2izL^Ric4mJ9-|~-ytvI=+Ub*dFb86fs!)F2xKs^ztfs}O%pQP zATg!N+v}9PhL=xx{VCNp@yCFIVi~NhAk;aU}Q}y^-fjAb3MX z#fgWk4E>3s>8jQpZj{kKzFGDX;06?%3^`AWSod%XneUt77h($(9B-cx`4Flw`k z3sxtx%IY2)l6JH`l&;G4zpMU{34;{5)Pa*8lG+ebO&e?Li@MNJ6Tz2Ulh;Q_2bk8@ zdEv6Eo&TVDRY@VX{m>3^Rs?kF%SE8lFhjKG0UT~+=Ssg#pTsY(o3vXRi#in(Iz~WV zA;Nzkt8H|lh2P4OC-WrAZ|P4cwZPZ+)P+q$^Ld6vD5BDW zVcCpw3SCLYu+f!dexJCZhBfH_Wq1;5P5oC!=%BBun((@*y~bnoJNP$=?t*{aI6sI& zU8@(ZSxU#f_bwcR#X^sK)bMD=QwJ#`RIs~=?K1RsKZITA>NtCTJqG(7%iA@rF}YEt zTL|t=Ob?E`9b0aI7=7ZCa#^d|+RCJ%XjkYUuYKWo#}XLng8t652)$7j;Y*fEuNOFp zkRrCEfU8^SR{4vt-cQ*Xd-d0&Ww}oMFuI%Qmc#Kr2`X%yya0%MTr4wbFALy1$occz zq~od%9vD4DyIz4n5N@~GgK*fj(fPcPCt@zqL7lQQSV>A7&Z!ER zk!?F1*WDFC3pT!jzfmaqnkcMK)l2pg?HgZ^AZ&*F=CbK$7!bC;?V)1kS!l7A7>>|1#q$`Eq8RLhqv41X#3!I?xgP^MkeMz2?t9Yp)Z&*G#AkN2Stf zeGAikugAkYV&^4>)Z&PEE4>2k78VRh3z3k)KEEUmk@WTihGJ~?}n+o3fxkjZNQ*C-6197f03T9XLPSyL{wb8yDixC z|EXtV?oo$TqsL4X49iS+JB`XTR3UzkAWE=+$E2)38fD;~Z`~H0w52CDstBXIKD?lx z3a<=++x&SgqruV};RtoDz+Ie7xU1Jgz>OsnURY8ym@LDgZg;OiTE9ilef$wJ^U=2} zl7t$tcYac=mwXSMR$#7?Jm${JWbG2*ixQDw^9?}wU_}|ch8I>bdfV{*eun%@2bNaS(J430IZhH9r2pOm+OyJgQI%dziddd*Y>DbKwYBsHAE+v>bd@FVAR1CJv!X`qQJlGiVQwTRe6oD;VwV`h*^tH91F=;rWsLGG1 z;!vecuLKH6S_a|{OQf*!;=t(Syusa{ls9ro})B)3?UiZSAg>}YBXi^q?N5dNIBUHksbpF`9oUuf4iJD7^EkdIaOmv{mZ}P%3hku37n?v*i(Pz07s4Q6S z_~%(!#1W>s9#7Ppy$T1c@KEu`Puyyg|G$RoaWlYqlsnh9#C=`Y!H`J6AO-6E5g=P2 z31bFLB&99)p@k-EZTMNXw+%0ZtT_(^XPpG&%G1}i69b4N_d7X7d=K|1H|-S+$T|GUIn^%EtjpW4P4LyFCRxrhO#o&i*(lG7@*! znY)h?l??P{46hL`X2$QeLOivK?rwA0OdFMU zezJWu*kR(5My$&;*NaljPZLh0cdF$x$Z-~~3rysl%H-JSBu71cDcIl3D0awdGld~H6Eo6;b_H|n-_E^sjW>0atzf z8=f90vTFx;xB~JS{-OhBuPdf&%G@&$kKcZApwLLO8uBVqU?;)$<8~Vbeq*Jde;;MMe#g+*-_?MnWKmve?*W&a1U15&iG>276Fk* zHSX&Iq0nyxL-`|&x(|5bE0E%nQB`6 znx}6!9K3-tEQh_+QvVAL7?N;Xeg8tlE{Hq!x3_+*Zq^Db615*M{g;Qu#NE&Y+9 z^hRygzx#v(gF%UpwVUpFoaq;v2iAyKpmc=_R|*LtlC%`Icccv4utcQb2|h*l(>5vy zHyifJ$%t}a+=o~0xEHS&8>?*|`w)%nnXP}CL;;#OHA=9}*EBF`EL*$j4<(uz#kB1; zyY901+7n0}ZxRPh{M^t5x1Op%;tlLvC_loqE^>Co&Yk1zPjX+`fUa_19y=1VHeEjH z17@X^ zpvTeCp5oi1s-T)bd7ICq^vu&QWCo#?og0RWCSZi(W__xmf%1A>lG^DxD~^8r3h59r z!-m+ZAbUb|o_4lc3EIuDCv80&!cb0)l7AT@0KBje&T&V=5yN?#N@AFI2Z{_FT47MD zsXeae@&76!bcO2y>9z5?J4%4Inh+H+spjX4kvsO5QZ4gdfBFj@j?pn!XY@Q{1kZTm z(fe1bQmUIt)FcmVsU*>nxIg5hvR0-uOjfjD7k_q=7U4;?$&~!lyQ=3(IIa_VYWU%hX z25*_3zp78q7^wJl;r(UMfgiXNbTr+e?$3%d@;v#wR7$y-CqGr3`@t56VR&})Tq3^z z!`v_vjk{8eyv5P@fNs#-+#sp(!P`d4NlM>aPTj7UOT_#36^A)h+s=mme6PjnKI$() zd~A9$y<7?ZfeEZ4^kY#GJu7jS%$nw6{QaF&05?Y8vAoE@ZJ>KJi>go{ z!#ed3QJhUkRCVLt@m3H#$dK^x2GN%CcwDNQ~vkxlyj!X^cW?Ax=c{phJKvu@*RW{LSzIS>@An$^55;aUF4- zTj{ujN}FV47({nfA=}&?JeVl#jz}*{?+)cCn~?47TU0J}2iJAs6^y}z)P*p##$e$HI8{mAbmlYfBO0&K|IzWbj)n|n{; zHwS_S)7~(Uu!;D(Ve(1sST)MI8et0vXLrWfM@qU#h)@FatyhsxSbOJQ&3do0_2V`I0CG|Dx*(H%jLobg+U!&PZl3M!{RgzEk>_kiuNG4LU zJCz{8o#B0Ruf2{i?@PzMac5?E$QCUvQ+Oc<*Kc~z5{zu~g4RFJ!YehDlk3@-SpG|` z!?LtW-A^O>FLf?3gXdw86M&6=A@T)dkI29~>tDp1Zjb=DW1WTHi{O)lcRN&e?GJ#% zx&HAoIugs#I>zv8*wt*8qnQPVEkv=KmR+{h2{T6j@3Iu6FpHE(Q}lR*4eGEoR}uwv zY85)u!zXeWQ%4evaA+VnvEu&PwFaeiaCrTxtC_WQ|Hs5ZFr)55-w|`yh_8hOUU4P# zpkvpUUoCV40A;^~!`pj(jy>OyNB;xVnBr@^i}YY-VR*d*?&qj0x<{E58V_0CMWwCj zxWPlayqKtRiDgEehPa|9hz)$#HPj&Cy_|_>JP_uhwoGlnQO_UB4+0&jYf4cNu1voH zDYQ$`CgaKj_W;=-I4MMbEDR9D01w)@(EKG!&!W;-b=&2Cvf}FNL7zMp5ehIqLNwmK zoMXhe)9C;MbP4e?SFzX)AW|XZ$_e>bi5N_(*c@W_h+Qcq3id^HPh`~OmoEh0Tz~A5 zh6_M)sE-&yS6TCkk>+Z-{sO+NnkDvgwO=Yqrj}_7Ff-m%C8w(9k>Za%f$tSHiOH%^Y=3j)MN(8sCp3(F78>9&voY?0fL*qw)1y|9 zgkT|cm(Hp^RI}x9=OVPpZrD<)ujG)LcTAAFy8hxvX%VWJrdt5@+-=ubY_~@4V4)Ah zio%gw1`HNft|cM5$%@VRT5mxMq&&g7Z(e)MJW?V5E(CG%tnQOLF`t4CIHybubPm|` zQB=T6Z!8(aRN{|NK~k`=xy<5=!cXdMXIA?@jyRm-$g<;BFI|hu7PlvVHGvgDPmYPi zDr~!G`=mKbV^{0P&Da68csARNm=23^LZ}B?FCN^=Xi9rMl+uvyAF*vU<+!c@qPmcJ znrmn@{DXtI>XBWUpYC!x@wO0E93D+kn^ZxU)|=@LBiGl9#o1D(C+Ya!$`;B(fdqvO z@3ZSDA{gJ|T{HVQa)(QC@sGM1Y!f@C_zoTtHktp2IUUJ7x01%Gz25EuyW6^OEO>O} zywr)6Hv|MpjFDoFXJ=#TBMXf~t#Ay!LTQ>{>dhW(RJN<$J{1R{A%WrfZbi>R!$3yK zVYK&rQ8EPpt~2z`y$GX3Qigz~N&|4x83$^$?jnjtoV@)B?kjeHa5(rn)XRpgewr@w2cRZ00jDWw_`NrbQJEj=s+D`Zaf9#XA zCZm}SZQkq|tCQ1S8kSvu!m-3HYocP8VA$9&!?e4IA?`NM`w@s~BwHe|PZJ?~Bg0*zgN$ zS+Av3-inv5Q(ZDbjy<;?(mYAOjF8(|UEn-bO8tO5wDLfn`9N{B2=f}*PmiIq@!yC5 zi#tGM$?t|ap=z-g3MbhJeccDaJJE&V0#_V!e&N~W7?qIX)-#?~FO?UtH%WbGGWf|S z*-~>d_HuTNEbT_3XP*%Ga9pDr7vyXV1Vo{HkDtb28QbHP?l%OhoCnkpcKeT?0b-Wwe{sOU>76Nr(jKj_n7#&%+|c`;`)(Qqzjrw zDW;(;@+h)PkvZzm!0EpCIf8uC^tZV%V~-Qv)=(;3dh5$wo!`f3mnYhT(i)TZj`2y@ z>;t8W3jXCb5Zyk@FT=_%5||tGpDvo1fluY1mLD}oHsDc=TU(wC|4k{Hd%?|x=vTAp z%Oij7T>+f^&@Fg9JV#UqG~<}XPtyE5i0UTj{=o{i`Ih(yKL<-%u_7RLkuf6_>(=!1areN|Kg+#qiwKv$ttP)-8XN+xxKE9pz03!^MvUoWclxfpYx}~+C(pkVrmynj zp{S#8U-ia6Xjk=L2=P8EW$lMPa`XTya-b0T7h4hutr&g15BX@EP^vU;?}#yBYQDn# zg1EMkO|CN}>uATSp~?(ff#wxx0N(5>RXkT{nsXUyeE91DoE!8D5TMOgl{BsjwfYdE z=?Hnl#Pt)HE3R7&uX?kPs{VF(S~*oU3R?y-+~}HxjR_@&V3?`6go7hWjXgP1KUd@9 zz9Om*i<_TK75kimrTR7k%?g{5OA!Vl6Vm%H^8T8JaFEc5%1~mfYkKYGr+dua zexrg2Q{BmL!7jtLz6g0=taYd|tqco`V`AzOiBGtc)!;}R!PSbUO=YRl#o(Z1K=FoM zZ9Z=ZBwefWskAoA*O~E)XXty3G=D&Wj?q7FiqjU5ZoHpAUI$H^_9k7{;aR+y#CFwC zRfUMLS>bxksGt!`0Gc}pBb5P3d7?!uiOJ1*F! zB)O{Y?t9PoiMP_^i-z&rmZ!QM>GaDC<6M*1+rjINdV?cMV6TFmuPeem1bHDc1D2fw zbn``ufbYVA4K*_IQs{B+M#>GYt0C6g=e?5+(7FAhFF4*R<~<| zKt{FE+p@pY^&u%elzY2GftahLTlHwJ7Bu1emWy;a))ZNT<+Zsqd;9>n9=g65o^Y3W zRba;kG;|wZsL&m#cHclm&)q{eYJunS$Ohev9wXwlXmcnj{n~ih39pP0Ye^EnQyPJP zlz|?DoQq_92T;YCNLVaoCBkE{Wg`UJvG6_tTz>*2wgaK?V4c3o>fneL;tspECym#& z1G2{xx*In=uukO7JuF<&c|>1Klq;39%nB-T93+ zHgWOavzCCHmk1xwTuGZONv05S<<# zp}0l$xWQDf#v%cT1!F7CcV==lgIH%?B%EWOTeQTbCtS%fNi3rD(^9QXfhI=UiXFi< z0QK`IX**ouv!6XOx!D8NB$SXw5?+IXe9@^gk!{{zso?L|BJ?13JVl!ClrcHxZ;C;@xB9xs;_F%7Q$s%O6w?15)|vgq8!Js z{*7ToaAwH=q?;YZ7Gn^*G5}8B_ZAQ}9r57H8C#FJ8$BU>D_n({zYfy2(^nrUuPMpY za=2o|zS!BlsR~jx7`rLGs(dVVL+-A_Bwd`VkG*zzK%$$z3b(5(7~d z6NaKRsPrgLi~b#YCiQ3wwaG_8D#MliT-{j;@k)X1dR4?z9tMC)O@um0=S|;-@(PpW zIAWAgL~1+phYo8H22o}6QB#hH<#1}Y(Ix!UWP;uFs5c}M9ynRnv2y}X!3Tre6rdJm z{EyZ1A!hx6I&w6wOfxVcd`e^G9R^7w#6O*vod^E3gZow4y4ktJsC(QU2>W12_WFPs z6_f`&&53n>pE`=Ft~$MSd-Qj=XkT2iymagU|7nGhY7DK4dgNA!*%@h;cvU`1`#nyO$K*Fm@cihwk ztE~`R4lA*Ar^bH^67$n#KIa8+Bz8}^-AC97PNcix(&NzQ1zZ>`;wPhIVFln-M zww@^jdV&x?e~&j4JkCWdS^6_Jg;Z;BY|$;pH)w=p@51 zEQLX7oX1y%1ql_EOy#J|cykie{OX zEqm~Y!Rz-8Ui&iJZr9CX`1+ouw;G4Bo(J_@^Yogs`Qs}S0dwy9I>x7*a8GM+Iwl?k zU@BSN*XiVc{#65v#Q2~d<2?z2UYU=bf2ZsCHt*usaX6en;V(fpGzN^4!~?k%hs(;6c?Kpc}KsB8cW}6mze=- z1K0TEiX%pQz+$7|6*|?Xi#Qm~U$J#)Q|y4PlDkatst-7pwKuv3+|lqTkaX6uxEFhy z&85UItIo@u$*1>G>8JZ-0}pIK*K$b5970?BGa{9x`_q`&ESyj`9D0l2QMMa_{OwFr zhp`g1P=(Jgx4wqVnrIgv7amvF?h7+YWT7R|hBLSy6q4H7h0rctQjH4j=8P=!(ZzvM zTnaw|@C8;is_LD?o!^zJBy_po>H-rP{jFi^4c;j&m9Xfe!D%xGb-^-Y|M&6#67oVn zQnXjT?)6@&@o5&AeE8fW%z;d?ny~9%>G26_0=0e*+OiZi#Z^!c zbXXe!&?w-BnnXx`RwnB}T$aUBDAM~wPTSjmP#s3lt+?*X;^-?l0^6!vtW?|M9kkch zw%*n=m;~1645RCn4GQp1+yYy9smRY8lgTjQpX22<^DChSvzmB4+xoOv;Fl+LMwyVuF$Nykdu@JH9o-b_ zvkKU<#pM~_*W*rNKxYc${Unc!+6=Lp*q6QQ7*p-v0V8e8dJeONZZK^?Zs*X^gD&1s z{QT;DPNYR|pgJ91N~QocN|S(3wNKht~1COWaxHQuVTb!fQ z)KxE93_Dg8C!2+*@U~2(bXFGv)|0x6%U<$3%C@Kk8!C`F=e*$PX=VfsC5!*xU7OQu zn?-7{>wN#Y4vwmZuq5u|H(%jXKF6C=Y&<#hLrKae0uga={}e|sp_8`ps0trkQqM0y zYWkWl($6c@2Q2CG6bvN1aCc%r46i~F@B6f z1=wC0IZajx!q!gfz=9!bR0bQx1f(NnRvQVH=#4OD$Stwf$qDBJ&`)yGC?pnIZyC|5 z?rakfsHO1(`X&mH*XG02TStvE2v9-FY26xul@7AU^fCjWnC5p`~-aC zx(asJPaC8XV(7)%N05kGt9}gd*T6I)nV5T!DLQy+vv|7eHGk4gE`z=IGHvwbwB#QN zVj%k@2=*4(CT5KwS!a`|a~B@i@65;tw2f9MyEP$GmeRh#!R>ydu>hzsXRJ7D>^TXi zDRth5BU7J#nF$b~SN52eq>(MDp9n7aOXpJiM0(Cq;DhwDWhtXHaY(Q#rub7mdMycw*R3=S_Kk=4aI~;cXlF zV(=jqv1A3dCaL9$LI#3Yzpm8e?g3ac0p`B|qF8Jm<=rfIqnEd4Aiopl^QIhycchC(oR9#*;YlsBLc3nwx3s zRHRDGNx=Er(5t|gXwm9GQyK#^6@p#hdjT>0&AC8FsS(8G`2TY&V>C_drLo|0kmdrh zDCl&qYiT|25|*K8Syes3v1Q+8R32mIV;4Z~cNeO~VC^zJ-0C~P^H)VRX7vx#$XuiV;0FbMj)7K9UOHoO5ki-?bL4*>WIG_*@xv*$B9{pa85=ggwj%(of* z<+)mMU#FW#k`sfV(R<(en!QtR$5d(ldqdy*k)@CDV^2 zuA6{lcO))=+@zf4zyF5@;{_wWcVWTksS6p)IF2aJ@(|)0x``y~iKfI)Mg<;bN+4}Z zRk0=B<=)A=>deF^JH9(b_>uSn5o{qht~c5F@j>TRP&+B6X^+fQelP;xB*IZ$&603T zAFEO;hQ4t6Hz-RcjJ3y6V7zlKZ~dJyLam(8-7W(B7QY4!CNphB$VKT^1ILSa;2DRg zBue+tmgJ;}J+OT2j4!ZydQ&@7qX%jBZSYJW6EPcYSGknAU70u_S=^vffAN?iLm4g-`BGkj|QX=Ebp5IOM+nZB0hRuO8Z|=XZ zoE??Z|8}A{_5WJIO)6Rjlfww!7x{;XJmwo+X#~?_O8mqlM9PLwS%g9N8*H2gb&DH2 ziG(RL%BnrcV)LT!tnrQSNQV?fjaqMJ{E60r5O7H*d>(NX;3Y4Cak&>HAw578{ot|Z zOH_ySMqs_T)_hrTKst^T6<4S{0k@AFZ+vE)KUyy1wgZtSn^hfn(n~>nR++nTY6e~7 zo6jOQNMc^2*J9G!t10D(Kb3#7wJy0kMfba>w*QPFRm`P|1E+5GXvf>SDEX}}9b+Aj z3OGAWbYmGZkq{2K7bF1Kews7&Q(Dp$<_sfDHq(`VNWL-N{fxl>+2@a`i0|M`h` z{0v(C3{jteQ5@aHNIm0Sqo--K%09=EIju?@hV)?{$+Ebc9@8y;_hirt z77;$s>cTMM>Bay5DKVyEu1);NXv+git7(YxooC0*Hl&c(CKH3=LScVBgsesy8KdYC zkVO@6eDYU@uX@_?#gR7xR~zDQYGebEOpv;%`-VSx9+(Q471rWng!Nwu0#~U~DLt(a zNN~m%#j-AY;P^9|2WusqA!9Vg-0 z9B44MN?*jm9Q=fzm7F_xA0f<+^oo&7&XEdJun{U#Xf6lDMuPKAThtuMywl{;^PH-dDU^6J$_(!ggui|=9gBQ zOyu6n01z_Sz0_sz)53DWN@7CaUdKcA2V6ViCpL`UGE;=-+>G=qY>g0R>%T(OsFbXc zz~a0){aSAx$4PHD?rJ0=_J&Rzv&DTdk?nAMdPZ5C)Yqy= zux83jwJNE6O;!p<7wDKNW`HHWDb5uwYa5b(E{cHgu}(c#>dbM0X2$kd@aY~D^$th_ zZ??|IBL z*tl0MA*e9^T07|v_hg$~cEHhvS&C!o5gs+wD}Q;~-FJs$olF(00HX=)Rlzq#VQo}s z!`KfmhCB^T_t=@!rsfYS>-$V_k(zX`$LHWWZfT`|qy=uT;q$jSK~Zt&7^yZTa*I>O z1hr5WAH-KfhS{Q&?pM=Gn5C0W0`AjZje8PbENT?)W1ndFYq6x z8YqqOwb{Gxh~~cp2Di`Kr2KZZwWTdQ5@SRciq@i+)3ktS{lTYaK$b?HT`E04NdNuQ z>{2j`1^r3$zxQJ<`)9>&z`TIUw2#`Yqcvot>zEH5c`LO*4>k)W9GRSFdlOO8QBlx! z0vgggfM$)Me}p5%bKq4cn^!yRCxQb!T-7m2@mWJw1|bC-`X37D&aZ~fyVA-%?xfMM zZ*6xCkZ%ykv>`L~%@Gy1fc>Q0@OWAJ7IH~*BZl|6TlXwh1GJUFh6|cp{)3!_2|$O9 zs-VzgGFvS`KHGoLs71*q!V2Nlq&?~@L(U|&$PJTPF^4}24I-kp**y* zN)p){yj-b}LqaiSJk2M3G`p&tz_$BRAOOL#{0*S*8$@QVG+;jrB^!@Xbn#v3yctil z-QV3{03@lp^>h@~_MMFfW&4;t?vOwLIYMs`mV0DC8y=6-(L(HwB{M&|ag-qyx3IhT zg5@{Eze0(HW+IR{6Xz8zW8wjj^TmwHX`2K6z)4AcSDsyU{e(Py9RIyc^w0>VVgeY+ zx?u!GAf7U0L#@54_MIPk%R;kT40Aj0Vi_%Y>{($s*e-U#LUwTe!~=o~7NoxnXW zk^764n4eRW6=N^?#=)UW5HA><}7L>-~5?4fsKQe1MQ8 z!6e`~iP<#@_yxW2f)lM3)SLnu^aj3gha>sYwxKeC&SsnsX3PIvN1>9kKXE_UH>tKA z5P~|6mz@QmolYyewTw$B1g~BZA`eTkQrFcp zF%EO_J4dEe4MH`bP*dQ9d)_VX+oTuh+DnG zLW}W`n%jD$vkxG&oN)n!VriS~r%YTn+PxqM7kTcE`Qxhn_JUw`CTxtwZ~yX8-_InX zS;K}AFZCcC5GZQqlIdTJYoNwjtQ#L)7Vvj|O!2Y{Wn7;b*|B}Z@ zn!BBvMwp(TnT(TB9cY&ulT}r=FPy5tTT+C1hu7dQGm2T=x~~(zRnyj=eCvTo3kTGI zzNM^AnhmN`lhpAw&2N?;_&uPROqFGnI^l)$WX!c!t7?ypuaGZ z^ppB5?t7={!-KaQP0sqi4lQXH-)0d@8(g$8jUiJBqLw#Mrvgizc;2=L)|kSG9%;vQ z)reuE5nAB+-&j{H5CrP~N7zMQ36TBA7>i?X6m7voV2(8{N2Ac14;8Az7@ATSOkmL; zl;N>||9()R@@Yzs`T&U8p8&6&n2W%6nW}*mcz%F8wRo+mHCY;*2gwvLjYwg|!^A94#`p z8P^V*ufuYt$Px6&--#BN)+*b48%~j~8Uz1DfH^Kn0cMc61sj^7e#^G3F2e_p%u*an z>h%+ZWMu}ab~&?vgtw+qQj@Ov1aOoX!GG&lvMm(OxC2-GRu82J0+hfK`|J?tFs2Dk2hn z4s^jd!2`ch9XEYj=g@4Z6$8E+>^ZJ{m#k*_!3+xYe7cWDegQ0wiozz?|0mLw-Q7i7 zwDz9f{K5NRyha;)7tRRAxXR@ZQ3iXI>W1=|JNzAPaLm{|dk0v8T7{mq0wTK9ciz4AdL9Im z&Hft}iJjW>u(zrV)i3h*{d8N$?P$0Em_nWD~ zV_IuDMfl@y5VhPqZyB9esb7V0hH51*-Y^-_zrsvK_N*U^GvKiWy5B_jb^>IdRo!ei z9DZ}l(RU9nnII0B8m5icsV2TkT^w|tOsz*QZe1;*(?-a)AI8Odsj&{gFg=J` zdOdmY$Ir%vX+kJMBH_l(aNf*!Y=I}+JoV`5=5+R0Li$8>_{2ts$_Z{C=VM45KF=fS zJy|L0IJ$(M8LDh+`U2prgc~|sne@AspP+M!FpEDO3 zop>^uucAJ0KuE;kGiO7!U0X=c4pNMz7^u}pORJT~4?XX2XhumJ19tdp6lfjNE?;Pbff0O+YTqX z&(1@6$;s(%{^p7h*MOz{hrF1{t*V<#x|-fZB5vzcc+NK%o3t>FYt4d<2*@3na-0=o zTDU+C6%6OFL3*nyK9#faAe+-J@<9wBd8?MEF44ORj}QonSi>|>H>ZnYPCh~K;mp%e z!Nq0Euty|bsWPD6{;oe#!z8w;@FcLn;zE*R#K!k4vd*}`pojKJ+eB)$JKyZj=|HyP_ytKOnO zswogt49A8ns;~+s>{8s&v?+4p!~!8_Ow60;4s`jrnSKO=YJ6%ODI{`ykx|POZl?kq zB5vx^)0j!8oaVqIKRR|FbYbD9D}}tTc2I0fXayq=SYqsY!HX+>2uPf+4a2F?09V!Z zW@;({0!QvFIsw?*>`Rrd(or@A>I!3P_um;PRcK+2B18(3{HANmh83qN;YUm{6P09$ zmUT1irl1w9AH&$(66{ZAHu&<2x2Em=*z%r$!{B5WMVFRZ!-aE}kb@fcKtALe>GbNs z_yL5^TP8-{cgQQocPhwFj(FNGem`Oy3EoRvodk$~^*^`YjfJ`cYl%&~!tVv$*&m!L z?m1}!&^Wq8$t=r9m?pmCViw)}pd5WCJQJ6xpklH*%TIdmNL}?2iV4eP<+FalRDh%y zqpxB{1um|oT->IZQdszQ1{fSPe+CBmu|%TO+CmlcrDvj7-ZOYB*9id^JvCZENeXsY zfzqb!0%9 zEv1C^R)A{q%uMK8}~%r0+UTe>TNfd$Qq<3K^Top()d&h!vo3+0R>j(ObcK z)-ezTjI?M;5k?|KYO!R<1e~?@g0PZgqer3OZbw#ZzH{&$|0n+4F3J0P6HckR+`lMN zFxk&=S47XdTWWmmOoj_z^h4ks9mO*9KWPwo+_msh)ikwbGrRSsT<^abY%LWgGf-@g zX@(MvX!RGmE2^x8c+R(2BW@>VkjAR$seaf5YUSN@0oaFT>T-G!-eap_{;&wU&}2r+ zTK|~Y(4}Ti7eUEp9fry$@#tQm13>Dgjatv+h`p!4n!mXFE?HmkFCXh9$*u*l%Q8%3)jvA_*&;NJ#jT;vSG70^Vp7J8H+shQ!xhM!eqIDEj+w4 zgHmhxTEcfI#V8@s@;Y41SdjX$k_HH-;eAI>Y zT!)YB^w~HI?GnT-_L+qfe>lTduL#z)JX`H!BLdirUiV?vUB!xS(c^2A$cMhM9&{}j z7A1o23lL3j3pOA=2eNI8SLy~lkGniDt~bq$YhX|5mcQluPNt4+B3j;)gg~csGE->U z-F8?deb`oAIF5^dg{_6l+TVHAc}dPT%lUkah&#>hSE_}dPZm7EX78!ZXcQ42A0}uO zGVT5v8+fdq2#4uxJ*JSFmubOoC|uubJk?j_f8BZd2w?!8okYVu= zPncjTOTr$}WWBhLtQbq_T#XC;<}*S|{{EAHg6H_lwtl>PV)Z}^VCl0Pm#ry_lu5*@ zeA#CBODKjz7#KRr0lGP=!a%f_njJyyIRl`QC6%5n5JK`L(Eww%u(AzFEw7~}a8_cS zRMJWs60J~MqoZXQY}Yq9pO(S@lgcu;wmf;u{Zcm<%qbZ6Xp|?qFO@A;Q|}v+@}><$ z`c!hYCtLJXD)}`MCue)WxO34=G?ia1S--NTU0>Zf%l769Lj+P&ZZXHcJhJMQ&mbso?Q#08 z_WBO2ve3t5soN5GL*#g%>npp)big{`@g1uGF%qnQM;_LOn8*|u2(k(Od&>Ufq+tE5 zcT7y_|41#-+@n4z58^QpD`(z~Mu^44nVu(2UczQekkWlf!9X}u^54zd7{H}VK+lM$Dd2Eoqas6QkhM&0) z7*<-u<#Va+TYAic%G;?a|O4*YI`=2`FEReJ8j- zW>L+qDgd@Pv($(*_mT$!4?G4SR^WG0y_F@0XVxDb%G}A*I!!9 z_=D|^g-=Er?$n%~BS{Aq5U$9Y2+XjZO{b1rArH zMuXrY?VLC}0nM;};^K#PFt)9d`KK03cd_V*tr{AuxazpovyCC?zAlSIm*aTG);c%U zuY%X?G|5AQ?(<`8x%~iN9yZxoL$Ib`LB~Kz!Tho5$m7rOy z{{5t{=)!Ssbnsj=L65E_BHEE_am4}Nx-w!HT`9CSh(<{Z%j$>Oyc~ITy$~`VzP70< zG7|B3YxfZ--#w;QF&;87v2Qv*Fp6bc%sp>&WdaRDUCv9B>Ef17tq(u%KG z!0>{f=jA0G6cvvxo`PDmRmkD@P_#&V~VsFu}rSD zy{cgYBFFb)#>7dcQ^D42mNrD<9|*s%{elsJs5)0oe`ZmHoz`N2T5qZGZ5k9O9Wx`OF(jFcGg_}e5gy%vz+CC_+k$$ zNYZJ#S4?i$4?i+=s&>EBV**5SwNz}RdWHuaD}sGXwJ5;Ju$e?4Sb#oHYWq4|c?QjY zVCHVksPY{~@c`hvqwv?hr=N8?@nmb4a|Zmzg@Kg$rEQN!(e;wRZUYw3&nn|vNdb#Za@Bm`^#u*ho(OQBawioZIPp(7cjArA_tDT) z(ctipe!qV5w3OlCq6LVzXve<2pbV+p*N)k+8|4L4f~cIMw(1lR;`9RJMHRp|fpfUKE{y(C z=NQ0**ltc9JNo?qRi2w+kn+2qJBxC`dB@m5T1r~(w*g)<81Z`{wJ2u=j@*De& zP?7=Du3!fYbUF?Add`6;HrtJaYMjrjWaD=J8S+H%^&k*OWMD2*I^88Daqr)G&+xOT zi-)A*;6De^Q^#dG*nHpE94L1&lm(C!C`utK$QVN=wvqQSs5Ib4x1l4YXJd)Y@egGW zRU6mfXCwtr+Kdd)Ukb~gEorL&h}i5S;|3)!Ls*h{ffVc08_Zufbbu-8XDw z)T&y&r!4X4Nh(_pO>ma{DoT|W^5O!tu=fv;TEnCuo68|0i}=DUxJxrMvuh|FF%G`& z++$Gvh+de|Ka!Wky@(2zM!feqEB2aTRQ?iicGW@7=g7*Jth&&bsht6=5Ns$nV7vzn^C+K2)|fn9GF>-Gp=rW&nvA#}rp z<4bZF{W*+(Uli5^52OLGx19HiZuERH%DnI`QRO67@buxM1xlo!2TblKZZ0XC>F~ns zx|+%N!NI|XUM)}41zD5tx8Bo=EU?RcsFu^g;sM8mm4}nvc>->_;j;S=r-`H*BXyk}?3M(iW!s z_@;ERF1KwYr>3vkp45<<+YJ81m(ZBIcC7h2;U+A+p)xVla|sr|K{(}<5{>PP{oeZXyG_mSNUP!cfPp9O+v9yMZdA12TfQ}9Io$7=*|O} z8#{T_{@5D|VmwxHRj=!yDuxr}1a`V*OeaU+D|;GWwVYe~4DA#Q`O(CS&qK``i0uY5 zA=f@n<`{cw%UN}VsLu;~x0lLBD4?-Sto*%U<*#tSvS$Kcgn6zt!VIrC`c>oq@$Ks%$ML==-?#UW|HL0WzJIV5-+=w2verUxgJWgLf-9E^G|NGMy+lZ z7gJU9Rf5=1#`GGe(J#K{eph}M*y8Zb3&*TGH|alGh#zE@Qth`^B~-2k4_5YuzI&Or z_9DaMcTmI?-7=aF*TJ0s-8FVU(p)&GfST0 z=HIP-P_QM6QOrqyDdQUdIBjh5jB_by0!_<83EC241bU)Mym*N|wlIlsp>enje*Gc4z7bB3?jsrww9s}BF{4Zy}31diHT9|g*R(3%w8K}D* zdkly_*txTI1>iNclj(dS$e)}F{SVCm?J4}+!Gul1d&E-(rXmTSmxvfGuj_uwuG393 zf*Lh6G?jr|a6H9h5|H)ae*-IrK?yafBh5HOz(0JZdJ^+!!fwHLoT;ESGbC$FukCDa z#3DRO!#Z+jh2#ZNlw6eCvhn(kvpLsIg?q9?Z|d$+@T5b2K;W)cS{rb#c3E)80?%@V?2ZYPXz z!s$=L7=pcLnLlSyQ&P|V>(zc$gt!97>nfvgn1o7v=~xBz+utXB$AlH4s(LlTYC=9y z+)#(;^5aXC-S)3JkK*8c&;l%Q`x(f==^qb}vza-S9L7@^;R$tM7=;toGRltKv8t35fMW5@ndRrhO#(fvkz zgJVJI7MwSz>*~uSh2&jkC^2VE+Y^b+nCn>K2|*8i{IQx(qi~qjzJH2}Z2L24&UPuyiCQfS&HM zU1^~HPEGw=At)`K5Ql9Gjq^SUoWykXt9#86g8m4UmPb5~ z-U4Qm7TF>{>!p>!Zx96BV1P&RnaG8vr8y5P2+ha7$wZT*9-{GtB{o91ba(dpn|*D5 z3z_a8ZhUC$kYp-w{AHTAJtI~n69Zk=lmV>RZA2u%oyq2kXXMH8PF|@YRo<0=U0a&w z#>a1NO1}ZJf}Uk%HAc=hAq$EED@Z!h+@20ao$ud{0VtR z460Ar+TlkSHLNG?D+Nf!KGoQRs)nYn8&I!TNuV3VQJ_}d^wtV!&Z9NTIZN5yh+gS# zDY!yQW}S+xog2@P@OP*=JxsnLjz>CZ(E|VN*T7S%`s3A1BuVige{8kkLrVv- zEjDIuePB{pXR&YT(h1SbnRS@Cp+m|Kru|I&aj1UGJ72g8eMNL-gT6S};x;cnoA2zB zQZaV;hA|Ilv5*YCMQAJa8h%aI_q36qfc?^u6}IY~kjwRB5wv8YvYm-}f@V#6UtQ94 zf04l2i=BmaH9Gskf!qtkjt7K;f`Q4^9(}X#hH85m$`p?r*NF~Yl?J$PRf4Ifz!o~R zE;M%Y%R!Vv|4w6S+lKo%`tc^hHtwkQ#VW!WE5DQTT(e^6Rqwlq6SE`)V>?k13EQ$x zJE|Vx{tKzeYn1*()yFq%q~bDN5oBUs`bgIoM6(cUmdRtfObj&~?Yn75T$M(mqjpV? zvZu9uG&jt=UyfAMLXfmdG-M&X@;IS=sMu}r%f1Ja;CNWheDIpBhe4$^wO#NbP0Dhj z^&R4Tk8jGSOrEn_g5MI}xz8AuntDEw2y|-`^w5hqHM1##`jUxSr!d(v?qVv^zo&v+ z8M(n3@=1#KP2nQ2jY8Dz%YQY;YPETa+(8Wk$T7T2B@31}qA5W8z`l8{+!O&8Iw3fY zaHg_jF@NgnItwh*?jPa+Liri#0LAZkrd5N%-;4@COO`St1A$v*Bc;^L>M!w zp;&eug%TLL0-0$?nt_FS_I|J_iJUl{Lr|Pcb=J{_{n^N(`LW(uh2Oj1al_O9)sNay zMzNa$#=i3=)#>*Iob!Kq;jr~{ZbE?aJUm;SCQ{@(Pyf0LM}Y@#`hJdq6^jQRm^1hC zgSGrr<0P&9*o(6AB~eguwXUBFo-K^_3Oz+rq?WA6Zx78YJ}_3>m=Di{kcxQjQF(cD z4M~P%jEQN$DS{PJ5zhAB0=ivu?dn=vc)vKuf?!&?0D%D`@0NlUe*YfRCo={UqJtYA zSK3#umWDaGSmX>9*b&|*_Ar3c+nQltwm(?Lg`#|tj|AM>szF+)ZsQJPBjDh(k(bjG z@ACfUIFM1D-%t{|pRo6$HT^`82&GbW5qO6DF%i~vm4lE5opDa}H0&66l}I&RP5O`| z35-3j^9kJhbLkyuI$_IQL?4|m<&uKiH~cmdclEH+-e#Qv%2$cT%HVFf<*pA>c1T4$ z=lk)}hO9l^FMk=5%T|jmZ#j>uyqUPRaFP{phiSuzk}wm~9DLaBW9}w~3<0jZB z2`W-$BMiw4k83s`9UP7-=_BqoX2WbV`t{Zm_0lASrzz~wLM9Ij5v*NB?;-lzA9r;n5Z_Ni z&d#5^vWc{_FF|~jP$k?S$W(mH#Bd-30ppTxWw>&2EZ+8I{xDKdZC|wQN3_;Q_y>y$ z^Oet|qLbLYX+Puvc|4wnBGdec=s@#3GhwUs6uL^vznzB1b>DZcPVnKLeDyT@s(XtWX)IgQ^(<}LZ;-@GXGq0QWLeoEKm&Re3Eu?c+C8Ji2iTVM_j>2% zb`ZNc){xr-Anz9t_nK3C79to&z*O}4xO!a{rr0EHe!-p`$sr|GCpM+^EV&SBZlj)79NGkYb~N6c6pjFTa{aUuH|rnx_7Go9$ zskH%`USTJ5yM<8sS|n&O<6&XDkp~~;@or|IBavWAOB&$QzF|zD`@rHJI4H?eUEy#T zh>^T0B%BsB=!gCM(y|z)kSmg%`2;sLi8WX8arD3GuDuy=O=g+$m1>g9`54sO*4tIj zuR*ij*Xw?5=hwWETVfGrY=@wXFXjBp#e5NSI=jz6$Wv@YJt=4T8EYe!2|h38;HNWp zZY_LTTXPdRgei-s@tVwwWVW^b`GS;d6iZmt&ju!;_Ct=F`hgsoaCi4WbpKD{Y_X3+7zcKe9iZ7qU^z_2(^ z@d<4HKgi)2gpburvsiy?9rCOG1DMfEP7s7B^_tWZ*zt(jnzQFU0Evx$QN75iIn&KOmmil zhzl&{tTGPP{Db1wwnR!M0CPmf>RFzb43W9`?fyc?f>J^4S$0NfSwBV^MWO>sL3{<_ z?SQm(=P@ei9S4rOAmFOE;Af>hogOfp8h8a)jrc(mC+ULHQ>gXXxr#A6{BWqcz|=zZ zs>*Iu+Zja*B-Qm;8kWy?!Fmz}r&d+eOKAlu=>60~K z(J7ALgsDMNDMyr%JR#OX)ZV90UcNx zc|-?$Cos7Wge(X}lS(Qc#a$QVQZ&j+uI%Ic390K7V)PGUO_(gBcXYM84Y@{nz zmM9hm$i`$x`tR%@JN-9n9Ng;eaWc8~PR!Jd`~FvrvNpNE{2K6n{fyQ^Bfl^seo4y;(IwjLLF z!HXp&mHpbKGCZ$pmb+AV+=@nT384R07DZR6IeKBn$3KO#W(I;=L8*{`T*1y&;7ps` zv%~5#X5!@WE$W8@OpokKPB|Z8<%zaO)=iY9)+0#i4T1^U-*hjn9B6j|LrC) zyDRheO2x#+6YvSGUA`A_)4f$n(0>GdS3a*_`_=*-!et^vunkwTp>YCzGd zBxB&ac?RHsSkndol3`ymHY5*B9q{;(4Vxxbj&nLGZt}^QJ*Z5I|6uu%ZB8y$NVw6# z!+uSCnFtP|)KeNb^JhV>-BN`l=+!m_)aJbVip5{PAiY%*s6@U7J`9ZQn6f4aIAsB9 z=YKHGBQFbv3sbq*#LyutDhdyBpEK;ZeWz`;P0$EArn#Am&Glas`73-r&Rdm8@S|h9rfQ;XZsx{bET0*T=Q+Ned%>0z%Ry}eVE<3dm4jSdy6_3Jl zna`Z+$~FrCNQxh>!dF!O;bU&M9i79>N-UJlp8){t1*N){4f=B1RRE zyJJDjGP(U1*}v%_lC6x*OgO1<(w#z}Pm>&R+bq1U-von$6@X@@?_-JZ0H!=k+B^XyuM63_sBV`fDTt zd^A^DTX2cAH1s4swMU#9gldlI{h50!fXyx$;4_ghEJwGZMC&UBVVGVu$g`phYb*Kv zuv5-eq+!cGn}6SJJk|Z}jg|@18x~a*M&U&#UX*2n8yReOMqFW_Vk!zT|H z?NN87XZ^1TIWw))OTg~dU5+>#ty^ExG0CEus>PW*F$Z3Paj>*U+DZ&sa_uyWe3XN> zaRiOELA#`Y11gQ1Jel)Eozq}X-BZ389gE1F<9;84kJF+}a{~iIXXZD=Z3(LZyin`H z8TFry+QH)?gq8hIuMvViQ;(1?qXBx!4XZ4|SQad6;wc0Tp^j0e+T#v_4gcv;NL4wV zSzBj{23F)zTogXD<6>Y-{Z(r(Itp&|rti$yUkqQ%U(>r~ZPNYtB-xX|bF&iY;#mJ< zAjSB;b7-FYW42V5g-jJcj0GgCtf$k{b44-trNgOnMpoSSXCdCa`1f#ft$X z@fxK`c0z z3DI^V*&bT*?fQkW3W^T637S7Xvf^?KeYn?2Bv7qyC%_~7iro~mC1ywqIbOQQ0ujW{*i50Ht#OTB zx41jt3Pvmh<733VODb;-MQojcs_4Az(8ja}|TStU6IMdNBETKN}Nf~ZvJ;fic1j>(h zUaQ@$9ky-rD9gL$)BPUJShysyR!d+s+sx4F6h3@%QWX)&Ic=SQh0dqB=|@)-0aTJ? z0SN;73};IvLTwF%_G>#*{c}KZ%=t3iY;JEbVwT$N#Ml31vS5O70TiQngo)q2XEMdkygP2u?s*(*!1ITXM-Y(`YVSdm+G=UlMh*VV79sWM9dU8< zo6ub!w9-6mbgSb&%gZU(?fs0B44;)mqBZ~c%q!#Jt*9k{wC&GbhdzIiF?>4hF1d0h zj#OlCGYbqL1wyi1x!1a3lD0rP>&-O9h2seoAhd?P3(ibW-(5AG0JVV7Mtfk=xaQK> zUmN&lT%O-N5NRtWXDT)7Fp}LBYYD+7yWM!r4Kg)=ynGQE0Yc%MFCwT_>|1|9Hk|zF zxv`AT*FYtbp?UwO^Rs)=G$0(~=r9uzt$YRuCG~`)(F&Ua8*>(E-B9=6!`T&2%0UAY zi{1&gz~tZ>#zgD5wKt6ukF`OUAs5W^G9->F&)FNrZMK6=rHii%p6g-sFZ*IXC(sWM z0#v^%%r8QK|-33f^rLJ{nhy{Adko!8uRN!|a5 z0jdkhJ~*6SN7BU7GPI6#h>=(S38t@R5`cOr?W9~aQq~x`8q}=yFytT#UbUe*nnp** za2WU(2D(BsIlltoWKXDnm*Uo7!4c-YuH>l4orpWd!0703DS9C%_3JF(P+i-t%+ z3okBL!WfRHnR`E4v8(oMF@y?Ig*G2%)kfD%T|Nabv_%yVw3>BjnsL>63Vc^@t$vYK z56NO%Zt}fIr#Vys%|B>8OeR-UE$LR$Cwzl793ej^P>AtP=yEkYPBZ$iTS3_(QQ`?`KELc^SReUWd`AzN_dD96;7w^X7*N zU3xsY*s2sKB;W=%u!lro@p{a{oW@?g&ro+^v~s7U($2P}0&Sg^QU@hW;M=N^AzW;b z@><2Cg%}WnsMExlY0y(BbW)}KVQnX$QcWP*d8jB)+CA=3u2M`W-)y_*=&SRq!s?tA zAHoi_4?$v^AWt&-I1AjKpSoL5L`}~>s{XEqF$g-7HYp}Ei8N0q_`iXdrR3l3GMzT- znwuj}5sDhj>-YWEJFgWTt&5%_h>z=|)COI zs|iWW*B@4>5=Y6_mGi5&GorvUJ~&Jga$JWsxWuOu5#>KV=UnbDwN}4Ind=$5gQ|ws zMtzDq-#=hT{LC@b{NNb7+ibpkM@7h$@p6DQqPq4p=UWdAVG>Y>-RQ8}dpJY-&;QWn2UM2yOjkxq{{4jk#1aEC? zjEVe8Z-Q;Sn{h~nk4^_D1D^~_P~yIa%li)${&RG#d%T5bfkRR7`8bfa(b#DyT5F53 z;FVWe3dLy)K3k4Uig@Ac`&{CUE|IiSdVV`Z9LT{212kmN;Fe8`%AM$ebwBo~;Urj; z*koxGKXL>e59CwkfD{s(vdlJ{vznc*y?mca}IlP$Y~>{ zy4TlN-(lqeHrNjS&WRdwD12VJfF6` zvwf{MV~U|*kBEVr=opjE?;GH@ROd}dm1jd89L+|;SxTe(+uz~&sqz0VAI_1c3(jKp zfumR)mn&Y?-WuGUa_XJjb|%h5L9L0(;E@Tjau4ZoouKp>9pf7{T*J2$i1RI%{r#ozMezwL+4CV?PhF9X8wS zhc4aR1n}w7{jh5kp5EqVwMh|KwQ`jhX7}A`EQuJ*ufrx=E)Z`cD-(L}=ycB{TO_ zW-PI&1}u)XYCuAmOF}M9R~9Y65yv6t#uVWHUwO(d1z22uRYoq0 zB9@!~s%~+Wj<3-81q(CjU{mG($>(6>6ChxnA1pi>bE-HS|6)uk9?5Nd)) zk2hX&RwO-mjE)12N}0_Jgt(mPWys0uY7Z6F-U}gXcLaE$pxDJmR!_o+sne+-@Ju`r z2+yaqd%`|%1wzY54CwqE{T*B?E4-~wR4X}HWB+}Y;bUN?+gB1pqS#W)xwmm?2QG~5 zcPnwE34HD~?#Z9cMMm%)?dkF$^-tp-!flTkFC@vGbbgS3Gzw=89s!{Kj!r7QYXj?W z%n6&d`m~;Fn%f}SmxwaWRL3A%H7eD)N0c`p(V~783sQh)O z0K^bS5j&lZDjWnruUOTV^kD4F?uJQG9LUisRDF@5IL1Ez+dZtcy-FtU%IPdY<%v5qAsn3Zkm(D#;`dmtV=g zrSluHQ%R`ivdbo~oPY~!M9p(~)t==D8F;@42$_qD#rKSDv- z6{st`b__>z({SlJqM319=tresBI4+gJOW{slke>yc_fL$a%0fwI^v_+^zt4CXcb$( zH5u=a1<0}-ABj4(qj)AA8%5~M7{C}b{)3BdVvVsZFWb5m<%j z`K89&QdiUV0kGr0xiV%)y>Z6Z*Lc+-_~Q~ft@G3B`U2(diI~La2nB=8j~M=@pQ54G zi!~rn4J~hsYL3aUOWh|empAU%!hIY8hFa`EhR!h83*c9f3&!KM&npRNtTolDs=$c+ zY_g~--kh0U9)x~-e1?ys%BE!_{C zX%H3VqvSy39A6$~L14@dxRCM#Tb0JzAu_ap19d7wvbiHDJ_QLtNwinR=8+*?d9@tg z4VGl@Pss{w+ei4q^n(=j-{YRW=phM0seq$BN>J_l5`wn1f&@6II|=O~e8*lo8D0sLfo&W#G67l3jc&LtiT zF}AXT)cA7j?4dz3^BGC}x1~W6x}?Y2uB|yk3r=}WImU`StbvmMP6MQ4{4>T zp@>FxK^!p@xpnjgGZuQk`!>l$Lp4|;G~62eM~}Nx3lS_0WV9c5eOiTdWBixzvuj{V zah0f$aCwyReCvBCqD$59X%cX!S93&H9F<{H{OsMR<&%*D3i_DuDsi7?i{9pWJG1-b4~T_A z;t)L*z*@r4<(4y5tQrPwcB)b+`BsW8%Ty_TZx7ZP>1A|ppVlutFKD@6V8^W~%z<^v2CmSZ>CT8XDFya1Z`L``@%uHO<(tJOjHfN!^6np~YdVvNKp1!sq6yTiN_ zI@SG5=|R@9Y|40T8Jlu5iExF{^}GkXX(PS4#pa62ncAo{QJ$Z~!vd!>hH&8i4yuO) zB}Ue=fThY6KvPj_N6SQ-3@5f-{Jlz?WeU|WhoRtapVMXvm${>_{vZ#QnPoj3u2MW#w^h~r~CRJR48MJ)7<2BYP0`O$&dT6Jww2QnNMP}M_;wNHJ4%%|IwPn97m@~ybQM}0oO1n&$y8O zD+)T&_`S&!gQf;t<^xNM#QF=Bnjv9X5oTNS;WXt7`nk8iojdB0gkY0zvBO|y3{HQ( zsWmsVnPv((l^K zmAlYM5Q@`-J|fu50~35l?$EGoui-4Mb%;@pm~pk}B}PtnjD%`l|KztRbaGic%cPSq z55uYAmnA9lAU=9rXq!4hf4=_zjL{#8bH2vOn|K{jDCtrn_1$DnUaC+R8bN}@wp&4q zMR-L=lO##h)_9L^l(_qp%K0w-@YzcBPPZX97&8oox-OvvRXd7avg1F9!mR+#u(8y! z)8`DO%QZw^^(tpNT(KWnIfh*ejz;-S8X;U*f!pl`LK|G2--$#hMIUX>`;GAqwNu3k zg!zNTu;_RY`y06GFrBC|Y9!#cs`bL8P@c}ALI3QNSQOBq*M?@1=Wq1RxWCrK(9Qc? znt-DTuuU4}@0u9110S9wvZLaT}ls^Ub1bdc+ z-}7%o)8)w;Z2=5+p4Vki#mT-v85Waqnha6Y$$*|f4Se5@I7$Z;npP(fO&m|nnz@`* zGGEQk-${o8z=(P#jGXly)sr~cYB?@O%rEzqcgW5S0xIfqam4x==Xj64Pa#*S81rRfKw^EjXE_^P8@O0n4c;;0IIzqJme}QDU*yyXEKAKSO&~}H&f3k#YGB4~iH2g`DVikI7Vg>tf-3g0FO;bWg_DNBQNQsk}@^~lCX z#7jBO%{vrEZx^^K#aU(2--1GTz*M`MP$B76jC6#bL@ zT@>@p5VssRv=cE$qqpJ}mw%JC)M3(pO0Z+n*WKr_ZxW#HrE6m?f1^UlVY1uQIcn{c_9; z&2JZeFO9ocUF*4g^gFK%VY}My@-J@-q$Kp=Wp=!>x7}m$2-5@Dc0R+iHlH9!?x^t< zOTcT;8Lz5J{66W*myO zjTc}rJvPmBf>+!P07aY)b+)-d%+df@!~_Jgk@|WzA907y(l+aB*TiXl-sr%yz4ujm zDem#~hnfZNnm1l6o@AIe0-Tr_oe-kr zl!TQ@x}s6sg2njpQ(ftExbi@m)cC|Di@fY}fSOb=go#kV{YasVdTmz^x&7>f3Wttp zwh6?D`EuFr87y}YdoU~BQ89zxe*Gx|P?_B{8-8-I7tCRZvSANPj$)$URxsJiRs!Md z{^HfAGDWJ^6IC?26VA^UR@(;a@AA{@&#wfcKpq1LcCt3Z;k<~)UdXx>$CF|;Q=kba z7*>Nhp!G)*v->YZQNC$>D%CHxkngj(1Am&t{k;aXE_$Dr*NUCso6&f3cntB@jGAk1 z#kA%60%QQk|1Xfxjgk)lO8#?zNL6hPBE(8&dg`zR2%C6Wfnv|jBDs<#M;~%YXl$Fd z3Svugw_+=dEZBDWcZ3?7+=2qpqqmIT@8-W-evu7-LmMtQ?S&*ECRT|8qx|EJ7`d0b z9x!InZ^<;N!4btOCVN~CqZl_?(fU7fNYjfrX{e&iAAVbBhvzFWZ0fn-E8EiOdw2Y$ zOMR2jsPlC1(~1}L7B@6O^K(uR__)Nx09uu=EM5WOC+y801qo=;5=-^YYd7i+0Ck~` z10#?33r72cy?j+l3hiU-3CeW?509q6S%?X=p5O5+NS8W&Ia67q=Q zo4|(EHn^&6N%89oMB*Lgej$;9nWjH5)Pa2SF2JuMc4+OgF4ajEyNCJHP0c90c|Fe) zg<=g$Nd8Ro;1<^-0?tKQTU}#Hr3Rs!u=p`%bVO%PHA-8071(jpQ=kCid`2FRq&|Zt zh%;PCCrtX(h6b78@Y3Nh9PBw^hYot4J4=RLuG&hE8boU7r}nHJq5Nz)5(xOy2i^yu z81be~S*KugHcwGhv_{bV-^N4K_o?!E$cJNVPE}?Ka5=$Q{Sc58< z3u?IWHo#w@h6j4}fR>1dPzh5n4AaooD6C;X%`{;0Z1hImp~wwui01bU5&9FnV$oCsCL~V$bkEiWY02 zXXLFM1*;3T@22t6B^J8MX$YDN}F?{0b zmNv-C7=9jfvf&QoYp6!K!q2>&l_cE)+P48_MkwwkY&+D{&y;eDD6YGOi%&W$lsYHe zl-t|=$z(}r`Fn`_J%msE)!k#IVp_MzT@j>?w)!)KWA2!-T7!NkX|6dFFI@znS9o75 zG3n=>uz}$~d-)lQwCCXlf!gvwszWj)l3-oq7>(ldnWP!nz^i7uPpb3Fw3{b516f1> zkM^-u7&;x!5Q9$rRfh9%&H0F=BnGbb!R|nv$wIb)rCCiW%E%Uop~}gyQ{SUOVOBF{ zT`_pMB_`B_4gW(6Y{dJw2iVgAQAt4GHm|S{Ipbl(GL@sZq`I9x4mROGuzWuzCQAOJ zO_fU0pF|MDJ=qFWYCszsI*2j9iISmc;%tc1;JFyr(qQ?7-j$@{^j(PzQ;RQKq>sOt zm~kA*wvDX&{))*4+6L8hobEr@H>LcyzW?4z&~j9(K%iAJz>q;_oWy`{=xdsSQ8VNa z1K;NgUIAwT2+tz?{zSR~2S+K+HjFv{tV~YL>%e0KwNm(W0+Nwe6byI1643~>b?+Hp zU8a_VL{D!%-;v?Pdb$QNgKWd<*ua6e5jQf>dE85eEI>lM5p3JoQcKO5o-N%Xv+;-y zuf*W*+Bu~h6A^wt-9q`N_ScFGIw~!|hl_Zo=;eurD6+4SiDeQ(t;zfhP|bm0b?-zM z;tHR_U&S-~0&GBU552{s0u6$;ERaY-M15_}+Vo$m=`+%l-EB1nG)CRe8tZj=U3w=Q{Wi#l{;k+U9f+Hz@<;CF7jXEKrdWD`KV+MOXa#BT}0C7DtS$C zO8Uo4I4n}{&cGgH5UGXWi-5N+rQNv#ibA`wXe8?$iq*)&@isw9bYaEkoozhGo+3j( z#van`!oQcIF_jfI;??Kau#aqr;@TgUCeK++F`S*J+3?nm9*#HYw_ZVDe0^nS8^LV$ z7pZ9@a}1N1+w($W=buMWe$oy7_D)y^66TS+8h_<%vdrT)^u(6Xs6H{!uj6#=x49r9DSAaYZ_DSTI%Ai)GrIPW&6 zB%^g3Eto2YWgb;LLX`|9z!#+*m~{*&BWi+$x5yX%1Faj;B#SAAq(Ud=8rJW6{nVl2Qwz&yv5N?7PMY zul;6y1Fs#uzPtf~PEhV?D=bcZ*rs<7V`Sic7#)$6ibXhl z#95Iv2T;;J#K_hmFuO433Aws=xIG>WklZc#he7mn0VUXp1zhK>bc0LNUP+AtLre1# zv!&PX%g-*R(FIhk+TU^CuNJXhR z?^&vH!A!FJ#F5^g^!7PczpxQI^5%VG?^thPQ;B?zP~1Hy>RdU+PUbXCocKv13h`hiuc2aeNMMmeY=jXI8=miA@6T9!QJFn2+ zc{2hB9lECh1;R=xb=CtnAKCCIH?$+9SPN#?pjrjBmE3 zy)n1dduo5roqv5G1r+=B&_LGJ0PbXWt74(W$?@h^auh#&+pN{dAex3LxdT)oXb~*$ z_P^;FQA*Pg`TPW2+wI_-k&4||QbvF{HG$TXScQt~z!*TX^%*lBeRTH)YJl zENFZD`JZt+Js`9u&tLKiSS;K(t(;3lj1Ru@;3{1{iZp(dv)ny4$9xu7eTnv##%7A5 zHMCK{9efd}BJ8ZS-8_+D6A|$!0SgD}v|0C|P?eYu@Ds|#lG#Y&&yo(l-xmZNp+B!2 zT-#>&bQ-4PGHRwYWJqJOOr8|l*Ub-Mlx_}uBWiXg^$m|-JQ!Lq?5$;Q;Wx@Zj~8$C z_goVW^G7xNtWGb%Ya&B%#IZTLSpQQWy<6b3QDzXHjL_?GH2LqqCmvV$+_V4WS-Y|K zUt7=-_%@iiD?6n16;b2sRuV7cTyPSoK7Xq!pMZrSnX=L%YJCj9tpy1s-qb&Ga3;Sv zjJWZf-Y8LJ_apQF7A6Id7^|V)2I1+D%GG=bRNRKfZD@Gvn;rMd-(P&2|AWmUqo2;- ztf+pTYC9cSdwGiK4n#>B@(RV0YQ(>Kiv}{@UflG5OrQSC;Zo4FvT}167fY}H=2eQ5 zNEPFSEXHI~18j%OR1+9<1P9mskVcDNAn8pWw5*ddN+_O1YI>_z3e_?BnR}Q&#@mbNr32*_2=-gvIEsqNL;$x9u+dq<#HNh}D2knUL z4_XssJZuM9XDo&>W3b0GJ>pf+oG9i7DlV7)kHxLWBm1LZV!cKF^SakA+OQ2TQ|id6 zxOj*U&}TU{TCKkPSrn@)8*Q2*l*JHQLhN6!J8YyU%Zt~KX6iPi|J^~f^Wx<|&7|Jg zH!ecqXjlYllzsr3q+A_8lg{X>0&AVeZZAgD-aC&?&vSW_^n1z7seEWN&-MORV4RN# z=Arx+O-3O1nAw_Zi$zdct zD~9c(pqy0vVG1I=tK*pVr}}k1eH(ckl7}}>nwrcf3fb{R*o%RPzs1fFPy6+}t|%?y zc&Rx}ge#PjQ+v_@u2IA;tZ%9+FY$3r;5^nJ;MsVrjO@eqAOV-)dOUiD3vk#6!K}(+ z=vOSOl7yGQ%r4=GzLl2~fI<~HS!W~wO$~0iechU}4vK9N4yuYwtSNMu7!Pwx4whPd zM0;6=u7G=mHjU;KNGC-9-7klX>z{N!+2&RsUHxK?A`j(G+@o??A<{oJ{Ay)HWxU(G zWRQr0)>@m2lI)iXdjN*`hS#3dertFfrsagL4`atU%{1I*pF+xt zxS?wF)R9iZwSp(W_ajuWcw;P}!}Zek1V42%zo5q^vC2lO&0xlB*oTSx&L?=l8VKjn z(X|#8Qwm#@Quf*-yQ!V#j0?a1;o&rd&CVowvIYfmeKn-Nv>HZhy_I;ElPYxA=M+oF z#8qU1iIBR3All{);6^BO4c)e@3P}yvUoBpR99@Kpf=|g}GxnG1lvd>maqbf1C+$5L z|0X>qMnN-%|SQ_LQC;%jmzp&45M8bB~You{JPwo1y&PCc#gK8qeewS8>j z@SstTBu=R9F3R}@cIuEaOTc$BToEG^2IM5yMPI=UfuEN}tva#m|0n!`lL2?JZyEAU~rT=h?6tN*q&EbC?KMK{0h3%U%E@~Dy*}l*M}s$f&s27#trnJ ze}-N`eGu=%>GXUoKW~3th>b0QxU6-@&@;Et4ZO^lyaA!Z5?O8GjM)P`5hgMR@?K8- ztBsW9!n(8wIzs72k;bREt$`;#u>c8_l`0C&S)s;S96QJ*Fi*xjl+%_dk^0 zaee`1<5Ih;d>o6FOBO=XyWM&k08H zt@v|nHJuv~^M9^=bA0bI1&;jWykga4twzPV1r);wM`RoUcJM;odi)FzrHo|6h3P3H zR%Ns~yPa;tWwC+|5P~shnrO7S=_JuYmuslX)UJlf?3Iyc^v-=oZs5oj=BdSE61SYB zMS=M3$?XU1JTcfjfW}7Z@}S_ITc@+-BmMa)`BcmH?V(_}PJsEH@f=9T&7UF}$hB-^ zxa;UUH-pbcOu?KnV}HNhJ(4`tQGNm`92TzQAOUSUf`MgZhw>lIFoV15NmrYvN5x*8 zL8mWsl3suW_>UQ4pcbp;8>bV+%ys?KJS>wRokrnsVnC@rmRFihgie#5HgB$827Ojk z8u8A7!1{I$LA+i^;R9?pX?Ram2>SE2x6#L}l;v3!ju_<5Qcb?&Fj+1|iKfVGv(2FV zoq4NU>e-L2IiB$U(_8<(n1iu0Jgr9iq4dRrR)#__9?Mv(z9RezunUN2SKsgx5FseQ zNmn1?{u_~qyDSXS{?9;u^uP|Y(Airq@nj`5mg)%c7-37R&Y5b?4&yJ1TceA5|25jt z3&AEkGR;@p6C{y=R~nrDoVWkTVqD{gVg5M2dNdbm>VQc@6ta`(S1vV&6o533PtP~B zF;fB?t9$e5#8F1M>SiqE=Ki2F(c7zA*)B24$w^@Jl$rkX)aads*^MnGwx0Hj6yc5F z!2yI%yQyw^kq`AV*3~-m?voqZ!T~KPBFo6sw@F)SFBTt`Ns94rZat}42Hgc74+B0l z4?| zMXEXN2BB(qw-;Xw%AY3)ij-4sZ>b)LgQ?>{_gsY33#PMSz-5|qxfz@?K|}*`W**I^nkK;JZqfPi0?Qi&Fd7WWWh3~picPP-*TwflH};q`T>_h`BS)QSN;34=dYmS zXNc+^Lt>z8-sS}^cJ33)>iHiDi98ZDW*z!Sto53=nM<7gM7%Tmz|}+}Q#$4l3A^BQ z!M=R{2i}91quX|i-z8rR+i#mA{dPfC66EW+*#vice! zzrlmV3wr=&%>uugt#NvDK595;Cg(xPPV!0)TXPVErcI|*4%}jKpw7YBn4-pu0ric?FoD+arf|=`-~%)4CX7Kw zj-RM!loQ-xD!o8&&YD8G60WF9VJWLdTNOY|+tdr=q*rlss{9=5a!;%`ANsxnWWJ$3 zRpAr{?q6S4)w*C$6*!H9Cm>inQE%{K`s47nQ;XcSV(y<2eq_Q2+v}rT7_%;r9fTXchO2nHeOC>t z^}6&9gEm?ALod0L9p%}aq@HBhth;jJwT#9VGk!zleDJ_a&vmkjLsZ}#d|#qZ)hI>W zCGJ+`b%(Wk?=R!YBQfz|X8_8bvnAZqnJx3)*=f5Y(wX$#H}$?Mj3pAdszE?B#giQz z6s$L_o3GD6rKF7p8(J!7rY9#5-zw{DA#5ttgra&ghkFOOtz!MsKHb2NLlQPvxe@$M zFO{c!*e}F@SrW7(tX+`!clAhxY*?>Ju?6=RuYiv)C7k)(t7JcccX7acm(ZvUhGoNt z!A^;e>~ne$2;MBbUYk77!Cjo{R&F7^Ex?7t&;Mx8oiAGi(VnQUDaw9~K@|V#6z@p$z|5tW#j`txaDT zTwRx7*+)`1%L8e}n2lgr(Vw5*q$5VQsFHl{Tcg#)24*=9k)l1jFE}|gV{eA*UA%A# zC?#j<>@QqdbfSfaUNr<-Gs7WJjx*$>8R^@0wWTZ2D?lvY!;*69yz;Fj6x;@R0rkI1 zXX)S?`@APAJuVPh2oPJ(scA4tu&cw}iYw(VHeB$-KhxZ$hYZG#iAc1b5*hEQbM9^! z7FTP`C6lVDwVoCe>)pj14_ZFtfpJRc$$!>8NA}uq3fk7Fy0VwV4nZ(8EDZB1`=H(a z{mK~)Fit)RxSI}ii5lU()s;C> z9JhMj!`uHq_PN#?h+g?;b5ekN>YkoL63nOD=l1rtR&)>a zo>Y1ie9=C>cA}t(@DF_E4X*-cb6`UPacd!Vrq@S$L^-=$8PaR>e?Vh)v01RAzgB9c zYNx0_4_TGzLRJKpSO>3qw{@B!(}0fRbI`W+_e1MS@P5=iwgQ;JcnT_ zz9=NSK%#N)&L^o;0jz&um6?E2)j-c?16yI-iWk8fX$I<&@@O#Q+R$zGUU)#n?40U2 z*`eUVcg&l5kvb$`vD;wv4PFVF9C6 zd-F@2DbR*ft1UJ((+US2RTnLKxL(Bs)NHhT@C#|AXA*gAK9$*u7T1!Km=TqFJb>Es8vI}$-QO#q@K5_&^HJKq z6O;4wEF?N%PKN-;TXwf9j7=_`BH05#JeleVf^&rb1B zP1AM^7C4;IkgSiYAV4vtD6<$=rqJ>5OENi7`?zx^J1$+AP|qF1Hlx-A-?0opPP-H} zh0mP8tI8Vj(#&Yu%^?#Zch81Awn0rfmpkw`ID$h7rrzXt`U;;P=jD01_I6HWINmhh zyHCl_zHdlU^|O@s$sW}#y5Wdn0=uDwb}V(pl4|haNpcEUs~CTtefD02)SiI}(0dVL zUhQKWJjKrNGpQez5t>Hk&Gz2D0zB$zWjy@BNM+~aljeImaT)mgjq zkA8-nD%owwIzt>Dp<}KZ|GC?Axg*xADOo2?Lp9B>ZOQKV$in>Nd%7VE&G!Gz~HP z>eR*=8@<*X=O`N?{tA1#t3p8(c8X1~;O#A|d2srMJJts1J$<4M8G6BB|9OSLD_yn! zfbJv1P_iyxwNUI(c}x&6Z%gF*RaZ(W8x}eyYyZO4MPv)E;)wm9{Uj6PO$S4t!z0|S zX0d($HIV%WM8Sja-ionsT_74qEXPo$8`%TuHS*`4M+^uWiqS}lp$4_bQ4;ur=iJh0 z!g-wIFA!qylAF^_Pv0G2?~@X0C2qEkOhWuv(QFB>emhE!pyOWnZ-;^V@`}ffg3*KO zY3fFWJWpOk_-1`TY7yOo_?`r-V=}yEFYNm%$OKKeD}Wi{XKz{Oksiw9*e29Z!T>oO zN}G+8)8GwBi|Nejt#WxmYYX|!Cx?Rtmh+}0PwT7Wo=`7UxBDOt^6V(SnukK?>Eg^k zmf<^*{^{RxrIL|*-29E@v~4vH#z;-XQUKB1;FXgk|0KSC6JXBl#{DoUIl0Tq#ctI3 zTB-|_T8U+bvIxmN#H(>af!hKrWLt@R4W;Yx&(#*8oCp6bs?{Fv!2&&N ziA(%M1@^9Rxm=1rDV5Iw%>pHrNRzo!YQCGoar)7qV6-9B;TG1)CW+Vs7L5iLWT(!1 zy58lp<*LttG%>E4F0IU@sLxpNma&6Gj<i|kxo-lm=j&OM`T-`C|6|f1SrEk_3XUFKQLFF#C~V!p1K_}p=>`a z?K??V6U|Y)-xMtA)C-Nh|3yl=|McXC*v`z zmx8oOZ=Z8W^QT~#I**3CR{THL=&3Fe-E)Lt=&*WhnAHgrn1>v*BW=u3(~v7KFYW+b z1745Rs#iP3u=cJ7Kylf!M07C9yl$k;L5ZMKRTSUj&=(2Ou3!ID(KlRxMwx1k#NM7tyQxZ2eBLe?LfEy_v4+2}^ zj928VX6%fbSqXL^k-kz>F8LA}neL}WuM9&nCu-{gPg34I#>v|bh(O&z$R@!DR)PZ& zb7&EcF0r1__M|{$(*)BOPf-G$5AU#+tD9IdvP3*=kd&HAVKfQt{ySW86WSk;HWp!E z-6h2lKj%TC<@}L8{3z%}xM!rug=8(2lqA7IUq5}Wt1mjH`;E7v$P2Ap zC~o_MWbk6exn=8UBq|>Cy7K_(YD(=}aonG@(yjq)cv@YsD+gl=D?u<@dVNXxR1VzB zJcsvC6Ddn2plZ%|@uFd|WdE=4qo1|#Q>br^Pib+6ZV7=O(k5}0x}x`2jeIx0pA4>m zh*fuB#X1fkL?Mi1wcWDcF;i_`5|%QlRijk>&h8Xgp(Y<7tJF6E{ze!RLV z2)4rNI4o2?rY4f0GC#W&Cj`%@N-zbiTLF9?iP4Wh4ePI)15j}Dn~J_V9Hm$WLzgHl zjZDdm1ppA!H9q%{*eM?vZ0MftyJ<4=Im#q5bla*k^yIV(qEQ6VO;?!lJx+1m z|0;(iBti6;<(F^A29kdzr3TmtjwpZssG6QkL`aHbU#my1v*#2>9o*%Z(sp3`WEoc_ zlPOXAn654wSNU2<2dT=Mty}U{5WAJ1>BC|C+#(pSPl_Me)$j&9e7T{YQL)lsrw~PN zF_sV5p0vgmJcY)e25n@pboR&uag7UN-{gr7w6b4G2VMCUGcV%tx<}S`eHIhTr3K`} z-DVXy7r2C7f89?;b_7%?RHLBSZq`Px=!q&WL`Qvjkuu&lwOQ-W{8N|5z)zCgd?4+6 zL=u+E*XV&5KBei=hacpvu!tY8X@RQS;Vrmm-qj!+Q-N*Pz}SdgJ?DqZ)l2@8mSo1! zLSLX%^1vbl$;fy&hniq zVbZ$Na5Ccgq~K;#f8UXEy|;5kW6)r~f=DV5w6I5ilql?Bb9U^7R3=(U6MP9HYJ|4* z4m&4Hb-3Sr0q}s}cyHBdR89u-+i*0HT{G7C%IiylrMAFjH1(z!nhrFfL!?rKVOKvP z<<01NeoZ_8Mq|5-JYUS37(%lg=%GIm3YZDWerhXdHM32)(>(rfVE3>zSUtH%Ih6b- zXqMF$&mw=0j>Ku16B*V@YJ>YK?^RKGBz<45F4Fg{dkTK~4ZOdt#ww3Op{r*74T>a6 z3}z&+Y$Ika;4~HHQBMqB&zGqrtaiw+-F^NB>cEw%9jBg*bPo=~C+ve2Nk*?8w?Drd z1P!%oZQuhm4r*Fil6gWg7D0hOC-Q|!#~DivbOpr|Z$?;z2nrU^@on`_l^+5lOVsXz z&MCvEO%5jEvu*9aRInJsb5%d~e3$QI1usM2;kN8T*&L?gfjqHq*<~;I3Ob3nB5WGv zW1>Lvhp_N3V#J1%J+Rc63>WKWIjPG_lpsom;j?5ydv@bG#4u9N^!-_2AZR}cF;YjQ zngzEH0OA{`L`D^{s5RCww}?A&X!p?;npFcQW!0lK(W!tZ8QLUNXC~@t5}QR5Mvn@X z+DL(hL-?x@eodZc*vO?>;o)(~6mQGVA>5dK4@n?`_UKqy63*wXceaN(tcVNoQCFV; z0001iGY75@*Zh>V0{`ZtbDAn2p)>vw5Z0%D07*Z>ra&2H^a-I{GgATSE}0gh!%DJv z)Wo3xMK==-zQ+`5zyoo(C4cQI@4J{1%n+40$5!?i87wlkHEqc&f(v{9SJq1XOMN~j zvN^lNQwuMNBscchbcPZt#jCWh5p3k4x}rZ}E9f0Z4L%=Ei-D1*^Xjn8Llw}$0JK2j3PB1d zgl4b{Fyz6Iwz%cI)$FUnF0A0utC(I$#xm@Cr$@Z8-ZKv(7r6(mj@MXSmqcKd(;K08 zl2R$(5xR=oh3w%Q4<_-__suutkA@|g=bC?d%n^a%!d^O&7I+Gp)fHa2xS3hJ=!!naZBD0Zy;Xv{(}do za3z?oN1QxmH!^s{W)4a720PL|mdk<|=x^`(IE}hL_KyBrO2|lx`6Dzi1O~Stlh%Kl zk+M0YeN1DH|0>GQ(h8;_8r*Eq4R4fw$nUgv99p_cP}^HD7Y4!6ZvhE`!vF^h0RRCb X0|5aAT>uaO01Sh!3IT?BLKXl3K#oVu literal 0 HcmV?d00001 diff --git a/game-masterchiefcollection/types.js b/game-masterchiefcollection/types.js index c9f4058..3a2137f 100644 --- a/game-masterchiefcollection/types.js +++ b/game-masterchiefcollection/types.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSGFsb0dhbWUge1xyXG4gIGludGVybmFsSWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kc1BhdGg6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RJZGVudGlmaWVyIHtcclxuICBNb2RHdWlkOiBzdHJpbmc7XHJcbiAgSG9zdGVkTW9kSWRzOiB7XHJcbiAgICAgIFN0ZWFtV29ya3Nob3BJZDogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVmVyc2lvbiB7XHJcbiAgTWFqb3I6IG51bWJlcjtcclxuICBNaW5vcjogbnVtYmVyO1xyXG4gIFBhdGNoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVGl0bGVEZXNjcmlwdGlvbiB7XHJcbiAgTmV1dHJhbDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSU1vZENvbnRlbnRzIHtcclxuICBIYXNCYWNrZ3JvdW5kVmlkZW9zOiBib29sZWFuO1xyXG4gIEhhc05hbWVwbGF0ZXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FtZU1vZENvbnRlbnRzIHtcclxuICBIYXNTaGFyZWRGaWxlczogYm9vbGVhbjtcclxuICBIYXNDYW1wYWlnbjogYm9vbGVhbjtcclxuICBIYXNTcGFydGFuT3BzOiBib29sZWFuO1xyXG4gIE11bHRpcGxheWVyTWFwczogc3RyaW5nW107XHJcbiAgRmlyZWZpZ2h0TWFwczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU1vZENvbmZpZyB7XHJcbiAgTW9kSWRlbnRpZmllcjogSU1vZElkZW50aWZpZXI7XHJcbiAgTW9kVmVyc2lvbjogSVZlcnNpb247XHJcbiAgTWluQXBwVmVyc2lvbjogSVZlcnNpb247XHJcbiAgTWF4QXBwVmVyc2lvbjogSVZlcnNpb247XHJcbiAgRW5naW5lOiBzdHJpbmc7XHJcbiAgVGl0bGU6IElUaXRsZURlc2NyaXB0aW9uO1xyXG4gIERlc2NyaXB0aW9uOiBJVGl0bGVEZXNjcmlwdGlvbjtcclxuICBJbmhlcml0U2hhcmVkRmlsZXM6IHN0cmluZztcclxuICBNb2RDb250ZW50czogSU1vZENvbnRlbnRzO1xyXG4gIEdhbWVNb2RDb250ZW50czogSUdhbWVNb2RDb250ZW50cztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGF1bmNoZXJDb25maWcgPSBQcm9taXNlPHtsYXVuY2hlcjogc3RyaW5nOyBhZGRJbmZvPzogYW55OyB9PjsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSGFsb0dhbWUge1xyXG4gIGludGVybmFsSWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kc1BhdGg6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RJZGVudGlmaWVyIHtcclxuICBNb2RHdWlkOiBzdHJpbmc7XHJcbiAgSG9zdGVkTW9kSWRzPzoge1xyXG4gICAgICBTdGVhbVdvcmtzaG9wSWQ/OiBudW1iZXI7XHJcbiAgfTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElWZXJzaW9uIHtcclxuICBNYWpvcjogbnVtYmVyO1xyXG4gIE1pbm9yOiBudW1iZXI7XHJcbiAgUGF0Y2g6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElUaXRsZURlc2NyaXB0aW9uIHtcclxuICBOZXV0cmFsPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSU1vZENvbnRlbnRzIHtcclxuICBIYXNCYWNrZ3JvdW5kVmlkZW9zPzogYm9vbGVhbjtcclxuICBIYXNOYW1lcGxhdGVzPzogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW1lTW9kQ29udGVudHMge1xyXG4gIEhhc1NoYXJlZEZpbGVzPzogYm9vbGVhbjtcclxuICBIYXNDYW1wYWlnbj86IGJvb2xlYW47XHJcbiAgSGFzU3BhcnRhbk9wcz86IGJvb2xlYW47XHJcbiAgTXVsdGlwbGF5ZXJNYXBzPzogc3RyaW5nW107XHJcbiAgRmlyZWZpZ2h0TWFwcz86IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNb2RDb25maWcge1xyXG4gIE1vZElkZW50aWZpZXI/OiBJTW9kSWRlbnRpZmllcjtcclxuICBNb2RWZXJzaW9uPzogSVZlcnNpb247XHJcbiAgTWluQXBwVmVyc2lvbj86IElWZXJzaW9uO1xyXG4gIE1heEFwcFZlcnNpb24/OiBJVmVyc2lvbjtcclxuICBFbmdpbmU6IHN0cmluZztcclxuICBUaXRsZT86IElUaXRsZURlc2NyaXB0aW9uO1xyXG4gIERlc2NyaXB0aW9uPzogSVRpdGxlRGVzY3JpcHRpb247XHJcbiAgSW5oZXJpdFNoYXJlZEZpbGVzPzogc3RyaW5nO1xyXG4gIE1vZENvbnRlbnRzPzogSU1vZENvbnRlbnRzO1xyXG4gIEdhbWVNb2RDb250ZW50cz86IElHYW1lTW9kQ29udGVudHM7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExhdW5jaGVyQ29uZmlnID0gUHJvbWlzZTx7bGF1bmNoZXI6IHN0cmluZzsgYWRkSW5mbz86IGFueTsgfT47Il19 \ No newline at end of file diff --git a/game-masterchiefcollection/types.ts b/game-masterchiefcollection/types.ts index d9b4228..40a9319 100644 --- a/game-masterchiefcollection/types.ts +++ b/game-masterchiefcollection/types.ts @@ -7,8 +7,8 @@ export interface IHaloGame { interface IModIdentifier { ModGuid: string; - HostedModIds: { - SteamWorkshopId: number; + HostedModIds?: { + SteamWorkshopId?: number; }; } @@ -19,33 +19,33 @@ interface IVersion { } interface ITitleDescription { - Neutral: string; + Neutral?: string; } interface IModContents { - HasBackgroundVideos: boolean; - HasNameplates: boolean; + HasBackgroundVideos?: boolean; + HasNameplates?: boolean; } interface IGameModContents { - HasSharedFiles: boolean; - HasCampaign: boolean; - HasSpartanOps: boolean; - MultiplayerMaps: string[]; - FirefightMaps: string[]; + HasSharedFiles?: boolean; + HasCampaign?: boolean; + HasSpartanOps?: boolean; + MultiplayerMaps?: string[]; + FirefightMaps?: string[]; } export interface IModConfig { - ModIdentifier: IModIdentifier; - ModVersion: IVersion; - MinAppVersion: IVersion; - MaxAppVersion: IVersion; + ModIdentifier?: IModIdentifier; + ModVersion?: IVersion; + MinAppVersion?: IVersion; + MaxAppVersion?: IVersion; Engine: string; - Title: ITitleDescription; - Description: ITitleDescription; - InheritSharedFiles: string; - ModContents: IModContents; - GameModContents: IGameModContents; + Title?: ITitleDescription; + Description?: ITitleDescription; + InheritSharedFiles?: string; + ModContents?: IModContents; + GameModContents?: IGameModContents; } export type LauncherConfig = Promise<{launcher: string; addInfo?: any; }>; \ No newline at end of file diff --git a/game-masterchiefcollection/util.js b/game-masterchiefcollection/util.js index 174d6e7..5b16d4c 100644 --- a/game-masterchiefcollection/util.js +++ b/game-masterchiefcollection/util.js @@ -57,4 +57,4 @@ function applyToManifest(api, apply) { }); } exports.applyToManifest = applyToManifest; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDJDQUFrRDtBQUVsRCxxQ0FBdUU7QUFHdkUsU0FBZ0IsaUJBQWlCLENBQUMsS0FBZTtJQUcvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxtQkFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxLQUFLLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBaEJELDhDQWdCQztBQUlELFNBQXNCLGVBQWUsQ0FBQyxHQUF3QixFQUFFLEtBQWM7O1FBQzVFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJO1lBQ0YsWUFBWSxHQUFHLE1BQU0sZUFBRSxDQUFDLGFBQWEsQ0FBQywrQkFBc0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3JGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQyxHQUFHLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTzthQUNSO1NBQ0Y7UUFDRCxNQUFNLFdBQVcsR0FBRyxzQkFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBSSxLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsRUFBRTtZQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFDRCxNQUFNLGVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLCtCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGVBQUUsQ0FBQyxjQUFjLENBQUMsK0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0NBQUE7QUFwQkQsMENBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgc2VsZWN0b3JzIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBHQU1FX0lELCBIQUxPX0dBTUVTLCBNT0RfTUFOSUZFU1RfRklMRV9QQVRIIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBJSGFsb0dhbWUgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUhhbG9HYW1lcyhmaWxlczogc3RyaW5nW10pOiBJSGFsb0dhbWVbXSB7XHJcbiAgLy8gRnVuY3Rpb24gYWltcyB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgaGFsbyBnYW1lIGVudHJ5IHVzaW5nIHRoZVxyXG4gIC8vICBtb2QgZmlsZXMuXHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBwYXRoLmV4dG5hbWUoZmlsZSkgIT09ICcnKTtcclxuICByZXR1cm4gT2JqZWN0LmtleXMoSEFMT19HQU1FUykucmVkdWNlKChhY2N1bSwga2V5KSA9PiB7XHJcbiAgICBjb25zdCBlbnRyeSA9IEhBTE9fR0FNRVNba2V5XTtcclxuICAgIGZpbHRlcmVkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZWxlbWVudC5zcGxpdChwYXRoLnNlcCk7XHJcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcyhlbnRyeS5tb2RzUGF0aCkpIHtcclxuICAgICAgICBhY2N1bS5wdXNoKGVudHJ5KTtcclxuICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhY2N1bTtcclxuICB9LCBbXSk7XHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5VG9NYW5pZmVzdChhcGk6IHR5cGVzLklFeHRlbnNpb25BcGksIGFwcGx5OiBib29sZWFuKSB7XHJcbiAgbGV0IG1hbmlmZXN0RGF0YSA9ICcnO1xyXG4gIHRyeSB7XHJcbiAgICBtYW5pZmVzdERhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZUFzeW5jKE1PRF9NQU5JRkVTVF9GSUxFX1BBVEgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGlmICghWydFTk9FTlQnXS5pbmNsdWRlcyhlcnIuY29kZSkpIHtcclxuICAgICAgYXBpLnNob3dFcnJvck5vdGlmaWNhdGlvbignRmFpbGVkIHRvIHJlYWQgbW9kIG1hbmlmZXN0IGZpbGUnLCBlcnIsIHsgYWxsb3dSZXBvcnQ6IGVyci5jb2RlICE9PSAnRVBFUk0nIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IHN0YWdpbmdQYXRoID0gc2VsZWN0b3JzLmluc3RhbGxQYXRoRm9yR2FtZShhcGkuZ2V0U3RhdGUoKSwgR0FNRV9JRCk7XHJcbiAgY29uc3QgbGluZXMgPSBtYW5pZmVzdERhdGEuc3BsaXQoJ1xcclxcbicpO1xyXG4gIGNvbnN0IGhhc1N0YWdpbmdGb2xkZXJFbnRyeSA9IGxpbmVzLnNvbWUobGluZSA9PiBsaW5lLmluY2x1ZGVzKHN0YWdpbmdQYXRoKSk7XHJcbiAgaWYgKGFwcGx5ICYmICFoYXNTdGFnaW5nRm9sZGVyRW50cnkpIHtcclxuICAgIGxpbmVzLnB1c2goc3RhZ2luZ1BhdGgpO1xyXG4gIH0gZWxzZSBpZiAoIWFwcGx5ICYmIGhhc1N0YWdpbmdGb2xkZXJFbnRyeSkge1xyXG4gICAgbGluZXMuc3BsaWNlKGxpbmVzLmluZGV4T2Yoc3RhZ2luZ1BhdGgpLCAxKTtcclxuICB9XHJcbiAgYXdhaXQgZnMuZW5zdXJlRGlyV3JpdGFibGVBc3luYyhwYXRoLmRpcm5hbWUoTU9EX01BTklGRVNUX0ZJTEVfUEFUSCkpO1xyXG4gIGF3YWl0IGZzLndyaXRlRmlsZUFzeW5jKE1PRF9NQU5JRkVTVF9GSUxFX1BBVEgsIGxpbmVzLmZpbHRlcihsaW5lID0+ICEhbGluZSkuam9pbignXFxyXFxuJykpO1xyXG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLDJDQUFrRDtBQUVsRCxxQ0FBdUU7QUFHdkUsU0FBZ0IsaUJBQWlCLENBQUMsS0FBZTtJQUcvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxtQkFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxLQUFLLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBaEJELDhDQWdCQztBQUVELFNBQXNCLGVBQWUsQ0FBQyxHQUF3QixFQUFFLEtBQWM7O1FBQzVFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJO1lBQ0YsWUFBWSxHQUFHLE1BQU0sZUFBRSxDQUFDLGFBQWEsQ0FBQywrQkFBc0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3JGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQyxHQUFHLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTzthQUNSO1NBQ0Y7UUFDRCxNQUFNLFdBQVcsR0FBRyxzQkFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBSSxLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsRUFBRTtZQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFDRCxNQUFNLGVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLCtCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGVBQUUsQ0FBQyxjQUFjLENBQUMsK0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0NBQUE7QUFwQkQsMENBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgc2VsZWN0b3JzIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBHQU1FX0lELCBIQUxPX0dBTUVTLCBNT0RfTUFOSUZFU1RfRklMRV9QQVRIIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBJSGFsb0dhbWUgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUhhbG9HYW1lcyhmaWxlczogc3RyaW5nW10pOiBJSGFsb0dhbWVbXSB7XHJcbiAgLy8gRnVuY3Rpb24gYWltcyB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgaGFsbyBnYW1lIGVudHJ5IHVzaW5nIHRoZVxyXG4gIC8vICBtb2QgZmlsZXMuXHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBwYXRoLmV4dG5hbWUoZmlsZSkgIT09ICcnKTtcclxuICByZXR1cm4gT2JqZWN0LmtleXMoSEFMT19HQU1FUykucmVkdWNlKChhY2N1bSwga2V5KSA9PiB7XHJcbiAgICBjb25zdCBlbnRyeSA9IEhBTE9fR0FNRVNba2V5XTtcclxuICAgIGZpbHRlcmVkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZWxlbWVudC5zcGxpdChwYXRoLnNlcCk7XHJcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcyhlbnRyeS5tb2RzUGF0aCkpIHtcclxuICAgICAgICBhY2N1bS5wdXNoKGVudHJ5KTtcclxuICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhY2N1bTtcclxuICB9LCBbXSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVRvTWFuaWZlc3QoYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpLCBhcHBseTogYm9vbGVhbikge1xyXG4gIGxldCBtYW5pZmVzdERhdGEgPSAnJztcclxuICB0cnkge1xyXG4gICAgbWFuaWZlc3REYXRhID0gYXdhaXQgZnMucmVhZEZpbGVBc3luYyhNT0RfTUFOSUZFU1RfRklMRV9QQVRILCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBpZiAoIVsnRU5PRU5UJ10uaW5jbHVkZXMoZXJyLmNvZGUpKSB7XHJcbiAgICAgIGFwaS5zaG93RXJyb3JOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byByZWFkIG1vZCBtYW5pZmVzdCBmaWxlJywgZXJyLCB7IGFsbG93UmVwb3J0OiBlcnIuY29kZSAhPT0gJ0VQRVJNJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBzdGFnaW5nUGF0aCA9IHNlbGVjdG9ycy5pbnN0YWxsUGF0aEZvckdhbWUoYXBpLmdldFN0YXRlKCksIEdBTUVfSUQpO1xyXG4gIGNvbnN0IGxpbmVzID0gbWFuaWZlc3REYXRhLnNwbGl0KCdcXHJcXG4nKTtcclxuICBjb25zdCBoYXNTdGFnaW5nRm9sZGVyRW50cnkgPSBsaW5lcy5zb21lKGxpbmUgPT4gbGluZS5pbmNsdWRlcyhzdGFnaW5nUGF0aCkpO1xyXG4gIGlmIChhcHBseSAmJiAhaGFzU3RhZ2luZ0ZvbGRlckVudHJ5KSB7XHJcbiAgICBsaW5lcy5wdXNoKHN0YWdpbmdQYXRoKTtcclxuICB9IGVsc2UgaWYgKCFhcHBseSAmJiBoYXNTdGFnaW5nRm9sZGVyRW50cnkpIHtcclxuICAgIGxpbmVzLnNwbGljZShsaW5lcy5pbmRleE9mKHN0YWdpbmdQYXRoKSwgMSk7XHJcbiAgfVxyXG4gIGF3YWl0IGZzLmVuc3VyZURpcldyaXRhYmxlQXN5bmMocGF0aC5kaXJuYW1lKE1PRF9NQU5JRkVTVF9GSUxFX1BBVEgpKTtcclxuICBhd2FpdCBmcy53cml0ZUZpbGVBc3luYyhNT0RfTUFOSUZFU1RfRklMRV9QQVRILCBsaW5lcy5maWx0ZXIobGluZSA9PiAhIWxpbmUpLmpvaW4oJ1xcclxcbicpKTtcclxufSJdfQ== \ No newline at end of file diff --git a/game-masterchiefcollection/util.ts b/game-masterchiefcollection/util.ts index 544d61e..045038d 100644 --- a/game-masterchiefcollection/util.ts +++ b/game-masterchiefcollection/util.ts @@ -22,8 +22,6 @@ export function identifyHaloGames(files: string[]): IHaloGame[] { }, []); } - - export async function applyToManifest(api: types.IExtensionApi, apply: boolean) { let manifestData = ''; try { From 15152a108db6c90e59a892aeabc424e8e64e327d Mon Sep 17 00:00:00 2001 From: IDCs Date: Wed, 14 Aug 2024 05:57:30 +0100 Subject: [PATCH 4/5] MCC: improved PnP installer to extract metadata + added test - PnP installer will now extract the mod's version and name from the modinfo.json file. - Added a test to ensure that Halo: CE MP maps are installed in the user's game folder (apparently some mods won't run without them) --- game-masterchiefcollection/common.js | 5 +- game-masterchiefcollection/common.ts | 2 + .../game-masterchiefcollection.7z | Bin 94680 -> 0 bytes game-masterchiefcollection/index.js | 4 +- game-masterchiefcollection/index.ts | 3 + game-masterchiefcollection/installers.js | 24 ++++++-- game-masterchiefcollection/installers.ts | 22 +++++++- game-masterchiefcollection/tests.js | 53 ++++++++++++++++++ game-masterchiefcollection/tests.ts | 37 ++++++++++++ game-masterchiefcollection/types.js | 2 +- game-masterchiefcollection/types.ts | 2 +- 11 files changed, 143 insertions(+), 11 deletions(-) delete mode 100644 game-masterchiefcollection/game-masterchiefcollection.7z create mode 100644 game-masterchiefcollection/tests.js create mode 100644 game-masterchiefcollection/tests.ts diff --git a/game-masterchiefcollection/common.js b/game-masterchiefcollection/common.js index 449ae7e..ed2d75d 100644 --- a/game-masterchiefcollection/common.js +++ b/game-masterchiefcollection/common.js @@ -3,13 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.HALO_GAMES = exports.MODTYPE_PLUG_AND_PLAY = exports.MAP_EXT = exports.ASSEMBLY_EXT = exports.MOD_CONFIG_DEST_ELEMENT = exports.MOD_CONFIG_FILE = exports.GAME_ID = exports.STEAM_ID = exports.MS_APPID = exports.MOD_INFO_JSON_FILE = exports.MOD_MANIFEST_FILE_PATH = exports.MOD_MANIFEST_FILE = exports.MCC_LOCAL_LOW = void 0; +exports.HALO_GAMES = exports.MODTYPE_PLUG_AND_PLAY = exports.MAP_EXT = exports.ASSEMBLY_EXT = exports.MOD_CONFIG_DEST_ELEMENT = exports.MOD_CONFIG_FILE = exports.GAME_ID = exports.STEAM_ID = exports.MS_APPID = exports.HALO1_MAPS_RELPATH = exports.MOD_INFO_JSON_FILE = exports.MOD_MANIFEST_FILE_PATH = exports.MOD_MANIFEST_FILE = exports.MCC_LOCAL_LOW = void 0; const path_1 = __importDefault(require("path")); const vortex_api_1 = require("vortex-api"); exports.MCC_LOCAL_LOW = path_1.default.resolve(vortex_api_1.util.getVortexPath('appData'), '..', 'LocalLow', 'MCC'); exports.MOD_MANIFEST_FILE = 'ModManifest.txt'; exports.MOD_MANIFEST_FILE_PATH = path_1.default.join(exports.MCC_LOCAL_LOW, 'Config', exports.MOD_MANIFEST_FILE); exports.MOD_INFO_JSON_FILE = 'modinfo.json'; +exports.HALO1_MAPS_RELPATH = path_1.default.join('halo1', 'maps'); exports.MS_APPID = 'Microsoft.Chelan'; exports.STEAM_ID = '976730'; exports.GAME_ID = 'halothemasterchiefcollection'; @@ -26,4 +27,4 @@ exports.HALO_GAMES = { halo4: { internalId: '5', name: 'Halo 4', modsPath: 'halo4', img: path_1.default.join(__dirname, 'halo4.png') }, haloreach: { internalId: '6', name: 'Reach', modsPath: 'haloreach', img: path_1.default.join(__dirname, 'haloreach.png') }, }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGdEQUF3QjtBQUN4QiwyQ0FBa0M7QUFJckIsUUFBQSxhQUFhLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLFFBQUEsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFDdEMsUUFBQSxzQkFBc0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFhLEVBQUUsUUFBUSxFQUFFLHlCQUFpQixDQUFDLENBQUM7QUFDL0UsUUFBQSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUFFcEMsUUFBQSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7QUFDOUIsUUFBQSxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3BCLFFBQUEsT0FBTyxHQUFHLDhCQUE4QixDQUFDO0FBRXpDLFFBQUEsZUFBZSxHQUFHLG9CQUFvQixDQUFDO0FBQ3ZDLFFBQUEsdUJBQXVCLEdBQUcsYUFBYSxDQUFDO0FBQ3hDLFFBQUEsWUFBWSxHQUFHLE9BQU8sQ0FBQztBQUN2QixRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFFakIsUUFBQSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUl6RCxRQUFBLFVBQVUsR0FBaUM7SUFDdEQsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFO0lBQ3ZHLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRTtJQUNyRyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUU7SUFFckcsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ3JHLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRTtJQUNyRyxTQUFTLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEVBQUU7Q0FDakgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBJSGFsb0dhbWUgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmV4cG9ydCBjb25zdCBNQ0NfTE9DQUxfTE9XID0gcGF0aC5yZXNvbHZlKHV0aWwuZ2V0Vm9ydGV4UGF0aCgnYXBwRGF0YScpLCAnLi4nLCAnTG9jYWxMb3cnLCAnTUNDJyk7XHJcbmV4cG9ydCBjb25zdCBNT0RfTUFOSUZFU1RfRklMRSA9ICdNb2RNYW5pZmVzdC50eHQnO1xyXG5leHBvcnQgY29uc3QgTU9EX01BTklGRVNUX0ZJTEVfUEFUSCA9IHBhdGguam9pbihNQ0NfTE9DQUxfTE9XLCAnQ29uZmlnJywgTU9EX01BTklGRVNUX0ZJTEUpO1xyXG5leHBvcnQgY29uc3QgTU9EX0lORk9fSlNPTl9GSUxFID0gJ21vZGluZm8uanNvbic7XHJcblxyXG5leHBvcnQgY29uc3QgTVNfQVBQSUQgPSAnTWljcm9zb2Z0LkNoZWxhbic7XHJcbmV4cG9ydCBjb25zdCBTVEVBTV9JRCA9ICc5NzY3MzAnO1xyXG5leHBvcnQgY29uc3QgR0FNRV9JRCA9ICdoYWxvdGhlbWFzdGVyY2hpZWZjb2xsZWN0aW9uJztcclxuXHJcbmV4cG9ydCBjb25zdCBNT0RfQ09ORklHX0ZJTEUgPSAnbW9kcGFja19jb25maWcuY2ZnJztcclxuZXhwb3J0IGNvbnN0IE1PRF9DT05GSUdfREVTVF9FTEVNRU5UID0gJyRNQ0NfaG9tZVxcXFwnO1xyXG5leHBvcnQgY29uc3QgQVNTRU1CTFlfRVhUID0gJy5hc21wJztcclxuZXhwb3J0IGNvbnN0IE1BUF9FWFQgPSAnLm1hcCc7XHJcblxyXG5leHBvcnQgY29uc3QgTU9EVFlQRV9QTFVHX0FORF9QTEFZID0gJ2hhbG8tbWNjLXBsdWctYW5kLXBsYXktbW9kdHlwZSc7XHJcblxyXG4vLyBBdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgZXh0ZW5zaW9uLCBvbmx5IEhhbG86IENvbWJhdCBFdm9sdmVkIGFuZCBIYWxvIFJlYWNoIHdlcmUgYXZhaWxhYmxlLlxyXG4vLyAgV2UgbWF5IGhhdmUgdG8gY29tZSBiYWNrIHRvIHRoaXMgb2JqZWN0IGFzIG1vcmUgb2YgdGhlIGdhbWVzIGdldCByZWxlYXNlZC5cclxuZXhwb3J0IGNvbnN0IEhBTE9fR0FNRVM6IHsgW2tleTogc3RyaW5nXTogSUhhbG9HYW1lIH0gPSB7XHJcbiAgaGFsbzE6IHsgaW50ZXJuYWxJZDogJzEnLCBuYW1lOiAnSGFsbzogQ0UnLCBtb2RzUGF0aDogJ2hhbG8xJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzEucG5nJykgfSxcclxuICBoYWxvMjogeyBpbnRlcm5hbElkOiAnMicsIG5hbWU6ICdIYWxvIDInLCBtb2RzUGF0aDogJ2hhbG8yJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzIucG5nJykgfSxcclxuICBoYWxvMzogeyBpbnRlcm5hbElkOiAnMycsIG5hbWU6ICdIYWxvIDMnLCBtb2RzUGF0aDogJ2hhbG8zJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsbzMucG5nJykgfSxcclxuICAvLyBTb21lb25lIHNob3VsZCBnZXQgTWlrZSBhIGNvb2tpZSBmb3IgaGlzIHByZW1vbml0aW9uIHNraWxsc1xyXG4gIG9kc3Q6IHsgaW50ZXJuYWxJZDogJzQnLCBuYW1lOiAnT0RTVCcsIG1vZHNQYXRoOiAnaGFsbzNvZHN0JywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnb2RzdC5wbmcnKSB9LFxyXG4gIGhhbG80OiB7IGludGVybmFsSWQ6ICc1JywgbmFtZTogJ0hhbG8gNCcsIG1vZHNQYXRoOiAnaGFsbzQnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvNC5wbmcnKSB9LFxyXG4gIGhhbG9yZWFjaDogeyBpbnRlcm5hbElkOiAnNicsIG5hbWU6ICdSZWFjaCcsIG1vZHNQYXRoOiAnaGFsb3JlYWNoJywgaW1nOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFsb3JlYWNoLnBuZycpIH0sXHJcbn07Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLGdEQUF3QjtBQUN4QiwyQ0FBa0M7QUFJckIsUUFBQSxhQUFhLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLFFBQUEsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFDdEMsUUFBQSxzQkFBc0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFhLEVBQUUsUUFBUSxFQUFFLHlCQUFpQixDQUFDLENBQUM7QUFDL0UsUUFBQSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUFFcEMsUUFBQSxrQkFBa0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVoRCxRQUFBLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQztBQUM5QixRQUFBLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDcEIsUUFBQSxPQUFPLEdBQUcsOEJBQThCLENBQUM7QUFFekMsUUFBQSxlQUFlLEdBQUcsb0JBQW9CLENBQUM7QUFDdkMsUUFBQSx1QkFBdUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsUUFBQSxZQUFZLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUVqQixRQUFBLHFCQUFxQixHQUFHLGdDQUFnQyxDQUFDO0FBSXpELFFBQUEsVUFBVSxHQUFpQztJQUN0RCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUU7SUFDdkcsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFO0lBQ3JHLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRTtJQUVyRyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUU7SUFDckcsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFO0lBQ3JHLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsRUFBRTtDQUNqSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCB7IElIYWxvR2FtZSB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1DQ19MT0NBTF9MT1cgPSBwYXRoLnJlc29sdmUodXRpbC5nZXRWb3J0ZXhQYXRoKCdhcHBEYXRhJyksICcuLicsICdMb2NhbExvdycsICdNQ0MnKTtcclxuZXhwb3J0IGNvbnN0IE1PRF9NQU5JRkVTVF9GSUxFID0gJ01vZE1hbmlmZXN0LnR4dCc7XHJcbmV4cG9ydCBjb25zdCBNT0RfTUFOSUZFU1RfRklMRV9QQVRIID0gcGF0aC5qb2luKE1DQ19MT0NBTF9MT1csICdDb25maWcnLCBNT0RfTUFOSUZFU1RfRklMRSk7XHJcbmV4cG9ydCBjb25zdCBNT0RfSU5GT19KU09OX0ZJTEUgPSAnbW9kaW5mby5qc29uJztcclxuXHJcbmV4cG9ydCBjb25zdCBIQUxPMV9NQVBTX1JFTFBBVEggPSBwYXRoLmpvaW4oJ2hhbG8xJywgJ21hcHMnKTtcclxuXHJcbmV4cG9ydCBjb25zdCBNU19BUFBJRCA9ICdNaWNyb3NvZnQuQ2hlbGFuJztcclxuZXhwb3J0IGNvbnN0IFNURUFNX0lEID0gJzk3NjczMCc7XHJcbmV4cG9ydCBjb25zdCBHQU1FX0lEID0gJ2hhbG90aGVtYXN0ZXJjaGllZmNvbGxlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1PRF9DT05GSUdfRklMRSA9ICdtb2RwYWNrX2NvbmZpZy5jZmcnO1xyXG5leHBvcnQgY29uc3QgTU9EX0NPTkZJR19ERVNUX0VMRU1FTlQgPSAnJE1DQ19ob21lXFxcXCc7XHJcbmV4cG9ydCBjb25zdCBBU1NFTUJMWV9FWFQgPSAnLmFzbXAnO1xyXG5leHBvcnQgY29uc3QgTUFQX0VYVCA9ICcubWFwJztcclxuXHJcbmV4cG9ydCBjb25zdCBNT0RUWVBFX1BMVUdfQU5EX1BMQVkgPSAnaGFsby1tY2MtcGx1Zy1hbmQtcGxheS1tb2R0eXBlJztcclxuXHJcbi8vIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgdGhpcyBleHRlbnNpb24sIG9ubHkgSGFsbzogQ29tYmF0IEV2b2x2ZWQgYW5kIEhhbG8gUmVhY2ggd2VyZSBhdmFpbGFibGUuXHJcbi8vICBXZSBtYXkgaGF2ZSB0byBjb21lIGJhY2sgdG8gdGhpcyBvYmplY3QgYXMgbW9yZSBvZiB0aGUgZ2FtZXMgZ2V0IHJlbGVhc2VkLlxyXG5leHBvcnQgY29uc3QgSEFMT19HQU1FUzogeyBba2V5OiBzdHJpbmddOiBJSGFsb0dhbWUgfSA9IHtcclxuICBoYWxvMTogeyBpbnRlcm5hbElkOiAnMScsIG5hbWU6ICdIYWxvOiBDRScsIG1vZHNQYXRoOiAnaGFsbzEnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvMS5wbmcnKSB9LFxyXG4gIGhhbG8yOiB7IGludGVybmFsSWQ6ICcyJywgbmFtZTogJ0hhbG8gMicsIG1vZHNQYXRoOiAnaGFsbzInLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvMi5wbmcnKSB9LFxyXG4gIGhhbG8zOiB7IGludGVybmFsSWQ6ICczJywgbmFtZTogJ0hhbG8gMycsIG1vZHNQYXRoOiAnaGFsbzMnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvMy5wbmcnKSB9LFxyXG4gIC8vIFNvbWVvbmUgc2hvdWxkIGdldCBNaWtlIGEgY29va2llIGZvciBoaXMgcHJlbW9uaXRpb24gc2tpbGxzXHJcbiAgb2RzdDogeyBpbnRlcm5hbElkOiAnNCcsIG5hbWU6ICdPRFNUJywgbW9kc1BhdGg6ICdoYWxvM29kc3QnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdvZHN0LnBuZycpIH0sXHJcbiAgaGFsbzQ6IHsgaW50ZXJuYWxJZDogJzUnLCBuYW1lOiAnSGFsbyA0JywgbW9kc1BhdGg6ICdoYWxvNCcsIGltZzogcGF0aC5qb2luKF9fZGlybmFtZSwgJ2hhbG80LnBuZycpIH0sXHJcbiAgaGFsb3JlYWNoOiB7IGludGVybmFsSWQ6ICc2JywgbmFtZTogJ1JlYWNoJywgbW9kc1BhdGg6ICdoYWxvcmVhY2gnLCBpbWc6IHBhdGguam9pbihfX2Rpcm5hbWUsICdoYWxvcmVhY2gucG5nJykgfSxcclxufTsiXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/common.ts b/game-masterchiefcollection/common.ts index d28fb11..3044c09 100644 --- a/game-masterchiefcollection/common.ts +++ b/game-masterchiefcollection/common.ts @@ -9,6 +9,8 @@ export const MOD_MANIFEST_FILE = 'ModManifest.txt'; export const MOD_MANIFEST_FILE_PATH = path.join(MCC_LOCAL_LOW, 'Config', MOD_MANIFEST_FILE); export const MOD_INFO_JSON_FILE = 'modinfo.json'; +export const HALO1_MAPS_RELPATH = path.join('halo1', 'maps'); + export const MS_APPID = 'Microsoft.Chelan'; export const STEAM_ID = '976730'; export const GAME_ID = 'halothemasterchiefcollection'; diff --git a/game-masterchiefcollection/game-masterchiefcollection.7z b/game-masterchiefcollection/game-masterchiefcollection.7z deleted file mode 100644 index bfc45427f6d87e4885368200d4f89c5c045b581a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94680 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

5l734!%uP^+u?C4eVqql?LBY1vck2*R&T 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 X0|5aAT>uaO01Sh!3IT?BLKXl3K#oVu diff --git a/game-masterchiefcollection/index.js b/game-masterchiefcollection/index.js index 61e4e93..d0c5bbc 100644 --- a/game-masterchiefcollection/index.js +++ b/game-masterchiefcollection/index.js @@ -41,6 +41,7 @@ const React = __importStar(require("react")); const common_1 = require("./common"); const modTypes_1 = require("./modTypes"); const installers_1 = require("./installers"); +const tests_1 = require("./tests"); const util_1 = require("./util"); class MasterChiefCollectionGame { constructor(context) { @@ -134,6 +135,7 @@ module.exports = { context.registerInstaller('mcc-plug-and-play-installer', 15, installers_1.testPlugAndPlayInstaller, installers_1.installPlugAndPlay); context.registerInstaller('masterchiefmodconfiginstaller', 20, installers_1.testModConfigInstaller, installers_1.installModConfig); context.registerInstaller('masterchiefinstaller', 25, installers_1.testInstaller, installers_1.install); + context.registerTest('mcc-ce-mp-test', 'gamemode-activated', vortex_api_1.util.toBlue(() => (0, tests_1.testCEMP)(context.api))); context.registerTableAttribute('mods', { id: 'gameType', name: 'Game(s)', @@ -185,4 +187,4 @@ module.exports = { }); } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDJDQUFtRjtBQUVuRiw2Q0FBK0I7QUFFL0IscUNBQTBGO0FBRTFGLHlDQUFvRDtBQUNwRCw2Q0FBOEk7QUFDOUksaUNBQXlDO0FBR3pDLE1BQU0seUJBQXlCO0lBYzdCLFlBQVksT0FBTztRQWlEWixxQkFBZ0IsR0FBRyxpQkFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBaEQ5RyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxtQ0FBbUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0I7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQjtnQkFDRSxFQUFFLEVBQUUsa0JBQWtCO2dCQUN0QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWM7Z0JBQ2hDLGFBQWEsRUFBRTtvQkFDYixjQUFjO2lCQUNmO2dCQUNELFFBQVEsRUFBRSxJQUFJO2FB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QUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1lBQ25HLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1FBQ3JHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgZnMsIHR5cGVzLCBGbGV4TGF5b3V0LCBPcHRpb25zRmlsdGVyLCBzZWxlY3RvcnMsIHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEdBTUVfSUQsIEhBTE9fR0FNRVMsIE1TX0FQUElELCBTVEVBTV9JRCwgTU9EVFlQRV9QTFVHX0FORF9QTEFZIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYXVuY2hlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIH0gZnJvbSAnLi9tb2RUeXBlcyc7XHJcbmltcG9ydCB7IGluc3RhbGxQbHVnQW5kUGxheSwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyLCBpbnN0YWxsTW9kQ29uZmlnLCBpbnN0YWxsLCB0ZXN0SW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXJzJztcclxuaW1wb3J0IHsgYXBwbHlUb01hbmlmZXN0IH0gZnJvbSAnLi91dGlsJztcclxuXHJcbi8vIE1hc3RlciBjaGVmIGNvbGxlY3Rpb25cclxuY2xhc3MgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZSBpbXBsZW1lbnRzIHR5cGVzLklHYW1lIHtcclxuICBwdWJsaWMgY29udGV4dDogdHlwZXMuSUV4dGVuc2lvbkNvbnRleHQ7XHJcbiAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgc2hvcnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxvZ286IHN0cmluZztcclxuICBwdWJsaWMgYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpO1xyXG4gIHB1YmxpYyBnZXRHYW1lVmVyc2lvbjogKGRpc2NvdmVyeVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZXF1aXJlZEZpbGVzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgc3VwcG9ydGVkVG9vbHM6IGFueVtdO1xyXG4gIHB1YmxpYyBlbnZpcm9ubWVudDogYW55O1xyXG4gIHB1YmxpYyBkZXRhaWxzOiBhbnk7XHJcbiAgcHVibGljIG1lcmdlTW9kczogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuaWQgPSBHQU1FX0lEO1xyXG4gICAgdGhpcy5uYW1lID0gJ0hhbG86IFRoZSBNYXN0ZXIgQ2hpZWYgQ29sbGVjdGlvbic7XHJcbiAgICB0aGlzLnNob3J0TmFtZSA9ICdIYWxvOiBNQ0MnO1xyXG4gICAgdGhpcy5sb2dvID0gJ2dhbWVhcnQuanBnJztcclxuICAgIHRoaXMuYXBpID0gY29udGV4dC5hcGk7XHJcbiAgICB0aGlzLmdldEdhbWVWZXJzaW9uID0gcmVzb2x2ZUdhbWVWZXJzaW9uLFxyXG4gICAgdGhpcy5yZXF1aXJlZEZpbGVzID0gW1xyXG4gICAgICB0aGlzLmV4ZWN1dGFibGUoKSxcclxuICAgIF07XHJcbiAgICB0aGlzLnN1cHBvcnRlZFRvb2xzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdoYWxvYXNzZW1ibHl0b29sJyxcclxuICAgICAgICBuYW1lOiAnQXNzZW1ibHknLFxyXG4gICAgICAgIGxvZ286ICdhc3NlbWJseXRvb2wucG5nJyxcclxuICAgICAgICBleGVjdXRhYmxlOiAoKSA9PiAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICByZXF1aXJlZEZpbGVzOiBbXHJcbiAgICAgICAgICAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlbGF0aXZlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7XHJcbiAgICAgIFN0ZWFtQVBQSWQ6IFNURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGV0YWlscyA9IHtcclxuICAgICAgc3RlYW1BcHBJZDogK1NURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMubWVyZ2VNb2RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHF1ZXJ5TW9kUGF0aChnYW1lUGF0aCkge1xyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGV4ZWN1dGFibGUoKSB7XHJcbiAgICByZXR1cm4gJ21jY2xhdW5jaGVyLmV4ZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZShkaXNjb3Zlcnk6IHR5cGVzLklEaXNjb3ZlcnlSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBxdWVyeVBhdGgoKSB7XHJcbiAgICByZXR1cm4gdXRpbC5HYW1lU3RvcmVIZWxwZXIuZmluZEJ5QXBwSWQoW1NURUFNX0lELCBNU19BUFBJRF0pXHJcbiAgICAgIC50aGVuKGdhbWUgPT4gZ2FtZS5nYW1lUGF0aCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWlyZXNMYXVuY2hlciA9IHV0aWwudG9CbHVlKChnYW1lUGF0aDogc3RyaW5nLCBzdG9yZTogc3RyaW5nKSA9PiB0aGlzLmNoZWNrTGF1bmNoZXIoZ2FtZVBhdGgsIHN0b3JlKSk7XHJcbiAgcHVibGljIGFzeW5jIGNoZWNrTGF1bmNoZXIoZ2FtZVBhdGg6IHN0cmluZywgc3RvcmU6IHN0cmluZyk6IExhdW5jaGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChzdG9yZSA9PT0gJ3hib3gnKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAneGJveCcsXHJcbiAgICAgICAgYWRkSW5mbzoge1xyXG4gICAgICAgICAgYXBwSWQ6IE1TX0FQUElELFxyXG4gICAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IGFwcEV4ZWNOYW1lOiAnSGFsb01DQ1NoaXBwaW5nTm9FQUMnIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHN0b3JlID09PSAnc3RlYW0nKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAnc3RlYW0nLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIGFwcElkOiBTVEVBTV9JRCxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IFsnb3B0aW9uMiddLFxyXG4gICAgICAgICAgbGF1bmNoVHlwZTogJ2dhbWVzdG9yZScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBnZXRYYm94SWQoaW50ZXJuYWxJZCwgZmlsZVBhdGgsIGVuY29kaW5nKSB7XHJcbi8vICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgeGJveCBpZCBvZiB0aGUgbGFzdCBwbGF5ZXJcclxuLy8gICAvLyAgd2hvIHJhbiB0aGUgZ2FtZS4gVGhpcyBjYW4gcG90ZW50aWFsbHkgYmUgdXNlZCB0byBtb2QgdGhlIGdhbWVcclxuLy8gICAvLyAgb25seSBmb3Igc3BlY2lmaWMgeGJveCBpZHMgd2hpbGUgbGVhdmluZyBvdGhlcnMgaW4gYW4gdW50YW1wZXJlZCBzdGF0ZS4gKFdJUClcclxuLy8gICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZyB9KVxyXG4vLyAgICAgLnRoZW4oZmlsZURhdGEgPT4ge1xyXG4vLyAgICAgICBsZXQgeG1sRG9jO1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHhtbERvYyA9IHBhcnNlWG1sU3RyaW5nKGZpbGVEYXRhKTtcclxuLy8gICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbi8vICAgICAgIH1cclxuXHJcbi8vICAgICAgIGNvbnN0IGdlbmVyYWxEYXRhID0geG1sRG9jLmZpbmQoJy8vQ2FtcGFpZ25DYXJuYWdlUmVwb3J0L0dlbmVyYWxEYXRhJyk7XHJcbi8vICAgICAgIGlmIChnZW5lcmFsRGF0YVswXS5hdHRyKCdHYW1lSWQnKS52YWx1ZSgpID09PSBpbnRlcm5hbElkKSB7XHJcbi8vICAgICAgICAgY29uc3QgcGxheWVycyA9IHhtbERvYy5maW5kKCcvL0NhbXBhaWduQ2FybmFnZVJlcG9ydC9QbGF5ZXJzL1BsYXllckluZm8nKTtcclxuLy8gICAgICAgICBjb25zdCBtYWluUGxheWVyID0gcGxheWVycy5maW5kKHBsYXllciA9PiBwbGF5ZXIuYXR0cignaXNHdWVzdCcpLnZhbHVlKCkgPT09ICdmYWxzZScpO1xyXG4vLyAgICAgICAgIGNvbnN0IHhib3hJZCA9IG1haW5QbGF5ZXIuYXR0cignbVhib3hVc2VySWQnKS52YWx1ZSgpO1xyXG4vLyAgICAgICAgIC8vIFRoZSB1c2VySWQgaXMgcHJlZml4ZWQgd2l0aCBcIjB4XCIgd2hpY2ggaXMgbm90IG5lZWRlZC5cclxuLy8gICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHhib3hJZC5zdWJzdHJpbmcoMikpO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5EYXRhSW52YWxpZCgnV3JvbmcgaW50ZXJuYWwgZ2FtZUlkJykpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfVxyXG5cclxuY29uc3QgcmVzb2x2ZUdhbWVWZXJzaW9uID0gYXN5bmMgKGRpc2NvdmVyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLmpvaW4oZGlzY292ZXJ5UGF0aCwgJ2J1aWxkX3RhZy50eHQnKTtcclxuICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyh2ZXJzaW9uUGF0aCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pXHJcbiAgICAudGhlbigocmVzKSA9PiBQcm9taXNlLnJlc29sdmUocmVzLnNwbGl0KCdcXHJcXG4nKVswXS50cmltKCkpKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgZGVmYXVsdDogKGNvbnRleHQ6IHR5cGVzLklFeHRlbnNpb25Db250ZXh0KSA9PiB7XHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyR2FtZShuZXcgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZShjb250ZXh0KSk7XHJcblxyXG4gICAgLy8gbGV0IGNvbGxhdG9yO1xyXG4gICAgLy8gY29uc3QgZ2V0Q29sbGF0b3IgPSAobG9jYWxlKSA9PiB7XHJcbiAgICAvLyAgIGlmICgoY29sbGF0b3IgPT09IHVuZGVmaW5lZCkgfHwgKGxvY2FsZSAhPT0gbGFuZykpIHtcclxuICAgIC8vICAgICBsYW5nID0gbG9jYWxlO1xyXG4gICAgLy8gICAgIGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IobG9jYWxlLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScgfSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgcmV0dXJuIGNvbGxhdG9yO1xyXG4gICAgLy8gfTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyTW9kVHlwZShNT0RUWVBFX1BMVUdfQU5EX1BMQVksIDE1LFxyXG4gICAgICAoZ2FtZUlkOiBzdHJpbmcpID0+IGdhbWVJZCA9PT0gR0FNRV9JRCwgKCkgPT4gdW5kZWZpbmVkLCB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIGFzIGFueSwge1xyXG4gICAgICBkZXBsb3ltZW50RXNzZW50aWFsOiBmYWxzZSxcclxuICAgICAgbWVyZ2VNb2RzOiB0cnVlLFxyXG4gICAgICBuYW1lOiAnTUNDIFBsdWcgYW5kIFBsYXkgbW9kJyxcclxuICAgICAgbm9Db25mbGljdHM6IHRydWUsXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21jYy1wbHVnLWFuZC1wbGF5LWluc3RhbGxlcicsXHJcbiAgICAgIDE1LCB0ZXN0UGx1Z0FuZFBsYXlJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsUGx1Z0FuZFBsYXkgYXMgYW55KTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtYXN0ZXJjaGllZm1vZGNvbmZpZ2luc3RhbGxlcicsXHJcbiAgICAgIDIwLCB0ZXN0TW9kQ29uZmlnSW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbE1vZENvbmZpZyBhcyBhbnkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21hc3RlcmNoaWVmaW5zdGFsbGVyJyxcclxuICAgICAgMjUsIHRlc3RJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsIGFzIGFueSk7XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3RlclRhYmxlQXR0cmlidXRlKCdtb2RzJywge1xyXG4gICAgICBpZDogJ2dhbWVUeXBlJyxcclxuICAgICAgbmFtZTogJ0dhbWUocyknLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ1RhcmdldCBIYWxvIGdhbWUocykgZm9yIHRoaXMgbW9kJyxcclxuICAgICAgaWNvbjogJ2luc3BlY3QnLFxyXG4gICAgICBwbGFjZW1lbnQ6ICd0YWJsZScsXHJcbiAgICAgIGN1c3RvbVJlbmRlcmVyOiAobW9kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlSW1nRGl2ID0gKGVudHJ5LCBpZHgpID0+IHtcclxuICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ2hhbG8taW1nLWRpdicsIGtleTogYCR7ZW50cnkuaW50ZXJuYWxJZH0tJHtpZHh9YCB9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgnaW1nJywgeyBjbGFzc05hbWU6ICdoYWxvZ2FtZWltZycsIHNyYzogYGZpbGU6Ly8ke2VudHJ5LmltZ31gIH0pLFxyXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KCdzcGFuJywge30sIGVudHJ5Lm5hbWUpKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGludGVybmFsSWRzID0gdXRpbC5nZXRTYWZlKG1vZCwgWydhdHRyaWJ1dGVzJywgJ2hhbG9HYW1lcyddLCBbXSk7XHJcbiAgICAgICAgY29uc3QgaGFsb0VudHJpZXMgPSBPYmplY3Qua2V5cyhIQUxPX0dBTUVTKVxyXG4gICAgICAgICAgLmZpbHRlcihrZXkgPT4gaW50ZXJuYWxJZHMuaW5jbHVkZXMoSEFMT19HQU1FU1trZXldLmludGVybmFsSWQpKVxyXG4gICAgICAgICAgLm1hcChrZXkgPT4gSEFMT19HQU1FU1trZXldKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRmxleExheW91dCwgeyB0eXBlOiAncm93JyB9LCBcclxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRmxleExheW91dC5GbGV4LCB7IGNsYXNzTmFtZTogJ2hhbG9pbWdsYXlvdXQnIH0sIGhhbG9FbnRyaWVzLm1hcCgoZW50cnksIGlkeCkgPT4gY3JlYXRlSW1nRGl2KGVudHJ5LCBpZHgpKSkpO1xyXG4gICAgICB9LFxyXG4gICAgICBjYWxjOiAobW9kKSA9PiB1dGlsLmdldFNhZmUobW9kLCBbJ2F0dHJpYnV0ZXMnLCAnaGFsb0dhbWVzJ10sIHVuZGVmaW5lZCksXHJcbiAgICAgIGZpbHRlcjogbmV3IE9wdGlvbnNGaWx0ZXIoXHJcbiAgICAgICAgW10uY29uY2F0KFt7IHZhbHVlOiBPcHRpb25zRmlsdGVyLkVNUFRZLCBsYWJlbDogJzxOb25lPicgfV0sXHJcbiAgICAgICAgT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkLCBsYWJlbDogSEFMT19HQU1FU1trZXldLm5hbWUgfTtcclxuICAgICAgICAgIH0pKVxyXG4gICAgICAgICwgdHJ1ZSwgZmFsc2UpLFxyXG4gICAgICBpc1RvZ2dsZWFibGU6IHRydWUsXHJcbiAgICAgIGVkaXQ6IHt9LFxyXG4gICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgaXNHcm91cGFibGU6IChtb2QpID0+IHtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbElkcyA9IHV0aWwuZ2V0U2FmZShtb2QsIFsnYXR0cmlidXRlcycsICdoYWxvR2FtZXMnXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IGhhbG9FbnRyaWVzID0gT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGludGVybmFsSWRzLmluY2x1ZGVzKEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkKSlcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IEhBTE9fR0FNRVNba2V5XSk7XHJcblxyXG4gICAgICAgIGlmIChoYWxvRW50cmllcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ011bHRpcGxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuICghIWhhbG9FbnRyaWVzICYmIChoYWxvRW50cmllcy5sZW5ndGggPiAwKSlcclxuICAgICAgICAgICAgPyBoYWxvRW50cmllc1swXS5uYW1lXHJcbiAgICAgICAgICAgIDogJ05vbmUnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgaXNEZWZhdWx0VmlzaWJsZTogdHJ1ZSxcclxuICAgICAgLy9zb3J0RnVuYzogKGxocywgcmhzKSA9PiBnZXRDb2xsYXRvcihsb2NhbGUpLmNvbXBhcmUobGhzLCByaHMpLFxyXG4gICAgICBjb25kaXRpb246ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhY3RpdmVHYW1lSWQgPSBzZWxlY3RvcnMuYWN0aXZlR2FtZUlkKGNvbnRleHQuYXBpLnN0b3JlLmdldFN0YXRlKCkpO1xyXG4gICAgICAgIHJldHVybiAoYWN0aXZlR2FtZUlkID09PSBHQU1FX0lEKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29udGV4dC5vbmNlKCgpID0+IHtcclxuICAgICAgY29udGV4dC5hcGkuc2V0U3R5bGVzaGVldCgnbWFzdGVyY2hpZWZzdHlsZScsIHBhdGguam9pbihfX2Rpcm5hbWUsICdtYXN0ZXJjaGllZi5zY3NzJykpO1xyXG4gICAgICBjb250ZXh0LmFwaS5vbkFzeW5jKCdkaWQtZGVwbG95JywgYXN5bmMgKHByb2ZpbGVJZDogc3RyaW5nKSA9PiBhcHBseVRvTWFuaWZlc3QoY29udGV4dC5hcGksIHRydWUpKTtcclxuICAgICAgY29udGV4dC5hcGkub25Bc3luYygnZGlkLXB1cmdlJywgYXN5bmMgKHByb2ZpbGVJZDogc3RyaW5nKSA9PiBhcHBseVRvTWFuaWZlc3QoY29udGV4dC5hcGksIGZhbHNlKSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDJDQUFtRjtBQUVuRiw2Q0FBK0I7QUFFL0IscUNBQTBGO0FBRTFGLHlDQUFvRDtBQUNwRCw2Q0FBOEk7QUFDOUksbUNBQW1DO0FBQ25DLGlDQUF5QztBQUd6QyxNQUFNLHlCQUF5QjtJQWM3QixZQUFZLE9BQU87UUFpRFoscUJBQWdCLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFnQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQWhEOUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxnQkFBTyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUNBQW1DLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsa0JBQWtCO1lBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUU7YUFDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEI7Z0JBQ0UsRUFBRSxFQUFFLGtCQUFrQjtnQkFDdEIsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjO2dCQUNoQyxhQUFhLEVBQUU7b0JBQ2IsY0FBYztpQkFDZjtnQkFDRCxRQUFR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QUFLLGdCQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1lBQ25HLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFBQyxPQUFBLElBQUEsc0JBQWUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1FBQ3JHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgZnMsIHR5cGVzLCBGbGV4TGF5b3V0LCBPcHRpb25zRmlsdGVyLCBzZWxlY3RvcnMsIHV0aWwgfSBmcm9tICd2b3J0ZXgtYXBpJztcclxuXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEdBTUVfSUQsIEhBTE9fR0FNRVMsIE1TX0FQUElELCBTVEVBTV9JRCwgTU9EVFlQRV9QTFVHX0FORF9QTEFZIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYXVuY2hlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIH0gZnJvbSAnLi9tb2RUeXBlcyc7XHJcbmltcG9ydCB7IGluc3RhbGxQbHVnQW5kUGxheSwgdGVzdE1vZENvbmZpZ0luc3RhbGxlciwgdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyLCBpbnN0YWxsTW9kQ29uZmlnLCBpbnN0YWxsLCB0ZXN0SW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXJzJztcclxuaW1wb3J0IHsgdGVzdENFTVAgfSBmcm9tICcuL3Rlc3RzJztcclxuaW1wb3J0IHsgYXBwbHlUb01hbmlmZXN0IH0gZnJvbSAnLi91dGlsJztcclxuXHJcbi8vIE1hc3RlciBjaGVmIGNvbGxlY3Rpb25cclxuY2xhc3MgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZSBpbXBsZW1lbnRzIHR5cGVzLklHYW1lIHtcclxuICBwdWJsaWMgY29udGV4dDogdHlwZXMuSUV4dGVuc2lvbkNvbnRleHQ7XHJcbiAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgcHVibGljIG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgc2hvcnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxvZ286IHN0cmluZztcclxuICBwdWJsaWMgYXBpOiB0eXBlcy5JRXh0ZW5zaW9uQXBpO1xyXG4gIHB1YmxpYyBnZXRHYW1lVmVyc2lvbjogKGRpc2NvdmVyeVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZXF1aXJlZEZpbGVzOiBzdHJpbmdbXTtcclxuICBwdWJsaWMgc3VwcG9ydGVkVG9vbHM6IGFueVtdO1xyXG4gIHB1YmxpYyBlbnZpcm9ubWVudDogYW55O1xyXG4gIHB1YmxpYyBkZXRhaWxzOiBhbnk7XHJcbiAgcHVibGljIG1lcmdlTW9kczogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuaWQgPSBHQU1FX0lEO1xyXG4gICAgdGhpcy5uYW1lID0gJ0hhbG86IFRoZSBNYXN0ZXIgQ2hpZWYgQ29sbGVjdGlvbic7XHJcbiAgICB0aGlzLnNob3J0TmFtZSA9ICdIYWxvOiBNQ0MnO1xyXG4gICAgdGhpcy5sb2dvID0gJ2dhbWVhcnQuanBnJztcclxuICAgIHRoaXMuYXBpID0gY29udGV4dC5hcGk7XHJcbiAgICB0aGlzLmdldEdhbWVWZXJzaW9uID0gcmVzb2x2ZUdhbWVWZXJzaW9uLFxyXG4gICAgdGhpcy5yZXF1aXJlZEZpbGVzID0gW1xyXG4gICAgICB0aGlzLmV4ZWN1dGFibGUoKSxcclxuICAgIF07XHJcbiAgICB0aGlzLnN1cHBvcnRlZFRvb2xzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdoYWxvYXNzZW1ibHl0b29sJyxcclxuICAgICAgICBuYW1lOiAnQXNzZW1ibHknLFxyXG4gICAgICAgIGxvZ286ICdhc3NlbWJseXRvb2wucG5nJyxcclxuICAgICAgICBleGVjdXRhYmxlOiAoKSA9PiAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICByZXF1aXJlZEZpbGVzOiBbXHJcbiAgICAgICAgICAnQXNzZW1ibHkuZXhlJyxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlbGF0aXZlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7XHJcbiAgICAgIFN0ZWFtQVBQSWQ6IFNURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGV0YWlscyA9IHtcclxuICAgICAgc3RlYW1BcHBJZDogK1NURUFNX0lELFxyXG4gICAgfTtcclxuICAgIHRoaXMubWVyZ2VNb2RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHF1ZXJ5TW9kUGF0aChnYW1lUGF0aCkge1xyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGV4ZWN1dGFibGUoKSB7XHJcbiAgICByZXR1cm4gJ21jY2xhdW5jaGVyLmV4ZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZShkaXNjb3Zlcnk6IHR5cGVzLklEaXNjb3ZlcnlSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBxdWVyeVBhdGgoKSB7XHJcbiAgICByZXR1cm4gdXRpbC5HYW1lU3RvcmVIZWxwZXIuZmluZEJ5QXBwSWQoW1NURUFNX0lELCBNU19BUFBJRF0pXHJcbiAgICAgIC50aGVuKGdhbWUgPT4gZ2FtZS5nYW1lUGF0aCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWlyZXNMYXVuY2hlciA9IHV0aWwudG9CbHVlKChnYW1lUGF0aDogc3RyaW5nLCBzdG9yZTogc3RyaW5nKSA9PiB0aGlzLmNoZWNrTGF1bmNoZXIoZ2FtZVBhdGgsIHN0b3JlKSk7XHJcbiAgcHVibGljIGFzeW5jIGNoZWNrTGF1bmNoZXIoZ2FtZVBhdGg6IHN0cmluZywgc3RvcmU6IHN0cmluZyk6IExhdW5jaGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChzdG9yZSA9PT0gJ3hib3gnKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAneGJveCcsXHJcbiAgICAgICAgYWRkSW5mbzoge1xyXG4gICAgICAgICAgYXBwSWQ6IE1TX0FQUElELFxyXG4gICAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IGFwcEV4ZWNOYW1lOiAnSGFsb01DQ1NoaXBwaW5nTm9FQUMnIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHN0b3JlID09PSAnc3RlYW0nKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgIGxhdW5jaGVyOiAnc3RlYW0nLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIGFwcElkOiBTVEVBTV9JRCxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IFsnb3B0aW9uMiddLFxyXG4gICAgICAgICAgbGF1bmNoVHlwZTogJ2dhbWVzdG9yZScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBnZXRYYm94SWQoaW50ZXJuYWxJZCwgZmlsZVBhdGgsIGVuY29kaW5nKSB7XHJcbi8vICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgeGJveCBpZCBvZiB0aGUgbGFzdCBwbGF5ZXJcclxuLy8gICAvLyAgd2hvIHJhbiB0aGUgZ2FtZS4gVGhpcyBjYW4gcG90ZW50aWFsbHkgYmUgdXNlZCB0byBtb2QgdGhlIGdhbWVcclxuLy8gICAvLyAgb25seSBmb3Igc3BlY2lmaWMgeGJveCBpZHMgd2hpbGUgbGVhdmluZyBvdGhlcnMgaW4gYW4gdW50YW1wZXJlZCBzdGF0ZS4gKFdJUClcclxuLy8gICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZyB9KVxyXG4vLyAgICAgLnRoZW4oZmlsZURhdGEgPT4ge1xyXG4vLyAgICAgICBsZXQgeG1sRG9jO1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHhtbERvYyA9IHBhcnNlWG1sU3RyaW5nKGZpbGVEYXRhKTtcclxuLy8gICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbi8vICAgICAgIH1cclxuXHJcbi8vICAgICAgIGNvbnN0IGdlbmVyYWxEYXRhID0geG1sRG9jLmZpbmQoJy8vQ2FtcGFpZ25DYXJuYWdlUmVwb3J0L0dlbmVyYWxEYXRhJyk7XHJcbi8vICAgICAgIGlmIChnZW5lcmFsRGF0YVswXS5hdHRyKCdHYW1lSWQnKS52YWx1ZSgpID09PSBpbnRlcm5hbElkKSB7XHJcbi8vICAgICAgICAgY29uc3QgcGxheWVycyA9IHhtbERvYy5maW5kKCcvL0NhbXBhaWduQ2FybmFnZVJlcG9ydC9QbGF5ZXJzL1BsYXllckluZm8nKTtcclxuLy8gICAgICAgICBjb25zdCBtYWluUGxheWVyID0gcGxheWVycy5maW5kKHBsYXllciA9PiBwbGF5ZXIuYXR0cignaXNHdWVzdCcpLnZhbHVlKCkgPT09ICdmYWxzZScpO1xyXG4vLyAgICAgICAgIGNvbnN0IHhib3hJZCA9IG1haW5QbGF5ZXIuYXR0cignbVhib3hVc2VySWQnKS52YWx1ZSgpO1xyXG4vLyAgICAgICAgIC8vIFRoZSB1c2VySWQgaXMgcHJlZml4ZWQgd2l0aCBcIjB4XCIgd2hpY2ggaXMgbm90IG5lZWRlZC5cclxuLy8gICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHhib3hJZC5zdWJzdHJpbmcoMikpO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5EYXRhSW52YWxpZCgnV3JvbmcgaW50ZXJuYWwgZ2FtZUlkJykpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfVxyXG5cclxuY29uc3QgcmVzb2x2ZUdhbWVWZXJzaW9uID0gYXN5bmMgKGRpc2NvdmVyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLmpvaW4oZGlzY292ZXJ5UGF0aCwgJ2J1aWxkX3RhZy50eHQnKTtcclxuICByZXR1cm4gZnMucmVhZEZpbGVBc3luYyh2ZXJzaW9uUGF0aCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pXHJcbiAgICAudGhlbigocmVzKSA9PiBQcm9taXNlLnJlc29sdmUocmVzLnNwbGl0KCdcXHJcXG4nKVswXS50cmltKCkpKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgZGVmYXVsdDogKGNvbnRleHQ6IHR5cGVzLklFeHRlbnNpb25Db250ZXh0KSA9PiB7XHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyR2FtZShuZXcgTWFzdGVyQ2hpZWZDb2xsZWN0aW9uR2FtZShjb250ZXh0KSk7XHJcblxyXG4gICAgLy8gbGV0IGNvbGxhdG9yO1xyXG4gICAgLy8gY29uc3QgZ2V0Q29sbGF0b3IgPSAobG9jYWxlKSA9PiB7XHJcbiAgICAvLyAgIGlmICgoY29sbGF0b3IgPT09IHVuZGVmaW5lZCkgfHwgKGxvY2FsZSAhPT0gbGFuZykpIHtcclxuICAgIC8vICAgICBsYW5nID0gbG9jYWxlO1xyXG4gICAgLy8gICAgIGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IobG9jYWxlLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScgfSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgcmV0dXJuIGNvbGxhdG9yO1xyXG4gICAgLy8gfTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVyTW9kVHlwZShNT0RUWVBFX1BMVUdfQU5EX1BMQVksIDE1LFxyXG4gICAgICAoZ2FtZUlkOiBzdHJpbmcpID0+IGdhbWVJZCA9PT0gR0FNRV9JRCwgKCkgPT4gdW5kZWZpbmVkLCB0ZXN0UGx1Z0FuZFBsYXlNb2RUeXBlIGFzIGFueSwge1xyXG4gICAgICBkZXBsb3ltZW50RXNzZW50aWFsOiBmYWxzZSxcclxuICAgICAgbWVyZ2VNb2RzOiB0cnVlLFxyXG4gICAgICBuYW1lOiAnTUNDIFBsdWcgYW5kIFBsYXkgbW9kJyxcclxuICAgICAgbm9Db25mbGljdHM6IHRydWUsXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21jYy1wbHVnLWFuZC1wbGF5LWluc3RhbGxlcicsXHJcbiAgICAgIDE1LCB0ZXN0UGx1Z0FuZFBsYXlJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsUGx1Z0FuZFBsYXkgYXMgYW55KTtcclxuXHJcbiAgICBjb250ZXh0LnJlZ2lzdGVySW5zdGFsbGVyKCdtYXN0ZXJjaGllZm1vZGNvbmZpZ2luc3RhbGxlcicsXHJcbiAgICAgIDIwLCB0ZXN0TW9kQ29uZmlnSW5zdGFsbGVyIGFzIGFueSwgaW5zdGFsbE1vZENvbmZpZyBhcyBhbnkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJJbnN0YWxsZXIoJ21hc3RlcmNoaWVmaW5zdGFsbGVyJyxcclxuICAgICAgMjUsIHRlc3RJbnN0YWxsZXIgYXMgYW55LCBpbnN0YWxsIGFzIGFueSk7XHJcblxyXG4gICAgY29udGV4dC5yZWdpc3RlclRlc3QoJ21jYy1jZS1tcC10ZXN0JywgJ2dhbWVtb2RlLWFjdGl2YXRlZCcsIHV0aWwudG9CbHVlKCgpID0+IHRlc3RDRU1QKGNvbnRleHQuYXBpKSkpO1xyXG5cclxuICAgIGNvbnRleHQucmVnaXN0ZXJUYWJsZUF0dHJpYnV0ZSgnbW9kcycsIHtcclxuICAgICAgaWQ6ICdnYW1lVHlwZScsXHJcbiAgICAgIG5hbWU6ICdHYW1lKHMpJyxcclxuICAgICAgZGVzY3JpcHRpb246ICdUYXJnZXQgSGFsbyBnYW1lKHMpIGZvciB0aGlzIG1vZCcsXHJcbiAgICAgIGljb246ICdpbnNwZWN0JyxcclxuICAgICAgcGxhY2VtZW50OiAndGFibGUnLFxyXG4gICAgICBjdXN0b21SZW5kZXJlcjogKG1vZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZUltZ0RpdiA9IChlbnRyeSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdoYWxvLWltZy1kaXYnLCBrZXk6IGAke2VudHJ5LmludGVybmFsSWR9LSR7aWR4fWAgfSwgXHJcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2ltZycsIHsgY2xhc3NOYW1lOiAnaGFsb2dhbWVpbWcnLCBzcmM6IGBmaWxlOi8vJHtlbnRyeS5pbWd9YCB9KSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHt9LCBlbnRyeS5uYW1lKSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBpbnRlcm5hbElkcyA9IHV0aWwuZ2V0U2FmZShtb2QsIFsnYXR0cmlidXRlcycsICdoYWxvR2FtZXMnXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IGhhbG9FbnRyaWVzID0gT2JqZWN0LmtleXMoSEFMT19HQU1FUylcclxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGludGVybmFsSWRzLmluY2x1ZGVzKEhBTE9fR0FNRVNba2V5XS5pbnRlcm5hbElkKSlcclxuICAgICAgICAgIC5tYXAoa2V5ID0+IEhBTE9fR0FNRVNba2V5XSk7XHJcblxyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQsIHsgdHlwZTogJ3JvdycgfSwgXHJcbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZsZXhMYXlvdXQuRmxleCwgeyBjbGFzc05hbWU6ICdoYWxvaW1nbGF5b3V0JyB9LCBoYWxvRW50cmllcy5tYXAoKGVudHJ5LCBpZHgpID0+IGNyZWF0ZUltZ0RpdihlbnRyeSwgaWR4KSkpKTtcclxuICAgICAgfSxcclxuICAgICAgY2FsYzogKG1vZCkgPT4gdXRpbC5nZXRTYWZlKG1vZCwgWydhdHRyaWJ1dGVzJywgJ2hhbG9HYW1lcyddLCB1bmRlZmluZWQpLFxyXG4gICAgICBmaWx0ZXI6IG5ldyBPcHRpb25zRmlsdGVyKFxyXG4gICAgICAgIFtdLmNvbmNhdChbeyB2YWx1ZTogT3B0aW9uc0ZpbHRlci5FTVBUWSwgbGFiZWw6ICc8Tm9uZT4nIH1dLFxyXG4gICAgICAgIE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCwgbGFiZWw6IEhBTE9fR0FNRVNba2V5XS5uYW1lIH07XHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICAsIHRydWUsIGZhbHNlKSxcclxuICAgICAgaXNUb2dnbGVhYmxlOiB0cnVlLFxyXG4gICAgICBlZGl0OiB7fSxcclxuICAgICAgaXNTb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgIGlzR3JvdXBhYmxlOiAobW9kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxJZHMgPSB1dGlsLmdldFNhZmUobW9kLCBbJ2F0dHJpYnV0ZXMnLCAnaGFsb0dhbWVzJ10sIFtdKTtcclxuICAgICAgICBjb25zdCBoYWxvRW50cmllcyA9IE9iamVjdC5rZXlzKEhBTE9fR0FNRVMpXHJcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBpbnRlcm5hbElkcy5pbmNsdWRlcyhIQUxPX0dBTUVTW2tleV0uaW50ZXJuYWxJZCkpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiBIQUxPX0dBTUVTW2tleV0pO1xyXG5cclxuICAgICAgICBpZiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuICdNdWx0aXBsZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAoISFoYWxvRW50cmllcyAmJiAoaGFsb0VudHJpZXMubGVuZ3RoID4gMCkpXHJcbiAgICAgICAgICAgID8gaGFsb0VudHJpZXNbMF0ubmFtZVxyXG4gICAgICAgICAgICA6ICdOb25lJztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGlzRGVmYXVsdFZpc2libGU6IHRydWUsXHJcbiAgICAgIC8vc29ydEZ1bmM6IChsaHMsIHJocykgPT4gZ2V0Q29sbGF0b3IobG9jYWxlKS5jb21wYXJlKGxocywgcmhzKSxcclxuICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlR2FtZUlkID0gc2VsZWN0b3JzLmFjdGl2ZUdhbWVJZChjb250ZXh0LmFwaS5zdG9yZS5nZXRTdGF0ZSgpKTtcclxuICAgICAgICByZXR1cm4gKGFjdGl2ZUdhbWVJZCA9PT0gR0FNRV9JRCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnRleHQub25jZSgoKSA9PiB7XHJcbiAgICAgIGNvbnRleHQuYXBpLnNldFN0eWxlc2hlZXQoJ21hc3RlcmNoaWVmc3R5bGUnLCBwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWFzdGVyY2hpZWYuc2NzcycpKTtcclxuICAgICAgY29udGV4dC5hcGkub25Bc3luYygnZGlkLWRlcGxveScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCB0cnVlKSk7XHJcbiAgICAgIGNvbnRleHQuYXBpLm9uQXN5bmMoJ2RpZC1wdXJnZScsIGFzeW5jIChwcm9maWxlSWQ6IHN0cmluZykgPT4gYXBwbHlUb01hbmlmZXN0KGNvbnRleHQuYXBpLCBmYWxzZSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG4iXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/index.ts b/game-masterchiefcollection/index.ts index c5ce456..b87f2e3 100644 --- a/game-masterchiefcollection/index.ts +++ b/game-masterchiefcollection/index.ts @@ -8,6 +8,7 @@ import { GAME_ID, HALO_GAMES, MS_APPID, STEAM_ID, MODTYPE_PLUG_AND_PLAY } from ' import { LauncherConfig } from './types'; import { testPlugAndPlayModType } from './modTypes'; import { installPlugAndPlay, testModConfigInstaller, testPlugAndPlayInstaller, installModConfig, install, testInstaller } from './installers'; +import { testCEMP } from './tests'; import { applyToManifest } from './util'; // Master chef collection @@ -163,6 +164,8 @@ module.exports = { context.registerInstaller('masterchiefinstaller', 25, testInstaller as any, install as any); + context.registerTest('mcc-ce-mp-test', 'gamemode-activated', util.toBlue(() => testCEMP(context.api))); + context.registerTableAttribute('mods', { id: 'gameType', name: 'Game(s)', diff --git a/game-masterchiefcollection/installers.js b/game-masterchiefcollection/installers.js index e892dd7..d3cb94c 100644 --- a/game-masterchiefcollection/installers.js +++ b/game-masterchiefcollection/installers.js @@ -49,15 +49,31 @@ function testPlugAndPlayInstaller(files, gameId) { } exports.testPlugAndPlayInstaller = testPlugAndPlayInstaller; function installPlugAndPlay(files, destinationPath) { + var _a; return __awaiter(this, void 0, void 0, function* () { const modInfo = files.find(file => path_1.default.basename(file).toLowerCase() === common_1.MOD_INFO_JSON_FILE); const modInfoData = yield vortex_api_1.fs.readFileAsync(path_1.default.join(destinationPath, modInfo), { encoding: 'utf8' }); const parsed = rjson.parse(modInfoData); - const gameInstruction = { + let modConfigAttributes = []; + modConfigAttributes.push({ type: 'attribute', key: 'haloGames', value: [common_1.HALO_GAMES[parsed.Engine.toLowerCase()].internalId], - }; + }); + if (parsed.ModVersion !== undefined) { + modConfigAttributes.push({ + type: 'attribute', + key: 'version', + value: `${parsed.ModVersion.Major || 0}.${parsed.ModVersion.Minor || 0}.${parsed.ModVersion.Patch || 0}`, + }); + } + if (((_a = parsed.Title) === null || _a === void 0 ? void 0 : _a.Neutral) !== undefined) { + modConfigAttributes.push({ + type: 'attribute', + key: 'customFileName', + value: parsed.Title.Neutral, + }); + } const infoSegments = modInfo.split(path_1.default.sep); const modFolderIndex = infoSegments.length >= 2 ? infoSegments.length - 2 : 0; const filtered = files.filter(file => path_1.default.extname(path_1.default.basename(file)) !== ''); @@ -70,7 +86,7 @@ function installPlugAndPlay(files, destinationPath) { destination: destination.join(path_1.default.sep), }; }); - instructions.push(gameInstruction); + instructions.push(...modConfigAttributes); return Promise.resolve({ instructions }); }); } @@ -170,4 +186,4 @@ function install(files, destinationPath) { }); } exports.install = install; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluc3RhbGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsb0RBQXNDO0FBQ3RDLDJDQUFrRDtBQUVsRCxxQ0FBb0k7QUFFcEksaUNBQTJDO0FBRTNDLFNBQXNCLHdCQUF3QixDQUFDLEtBQWUsRUFBRSxNQUFjOztRQUM1RSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSywyQkFBa0IsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxnQkFBTyxDQUFDLElBQUksY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7Q0FBQTtBQUhELDREQUdDO0FBRUQsU0FBc0Isa0JBQWtCLENBQUMsS0FBZSxFQUFFLGVBQXVCOztRQUMvRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSywyQkFBa0IsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sTUFBTSxHQUFlLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFlLENBQUM7UUFDbEUsTUFBTSxlQUFlLEdBQXVCO1lBQzFDLElBQUks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QU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULElBQUksRUFBRSxNQUFNO29CQUNaLE1BQU0sRUFBRSxPQUFPO29CQUNmLFdBQVc7aUJBQ1osQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQUE7QUE3QkQsMEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIHJqc29uIGZyb20gJ3JlbGF4ZWQtanNvbic7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgbG9nLCB1dGlsIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBNT0RfQ09ORklHX0RFU1RfRUxFTUVOVCwgTU9EX0lORk9fSlNPTl9GSUxFLCBHQU1FX0lELCBNT0RfQ09ORklHX0ZJTEUsIEFTU0VNQkxZX0VYVCwgTUFQX0VYVCwgSEFMT19HQU1FUyB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgSU1vZENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBpZGVudGlmeUhhbG9HYW1lcyB9IGZyb20gJy4vdXRpbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyKGZpbGVzOiBzdHJpbmdbXSwgZ2FtZUlkOiBzdHJpbmcpIHtcclxuICBjb25zdCBoYXNNb2RJbmZvRmlsZSA9IGZpbGVzLnNvbWUoZmlsZSA9PiBwYXRoLmJhc2VuYW1lKGZpbGUpLnRvTG93ZXJDYXNlKCkgPT09IE1PRF9JTkZPX0pTT05fRklMRSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogKGdhbWVJZCA9PT0gR0FNRV9JRCkgJiYgaGFzTW9kSW5mb0ZpbGUsIHJlcXVpcmVkRmlsZXM6IFtdIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdBbmRQbGF5KGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBtb2RJbmZvID0gZmlsZXMuZmluZChmaWxlID0+IHBhdGguYmFzZW5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKSA9PT0gTU9EX0lORk9fSlNPTl9GSUxFKTtcclxuICBjb25zdCBtb2RJbmZvRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlQXN5bmMocGF0aC5qb2luKGRlc3RpbmF0aW9uUGF0aCwgbW9kSW5mbyksIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICBjb25zdCBwYXJzZWQ6IElNb2RDb25maWcgPSByanNvbi5wYXJzZShtb2RJbmZvRGF0YSkgYXMgSU1vZENvbmZpZztcclxuICBjb25zdCBnYW1lSW5zdHJ1Y3Rpb246IHR5cGVzLklJbnN0cnVjdGlvbiA9IHtcclxuICAgIHR5cGU6ICdhdHRyaWJ1dGUnLFxyXG4gICAga2V5OiAnaGFsb0dhbWVzJyxcclxuICAgIHZhbHVlOiBbSEFMT19HQU1FU1twYXJzZWQuRW5naW5lLnRvTG93ZXJDYXNlKCldLmludGVybmFsSWRdLFxyXG4gIH1cclxuICBjb25zdCBpbmZvU2VnbWVudHMgPSBtb2RJbmZvLnNwbGl0KHBhdGguc2VwKTtcclxuICBjb25zdCBtb2RGb2xkZXJJbmRleCA9IGluZm9TZWdtZW50cy5sZW5ndGggPj0gMiA/IGluZm9TZWdtZW50cy5sZW5ndGggLSAyIDogMDtcclxuICBjb25zdCBmaWx0ZXJlZCA9IGZpbGVzLmZpbHRlcihmaWxlID0+IHBhdGguZXh0bmFtZShwYXRoLmJhc2VuYW1lKGZpbGUpKSAhPT0gJycpO1xyXG4gIGNvbnN0IGluc3RydWN0aW9uczogdHlwZXMuSUluc3RydWN0aW9uW10gPSBmaWx0ZXJlZC5tYXAoZmlsZSA9PiB7XHJcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGUuc3BsaXQocGF0aC5zZXApO1xyXG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBzZWdtZW50cy5zbGljZShtb2RGb2xkZXJJbmRleCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0eXBlOiAnY29weScsXHJcbiAgICAgIHNvdXJjZTogZmlsZSxcclxuICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLmpvaW4ocGF0aC5zZXApLFxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgaW5zdHJ1Y3Rpb25zLnB1c2goZ2FtZUluc3RydWN0aW9uKTtcclxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgaW5zdHJ1Y3Rpb25zIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGVzdE1vZENvbmZpZ0luc3RhbGxlcihmaWxlcywgZ2FtZUlkKSB7XHJcbiAgY29uc3QgaXNBc3NlbWJseU9ubHlNb2QgPSAoKSA9PiB7XHJcbiAgICAvLyBUaGUgcHJlc2Vuc2Ugb2YgYW4gLmFzbXAgZmlsZSB3aXRob3V0IGFueSAubWFwIGZpbGVzIGlzIGEgY2xlYXIgaW5kaWNhdGlvblxyXG4gICAgLy8gIHRoYXQgdGhpcyBtb2QgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIHVzaW5nIHRoZSBBc3NlbWJseSB0b29sIHdoaWNoIHdlJ3ZlXHJcbiAgICAvLyAgeWV0IHRvIGludGVncmF0ZSBpbnRvIFZvcnRleC4gVGhpcyBpbnN0YWxsZXIgd2lsbCBub3QgaW5zdGFsbCB0aGVzZSBtb2RzLlxyXG4gICAgcmV0dXJuIChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5leHRuYW1lKGZpbGUpID09PSBBU1NFTUJMWV9FWFQpICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICYmIChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5leHRuYW1lKGZpbGUpID09PSBNQVBfRVhUKSA9PT0gdW5kZWZpbmVkKTtcclxuICB9O1xyXG4gIHJldHVybiAoZ2FtZUlkICE9PSBHQU1FX0lEKVxyXG4gICA/IFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogZmFsc2UsIHJlcXVpcmVkRmlsZXM6IFtdIH0pXHJcbiAgIDogUHJvbWlzZS5yZXNvbHZlKHtcclxuICAgICBzdXBwb3J0ZWQ6IChmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5iYXNlbmFtZShmaWxlKSA9PT0gTU9EX0NPTkZJR19GSUxFKSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAmJiAhaXNBc3NlbWJseU9ubHlNb2QoKSxcclxuICAgICByZXF1aXJlZEZpbGVzOiBbXSxcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE1vZENvbmZpZyhmaWxlczogc3RyaW5nW10sIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nKSB7XHJcbiAgLy8gRmluZCB0aGUgbW9kIGNvbmZpZyBmaWxlIGFuZCB1c2UgaXQgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9ucy5cclxuICBjb25zdCBtb2RDb25maWdGaWxlID0gZmlsZXMuZmluZChmaWxlID0+IHBhdGguYmFzZW5hbWUoZmlsZSkgPT09IE1PRF9DT05GSUdfRklMRSk7XHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiB7XHJcbiAgICAvLyBObyBkaXJlY3RvcmllcywgYXNzZW1ibHkgdG9vbCBmaWxlcywgcmVhZG1lcyBvciBtb2QgY29uZmlnIGZpbGVzLlxyXG4gICAgY29uc3Qgc2VnbWVudHMgPSBmaWxlLnNwbGl0KHBhdGguc2VwKTtcclxuICAgIGNvbnN0IGxhc3RFbGVtZW50RXh0ID0gcGF0aC5leHRuYW1lKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKTtcclxuICAgIHJldHVybiAobW9kQ29uZmlnRmlsZSAhPT0gZmlsZSkgJiYgWycnLCAnLnR4dCcsIEFTU0VNQkxZX0VYVF0uaW5kZXhPZihsYXN0RWxlbWVudEV4dCkgPT09IC0xO1xyXG4gIH0pO1xyXG4gIGNvbnN0IGNvbmZpZ0RhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZUFzeW5jKHBhdGguam9pbihkZXN0aW5hdGlvblBhdGgsIG1vZENvbmZpZ0ZpbGUpLCB7IGVuY29kaW5nOiAndXRmOCcgfSk7XHJcbiAgbGV0IGRhdGE7XHJcbiAgdHJ5IHtcclxuICAgIGRhdGEgPSByanNvbi5wYXJzZSh1dGlsLmRlQk9NKGNvbmZpZ0RhdGEpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGxvZygnZXJyb3InLCAnVW5hYmxlIHRvIHBhcnNlIG1vZHBhY2tfY29uZmlnLmNmZycsIGVycik7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHV0aWwuRGF0YUludmFsaWQoJ0ludmFsaWQgbW9kcGFja19jb25maWcuY2ZnIGZpbGUnKSk7XHJcbiAgfVxyXG5cclxuICBpZiAoIWRhdGEuZW50cmllcykge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyB1dGlsLkRhdGFJbnZhbGlkKCdtb2RwYWNrX2NvbmZpZy5jZmcgZmlsZSBjb250YWlucyBubyBlbnRyaWVzJykpXHJcbiAgfVxyXG5cclxuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmaWx0ZXJlZC5yZWR1Y2UoKGFjY3VtLCBmaWxlKSA9PiB7XHJcbiAgICBjb25zdCBtYXRjaGluZ0VudHJ5ID0gZGF0YS5lbnRyaWVzLmZpbmQoZW50cnkgPT5cclxuICAgICAgKCdzcmMnIGluIGVudHJ5KSAmJiAoZW50cnkuc3JjLnRvTG93ZXJDYXNlKCkgPT09IGZpbGUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgaWYgKCEhbWF0Y2hpbmdFbnRyeSkge1xyXG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG1hdGNoaW5nRW50cnkuZGVzdC5zdWJzdHJpbmcoTU9EX0NPTkZJR19ERVNUX0VMRU1FTlQubGVuZ3RoKTtcclxuICAgICAgYWNjdW0ucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ2NvcHknLFxyXG4gICAgICAgIHNvdXJjZTogZmlsZSxcclxuICAgICAgICBkZXN0aW5hdGlvbixcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGlzIG1heSBqdXN0IGJlIGEgcG9pbnRsZXNzIGFkZGl0aW9uIGJ5IHRoZSBtb2QgYXV0aG9yIC0gd2UncmUgZ29pbmcgdG8gbG9nXHJcbiAgICAgIC8vICB0aGlzIGFuZCBjb250aW51ZS5cclxuICAgICAgbG9nKCd3YXJuJywgJ0ZhaWxlZCB0byBmaW5kIG1hdGNoaW5nIG1hbmlmZXN0IGVudHJ5IGZvciBmaWxlIGluIGFyY2hpdmUnLCBmaWxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWNjdW07XHJcbiAgICB9LCBbXSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGluc3RydWN0aW9ucyB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RJbnN0YWxsZXIoZmlsZXMsIGdhbWVJZCkge1xyXG4gIGlmIChnYW1lSWQgIT09IEdBTUVfSUQpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBzdXBwb3J0ZWQ6IGZhbHNlLCByZXF1aXJlZEZpbGVzOiBbXSB9KTtcclxuICB9XHJcbiAgY29uc3QgaGFsb0dhbWVzID0gaWRlbnRpZnlIYWxvR2FtZXMoZmlsZXMpO1xyXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgc3VwcG9ydGVkOiAoaGFsb0dhbWVzLmxlbmd0aCA+IDApLFxyXG4gICAgcmVxdWlyZWRGaWxlczogW10sXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsKGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBoYWxvR2FtZXMgPSAgaWRlbnRpZnlIYWxvR2FtZXMoZmlsZXMpO1xyXG4gIGNvbnN0IGludGVybmFsSWRzID0gaGFsb0dhbWVzLm1hcChnYW1lID0+IGdhbWUuaW50ZXJuYWxJZCk7XHJcbiAgY29uc3QgYXR0ckluc3RydWN0aW9uOiB0eXBlcy5JSW5zdHJ1Y3Rpb24gPSB7XHJcbiAgICB0eXBlOiAnYXR0cmlidXRlJyxcclxuICAgIGtleTogJ2hhbG9HYW1lcycsXHJcbiAgICB2YWx1ZTogaW50ZXJuYWxJZHMsXHJcbiAgfVxyXG4gICAgXHJcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5JSW5zdHJ1Y3Rpb25bXSA9IGhhbG9HYW1lcy5yZWR1Y2UoKGFjY3VtLCBoYWxvR2FtZSkgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKHNlZyA9PiAhIXNlZyk7XHJcbiAgICAgIHJldHVybiAocGF0aC5leHRuYW1lKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKSAhPT0gJycpXHJcbiAgICAgICAgJiYgKHNlZ21lbnRzLmluZGV4T2YoaGFsb0dhbWUubW9kc1BhdGgpICE9PSAtMSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmaWx0ZXJlZC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGVsZW1lbnQuc3BsaXQocGF0aC5zZXApLmZpbHRlcihzZWcgPT4gISFzZWcpO1xyXG4gICAgICBjb25zdCByb290SWR4ID0gc2VnbWVudHMuaW5kZXhPZihoYWxvR2FtZS5tb2RzUGF0aCk7XHJcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc2VnbWVudHMuc3BsaWNlKHJvb3RJZHgpLmpvaW4ocGF0aC5zZXApO1xyXG4gICAgICBhY2N1bS5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnY29weScsXHJcbiAgICAgICAgc291cmNlOiBlbGVtZW50LFxyXG4gICAgICAgIGRlc3RpbmF0aW9uXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYWNjdW07XHJcbiAgfSwgW2F0dHJJbnN0cnVjdGlvbl0pO1xyXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBpbnN0cnVjdGlvbnMgfSk7XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluc3RhbGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsb0RBQXNDO0FBQ3RDLDJDQUFrRDtBQUVsRCxxQ0FBb0k7QUFFcEksaUNBQTJDO0FBRTNDLFNBQXNCLHdCQUF3QixDQUFDLEtBQWUsRUFBRSxNQUFjOztRQUM1RSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSywyQkFBa0IsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxnQkFBTyxDQUFDLElBQUksY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7Q0FBQTtBQUhELDREQUdDO0FBRUQsU0FBc0Isa0JBQWtCLENBQUMsS0FBZSxFQUFFLGVBQXVCOzs7UUFDL0UsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssMkJBQWtCLENBQUMsQ0FBQztRQUM3RixNQUFNLFdBQVcsR0FBRyxNQUFNLGVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RyxNQUFNLE1BQU0sR0FBZSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBZSxDQUFDO1FBQ2xFLElBQUksbUJBQW1CLEdBQXlCLEVBQUUsQ0FB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QUFDO0NBQUE7QUE3QkQsMEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIHJqc29uIGZyb20gJ3JlbGF4ZWQtanNvbic7XHJcbmltcG9ydCB7IGZzLCB0eXBlcywgbG9nLCB1dGlsIH0gZnJvbSAndm9ydGV4LWFwaSc7XHJcblxyXG5pbXBvcnQgeyBNT0RfQ09ORklHX0RFU1RfRUxFTUVOVCwgTU9EX0lORk9fSlNPTl9GSUxFLCBHQU1FX0lELCBNT0RfQ09ORklHX0ZJTEUsIEFTU0VNQkxZX0VYVCwgTUFQX0VYVCwgSEFMT19HQU1FUyB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgSU1vZENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBpZGVudGlmeUhhbG9HYW1lcyB9IGZyb20gJy4vdXRpbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFBsdWdBbmRQbGF5SW5zdGFsbGVyKGZpbGVzOiBzdHJpbmdbXSwgZ2FtZUlkOiBzdHJpbmcpIHtcclxuICBjb25zdCBoYXNNb2RJbmZvRmlsZSA9IGZpbGVzLnNvbWUoZmlsZSA9PiBwYXRoLmJhc2VuYW1lKGZpbGUpLnRvTG93ZXJDYXNlKCkgPT09IE1PRF9JTkZPX0pTT05fRklMRSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogKGdhbWVJZCA9PT0gR0FNRV9JRCkgJiYgaGFzTW9kSW5mb0ZpbGUsIHJlcXVpcmVkRmlsZXM6IFtdIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdBbmRQbGF5KGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICBjb25zdCBtb2RJbmZvID0gZmlsZXMuZmluZChmaWxlID0+IHBhdGguYmFzZW5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKSA9PT0gTU9EX0lORk9fSlNPTl9GSUxFKTtcclxuICBjb25zdCBtb2RJbmZvRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlQXN5bmMocGF0aC5qb2luKGRlc3RpbmF0aW9uUGF0aCwgbW9kSW5mbyksIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICBjb25zdCBwYXJzZWQ6IElNb2RDb25maWcgPSByanNvbi5wYXJzZShtb2RJbmZvRGF0YSkgYXMgSU1vZENvbmZpZztcclxuICBsZXQgbW9kQ29uZmlnQXR0cmlidXRlczogdHlwZXMuSUluc3RydWN0aW9uW10gPSBbXTtcclxuICBtb2RDb25maWdBdHRyaWJ1dGVzLnB1c2goe1xyXG4gICAgdHlwZTogJ2F0dHJpYnV0ZScsXHJcbiAgICBrZXk6ICdoYWxvR2FtZXMnLFxyXG4gICAgdmFsdWU6IFtIQUxPX0dBTUVTW3BhcnNlZC5FbmdpbmUudG9Mb3dlckNhc2UoKV0uaW50ZXJuYWxJZF0sXHJcbiAgfSk7XHJcblxyXG4gIGlmIChwYXJzZWQuTW9kVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBtb2RDb25maWdBdHRyaWJ1dGVzLnB1c2goe1xyXG4gICAgICB0eXBlOiAnYXR0cmlidXRlJyxcclxuICAgICAga2V5OiAndmVyc2lvbicsXHJcbiAgICAgIHZhbHVlOiBgJHtwYXJzZWQuTW9kVmVyc2lvbi5NYWpvciB8fCAwfS4ke3BhcnNlZC5Nb2RWZXJzaW9uLk1pbm9yIHx8IDB9LiR7cGFyc2VkLk1vZFZlcnNpb24uUGF0Y2ggfHwgMH1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpZiAocGFyc2VkLlRpdGxlPy5OZXV0cmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgIG1vZENvbmZpZ0F0dHJpYnV0ZXMucHVzaCh7XHJcbiAgICAgIHR5cGU6ICdhdHRyaWJ1dGUnLFxyXG4gICAgICBrZXk6ICdjdXN0b21GaWxlTmFtZScsXHJcbiAgICAgIHZhbHVlOiBwYXJzZWQuVGl0bGUuTmV1dHJhbCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW5mb1NlZ21lbnRzID0gbW9kSW5mby5zcGxpdChwYXRoLnNlcCk7XHJcbiAgY29uc3QgbW9kRm9sZGVySW5kZXggPSBpbmZvU2VnbWVudHMubGVuZ3RoID49IDIgPyBpbmZvU2VnbWVudHMubGVuZ3RoIC0gMiA6IDA7XHJcbiAgY29uc3QgZmlsdGVyZWQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBwYXRoLmV4dG5hbWUocGF0aC5iYXNlbmFtZShmaWxlKSkgIT09ICcnKTtcclxuICBjb25zdCBpbnN0cnVjdGlvbnM6IHR5cGVzLklJbnN0cnVjdGlvbltdID0gZmlsdGVyZWQubWFwKGZpbGUgPT4ge1xyXG4gICAgY29uc3Qgc2VnbWVudHMgPSBmaWxlLnNwbGl0KHBhdGguc2VwKTtcclxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc2VnbWVudHMuc2xpY2UobW9kRm9sZGVySW5kZXgpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdHlwZTogJ2NvcHknLFxyXG4gICAgICBzb3VyY2U6IGZpbGUsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbi5qb2luKHBhdGguc2VwKSxcclxuICAgIH07XHJcbiAgfSk7XHJcblxyXG4gIGluc3RydWN0aW9ucy5wdXNoKC4uLm1vZENvbmZpZ0F0dHJpYnV0ZXMpO1xyXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBpbnN0cnVjdGlvbnMgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TW9kQ29uZmlnSW5zdGFsbGVyKGZpbGVzLCBnYW1lSWQpIHtcclxuICBjb25zdCBpc0Fzc2VtYmx5T25seU1vZCA9ICgpID0+IHtcclxuICAgIC8vIFRoZSBwcmVzZW5zZSBvZiBhbiAuYXNtcCBmaWxlIHdpdGhvdXQgYW55IC5tYXAgZmlsZXMgaXMgYSBjbGVhciBpbmRpY2F0aW9uXHJcbiAgICAvLyAgdGhhdCB0aGlzIG1vZCBjYW4gb25seSBiZSBpbnN0YWxsZWQgdXNpbmcgdGhlIEFzc2VtYmx5IHRvb2wgd2hpY2ggd2UndmVcclxuICAgIC8vICB5ZXQgdG8gaW50ZWdyYXRlIGludG8gVm9ydGV4LiBUaGlzIGluc3RhbGxlciB3aWxsIG5vdCBpbnN0YWxsIHRoZXNlIG1vZHMuXHJcbiAgICByZXR1cm4gKGZpbGVzLmZpbmQoZmlsZSA9PiBwYXRoLmV4dG5hbWUoZmlsZSkgPT09IEFTU0VNQkxZX0VYVCkgIT09IHVuZGVmaW5lZClcclxuICAgICAgJiYgKGZpbGVzLmZpbmQoZmlsZSA9PiBwYXRoLmV4dG5hbWUoZmlsZSkgPT09IE1BUF9FWFQpID09PSB1bmRlZmluZWQpO1xyXG4gIH07XHJcbiAgcmV0dXJuIChnYW1lSWQgIT09IEdBTUVfSUQpXHJcbiAgID8gUHJvbWlzZS5yZXNvbHZlKHsgc3VwcG9ydGVkOiBmYWxzZSwgcmVxdWlyZWRGaWxlczogW10gfSlcclxuICAgOiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgIHN1cHBvcnRlZDogKGZpbGVzLmZpbmQoZmlsZSA9PiBwYXRoLmJhc2VuYW1lKGZpbGUpID09PSBNT0RfQ09ORklHX0ZJTEUpICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICYmICFpc0Fzc2VtYmx5T25seU1vZCgpLFxyXG4gICAgIHJlcXVpcmVkRmlsZXM6IFtdLFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTW9kQ29uZmlnKGZpbGVzOiBzdHJpbmdbXSwgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcpIHtcclxuICAvLyBGaW5kIHRoZSBtb2QgY29uZmlnIGZpbGUgYW5kIHVzZSBpdCB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25zLlxyXG4gIGNvbnN0IG1vZENvbmZpZ0ZpbGUgPSBmaWxlcy5maW5kKGZpbGUgPT4gcGF0aC5iYXNlbmFtZShmaWxlKSA9PT0gTU9EX0NPTkZJR19GSUxFKTtcclxuICBjb25zdCBmaWx0ZXJlZCA9IGZpbGVzLmZpbHRlcihmaWxlID0+IHtcclxuICAgIC8vIE5vIGRpcmVjdG9yaWVzLCBhc3NlbWJseSB0b29sIGZpbGVzLCByZWFkbWVzIG9yIG1vZCBjb25maWcgZmlsZXMuXHJcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGUuc3BsaXQocGF0aC5zZXApO1xyXG4gICAgY29uc3QgbGFzdEVsZW1lbnRFeHQgPSBwYXRoLmV4dG5hbWUoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0pO1xyXG4gICAgcmV0dXJuIChtb2RDb25maWdGaWxlICE9PSBmaWxlKSAmJiBbJycsICcudHh0JywgQVNTRU1CTFlfRVhUXS5pbmRleE9mKGxhc3RFbGVtZW50RXh0KSA9PT0gLTE7XHJcbiAgfSk7XHJcbiAgY29uc3QgY29uZmlnRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlQXN5bmMocGF0aC5qb2luKGRlc3RpbmF0aW9uUGF0aCwgbW9kQ29uZmlnRmlsZSksIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcclxuICBsZXQgZGF0YTtcclxuICB0cnkge1xyXG4gICAgZGF0YSA9IHJqc29uLnBhcnNlKHV0aWwuZGVCT00oY29uZmlnRGF0YSkpO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgbG9nKCdlcnJvcicsICdVbmFibGUgdG8gcGFyc2UgbW9kcGFja19jb25maWcuY2ZnJywgZXJyKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgdXRpbC5EYXRhSW52YWxpZCgnSW52YWxpZCBtb2RwYWNrX2NvbmZpZy5jZmcgZmlsZScpKTtcclxuICB9XHJcblxyXG4gIGlmICghZGF0YS5lbnRyaWVzKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHV0aWwuRGF0YUludmFsaWQoJ21vZHBhY2tfY29uZmlnLmNmZyBmaWxlIGNvbnRhaW5zIG5vIGVudHJpZXMnKSlcclxuICB9XHJcblxyXG4gIGNvbnN0IGluc3RydWN0aW9ucyA9IGZpbHRlcmVkLnJlZHVjZSgoYWNjdW0sIGZpbGUpID0+IHtcclxuICAgIGNvbnN0IG1hdGNoaW5nRW50cnkgPSBkYXRhLmVudHJpZXMuZmluZChlbnRyeSA9PlxyXG4gICAgICAoJ3NyYycgaW4gZW50cnkpICYmIChlbnRyeS5zcmMudG9Mb3dlckNhc2UoKSA9PT0gZmlsZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICBpZiAoISFtYXRjaGluZ0VudHJ5KSB7XHJcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gbWF0Y2hpbmdFbnRyeS5kZXN0LnN1YnN0cmluZyhNT0RfQ09ORklHX0RFU1RfRUxFTUVOVC5sZW5ndGgpO1xyXG4gICAgICBhY2N1bS5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnY29weScsXHJcbiAgICAgICAgc291cmNlOiBmaWxlLFxyXG4gICAgICAgIGRlc3RpbmF0aW9uLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRoaXMgbWF5IGp1c3QgYmUgYSBwb2ludGxlc3MgYWRkaXRpb24gYnkgdGhlIG1vZCBhdXRob3IgLSB3ZSdyZSBnb2luZyB0byBsb2dcclxuICAgICAgLy8gIHRoaXMgYW5kIGNvbnRpbnVlLlxyXG4gICAgICBsb2coJ3dhcm4nLCAnRmFpbGVkIHRvIGZpbmQgbWF0Y2hpbmcgbWFuaWZlc3QgZW50cnkgZm9yIGZpbGUgaW4gYXJjaGl2ZScsIGZpbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhY2N1bTtcclxuICAgIH0sIFtdKTtcclxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgaW5zdHJ1Y3Rpb25zIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGVzdEluc3RhbGxlcihmaWxlcywgZ2FtZUlkKSB7XHJcbiAgaWYgKGdhbWVJZCAhPT0gR0FNRV9JRCkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHN1cHBvcnRlZDogZmFsc2UsIHJlcXVpcmVkRmlsZXM6IFtdIH0pO1xyXG4gIH1cclxuICBjb25zdCBoYWxvR2FtZXMgPSBpZGVudGlmeUhhbG9HYW1lcyhmaWxlcyk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XHJcbiAgICBzdXBwb3J0ZWQ6IChoYWxvR2FtZXMubGVuZ3RoID4gMCksXHJcbiAgICByZXF1aXJlZEZpbGVzOiBbXSxcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGwoZmlsZXM6IHN0cmluZ1tdLCBkZXN0aW5hdGlvblBhdGg6IHN0cmluZykge1xyXG4gIGNvbnN0IGhhbG9HYW1lcyA9ICBpZGVudGlmeUhhbG9HYW1lcyhmaWxlcyk7XHJcbiAgY29uc3QgaW50ZXJuYWxJZHMgPSBoYWxvR2FtZXMubWFwKGdhbWUgPT4gZ2FtZS5pbnRlcm5hbElkKTtcclxuICBjb25zdCBhdHRySW5zdHJ1Y3Rpb246IHR5cGVzLklJbnN0cnVjdGlvbiA9IHtcclxuICAgIHR5cGU6ICdhdHRyaWJ1dGUnLFxyXG4gICAga2V5OiAnaGFsb0dhbWVzJyxcclxuICAgIHZhbHVlOiBpbnRlcm5hbElkcyxcclxuICB9XHJcbiAgICBcclxuICBjb25zdCBpbnN0cnVjdGlvbnM6IHR5cGVzLklJbnN0cnVjdGlvbltdID0gaGFsb0dhbWVzLnJlZHVjZSgoYWNjdW0sIGhhbG9HYW1lKSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGZpbGVzLmZpbHRlcihmaWxlID0+IHtcclxuICAgICAgY29uc3Qgc2VnbWVudHMgPSBmaWxlLnNwbGl0KHBhdGguc2VwKS5maWx0ZXIoc2VnID0+ICEhc2VnKTtcclxuICAgICAgcmV0dXJuIChwYXRoLmV4dG5hbWUoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0pICE9PSAnJylcclxuICAgICAgICAmJiAoc2VnbWVudHMuaW5kZXhPZihoYWxvR2FtZS5tb2RzUGF0aCkgIT09IC0xKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZpbHRlcmVkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZWxlbWVudC5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKHNlZyA9PiAhIXNlZyk7XHJcbiAgICAgIGNvbnN0IHJvb3RJZHggPSBzZWdtZW50cy5pbmRleE9mKGhhbG9HYW1lLm1vZHNQYXRoKTtcclxuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBzZWdtZW50cy5zcGxpY2Uocm9vdElkeCkuam9pbihwYXRoLnNlcCk7XHJcbiAgICAgIGFjY3VtLnB1c2goe1xyXG4gICAgICAgIHR5cGU6ICdjb3B5JyxcclxuICAgICAgICBzb3VyY2U6IGVsZW1lbnQsXHJcbiAgICAgICAgZGVzdGluYXRpb25cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhY2N1bTtcclxuICB9LCBbYXR0ckluc3RydWN0aW9uXSk7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGluc3RydWN0aW9ucyB9KTtcclxufSJdfQ== \ No newline at end of file diff --git a/game-masterchiefcollection/installers.ts b/game-masterchiefcollection/installers.ts index 38057b5..c22d64f 100644 --- a/game-masterchiefcollection/installers.ts +++ b/game-masterchiefcollection/installers.ts @@ -16,11 +16,29 @@ export async function installPlugAndPlay(files: string[], destinationPath: strin const modInfo = files.find(file => path.basename(file).toLowerCase() === MOD_INFO_JSON_FILE); const modInfoData = await fs.readFileAsync(path.join(destinationPath, modInfo), { encoding: 'utf8' }); const parsed: IModConfig = rjson.parse(modInfoData) as IModConfig; - const gameInstruction: types.IInstruction = { + let modConfigAttributes: types.IInstruction[] = []; + modConfigAttributes.push({ type: 'attribute', key: 'haloGames', value: [HALO_GAMES[parsed.Engine.toLowerCase()].internalId], + }); + + if (parsed.ModVersion !== undefined) { + modConfigAttributes.push({ + type: 'attribute', + key: 'version', + value: `${parsed.ModVersion.Major || 0}.${parsed.ModVersion.Minor || 0}.${parsed.ModVersion.Patch || 0}`, + }); } + + if (parsed.Title?.Neutral !== undefined) { + modConfigAttributes.push({ + type: 'attribute', + key: 'customFileName', + value: parsed.Title.Neutral, + }); + } + const infoSegments = modInfo.split(path.sep); const modFolderIndex = infoSegments.length >= 2 ? infoSegments.length - 2 : 0; const filtered = files.filter(file => path.extname(path.basename(file)) !== ''); @@ -34,7 +52,7 @@ export async function installPlugAndPlay(files: string[], destinationPath: strin }; }); - instructions.push(gameInstruction); + instructions.push(...modConfigAttributes); return Promise.resolve({ instructions }); } diff --git a/game-masterchiefcollection/tests.js b/game-masterchiefcollection/tests.js new file mode 100644 index 0000000..654f54c --- /dev/null +++ b/game-masterchiefcollection/tests.js @@ -0,0 +1,53 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.testCEMP = void 0; +const path_1 = __importDefault(require("path")); +const vortex_api_1 = require("vortex-api"); +const common_1 = require("./common"); +const MAP_NUMBER_CONSTRAINT = 28; +function testCEMP(api) { + return __awaiter(this, void 0, void 0, function* () { + const state = api.getState(); + const discovery = vortex_api_1.selectors.discoveryByGame(state, common_1.GAME_ID); + if (discovery === undefined) { + return Promise.resolve(undefined); + } + const halo1MapsPath = path_1.default.join(discovery.path, common_1.HALO1_MAPS_RELPATH); + try { + const fileEntries = yield vortex_api_1.fs.readdirAsync(halo1MapsPath); + if (fileEntries.length < MAP_NUMBER_CONSTRAINT) { + throw new Error('Not enough maps'); + } + return Promise.resolve(undefined); + } + catch (err) { + const result = { + description: { + short: 'Halo: CE Multiplayer maps are missing', + long: 'Your "{{dirPath}}" folder is either missing/inaccessible, or appears to not contain all the required maps. ' + + 'This is usually an indication that you do not have Halo: CE Multiplayer installed. Some mods may not ' + + 'work properly due to a bug in the game engine. Please ensure you have installed CE MP through your game store.', + replace: { + dirPath: halo1MapsPath, + } + }, + severity: 'warning', + }; + return Promise.resolve(result); + } + }); +} +exports.testCEMP = testCEMP; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsMkNBQXdEO0FBRXhELHFDQUF1RDtBQUV2RCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyxTQUFzQixRQUFRLENBQUMsR0FBd0I7O1FBQ3JELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxzQkFBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsZ0JBQU8sQ0FBQyxDQUFDO1FBQzVELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFFRCxNQUFNLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQWtCLENBQUMsQ0FBQztRQUNwRSxJQUFJO1lBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxlQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsRUFBRTtnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixNQUFNLE1BQU0sR0FBc0I7Z0JBQ2hDLFdBQVcsRUFBRTtvQkFDWCxLQUFLLEVBQUUsdUNBQXVDO29CQUM5QyxJQUFJLEVBQUUsNkdBQTZHOzBCQUM3Ryx1R0FBdUc7MEJBQ3ZHLGdIQUFnSDtvQkFDdEgsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxhQUFhO3FCQUN2QjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFBO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztDQUFBO0FBN0JELDRCQTZCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBmcywgc2VsZWN0b3JzLCB0eXBlcywgdXRpbCB9IGZyb20gJ3ZvcnRleC1hcGknO1xyXG5cclxuaW1wb3J0IHsgR0FNRV9JRCwgSEFMTzFfTUFQU19SRUxQQVRIIH0gZnJvbSAnLi9jb21tb24nO1xyXG5cclxuY29uc3QgTUFQX05VTUJFUl9DT05TVFJBSU5UID0gMjg7XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q0VNUChhcGk6IHR5cGVzLklFeHRlbnNpb25BcGkpOiBQcm9taXNlPHR5cGVzLklUZXN0UmVzdWx0PiB7XHJcbiAgY29uc3Qgc3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcclxuICBjb25zdCBkaXNjb3ZlcnkgPSBzZWxlY3RvcnMuZGlzY292ZXJ5QnlHYW1lKHN0YXRlLCBHQU1FX0lEKTtcclxuICBpZiAoZGlzY292ZXJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGhhbG8xTWFwc1BhdGggPSBwYXRoLmpvaW4oZGlzY292ZXJ5LnBhdGgsIEhBTE8xX01BUFNfUkVMUEFUSCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpckFzeW5jKGhhbG8xTWFwc1BhdGgpO1xyXG4gICAgaWYgKGZpbGVFbnRyaWVzLmxlbmd0aCA8IE1BUF9OVU1CRVJfQ09OU1RSQUlOVCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBlbm91Z2ggbWFwcycpOyBcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnN0IHJlc3VsdDogdHlwZXMuSVRlc3RSZXN1bHQgPSB7XHJcbiAgICAgIGRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgc2hvcnQ6ICdIYWxvOiBDRSBNdWx0aXBsYXllciBtYXBzIGFyZSBtaXNzaW5nJyxcclxuICAgICAgICBsb25nOiAnWW91ciBcInt7ZGlyUGF0aH19XCIgZm9sZGVyIGlzIGVpdGhlciBtaXNzaW5nL2luYWNjZXNzaWJsZSwgb3IgYXBwZWFycyB0byBub3QgY29udGFpbiBhbGwgdGhlIHJlcXVpcmVkIG1hcHMuICdcclxuICAgICAgICAgICAgKyAnVGhpcyBpcyB1c3VhbGx5IGFuIGluZGljYXRpb24gdGhhdCB5b3UgZG8gbm90IGhhdmUgSGFsbzogQ0UgTXVsdGlwbGF5ZXIgaW5zdGFsbGVkLiBTb21lIG1vZHMgbWF5IG5vdCAnXHJcbiAgICAgICAgICAgICsgJ3dvcmsgcHJvcGVybHkgZHVlIHRvIGEgYnVnIGluIHRoZSBnYW1lIGVuZ2luZS4gUGxlYXNlIGVuc3VyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgQ0UgTVAgdGhyb3VnaCB5b3VyIGdhbWUgc3RvcmUuJyxcclxuICAgICAgICByZXBsYWNlOiB7XHJcbiAgICAgICAgICBkaXJQYXRoOiBoYWxvMU1hcHNQYXRoLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/game-masterchiefcollection/tests.ts b/game-masterchiefcollection/tests.ts new file mode 100644 index 0000000..f0a792d --- /dev/null +++ b/game-masterchiefcollection/tests.ts @@ -0,0 +1,37 @@ +/* eslint-disable */ +import path from 'path'; +import { fs, selectors, types, util } from 'vortex-api'; + +import { GAME_ID, HALO1_MAPS_RELPATH } from './common'; + +const MAP_NUMBER_CONSTRAINT = 28; +export async function testCEMP(api: types.IExtensionApi): Promise { + const state = api.getState(); + const discovery = selectors.discoveryByGame(state, GAME_ID); + if (discovery === undefined) { + return Promise.resolve(undefined); + } + + const halo1MapsPath = path.join(discovery.path, HALO1_MAPS_RELPATH); + try { + const fileEntries = await fs.readdirAsync(halo1MapsPath); + if (fileEntries.length < MAP_NUMBER_CONSTRAINT) { + throw new Error('Not enough maps'); + } + return Promise.resolve(undefined); + } catch (err) { + const result: types.ITestResult = { + description: { + short: 'Halo: CE Multiplayer maps are missing', + long: 'Your "{{dirPath}}" folder is either missing/inaccessible, or appears to not contain all the required maps. ' + + 'This is usually an indication that you do not have Halo: CE Multiplayer installed. Some mods may not ' + + 'work properly due to a bug in the game engine. Please ensure you have installed CE MP through your game store.', + replace: { + dirPath: halo1MapsPath, + } + }, + severity: 'warning', + } + return Promise.resolve(result); + } +} \ No newline at end of file diff --git a/game-masterchiefcollection/types.js b/game-masterchiefcollection/types.js index 3a2137f..7dbfd62 100644 --- a/game-masterchiefcollection/types.js +++ b/game-masterchiefcollection/types.js @@ -1,3 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSGFsb0dhbWUge1xyXG4gIGludGVybmFsSWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kc1BhdGg6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RJZGVudGlmaWVyIHtcclxuICBNb2RHdWlkOiBzdHJpbmc7XHJcbiAgSG9zdGVkTW9kSWRzPzoge1xyXG4gICAgICBTdGVhbVdvcmtzaG9wSWQ/OiBudW1iZXI7XHJcbiAgfTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElWZXJzaW9uIHtcclxuICBNYWpvcjogbnVtYmVyO1xyXG4gIE1pbm9yOiBudW1iZXI7XHJcbiAgUGF0Y2g6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElUaXRsZURlc2NyaXB0aW9uIHtcclxuICBOZXV0cmFsPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSU1vZENvbnRlbnRzIHtcclxuICBIYXNCYWNrZ3JvdW5kVmlkZW9zPzogYm9vbGVhbjtcclxuICBIYXNOYW1lcGxhdGVzPzogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW1lTW9kQ29udGVudHMge1xyXG4gIEhhc1NoYXJlZEZpbGVzPzogYm9vbGVhbjtcclxuICBIYXNDYW1wYWlnbj86IGJvb2xlYW47XHJcbiAgSGFzU3BhcnRhbk9wcz86IGJvb2xlYW47XHJcbiAgTXVsdGlwbGF5ZXJNYXBzPzogc3RyaW5nW107XHJcbiAgRmlyZWZpZ2h0TWFwcz86IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNb2RDb25maWcge1xyXG4gIE1vZElkZW50aWZpZXI/OiBJTW9kSWRlbnRpZmllcjtcclxuICBNb2RWZXJzaW9uPzogSVZlcnNpb247XHJcbiAgTWluQXBwVmVyc2lvbj86IElWZXJzaW9uO1xyXG4gIE1heEFwcFZlcnNpb24/OiBJVmVyc2lvbjtcclxuICBFbmdpbmU6IHN0cmluZztcclxuICBUaXRsZT86IElUaXRsZURlc2NyaXB0aW9uO1xyXG4gIERlc2NyaXB0aW9uPzogSVRpdGxlRGVzY3JpcHRpb247XHJcbiAgSW5oZXJpdFNoYXJlZEZpbGVzPzogc3RyaW5nO1xyXG4gIE1vZENvbnRlbnRzPzogSU1vZENvbnRlbnRzO1xyXG4gIEdhbWVNb2RDb250ZW50cz86IElHYW1lTW9kQ29udGVudHM7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExhdW5jaGVyQ29uZmlnID0gUHJvbWlzZTx7bGF1bmNoZXI6IHN0cmluZzsgYWRkSW5mbz86IGFueTsgfT47Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSGFsb0dhbWUge1xyXG4gIGludGVybmFsSWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kc1BhdGg6IHN0cmluZztcclxuICBpbWc6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RJZGVudGlmaWVyIHtcclxuICBNb2RHdWlkOiBzdHJpbmc7XHJcbiAgSG9zdGVkTW9kSWRzPzoge1xyXG4gICAgU3RlYW1Xb3Jrc2hvcElkPzogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVmVyc2lvbiB7XHJcbiAgTWFqb3I6IG51bWJlcjtcclxuICBNaW5vcjogbnVtYmVyO1xyXG4gIFBhdGNoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVGl0bGVEZXNjcmlwdGlvbiB7XHJcbiAgTmV1dHJhbD86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RDb250ZW50cyB7XHJcbiAgSGFzQmFja2dyb3VuZFZpZGVvcz86IGJvb2xlYW47XHJcbiAgSGFzTmFtZXBsYXRlcz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FtZU1vZENvbnRlbnRzIHtcclxuICBIYXNTaGFyZWRGaWxlcz86IGJvb2xlYW47XHJcbiAgSGFzQ2FtcGFpZ24/OiBib29sZWFuO1xyXG4gIEhhc1NwYXJ0YW5PcHM/OiBib29sZWFuO1xyXG4gIE11bHRpcGxheWVyTWFwcz86IHN0cmluZ1tdO1xyXG4gIEZpcmVmaWdodE1hcHM/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTW9kQ29uZmlnIHtcclxuICBNb2RJZGVudGlmaWVyPzogSU1vZElkZW50aWZpZXI7XHJcbiAgTW9kVmVyc2lvbj86IElWZXJzaW9uO1xyXG4gIE1pbkFwcFZlcnNpb24/OiBJVmVyc2lvbjtcclxuICBNYXhBcHBWZXJzaW9uPzogSVZlcnNpb247XHJcbiAgRW5naW5lOiBzdHJpbmc7XHJcbiAgVGl0bGU/OiBJVGl0bGVEZXNjcmlwdGlvbjtcclxuICBEZXNjcmlwdGlvbj86IElUaXRsZURlc2NyaXB0aW9uO1xyXG4gIEluaGVyaXRTaGFyZWRGaWxlcz86IHN0cmluZztcclxuICBNb2RDb250ZW50cz86IElNb2RDb250ZW50cztcclxuICBHYW1lTW9kQ29udGVudHM/OiBJR2FtZU1vZENvbnRlbnRzO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBMYXVuY2hlckNvbmZpZyA9IFByb21pc2U8e2xhdW5jaGVyOiBzdHJpbmc7IGFkZEluZm8/OiBhbnk7IH0+OyJdfQ== \ No newline at end of file diff --git a/game-masterchiefcollection/types.ts b/game-masterchiefcollection/types.ts index 40a9319..cfaf6de 100644 --- a/game-masterchiefcollection/types.ts +++ b/game-masterchiefcollection/types.ts @@ -8,7 +8,7 @@ export interface IHaloGame { interface IModIdentifier { ModGuid: string; HostedModIds?: { - SteamWorkshopId?: number; + SteamWorkshopId?: number; }; } From cd9d5902c371b360aa906ed0b2616798d07005b2 Mon Sep 17 00:00:00 2001 From: IDCs Date: Wed, 14 Aug 2024 11:05:39 +0100 Subject: [PATCH 5/5] enhanced CE MP test to only be raised if CE mods are installed --- game-masterchiefcollection/tests.js | 11 ++++++++++- game-masterchiefcollection/tests.ts | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/game-masterchiefcollection/tests.js b/game-masterchiefcollection/tests.js index 654f54c..a0fbcd6 100644 --- a/game-masterchiefcollection/tests.js +++ b/game-masterchiefcollection/tests.js @@ -20,10 +20,19 @@ const MAP_NUMBER_CONSTRAINT = 28; function testCEMP(api) { return __awaiter(this, void 0, void 0, function* () { const state = api.getState(); + const activeGameMode = vortex_api_1.selectors.activeGameId(state); + if (activeGameMode !== common_1.GAME_ID) { + return Promise.resolve(undefined); + } const discovery = vortex_api_1.selectors.discoveryByGame(state, common_1.GAME_ID); if (discovery === undefined) { return Promise.resolve(undefined); } + const mods = vortex_api_1.util.getSafe(state, ['persistent', 'mods', common_1.GAME_ID], {}); + const ceMods = Object.keys(mods).filter(modId => { var _a, _b; return (_b = (_a = mods[modId]) === null || _a === void 0 ? void 0 : _a.attributes) === null || _b === void 0 ? void 0 : _b.haloGames.includes(common_1.HALO_GAMES.halo1.internalId); }); + if (ceMods.length === 0) { + return Promise.resolve(undefined); + } const halo1MapsPath = path_1.default.join(discovery.path, common_1.HALO1_MAPS_RELPATH); try { const fileEntries = yield vortex_api_1.fs.readdirAsync(halo1MapsPath); @@ -50,4 +59,4 @@ function testCEMP(api) { }); } exports.testCEMP = testCEMP; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsMkNBQXdEO0FBRXhELHFDQUF1RDtBQUV2RCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyxTQUFzQixRQUFRLENBQUMsR0FBd0I7O1FBQ3JELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxzQkFBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsZ0JBQU8sQ0FBQyxDQUFDO1FBQzVELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFFRCxNQUFNLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQWtCLENBQUMsQ0FBQztRQUNwRSxJQUFJO1lBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxlQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsRUFBRTtnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixNQUFNLE1BQU0sR0FBc0I7Z0JBQ2hDLFdBQVcsRUFBRTtvQkFDWCxLQUFLLEVBQUUsdUNBQXVDO29CQUM5QyxJQUFJLEVBQUUsNkdBQTZHOzBCQUM3Ryx1R0FBdUc7MEJBQ3ZHLGdIQUFnSDtvQkFDdEgsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxhQUFhO3FCQUN2QjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFBO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztDQUFBO0FBN0JELDRCQTZCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBmcywgc2VsZWN0b3JzLCB0eXBlcywgdXRpbCB9IGZyb20gJ3ZvcnRleC1hcGknO1xyXG5cclxuaW1wb3J0IHsgR0FNRV9JRCwgSEFMTzFfTUFQU19SRUxQQVRIIH0gZnJvbSAnLi9jb21tb24nO1xyXG5cclxuY29uc3QgTUFQX05VTUJFUl9DT05TVFJBSU5UID0gMjg7XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q0VNUChhcGk6IHR5cGVzLklFeHRlbnNpb25BcGkpOiBQcm9taXNlPHR5cGVzLklUZXN0UmVzdWx0PiB7XHJcbiAgY29uc3Qgc3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcclxuICBjb25zdCBkaXNjb3ZlcnkgPSBzZWxlY3RvcnMuZGlzY292ZXJ5QnlHYW1lKHN0YXRlLCBHQU1FX0lEKTtcclxuICBpZiAoZGlzY292ZXJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGhhbG8xTWFwc1BhdGggPSBwYXRoLmpvaW4oZGlzY292ZXJ5LnBhdGgsIEhBTE8xX01BUFNfUkVMUEFUSCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpckFzeW5jKGhhbG8xTWFwc1BhdGgpO1xyXG4gICAgaWYgKGZpbGVFbnRyaWVzLmxlbmd0aCA8IE1BUF9OVU1CRVJfQ09OU1RSQUlOVCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBlbm91Z2ggbWFwcycpOyBcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnN0IHJlc3VsdDogdHlwZXMuSVRlc3RSZXN1bHQgPSB7XHJcbiAgICAgIGRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgc2hvcnQ6ICdIYWxvOiBDRSBNdWx0aXBsYXllciBtYXBzIGFyZSBtaXNzaW5nJyxcclxuICAgICAgICBsb25nOiAnWW91ciBcInt7ZGlyUGF0aH19XCIgZm9sZGVyIGlzIGVpdGhlciBtaXNzaW5nL2luYWNjZXNzaWJsZSwgb3IgYXBwZWFycyB0byBub3QgY29udGFpbiBhbGwgdGhlIHJlcXVpcmVkIG1hcHMuICdcclxuICAgICAgICAgICAgKyAnVGhpcyBpcyB1c3VhbGx5IGFuIGluZGljYXRpb24gdGhhdCB5b3UgZG8gbm90IGhhdmUgSGFsbzogQ0UgTXVsdGlwbGF5ZXIgaW5zdGFsbGVkLiBTb21lIG1vZHMgbWF5IG5vdCAnXHJcbiAgICAgICAgICAgICsgJ3dvcmsgcHJvcGVybHkgZHVlIHRvIGEgYnVnIGluIHRoZSBnYW1lIGVuZ2luZS4gUGxlYXNlIGVuc3VyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgQ0UgTVAgdGhyb3VnaCB5b3VyIGdhbWUgc3RvcmUuJyxcclxuICAgICAgICByZXBsYWNlOiB7XHJcbiAgICAgICAgICBkaXJQYXRoOiBoYWxvMU1hcHNQYXRoLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICB9XHJcbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFDQSxnREFBd0I7QUFDeEIsMkNBQXdEO0FBRXhELHFDQUFtRTtBQUVuRSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyxTQUFzQixRQUFRLENBQUMsR0FBd0I7O1FBQ3JELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLGNBQWMsR0FBRyxzQkFBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLGNBQWMsS0FBSyxnQkFBTyxFQUFFO1lBQzlCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuQztRQUNELE1BQU0sU0FBUyxHQUFHLHNCQUFTLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxnQkFBTyxDQUFDLENBQUM7UUFDNUQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuQztRQUVELE1BQU0sSUFBSSxHQUFHLGlCQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsZ0JBQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLGVBQUMsT0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQywwQ0FBRSxVQUFVLDBDQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7UUFDM0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFDRCxNQUFNLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQWtCLENBQUMsQ0FBQztRQUNwRSxJQUFJO1lBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxlQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsRUFBRTtnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixNQUFNLE1BQU0sR0FBc0I7Z0JBQ2hDLFdBQVcsRUFBRTtvQkFDWCxLQUFLLEVBQUUsdUNBQXVDO29CQUM5QyxJQUFJLEVBQUUsNkdBQTZHOzBCQUM3Ryx1R0FBdUc7MEJBQ3ZHLGdIQUFnSDtvQkFDdEgsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxhQUFhO3FCQUN2QjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFBO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztDQUFBO0FBdENELDRCQXNDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBmcywgc2VsZWN0b3JzLCB0eXBlcywgdXRpbCB9IGZyb20gJ3ZvcnRleC1hcGknO1xyXG5cclxuaW1wb3J0IHsgR0FNRV9JRCwgSEFMTzFfTUFQU19SRUxQQVRILCBIQUxPX0dBTUVTIH0gZnJvbSAnLi9jb21tb24nO1xyXG5cclxuY29uc3QgTUFQX05VTUJFUl9DT05TVFJBSU5UID0gMjg7XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q0VNUChhcGk6IHR5cGVzLklFeHRlbnNpb25BcGkpOiBQcm9taXNlPHR5cGVzLklUZXN0UmVzdWx0PiB7XHJcbiAgY29uc3Qgc3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcclxuICBjb25zdCBhY3RpdmVHYW1lTW9kZSA9IHNlbGVjdG9ycy5hY3RpdmVHYW1lSWQoc3RhdGUpO1xyXG4gIGlmIChhY3RpdmVHYW1lTW9kZSAhPT0gR0FNRV9JRCkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gIH1cclxuICBjb25zdCBkaXNjb3ZlcnkgPSBzZWxlY3RvcnMuZGlzY292ZXJ5QnlHYW1lKHN0YXRlLCBHQU1FX0lEKTtcclxuICBpZiAoZGlzY292ZXJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1vZHMgPSB1dGlsLmdldFNhZmUoc3RhdGUsIFsncGVyc2lzdGVudCcsICdtb2RzJywgR0FNRV9JRF0sIHt9KTtcclxuICBjb25zdCBjZU1vZHMgPSBPYmplY3Qua2V5cyhtb2RzKS5maWx0ZXIobW9kSWQgPT4gbW9kc1ttb2RJZF0/LmF0dHJpYnV0ZXM/LmhhbG9HYW1lcy5pbmNsdWRlcyhIQUxPX0dBTUVTLmhhbG8xLmludGVybmFsSWQpKTtcclxuICBpZiAoY2VNb2RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gIH1cclxuICBjb25zdCBoYWxvMU1hcHNQYXRoID0gcGF0aC5qb2luKGRpc2NvdmVyeS5wYXRoLCBIQUxPMV9NQVBTX1JFTFBBVEgpO1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBmaWxlRW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXJBc3luYyhoYWxvMU1hcHNQYXRoKTtcclxuICAgIGlmIChmaWxlRW50cmllcy5sZW5ndGggPCBNQVBfTlVNQkVSX0NPTlNUUkFJTlQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZW5vdWdoIG1hcHMnKTsgXHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IHR5cGVzLklUZXN0UmVzdWx0ID0ge1xyXG4gICAgICBkZXNjcmlwdGlvbjoge1xyXG4gICAgICAgIHNob3J0OiAnSGFsbzogQ0UgTXVsdGlwbGF5ZXIgbWFwcyBhcmUgbWlzc2luZycsXHJcbiAgICAgICAgbG9uZzogJ1lvdXIgXCJ7e2RpclBhdGh9fVwiIGZvbGRlciBpcyBlaXRoZXIgbWlzc2luZy9pbmFjY2Vzc2libGUsIG9yIGFwcGVhcnMgdG8gbm90IGNvbnRhaW4gYWxsIHRoZSByZXF1aXJlZCBtYXBzLiAnXHJcbiAgICAgICAgICAgICsgJ1RoaXMgaXMgdXN1YWxseSBhbiBpbmRpY2F0aW9uIHRoYXQgeW91IGRvIG5vdCBoYXZlIEhhbG86IENFIE11bHRpcGxheWVyIGluc3RhbGxlZC4gU29tZSBtb2RzIG1heSBub3QgJ1xyXG4gICAgICAgICAgICArICd3b3JrIHByb3Blcmx5IGR1ZSB0byBhIGJ1ZyBpbiB0aGUgZ2FtZSBlbmdpbmUuIFBsZWFzZSBlbnN1cmUgeW91IGhhdmUgaW5zdGFsbGVkIENFIE1QIHRocm91Z2ggeW91ciBnYW1lIHN0b3JlLicsXHJcbiAgICAgICAgcmVwbGFjZToge1xyXG4gICAgICAgICAgZGlyUGF0aDogaGFsbzFNYXBzUGF0aCxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgfVxyXG59Il19 \ No newline at end of file diff --git a/game-masterchiefcollection/tests.ts b/game-masterchiefcollection/tests.ts index f0a792d..e05120d 100644 --- a/game-masterchiefcollection/tests.ts +++ b/game-masterchiefcollection/tests.ts @@ -2,16 +2,25 @@ import path from 'path'; import { fs, selectors, types, util } from 'vortex-api'; -import { GAME_ID, HALO1_MAPS_RELPATH } from './common'; +import { GAME_ID, HALO1_MAPS_RELPATH, HALO_GAMES } from './common'; const MAP_NUMBER_CONSTRAINT = 28; export async function testCEMP(api: types.IExtensionApi): Promise { const state = api.getState(); + const activeGameMode = selectors.activeGameId(state); + if (activeGameMode !== GAME_ID) { + return Promise.resolve(undefined); + } const discovery = selectors.discoveryByGame(state, GAME_ID); if (discovery === undefined) { return Promise.resolve(undefined); } + const mods = util.getSafe(state, ['persistent', 'mods', GAME_ID], {}); + const ceMods = Object.keys(mods).filter(modId => mods[modId]?.attributes?.haloGames.includes(HALO_GAMES.halo1.internalId)); + if (ceMods.length === 0) { + return Promise.resolve(undefined); + } const halo1MapsPath = path.join(discovery.path, HALO1_MAPS_RELPATH); try { const fileEntries = await fs.readdirAsync(halo1MapsPath);