From 09d258670aba47a2a0783ee8c443083a89342336 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 19:26:11 +0300 Subject: [PATCH 001/177] create mod meta information when importing curseforge pack Signed-off-by: Trial97 --- .../minecraft/mod/tasks/LocalModUpdateTask.h | 4 +- launcher/modplatform/EnsureMetadataTask.h | 4 +- .../modplatform/flame/FileResolvingTask.cpp | 294 ++++++++++-------- .../modplatform/flame/FileResolvingTask.h | 39 ++- .../flame/FlameInstanceCreationTask.cpp | 77 +++-- .../flame/FlameInstanceCreationTask.h | 2 +- launcher/modplatform/flame/PackManifest.cpp | 32 -- launcher/modplatform/flame/PackManifest.h | 14 +- 8 files changed, 243 insertions(+), 223 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h index 080999294..5447083ba 100644 --- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h +++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h @@ -42,6 +42,6 @@ class LocalModUpdateTask : public Task { private: QDir m_index_dir; - ModPlatform::IndexedPack& m_mod; - ModPlatform::IndexedVersion& m_mod_version; + ModPlatform::IndexedPack m_mod; + ModPlatform::IndexedVersion m_mod_version; }; diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index 2f276e5a0..a32a9fce1 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -1,14 +1,14 @@ #pragma once #include "ModIndex.h" -#include "net/NetJob.h" #include "modplatform/helpers/HashUtils.h" #include "tasks/ConcurrentTask.h" +#include + class Mod; -class QDir; class EnsureMetadataTask : public Task { Q_OBJECT diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 8d23896d9..7a6c80f95 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -1,86 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "FileResolvingTask.h" +#include #include "Json.h" +#include "QObjectPtr.h" #include "modplatform/ModIndex.h" -#include "net/ApiDownload.h" -#include "net/ApiUpload.h" -#include "net/Upload.h" +#include "modplatform/flame/FlameAPI.h" +#include "modplatform/flame/FlameModIndex.h" +#include "modplatform/modrinth/ModrinthAPI.h" #include "modplatform/modrinth/ModrinthPackIndex.h" +#include "net/NetJob.h" +#include "tasks/Task.h" + +static const FlameAPI flameAPI; +static ModrinthAPI modrinthAPI; Flame::FileResolvingTask::FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess) - : m_network(network), m_toProcess(toProcess) + : m_network(network), m_manifest(toProcess) {} bool Flame::FileResolvingTask::abort() { bool aborted = true; - if (m_dljob) - aborted &= m_dljob->abort(); - if (m_checkJob) - aborted &= m_checkJob->abort(); + if (m_task) { + aborted = m_task->abort(); + } return aborted ? Task::abort() : false; } void Flame::FileResolvingTask::executeTask() { - if (m_toProcess.files.isEmpty()) { // no file to resolve so leave it empty and emit success immediately + if (m_manifest.files.isEmpty()) { // no file to resolve so leave it empty and emit success immediately emitSucceeded(); return; } setStatus(tr("Resolving mod IDs...")); setProgress(0, 3); - m_dljob.reset(new NetJob("Mod id resolver", m_network)); - result.reset(new QByteArray()); - // build json data to send - QJsonObject object; - - object["fileIds"] = QJsonArray::fromVariantList( - std::accumulate(m_toProcess.files.begin(), m_toProcess.files.end(), QVariantList(), [](QVariantList& l, const File& s) { - l.push_back(s.fileId); - return l; - })); - QByteArray data = Json::toText(object); - auto dl = Net::ApiUpload::makeByteArray(QUrl("https://api.curseforge.com/v1/mods/files"), result, data); - m_dljob->addNetAction(dl); + m_result.reset(new QByteArray()); + + QStringList fileIds; + for (auto file : m_manifest.files) { + fileIds.push_back(QString::number(file.fileId)); + } + m_task = flameAPI.getFiles(fileIds, m_result); auto step_progress = std::make_shared(); - connect(m_dljob.get(), &NetJob::finished, this, [this, step_progress]() { + connect(m_task.get(), &Task::finished, this, [this, step_progress]() { step_progress->state = TaskStepState::Succeeded; stepProgress(*step_progress); netJobFinished(); }); - connect(m_dljob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { step_progress->state = TaskStepState::Failed; stepProgress(*step_progress); emitFailed(reason); }); - connect(m_dljob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_dljob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { qDebug() << "Resolve slug progress" << current << total; step_progress->update(current, total); stepProgress(*step_progress); }); - connect(m_dljob.get(), &NetJob::status, this, [this, step_progress](QString status) { + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { step_progress->status = status; stepProgress(*step_progress); }); - m_dljob->start(); + m_task->start(); } void Flame::FileResolvingTask::netJobFinished() { setProgress(1, 3); // job to check modrinth for blocked projects - m_checkJob.reset(new NetJob("Modrinth check", m_network)); - blockedProjects = QMap>(); + auto checkJob = makeShared("Modrinth check", m_network); QJsonDocument doc; QJsonArray array; try { - doc = Json::requireDocument(*result); + doc = Json::requireDocument(*m_result); array = Json::requireArray(doc.object()["data"]); } catch (Json::JsonException& e) { qCritical() << "Non-JSON data returned from the CF API"; @@ -91,125 +108,156 @@ void Flame::FileResolvingTask::netJobFinished() return; } + QStringList hashes; for (QJsonValueRef file : array) { - auto fileid = Json::requireInteger(Json::requireObject(file)["id"]); - auto& out = m_toProcess.files[fileid]; try { - out.parseFromObject(Json::requireObject(file)); - } catch ([[maybe_unused]] const JSONValidationError& e) { - qDebug() << "Blocked mod on curseforge" << out.fileName; - auto hash = out.hash; - if (!hash.isEmpty()) { - auto url = QString("https://api.modrinth.com/v2/version_file/%1?algorithm=sha1").arg(hash); - auto output = std::make_shared(); - auto dl = Net::ApiDownload::makeByteArray(QUrl(url), output); - QObject::connect(dl.get(), &Net::ApiDownload::succeeded, [&out]() { out.resolved = true; }); - - m_checkJob->addNetAction(dl); - blockedProjects.insert(&out, output); + auto obj = Json::requireObject(file); + auto version = FlameMod::loadIndexedPackVersion(obj); + auto fileid = version.fileId.toInt(); + m_manifest.files[fileid].version = version; + auto url = QUrl(version.downloadUrl, QUrl::TolerantMode); + if (!url.isValid() && "sha1" == version.hash_type && !version.hash.isEmpty()) { + hashes.push_back(version.hash); } + } catch (Json::JsonException& e) { + qCritical() << "Non-JSON data returned from the CF API"; + qCritical() << e.cause(); + + emitFailed(tr("Invalid data returned from the API.")); + + return; } } + if (hashes.isEmpty()) { + getFlameProjects(); + return; + } + m_result.reset(new QByteArray()); + m_task = modrinthAPI.currentVersions(hashes, "sha1", m_result); auto step_progress = std::make_shared(); - connect(m_checkJob.get(), &NetJob::finished, this, [this, step_progress]() { + connect(m_task.get(), &Task::finished, this, [this, step_progress]() { step_progress->state = TaskStepState::Succeeded; stepProgress(*step_progress); - modrinthCheckFinished(); + QJsonParseError parse_error{}; + QJsonDocument doc = QJsonDocument::fromJson(*m_result, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from Modrinth::CurrentVersions at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *m_result; + + failed(parse_error.errorString()); + return; + } + + try { + auto entries = Json::requireObject(doc); + for (auto& out : m_manifest.files) { + auto url = QUrl(out.version.downloadUrl, QUrl::TolerantMode); + if (!url.isValid() && "sha1" == out.version.hash_type && !out.version.hash.isEmpty()) { + try { + auto entry = Json::requireObject(entries, out.version.hash); + + auto file = Modrinth::loadIndexedPackVersion(entry); + + // If there's more than one mod loader for this version, we can't know for sure + // which file is relative to each loader, so it's best to not use any one and + // let the user download it manually. + if (!file.loaders || hasSingleModLoaderSelected(file.loaders)) { + out.version.downloadUrl = file.downloadUrl; + qDebug() << "Found alternative on modrinth " << out.version.fileName; + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << entries; + } + } + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << doc; + } + getFlameProjects(); }); - connect(m_checkJob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { step_progress->state = TaskStepState::Failed; stepProgress(*step_progress); }); - connect(m_checkJob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_checkJob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { qDebug() << "Resolve slug progress" << current << total; step_progress->update(current, total); stepProgress(*step_progress); }); - connect(m_checkJob.get(), &NetJob::status, this, [this, step_progress](QString status) { + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { step_progress->status = status; stepProgress(*step_progress); }); - m_checkJob->start(); + m_task->start(); } -void Flame::FileResolvingTask::modrinthCheckFinished() +void Flame::FileResolvingTask::getFlameProjects() { setProgress(2, 3); - qDebug() << "Finished with blocked mods : " << blockedProjects.size(); + m_result.reset(new QByteArray()); + QStringList addonIds; + for (auto file : m_manifest.files) { + addonIds.push_back(QString::number(file.projectId)); + } - for (auto it = blockedProjects.keyBegin(); it != blockedProjects.keyEnd(); it++) { - auto& out = *it; - auto bytes = blockedProjects[out]; - if (!out->resolved) { - continue; - } + m_task = flameAPI.getProjects(addonIds, m_result); - QJsonDocument doc = QJsonDocument::fromJson(*bytes); - auto obj = doc.object(); - auto file = Modrinth::loadIndexedPackVersion(obj); - - // If there's more than one mod loader for this version, we can't know for sure - // which file is relative to each loader, so it's best to not use any one and - // let the user download it manually. - if (!file.loaders || hasSingleModLoaderSelected(file.loaders)) { - out->url = file.downloadUrl; - qDebug() << "Found alternative on modrinth " << out->fileName; - } else { - out->resolved = false; + auto step_progress = std::make_shared(); + connect(m_task.get(), &Task::succeeded, this, [this, step_progress] { + QJsonParseError parse_error{}; + auto doc = QJsonDocument::fromJson(*m_result, &parse_error); + if (parse_error.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from Modrinth projects task at " << parse_error.offset + << " reason: " << parse_error.errorString(); + qWarning() << *m_result; + return; } - } - // copy to an output list and filter out projects found on modrinth - auto block = std::make_shared>(); - auto it = blockedProjects.keys(); - std::copy_if(it.begin(), it.end(), std::back_inserter(*block), [](File* f) { return !f->resolved; }); - // Display not found mods early - if (!block->empty()) { - // blocked mods found, we need the slug for displaying.... we need another job :D ! - m_slugJob.reset(new NetJob("Slug Job", m_network)); - int index = 0; - for (auto mod : *block) { - auto projectId = mod->projectId; - auto output = std::make_shared(); - auto url = QString("https://api.curseforge.com/v1/mods/%1").arg(projectId); - auto dl = Net::ApiDownload::makeByteArray(url, output); - qDebug() << "Fetching url slug for file:" << mod->fileName; - QObject::connect(dl.get(), &Net::ApiDownload::succeeded, [block, index, output]() { - auto mod = block->at(index); // use the shared_ptr so it is captured and only freed when we are done - auto json = QJsonDocument::fromJson(*output); - auto base = - Json::requireString(Json::requireObject(Json::requireObject(Json::requireObject(json), "data"), "links"), "websiteUrl"); - auto link = QString("%1/download/%2").arg(base, QString::number(mod->fileId)); - mod->websiteUrl = link; - }); - m_slugJob->addNetAction(dl); - index++; + + try { + QJsonArray entries; + entries = Json::requireArray(Json::requireObject(doc), "data"); + + for (auto entry : entries) { + auto entry_obj = Json::requireObject(entry); + auto id = Json::requireInteger(entry_obj, "id"); + auto file = std::find_if(m_manifest.files.begin(), m_manifest.files.end(), + [id](const Flame::File& file) { return file.projectId == id; }); + if (file == m_manifest.files.end()) { + continue; + } + + setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(file->version.fileName)); + FlameMod::loadIndexedPack(file->pack, entry_obj); + } + } catch (Json::JsonException& e) { + qDebug() << e.cause(); + qDebug() << doc; } - auto step_progress = std::make_shared(); - connect(m_slugJob.get(), &NetJob::succeeded, this, [this, step_progress]() { - step_progress->state = TaskStepState::Succeeded; - stepProgress(*step_progress); - emitSucceeded(); - }); - connect(m_slugJob.get(), &NetJob::failed, this, [this, step_progress](QString reason) { - step_progress->state = TaskStepState::Failed; - stepProgress(*step_progress); - emitFailed(reason); - }); - connect(m_slugJob.get(), &NetJob::stepProgress, this, &FileResolvingTask::propagateStepProgress); - connect(m_slugJob.get(), &NetJob::progress, this, [this, step_progress](qint64 current, qint64 total) { - qDebug() << "Resolve slug progress" << current << total; - step_progress->update(current, total); - stepProgress(*step_progress); - }); - connect(m_slugJob.get(), &NetJob::status, this, [this, step_progress](QString status) { - step_progress->status = status; - stepProgress(*step_progress); - }); - - m_slugJob->start(); - } else { + step_progress->state = TaskStepState::Succeeded; + stepProgress(*step_progress); emitSucceeded(); - } + }); + + connect(m_task.get(), &Task::failed, this, [this, step_progress](QString reason) { + step_progress->state = TaskStepState::Failed; + stepProgress(*step_progress); + emitFailed(reason); + }); + connect(m_task.get(), &Task::stepProgress, this, &FileResolvingTask::propagateStepProgress); + connect(m_task.get(), &Task::progress, this, [this, step_progress](qint64 current, qint64 total) { + qDebug() << "Resolve slug progress" << current << total; + step_progress->update(current, total); + stepProgress(*step_progress); + }); + connect(m_task.get(), &Task::status, this, [this, step_progress](QString status) { + step_progress->status = status; + stepProgress(*step_progress); + }); + + m_task->start(); } diff --git a/launcher/modplatform/flame/FileResolvingTask.h b/launcher/modplatform/flame/FileResolvingTask.h index c280827af..edd9fce9a 100644 --- a/launcher/modplatform/flame/FileResolvingTask.h +++ b/launcher/modplatform/flame/FileResolvingTask.h @@ -1,7 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once +#include + #include "PackManifest.h" -#include "net/NetJob.h" #include "tasks/Task.h" namespace Flame { @@ -9,12 +27,12 @@ class FileResolvingTask : public Task { Q_OBJECT public: explicit FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess); - virtual ~FileResolvingTask(){}; + virtual ~FileResolvingTask() = default; bool canAbort() const override { return true; } bool abort() override; - const Flame::Manifest& getResults() const { return m_toProcess; } + const Flame::Manifest& getResults() const { return m_manifest; } protected: virtual void executeTask() override; @@ -22,16 +40,13 @@ class FileResolvingTask : public Task { protected slots: void netJobFinished(); + private: + void getFlameProjects(); + private: /* data */ shared_qobject_ptr m_network; - Flame::Manifest m_toProcess; - std::shared_ptr result; - NetJob::Ptr m_dljob; - NetJob::Ptr m_checkJob; - NetJob::Ptr m_slugJob; - - void modrinthCheckFinished(); - - QMap> blockedProjects; + Flame::Manifest m_manifest; + std::shared_ptr m_result; + Task::Ptr m_task; }; } // namespace Flame diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index a629cc15b..b8c40ee42 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -35,8 +35,11 @@ #include "FlameInstanceCreationTask.h" +#include "QObjectPtr.h" +#include "minecraft/mod/tasks/LocalModUpdateTask.h" #include "modplatform/flame/FileResolvingTask.h" #include "modplatform/flame/FlameAPI.h" +#include "modplatform/flame/FlameModIndex.h" #include "modplatform/flame/PackManifest.h" #include "Application.h" @@ -51,6 +54,7 @@ #include "settings/INISettingsObject.h" +#include "tasks/ConcurrentTask.h" #include "ui/dialogs/BlockedModsDialog.h" #include "ui/dialogs/CustomMessageBox.h" @@ -58,7 +62,6 @@ #include #include "meta/Index.h" -#include "meta/VersionList.h" #include "minecraft/World.h" #include "minecraft/mod/tasks/LocalResourceParse.h" #include "net/ApiDownload.h" @@ -208,8 +211,7 @@ bool FlameCreationTask::updateInstance() Flame::File file; // We don't care about blocked mods, we just need local data to delete the file - file.parseFromObject(entry_obj, false); - + file.version = FlameMod::loadIndexedPackVersion(entry_obj); auto id = Json::requireInteger(entry_obj, "id"); old_files.insert(id, file); } @@ -219,10 +221,10 @@ bool FlameCreationTask::updateInstance() // Delete the files for (auto& file : old_files) { - if (file.fileName.isEmpty() || file.targetFolder.isEmpty()) + if (file.version.fileName.isEmpty() || file.targetFolder.isEmpty()) continue; - QString relative_path(FS::PathCombine(file.targetFolder, file.fileName)); + QString relative_path(FS::PathCombine(file.targetFolder, file.version.fileName)); qDebug() << "Scheduling" << relative_path << "for removal"; m_files_to_remove.append(old_minecraft_dir.absoluteFilePath(relative_path)); } @@ -471,15 +473,15 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) QList blocked_mods; auto anyBlocked = false; for (const auto& result : results.files.values()) { - if (result.fileName.endsWith(".zip")) { - m_ZIP_resources.append(std::make_pair(result.fileName, result.targetFolder)); + if (result.version.fileName.endsWith(".zip")) { + m_ZIP_resources.append(std::make_pair(result.version.fileName, result.targetFolder)); } - if (!result.resolved || result.url.isEmpty()) { + if (result.version.downloadUrl.isEmpty()) { BlockedMod blocked_mod; - blocked_mod.name = result.fileName; - blocked_mod.websiteUrl = result.websiteUrl; - blocked_mod.hash = result.hash; + blocked_mod.name = result.version.fileName; + blocked_mod.websiteUrl = QString("%1/download/%2").arg(result.pack.websiteUrl, QString::number(result.fileId)); + blocked_mod.hash = result.version.hash; blocked_mod.matched = false; blocked_mod.localPath = ""; blocked_mod.targetFolder = result.targetFolder; @@ -521,7 +523,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) QStringList optionalFiles; for (auto& result : results) { if (!result.required) { - optionalFiles << FS::PathCombine(result.targetFolder, result.fileName); + optionalFiles << FS::PathCombine(result.targetFolder, result.version.fileName); } } @@ -537,7 +539,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) selectedOptionalMods = optionalModDialog.getResult(); } for (const auto& result : results) { - auto fileName = result.fileName; + auto fileName = result.version.fileName; fileName = FS::RemoveInvalidPathChars(fileName); auto relpath = FS::PathCombine(result.targetFolder, fileName); @@ -548,36 +550,16 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) relpath = FS::PathCombine("minecraft", relpath); auto path = FS::PathCombine(m_stagingPath, relpath); - switch (result.type) { - case Flame::File::Type::Folder: { - logWarning(tr("This 'Folder' may need extracting: %1").arg(relpath)); - // fallthrough intentional, we treat these as plain old mods and dump them wherever. - } - /* fallthrough */ - case Flame::File::Type::SingleFile: - case Flame::File::Type::Mod: { - if (!result.url.isEmpty()) { - qDebug() << "Will download" << result.url << "to" << path; - auto dl = Net::ApiDownload::makeFile(result.url, path); - m_files_job->addNetAction(dl); - } - break; - } - case Flame::File::Type::Modpack: - logWarning(tr("Nesting modpacks in modpacks is not implemented, nothing was downloaded: %1").arg(relpath)); - break; - case Flame::File::Type::Cmod2: - case Flame::File::Type::Ctoc: - case Flame::File::Type::Unknown: - logWarning(tr("Unrecognized/unhandled PackageType for: %1").arg(relpath)); - break; + if (!result.version.downloadUrl.isEmpty()) { + qDebug() << "Will download" << result.version.downloadUrl << "to" << path; + auto dl = Net::ApiDownload::makeFile(result.version.downloadUrl, path); + m_files_job->addNetAction(dl); } } - m_mod_id_resolver.reset(); - connect(m_files_job.get(), &NetJob::succeeded, this, [&]() { + connect(m_files_job.get(), &NetJob::finished, this, [this, &loop]() { m_files_job.reset(); - validateZIPResources(); + validateZIPResources(loop); }); connect(m_files_job.get(), &NetJob::failed, [&](QString reason) { m_files_job.reset(); @@ -588,7 +570,6 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) setProgress(current, total); }); connect(m_files_job.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress); - connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); setStatus(tr("Downloading mods...")); m_files_job->start(); @@ -626,9 +607,10 @@ void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) setAbortable(true); } -void FlameCreationTask::validateZIPResources() +void FlameCreationTask::validateZIPResources(QEventLoop& loop) { qDebug() << "Validating whether resources stored as .zip are in the right place"; + QStringList zipMods; for (auto [fileName, targetFolder] : m_ZIP_resources) { qDebug() << "Checking" << fileName << "..."; auto localPath = FS::PathCombine(m_stagingPath, "minecraft", targetFolder, fileName); @@ -668,6 +650,7 @@ void FlameCreationTask::validateZIPResources() switch (type) { case PackedResourceType::Mod: validatePath(fileName, targetFolder, "mods"); + zipMods.push_back(fileName); break; case PackedResourceType::ResourcePack: validatePath(fileName, targetFolder, "resourcepacks"); @@ -693,4 +676,16 @@ void FlameCreationTask::validateZIPResources() break; } } + auto task = makeShared(this, "CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + auto results = m_mod_id_resolver->getResults().files; + auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + for (auto file : results) { + if (file.targetFolder != "mods" || (file.version.fileName.endsWith(".zip") && !zipMods.contains(file.version.fileName))) { + continue; + } + task->addTask(makeShared(folder, file.pack, file.version)); + } + connect(task.get(), &Task::finished, &loop, &QEventLoop::quit); + m_process_update_file_info_job = task; + task->start(); } diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.h b/launcher/modplatform/flame/FlameInstanceCreationTask.h index 02ad48f2e..28ab176c2 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.h +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.h @@ -74,7 +74,7 @@ class FlameCreationTask final : public InstanceCreationTask { void idResolverSucceeded(QEventLoop&); void setupDownloadJob(QEventLoop&); void copyBlockedMods(QList const& blocked_mods); - void validateZIPResources(); + void validateZIPResources(QEventLoop& loop); QString getVersionForLoader(QString uid, QString loaderType, QString version, QString mcVersion); private: diff --git a/launcher/modplatform/flame/PackManifest.cpp b/launcher/modplatform/flame/PackManifest.cpp index 40a523d31..e576a6a84 100644 --- a/launcher/modplatform/flame/PackManifest.cpp +++ b/launcher/modplatform/flame/PackManifest.cpp @@ -68,35 +68,3 @@ void Flame::loadManifest(Flame::Manifest& m, const QString& filepath) } loadManifestV1(m, obj); } - -bool Flame::File::parseFromObject(const QJsonObject& obj, bool throw_on_blocked) -{ - fileName = Json::requireString(obj, "fileName"); - // This is a piece of a Flame project JSON pulled out into the file metadata (here) for convenience - // It is also optional - type = File::Type::SingleFile; - - targetFolder = "mods"; - - // get the hash - hash = QString(); - auto hashes = Json::ensureArray(obj, "hashes"); - for (QJsonValueRef item : hashes) { - auto hobj = Json::requireObject(item); - auto algo = Json::requireInteger(hobj, "algo"); - auto value = Json::requireString(hobj, "value"); - if (algo == 1) { - hash = value; - } - } - - // may throw, if the project is blocked - QString rawUrl = Json::ensureString(obj, "downloadUrl"); - url = QUrl(rawUrl, QUrl::TolerantMode); - if (!url.isValid() && throw_on_blocked) { - throw JSONValidationError(QString("Invalid URL: %1").arg(rawUrl)); - } - - resolved = true; - return true; -} diff --git a/launcher/modplatform/flame/PackManifest.h b/launcher/modplatform/flame/PackManifest.h index 4417c2430..49a0b2d68 100644 --- a/launcher/modplatform/flame/PackManifest.h +++ b/launcher/modplatform/flame/PackManifest.h @@ -40,26 +40,20 @@ #include #include #include +#include "modplatform/ModIndex.h" namespace Flame { struct File { - // NOTE: throws JSONValidationError - bool parseFromObject(const QJsonObject& object, bool throw_on_blocked = true); - int projectId = 0; int fileId = 0; // NOTE: the opposite to 'optional' bool required = true; - QString hash; - // NOTE: only set on blocked files ! Empty otherwise. - QString websiteUrl; + + ModPlatform::IndexedPack pack; + ModPlatform::IndexedVersion version; // our - bool resolved = false; - QString fileName; - QUrl url; QString targetFolder = QStringLiteral("mods"); - enum class Type { Unknown, Folder, Ctoc, SingleFile, Cmod2, Modpack, Mod } type = Type::Mod; }; struct Modloader { From 1021222c955b4b5f7416e91f51c619af118a2bf4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 20:28:52 +0300 Subject: [PATCH 002/177] create mod meta information when importing modrinth pack Signed-off-by: Trial97 --- launcher/modplatform/EnsureMetadataTask.cpp | 3 + launcher/modplatform/EnsureMetadataTask.h | 1 + .../modrinth/ModrinthInstanceCreationTask.cpp | 67 ++++++++++++++----- .../modrinth/ModrinthInstanceCreationTask.h | 9 +-- 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index 43acea1a2..f6f49f38d 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -42,6 +42,9 @@ EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform: m_hashing_task->addTask(hash_task); } } +EnsureMetadataTask::EnsureMetadataTask(QHash& mods, QDir dir, ModPlatform::ResourceProvider prov) + : Task(nullptr), m_mods(mods), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) +{} Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Mod* mod) { diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index a32a9fce1..631b32ae7 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -16,6 +16,7 @@ class EnsureMetadataTask : public Task { public: EnsureMetadataTask(Mod*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); EnsureMetadataTask(QList&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); + EnsureMetadataTask(QHash&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH); ~EnsureMetadataTask() = default; diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index c0806a638..acbc7376c 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -5,8 +5,12 @@ #include "InstanceList.h" #include "Json.h" +#include "QObjectPtr.h" +#include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" +#include "minecraft/mod/Mod.h" +#include "modplatform/EnsureMetadataTask.h" #include "modplatform/helpers/OverrideUtils.h" #include "modplatform/modrinth/ModrinthPackManifest.h" @@ -21,6 +25,7 @@ #include #include +#include #include bool ModrinthCreationTask::abort() @@ -29,8 +34,8 @@ bool ModrinthCreationTask::abort() return false; m_abort = true; - if (m_files_job) - m_files_job->abort(); + if (m_task) + m_task->abort(); return Task::abort(); } @@ -234,11 +239,11 @@ bool ModrinthCreationTask::createInstance() instance.setName(name()); instance.saveNow(); - m_files_job.reset(new NetJob(tr("Mod Download Modrinth"), APPLICATION->network())); + auto downloadMods = makeShared(tr("Mod Download Modrinth"), APPLICATION->network()); auto root_modpack_path = FS::PathCombine(m_stagingPath, m_root_path); auto root_modpack_url = QUrl::fromLocalFile(root_modpack_path); - + QHash mods; for (auto file : m_files) { auto fileName = file.path; fileName = FS::RemoveInvalidPathChars(fileName); @@ -249,20 +254,27 @@ bool ModrinthCreationTask::createInstance() .arg(fileName)); return false; } + if (fileName.startsWith("mods/")) { + auto mod = new Mod(file_path); + ModDetails d; + d.mod_id = file_path; + mod->setDetails(d); + mods[file.hash.toHex()] = mod; + } qDebug() << "Will try to download" << file.downloads.front() << "to" << file_path; auto dl = Net::ApiDownload::makeFile(file.downloads.dequeue(), file_path); dl->addValidator(new Net::ChecksumValidator(file.hashAlgorithm, file.hash)); - m_files_job->addNetAction(dl); + downloadMods->addNetAction(dl); if (!file.downloads.empty()) { // FIXME: This really needs to be put into a ConcurrentTask of // MultipleOptionsTask's , once those exist :) auto param = dl.toWeakRef(); - connect(dl.get(), &Task::failed, [this, &file, file_path, param] { + connect(dl.get(), &Task::failed, [&file, file_path, param, downloadMods] { auto ndl = Net::ApiDownload::makeFile(file.downloads.dequeue(), file_path); ndl->addValidator(new Net::ChecksumValidator(file.hashAlgorithm, file.hash)); - m_files_job->addNetAction(ndl); + downloadMods->addNetAction(ndl); if (auto shared = param.lock()) shared->succeeded(); }); @@ -271,23 +283,44 @@ bool ModrinthCreationTask::createInstance() bool ended_well = false; - connect(m_files_job.get(), &NetJob::succeeded, this, [&]() { ended_well = true; }); - connect(m_files_job.get(), &NetJob::failed, [&](const QString& reason) { + connect(downloadMods.get(), &NetJob::succeeded, this, [&]() { ended_well = true; }); + connect(downloadMods.get(), &NetJob::failed, [&](const QString& reason) { ended_well = false; setError(reason); }); - connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); - connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { + connect(downloadMods.get(), &NetJob::finished, &loop, &QEventLoop::quit); + connect(downloadMods.get(), &NetJob::progress, [&](qint64 current, qint64 total) { setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); setProgress(current, total); }); - connect(m_files_job.get(), &NetJob::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); + connect(downloadMods.get(), &NetJob::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); setStatus(tr("Downloading mods...")); - m_files_job->start(); + downloadMods->start(); + m_task = downloadMods; loop.exec(); + QEventLoop ensureMetaLoop; + QDir folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); + connect(ensureMetadataTask.get(), &Task::succeeded, this, [&]() { ended_well = true; }); + connect(ensureMetadataTask.get(), &Task::finished, &ensureMetaLoop, &QEventLoop::quit); + connect(ensureMetadataTask.get(), &Task::progress, [&](qint64 current, qint64 total) { + setDetails(tr("%1 out of %2 complete").arg(current).arg(total)); + setProgress(current, total); + }); + connect(ensureMetadataTask.get(), &Task::stepProgress, this, &ModrinthCreationTask::propagateStepProgress); + + ensureMetadataTask->start(); + m_task = ensureMetadataTask; + + ensureMetaLoop.exec(); + for (auto m : mods) { + delete m; + } + mods.clear(); + // Update information of the already installed instance, if any. if (m_instance && ended_well) { setAbortable(false); @@ -348,11 +381,11 @@ bool ModrinthCreationTask::parseManifest(const QString& index_path, QJsonObject hashes = Json::requireObject(modInfo, "hashes"); QString hash; QCryptographicHash::Algorithm hashAlgorithm; - hash = Json::ensureString(hashes, "sha1"); - hashAlgorithm = QCryptographicHash::Sha1; + hash = Json::ensureString(hashes, "sha512"); + hashAlgorithm = QCryptographicHash::Sha512; if (hash.isEmpty()) { - hash = Json::ensureString(hashes, "sha512"); - hashAlgorithm = QCryptographicHash::Sha512; + hash = Json::ensureString(hashes, "sha1"); + hashAlgorithm = QCryptographicHash::Sha1; if (hash.isEmpty()) { hash = Json::ensureString(hashes, "sha256"); hashAlgorithm = QCryptographicHash::Sha256; diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h index f07734a58..0879474cf 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h @@ -1,15 +1,10 @@ #pragma once +#include "BaseInstance.h" #include "InstanceCreationTask.h" -#include - -#include "minecraft/MinecraftInstance.h" - #include "modplatform/modrinth/ModrinthPackManifest.h" -#include "net/NetJob.h" - class ModrinthCreationTask final : public InstanceCreationTask { Q_OBJECT @@ -43,7 +38,7 @@ class ModrinthCreationTask final : public InstanceCreationTask { QString m_managed_id, m_managed_version_id, m_managed_name; std::vector m_files; - NetJob::Ptr m_files_job; + Task::Ptr m_task; std::optional m_instance; From 44bf0315ada1715145a8ed91b4f573ec7fcc4092 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:55:58 -0700 Subject: [PATCH 003/177] feat(components) recomend the correct lwjgl version for the minecraft version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 12 +++++++++++- launcher/meta/VersionList.h | 3 +++ launcher/ui/pages/instance/VersionPage.cpp | 18 ++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index f21e4594a..09c83e0b1 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -99,7 +99,7 @@ QVariant VersionList::data(const QModelIndex& index, int role) const case VersionPtrRole: return QVariant::fromValue(version); case RecommendedRole: - return version->isRecommended(); + return version->isRecommended() || m_externalRecommendsVersions.contains(version->version()); // FIXME: this should be determined in whatever view/proxy is used... // case LatestRole: return version == getLatestStable(); default: @@ -179,6 +179,16 @@ void VersionList::parse(const QJsonObject& obj) parseVersionList(obj, this); } +void VersionList::addExternalRecomends(const QVector& recomends) +{ + m_externalRecommendsVersions.append(recomends); +} + +void VersionList::clearExternalRecomends() +{ + m_externalRecommendsVersions.clear(); +} + // FIXME: this is dumb, we have 'recommended' as part of the metadata already... static const Meta::Version::Ptr& getBetterVersion(const Meta::Version::Ptr& a, const Meta::Version::Ptr& b) { diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 90e0c8e5e..24ff6a1ce 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -68,6 +68,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void merge(const VersionList::Ptr& other); void mergeFromIndex(const VersionList::Ptr& other); void parse(const QJsonObject& obj) override; + void addExternalRecomends(const QVector& recomends); + void clearExternalRecomends(); signals: void nameChanged(const QString& name); @@ -77,6 +79,7 @@ class VersionList : public BaseVersionList, public BaseEntity { private: QVector m_versions; + QStringList m_externalRecommendsVersions; QHash m_lookup; QString m_uid; QString m_name; diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 807bc5d58..545798499 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -49,8 +49,10 @@ #include #include #include +#include #include "VersionPage.h" +#include "meta/JsonFormat.h" #include "ui/dialogs/InstallLoaderDialog.h" #include "ui_VersionPage.h" @@ -63,11 +65,9 @@ #include "DesktopServices.h" #include "Exception.h" -#include "Version.h" #include "icons/IconList.h" #include "minecraft/PackProfile.h" #include "minecraft/auth/AccountList.h" -#include "minecraft/mod/Mod.h" #include "meta/Index.h" #include "meta/VersionList.h" @@ -370,11 +370,25 @@ void VersionPage::on_actionChange_version_triggered() auto patch = m_profile->getComponent(versionRow); auto name = patch->getName(); auto list = patch->getVersionList(); + list->clearExternalRecomends(); if (!list) { return; } auto uid = list->uid(); + // recommend the correct lwjgl version for the current minecraft version + if (uid == "org.lwjgl" || uid == "org.lwjgl3") { + auto minecraft = m_profile->getComponent("net.minecraft"); + auto lwjglReq = std::find_if(minecraft->m_cachedRequires.cbegin(), minecraft->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (lwjglReq != minecraft->m_cachedRequires.cend()) { + auto lwjglVersion = !lwjglReq->equalsVersion.isEmpty() ? lwjglReq->equalsVersion : lwjglReq->suggests; + if (!lwjglVersion.isEmpty()) { + list->addExternalRecomends({ lwjglVersion }); + } + } + } + VersionSelectDialog vselect(list.get(), tr("Change %1 version").arg(name), this); if (uid == "net.fabricmc.intermediary" || uid == "org.quiltmc.hashed") { vselect.setEmptyString(tr("No intermediary mappings versions are currently available.")); From a791e22853da4c93f006883f78f22a4664f06972 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:46:14 -0700 Subject: [PATCH 004/177] fix(instance components): resolve instance componants when changing minecraft version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 28 +++++++++++++ launcher/meta/VersionList.h | 2 + launcher/minecraft/Component.cpp | 5 +++ launcher/minecraft/PackProfile.cpp | 65 +++++++++++++++++++++++++++++- launcher/minecraft/PackProfile.h | 4 ++ 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 09c83e0b1..0cd33a2b3 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -16,6 +16,7 @@ #include "VersionList.h" #include +#include #include "Application.h" #include "Index.h" @@ -273,4 +274,31 @@ void VersionList::waitToLoad() task->start(); ev.exec(); } + +Version::Ptr VersionList::getRecommendedForParent(const QString& uid, const QString& version) +{ + auto foundExplicit = std::find_if(m_versions.begin(), m_versions.end(), [uid, version](Version::Ptr ver) -> bool { + auto& reqs = ver->requiredSet(); + auto parentReq = std::find_if(reqs.begin(), reqs.end(), [uid, version](const Require& req) -> bool { + return req.uid == uid && req.equalsVersion == version; + }); + return parentReq != reqs.end() && ver->isRecommended(); + }); + if (foundExplicit != m_versions.end()) { + return *foundExplicit; + } + + Version::Ptr latestCompat = nullptr; + for (auto ver : m_versions) { + auto& reqs = ver->requiredSet(); + auto parentReq = std::find_if(reqs.begin(), reqs.end(), [uid, version](const Require& req) -> bool { + return req.uid == uid && req.equalsVersion == version; + }); + if (parentReq != reqs.end()) { + latestCompat = getBetterVersion(latestCompat, ver); + } + } + return latestCompat; +} + } // namespace Meta diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 24ff6a1ce..b746d3232 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -43,6 +43,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void sortVersions() override; BaseVersion::Ptr getRecommended() const override; + Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); + QVariant data(const QModelIndex& index, int role) const override; RoleList providesRoles() const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 32a1deb68..f03ffacc0 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -402,3 +402,8 @@ void Component::updateCachedData() emit dataChanged(); } } + +QDebug operator<<(QDebug d, const Component& comp) { + d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; + return d; +} diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 4b17cdf07..b258d8241 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -38,6 +38,8 @@ */ #include +#include +#include #include #include #include @@ -47,10 +49,14 @@ #include #include #include +#include +#include "Application.h" #include "Exception.h" #include "FileSystem.h" #include "Json.h" +#include "meta/Index.h" +#include "meta/JsonFormat.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" @@ -58,7 +64,6 @@ #include "ComponentUpdateTask.h" #include "PackProfile.h" #include "PackProfile_p.h" -#include "minecraft/mod/Mod.h" #include "modplatform/ModIndex.h" static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, @@ -956,6 +961,35 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (component->revert()) { component->setVersion(version); component->setImportant(important); + component->updateCachedData(); + // remove linked componants to let them reresolve their versions + if (important) { + auto linked = collectTreeLinked(uid); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + if (modloaderMapping.contains(comp->getID())) { + qDebug() << comp->getID() << "is a mod loader, setting new recomended version..."; + auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); + if (versionList) { + auto recomended = versionList->getRecommendedForParent(comp->getID(), version); + if (recomended) { + qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recomended->version(); + setComponentVersion(comp->getID(), recomended->version()); + } else { + qDebug() << "no recomended verison for" << comp->getID(); + } + } else { + qDebug() << "no version list in metadata index for" << comp->getID(); + } + } else { + qDebug() << comp->getID() << ":" << comp->getVersion() << "linked to important component: " << uid + << " | Removing so it re-resolves"; + remove(comp->getID()); + } + } + } return true; } return false; @@ -969,6 +1003,35 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version } } +ComponentContainer PackProfile::collectTreeLinked(const QString& uid) +{ + ComponentContainer linked; + for (auto comp : d->components) { + qDebug() << "scanning" << comp->getID() << "for tree link"; + auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (dep != comp->m_cachedRequires.cend()) { + qDebug() << comp->getID() << "depends on" << uid; + linked.append(comp); + } + } + auto iter = d->componentIndex.find(uid); + if (iter != d->componentIndex.end()) { + ComponentPtr comp = *iter; + comp->updateCachedData(); + qDebug() << comp->getID() << "has" << comp->m_cachedRequires.size() << "dependencies"; + for (auto dep : comp->m_cachedRequires) { + qDebug() << uid << "depends on" << comp->getID(); + auto found = d->componentIndex.find(dep.uid); + if (found != d->componentIndex.end()) { + qDebug() << comp->getID() << "is present"; + linked.append(*found); + } + } + } + return linked; +} + QString PackProfile::getComponentVersion(const QString& uid) const { const auto iter = d->componentIndex.find(uid); diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index e58e9ae9a..f733b3524 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -48,6 +48,7 @@ #include "Component.h" #include "LaunchProfile.h" +#include "minecraft/PackProfile_p.h" #include "modplatform/ModIndex.h" #include "net/Mode.h" @@ -119,6 +120,9 @@ class PackProfile : public QAbstractListModel { bool setComponentVersion(const QString& uid, const QString& version, bool important = false); + /// collects components that are dependant on or dependencies of the component + ComponentContainer collectTreeLinked(const QString& uid); + bool installEmpty(const QString& uid, const QString& name); QString patchFilePathForUid(const QString& uid) const; From ce280c2d04c8536cc06c012208899430fb6037de Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:55:33 -0700 Subject: [PATCH 005/177] fix misepellings Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/PackProfile.cpp | 15 +++++++-------- launcher/minecraft/PackProfile_p.h | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index b258d8241..bdc80b923 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -961,8 +961,7 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (component->revert()) { component->setVersion(version); component->setImportant(important); - component->updateCachedData(); - // remove linked componants to let them reresolve their versions + // remove linked components to let them re-resolve their versions if (important) { auto linked = collectTreeLinked(uid); for (auto comp : linked) { @@ -970,15 +969,15 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version continue; } if (modloaderMapping.contains(comp->getID())) { - qDebug() << comp->getID() << "is a mod loader, setting new recomended version..."; + qDebug() << comp->getID() << "is a mod loader, setting new recommended version..."; auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); if (versionList) { - auto recomended = versionList->getRecommendedForParent(comp->getID(), version); - if (recomended) { - qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recomended->version(); - setComponentVersion(comp->getID(), recomended->version()); + auto recommended = versionList->getRecommendedForParent(comp->getID(), version); + if (recommended) { + qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recommended->version(); + setComponentVersion(comp->getID(), recommended->version()); } else { - qDebug() << "no recomended verison for" << comp->getID(); + qDebug() << "no recommended version for" << comp->getID(); } } else { qDebug() << "no version list in metadata index for" << comp->getID(); diff --git a/launcher/minecraft/PackProfile_p.h b/launcher/minecraft/PackProfile_p.h index 0cd4fb839..4fb3621f0 100644 --- a/launcher/minecraft/PackProfile_p.h +++ b/launcher/minecraft/PackProfile_p.h @@ -3,8 +3,8 @@ #include #include #include -#include #include "Component.h" +#include "tasks/Task.h" class MinecraftInstance; using ComponentContainer = QList; From a94a081b9c1347d65157ae3162d9adb8fee93c6a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:08:23 -0700 Subject: [PATCH 006/177] add better profile logging properly resolve important dependencies Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/CMakeLists.txt | 27 +++- launcher/meta/VersionList.cpp | 4 + launcher/meta/VersionList.h | 1 + launcher/minecraft/Component.cpp | 12 ++ launcher/minecraft/Component.h | 2 + launcher/minecraft/ComponentUpdateTask.cpp | 61 ++++----- launcher/minecraft/ComponentUpdateTask_p.h | 4 +- launcher/minecraft/Logging.cpp | 25 ++++ launcher/minecraft/Logging.h | 26 ++++ launcher/minecraft/PackProfile.cpp | 136 +++++++++++++-------- launcher/modplatform/ModIndex.h | 2 +- 11 files changed, 215 insertions(+), 85 deletions(-) create mode 100644 launcher/minecraft/Logging.cpp create mode 100644 launcher/minecraft/Logging.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 366719dec..e18a8b950 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -206,6 +206,11 @@ set(ICONS_SOURCES # Support for Minecraft instances and launch set(MINECRAFT_SOURCES + + # Logging + minecraft/Logging.h + minecraft/Logging.cpp + # Minecraft support minecraft/auth/AccountData.cpp minecraft/auth/AccountData.h @@ -650,6 +655,22 @@ ecm_qt_declare_logging_category(CORE_SOURCES EXPORT "${Launcher_Name}" ) +ecm_qt_export_logging_category( + IDENTIFIER instanceProfileC + CATEGORY_NAME "launcher.instance.profile" + DEFAULT_SEVERITY Debug + DESCRIPTION "Profile actions" + EXPORT "${Launcher_Name}" +) + +ecm_qt_export_logging_category( + IDENTIFIER instanceProfileResolveC + CATEGORY_NAME "launcher.instance.profile.resolve" + DEFAULT_SEVERITY Debug + DESCRIPTION "Profile component resolusion actions" + EXPORT "${Launcher_Name}" +) + ecm_qt_export_logging_category( IDENTIFIER taskLogC CATEGORY_NAME "launcher.task" @@ -662,7 +683,7 @@ ecm_qt_export_logging_category( IDENTIFIER taskNetLogC CATEGORY_NAME "launcher.task.net" DEFAULT_SEVERITY Debug - DESCRIPTION "task network action" + DESCRIPTION "Task network action" EXPORT "${Launcher_Name}" ) @@ -670,14 +691,14 @@ ecm_qt_export_logging_category( IDENTIFIER taskDownloadLogC CATEGORY_NAME "launcher.task.net.download" DEFAULT_SEVERITY Debug - DESCRIPTION "task network download actions" + DESCRIPTION "Task network download actions" EXPORT "${Launcher_Name}" ) ecm_qt_export_logging_category( IDENTIFIER taskUploadLogC CATEGORY_NAME "launcher.task.net.upload" DEFAULT_SEVERITY Debug - DESCRIPTION "task network upload actions" + DESCRIPTION "Task network upload actions" EXPORT "${Launcher_Name}" ) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 0cd33a2b3..c133e7d1a 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -287,7 +287,11 @@ Version::Ptr VersionList::getRecommendedForParent(const QString& uid, const QStr if (foundExplicit != m_versions.end()) { return *foundExplicit; } + return nullptr; +} +Version::Ptr VersionList::getLatestForParent(const QString& uid, const QString& version) +{ Version::Ptr latestCompat = nullptr; for (auto ver : m_versions) { auto& reqs = ver->requiredSet(); diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index b746d3232..05ecd91d2 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -44,6 +44,7 @@ class VersionList : public BaseVersionList, public BaseEntity { BaseVersion::Ptr getRecommended() const override; Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); + Version::Ptr getLatestForParent(const QString& uid, const QString& version); QVariant data(const QModelIndex& index, int role) const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index f03ffacc0..175e88d08 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -403,6 +403,18 @@ void Component::updateCachedData() } } +void Component::waitLoadMeta() { + + if (!m_loaded) { + if (!m_metaVersion || !m_metaVersion->isLoaded()) { + // wait for the loaded version from meta + m_metaVersion = APPLICATION->metadataIndex()->getLoadedVersion(m_uid, m_version); + } + m_loaded = true; + updateCachedData(); + } +} + QDebug operator<<(QDebug d, const Component& comp) { d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; return d; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 8aa6b4743..581a3db95 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -64,6 +64,8 @@ class Component : public QObject, public ProblemProvider { bool revert(); void updateCachedData(); + + void waitLoadMeta(); signals: void dataChanged(); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 4d205af6c..7bdc11400 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -8,6 +8,7 @@ #include "cassert" #include "meta/Index.h" #include "meta/Version.h" +#include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" #include "net/Mode.h" @@ -15,6 +16,8 @@ #include "Application.h" #include "tasks/Task.h" +#include "minecraft/Logging.h" + /* * This is responsible for loading the components of a component list AND resolving dependency issues between them */ @@ -36,7 +39,7 @@ ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent) : Task(parent) { d.reset(new ComponentUpdateTaskData); - d->m_list = list; + d->m_profile = list; d->mode = mode; d->netmode = netmode; } @@ -45,7 +48,7 @@ ComponentUpdateTask::~ComponentUpdateTask() {} void ComponentUpdateTask::executeTask() { - qDebug() << "Loading components"; + qCDebug(instanceProfileResolveC) << "Loading components"; loadComponents(); } @@ -63,7 +66,7 @@ LoadResult composeLoadResult(LoadResult a, LoadResult b) static LoadResult loadComponent(ComponentPtr component, Task::Ptr& loadTask, Net::Mode netmode) { if (component->m_loaded) { - qDebug() << component->getName() << "is already loaded"; + qCDebug(instanceProfileResolveC) << component->getName() << "is already loaded"; return LoadResult::LoadedLocal; } @@ -144,7 +147,7 @@ void ComponentUpdateTask::loadComponents() d->remoteLoadSuccessful = true; // load all the components OR their lists... - for (auto component : d->m_list->d->components) { + for (auto component : d->m_profile->d->components) { Task::Ptr loadTask; LoadResult singleResult; RemoteLoadStatus::Type loadType; @@ -175,7 +178,7 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qDebug() << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -270,7 +273,7 @@ static bool gatherRequirementsFromComponents(const ComponentContainer& input, Re output.erase(componenRequireEx); output.insert(result.outcome); } else { - qCritical() << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion + qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion << ";" << (*found).equalsVersion; } succeeded &= result.ok; @@ -353,22 +356,22 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir } while (false); switch (decision) { case Decision::Undetermined: - qCritical() << "No decision for" << reqStr; + qCCritical(instanceProfileResolveC) << "No decision for" << reqStr; succeeded = false; break; case Decision::Met: - qDebug() << reqStr << "Is met."; + qCDebug(instanceProfileResolveC) << reqStr << "Is met."; break; case Decision::Missing: - qDebug() << reqStr << "Is missing and should be added at" << req.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << reqStr << "Is missing and should be added at" << req.indexOfFirstDependee; toAdd.insert(req); break; case Decision::VersionNotSame: - qDebug() << reqStr << "already has different version that can be changed."; + qCDebug(instanceProfileResolveC) << reqStr << "already has different version that can be changed."; toChange.insert(req); break; case Decision::LockedVersionNotSame: - qDebug() << reqStr << "already has different version that cannot be changed."; + qCDebug(instanceProfileResolveC) << reqStr << "already has different version that cannot be changed."; succeeded = false; break; } @@ -381,7 +384,7 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir // FIXME: throw all this away and use a graph void ComponentUpdateTask::resolveDependencies(bool checkOnly) { - qDebug() << "Resolving dependencies"; + qCDebug(instanceProfileResolveC) << "Resolving dependencies"; /* * this is a naive dependency resolving algorithm. all it does is check for following conditions and react in simple ways: * 1. There are conflicting dependencies on the same uid with different exact version numbers @@ -393,8 +396,8 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) * * NOTE: this is a placeholder and should eventually be replaced with something 'serious' */ - auto& components = d->m_list->d->components; - auto& componentIndex = d->m_list->d->componentIndex; + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; RequireExSet allRequires; QStringList toRemove; @@ -407,10 +410,10 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) } getTrivialRemovals(components, allRequires, toRemove); if (!toRemove.isEmpty()) { - qDebug() << "Removing obsolete components..."; + qCDebug(instanceProfileResolveC) << "Removing obsolete components..."; for (auto& remove : toRemove) { - qDebug() << "Removing" << remove; - d->m_list->remove(remove); + qCDebug(instanceProfileResolveC) << "Removing" << remove; + d->m_profile->remove(remove); } } } while (!toRemove.isEmpty()); @@ -434,14 +437,14 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) if (toAdd.size()) { // add stuff... for (auto& add : toAdd) { - auto component = makeShared(d->m_list, add.uid); + auto component = makeShared(d->m_profile, add.uid); if (!add.equalsVersion.isEmpty()) { // exact version - qDebug() << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; component->m_version = add.equalsVersion; } else { // version needs to be decided - qDebug() << "Adding" << add.uid << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "at position" << add.indexOfFirstDependee; // ############################################################################################################ // HACK HACK HACK HACK FIXME: this is a placeholder for deciding what version to use. For now, it is hardcoded. if (!add.suggests.isEmpty()) { @@ -464,7 +467,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) } component->m_dependencyOnly = true; // FIXME: this should not work directly with the component list - d->m_list->insertComponent(add.indexOfFirstDependee, component); + d->m_profile->insertComponent(add.indexOfFirstDependee, component); componentIndex[add.uid] = component; } recursionNeeded = true; @@ -473,7 +476,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) // change a version of something that exists for (auto& change : toChange) { // FIXME: this should not work directly with the component list - qDebug() << "Setting version of " << change.uid << "to" << change.equalsVersion; + qCDebug(instanceProfileResolveC) << "Setting version of " << change.uid << "to" << change.equalsVersion; auto component = componentIndex[change.uid]; component->setVersion(change.equalsVersion); } @@ -490,7 +493,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { - qWarning() << "Got task index outside of results" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got task index outside of results" << taskIndex; return; } auto& taskSlot = d->remoteLoadStatusList[taskIndex]; @@ -498,16 +501,16 @@ void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) disconnect(taskSlot.task.get(), &Task::failed, this, nullptr); disconnect(taskSlot.task.get(), &Task::aborted, this, nullptr); if (taskSlot.finished) { - qWarning() << "Got multiple results from remote load task" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got multiple results from remote load task" << taskIndex; return; } - qDebug() << "Remote task" << taskIndex << "succeeded"; + qCDebug(instanceProfileResolveC) << "Remote task" << taskIndex << "succeeded"; taskSlot.succeeded = false; taskSlot.finished = true; d->remoteTasksInProgress--; // update the cached data of the component from the downloaded version file. if (taskSlot.type == RemoteLoadStatus::Type::Version) { - auto component = d->m_list->getComponent(taskSlot.PackProfileIndex); + auto component = d->m_profile->getComponent(taskSlot.PackProfileIndex); component->m_loaded = true; component->updateCachedData(); } @@ -517,7 +520,7 @@ void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) void ComponentUpdateTask::remoteLoadFailed(size_t taskIndex, const QString& msg) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { - qWarning() << "Got task index outside of results" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got task index outside of results" << taskIndex; return; } auto& taskSlot = d->remoteLoadStatusList[taskIndex]; @@ -525,10 +528,10 @@ void ComponentUpdateTask::remoteLoadFailed(size_t taskIndex, const QString& msg) disconnect(taskSlot.task.get(), &Task::failed, this, nullptr); disconnect(taskSlot.task.get(), &Task::aborted, this, nullptr); if (taskSlot.finished) { - qWarning() << "Got multiple results from remote load task" << taskIndex; + qCWarning(instanceProfileResolveC) << "Got multiple results from remote load task" << taskIndex; return; } - qDebug() << "Remote task" << taskIndex << "failed: " << msg; + qCDebug(instanceProfileResolveC) << "Remote task" << taskIndex << "failed: " << msg; d->remoteLoadSuccessful = false; taskSlot.succeeded = false; taskSlot.finished = true; diff --git a/launcher/minecraft/ComponentUpdateTask_p.h b/launcher/minecraft/ComponentUpdateTask_p.h index b82553700..2fc0b6d9a 100644 --- a/launcher/minecraft/ComponentUpdateTask_p.h +++ b/launcher/minecraft/ComponentUpdateTask_p.h @@ -6,6 +6,8 @@ #include "net/Mode.h" #include "tasks/Task.h" +#include "minecraft/ComponentUpdateTask.h" + class PackProfile; struct RemoteLoadStatus { @@ -18,7 +20,7 @@ struct RemoteLoadStatus { }; struct ComponentUpdateTaskData { - PackProfile* m_list = nullptr; + PackProfile* m_profile = nullptr; QList remoteLoadStatusList; bool remoteLoadSuccessful = true; size_t remoteTasksInProgress = 0; diff --git a/launcher/minecraft/Logging.cpp b/launcher/minecraft/Logging.cpp new file mode 100644 index 000000000..92596de3e --- /dev/null +++ b/launcher/minecraft/Logging.cpp @@ -0,0 +1,25 @@ + +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2023 Rachel Powers <508861+Ryex@users.noreply.github.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "minecraft/Logging.h" +#include + +Q_LOGGING_CATEGORY(instanceProfileC, "launcher.instance.profile") +Q_LOGGING_CATEGORY(instanceProfileResolveC, "launcher.instance.profile.resolve") diff --git a/launcher/minecraft/Logging.h b/launcher/minecraft/Logging.h new file mode 100644 index 000000000..00d43f419 --- /dev/null +++ b/launcher/minecraft/Logging.h @@ -0,0 +1,26 @@ + +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2023 Rachel Powers <508861+Ryex@users.noreply.github.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include + +Q_DECLARE_LOGGING_CATEGORY(instanceProfileC) +Q_DECLARE_LOGGING_CATEGORY(instanceProfileResolveC) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index bdc80b923..09a2ac0cb 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -66,6 +65,8 @@ #include "PackProfile_p.h" #include "modplatform/ModIndex.h" +#include "minecraft/Logging.h" + static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, { "net.minecraftforge", ModPlatform::Forge }, { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, @@ -159,16 +160,16 @@ static bool savePackProfile(const QString& filename, const ComponentContainer& c obj.insert("components", orderArray); QSaveFile outFile(filename); if (!outFile.open(QFile::WriteOnly)) { - qCritical() << "Couldn't open" << outFile.fileName() << "for writing:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't open" << outFile.fileName() << "for writing:" << outFile.errorString(); return false; } auto data = QJsonDocument(obj).toJson(QJsonDocument::Indented); if (outFile.write(data) != data.size()) { - qCritical() << "Couldn't write all the data into" << outFile.fileName() << "because:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't write all the data into" << outFile.fileName() << "because:" << outFile.errorString(); return false; } if (!outFile.commit()) { - qCritical() << "Couldn't save" << outFile.fileName() << "because:" << outFile.errorString(); + qCCritical(instanceProfileC) << "Couldn't save" << outFile.fileName() << "because:" << outFile.errorString(); } return true; } @@ -181,12 +182,12 @@ static bool loadPackProfile(PackProfile* parent, { QFile componentsFile(filename); if (!componentsFile.exists()) { - qWarning() << "Components file doesn't exist. This should never happen."; + qCWarning(instanceProfileC) << "Components file" << filename << "doesn't exist. This should never happen."; return false; } if (!componentsFile.open(QFile::ReadOnly)) { - qCritical() << "Couldn't open" << componentsFile.fileName() << " for reading:" << componentsFile.errorString(); - qWarning() << "Ignoring overriden order"; + qCCritical(instanceProfileC) << "Couldn't open" << componentsFile.fileName() << " for reading:" << componentsFile.errorString(); + qCWarning(instanceProfileC) << "Ignoring overridden order"; return false; } @@ -194,8 +195,8 @@ static bool loadPackProfile(PackProfile* parent, QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(componentsFile.readAll(), &error); if (error.error != QJsonParseError::NoError) { - qCritical() << "Couldn't parse" << componentsFile.fileName() << ":" << error.errorString(); - qWarning() << "Ignoring overriden order"; + qCCritical(instanceProfileC) << "Couldn't parse" << componentsFile.fileName() << ":" << error.errorString(); + qCWarning(instanceProfileC) << "Ignoring overridden order"; return false; } @@ -213,7 +214,7 @@ static bool loadPackProfile(PackProfile* parent, container.append(componentFromJsonV1(parent, componentJsonPattern, comp_obj)); } } catch ([[maybe_unused]] const JSONValidationError& err) { - qCritical() << "Couldn't parse" << componentsFile.fileName() << ": bad file format"; + qCCritical(instanceProfileC) << "Couldn't parse" << componentsFile.fileName() << ": bad file format"; container.clear(); return false; } @@ -246,12 +247,12 @@ void PackProfile::buildingFromScratch() void PackProfile::scheduleSave() { if (!d->loaded) { - qDebug() << "Component list should never save if it didn't successfully load, instance:" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list should never save if it didn't successfully load"; return; } if (!d->dirty) { d->dirty = true; - qDebug() << "Component list save is scheduled for" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list save is scheduled"; } d->m_saveTimer.start(); } @@ -278,7 +279,7 @@ QString PackProfile::patchFilePathForUid(const QString& uid) const void PackProfile::save_internal() { - qDebug() << "Component list save performed now for" << d->m_instance->name(); + qDebug() << d->m_instance->name() << "|" << "Component list save performed now"; auto filename = componentsFilePath(); savePackProfile(filename, d->components); d->dirty = false; @@ -291,7 +292,7 @@ bool PackProfile::load() // load the new component list and swap it with the current one... ComponentContainer newComponents; if (!loadPackProfile(this, filename, patchesPattern(), newComponents)) { - qCritical() << "Failed to load the component config for instance" << d->m_instance->name(); + qCritical() << d->m_instance->name() << "|" << "Failed to load the component config"; return false; } else { // FIXME: actually use fine-grained updates, not this... @@ -304,7 +305,7 @@ bool PackProfile::load() d->componentIndex.clear(); for (auto component : newComponents) { if (d->componentIndex.contains(component->m_uid)) { - qWarning() << "Ignoring duplicate component entry" << component->m_uid; + qWarning() << d->m_instance->name() << "|" << "Ignoring duplicate component entry" << component->m_uid; continue; } connect(component.get(), &Component::dataChanged, this, &PackProfile::componentDataChanged); @@ -352,14 +353,14 @@ void PackProfile::resolve(Net::Mode netmode) void PackProfile::updateSucceeded() { - qDebug() << "Component list update/resolve task succeeded for" << d->m_instance->name(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task succeeded"; d->m_updateTask.reset(); invalidateLaunchProfile(); } void PackProfile::updateFailed(const QString& error) { - qDebug() << "Component list update/resolve task failed for" << d->m_instance->name() << "Reason:" << error; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task failed " << "Reason:" << error; d->m_updateTask.reset(); invalidateLaunchProfile(); } @@ -375,11 +376,11 @@ void PackProfile::insertComponent(size_t index, ComponentPtr component) { auto id = component->getID(); if (id.isEmpty()) { - qWarning() << "Attempt to add a component with empty ID!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component with empty ID!"; return; } if (d->componentIndex.contains(id)) { - qWarning() << "Attempt to add a component that is already present!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component that is already present!"; return; } beginInsertRows(QModelIndex(), static_cast(index), static_cast(index)); @@ -394,7 +395,7 @@ void PackProfile::componentDataChanged() { auto objPtr = qobject_cast(sender()); if (!objPtr) { - qWarning() << "PackProfile got dataChanged signal from a non-Component!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "PackProfile got dataChanged signal from a non-Component!"; return; } if (objPtr->getID() == "net.minecraft") { @@ -410,19 +411,20 @@ void PackProfile::componentDataChanged() } index++; } - qWarning() << "PackProfile got dataChanged signal from a Component which does not belong to it!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "PackProfile got dataChanged signal from a Component which does not belong to it!"; } bool PackProfile::remove(const int index) { auto patch = getComponent(index); if (!patch->isRemovable()) { - qWarning() << "Patch" << patch->getID() << "is non-removable"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is non-removable"; return false; } if (!removeComponent_internal(patch)) { - qCritical() << "Patch" << patch->getID() << "could not be removed"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be removed"; return false; } @@ -451,11 +453,11 @@ bool PackProfile::customize(int index) { auto patch = getComponent(index); if (!patch->isCustomizable()) { - qDebug() << "Patch" << patch->getID() << "is not customizable"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not customizable"; return false; } if (!patch->customize()) { - qCritical() << "Patch" << patch->getID() << "could not be customized"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be customized"; return false; } invalidateLaunchProfile(); @@ -467,11 +469,11 @@ bool PackProfile::revertToBase(int index) { auto patch = getComponent(index); if (!patch->isRevertible()) { - qDebug() << "Patch" << patch->getID() << "is not revertible"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not revertible"; return false; } if (!patch->revert()) { - qCritical() << "Patch" << patch->getID() << "could not be reverted"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be reverted"; return false; } invalidateLaunchProfile(); @@ -684,7 +686,8 @@ bool PackProfile::installComponents(QStringList selectedFiles) const QString target = FS::PathCombine(patchDir, versionFile->uid + ".json"); if (!QFile::copy(source, target)) { - qWarning() << "Component" << source << "could not be copied to target" << target; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Component" << source << "could not be copied to target" + << target; result = false; continue; } @@ -717,7 +720,8 @@ bool PackProfile::installEmpty(const QString& uid, const QString& name) QString patchFileName = FS::PathCombine(patchDir, uid + ".json"); QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -737,7 +741,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (fileName.size()) { QFile patchFile(fileName); if (patchFile.exists() && !patchFile.remove()) { - qCritical() << "File" << fileName << "could not be removed because:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << fileName + << "could not be removed because:" << patchFile.errorString(); return false; } } @@ -753,7 +758,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (finfo.exists()) { QFile jarModFile(jar[0]); if (!jarModFile.remove()) { - qCritical() << "File" << jar[0] << "could not be removed because:" << jarModFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << jar[0] + << "could not be removed because:" << jarModFile.errorString(); return false; } return true; @@ -810,7 +816,8 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -864,7 +871,8 @@ bool PackProfile::installCustomJar_internal(QString filepath) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -919,7 +927,8 @@ bool PackProfile::installAgents_internal(QStringList filepaths) QFile patchFile(FS::PathCombine(patchDir, targetId + ".json")); if (!patchFile.open(QFile::WriteOnly)) { - qCritical() << "Error opening" << patchFile.fileName() << "for reading:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << patchFile.fileName() + << "for reading:" << patchFile.errorString(); return false; } @@ -941,12 +950,13 @@ std::shared_ptr PackProfile::getProfile() const try { auto profile = std::make_shared(); for (auto file : d->components) { - qDebug() << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Applying" << file->getID() + << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); file->applyTo(profile.get()); } d->m_profile = profile; } catch (const Exception& error) { - qWarning() << "Couldn't apply profile patches because: " << error.cause(); + qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Couldn't apply profile patches because: " << error.cause(); } } return d->m_profile; @@ -959,36 +969,58 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version ComponentPtr component = *iter; // set existing if (component->revert()) { - component->setVersion(version); - component->setImportant(important); // remove linked components to let them re-resolve their versions if (important) { + component->waitLoadMeta(); auto linked = collectTreeLinked(uid); for (auto comp : linked) { if (comp->isCustom()) { continue; } if (modloaderMapping.contains(comp->getID())) { - qDebug() << comp->getID() << "is a mod loader, setting new recommended version..."; + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << comp->getID() << "is a mod loader, updating it to a compatible version"; + auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); + versionList->waitToLoad(); if (versionList) { - auto recommended = versionList->getRecommendedForParent(comp->getID(), version); + auto recommended = versionList->getRecommendedForParent(uid, version); if (recommended) { - qDebug() << "Setting updated loader version: " << comp->getID() << " = " << recommended->version(); - setComponentVersion(comp->getID(), recommended->version()); + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "setting updated loader to recommended version: " << comp->getID() + << " = " << recommended->version(); + comp->setVersion(recommended->version()); } else { - qDebug() << "no recommended version for" << comp->getID(); + auto latest = versionList->getLatestForParent(uid, version); + if (latest) { + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "setting updated loader to latest compatible version: " << comp->getID() + << " = " << latest->version(); + comp->setVersion(latest->version()); + } else { + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "no compatible version for" << comp->getID() << "removing"; + remove(comp->getID()); + } } } else { - qDebug() << "no version list in metadata index for" << comp->getID(); + qCDebug(instanceProfileC) + << d->m_instance->name() << "|" << "no version list in metadata index for" << comp->getID(); } } else { - qDebug() << comp->getID() << ":" << comp->getVersion() << "linked to important component: " << uid - << " | Removing so it re-resolves"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() + << "linked to important component: " << uid << " | Removing so it re-resolves"; remove(comp->getID()); } } } + // set new version + component->setVersion(version); + component->setImportant(important); + + if (important) { + resolve(Net::Mode::Online); + } return true; } return false; @@ -1006,11 +1038,12 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) { ComponentContainer linked; for (auto comp : d->components) { - qDebug() << "scanning" << comp->getID() << "for tree link"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() + << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { - qDebug() << comp->getID() << "depends on" << uid; + qCDebug(instanceProfileResolveC) << comp->getID() << ":" << comp->getVersion() << "depends on" << uid; linked.append(comp); } } @@ -1018,12 +1051,13 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) if (iter != d->componentIndex.end()) { ComponentPtr comp = *iter; comp->updateCachedData(); - qDebug() << comp->getID() << "has" << comp->m_cachedRequires.size() << "dependencies"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" + << comp->m_cachedRequires.size() << "dependencies"; for (auto dep : comp->m_cachedRequires) { - qDebug() << uid << "depends on" << comp->getID(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << uid << "depends on" << dep.uid; auto found = d->componentIndex.find(dep.uid); if (found != d->componentIndex.end()) { - qDebug() << comp->getID() << "is present"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" << (*found)->getID() << "is present"; linked.append(*found); } } diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index 91c9898a9..b3f86933f 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -44,7 +44,7 @@ namespace ProviderCapabilities { const char* name(ResourceProvider); QString readableName(ResourceProvider); QStringList hashType(ResourceProvider); -}; // namespace ProviderCapabilities +} // namespace ProviderCapabilities struct ModpackAuthor { QString name; From cf319649f9c457bba14d097ae9ce4c839be188b2 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:28:42 -0700 Subject: [PATCH 007/177] fix qt5 lwjgl recommend + spelling Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/meta/VersionList.cpp | 6 +++--- launcher/meta/VersionList.h | 4 ++-- launcher/ui/pages/instance/VersionPage.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index c133e7d1a..8bc326839 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -180,12 +180,12 @@ void VersionList::parse(const QJsonObject& obj) parseVersionList(obj, this); } -void VersionList::addExternalRecomends(const QVector& recomends) +void VersionList::addExternalRecommends(const QStringList& recommends) { - m_externalRecommendsVersions.append(recomends); + m_externalRecommendsVersions.append(recommends); } -void VersionList::clearExternalRecomends() +void VersionList::clearExternalRecommends() { m_externalRecommendsVersions.clear(); } diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 05ecd91d2..2e46a79f0 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -71,8 +71,8 @@ class VersionList : public BaseVersionList, public BaseEntity { void merge(const VersionList::Ptr& other); void mergeFromIndex(const VersionList::Ptr& other); void parse(const QJsonObject& obj) override; - void addExternalRecomends(const QVector& recomends); - void clearExternalRecomends(); + void addExternalRecommends(const QStringList& recommends); + void clearExternalRecommends(); signals: void nameChanged(const QString& name); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 545798499..8ae21d2e4 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -370,7 +370,7 @@ void VersionPage::on_actionChange_version_triggered() auto patch = m_profile->getComponent(versionRow); auto name = patch->getName(); auto list = patch->getVersionList(); - list->clearExternalRecomends(); + list->clearExternalRecommends(); if (!list) { return; } @@ -384,7 +384,7 @@ void VersionPage::on_actionChange_version_triggered() if (lwjglReq != minecraft->m_cachedRequires.cend()) { auto lwjglVersion = !lwjglReq->equalsVersion.isEmpty() ? lwjglReq->equalsVersion : lwjglReq->suggests; if (!lwjglVersion.isEmpty()) { - list->addExternalRecomends({ lwjglVersion }); + list->addExternalRecommends({ lwjglVersion }); } } } From 474effe7c74a8d78a6e35cd742e99669353bf19e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 25 Jun 2024 11:13:15 +0300 Subject: [PATCH 008/177] clang-format Signed-off-by: Trial97 --- launcher/meta/VersionList.cpp | 5 +- launcher/meta/VersionList.h | 1 - launcher/minecraft/Component.cpp | 7 +- launcher/minecraft/Component.h | 2 +- launcher/minecraft/ComponentUpdateTask.cpp | 10 +- launcher/minecraft/PackProfile.cpp | 101 ++++++++++++--------- 6 files changed, 74 insertions(+), 52 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 8bc326839..28a42d28d 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -254,8 +254,9 @@ void VersionList::setupAddedVersion(const int row, const Version::Ptr& version) connect(version.get(), &Version::requiresChanged, this, [this, row]() { emit dataChanged(index(row), index(row), QVector() << RequiresRole); }); - connect(version.get(), &Version::timeChanged, this, - [this, row]() { emit dataChanged(index(row), index(row), { TimeRole, SortRole }); }); + connect(version.get(), &Version::timeChanged, this, [this, row]() { + emit dataChanged(index(row), index(row), { TimeRole, SortRole }); + }); connect(version.get(), &Version::typeChanged, this, [this, row]() { emit dataChanged(index(row), index(row), { TypeRole }); }); } diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 2e46a79f0..eb79e96f1 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -46,7 +46,6 @@ class VersionList : public BaseVersionList, public BaseEntity { Version::Ptr getRecommendedForParent(const QString& uid, const QString& version); Version::Ptr getLatestForParent(const QString& uid, const QString& version); - QVariant data(const QModelIndex& index, int role) const override; RoleList providesRoles() const override; QHash roleNames() const override; diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 175e88d08..6ea9ee60b 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -403,8 +403,8 @@ void Component::updateCachedData() } } -void Component::waitLoadMeta() { - +void Component::waitLoadMeta() +{ if (!m_loaded) { if (!m_metaVersion || !m_metaVersion->isLoaded()) { // wait for the loaded version from meta @@ -415,7 +415,8 @@ void Component::waitLoadMeta() { } } -QDebug operator<<(QDebug d, const Component& comp) { +QDebug operator<<(QDebug d, const Component& comp) +{ d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; return d; } diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 581a3db95..67d79e231 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -64,7 +64,7 @@ class Component : public QObject, public ProblemProvider { bool revert(); void updateCachedData(); - + void waitLoadMeta(); signals: diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 7bdc11400..dc59d2dc9 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -178,7 +178,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" + << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -273,8 +274,8 @@ static bool gatherRequirementsFromComponents(const ComponentContainer& input, Re output.erase(componenRequireEx); output.insert(result.outcome); } else { - qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid << "versions:" << componentRequire.equalsVersion - << ";" << (*found).equalsVersion; + qCCritical(instanceProfileResolveC) << "Conflicting requirements:" << componentRequire.uid + << "versions:" << componentRequire.equalsVersion << ";" << (*found).equalsVersion; } succeeded &= result.ok; } else { @@ -440,7 +441,8 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) auto component = makeShared(d->m_profile, add.uid); if (!add.equalsVersion.isEmpty()) { // exact version - qCDebug(instanceProfileResolveC) << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; + qCDebug(instanceProfileResolveC) + << "Adding" << add.uid << "version" << add.equalsVersion << "at position" << add.indexOfFirstDependee; component->m_version = add.equalsVersion; } else { // version needs to be decided diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 09a2ac0cb..ce57288f6 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -247,12 +247,14 @@ void PackProfile::buildingFromScratch() void PackProfile::scheduleSave() { if (!d->loaded) { - qDebug() << d->m_instance->name() << "|" << "Component list should never save if it didn't successfully load"; + qDebug() << d->m_instance->name() << "|" + << "Component list should never save if it didn't successfully load"; return; } if (!d->dirty) { d->dirty = true; - qDebug() << d->m_instance->name() << "|" << "Component list save is scheduled"; + qDebug() << d->m_instance->name() << "|" + << "Component list save is scheduled"; } d->m_saveTimer.start(); } @@ -279,7 +281,8 @@ QString PackProfile::patchFilePathForUid(const QString& uid) const void PackProfile::save_internal() { - qDebug() << d->m_instance->name() << "|" << "Component list save performed now"; + qDebug() << d->m_instance->name() << "|" + << "Component list save performed now"; auto filename = componentsFilePath(); savePackProfile(filename, d->components); d->dirty = false; @@ -292,7 +295,8 @@ bool PackProfile::load() // load the new component list and swap it with the current one... ComponentContainer newComponents; if (!loadPackProfile(this, filename, patchesPattern(), newComponents)) { - qCritical() << d->m_instance->name() << "|" << "Failed to load the component config"; + qCritical() << d->m_instance->name() << "|" + << "Failed to load the component config"; return false; } else { // FIXME: actually use fine-grained updates, not this... @@ -305,7 +309,8 @@ bool PackProfile::load() d->componentIndex.clear(); for (auto component : newComponents) { if (d->componentIndex.contains(component->m_uid)) { - qWarning() << d->m_instance->name() << "|" << "Ignoring duplicate component entry" << component->m_uid; + qWarning() << d->m_instance->name() << "|" + << "Ignoring duplicate component entry" << component->m_uid; continue; } connect(component.get(), &Component::dataChanged, this, &PackProfile::componentDataChanged); @@ -353,14 +358,17 @@ void PackProfile::resolve(Net::Mode netmode) void PackProfile::updateSucceeded() { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task succeeded"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Component list update/resolve task succeeded"; d->m_updateTask.reset(); invalidateLaunchProfile(); } void PackProfile::updateFailed(const QString& error) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Component list update/resolve task failed " << "Reason:" << error; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Component list update/resolve task failed " + << "Reason:" << error; d->m_updateTask.reset(); invalidateLaunchProfile(); } @@ -376,11 +384,13 @@ void PackProfile::insertComponent(size_t index, ComponentPtr component) { auto id = component->getID(); if (id.isEmpty()) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component with empty ID!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Attempt to add a component with empty ID!"; return; } if (d->componentIndex.contains(id)) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Attempt to add a component that is already present!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Attempt to add a component that is already present!"; return; } beginInsertRows(QModelIndex(), static_cast(index), static_cast(index)); @@ -395,7 +405,8 @@ void PackProfile::componentDataChanged() { auto objPtr = qobject_cast(sender()); if (!objPtr) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "PackProfile got dataChanged signal from a non-Component!"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "PackProfile got dataChanged signal from a non-Component!"; return; } if (objPtr->getID() == "net.minecraft") { @@ -419,12 +430,14 @@ bool PackProfile::remove(const int index) { auto patch = getComponent(index); if (!patch->isRemovable()) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is non-removable"; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is non-removable"; return false; } if (!removeComponent_internal(patch)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be removed"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be removed"; return false; } @@ -453,11 +466,13 @@ bool PackProfile::customize(int index) { auto patch = getComponent(index); if (!patch->isCustomizable()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not customizable"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is not customizable"; return false; } if (!patch->customize()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be customized"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be customized"; return false; } invalidateLaunchProfile(); @@ -469,11 +484,13 @@ bool PackProfile::revertToBase(int index) { auto patch = getComponent(index); if (!patch->isRevertible()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "is not revertible"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "is not revertible"; return false; } if (!patch->revert()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Patch" << patch->getID() << "could not be reverted"; + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Patch" << patch->getID() << "could not be reverted"; return false; } invalidateLaunchProfile(); @@ -686,8 +703,8 @@ bool PackProfile::installComponents(QStringList selectedFiles) const QString target = FS::PathCombine(patchDir, versionFile->uid + ".json"); if (!QFile::copy(source, target)) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Component" << source << "could not be copied to target" - << target; + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Component" << source << "could not be copied to target" << target; result = false; continue; } @@ -720,8 +737,8 @@ bool PackProfile::installEmpty(const QString& uid, const QString& name) QString patchFileName = FS::PathCombine(patchDir, uid + ".json"); QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -741,8 +758,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (fileName.size()) { QFile patchFile(fileName); if (patchFile.exists() && !patchFile.remove()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << fileName - << "could not be removed because:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "File" << fileName << "could not be removed because:" << patchFile.errorString(); return false; } } @@ -758,8 +775,8 @@ bool PackProfile::removeComponent_internal(ComponentPtr patch) if (finfo.exists()) { QFile jarModFile(jar[0]); if (!jarModFile.remove()) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "File" << jar[0] - << "could not be removed because:" << jarModFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "File" << jar[0] << "could not be removed because:" << jarModFile.errorString(); return false; } return true; @@ -816,8 +833,8 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -871,8 +888,8 @@ bool PackProfile::installCustomJar_internal(QString filepath) QFile file(patchFileName); if (!file.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << file.fileName() - << "for reading:" << file.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << file.fileName() << "for reading:" << file.errorString(); return false; } file.write(OneSixVersionFormat::versionFileToJson(f).toJson()); @@ -927,8 +944,8 @@ bool PackProfile::installAgents_internal(QStringList filepaths) QFile patchFile(FS::PathCombine(patchDir, targetId + ".json")); if (!patchFile.open(QFile::WriteOnly)) { - qCCritical(instanceProfileC) << d->m_instance->name() << "|" << "Error opening" << patchFile.fileName() - << "for reading:" << patchFile.errorString(); + qCCritical(instanceProfileC) << d->m_instance->name() << "|" + << "Error opening" << patchFile.fileName() << "for reading:" << patchFile.errorString(); return false; } @@ -950,13 +967,15 @@ std::shared_ptr PackProfile::getProfile() const try { auto profile = std::make_shared(); for (auto file : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "Applying" << file->getID() + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); file->applyTo(profile.get()); } d->m_profile = profile; } catch (const Exception& error) { - qCWarning(instanceProfileC) << d->m_instance->name() << "|" << "Couldn't apply profile patches because: " << error.cause(); + qCWarning(instanceProfileC) << d->m_instance->name() << "|" + << "Couldn't apply profile patches because: " << error.cause(); } } return d->m_profile; @@ -986,9 +1005,9 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version if (versionList) { auto recommended = versionList->getRecommendedForParent(uid, version); if (recommended) { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "setting updated loader to recommended version: " << comp->getID() - << " = " << recommended->version(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "setting updated loader to recommended version: " << comp->getID() << " = " + << recommended->version(); comp->setVersion(recommended->version()); } else { auto latest = versionList->getLatestForParent(uid, version); @@ -998,14 +1017,14 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version << " = " << latest->version(); comp->setVersion(latest->version()); } else { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "no compatible version for" << comp->getID() << "removing"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "no compatible version for" << comp->getID() << "removing"; remove(comp->getID()); } } } else { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << "no version list in metadata index for" << comp->getID(); + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "no version list in metadata index for" << comp->getID(); } } else { qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() @@ -1038,8 +1057,8 @@ ComponentContainer PackProfile::collectTreeLinked(const QString& uid) { ComponentContainer linked; for (auto comp : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() - << "for tree link"; + qCDebug(instanceProfileC) << d->m_instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { From a85d6cb1f2a12efd40b12f5a59fbb56a8d1cc4fd Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:42:25 -0700 Subject: [PATCH 009/177] move resolution into update actions in task. Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 37 ++++- launcher/minecraft/Component.h | 33 +++++ launcher/minecraft/ComponentUpdateTask.cpp | 151 +++++++++++++++++++++ launcher/minecraft/ComponentUpdateTask.h | 5 + launcher/minecraft/PackProfile.cpp | 83 +---------- launcher/minecraft/PackProfile.h | 4 - 6 files changed, 231 insertions(+), 82 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 6ea9ee60b..67f26a02e 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -38,6 +38,7 @@ #include #include +#include #include "Application.h" #include "FileSystem.h" @@ -235,7 +236,8 @@ ProblemSeverity Component::getProblemSeverity() const { auto file = getVersionFile(); if (file) { - return file->getProblemSeverity(); + auto severity = file->getProblemSeverity(); + return m_componentProblemSeverity > severity ? m_componentProblemSeverity : severity; } return ProblemSeverity::Error; } @@ -244,11 +246,27 @@ const QList Component::getProblems() const { auto file = getVersionFile(); if (file) { - return file->getProblems(); + auto problems = file->getProblems(); + problems.append(m_componentProblems); + return problems; } return { { ProblemSeverity::Error, QObject::tr("Patch is not loaded yet.") } }; } +void Component::addComponentProblem(ProblemSeverity severity, const QString& description) +{ + if (severity > m_componentProblemSeverity) { + m_componentProblemSeverity = severity; + } + m_componentProblems.append({ severity, description }); +} + +void Component::resetComponentProblems() +{ + m_componentProblems.clear(); + m_componentProblemSeverity = ProblemSeverity::None; +} + void Component::setVersion(const QString& version) { if (version == m_version) { @@ -415,6 +433,21 @@ void Component::waitLoadMeta() } } +void Component::setUpdateAction(UpdateAction action) +{ + m_updateAction = action; +} + +std::optional Component::getUpdateAction() +{ + return m_updateAction; +} + +void Component::clearUpdateAction() +{ + m_updateAction.reset(); +} + QDebug operator<<(QDebug d, const Component& comp) { d << "Component(" << comp.m_uid << " : " << comp.m_cachedVersion << ")"; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 67d79e231..50c4e02db 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" @@ -16,6 +17,26 @@ class VersionList; } // namespace Meta class VersionFile; +struct UpdateActionChangeVerison { + /// version to change to + QString targetVersion; +}; +struct UpdateActionLatestRecommendedCompatable { + /// Parent uid + QString parentUid; + QString parentName; + /// Parent version + QString version; + /// +}; +struct UpdateActionRemove {}; +struct UpdateActionImportantChanged { + QString oldVersion; +}; + +using UpdateAction = + std::variant; + class Component : public QObject, public ProblemProvider { Q_OBJECT public: @@ -58,6 +79,8 @@ class Component : public QObject, public ProblemProvider { const QList getProblems() const override; ProblemSeverity getProblemSeverity() const override; + void addComponentProblem(ProblemSeverity severity, const QString& description); + void resetComponentProblems(); void setVersion(const QString& version); bool customize(); @@ -67,6 +90,11 @@ class Component : public QObject, public ProblemProvider { void waitLoadMeta(); + void setUpdateAction(UpdateAction action); + void clearUpdateAction(); + std::optional getUpdateAction(); + std::optional takeUpdateAction(); + signals: void dataChanged(); @@ -104,6 +132,11 @@ class Component : public QObject, public ProblemProvider { std::shared_ptr m_metaVersion; std::shared_ptr m_file; bool m_loaded = false; + + private: + QList m_componentProblems; + ProblemSeverity m_componentProblemSeverity = ProblemSeverity::None; + std::optional m_updateAction = std::nullopt; }; using ComponentPtr = shared_qobject_ptr; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index dc59d2dc9..8f19f20c8 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -1,9 +1,11 @@ #include "ComponentUpdateTask.h" +#include #include "Component.h" #include "ComponentUpdateTask_p.h" #include "PackProfile.h" #include "PackProfile_p.h" +#include "ProblemProvider.h" #include "Version.h" #include "cassert" #include "meta/Index.h" @@ -196,6 +198,7 @@ void ComponentUpdateTask::loadComponents() switch (result) { case LoadResult::LoadedLocal: { // Everything got loaded. Advance to dependency resolution. + performUpdateActions(); resolveDependencies(d->mode == Mode::Launch || d->netmode == Net::Mode::Offline); break; } @@ -380,6 +383,42 @@ static bool getTrivialComponentChanges(const ComponentIndex& index, const Requir return succeeded; } +ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) +{ + ComponentContainer linked; + + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; + auto& instance = d->m_profile->d->m_instance; + for (auto comp : components) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; + auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), + [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); + if (dep != comp->m_cachedRequires.cend()) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "depends on" + << uid; + linked.append(comp); + } + } + auto iter = componentIndex.find(uid); + if (iter != componentIndex.end()) { + ComponentPtr comp = *iter; + comp->updateCachedData(); + qCDebug(instanceProfileResolveC) << instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" + << comp->m_cachedRequires.size() << "dependencies"; + for (auto dep : comp->m_cachedRequires) { + qCDebug(instanceProfileC) << instance->name() << "|" << uid << "depends on" << dep.uid; + auto found = componentIndex.find(dep.uid); + if (found != componentIndex.end()) { + qCDebug(instanceProfileC) << instance->name() << "|" << (*found)->getID() << "is present"; + linked.append(*found); + } + } + } + return linked; +} + // FIXME, TODO: decouple dependency resolution from loading // FIXME: This works directly with the PackProfile internals. It shouldn't! It needs richer data types than PackProfile uses. // FIXME: throw all this away and use a graph @@ -488,10 +527,121 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) if (recursionNeeded) { loadComponents(); } else { + finalizeComponents(); emitSucceeded(); } } +// Variant visitation via lambda +template +struct overload : Ts... { + using Ts::operator()...; +}; +template +overload(Ts...) -> overload; + +void ComponentUpdateTask::performUpdateActions() +{ + auto& components = d->m_profile->d->components; + + bool addedActions; + do { + addedActions = false; + for (auto component : components) { + if (auto action = component->getUpdateAction()) { + auto visitor = overload{ + [&component](const UpdateActionChangeVerison& cv) { + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component](const UpdateActionLatestRecommendedCompatable lrc) { + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } + + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [this, &component](const UpdateActionRemove&) { d->m_profile->remove(component->getID()); }, + [this, &component, &addedActions](const UpdateActionImportantChanged&) { + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVerison{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } + }; + std::visit(visitor, *action); + component->clearUpdateAction(); + } + } + } while (addedActions); +} + +void ComponentUpdateTask::finalizeComponents() +{ + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; + for (auto component : components) { + for (auto req : component->m_cachedRequires) { + auto found = componentIndex.find(req.uid); + if (found == componentIndex.cend()) { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("%1 is missing requirement %2 %3") + .arg(component->getName(), req.uid, req.equalsVersion.isEmpty() ? req.suggests : req.equalsVersion)); + } else { + auto reqComp = *found; + if (!reqComp->getProblems().isEmpty()) { + component->addComponentProblem( + reqComp->getProblemSeverity(), + QObject::tr("%1, a dependency of this component, has reported issues").arg(reqComp->getName())); + } + } + } + } +} + void ComponentUpdateTask::remoteLoadSucceeded(size_t taskIndex) { if (static_cast(d->remoteLoadStatusList.size()) < taskIndex) { @@ -551,6 +701,7 @@ void ComponentUpdateTask::checkIfAllFinished() if (d->remoteLoadSuccessful) { // nothing bad happened... clear the temp load status and proceed with looking at dependencies d->remoteLoadStatusList.clear(); + performUpdateActions(); resolveDependencies(d->mode == Mode::Launch); } else { // remote load failed... report error and bail diff --git a/launcher/minecraft/ComponentUpdateTask.h b/launcher/minecraft/ComponentUpdateTask.h index 2f396a049..484c0bedd 100644 --- a/launcher/minecraft/ComponentUpdateTask.h +++ b/launcher/minecraft/ComponentUpdateTask.h @@ -1,5 +1,6 @@ #pragma once +#include "minecraft/Component.h" #include "net/Mode.h" #include "tasks/Task.h" @@ -21,7 +22,11 @@ class ComponentUpdateTask : public Task { private: void loadComponents(); + /// collects components that are dependent on or dependencies of the component + QList collectTreeLinked(const QString& uid); void resolveDependencies(bool checkOnly); + void performUpdateActions(); + void finalizeComponents(); void remoteLoadSucceeded(size_t index); void remoteLoadFailed(size_t index, const QString& msg); diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index ce57288f6..debbf0fa7 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include "Application.h" #include "Exception.h" @@ -56,6 +57,7 @@ #include "Json.h" #include "meta/Index.h" #include "meta/JsonFormat.h" +#include "minecraft/Component.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/OneSixVersionFormat.h" #include "minecraft/ProfileUtils.h" @@ -67,6 +69,8 @@ #include "minecraft/Logging.h" +#include "ui/dialogs/CustomMessageBox.h" + static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, { "net.minecraftforge", ModPlatform::Forge }, { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, @@ -988,58 +992,16 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version ComponentPtr component = *iter; // set existing if (component->revert()) { - // remove linked components to let them re-resolve their versions - if (important) { - component->waitLoadMeta(); - auto linked = collectTreeLinked(uid); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - if (modloaderMapping.contains(comp->getID())) { - qCDebug(instanceProfileC) - << d->m_instance->name() << "|" << comp->getID() << "is a mod loader, updating it to a compatible version"; - - auto versionList = APPLICATION->metadataIndex()->get(comp->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(uid, version); - if (recommended) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "setting updated loader to recommended version: " << comp->getID() << " = " - << recommended->version(); - comp->setVersion(recommended->version()); - } else { - auto latest = versionList->getLatestForParent(uid, version); - if (latest) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "setting updated loader to latest compatible version: " << comp->getID() - << " = " << latest->version(); - comp->setVersion(latest->version()); - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "no compatible version for" << comp->getID() << "removing"; - remove(comp->getID()); - } - } - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "no version list in metadata index for" << comp->getID(); - } - } else { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() - << "linked to important component: " << uid << " | Removing so it re-resolves"; - remove(comp->getID()); - } - } - } // set new version + auto oldVersion = component->getVersion(); component->setVersion(version); component->setImportant(important); if (important) { + component->setUpdateAction(UpdateAction{ UpdateActionImportantChanged{ oldVersion } }); resolve(Net::Mode::Online); } + return true; } return false; @@ -1053,37 +1015,6 @@ bool PackProfile::setComponentVersion(const QString& uid, const QString& version } } -ComponentContainer PackProfile::collectTreeLinked(const QString& uid) -{ - ComponentContainer linked; - for (auto comp : d->components) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" - << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; - auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), - [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); - if (dep != comp->m_cachedRequires.cend()) { - qCDebug(instanceProfileResolveC) << comp->getID() << ":" << comp->getVersion() << "depends on" << uid; - linked.append(comp); - } - } - auto iter = d->componentIndex.find(uid); - if (iter != d->componentIndex.end()) { - ComponentPtr comp = *iter; - comp->updateCachedData(); - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << comp->getID() << ":" << comp->getVersion() << "has" - << comp->m_cachedRequires.size() << "dependencies"; - for (auto dep : comp->m_cachedRequires) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << uid << "depends on" << dep.uid; - auto found = d->componentIndex.find(dep.uid); - if (found != d->componentIndex.end()) { - qCDebug(instanceProfileC) << d->m_instance->name() << "|" << (*found)->getID() << "is present"; - linked.append(*found); - } - } - } - return linked; -} - QString PackProfile::getComponentVersion(const QString& uid) const { const auto iter = d->componentIndex.find(uid); diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index f733b3524..e58e9ae9a 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -48,7 +48,6 @@ #include "Component.h" #include "LaunchProfile.h" -#include "minecraft/PackProfile_p.h" #include "modplatform/ModIndex.h" #include "net/Mode.h" @@ -120,9 +119,6 @@ class PackProfile : public QAbstractListModel { bool setComponentVersion(const QString& uid, const QString& version, bool important = false); - /// collects components that are dependant on or dependencies of the component - ComponentContainer collectTreeLinked(const QString& uid); - bool installEmpty(const QString& uid, const QString& name); QString patchFilePathForUid(const QString& uid) const; From 4ed92a95c2b362d09a8a2ff81926c282f1227c4c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:28:09 -0700 Subject: [PATCH 010/177] fix segfaults consistently set component problems Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 5 +- launcher/minecraft/Component.h | 17 +- launcher/minecraft/ComponentUpdateTask.cpp | 185 +++++++++++++-------- 3 files changed, 132 insertions(+), 75 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 67f26a02e..00d3f2e42 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -45,6 +45,7 @@ #include "OneSixVersionFormat.h" #include "VersionFile.h" #include "meta/Version.h" +#include "minecraft/Component.h" #include "minecraft/PackProfile.h" #include @@ -438,14 +439,14 @@ void Component::setUpdateAction(UpdateAction action) m_updateAction = action; } -std::optional Component::getUpdateAction() +UpdateAction Component::getUpdateAction() { return m_updateAction; } void Component::clearUpdateAction() { - m_updateAction.reset(); + m_updateAction = UpdateAction{ UpdateActionNone{} }; } QDebug operator<<(QDebug d, const Component& comp) diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 50c4e02db..94a964182 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" @@ -17,7 +18,7 @@ class VersionList; } // namespace Meta class VersionFile; -struct UpdateActionChangeVerison { +struct UpdateActionChangeVersion { /// version to change to QString targetVersion; }; @@ -34,8 +35,13 @@ struct UpdateActionImportantChanged { QString oldVersion; }; -using UpdateAction = - std::variant; +using UpdateActionNone = std::monostate; + +using UpdateAction = std::variant; class Component : public QObject, public ProblemProvider { Q_OBJECT @@ -92,8 +98,7 @@ class Component : public QObject, public ProblemProvider { void setUpdateAction(UpdateAction action); void clearUpdateAction(); - std::optional getUpdateAction(); - std::optional takeUpdateAction(); + UpdateAction getUpdateAction(); signals: void dataChanged(); @@ -136,7 +141,7 @@ class Component : public QObject, public ProblemProvider { private: QList m_componentProblems; ProblemSeverity m_componentProblemSeverity = ProblemSeverity::None; - std::optional m_updateAction = std::nullopt; + UpdateAction m_updateAction = UpdateAction{ UpdateActionNone{} }; }; using ComponentPtr = shared_qobject_ptr; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 8f19f20c8..8001627e4 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -153,6 +153,7 @@ void ComponentUpdateTask::loadComponents() Task::Ptr loadTask; LoadResult singleResult; RemoteLoadStatus::Type loadType; + component->resetComponentProblems(); // FIXME: to do this right, we need to load the lists and decide on which versions to use during dependency resolution. For now, // ignore all that... #if 0 @@ -445,6 +446,7 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) allRequires.clear(); toRemove.clear(); if (!gatherRequirementsFromComponents(components, allRequires)) { + finalizeComponents(); emitFailed(tr("Conflicting requirements detected during dependency checking!")); return; } @@ -461,10 +463,12 @@ void ComponentUpdateTask::resolveDependencies(bool checkOnly) RequireExSet toChange; bool succeeded = getTrivialComponentChanges(componentIndex, allRequires, toAdd, toChange); if (!succeeded) { + finalizeComponents(); emitFailed(tr("Instance has conflicting dependencies.")); return; } if (checkOnly) { + finalizeComponents(); if (toAdd.size() || toChange.size()) { emitFailed(tr("Instance has unresolved dependencies while loading/checking for launch.")); } else { @@ -542,77 +546,115 @@ overload(Ts...) -> overload; void ComponentUpdateTask::performUpdateActions() { - auto& components = d->m_profile->d->components; - + auto& instance = d->m_profile->d->m_instance; bool addedActions; + QStringList toRemove; do { addedActions = false; + toRemove.clear(); + auto& components = d->m_profile->d->components; + auto& componentIndex = d->m_profile->d->componentIndex; for (auto component : components) { - if (auto action = component->getUpdateAction()) { - auto visitor = overload{ - [&component](const UpdateActionChangeVerison& cv) { - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component](const UpdateActionLatestRecommendedCompatable lrc) { - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } - - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [this, &component](const UpdateActionRemove&) { d->m_profile->remove(component->getID()); }, - [this, &component, &addedActions](const UpdateActionImportantChanged&) { - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVerison{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } - }; - std::visit(visitor, *action); - component->clearUpdateAction(); + if (!component) { + continue; + } + auto action = component->getUpdateAction(); + auto visitor = + overload{ [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } + + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" + << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } }; + std::visit(visitor, action); + component->clearUpdateAction(); + for (auto uid : toRemove) { + d->m_profile->remove(uid); } } } while (addedActions); @@ -637,6 +679,15 @@ void ComponentUpdateTask::finalizeComponents() reqComp->getProblemSeverity(), QObject::tr("%1, a dependency of this component, has reported issues").arg(reqComp->getName())); } + if (!req.equalsVersion.isEmpty() && req.equalsVersion != reqComp->getVersion()) { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("%1, a dependency of this component, is not the required version %2") + .arg(reqComp->getName(), req.equalsVersion)); + } else if (!req.suggests.isEmpty() && req.suggests != reqComp->getVersion()) { + component->addComponentProblem(ProblemSeverity::Warning, + QObject::tr("%1, a dependency of this component, is not the suggested version %2") + .arg(reqComp->getName(), req.suggests)); + } } } } From c4cc1cfe4f30147c85b804825048b3c5288537a8 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:25:38 -0700 Subject: [PATCH 011/177] Warn about known conflicting modloaders Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 16 ++ launcher/minecraft/Component.h | 15 ++ launcher/minecraft/ComponentUpdateTask.cpp | 201 +++++++++++---------- launcher/minecraft/PackProfile.cpp | 9 +- 4 files changed, 138 insertions(+), 103 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 00d3f2e42..329e6b78e 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -225,6 +225,22 @@ bool Component::isVersionChangeable() return false; } +bool Component::isKnownModloader() +{ + auto iter = KNOWN_MODLOADERS.find(m_uid); + return iter != KNOWN_MODLOADERS.cend(); +} + +QStringList Component::knownConfictingComponents() +{ + auto iter = KNOWN_MODLOADERS.find(m_uid); + if (iter != KNOWN_MODLOADERS.cend()) { + return (*iter).knownConfictingComponents; + } else { + return {}; + } +} + void Component::setImportant(bool state) { if (m_important != state) { diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 94a964182..3669638f2 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -9,6 +9,7 @@ #include "ProblemProvider.h" #include "QObjectPtr.h" #include "meta/JsonFormat.h" +#include "modplatform/ModIndex.h" class PackProfile; class LaunchProfile; @@ -43,6 +44,18 @@ using UpdateAction = std::variant; +struct ModloaderMapEntry { + ModPlatform::ModLoaderType type; + QStringList knownConfictingComponents; +}; +static const QMap KNOWN_MODLOADERS{ + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, + { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, + { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } +}; + class Component : public QObject, public ProblemProvider { Q_OBJECT public: @@ -65,6 +78,8 @@ class Component : public QObject, public ProblemProvider { bool isRemovable(); bool isCustom(); bool isVersionChangeable(); + bool isKnownModloader(); + QStringList knownConfictingComponents(); // DEPRECATED: explicit numeric order values, used for loading old non-component config. TODO: refactor and move to migration code void setOrder(int order); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 8001627e4..1617a8f82 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -181,8 +181,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" - << "Remote loading is being run for" << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" + << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -392,8 +392,8 @@ ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) auto& componentIndex = d->m_profile->d->componentIndex; auto& instance = d->m_profile->d->m_instance; for (auto comp : components) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() + << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { @@ -559,98 +559,94 @@ void ComponentUpdateTask::performUpdateActions() continue; } auto action = component->getUpdateAction(); - auto visitor = - overload{ [](const UpdateActionNone&) { - // noop - }, - [&component, &instance](const UpdateActionChangeVersion& cv) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "UpdateActionChangeVersion" << component->getID() << ":" - << component->getVersion() << "change to" << cv.targetVersion; - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() - << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } - - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem( - ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [&component, &instance, &toRemove](const UpdateActionRemove&) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; - toRemove.append(component->getID()); - }, - [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" - << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" - << ic.oldVersion << "updating linked components"; - auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); - for (auto oldReq : oldVersion->requiredSet()) { - auto currentlyRequired = component->m_cachedRequires.find(oldReq); - if (currentlyRequired == component->m_cachedRequires.cend()) { - auto oldReqComp = componentIndex.find(oldReq.uid); - if (oldReqComp != componentIndex.cend()) { - (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); - addedActions = true; - } - } - } - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } }; + auto visitor = overload{ + [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" + << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } + + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionRemove" << component->getID() << ":" + << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() + << "was changed from" << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } + }; std::visit(visitor, action); component->clearUpdateAction(); for (auto uid : toRemove) { @@ -690,6 +686,19 @@ void ComponentUpdateTask::finalizeComponents() } } } + for (auto conflict : component->knownConfictingComponents()) { + auto found = componentIndex.find(conflict); + if (found != componentIndex.cend()) { + auto foundComp = *found; + if (foundComp ->isCustom()) { + continue; + } + component->addComponentProblem( + ProblemSeverity::Warning, + QObject::tr("%1 and %2 are known to not work together. It is recommended to remove one of them.") + .arg(component->getName(), foundComp->getName())); + } + } } } diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index debbf0fa7..c4a2dd273 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -71,11 +71,6 @@ #include "ui/dialogs/CustomMessageBox.h" -static const QMap modloaderMapping{ { "net.neoforged", ModPlatform::NeoForge }, - { "net.minecraftforge", ModPlatform::Forge }, - { "net.fabricmc.fabric-loader", ModPlatform::Fabric }, - { "org.quiltmc.quilt-loader", ModPlatform::Quilt }, - { "com.mumfrey.liteloader", ModPlatform::LiteLoader } }; PackProfile::PackProfile(MinecraftInstance* instance) : QAbstractListModel() { @@ -1040,12 +1035,12 @@ std::optional PackProfile::getModLoaders() ModPlatform::ModLoaderTypes result; bool has_any_loader = false; - QMapIterator i(modloaderMapping); + QMapIterator i(KNOWN_MODLOADERS); while (i.hasNext()) { i.next(); if (auto c = getComponent(i.key()); c != nullptr && c->isEnabled()) { - result |= i.value(); + result |= i.value().type; has_any_loader = true; } } From 492c78a570f52d23d58b54e38c4a4785865960e6 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 28 Jun 2024 13:41:07 +0300 Subject: [PATCH 012/177] format the code Signed-off-by: Trial97 --- launcher/minecraft/ComponentUpdateTask.cpp | 190 +++++++++++---------- launcher/minecraft/PackProfile.cpp | 1 - 2 files changed, 97 insertions(+), 94 deletions(-) diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 1617a8f82..f4efba36f 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -181,8 +181,8 @@ void ComponentUpdateTask::loadComponents() } result = composeLoadResult(result, singleResult); if (loadTask) { - qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" << "Remote loading is being run for" - << component->getName(); + qCDebug(instanceProfileResolveC) << d->m_profile->d->m_instance->name() << "|" + << "Remote loading is being run for" << component->getName(); connect(loadTask.get(), &Task::succeeded, this, [this, taskIndex]() { remoteLoadSucceeded(taskIndex); }); connect(loadTask.get(), &Task::failed, this, [this, taskIndex](const QString& error) { remoteLoadFailed(taskIndex, error); }); connect(loadTask.get(), &Task::aborted, this, [this, taskIndex]() { remoteLoadFailed(taskIndex, tr("Aborted")); }); @@ -392,8 +392,8 @@ ComponentContainer ComponentUpdateTask::collectTreeLinked(const QString& uid) auto& componentIndex = d->m_profile->d->componentIndex; auto& instance = d->m_profile->d->m_instance; for (auto comp : components) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "scanning" << comp->getID() << ":" << comp->getVersion() - << "for tree link"; + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "scanning" << comp->getID() << ":" << comp->getVersion() << "for tree link"; auto dep = std::find_if(comp->m_cachedRequires.cbegin(), comp->m_cachedRequires.cend(), [uid](const Meta::Require& req) -> bool { return req.uid == uid; }); if (dep != comp->m_cachedRequires.cend()) { @@ -559,94 +559,98 @@ void ComponentUpdateTask::performUpdateActions() continue; } auto action = component->getUpdateAction(); - auto visitor = overload{ - [](const UpdateActionNone&) { - // noop - }, - [&component, &instance](const UpdateActionChangeVersion& cv) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionChangeVersion" << component->getID() << ":" - << component->getVersion() << "change to" << cv.targetVersion; - component->setVersion(cv.targetVersion); - component->waitLoadMeta(); - }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" - << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; - auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); - if (versionList) { - auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); - if (recommended) { - component->setVersion(recommended->version()); - component->waitLoadMeta(); - return; - } - - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No compatible version of %1 found for %2 %3") - .arg(component->getName(), lrc.parentName, lrc.version)); - } - } else { - component->addComponentProblem(ProblemSeverity::Error, - QObject::tr("No version list in metadata index for %1").arg(component->getID())); - } - }, - [&component, &instance, &toRemove](const UpdateActionRemove&) { - qCDebug(instanceProfileResolveC) << instance->name() << "|" << "UpdateActionRemove" << component->getID() << ":" - << component->getVersion() << "removing"; - toRemove.append(component->getID()); - }, - [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { - qCDebug(instanceProfileResolveC) - << instance->name() << "|" << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() - << "was changed from" << ic.oldVersion << "updating linked components"; - auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); - for (auto oldReq : oldVersion->requiredSet()) { - auto currentlyRequired = component->m_cachedRequires.find(oldReq); - if (currentlyRequired == component->m_cachedRequires.cend()) { - auto oldReqComp = componentIndex.find(oldReq.uid); - if (oldReqComp != componentIndex.cend()) { - (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); - addedActions = true; - } - } - } - auto linked = collectTreeLinked(component->getID()); - for (auto comp : linked) { - if (comp->isCustom()) { - continue; - } - auto compUid = comp->getID(); - auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), - [compUid](const Meta::Require& req) { return req.uid == compUid; }); - if (parentReq != component->m_cachedRequires.end()) { - auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; - if (!newVersion.isEmpty()) { - comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ - component->getID(), - component->getName(), - component->getVersion(), - } }); - } - addedActions = true; - } - } - }; + auto visitor = + overload{ [](const UpdateActionNone&) { + // noop + }, + [&component, &instance](const UpdateActionChangeVersion& cv) { + qCDebug(instanceProfileResolveC) << instance->name() << "|" + << "UpdateActionChangeVersion" << component->getID() << ":" + << component->getVersion() << "change to" << cv.targetVersion; + component->setVersion(cv.targetVersion); + component->waitLoadMeta(); + }, + [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; + auto versionList = APPLICATION->metadataIndex()->get(component->getID()); + versionList->waitToLoad(); + if (versionList) { + auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (recommended) { + component->setVersion(recommended->version()); + component->waitLoadMeta(); + return; + } + + auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); + if (latest) { + component->setVersion(latest->version()); + component->waitLoadMeta(); + } else { + component->addComponentProblem(ProblemSeverity::Error, + QObject::tr("No compatible version of %1 found for %2 %3") + .arg(component->getName(), lrc.parentName, lrc.version)); + } + } else { + component->addComponentProblem( + ProblemSeverity::Error, + QObject::tr("No version list in metadata index for %1").arg(component->getID())); + } + }, + [&component, &instance, &toRemove](const UpdateActionRemove&) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateActionRemove" << component->getID() << ":" << component->getVersion() << "removing"; + toRemove.append(component->getID()); + }, + [this, &component, &instance, &addedActions, &componentIndex](const UpdateActionImportantChanged& ic) { + qCDebug(instanceProfileResolveC) + << instance->name() << "|" + << "UpdateImportantChanged" << component->getID() << ":" << component->getVersion() << "was changed from" + << ic.oldVersion << "updating linked components"; + auto oldVersion = APPLICATION->metadataIndex()->getLoadedVersion(component->getID(), ic.oldVersion); + for (auto oldReq : oldVersion->requiredSet()) { + auto currentlyRequired = component->m_cachedRequires.find(oldReq); + if (currentlyRequired == component->m_cachedRequires.cend()) { + auto oldReqComp = componentIndex.find(oldReq.uid); + if (oldReqComp != componentIndex.cend()) { + (*oldReqComp)->setUpdateAction(UpdateAction{ UpdateActionRemove{} }); + addedActions = true; + } + } + } + auto linked = collectTreeLinked(component->getID()); + for (auto comp : linked) { + if (comp->isCustom()) { + continue; + } + auto compUid = comp->getID(); + auto parentReq = std::find_if(component->m_cachedRequires.begin(), component->m_cachedRequires.end(), + [compUid](const Meta::Require& req) { return req.uid == compUid; }); + if (parentReq != component->m_cachedRequires.end()) { + auto newVersion = parentReq->equalsVersion.isEmpty() ? parentReq->suggests : parentReq->equalsVersion; + if (!newVersion.isEmpty()) { + comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + } else { + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + component->getID(), + component->getName(), + component->getVersion(), + } }); + } + addedActions = true; + } + } }; std::visit(visitor, action); component->clearUpdateAction(); for (auto uid : toRemove) { @@ -690,7 +694,7 @@ void ComponentUpdateTask::finalizeComponents() auto found = componentIndex.find(conflict); if (found != componentIndex.cend()) { auto foundComp = *found; - if (foundComp ->isCustom()) { + if (foundComp->isCustom()) { continue; } component->addComponentProblem( diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index c4a2dd273..8623c500f 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -71,7 +71,6 @@ #include "ui/dialogs/CustomMessageBox.h" - PackProfile::PackProfile(MinecraftInstance* instance) : QAbstractListModel() { d.reset(new PackProfileData); From 8488d11c69ad181b4f4f303c4a8984938110b40f Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 28 Jun 2024 09:59:57 -0700 Subject: [PATCH 013/177] review suggestions + spelling Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 17 ++++++++++++++--- launcher/minecraft/Component.h | 17 ++++++----------- launcher/minecraft/ComponentUpdateTask.cpp | 21 +++++++++------------ launcher/minecraft/PackProfile.cpp | 2 +- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 329e6b78e..df27ac071 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "Application.h" #include "FileSystem.h" @@ -50,6 +49,14 @@ #include +const QMap Component::KNOWN_MODLOADERS = { + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, + { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, + { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } +}; + Component::Component(PackProfile* parent, const QString& uid) { assert(parent); @@ -231,11 +238,11 @@ bool Component::isKnownModloader() return iter != KNOWN_MODLOADERS.cend(); } -QStringList Component::knownConfictingComponents() +QStringList Component::knownConflictingComponents() { auto iter = KNOWN_MODLOADERS.find(m_uid); if (iter != KNOWN_MODLOADERS.cend()) { - return (*iter).knownConfictingComponents; + return (*iter).knownConflictingComponents; } else { return {}; } @@ -276,12 +283,16 @@ void Component::addComponentProblem(ProblemSeverity severity, const QString& des m_componentProblemSeverity = severity; } m_componentProblems.append({ severity, description }); + + emit dataChanged(); } void Component::resetComponentProblems() { m_componentProblems.clear(); m_componentProblemSeverity = ProblemSeverity::None; + + emit dataChanged(); } void Component::setVersion(const QString& version) diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 3669638f2..7ff30889f 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -23,7 +23,7 @@ struct UpdateActionChangeVersion { /// version to change to QString targetVersion; }; -struct UpdateActionLatestRecommendedCompatable { +struct UpdateActionLatestRecommendedCompatible { /// Parent uid QString parentUid; QString parentName; @@ -40,20 +40,13 @@ using UpdateActionNone = std::monostate; using UpdateAction = std::variant; struct ModloaderMapEntry { ModPlatform::ModLoaderType type; - QStringList knownConfictingComponents; -}; -static const QMap KNOWN_MODLOADERS{ - { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, - { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, - { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } + QStringList knownConflictingComponents; }; class Component : public QObject, public ProblemProvider { @@ -66,6 +59,8 @@ class Component : public QObject, public ProblemProvider { virtual ~Component() {} + static const QMap KNOWN_MODLOADERS; + void applyTo(LaunchProfile* profile); bool isEnabled(); @@ -79,7 +74,7 @@ class Component : public QObject, public ProblemProvider { bool isCustom(); bool isVersionChangeable(); bool isKnownModloader(); - QStringList knownConfictingComponents(); + QStringList knownConflictingComponents(); // DEPRECATED: explicit numeric order values, used for loading old non-component config. TODO: refactor and move to migration code void setOrder(int order); diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index f4efba36f..6656a84f8 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -570,25 +570,22 @@ void ComponentUpdateTask::performUpdateActions() component->setVersion(cv.targetVersion); component->waitLoadMeta(); }, - [&component, &instance](const UpdateActionLatestRecommendedCompatable lrc) { + [&component, &instance](const UpdateActionLatestRecommendedCompatible lrc) { qCDebug(instanceProfileResolveC) << instance->name() << "|" - << "UpdateActionLatestRecommendedCompatable" << component->getID() << ":" << component->getVersion() + << "UpdateActionLatestRecommendedCompatible" << component->getID() << ":" << component->getVersion() << "updating to latest recommend or compatible with" << lrc.parentUid << lrc.version; auto versionList = APPLICATION->metadataIndex()->get(component->getID()); - versionList->waitToLoad(); if (versionList) { + versionList->waitToLoad(); auto recommended = versionList->getRecommendedForParent(lrc.parentUid, lrc.version); + if (!recommended) { + recommended = versionList->getLatestForParent(lrc.parentUid, lrc.version); + } if (recommended) { component->setVersion(recommended->version()); component->waitLoadMeta(); return; - } - - auto latest = versionList->getLatestForParent(lrc.parentUid, lrc.version); - if (latest) { - component->setVersion(latest->version()); - component->waitLoadMeta(); } else { component->addComponentProblem(ProblemSeverity::Error, QObject::tr("No compatible version of %1 found for %2 %3") @@ -635,14 +632,14 @@ void ComponentUpdateTask::performUpdateActions() if (!newVersion.isEmpty()) { comp->setUpdateAction(UpdateAction{ UpdateActionChangeVersion{ newVersion } }); } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatible{ component->getID(), component->getName(), component->getVersion(), } }); } } else { - comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatable{ + comp->setUpdateAction(UpdateAction{ UpdateActionLatestRecommendedCompatible{ component->getID(), component->getName(), component->getVersion(), @@ -690,7 +687,7 @@ void ComponentUpdateTask::finalizeComponents() } } } - for (auto conflict : component->knownConfictingComponents()) { + for (auto conflict : component->knownConflictingComponents()) { auto found = componentIndex.find(conflict); if (found != componentIndex.cend()) { auto foundComp = *found; diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 8623c500f..d992a18f3 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1034,7 +1034,7 @@ std::optional PackProfile::getModLoaders() ModPlatform::ModLoaderTypes result; bool has_any_loader = false; - QMapIterator i(KNOWN_MODLOADERS); + QMapIterator i(Component::KNOWN_MODLOADERS); while (i.hasNext()) { i.next(); From c886111e18566c10ec15e5c389a3d4d1da3d2ccf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 6 Jul 2024 09:09:54 +0300 Subject: [PATCH 014/177] format the code Signed-off-by: Trial97 --- launcher/meta/VersionList.cpp | 5 ++--- launcher/minecraft/Component.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 28a42d28d..8bc326839 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -254,9 +254,8 @@ void VersionList::setupAddedVersion(const int row, const Version::Ptr& version) connect(version.get(), &Version::requiresChanged, this, [this, row]() { emit dataChanged(index(row), index(row), QVector() << RequiresRole); }); - connect(version.get(), &Version::timeChanged, this, [this, row]() { - emit dataChanged(index(row), index(row), { TimeRole, SortRole }); - }); + connect(version.get(), &Version::timeChanged, this, + [this, row]() { emit dataChanged(index(row), index(row), { TimeRole, SortRole }); }); connect(version.get(), &Version::typeChanged, this, [this, row]() { emit dataChanged(index(row), index(row), { TypeRole }); }); } diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index df27ac071..aeb8a398f 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -291,7 +291,7 @@ void Component::resetComponentProblems() { m_componentProblems.clear(); m_componentProblemSeverity = ProblemSeverity::None; - + emit dataChanged(); } From c666d060fc1503e307d2acbdb1443a26090e6801 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 19 Jul 2024 17:10:04 +0300 Subject: [PATCH 015/177] fix merge issue Signed-off-by: Trial97 --- launcher/minecraft/PackProfile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index ad8652488..f1d2473c2 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1048,8 +1048,8 @@ QList PackProfile::getModLoadersList() { QList result; for (auto c : d->components) { - if (c->isEnabled() && modloaderMapping.contains(c->getID())) { - result.append(modloaderMapping[c->getID()]); + if (c->isEnabled() && Component::KNOWN_MODLOADERS.contains(c->getID())) { + result.append(Component::KNOWN_MODLOADERS[c->getID()].type); } } From fe23e76714598f134f07ba04b482bdb2bf1ee34c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 5 Aug 2024 12:04:08 +0300 Subject: [PATCH 016/177] fix codeql Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h index 0879474cf..ddfa7ae95 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h @@ -1,5 +1,6 @@ #pragma once +#include #include "BaseInstance.h" #include "InstanceCreationTask.h" From 4ea7132bdfdfc53690ababf66f1123c7e0217595 Mon Sep 17 00:00:00 2001 From: Kurumi78 <30587387+Kurumi78@users.noreply.github.com> Date: Fri, 30 Aug 2024 02:08:07 -0500 Subject: [PATCH 017/177] Add webp validIconExtensions Add webp to list of valid file extensions for Icons Signed-off-by: Kurumi78 <30587387+Kurumi78@users.noreply.github.com> --- launcher/icons/IconUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/icons/IconUtils.cpp b/launcher/icons/IconUtils.cpp index 6825dd6da..87e948729 100644 --- a/launcher/icons/IconUtils.cpp +++ b/launcher/icons/IconUtils.cpp @@ -39,7 +39,7 @@ #include "FileSystem.h" namespace { -static const QStringList validIconExtensions = { { "svg", "png", "ico", "gif", "jpg", "jpeg" } }; +static const QStringList validIconExtensions = { { "svg", "png", "ico", "gif", "jpg", "jpeg", "webp" } }; } namespace IconUtils { From 166207753c85d7295208989cd446399f5e833c01 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 5 Sep 2024 09:36:45 +0300 Subject: [PATCH 018/177] ensure that the shortcut destination exists Signed-off-by: Trial97 --- launcher/FileSystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index b5c2c95cf..7f38cff04 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -921,6 +921,10 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (destination.isEmpty()) { destination = PathCombine(getDesktopDir(), RemoveInvalidFilenameChars(name)); } + if (!ensureFilePathExists(destination)) { + qWarning() << "Destination path can't be created!"; + return false; + } #if defined(Q_OS_MACOS) // Create the Application QDir applicationDirectory = From c5592a446ae1f63743d1d777eb5843e25ad376a1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 6 Sep 2024 21:47:35 +0300 Subject: [PATCH 019/177] Remove all the slowdown code from CocurrentTask Signed-off-by: Trial97 --- launcher/tasks/ConcurrentTask.cpp | 64 ++++--------------------------- launcher/tasks/ConcurrentTask.h | 10 ----- 2 files changed, 7 insertions(+), 67 deletions(-) diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp index 6f4a94e7f..f2ee40c31 100644 --- a/launcher/tasks/ConcurrentTask.cpp +++ b/launcher/tasks/ConcurrentTask.cpp @@ -38,8 +38,7 @@ #include #include "tasks/Task.h" -ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) - : Task(parent), m_name(task_name), m_total_max_size(max_concurrent) +ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) : Task(parent), m_total_max_size(max_concurrent) { setObjectName(task_name); } @@ -104,9 +103,9 @@ void ConcurrentTask::clear() m_done.clear(); m_failed.clear(); m_queue.clear(); + m_task_progress.clear(); m_progress = 0; - m_stepProgress = 0; } void ConcurrentTask::executeNextSubTask() @@ -139,7 +138,7 @@ void ConcurrentTask::startSubTask(Task::Ptr next) connect(next.get(), &Task::status, this, [this, next](QString msg) { subTaskStatus(next, msg); }); connect(next.get(), &Task::details, this, [this, next](QString msg) { subTaskDetails(next, msg); }); - connect(next.get(), &Task::stepProgress, this, [this, next](TaskStepProgress const& tp) { subTaskStepProgress(next, tp); }); + connect(next.get(), &Task::stepProgress, this, &ConcurrentTask::stepProgress); connect(next.get(), &Task::progress, this, [this, next](qint64 current, qint64 total) { subTaskProgress(next, current, total); }); @@ -149,7 +148,6 @@ void ConcurrentTask::startSubTask(Task::Ptr next) m_task_progress.insert(next->getUid(), task_progress); updateState(); - updateStepProgress(*task_progress.get(), Operation::ADDED); QMetaObject::invokeMethod(next.get(), &Task::start, Qt::QueuedConnection); } @@ -161,14 +159,14 @@ void ConcurrentTask::subTaskFinished(Task::Ptr task, TaskStepState state) m_doing.remove(task.get()); - auto task_progress = m_task_progress.value(task->getUid()); - task_progress->state = state; + auto task_progress = *m_task_progress.value(task->getUid()); + task_progress.state = state; + m_task_progress.remove(task->getUid()); disconnect(task.get(), 0, this, 0); - emit stepProgress(*task_progress); + emit stepProgress(task_progress); updateState(); - updateStepProgress(*task_progress, Operation::REMOVED); QMetaObject::invokeMethod(this, &ConcurrentTask::executeNextSubTask, Qt::QueuedConnection); } @@ -215,7 +213,6 @@ void ConcurrentTask::subTaskProgress(Task::Ptr task, qint64 current, qint64 tota task_progress->update(current, total); emit stepProgress(*task_progress); - updateStepProgress(*task_progress, Operation::CHANGED); updateState(); if (totalSize() == 1) { @@ -223,52 +220,6 @@ void ConcurrentTask::subTaskProgress(Task::Ptr task, qint64 current, qint64 tota } } -void ConcurrentTask::subTaskStepProgress(Task::Ptr task, TaskStepProgress const& task_progress) -{ - Operation op = Operation::ADDED; - - if (!m_task_progress.contains(task_progress.uid)) { - m_task_progress.insert(task_progress.uid, std::make_shared(task_progress)); - op = Operation::ADDED; - emit stepProgress(task_progress); - updateStepProgress(task_progress, op); - } else { - auto tp = m_task_progress.value(task_progress.uid); - - tp->old_current = tp->current; - tp->old_total = tp->total; - - tp->current = task_progress.current; - tp->total = task_progress.total; - tp->status = task_progress.status; - tp->details = task_progress.details; - - op = Operation::CHANGED; - emit stepProgress(*tp.get()); - updateStepProgress(*tp.get(), op); - } -} - -void ConcurrentTask::updateStepProgress(TaskStepProgress const& changed_progress, Operation op) -{ - switch (op) { - case Operation::ADDED: - m_stepProgress += changed_progress.current; - m_stepTotalProgress += changed_progress.total; - break; - case Operation::REMOVED: - m_stepProgress -= changed_progress.current; - m_stepTotalProgress -= changed_progress.total; - break; - case Operation::CHANGED: - m_stepProgress -= changed_progress.old_current; - m_stepTotalProgress -= changed_progress.old_total; - m_stepProgress += changed_progress.current; - m_stepTotalProgress += changed_progress.total; - break; - } -} - void ConcurrentTask::updateState() { if (totalSize() > 1) { @@ -276,7 +227,6 @@ void ConcurrentTask::updateState() setStatus(tr("Executing %1 task(s) (%2 out of %3 are done)") .arg(QString::number(m_doing.count()), QString::number(m_done.count()), QString::number(totalSize()))); } else { - setProgress(m_stepProgress, m_stepTotalProgress); QString status = tr("Please wait..."); if (m_queue.size() > 0) { status = tr("Waiting for a task to start..."); diff --git a/launcher/tasks/ConcurrentTask.h b/launcher/tasks/ConcurrentTask.h index 07ea58575..0d6709940 100644 --- a/launcher/tasks/ConcurrentTask.h +++ b/launcher/tasks/ConcurrentTask.h @@ -80,23 +80,16 @@ class ConcurrentTask : public Task { void subTaskStatus(Task::Ptr task, const QString& msg); void subTaskDetails(Task::Ptr task, const QString& msg); void subTaskProgress(Task::Ptr task, qint64 current, qint64 total); - void subTaskStepProgress(Task::Ptr task, TaskStepProgress const& task_step_progress); protected: // NOTE: This is not thread-safe. [[nodiscard]] unsigned int totalSize() const { return static_cast(m_queue.size() + m_doing.size() + m_done.size()); } - enum class Operation { ADDED, REMOVED, CHANGED }; - void updateStepProgress(TaskStepProgress const& changed_progress, Operation); - virtual void updateState(); void startSubTask(Task::Ptr task); protected: - QString m_name; - QString m_step_status; - QQueue m_queue; QHash m_doing; @@ -107,7 +100,4 @@ class ConcurrentTask : public Task { QHash> m_task_progress; int m_total_max_size; - - qint64 m_stepProgress = 0; - qint64 m_stepTotalProgress = 100; }; From c2a2e95183977bee5aebdca57fc6e342d7b9c9ed Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 7 Sep 2024 21:35:01 -0700 Subject: [PATCH 020/177] fix: Forge and neoforge conflict with quilt, not fabric twice Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/minecraft/Component.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index aeb8a398f..1073ef324 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -50,8 +50,8 @@ #include const QMap Component::KNOWN_MODLOADERS = { - { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, - { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "net.fabricmc.fabric-loader" } } }, + { "net.neoforged", { ModPlatform::NeoForge, { "net.minecraftforge", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader" } } }, + { "net.minecraftforge", { ModPlatform::Forge, { "net.neoforged", "net.fabricmc.fabric-loader", "org.quiltmc.quilt-loader" } } }, { "net.fabricmc.fabric-loader", { ModPlatform::Fabric, { "net.minecraftforge", "net.neoforged", "org.quiltmc.quilt-loader" } } }, { "org.quiltmc.quilt-loader", { ModPlatform::Quilt, { "net.minecraftforge", "net.neoforged", "net.fabricmc.fabric-loader" } } }, { "com.mumfrey.liteloader", { ModPlatform::LiteLoader, {} } } From 14fb54afd9673eebf43fad454db966e740c2c8e3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 8 Sep 2024 01:00:59 +0300 Subject: [PATCH 021/177] Fix launch when no java is loaded Signed-off-by: Trial97 --- launcher/BaseInstance.h | 4 +- launcher/CMakeLists.txt | 6 +- launcher/NullInstance.h | 2 +- launcher/RuntimeContext.h | 23 +----- launcher/launch/LaunchStep.cpp | 3 +- launcher/launch/LaunchStep.h | 7 +- launcher/launch/LaunchTask.cpp | 1 - launcher/launch/LaunchTask.h | 3 +- launcher/launch/TaskStepWrapper.cpp | 65 +++++++++++++++++ .../{steps/Update.h => TaskStepWrapper.h} | 11 +-- launcher/launch/steps/CheckJava.cpp | 3 + launcher/launch/steps/CheckJava.h | 2 +- launcher/launch/steps/QuitAfterGameStop.h | 2 +- launcher/launch/steps/Update.cpp | 73 ------------------- launcher/minecraft/LaunchProfile.cpp | 1 + launcher/minecraft/MinecraftInstance.cpp | 54 ++++++++------ launcher/minecraft/MinecraftInstance.h | 4 +- launcher/minecraft/MinecraftLoadAndCheck.cpp | 35 ++++----- launcher/minecraft/MinecraftLoadAndCheck.h | 22 ++---- launcher/minecraft/MinecraftUpdate.cpp | 63 ---------------- launcher/minecraft/MinecraftUpdate.h | 33 --------- launcher/minecraft/PackProfile.h | 6 +- launcher/minecraft/launch/AutoInstallJava.h | 1 - launcher/minecraft/launch/ClaimAccount.h | 2 +- launcher/minecraft/update/AssetUpdateTask.cpp | 3 +- launcher/minecraft/update/AssetUpdateTask.h | 2 +- launcher/minecraft/update/FMLLibrariesTask.h | 2 +- launcher/minecraft/update/FoldersTask.cpp | 2 +- launcher/minecraft/update/FoldersTask.h | 2 +- launcher/minecraft/update/LibrariesTask.h | 2 +- launcher/ui/pages/instance/VersionPage.cpp | 14 +++- 31 files changed, 163 insertions(+), 290 deletions(-) create mode 100644 launcher/launch/TaskStepWrapper.cpp rename launcher/launch/{steps/Update.h => TaskStepWrapper.h} (73%) delete mode 100644 launcher/launch/steps/Update.cpp delete mode 100644 launcher/minecraft/MinecraftUpdate.cpp delete mode 100644 launcher/minecraft/MinecraftUpdate.h diff --git a/launcher/BaseInstance.h b/launcher/BaseInstance.h index 8c80331bc..2be28d1ec 100644 --- a/launcher/BaseInstance.h +++ b/launcher/BaseInstance.h @@ -181,7 +181,7 @@ class BaseInstance : public QObject, public std::enable_shared_from_this createUpdateTask() = 0; /// returns a valid launcher (task container) virtual shared_qobject_ptr createLaunchTask(AuthSessionPtr account, MinecraftTarget::Ptr targetToJoin) = 0; @@ -215,7 +215,7 @@ class BaseInstance : public QObject, public std::enable_shared_from_this traits() const override { return {}; }; QString instanceConfigFolder() const override { return instanceRoot(); }; shared_qobject_ptr createLaunchTask(AuthSessionPtr, MinecraftTarget::Ptr) override { return nullptr; } - shared_qobject_ptr createUpdateTask([[maybe_unused]] Net::Mode mode) override { return nullptr; } + QList createUpdateTask() override { return {}; } QProcessEnvironment createEnvironment() override { return QProcessEnvironment(); } QProcessEnvironment createLaunchEnvironment() override { return QProcessEnvironment(); } QMap getVariables() override { return QMap(); } diff --git a/launcher/RuntimeContext.h b/launcher/RuntimeContext.h index c57140d28..85304a5bc 100644 --- a/launcher/RuntimeContext.h +++ b/launcher/RuntimeContext.h @@ -20,13 +20,13 @@ #include #include +#include "SysInfo.h" #include "settings/SettingsObject.h" struct RuntimeContext { QString javaArchitecture; QString javaRealArchitecture; - QString javaPath; - QString system; + QString system = SysInfo::currentSystem(); QString mappedJavaRealArchitecture() const { @@ -45,8 +45,6 @@ struct RuntimeContext { { javaArchitecture = instanceSettings->get("JavaArchitecture").toString(); javaRealArchitecture = instanceSettings->get("JavaRealArchitecture").toString(); - javaPath = instanceSettings->get("JavaPath").toString(); - system = currentSystem(); } QString getClassifier() const { return system + "-" + mappedJavaRealArchitecture(); } @@ -68,21 +66,4 @@ struct RuntimeContext { return x; } - - static QString currentSystem() - { -#if defined(Q_OS_LINUX) - return "linux"; -#elif defined(Q_OS_MACOS) - return "osx"; -#elif defined(Q_OS_WINDOWS) - return "windows"; -#elif defined(Q_OS_FREEBSD) - return "freebsd"; -#elif defined(Q_OS_OPENBSD) - return "openbsd"; -#else - return "unknown"; -#endif - } }; diff --git a/launcher/launch/LaunchStep.cpp b/launcher/launch/LaunchStep.cpp index ebc534617..f3e9dfce0 100644 --- a/launcher/launch/LaunchStep.cpp +++ b/launcher/launch/LaunchStep.cpp @@ -16,9 +16,8 @@ #include "LaunchStep.h" #include "LaunchTask.h" -void LaunchStep::bind(LaunchTask* parent) +LaunchStep::LaunchStep(LaunchTask* parent) : Task(parent), m_parent(parent) { - m_parent = parent; connect(this, &LaunchStep::readyForLaunch, parent, &LaunchTask::onReadyForLaunch); connect(this, &LaunchStep::logLine, parent, &LaunchTask::onLogLine); connect(this, &LaunchStep::logLines, parent, &LaunchTask::onLogLines); diff --git a/launcher/launch/LaunchStep.h b/launcher/launch/LaunchStep.h index 6a28afb1f..d49d7545b 100644 --- a/launcher/launch/LaunchStep.h +++ b/launcher/launch/LaunchStep.h @@ -24,11 +24,8 @@ class LaunchTask; class LaunchStep : public Task { Q_OBJECT public: /* methods */ - explicit LaunchStep(LaunchTask* parent) : Task(nullptr), m_parent(parent) { bind(parent); }; - virtual ~LaunchStep() {}; - - private: /* methods */ - void bind(LaunchTask* parent); + explicit LaunchStep(LaunchTask* parent); + virtual ~LaunchStep() = default; signals: void logLines(QStringList lines, MessageLevel::Enum level); diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 06a32bd28..4e4f5ead4 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -44,7 +44,6 @@ #include #include #include "MessageLevel.h" -#include "java/JavaChecker.h" #include "tasks/Task.h" void LaunchTask::init() diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index ae24b9a26..2fd8c78c7 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -41,7 +41,6 @@ #include "BaseInstance.h" #include "LaunchStep.h" #include "LogModel.h" -#include "LoggedProcess.h" #include "MessageLevel.h" class LaunchTask : public Task { @@ -55,7 +54,7 @@ class LaunchTask : public Task { public: /* methods */ static shared_qobject_ptr create(InstancePtr inst); - virtual ~LaunchTask() {}; + virtual ~LaunchTask() = default; void appendStep(shared_qobject_ptr step); void prependStep(shared_qobject_ptr step); diff --git a/launcher/launch/TaskStepWrapper.cpp b/launcher/launch/TaskStepWrapper.cpp new file mode 100644 index 000000000..136057620 --- /dev/null +++ b/launcher/launch/TaskStepWrapper.cpp @@ -0,0 +1,65 @@ +/* Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TaskStepWrapper.h" +#include "tasks/Task.h" + +void TaskStepWrapper::executeTask() +{ + if (m_state == Task::State::AbortedByUser) { + emitFailed(tr("Task aborted.")); + return; + } + connect(m_task.get(), &Task::finished, this, &TaskStepWrapper::updateFinished); + connect(m_task.get(), &Task::progress, this, &TaskStepWrapper::setProgress); + connect(m_task.get(), &Task::stepProgress, this, &TaskStepWrapper::propagateStepProgress); + connect(m_task.get(), &Task::status, this, &TaskStepWrapper::setStatus); + connect(m_task.get(), &Task::details, this, &TaskStepWrapper::setDetails); + emit progressReportingRequest(); +} + +void TaskStepWrapper::proceed() +{ + m_task->start(); +} + +void TaskStepWrapper::updateFinished() +{ + if (m_task->wasSuccessful()) { + m_task.reset(); + emitSucceeded(); + } else { + QString reason = tr("Instance update failed because: %1\n\n").arg(m_task->failReason()); + m_task.reset(); + emit logLine(reason, MessageLevel::Fatal); + emitFailed(reason); + } +} + +bool TaskStepWrapper::canAbort() const +{ + if (m_task) { + return m_task->canAbort(); + } + return true; +} + +bool TaskStepWrapper::abort() +{ + if (m_task && m_task->canAbort()) { + return m_task->abort(); + } + return Task::abort(); +} diff --git a/launcher/launch/steps/Update.h b/launcher/launch/TaskStepWrapper.h similarity index 73% rename from launcher/launch/steps/Update.h rename to launcher/launch/TaskStepWrapper.h index 878a43e7e..aec1b7037 100644 --- a/launcher/launch/steps/Update.h +++ b/launcher/launch/TaskStepWrapper.h @@ -21,12 +21,11 @@ #include #include -// FIXME: stupid. should be defined by the instance type? or even completely abstracted away... -class Update : public LaunchStep { +class TaskStepWrapper : public LaunchStep { Q_OBJECT public: - explicit Update(LaunchTask* parent, Net::Mode mode) : LaunchStep(parent), m_mode(mode) {}; - virtual ~Update() {}; + explicit TaskStepWrapper(LaunchTask* parent, Task::Ptr task) : LaunchStep(parent), m_task(task) {}; + virtual ~TaskStepWrapper() = default; void executeTask() override; bool canAbort() const override; @@ -38,7 +37,5 @@ class Update : public LaunchStep { void updateFinished(); private: - Task::Ptr m_updateTask; - bool m_aborted = false; - Net::Mode m_mode = Net::Mode::Offline; + Task::Ptr m_task; }; diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 99ff62b67..55d13b58c 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -106,6 +106,7 @@ void CheckJava::executeTask() auto vendorString = instance->settings()->get("JavaVendor").toString(); printJavaInfo(verString, archString, realArchString, vendorString); } + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); } @@ -124,6 +125,7 @@ void CheckJava::checkJavaFinished(const JavaChecker::Result& result) emit logLine(QString("Java checker returned some invalid data we don't understand:"), MessageLevel::Error); emit logLines(result.outLog.split('\n'), MessageLevel::Warning); emit logLine("\nMinecraft might not start properly.", MessageLevel::Launcher); + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); return; } @@ -135,6 +137,7 @@ void CheckJava::checkJavaFinished(const JavaChecker::Result& result) instance->settings()->set("JavaRealArchitecture", result.realPlatform); instance->settings()->set("JavaVendor", result.javaVendor); instance->settings()->set("JavaSignature", m_javaSignature); + m_parent->instance()->updateRuntimeContext(); emitSucceeded(); return; } diff --git a/launcher/launch/steps/CheckJava.h b/launcher/launch/steps/CheckJava.h index 7bb1ceb7e..1c59b0053 100644 --- a/launcher/launch/steps/CheckJava.h +++ b/launcher/launch/steps/CheckJava.h @@ -23,7 +23,7 @@ class CheckJava : public LaunchStep { Q_OBJECT public: explicit CheckJava(LaunchTask* parent) : LaunchStep(parent) {}; - virtual ~CheckJava() {}; + virtual ~CheckJava() = default; virtual void executeTask(); virtual bool canAbort() const { return false; } diff --git a/launcher/launch/steps/QuitAfterGameStop.h b/launcher/launch/steps/QuitAfterGameStop.h index d4324cce6..19ca59632 100644 --- a/launcher/launch/steps/QuitAfterGameStop.h +++ b/launcher/launch/steps/QuitAfterGameStop.h @@ -24,7 +24,7 @@ class QuitAfterGameStop : public LaunchStep { Q_OBJECT public: explicit QuitAfterGameStop(LaunchTask* parent) : LaunchStep(parent) {}; - virtual ~QuitAfterGameStop() {}; + virtual ~QuitAfterGameStop() = default; virtual void executeTask(); virtual bool canAbort() const { return false; } diff --git a/launcher/launch/steps/Update.cpp b/launcher/launch/steps/Update.cpp deleted file mode 100644 index f23c0bb4b..000000000 --- a/launcher/launch/steps/Update.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Update.h" -#include - -void Update::executeTask() -{ - if (m_aborted) { - emitFailed(tr("Task aborted.")); - return; - } - m_updateTask.reset(m_parent->instance()->createUpdateTask(m_mode)); - if (m_updateTask) { - connect(m_updateTask.get(), &Task::finished, this, &Update::updateFinished); - connect(m_updateTask.get(), &Task::progress, this, &Update::setProgress); - connect(m_updateTask.get(), &Task::stepProgress, this, &Update::propagateStepProgress); - connect(m_updateTask.get(), &Task::status, this, &Update::setStatus); - connect(m_updateTask.get(), &Task::details, this, &Update::setDetails); - emit progressReportingRequest(); - return; - } - emitSucceeded(); -} - -void Update::proceed() -{ - m_updateTask->start(); -} - -void Update::updateFinished() -{ - if (m_updateTask->wasSuccessful()) { - m_updateTask.reset(); - emitSucceeded(); - } else { - QString reason = tr("Instance update failed because: %1\n\n").arg(m_updateTask->failReason()); - m_updateTask.reset(); - emit logLine(reason, MessageLevel::Fatal); - emitFailed(reason); - } -} - -bool Update::canAbort() const -{ - if (m_updateTask) { - return m_updateTask->canAbort(); - } - return true; -} - -bool Update::abort() -{ - m_aborted = true; - if (m_updateTask) { - if (m_updateTask->canAbort()) { - return m_updateTask->abort(); - } - } - return true; -} diff --git a/launcher/minecraft/LaunchProfile.cpp b/launcher/minecraft/LaunchProfile.cpp index 468798850..c11a0f915 100644 --- a/launcher/minecraft/LaunchProfile.cpp +++ b/launcher/minecraft/LaunchProfile.cpp @@ -164,6 +164,7 @@ void LaunchProfile::applyCompatibleJavaMajors(QList& javaMajor) { m_compatibleJavaMajors.append(javaMajor); } + void LaunchProfile::applyCompatibleJavaName(QString javaName) { if (!javaName.isEmpty()) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index d861056bf..c94f3f234 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -43,6 +43,9 @@ #include "minecraft/launch/CreateGameFolders.h" #include "minecraft/launch/ExtractNatives.h" #include "minecraft/launch/PrintInstanceInfo.h" +#include "minecraft/update/AssetUpdateTask.h" +#include "minecraft/update/FMLLibrariesTask.h" +#include "minecraft/update/LibrariesTask.h" #include "settings/Setting.h" #include "settings/SettingsObject.h" @@ -53,13 +56,13 @@ #include "pathmatcher/RegexpMatcher.h" #include "launch/LaunchTask.h" +#include "launch/TaskStepWrapper.h" #include "launch/steps/CheckJava.h" #include "launch/steps/LookupServerAddress.h" #include "launch/steps/PostLaunchCommand.h" #include "launch/steps/PreLaunchCommand.h" #include "launch/steps/QuitAfterGameStop.h" #include "launch/steps/TextPrint.h" -#include "launch/steps/Update.h" #include "minecraft/launch/ClaimAccount.h" #include "minecraft/launch/LauncherPartLaunch.h" @@ -70,9 +73,6 @@ #include "java/JavaUtils.h" -#include "meta/Index.h" -#include "meta/VersionList.h" - #include "icons/IconList.h" #include "mod/ModFolderModel.h" @@ -84,7 +84,6 @@ #include "AssetsUtils.h" #include "MinecraftLoadAndCheck.h" -#include "MinecraftUpdate.h" #include "PackProfile.h" #include "minecraft/gameoptions/GameOptions.h" #include "minecraft/update/FoldersTask.h" @@ -218,6 +217,7 @@ void MinecraftInstance::loadSpecificSettings() void MinecraftInstance::updateRuntimeContext() { m_runtimeContext.updateFromInstanceSettings(m_settings); + m_components->invalidateLaunchProfile(); } QString MinecraftInstance::typeName() const @@ -1030,18 +1030,18 @@ QString MinecraftInstance::getStatusbarDescription() return description; } -Task::Ptr MinecraftInstance::createUpdateTask(Net::Mode mode) +QList MinecraftInstance::createUpdateTask() { - updateRuntimeContext(); - switch (mode) { - case Net::Mode::Offline: { - return Task::Ptr(new MinecraftLoadAndCheck(this)); - } - case Net::Mode::Online: { - return Task::Ptr(new MinecraftUpdate(this)); - } - } - return nullptr; + return { + // create folders + makeShared(this), + // libraries download + makeShared(this), + // FML libraries download and copy into the instance + makeShared(this), + // assets update + makeShared(this), + }; } shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) @@ -1090,14 +1090,10 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(step); } - // if we aren't in offline mode,. - if (session->status != AuthSession::PlayableOffline) { - if (!session->demo) { - process->appendStep(makeShared(pptr, session)); - } - process->appendStep(makeShared(pptr, Net::Mode::Online)); - } else { - process->appendStep(makeShared(pptr, Net::Mode::Offline)); + // load meta + { + auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline; + process->appendStep(makeShared(pptr, makeShared(this, mode, pptr))); } // check java @@ -1106,6 +1102,16 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr)); } + // if we aren't in offline mode,. + if (session->status != AuthSession::PlayableOffline) { + if (!session->demo) { + process->appendStep(makeShared(pptr, session)); + } + for (auto t : createUpdateTask()) { + process->appendStep(makeShared(pptr, t)); + } + } + // if there are any jar mods { process->appendStep(makeShared(pptr)); diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index ad2cda186..75e97ae45 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -104,7 +104,7 @@ class MinecraftInstance : public BaseInstance { /** Returns whether the instance, with its version, has support for demo mode. */ [[nodiscard]] bool supportsDemo() const; - void updateRuntimeContext(); + void updateRuntimeContext() override; ////// Profile management ////// std::shared_ptr getPackProfile() const; @@ -120,7 +120,7 @@ class MinecraftInstance : public BaseInstance { std::shared_ptr gameOptionsModel(); ////// Launch stuff ////// - Task::Ptr createUpdateTask(Net::Mode mode) override; + QList createUpdateTask() override; shared_qobject_ptr createLaunchTask(AuthSessionPtr account, MinecraftTarget::Ptr targetToJoin) override; QStringList extraArguments() override; QStringList verboseDescription(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) override; diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index 818e90cfc..655894d2a 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -2,41 +2,42 @@ #include "MinecraftInstance.h" #include "PackProfile.h" -MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, QObject* parent) : Task(parent), m_inst(inst) {} +MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent) + : Task(parent), m_inst(inst), m_netmode(netmode) +{} void MinecraftLoadAndCheck::executeTask() { // add offline metadata load task auto components = m_inst->getPackProfile(); - components->reload(Net::Mode::Offline); + components->reload(m_netmode); m_task = components->getCurrentTask(); if (!m_task) { emitSucceeded(); return; } - connect(m_task.get(), &Task::succeeded, this, &MinecraftLoadAndCheck::subtaskSucceeded); - connect(m_task.get(), &Task::failed, this, &MinecraftLoadAndCheck::subtaskFailed); - connect(m_task.get(), &Task::aborted, this, [this] { subtaskFailed(tr("Aborted")); }); - connect(m_task.get(), &Task::progress, this, &MinecraftLoadAndCheck::progress); + connect(m_task.get(), &Task::succeeded, this, &MinecraftLoadAndCheck::emitSucceeded); + connect(m_task.get(), &Task::failed, this, &MinecraftLoadAndCheck::emitFailed); + connect(m_task.get(), &Task::aborted, this, [this] { emitFailed(tr("Aborted")); }); + connect(m_task.get(), &Task::progress, this, &MinecraftLoadAndCheck::setProgress); connect(m_task.get(), &Task::stepProgress, this, &MinecraftLoadAndCheck::propagateStepProgress); connect(m_task.get(), &Task::status, this, &MinecraftLoadAndCheck::setStatus); + connect(m_task.get(), &Task::details, this, &MinecraftLoadAndCheck::setDetails); } -void MinecraftLoadAndCheck::subtaskSucceeded() +bool MinecraftLoadAndCheck::canAbort() const { - if (isFinished()) { - qCritical() << "MinecraftUpdate: Subtask" << sender() << "succeeded, but work was already done!"; - return; + if (m_task) { + return m_task->canAbort(); } - emitSucceeded(); + return true; } -void MinecraftLoadAndCheck::subtaskFailed(QString error) +bool MinecraftLoadAndCheck::abort() { - if (isFinished()) { - qCritical() << "MinecraftUpdate: Subtask" << sender() << "failed, but work was already done!"; - return; + if (m_task && m_task->canAbort()) { + return m_task->abort(); } - emitFailed(error); -} + return Task::abort(); +} \ No newline at end of file diff --git a/launcher/minecraft/MinecraftLoadAndCheck.h b/launcher/minecraft/MinecraftLoadAndCheck.h index 09edaf909..72e9e0caa 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.h +++ b/launcher/minecraft/MinecraftLoadAndCheck.h @@ -15,32 +15,24 @@ #pragma once -#include -#include -#include - -#include +#include "net/Mode.h" #include "tasks/Task.h" -#include "QObjectPtr.h" - -class MinecraftVersion; class MinecraftInstance; class MinecraftLoadAndCheck : public Task { Q_OBJECT public: - explicit MinecraftLoadAndCheck(MinecraftInstance* inst, QObject* parent = 0); - virtual ~MinecraftLoadAndCheck() {}; + explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent = nullptr); + virtual ~MinecraftLoadAndCheck() = default; void executeTask() override; - private slots: - void subtaskSucceeded(); - void subtaskFailed(QString error); + bool canAbort() const override; + public slots: + bool abort() override; private: MinecraftInstance* m_inst = nullptr; Task::Ptr m_task; - QString m_preFailure; - QString m_fail_reason; + Net::Mode m_netmode; }; diff --git a/launcher/minecraft/MinecraftUpdate.cpp b/launcher/minecraft/MinecraftUpdate.cpp deleted file mode 100644 index b63430aa8..000000000 --- a/launcher/minecraft/MinecraftUpdate.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MinecraftUpdate.h" -#include "MinecraftInstance.h" - -#include "minecraft/PackProfile.h" - -#include "tasks/SequentialTask.h" -#include "update/AssetUpdateTask.h" -#include "update/FMLLibrariesTask.h" -#include "update/FoldersTask.h" -#include "update/LibrariesTask.h" - -MinecraftUpdate::MinecraftUpdate(MinecraftInstance* inst, QObject* parent) : SequentialTask(parent), m_inst(inst) {} - -void MinecraftUpdate::executeTask() -{ - m_queue.clear(); - // create folders - { - addTask(makeShared(m_inst)); - } - - // add metadata update task if necessary - { - auto components = m_inst->getPackProfile(); - components->reload(Net::Mode::Online); - auto task = components->getCurrentTask(); - if (task) { - addTask(task); - } - } - - // libraries download - { - addTask(makeShared(m_inst)); - } - - // FML libraries download and copy into the instance - { - addTask(makeShared(m_inst)); - } - - // assets update - { - addTask(makeShared(m_inst)); - } - - SequentialTask::executeTask(); -} diff --git a/launcher/minecraft/MinecraftUpdate.h b/launcher/minecraft/MinecraftUpdate.h deleted file mode 100644 index 456a13518..000000000 --- a/launcher/minecraft/MinecraftUpdate.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "tasks/SequentialTask.h" - -class MinecraftInstance; - -// this needs to be a task because components->reload does stuff that may block -class MinecraftUpdate : public SequentialTask { - Q_OBJECT - public: - explicit MinecraftUpdate(MinecraftInstance* inst, QObject* parent = 0); - virtual ~MinecraftUpdate() = default; - - void executeTask() override; - - private: - MinecraftInstance* m_inst = nullptr; -}; diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index 9b6710cc3..b2de26ea0 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -148,13 +148,13 @@ class PackProfile : public QAbstractListModel { std::optional getSupportedModLoaders(); QList getModLoadersList(); + /// apply the component patches. Catches all the errors and returns true/false for success/failure + void invalidateLaunchProfile(); + private: void scheduleSave(); bool saveIsScheduled() const; - /// apply the component patches. Catches all the errors and returns true/false for success/failure - void invalidateLaunchProfile(); - /// insert component so that its index is ideally the specified one (returns real index) void insertComponent(size_t index, ComponentPtr component); diff --git a/launcher/minecraft/launch/AutoInstallJava.h b/launcher/minecraft/launch/AutoInstallJava.h index 7e4efc50c..cbfcf5ee7 100644 --- a/launcher/minecraft/launch/AutoInstallJava.h +++ b/launcher/minecraft/launch/AutoInstallJava.h @@ -37,7 +37,6 @@ #include #include -#include "java/JavaMetadata.h" #include "meta/Version.h" #include "minecraft/MinecraftInstance.h" #include "tasks/Task.h" diff --git a/launcher/minecraft/launch/ClaimAccount.h b/launcher/minecraft/launch/ClaimAccount.h index 357a4d4c5..561f0e848 100644 --- a/launcher/minecraft/launch/ClaimAccount.h +++ b/launcher/minecraft/launch/ClaimAccount.h @@ -22,7 +22,7 @@ class ClaimAccount : public LaunchStep { Q_OBJECT public: explicit ClaimAccount(LaunchTask* parent, AuthSessionPtr session); - virtual ~ClaimAccount() {}; + virtual ~ClaimAccount() = default; void executeTask() override; void finalize() override; diff --git a/launcher/minecraft/update/AssetUpdateTask.cpp b/launcher/minecraft/update/AssetUpdateTask.cpp index 8add02d84..acdddc833 100644 --- a/launcher/minecraft/update/AssetUpdateTask.cpp +++ b/launcher/minecraft/update/AssetUpdateTask.cpp @@ -1,5 +1,6 @@ #include "AssetUpdateTask.h" +#include "launch/LaunchStep.h" #include "minecraft/AssetsUtils.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" @@ -14,8 +15,6 @@ AssetUpdateTask::AssetUpdateTask(MinecraftInstance* inst) m_inst = inst; } -AssetUpdateTask::~AssetUpdateTask() {} - void AssetUpdateTask::executeTask() { setStatus(tr("Updating assets index...")); diff --git a/launcher/minecraft/update/AssetUpdateTask.h b/launcher/minecraft/update/AssetUpdateTask.h index 6f053a54a..88fac0ac5 100644 --- a/launcher/minecraft/update/AssetUpdateTask.h +++ b/launcher/minecraft/update/AssetUpdateTask.h @@ -7,7 +7,7 @@ class AssetUpdateTask : public Task { Q_OBJECT public: AssetUpdateTask(MinecraftInstance* inst); - virtual ~AssetUpdateTask(); + virtual ~AssetUpdateTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/FMLLibrariesTask.h b/launcher/minecraft/update/FMLLibrariesTask.h index 32712d239..4fe2648e8 100644 --- a/launcher/minecraft/update/FMLLibrariesTask.h +++ b/launcher/minecraft/update/FMLLibrariesTask.h @@ -9,7 +9,7 @@ class FMLLibrariesTask : public Task { Q_OBJECT public: FMLLibrariesTask(MinecraftInstance* inst); - virtual ~FMLLibrariesTask() {}; + virtual ~FMLLibrariesTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/FoldersTask.cpp b/launcher/minecraft/update/FoldersTask.cpp index c74e8d2ef..7d6fc4394 100644 --- a/launcher/minecraft/update/FoldersTask.cpp +++ b/launcher/minecraft/update/FoldersTask.cpp @@ -37,7 +37,7 @@ #include #include "minecraft/MinecraftInstance.h" -FoldersTask::FoldersTask(MinecraftInstance* inst) : Task() +FoldersTask::FoldersTask(MinecraftInstance* inst) { m_inst = inst; } diff --git a/launcher/minecraft/update/FoldersTask.h b/launcher/minecraft/update/FoldersTask.h index be4e33eb7..7df7ef81d 100644 --- a/launcher/minecraft/update/FoldersTask.h +++ b/launcher/minecraft/update/FoldersTask.h @@ -7,7 +7,7 @@ class FoldersTask : public Task { Q_OBJECT public: FoldersTask(MinecraftInstance* inst); - virtual ~FoldersTask() {}; + virtual ~FoldersTask() = default; void executeTask() override; diff --git a/launcher/minecraft/update/LibrariesTask.h b/launcher/minecraft/update/LibrariesTask.h index 441191154..838f9d9b4 100644 --- a/launcher/minecraft/update/LibrariesTask.h +++ b/launcher/minecraft/update/LibrariesTask.h @@ -7,7 +7,7 @@ class LibrariesTask : public Task { Q_OBJECT public: LibrariesTask(MinecraftInstance* inst); - virtual ~LibrariesTask() {}; + virtual ~LibrariesTask() = default; void executeTask() override; diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index c55d32efb..02bb08cab 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -50,7 +50,9 @@ #include #include +#include "QObjectPtr.h" #include "VersionPage.h" +#include "tasks/SequentialTask.h" #include "ui/dialogs/InstallLoaderDialog.h" #include "ui_VersionPage.h" @@ -415,14 +417,18 @@ void VersionPage::on_actionDownload_All_triggered() return; } - auto updateTask = m_inst->createUpdateTask(Net::Mode::Online); - if (!updateTask) { + auto updateTasks = m_inst->createUpdateTask(); + if (updateTasks.isEmpty()) { return; } + auto task = makeShared(this); + for (auto t : updateTasks) { + task->addTask(t); + } ProgressDialog tDialog(this); - connect(updateTask.get(), &Task::failed, this, &VersionPage::onGameUpdateError); + connect(task.get(), &Task::failed, this, &VersionPage::onGameUpdateError); // FIXME: unused return value - tDialog.execWithTask(updateTask.get()); + tDialog.execWithTask(task.get()); updateButtons(); m_container->refreshContainer(); } From 7fbf0d3bf3c3821916119a5303d6bc302f954580 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Mon, 9 Sep 2024 15:40:31 +0200 Subject: [PATCH 022/177] Sort files chronologically in descending order Signed-off-by: Qaz --- launcher/ui/pages/instance/ScreenshotsPage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index c3f955733..9c7df9d09 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -242,6 +242,10 @@ ScreenshotsPage::ScreenshotsPage(QString path, QWidget* parent) : QMainWindow(pa m_model->setReadOnly(false); m_model->setNameFilters({ "*.png" }); m_model->setNameFilterDisables(false); + // Sorts by modified date instead of creation date because that column is not available and would require subclassing, this should work + // considering screenshots aren't modified after creation. + constexpr int file_modified_column_index = 3; + m_model->sort(file_modified_column_index, Qt::DescendingOrder); m_folder = path; m_valid = FS::ensureFolderPathExists(m_folder); From e2ef280da98facec04a0e2b3d0f0e8b8317db043 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Mon, 9 Sep 2024 16:24:40 +0200 Subject: [PATCH 023/177] DCO Remediation Commit for QazCetelic I, QazCetelic , hereby add my Signed-off-by to this commit: 7fbf0d3bf3c3821916119a5303d6bc302f954580 Signed-off-by: QazCetelic --- launcher/ui/pages/instance/ScreenshotsPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index 9c7df9d09..b619a07b8 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -246,6 +246,7 @@ ScreenshotsPage::ScreenshotsPage(QString path, QWidget* parent) : QMainWindow(pa // considering screenshots aren't modified after creation. constexpr int file_modified_column_index = 3; m_model->sort(file_modified_column_index, Qt::DescendingOrder); + m_folder = path; m_valid = FS::ensureFolderPathExists(m_folder); From 7e49fa04269b23c8cb4048a6a036aaf6d5e5bf8e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:05:56 +0000 Subject: [PATCH 024/177] chore(deps): update determinatesystems/update-flake-lock action to v24 --- .github/workflows/update-flake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index e1ab2e86e..ecc38ff28 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 - - uses: DeterminateSystems/update-flake-lock@v23 + - uses: DeterminateSystems/update-flake-lock@v24 with: commit-msg: "chore(nix): update lockfile" pr-title: "chore(nix): update lockfile" From c85294af9debc472446585b7851f41596fbcc0be Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 12 Sep 2024 17:57:57 +0300 Subject: [PATCH 025/177] Improve wizzard page Signed-off-by: Trial97 --- launcher/Application.cpp | 35 +++++-- launcher/CMakeLists.txt | 6 ++ .../ui/setupwizard/AutoJavaWizardPage.cpp | 33 +++++++ launcher/ui/setupwizard/AutoJavaWizardPage.h | 22 +++++ launcher/ui/setupwizard/AutoJavaWizardPage.ui | 93 +++++++++++++++++++ launcher/ui/setupwizard/JavaWizardPage.cpp | 4 +- launcher/ui/setupwizard/JavaWizardPage.h | 2 +- launcher/ui/setupwizard/LoginWizardPage.cpp | 45 +++++++++ launcher/ui/setupwizard/LoginWizardPage.h | 24 +++++ launcher/ui/setupwizard/LoginWizardPage.ui | 74 +++++++++++++++ launcher/ui/widgets/JavaSettingsWidget.cpp | 77 ++++++++++----- launcher/ui/widgets/JavaSettingsWidget.h | 8 +- 12 files changed, 384 insertions(+), 39 deletions(-) create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.cpp create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.h create mode 100644 launcher/ui/setupwizard/AutoJavaWizardPage.ui create mode 100644 launcher/ui/setupwizard/LoginWizardPage.cpp create mode 100644 launcher/ui/setupwizard/LoginWizardPage.h create mode 100644 launcher/ui/setupwizard/LoginWizardPage.ui diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9cd0445e6..35eb6e91e 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -67,8 +67,10 @@ #include "ui/pages/global/MinecraftPage.h" #include "ui/pages/global/ProxyPage.h" +#include "ui/setupwizard/AutoJavaWizardPage.h" #include "ui/setupwizard/JavaWizardPage.h" #include "ui/setupwizard/LanguageWizardPage.h" +#include "ui/setupwizard/LoginWizardPage.h" #include "ui/setupwizard/PasteWizardPage.h" #include "ui/setupwizard/SetupWizard.h" #include "ui/setupwizard/ThemeWizardPage.h" @@ -650,6 +652,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) auto defaultEnableAutoJava = m_settings->get("JavaPath").toString().isEmpty(); m_settings->registerSetting("AutomaticJavaSwitch", defaultEnableAutoJava); m_settings->registerSetting("AutomaticJavaDownload", defaultEnableAutoJava); + m_settings->registerSetting("UserAskedAboutAutomaticJavaDownload", false); // Legacy settings m_settings->registerSetting("OnlineFixes", false); @@ -1077,13 +1080,15 @@ bool Application::createSetupWizard() } return false; }(); + bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !m_settings->get("AutomaticJavaDownload").toBool() && + !m_settings->get("AutomaticJavaSwitch").toBool() && !m_settings->get("UserAskedAboutAutomaticJavaDownload").toBool(); bool languageRequired = settings()->get("Language").toString().isEmpty(); bool pasteInterventionRequired = settings()->get("PastebinURL") != ""; bool validWidgets = m_themeManager->isValidApplicationTheme(settings()->get("ApplicationTheme").toString()); bool validIcons = m_themeManager->isValidIconTheme(settings()->get("IconTheme").toString()); + bool login = !m_accounts->anyAccountIsValid() && capabilities() & Application::SupportsMSA; bool themeInterventionRequired = !validWidgets || !validIcons; - bool wizardRequired = javaRequired || languageRequired || pasteInterventionRequired || themeInterventionRequired; - + bool wizardRequired = javaRequired || languageRequired || pasteInterventionRequired || themeInterventionRequired || askjava || login; if (wizardRequired) { // set default theme after going into theme wizard if (!validIcons) @@ -1100,6 +1105,8 @@ bool Application::createSetupWizard() if (javaRequired) { m_setupWizard->addPage(new JavaWizardPage(m_setupWizard)); + } else if (askjava) { + m_setupWizard->addPage(new AutoJavaWizardPage(m_setupWizard)); } if (pasteInterventionRequired) { @@ -1110,11 +1117,14 @@ bool Application::createSetupWizard() m_setupWizard->addPage(new ThemeWizardPage(m_setupWizard)); } + if (login) { + m_setupWizard->addPage(new LoginWizardPage(m_setupWizard)); + } connect(m_setupWizard, &QDialog::finished, this, &Application::setupWizardFinished); m_setupWizard->show(); - return true; } - return false; + + return wizardRequired || login; } bool Application::updaterEnabled() @@ -1259,16 +1269,23 @@ Application::~Application() void Application::messageReceived(const QByteArray& message) { - if (status() != Initialized) { - qDebug() << "Received message" << message << "while still initializing. It will be ignored."; - return; - } - ApplicationMessage received; received.parse(message); auto& command = received.command; + if (status() != Initialized) { + bool isLoginAtempt = false; + if (command == "import") { + QString url = received.args["url"]; + isLoginAtempt = !url.isEmpty() && normalizeImportUrl(url).scheme() == BuildConfig.LAUNCHER_APP_BINARY_NAME; + } + if (!isLoginAtempt) { + qDebug() << "Received message" << message << "while still initializing. It will be ignored."; + return; + } + } + if (command == "activate") { showMainWindow(); } else if (command == "import") { diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index a65d53d06..975946740 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -842,6 +842,10 @@ SET(LAUNCHER_SOURCES ui/setupwizard/PasteWizardPage.h ui/setupwizard/ThemeWizardPage.cpp ui/setupwizard/ThemeWizardPage.h + ui/setupwizard/AutoJavaWizardPage.cpp + ui/setupwizard/AutoJavaWizardPage.h + ui/setupwizard/LoginWizardPage.cpp + ui/setupwizard/LoginWizardPage.h # GUI - themes ui/themes/FusionTheme.cpp @@ -1154,6 +1158,8 @@ endif() qt_wrap_ui(LAUNCHER_UI ui/MainWindow.ui ui/setupwizard/PasteWizardPage.ui + ui/setupwizard/AutoJavaWizardPage.ui + ui/setupwizard/LoginWizardPage.ui ui/setupwizard/ThemeWizardPage.ui ui/pages/global/AccountListPage.ui ui/pages/global/JavaPage.ui diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.cpp b/launcher/ui/setupwizard/AutoJavaWizardPage.cpp new file mode 100644 index 000000000..fd173e71d --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.cpp @@ -0,0 +1,33 @@ +#include "AutoJavaWizardPage.h" +#include "ui_AutoJavaWizardPage.h" + +#include "Application.h" + +AutoJavaWizardPage::AutoJavaWizardPage(QWidget* parent) : BaseWizardPage(parent), ui(new Ui::AutoJavaWizardPage) +{ + ui->setupUi(this); +} + +AutoJavaWizardPage::~AutoJavaWizardPage() +{ + delete ui; +} + +void AutoJavaWizardPage::initializePage() {} + +bool AutoJavaWizardPage::validatePage() +{ + auto s = APPLICATION->settings(); + + if (!ui->previousSettingsRadioButton->isChecked()) { + s->set("AutomaticJavaSwitch", true); + s->set("AutomaticJavaDownload", true); + } + s->set("UserAskedAboutAutomaticJavaDownload", true); + return true; +} + +void AutoJavaWizardPage::retranslate() +{ + ui->retranslateUi(this); +} diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.h b/launcher/ui/setupwizard/AutoJavaWizardPage.h new file mode 100644 index 000000000..fcdf5bdf1 --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include "BaseWizardPage.h" + +namespace Ui { +class AutoJavaWizardPage; +} + +class AutoJavaWizardPage : public BaseWizardPage { + Q_OBJECT + + public: + explicit AutoJavaWizardPage(QWidget* parent = nullptr); + ~AutoJavaWizardPage(); + + void initializePage() override; + bool validatePage() override; + void retranslate() override; + + private: + Ui::AutoJavaWizardPage* ui; +}; diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.ui b/launcher/ui/setupwizard/AutoJavaWizardPage.ui new file mode 100644 index 000000000..bd72cf695 --- /dev/null +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.ui @@ -0,0 +1,93 @@ + + + AutoJavaWizardPage + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + <html><head/><body><p><span style=" font-size:14pt; font-weight:600;">New Feature Alert!</span></p></body></html> + + + Qt::RichText + + + true + + + + + + + We've added a feature to automatically download the correct Java version for each version of Minecraft(this can be changed in the Java Settings). Would you like to enable or disable this feature? + + + true + + + + + + + Qt::Horizontal + + + + + + + Enable Auto-Download + + + true + + + buttonGroup + + + + + + + Disable Auto-Download + + + false + + + buttonGroup + + + + + + + Qt::Vertical + + + + 20 + 156 + + + + + + + + + + + + diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index a47cebcaa..47718d6da 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -55,6 +55,7 @@ bool JavaWizardPage::validatePage() auto result = m_java_widget->validate(); settings->set("AutomaticJavaSwitch", m_java_widget->autoDetectJava()); settings->set("AutomaticJavaDownload", m_java_widget->autoDownloadJava()); + settings->set("UserAskedAboutAutomaticJavaDownload", true); switch (result) { default: case JavaSettingsWidget::ValidationStatus::Bad: { @@ -82,7 +83,6 @@ void JavaWizardPage::retranslate() { setTitle(tr("Java")); setSubTitle( - tr("You do not have a working Java set up yet or it went missing.\n" - "Please select one of the following or browse for a Java executable.")); + tr("Please select how much memory to allocate to instances and if Prism Launcher should manage java automatically or manually.")); m_java_widget->retranslate(); } diff --git a/launcher/ui/setupwizard/JavaWizardPage.h b/launcher/ui/setupwizard/JavaWizardPage.h index dde765f27..9bf9cfa2b 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.h +++ b/launcher/ui/setupwizard/JavaWizardPage.h @@ -9,7 +9,7 @@ class JavaWizardPage : public BaseWizardPage { public: explicit JavaWizardPage(QWidget* parent = Q_NULLPTR); - virtual ~JavaWizardPage() {}; + virtual ~JavaWizardPage() = default; bool wantsRefreshButton() override; void refresh() override; diff --git a/launcher/ui/setupwizard/LoginWizardPage.cpp b/launcher/ui/setupwizard/LoginWizardPage.cpp new file mode 100644 index 000000000..6be24a2f7 --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.cpp @@ -0,0 +1,45 @@ +#include "LoginWizardPage.h" +#include "minecraft/auth/AccountList.h" +#include "ui/dialogs/MSALoginDialog.h" +#include "ui_LoginWizardPage.h" + +#include "Application.h" + +LoginWizardPage::LoginWizardPage(QWidget* parent) : BaseWizardPage(parent), ui(new Ui::LoginWizardPage) +{ + ui->setupUi(this); +} + +LoginWizardPage::~LoginWizardPage() +{ + delete ui; +} + +void LoginWizardPage::initializePage() {} + +bool LoginWizardPage::validatePage() +{ + return true; +} + +void LoginWizardPage::retranslate() +{ + ui->retranslateUi(this); +} + +void LoginWizardPage::on_pushButton_clicked() +{ + wizard()->hide(); + auto account = MSALoginDialog::newAccount(nullptr); + wizard()->show(); + if (account) { + APPLICATION->accounts()->addAccount(account); + APPLICATION->accounts()->setDefaultAccount(account); + } + + if (wizard()->currentId() == wizard()->pageIds().last()) { + wizard()->accept(); + } else { + wizard()->next(); + } +} diff --git a/launcher/ui/setupwizard/LoginWizardPage.h b/launcher/ui/setupwizard/LoginWizardPage.h new file mode 100644 index 000000000..af71fc183 --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include "BaseWizardPage.h" + +namespace Ui { +class LoginWizardPage; +} + +class LoginWizardPage : public BaseWizardPage { + Q_OBJECT + + public: + explicit LoginWizardPage(QWidget* parent = nullptr); + ~LoginWizardPage(); + + void initializePage() override; + bool validatePage() override; + void retranslate() override; + private slots: + void on_pushButton_clicked(); + + private: + Ui::LoginWizardPage* ui; +}; diff --git a/launcher/ui/setupwizard/LoginWizardPage.ui b/launcher/ui/setupwizard/LoginWizardPage.ui new file mode 100644 index 000000000..191316c4e --- /dev/null +++ b/launcher/ui/setupwizard/LoginWizardPage.ui @@ -0,0 +1,74 @@ + + + LoginWizardPage + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + <html><head/><body><p><span style=" font-size:14pt; font-weight:600;">Add Microsoft account</span></p></body></html> + + + Qt::RichText + + + true + + + + + + + In order to play Minecraft, you must have at least one Microsoft account logged in. Do you want to log in now? + + + true + + + + + + + Qt::Horizontal + + + + + + + Add Microsoft account + + + + + + + Qt::Vertical + + + + 20 + 156 + + + + + + + + + + + + diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 8e2d94556..2b270c482 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -3,9 +3,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -34,11 +36,13 @@ JavaSettingsWidget::JavaSettingsWidget(QWidget* parent) : QWidget(parent) goodIcon = APPLICATION->getThemedIcon("status-good"); yellowIcon = APPLICATION->getThemedIcon("status-yellow"); badIcon = APPLICATION->getThemedIcon("status-bad"); + m_memoryTimer = new QTimer(this); setupUi(); - connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); - connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); - connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryValueChanged(int))); + connect(m_minMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_maxMemSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_permGenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int))); + connect(m_memoryTimer, &QTimer::timeout, this, &JavaSettingsWidget::memoryValueChanged); connect(m_versionWidget, &VersionSelectWidget::selectedVersionChanged, this, &JavaSettingsWidget::javaVersionSelected); connect(m_javaBrowseBtn, &QPushButton::clicked, this, &JavaSettingsWidget::on_javaBrowseBtn_clicked); connect(m_javaPathTextBox, &QLineEdit::textEdited, this, &JavaSettingsWidget::javaPathEdited); @@ -55,7 +59,6 @@ void JavaSettingsWidget::setupUi() m_verticalLayout->setObjectName(QStringLiteral("verticalLayout")); m_versionWidget = new VersionSelectWidget(this); - m_verticalLayout->addWidget(m_versionWidget); m_horizontalLayout = new QHBoxLayout(); m_horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); @@ -73,8 +76,6 @@ void JavaSettingsWidget::setupUi() m_javaStatusBtn->setIcon(yellowIcon); m_horizontalLayout->addWidget(m_javaStatusBtn); - m_verticalLayout->addLayout(m_horizontalLayout); - m_memoryGroupBox = new QGroupBox(this); m_memoryGroupBox->setObjectName(QStringLiteral("memoryGroupBox")); m_gridLayout_2 = new QGridLayout(m_memoryGroupBox); @@ -136,8 +137,6 @@ void JavaSettingsWidget::setupUi() m_horizontalBtnLayout->addWidget(m_javaDownloadBtn); } - m_verticalLayout->addLayout(m_horizontalBtnLayout); - m_autoJavaGroupBox = new QGroupBox(this); m_autoJavaGroupBox->setObjectName(QStringLiteral("autoJavaGroupBox")); m_veriticalJavaLayout = new QVBoxLayout(m_autoJavaGroupBox); @@ -145,21 +144,42 @@ void JavaSettingsWidget::setupUi() m_autodetectJavaCheckBox = new QCheckBox(m_autoJavaGroupBox); m_autodetectJavaCheckBox->setObjectName("autodetectJavaCheckBox"); + m_autodetectJavaCheckBox->setChecked(true); m_veriticalJavaLayout->addWidget(m_autodetectJavaCheckBox); if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { m_autodownloadCheckBox = new QCheckBox(m_autoJavaGroupBox); m_autodownloadCheckBox->setObjectName("autodownloadCheckBox"); - m_autodownloadCheckBox->setEnabled(false); + m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); m_veriticalJavaLayout->addWidget(m_autodownloadCheckBox); connect(m_autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { m_autodownloadCheckBox->setEnabled(m_autodetectJavaCheckBox->isChecked()); if (!m_autodetectJavaCheckBox->isChecked()) m_autodownloadCheckBox->setChecked(false); }); + + connect(m_autodownloadCheckBox, &QCheckBox::stateChanged, this, [this] { + auto isChecked = m_autodownloadCheckBox->isChecked(); + m_versionWidget->setVisible(!isChecked); + m_javaStatusBtn->setVisible(!isChecked); + m_javaBrowseBtn->setVisible(!isChecked); + m_javaPathTextBox->setVisible(!isChecked); + m_javaDownloadBtn->setVisible(!isChecked); + if (!isChecked) { + m_verticalLayout->removeItem(m_verticalSpacer); + } else { + m_verticalLayout->addSpacerItem(m_verticalSpacer); + } + }); } m_verticalLayout->addWidget(m_autoJavaGroupBox); + m_verticalLayout->addLayout(m_horizontalBtnLayout); + + m_verticalLayout->addWidget(m_versionWidget); + m_verticalLayout->addLayout(m_horizontalLayout); + m_verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + retranslate(); } @@ -177,23 +197,16 @@ void JavaSettingsWidget::initialize() m_maxMemSpinBox->setValue(observedMaxMemory); m_permGenSpinBox->setValue(observedPermGenMemory); updateThresholds(); - if (BuildConfig.JAVA_DOWNLOADER_ENABLED) { - auto button = - CustomMessageBox::selectable(this, tr("Automatic Java Download"), - tr("%1 can automatically download the correct Java version for each version of Minecraft..\n" - "Do you want to enable Java auto-download?\n") - .arg(BuildConfig.LAUNCHER_DISPLAYNAME), - QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) - ->exec(); - auto checked = button == QMessageBox::Yes; - m_autodetectJavaCheckBox->setChecked(checked); - m_autodownloadCheckBox->setChecked(checked); + m_autodownloadCheckBox->setChecked(true); } } void JavaSettingsWidget::refresh() { + if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) { + return; + } if (JavaUtils::getJavaCheckPath().isEmpty()) { JavaCommon::javaCheckNotFound(this); return; @@ -297,20 +310,21 @@ int JavaSettingsWidget::permGenSize() const return m_permGenSpinBox->value(); } -void JavaSettingsWidget::memoryValueChanged(int) +void JavaSettingsWidget::memoryValueChanged() { bool actuallyChanged = false; unsigned int min = m_minMemSpinBox->value(); unsigned int max = m_maxMemSpinBox->value(); unsigned int permgen = m_permGenSpinBox->value(); - QObject* obj = sender(); - if (obj == m_minMemSpinBox && min != observedMinMemory) { + if (min != observedMinMemory) { observedMinMemory = min; actuallyChanged = true; - } else if (obj == m_maxMemSpinBox && max != observedMaxMemory) { + } + if (max != observedMaxMemory) { observedMaxMemory = max; actuallyChanged = true; - } else if (obj == m_permGenSpinBox && permgen != observedPermGenMemory) { + } + if (permgen != observedPermGenMemory) { observedPermGenMemory = permgen; actuallyChanged = true; } @@ -505,6 +519,9 @@ void JavaSettingsWidget::updateThresholds() } else if (observedMaxMemory < observedMinMemory) { iconName = "status-yellow"; m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation is smaller than the minimum value")); + } else if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_autodownloadCheckBox->isChecked()) { + iconName = "status-good"; + m_labelMaxMemIcon->setToolTip(""); } else if (observedMaxMemory > 2048 && !m_result.is_64bit) { iconName = "status-bad"; m_labelMaxMemIcon->setToolTip(tr("You are exceeding the maximum allocation supported by 32-bit installations of Java.")); @@ -530,3 +547,13 @@ bool JavaSettingsWidget::autoDetectJava() const { return m_autodetectJavaCheckBox->isChecked(); } + +void JavaSettingsWidget::onSpinBoxValueChanged(int) +{ + m_memoryTimer->start(500); +} + +JavaSettingsWidget::~JavaSettingsWidget() +{ + delete m_verticalSpacer; +}; \ No newline at end of file diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 622c473fe..35be48478 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -17,6 +17,7 @@ class QGroupBox; class QGridLayout; class QLabel; class QToolButton; +class QSpacerItem; /** * This is a widget for all the Java settings dialogs and pages. @@ -26,7 +27,7 @@ class JavaSettingsWidget : public QWidget { public: explicit JavaSettingsWidget(QWidget* parent); - virtual ~JavaSettingsWidget() = default; + virtual ~JavaSettingsWidget(); enum class JavaStatus { NotSet, Pending, Good, DoesNotExist, DoesNotStart, ReturnedInvalidData } javaStatus = JavaStatus::NotSet; @@ -48,7 +49,8 @@ class JavaSettingsWidget : public QWidget { void updateThresholds(); protected slots: - void memoryValueChanged(int); + void onSpinBoxValueChanged(int); + void memoryValueChanged(); void javaPathEdited(const QString& path); void javaVersionSelected(BaseVersion::Ptr version); void on_javaBrowseBtn_clicked(); @@ -65,6 +67,7 @@ class JavaSettingsWidget : public QWidget { private: /* data */ VersionSelectWidget* m_versionWidget = nullptr; QVBoxLayout* m_verticalLayout = nullptr; + QSpacerItem* m_verticalSpacer = nullptr; QLineEdit* m_javaPathTextBox = nullptr; QPushButton* m_javaBrowseBtn = nullptr; @@ -99,4 +102,5 @@ class JavaSettingsWidget : public QWidget { uint64_t m_availableMemory = 0ull; shared_qobject_ptr m_checker; JavaChecker::Result m_result; + QTimer* m_memoryTimer; }; From 973b43ca7a12cdcb6891d069b3bb6782eda6f28a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 20:01:45 +0300 Subject: [PATCH 026/177] Add techinc client ID Signed-off-by: Trial97 --- launcher/Application.cpp | 3 ++ launcher/ui/pages/global/APIPage.cpp | 2 ++ launcher/ui/pages/global/APIPage.ui | 34 +++++++++++++++++-- .../modplatform/technic/TechnicModel.cpp | 4 +++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9cd0445e6..ba9a9caa9 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -777,6 +777,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // FTBApp instances m_settings->registerSetting("FTBAppInstancesPath", ""); + // Custom Techinc Client ID + m_settings->registerSetting("TechincClientID", ""); + // Init page provider { m_globalSettingsProvider = std::make_shared(tr("Settings")); diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 82aa76a4f..4beb0b886 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,6 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); + ui->techicClientID->setText(s->get("TechincClientID").toString()); } void APIPage::applySettings() @@ -172,6 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); + s->set("TechincClientID", ui->techicClientID->text()); } bool APIPage::apply() diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index a7f3f3f72..f52d41d23 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -6,8 +6,8 @@ 0 0 - 800 - 600 + 841 + 620 @@ -288,6 +288,36 @@ + + + + Techinc Client ID + + + + + + <html><head/><body><p>Note: you only need to set this to access private data.</p></body></html> + + + + + + + (None) + + + + + + + Enter a custom GUID client ID for Techinc here. + + + + + + diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 4181edab6..55a8b254c 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -154,6 +154,10 @@ void Technic::ListModel::performSearch() QString("%1search?build=%2&q=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm); searchMode = List; } + auto clientId = APPLICATION->settings()->get("TechincClientID").toString(); + if (!clientId.isEmpty()) { + searchUrl += "?cid=" + clientId; + } netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response)); jobPtr = netJob; jobPtr->start(); From d20f24d96fa35311935b58aa6cbae5623f437c6a Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Fri, 13 Sep 2024 21:13:21 +0300 Subject: [PATCH 027/177] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/Application.cpp | 4 ++-- launcher/ui/pages/global/APIPage.cpp | 4 ++-- launcher/ui/pages/global/APIPage.ui | 6 +++--- launcher/ui/pages/modplatform/technic/TechnicModel.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ba9a9caa9..815f842c5 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -777,8 +777,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // FTBApp instances m_settings->registerSetting("FTBAppInstancesPath", ""); - // Custom Techinc Client ID - m_settings->registerSetting("TechincClientID", ""); + // Custom Technic Client ID + m_settings->registerSetting("TechnicClientID", ""); // Init page provider { diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 4beb0b886..0af34bcd6 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,7 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); - ui->techicClientID->setText(s->get("TechincClientID").toString()); + ui->techicClientID->setText(s->get("TechnicClientID").toString()); } void APIPage::applySettings() @@ -173,7 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); - s->set("TechincClientID", ui->techicClientID->text()); + s->set("TechincClientID", ui->technicClientID->text()); } bool APIPage::apply() diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index f52d41d23..9c713aa79 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -291,7 +291,7 @@ - Techinc Client ID + Technic Client ID @@ -302,7 +302,7 @@ - + (None) @@ -311,7 +311,7 @@ - Enter a custom GUID client ID for Techinc here. + Enter a custom GUID client ID for Technic here. diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 55a8b254c..f7e7f4433 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -154,7 +154,7 @@ void Technic::ListModel::performSearch() QString("%1search?build=%2&q=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm); searchMode = List; } - auto clientId = APPLICATION->settings()->get("TechincClientID").toString(); + auto clientId = APPLICATION->settings()->get("TechnicClientID").toString(); if (!clientId.isEmpty()) { searchUrl += "?cid=" + clientId; } From 1db122f1a29b90f2b556aeaddb7336233c0c4769 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 21:37:50 +0300 Subject: [PATCH 028/177] fix typo Signed-off-by: Trial97 --- launcher/ui/pages/global/APIPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 0af34bcd6..5ec6fbce5 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -143,7 +143,7 @@ void APIPage::loadSettings() ui->modrinthToken->setText(modrinthToken); QString customUserAgent = s->get("UserAgentOverride").toString(); ui->userAgentLineEdit->setText(customUserAgent); - ui->techicClientID->setText(s->get("TechnicClientID").toString()); + ui->technicClientID->setText(s->get("TechnicClientID").toString()); } void APIPage::applySettings() From e18e9b0509b93513e9e99a4f571faa3f34764fc5 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 22:57:08 +0300 Subject: [PATCH 029/177] fix server launch Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index c94f3f234..98ac7647f 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -193,7 +193,7 @@ void MinecraftInstance::loadSpecificSettings() } // Join server on launch, this does not have a global override - m_settings->registerSetting({ "JoinServerOnLaunch", "JoinOnLaunch" }, false); + m_settings->registerSetting("JoinServerOnLaunch", false); m_settings->registerSetting("JoinServerOnLaunchAddress", ""); m_settings->registerSetting("JoinWorldOnLaunch", ""); @@ -1063,7 +1063,7 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt process->appendStep(makeShared(pptr)); } - if (!targetToJoin && settings()->get("JoinOnLaunch").toBool()) { + if (!targetToJoin && settings()->get("JoinServerOnLaunch").toBool()) { QString fullAddress = settings()->get("JoinServerOnLaunchAddress").toString(); if (!fullAddress.isEmpty()) { targetToJoin.reset(new MinecraftTarget(MinecraftTarget::parse(fullAddress, false))); From 6706317f2076b20095eac8c7ad8495cf8e1172df Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 13 Sep 2024 23:26:04 +0300 Subject: [PATCH 030/177] fix java crash on refresh Signed-off-by: Trial97 --- launcher/Filter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Filter.h b/launcher/Filter.h index a8c9c14d8..ae835e724 100644 --- a/launcher/Filter.h +++ b/launcher/Filter.h @@ -57,5 +57,5 @@ class ExactListFilter : public Filter { bool accepts(const QString& value) override; private: - const QStringList& m_pattern; + QStringList m_pattern; }; From 22ebf7e9611432ec6bc9a85df363a2cf6487d0b3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 00:13:16 +0300 Subject: [PATCH 031/177] fix download java abort being stuck Signed-off-by: Trial97 --- launcher/launch/TaskStepWrapper.cpp | 4 +++- launcher/minecraft/MinecraftLoadAndCheck.cpp | 4 +++- launcher/minecraft/launch/AutoInstallJava.cpp | 14 +++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/launcher/launch/TaskStepWrapper.cpp b/launcher/launch/TaskStepWrapper.cpp index 136057620..db9e8fad2 100644 --- a/launcher/launch/TaskStepWrapper.cpp +++ b/launcher/launch/TaskStepWrapper.cpp @@ -59,7 +59,9 @@ bool TaskStepWrapper::canAbort() const bool TaskStepWrapper::abort() { if (m_task && m_task->canAbort()) { - return m_task->abort(); + auto status = m_task->abort(); + emitFailed("Aborted."); + return status; } return Task::abort(); } diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index 655894d2a..a9dcdf067 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -37,7 +37,9 @@ bool MinecraftLoadAndCheck::canAbort() const bool MinecraftLoadAndCheck::abort() { if (m_task && m_task->canAbort()) { - return m_task->abort(); + auto status = m_task->abort(); + emitFailed("Aborted."); + return status; } return Task::abort(); } \ No newline at end of file diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 3f58a28a6..5daf89382 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -180,10 +180,7 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) deletePath(); emitFailed(reason); }); - connect(this, &Task::aborted, this, [this, deletePath] { - m_current_task->abort(); - deletePath(); - }); + connect(m_current_task.get(), &Task::aborted, this, [deletePath] { deletePath(); }); connect(m_current_task.get(), &Task::succeeded, this, &AutoInstallJava::setJavaPathFromPartial); connect(m_current_task.get(), &Task::failed, this, &AutoInstallJava::tryNextMajorJava); connect(m_current_task.get(), &Task::progress, this, &AutoInstallJava::setProgress); @@ -236,7 +233,10 @@ void AutoInstallJava::tryNextMajorJava() } bool AutoInstallJava::abort() { - if (m_current_task && m_current_task->canAbort()) - return m_current_task->abort(); - return true; + if (m_current_task && m_current_task->canAbort()) { + auto status = m_current_task->abort(); + emitFailed("Aborted."); + return status; + } + return Task::abort(); } From e59f90eca8db7f60328ee2ca93c6b20053572ea6 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Sat, 14 Sep 2024 00:19:48 +0300 Subject: [PATCH 032/177] Update launcher/ui/pages/global/APIPage.cpp Co-authored-by: TheKodeToad Signed-off-by: Alexandru Ionut Tripon --- launcher/ui/pages/global/APIPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index 5ec6fbce5..a137c4cde 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -173,7 +173,7 @@ void APIPage::applySettings() QString modrinthToken = ui->modrinthToken->text(); s->set("ModrinthToken", modrinthToken); s->set("UserAgentOverride", ui->userAgentLineEdit->text()); - s->set("TechincClientID", ui->technicClientID->text()); + s->set("TechnicClientID", ui->technicClientID->text()); } bool APIPage::apply() From 5073fc19d437f9e070d2dba27e353eb6e505a7de Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 00:36:31 +0300 Subject: [PATCH 033/177] fix java autodetect when instance settings are open Signed-off-by: Trial97 --- launcher/ui/pages/instance/InstanceSettingsPage.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 19bc9fdf9..cf8d86cd4 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -351,6 +351,9 @@ void InstanceSettingsPage::loadSettings() [this] { ui->javaSettingsGroupBox->setChecked(m_settings->get("OverrideJavaLocation").toBool()); }); ui->javaSettingsGroupBox->setChecked(overrideLocation); ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); + connect(m_settings->getSetting("JavaPath").get(), &Setting::SettingChanged, ui->javaSettingsGroupBox, + [this] { ui->javaPathTextBox->setText(m_settings->get("JavaPath").toString()); }); + ui->skipCompatibilityCheckbox->setChecked(m_settings->get("IgnoreJavaCompatibility").toBool()); ui->javaArgumentsGroupBox->setChecked(overrideArgs); From 312009513d0b3b3a8e08d386bd249ea85aa8bdef Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 18:27:12 +0300 Subject: [PATCH 034/177] add open java folder action Signed-off-by: Trial97 --- launcher/Application.cpp | 1 + launcher/LaunchController.cpp | 1 + launcher/ui/MainWindow.cpp | 7 +++++++ launcher/ui/MainWindow.h | 2 +- launcher/ui/MainWindow.ui | 15 ++++++++++++++- launcher/ui/themes/ThemeManager.h | 4 +++- 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 35eb6e91e..3bed11db2 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1870,6 +1870,7 @@ QUrl Application::normalizeImportUrl(QString const& url) return QUrl::fromUserInput(url); } } + const QString Application::javaPath() { return m_settings->get("JavaDir").toString(); diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 73800574f..687da1322 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include "BuildConfig.h" diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index a5ccbc19a..f19ac85d2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -233,6 +233,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi if (qgetenv("XDG_CURRENT_DESKTOP") == "gamescope") { ui->mainToolBar->addAction(ui->actionCloseWindow); } + + ui->actionViewJavaFolder->setVisible(BuildConfig.JAVA_DOWNLOADER_ENABLED); } // add the toolbar toggles to the view menu @@ -1223,6 +1225,11 @@ void MainWindow::on_actionViewLogsFolder_triggered() DesktopServices::openPath("logs", true); } +void MainWindow::on_actionViewJavaFolder_triggered() +{ + DesktopServices::openPath(APPLICATION->javaPath(), true); +} + void MainWindow::refreshInstances() { APPLICATION->instances()->loadList(); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index 41bef9980..0e692eda7 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -48,7 +48,6 @@ #include "BaseInstance.h" #include "minecraft/auth/MinecraftAccount.h" -#include "net/NetJob.h" class LaunchController; class NewsChecker; @@ -119,6 +118,7 @@ class MainWindow : public QMainWindow { void on_actionViewCatPackFolder_triggered(); void on_actionViewIconsFolder_triggered(); void on_actionViewLogsFolder_triggered(); + void on_actionViewJavaFolder_triggered(); void on_actionViewSkinsFolder_triggered(); diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index bad8762ad..819a1efe7 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -131,7 +131,7 @@ 0 0 800 - 22 + 27 @@ -192,6 +192,7 @@ + @@ -788,6 +789,18 @@ Open the cat packs folder in a file browser. + + + + .. + + + Java + + + Open the java folder in a file browser. + + diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index c7e32bc8c..a9036107c 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -18,10 +18,12 @@ */ #pragma once +#include +#include #include +#include #include "IconTheme.h" -#include "ui/MainWindow.h" #include "ui/themes/CatPack.h" #include "ui/themes/ITheme.h" From 0afdce8a31b94fca64fe064d83a07223b6a490a6 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 14 Sep 2024 21:18:20 +0300 Subject: [PATCH 035/177] Add extra step to macos java install Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 2 + launcher/java/download/SymlinkTask.cpp | 81 +++++++++++++++++++ launcher/java/download/SymlinkTask.h | 36 +++++++++ launcher/minecraft/launch/AutoInstallJava.cpp | 9 +++ launcher/ui/java/InstallJavaDialog.cpp | 8 ++ 5 files changed, 136 insertions(+) create mode 100644 launcher/java/download/SymlinkTask.cpp create mode 100644 launcher/java/download/SymlinkTask.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 975946740..bd6dfc5b6 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -439,6 +439,8 @@ set(JAVA_SOURCES java/download/ArchiveDownloadTask.h java/download/ManifestDownloadTask.cpp java/download/ManifestDownloadTask.h + java/download/SymlinkTask.cpp + java/download/SymlinkTask.h ui/java/InstallJavaDialog.h ui/java/InstallJavaDialog.cpp diff --git a/launcher/java/download/SymlinkTask.cpp b/launcher/java/download/SymlinkTask.cpp new file mode 100644 index 000000000..9841c5015 --- /dev/null +++ b/launcher/java/download/SymlinkTask.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "java/download/SymlinkTask.h" +#include + +#include "FileSystem.h" + +namespace Java { +SymlinkTask::SymlinkTask(QString final_path) : m_path(final_path) {} + +QString findBinPath(QString root, QString pattern) +{ + auto path = FS::PathCombine(root, pattern); + if (QFileInfo::exists(path)) { + return path; + } + + auto entries = QDir(root).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (auto& entry : entries) { + path = FS::PathCombine(entry.absoluteFilePath(), pattern); + if (QFileInfo::exists(path)) { + return path; + } + } + + return {}; +} + +void SymlinkTask::executeTask() +{ + setStatus(tr("Check Java bin")); + const auto binPath = FS::PathCombine("bin", "java"); + const auto wantedPath = FS::PathCombine(m_path, binPath); + if (QFileInfo::exists(wantedPath)) { + emitSucceeded(); + return; + } + + setStatus(tr("Search for Java bin")); + const auto contentsPartialPath = FS::PathCombine("Contents", "Home", binPath); + const auto relativePathToBin = findBinPath(m_path, contentsPartialPath); + if (relativePathToBin.isEmpty()) { + emitFailed(tr("Failed to find bin java")); + return; + } + const auto folderToLink = relativePathToBin.chopped(binPath.length()); + + setStatus(tr("Collect folders to symlink")); + auto entries = QDir(folderToLink).entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); + QList files; + setProgress(0, entries.length()); + for (auto& entry : entries) { + files.append({ entry.absoluteFilePath(), FS::PathCombine(m_path, entry.fileName()) }); + } + + setStatus(tr("Symlink Java")); + FS::create_link folderLink(files); + connect(&folderLink, &FS::create_link::fileLinked, [this](QString src, QString dst) { setProgress(m_progress + 1, m_progressTotal); }); + if (!folderLink()) { + emitFailed(folderLink.getOSError().message().c_str()); + } else { + emitSucceeded(); + } +} + +} // namespace Java \ No newline at end of file diff --git a/launcher/java/download/SymlinkTask.h b/launcher/java/download/SymlinkTask.h new file mode 100644 index 000000000..88cb20dd7 --- /dev/null +++ b/launcher/java/download/SymlinkTask.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "tasks/Task.h" +namespace Java { + +class SymlinkTask : public Task { + Q_OBJECT + public: + SymlinkTask(QString final_path); + virtual ~SymlinkTask() = default; + + void executeTask() override; + + protected: + QString m_path; + Task::Ptr m_task; +}; +} // namespace Java \ No newline at end of file diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 5daf89382..4fad6f15f 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -41,6 +41,7 @@ #include "Application.h" #include "FileSystem.h" #include "MessageLevel.h" +#include "QObjectPtr.h" #include "SysInfo.h" #include "java/JavaInstall.h" #include "java/JavaInstallList.h" @@ -48,10 +49,12 @@ #include "java/JavaVersion.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" +#include "java/download/SymlinkTask.h" #include "meta/Index.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" #include "net/Mode.h" +#include "tasks/SequentialTask.h" AutoInstallJava::AutoInstallJava(LaunchTask* parent) : LaunchStep(parent) @@ -175,6 +178,12 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) emitFailed(tr("Could not determine Java download type!")); return; } +#if defined(Q_OS_MACOS) + auto seq = makeShared(this, tr("Install Java")); + seq->addTask(m_current_task); + seq->addTask(makeShared(final_path)); + m_current_task = seq; +#endif auto deletePath = [final_path] { FS::deletePath(final_path); }; connect(m_current_task.get(), &Task::failed, this, [this, deletePath](QString reason) { deletePath(); diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 4fb9fc2d2..f01edc5e5 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -31,10 +31,12 @@ #include "Filter.h" #include "java/download/ArchiveDownloadTask.h" #include "java/download/ManifestDownloadTask.h" +#include "java/download/SymlinkTask.h" #include "meta/Index.h" #include "meta/VersionList.h" #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" +#include "tasks/SequentialTask.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/java/VersionList.h" @@ -313,6 +315,12 @@ void InstallDialog::done(int result) CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); deletePath(); } +#if defined(Q_OS_MACOS) + auto seq = makeShared(this, tr("Install Java")); + seq->addTask(task); + seq->addTask(makeShared(final_path)); + task = seq; +#endif connect(task.get(), &Task::failed, this, [this, &deletePath](QString reason) { QString error = QString("Java download failed: %1").arg(reason); CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); From 1c6bd74ed8d4818231dd153993ed1643dc4e4543 Mon Sep 17 00:00:00 2001 From: QazCetelic Date: Sat, 14 Sep 2024 22:04:18 +0200 Subject: [PATCH 036/177] Disable folder action instead of hiding it and add additional information in the tooltip. Signed-off-by: QazCetelic --- launcher/ui/MainWindow.cpp | 3 ++- launcher/ui/MainWindow.ui | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index f19ac85d2..3f0bb3281 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -234,7 +234,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi ui->mainToolBar->addAction(ui->actionCloseWindow); } - ui->actionViewJavaFolder->setVisible(BuildConfig.JAVA_DOWNLOADER_ENABLED); + ui->actionViewJavaFolder->setEnabled(BuildConfig.JAVA_DOWNLOADER_ENABLED); + } // add the toolbar toggles to the view menu diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index 819a1efe7..89e536b01 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -798,7 +798,7 @@ Java - Open the java folder in a file browser. + Open the java folder in a file browser. Only available if the built-in Java downloader is used. From 8932a42644411924e64a96c4c905b9f8071fba64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Sep 2024 00:24:43 +0000 Subject: [PATCH 037/177] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/c374d94f1536013ca8e92341b540eba4c22f9c62?narHash=sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh%2BaRKoCdaAv5fiO0%3D' (2024-08-21) → 'github:NixOS/nixpkgs/4f807e8940284ad7925ebd0a0993d2a1791acb2f?narHash=sha256-IiA3jfbR7K/B5%2B9byVi9BZGWTD4VSbWe8VLpp9B/iYk%3D' (2024-09-11) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 58ae840c2..58bc4e30f 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1724224976, - "narHash": "sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh+aRKoCdaAv5fiO0=", + "lastModified": 1726062873, + "narHash": "sha256-IiA3jfbR7K/B5+9byVi9BZGWTD4VSbWe8VLpp9B/iYk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c374d94f1536013ca8e92341b540eba4c22f9c62", + "rev": "4f807e8940284ad7925ebd0a0993d2a1791acb2f", "type": "github" }, "original": { From d38e7fa1424c406b86c5556e9c78c870eaa6b317 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 12:41:33 +0300 Subject: [PATCH 038/177] Add more null protection for skin management Signed-off-by: Trial97 --- launcher/minecraft/skins/SkinList.cpp | 6 +++++- launcher/minecraft/skins/SkinModel.cpp | 2 +- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 16 ++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/launcher/minecraft/skins/SkinList.cpp b/launcher/minecraft/skins/SkinList.cpp index fd883ad52..017cb8dc2 100644 --- a/launcher/minecraft/skins/SkinList.cpp +++ b/launcher/minecraft/skins/SkinList.cpp @@ -336,7 +336,11 @@ void SkinList::save() arr << s.toJSON(); } doc["skins"] = arr; - Json::write(doc, m_dir.absoluteFilePath("index.json")); + try { + Json::write(doc, m_dir.absoluteFilePath("index.json")); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to write skin index file :" << e.cause(); + } } int SkinList::getSelectedAccountSkin() diff --git a/launcher/minecraft/skins/SkinModel.cpp b/launcher/minecraft/skins/SkinModel.cpp index d53b9e762..937864e2c 100644 --- a/launcher/minecraft/skins/SkinModel.cpp +++ b/launcher/minecraft/skins/SkinModel.cpp @@ -41,7 +41,7 @@ SkinModel::SkinModel(QDir skinDir, QJsonObject obj) QString SkinModel::name() const { - return QFileInfo(m_path).baseName(); + return QFileInfo(m_path).completeBaseName(); } bool SkinModel::rename(QString newName) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index a947af632..6c85ffa96 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -116,7 +116,7 @@ void SkinManageDialog::selectionChanged(QItemSelection selected, QItemSelection return; m_selected_skin = key; auto skin = m_list.skin(key); - if (!skin) + if (!skin || !skin->isValid()) return; ui->selectedModel->setPixmap(skin->getTexture().scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); ui->capeCombo->setCurrentIndex(m_capes_idx.value(skin->getCapeId())); @@ -212,7 +212,10 @@ void SkinManageDialog::setupCapes() void SkinManageDialog::on_capeCombo_currentIndexChanged(int index) { auto id = ui->capeCombo->currentData(); - ui->capeImage->setPixmap(m_capes.value(id.toString(), {}).scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); + auto cape = m_capes.value(id.toString(), {}); + if (!cape.isNull()) { + ui->capeImage->setPixmap(cape.scaled(size() * (1. / 3), Qt::KeepAspectRatio, Qt::FastTransformation)); + } if (auto skin = m_list.skin(m_selected_skin); skin) { skin->setCapeId(id.toString()); } @@ -505,8 +508,13 @@ void SkinManageDialog::resizeEvent(QResizeEvent* event) QSize s = size() * (1. / 3); if (auto skin = m_list.skin(m_selected_skin); skin) { - ui->selectedModel->setPixmap(skin->getTexture().scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + if (skin->isValid()) { + ui->selectedModel->setPixmap(skin->getTexture().scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + } } auto id = ui->capeCombo->currentData(); - ui->capeImage->setPixmap(m_capes.value(id.toString(), {}).scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + auto cape = m_capes.value(id.toString(), {}); + if (!cape.isNull()) { + ui->capeImage->setPixmap(cape.scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation)); + } } From d2f0d1d8d5529dc1bd462c4795c4746b13a3fb65 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 12:42:09 +0300 Subject: [PATCH 039/177] Wrap FS::write in try catch Signed-off-by: Trial97 --- launcher/InstanceCopyTask.cpp | 6 +++++- launcher/ui/dialogs/ExportToModListDialog.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index ff2d37723..0220a4144 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -173,7 +173,11 @@ void InstanceCopyTask::copyFinished() allowed_symlinks_file .filePath()); // we dont want to modify the original. also make sure the resulting file is not itself a link. - FS::write(allowed_symlinks_file.filePath(), allowed_symlinks); + try { + FS::write(allowed_symlinks_file.filePath(), allowed_symlinks); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to write symlink :" << e.cause(); + } } emitSucceeded(); diff --git a/launcher/ui/dialogs/ExportToModListDialog.cpp b/launcher/ui/dialogs/ExportToModListDialog.cpp index 1e0ae87a3..908743ab0 100644 --- a/launcher/ui/dialogs/ExportToModListDialog.cpp +++ b/launcher/ui/dialogs/ExportToModListDialog.cpp @@ -164,7 +164,12 @@ void ExportToModListDialog::done(int result) if (output.isEmpty()) return; - FS::write(output, ui->finalText->toPlainText().toUtf8()); + + try { + FS::write(output, ui->finalText->toPlainText().toUtf8()); + } catch (const FS::FileSystemException& e) { + qCritical() << "Failed to save mod list file :" << e.cause(); + } } QDialog::done(result); From 2c2defb2660c26731191a9ebf6c48912eb36e20b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 14:30:23 +0300 Subject: [PATCH 040/177] add Launcher_ prefix to enable java option Signed-off-by: Trial97 --- .github/workflows/build.yml | 10 +++++----- CMakeLists.txt | 6 +++--- buildconfig/BuildConfig.cpp.in | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 942289b0b..25e1c2aab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -266,23 +266,23 @@ jobs: - name: Configure CMake (macOS) if: runner.os == 'macOS' && matrix.qt_ver == 6 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -G Ninja - name: Configure CMake (macOS-Legacy) if: runner.os == 'macOS' && matrix.qt_ver == 5 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja - name: Configure CMake (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} -G Ninja - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON -DLauncher_BUILD_ARTIFACT=${{ matrix.name }}-Qt${{ matrix.qt_ver }} # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { @@ -297,7 +297,7 @@ jobs: - name: Configure CMake (Linux) if: runner.os == 'Linux' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DLauncher_BUILD_ARTIFACT=Linux-Qt${{ matrix.qt_ver }} -G Ninja ## # BUILD diff --git a/CMakeLists.txt b/CMakeLists.txt index 7445e574a..8727c2ef3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,17 +220,17 @@ set(Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against") # Java downloader -set(ENABLE_JAVA_DOWNLOADER_DEFAULT ON) +set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT ON) # Although we recommend enabling this, we cannot guarantee binary compatibility on # differing Linux/BSD/etc distributions. Downstream packagers should be explicitly opt-ing into this # feature if they know it will work with their distribution. if(UNIX AND NOT APPLE) - set(ENABLE_JAVA_DOWNLOADER_DEFAULT OFF) + set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT OFF) endif() # Java downloader -option(ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ${ENABLE_JAVA_DOWNLOADER_DEFAULT}) +option(Launcher_ENABLE_JAVA_DOWNLOADER "Build the java downloader feature" ${Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT}) # Native libraries if(UNIX AND APPLE) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a2b5c2187..f85b84dfb 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -81,8 +81,8 @@ Config::Config() UPDATER_ENABLED = true; } - #cmakedefine01 ENABLE_JAVA_DOWNLOADER - JAVA_DOWNLOADER_ENABLED = ENABLE_JAVA_DOWNLOADER; + #cmakedefine01 Launcher_ENABLE_JAVA_DOWNLOADER + JAVA_DOWNLOADER_ENABLED = Launcher_ENABLE_JAVA_DOWNLOADER; GIT_COMMIT = "@Launcher_GIT_COMMIT@"; GIT_TAG = "@Launcher_GIT_TAG@"; From ca6b62c773554213e507e915034d3a68933d0a1e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 15:51:51 +0300 Subject: [PATCH 041/177] move some URLs in cmake Signed-off-by: Trial97 --- CMakeLists.txt | 3 +++ buildconfig/BuildConfig.cpp.in | 3 +++ buildconfig/BuildConfig.h | 9 +++++++-- launcher/minecraft/auth/steps/MSAStep.cpp | 9 +++++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7445e574a..6b9cb8ea8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,6 +176,8 @@ endif() set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") +set(Launcher_SUCCESSFULL_LOGIN_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user succesfully logins.") +set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") ######## Set version numbers ######## set(Launcher_VERSION_MAJOR 9) @@ -205,6 +207,7 @@ set(Launcher_BUG_TRACKER_URL "https://github.com/PrismLauncher/PrismLauncher/iss # Translations Platform URL set(Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/prismlauncher/launcher/" CACHE STRING "URL for the translations platform.") +set(Launcher_TRANSLATIONS_BASE_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") # Matrix Space set(Launcher_MATRIX_URL "https://prismlauncher.org/matrix" CACHE STRING "URL to the Matrix Space") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a2b5c2187..121ce0729 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -116,16 +116,19 @@ Config::Config() NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@"; NEWS_OPEN_URL = "@Launcher_NEWS_OPEN_URL@"; HELP_URL = "@Launcher_HELP_URL@"; + SUCCESSFULL_LOGIN_URL = "@Launcher_SUCCESSFULL_LOGIN_URL@"; IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@"; MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@"; FLAME_API_KEY = "@Launcher_CURSEFORGE_API_KEY@"; META_URL = "@Launcher_META_URL@"; + FMLLIBS_BASE_URL = "@Launcher_FMLLIBS_BASE_URL@"; GLFW_LIBRARY_NAME = "@Launcher_GLFW_LIBRARY_NAME@"; OPENAL_LIBRARY_NAME = "@Launcher_OPENAL_LIBRARY_NAME@"; BUG_TRACKER_URL = "@Launcher_BUG_TRACKER_URL@"; TRANSLATIONS_URL = "@Launcher_TRANSLATIONS_URL@"; + TRANSLATIONS_BASE_URL = "@Launcher_TRANSLATIONS_BASE_URL@"; MATRIX_URL = "@Launcher_MATRIX_URL@"; DISCORD_URL = "@Launcher_DISCORD_URL@"; SUBREDDIT_URL = "@Launcher_SUBREDDIT_URL@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index bb633f297..4684f5709 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -133,6 +133,11 @@ class Config { */ QString HELP_URL; + /** + * URL that gets opened when the user succesfully logins. + */ + QString SUCCESSFULL_LOGIN_URL; + /** * Client ID you can get from Imgur when you register an application */ @@ -165,8 +170,8 @@ class Config { QString RESOURCE_BASE = "https://resources.download.minecraft.net/"; QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; - QString FMLLIBS_BASE_URL = "https://files.prismlauncher.org/fmllibs/"; // FIXME: move into CMakeLists - QString TRANSLATIONS_BASE_URL = "https://i18n.prismlauncher.org/"; // FIXME: move into CMakeLists + QString FMLLIBS_BASE_URL; + QString TRANSLATIONS_BASE_URL; QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/"; diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 3db04bf2f..916f84e4a 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -90,15 +90,16 @@ MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(sile { auto replyHandler = new QOAuthHttpServerReplyHandler(this); - replyHandler->setCallbackText(R"XXX( + replyHandler->setCallbackText(QString(R"XXX( Login Successful, redirecting... - )XXX"); + )XXX") + .arg(BuildConfig.SUCCESSFULL_LOGIN_URL)); oauth2.setReplyHandler(replyHandler); } else { oauth2.setReplyHandler(new CustomOAuthOobReplyHandler(this)); From 81f30f03600cae726cb841f242235b492aabfd94 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 15:53:54 +0300 Subject: [PATCH 042/177] disable retry for translation files Signed-off-by: Trial97 --- launcher/translations/TranslationsModel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 39719b125..63867636d 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -597,6 +597,7 @@ void TranslationsModel::downloadTranslation(QString key) d->m_dl_job.reset(new NetJob("Translation for " + key, APPLICATION->network())); d->m_dl_job->addNetAction(dl); + d->m_dl_job->setAskRetry(false); connect(d->m_dl_job.get(), &NetJob::succeeded, this, &TranslationsModel::dlGood); connect(d->m_dl_job.get(), &NetJob::failed, this, &TranslationsModel::dlFailed); From 75756b49c3f81bd4426728307dcf99b7a4ad31f1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 16:15:36 +0300 Subject: [PATCH 043/177] reshow login dialog in case account login fails Signed-off-by: Trial97 --- launcher/ui/setupwizard/LoginWizardPage.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/launcher/ui/setupwizard/LoginWizardPage.cpp b/launcher/ui/setupwizard/LoginWizardPage.cpp index 6be24a2f7..f53e31908 100644 --- a/launcher/ui/setupwizard/LoginWizardPage.cpp +++ b/launcher/ui/setupwizard/LoginWizardPage.cpp @@ -35,11 +35,10 @@ void LoginWizardPage::on_pushButton_clicked() if (account) { APPLICATION->accounts()->addAccount(account); APPLICATION->accounts()->setDefaultAccount(account); - } - - if (wizard()->currentId() == wizard()->pageIds().last()) { - wizard()->accept(); - } else { - wizard()->next(); + if (wizard()->currentId() == wizard()->pageIds().last()) { + wizard()->accept(); + } else { + wizard()->next(); + } } } From db3c7d01fd23b42e7f70a2809f6beb5a297375ec Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 16:36:05 +0300 Subject: [PATCH 044/177] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- CMakeLists.txt | 2 +- buildconfig/BuildConfig.cpp.in | 2 +- buildconfig/BuildConfig.h | 2 +- launcher/minecraft/auth/steps/MSAStep.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b9cb8ea8..ecca591cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,7 +176,7 @@ endif() set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") -set(Launcher_SUCCESSFULL_LOGIN_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user succesfully logins.") +set(Launcher_LOGIN_CALLBACK_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user successfully logins.") set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") ######## Set version numbers ######## diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index 121ce0729..a758122d9 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -116,7 +116,7 @@ Config::Config() NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@"; NEWS_OPEN_URL = "@Launcher_NEWS_OPEN_URL@"; HELP_URL = "@Launcher_HELP_URL@"; - SUCCESSFULL_LOGIN_URL = "@Launcher_SUCCESSFULL_LOGIN_URL@"; + LOGIN_CALLBACK_URL = "@Launcher_LOGIN_CALLBACK_URL@"; IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@"; MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@"; FLAME_API_KEY = "@Launcher_CURSEFORGE_API_KEY@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 4684f5709..0626c1d50 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -136,7 +136,7 @@ class Config { /** * URL that gets opened when the user succesfully logins. */ - QString SUCCESSFULL_LOGIN_URL; + QString LOGIN_CALLBACK_URL; /** * Client ID you can get from Imgur when you register an application diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 916f84e4a..74999414c 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -99,7 +99,7 @@ MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(sile window.location.replace("%1"); )XXX") - .arg(BuildConfig.SUCCESSFULL_LOGIN_URL)); + .arg(BuildConfig.LOGIN_CALLBACK_URL)); oauth2.setReplyHandler(replyHandler); } else { oauth2.setReplyHandler(new CustomOAuthOobReplyHandler(this)); From 580fc3251810009dc38c590253648b8f5784ce76 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 16:41:16 +0300 Subject: [PATCH 045/177] split the auth loading screen Signed-off-by: Trial97 --- launcher/ui/dialogs/MSALoginDialog.cpp | 14 +- launcher/ui/dialogs/MSALoginDialog.h | 3 +- launcher/ui/dialogs/MSALoginDialog.ui | 178 +++++++++++++++++-------- 3 files changed, 138 insertions(+), 57 deletions(-) diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 799b5b332..4e38b4187 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -78,7 +78,7 @@ int MSALoginDialog::exec() connect(m_authflow_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_authflow_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_authflow_task.get(), &Task::aborted, this, &MSALoginDialog::reject); - connect(m_authflow_task.get(), &Task::status, this, &MSALoginDialog::onTaskStatus); + connect(m_authflow_task.get(), &Task::status, this, &MSALoginDialog::onAuthFlowStatus); connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowser, this, &MSALoginDialog::authorizeWithBrowser); connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_authflow_task.get(), &Task::abort); @@ -87,7 +87,7 @@ int MSALoginDialog::exec() connect(m_devicecode_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_devicecode_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_devicecode_task.get(), &Task::aborted, this, &MSALoginDialog::reject); - connect(m_devicecode_task.get(), &Task::status, this, &MSALoginDialog::onTaskStatus); + connect(m_devicecode_task.get(), &Task::status, this, &MSALoginDialog::onDeviceFlowStatus); connect(m_devicecode_task.get(), &AuthFlow::authorizeWithBrowser, this, &MSALoginDialog::authorizeWithBrowser); connect(m_devicecode_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_devicecode_task.get(), &Task::abort); @@ -132,7 +132,7 @@ void MSALoginDialog::onTaskFailed(QString reason) void MSALoginDialog::authorizeWithBrowser(const QUrl& url) { - ui->stackedWidget->setCurrentIndex(1); + ui->stackedWidget2->setCurrentIndex(1); ui->loginButton->setToolTip(QString("
%1
").arg(url.toString())); m_url = url; } @@ -152,12 +152,18 @@ void MSALoginDialog::authorizeWithBrowserWithExtra(QString url, QString code, in } } -void MSALoginDialog::onTaskStatus(QString status) +void MSALoginDialog::onDeviceFlowStatus(QString status) { ui->stackedWidget->setCurrentIndex(0); ui->status->setText(status); } +void MSALoginDialog::onAuthFlowStatus(QString status) +{ + ui->stackedWidget2->setCurrentIndex(0); + ui->status2->setText(status); +} + // Public interface MinecraftAccountPtr MSALoginDialog::newAccount(QWidget* parent) { diff --git a/launcher/ui/dialogs/MSALoginDialog.h b/launcher/ui/dialogs/MSALoginDialog.h index 70f480ca9..375ccc57a 100644 --- a/launcher/ui/dialogs/MSALoginDialog.h +++ b/launcher/ui/dialogs/MSALoginDialog.h @@ -40,7 +40,8 @@ class MSALoginDialog : public QDialog { protected slots: void onTaskFailed(QString reason); - void onTaskStatus(QString status); + void onDeviceFlowStatus(QString status); + void onAuthFlowStatus(QString status); void authorizeWithBrowser(const QUrl& url); void authorizeWithBrowserWithExtra(QString url, QString code, int expiresIn); diff --git a/launcher/ui/dialogs/MSALoginDialog.ui b/launcher/ui/dialogs/MSALoginDialog.ui index c6821782f..69cd2e1ab 100644 --- a/launcher/ui/dialogs/MSALoginDialog.ui +++ b/launcher/ui/dialogs/MSALoginDialog.ui @@ -7,7 +7,7 @@ 0 0 440 - 430 + 447 @@ -21,12 +21,12 @@ - + 1 - - + + @@ -41,7 +41,7 @@ - + 16 @@ -61,7 +61,7 @@ - + Status @@ -74,7 +74,7 @@ - + Qt::Vertical @@ -88,8 +88,8 @@ - - + + @@ -136,51 +136,125 @@ + + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + + + + 16 + + + + Or + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + + + + + 1 + + + - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - - - - 16 - - - - Or - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 16 + 75 + true + + + + Please wait... + + + Qt::AlignCenter + + + true + + + + + + + Status + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + From 8d14060ad14e6463825210c2d28c266e1563e3e1 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 16:46:01 +0300 Subject: [PATCH 046/177] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- launcher/java/download/SymlinkTask.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/java/download/SymlinkTask.cpp b/launcher/java/download/SymlinkTask.cpp index 9841c5015..843c7caa9 100644 --- a/launcher/java/download/SymlinkTask.cpp +++ b/launcher/java/download/SymlinkTask.cpp @@ -43,7 +43,7 @@ QString findBinPath(QString root, QString pattern) void SymlinkTask::executeTask() { - setStatus(tr("Check Java bin")); + setStatus(tr("Checking for Java binary path")); const auto binPath = FS::PathCombine("bin", "java"); const auto wantedPath = FS::PathCombine(m_path, binPath); if (QFileInfo::exists(wantedPath)) { @@ -51,16 +51,16 @@ void SymlinkTask::executeTask() return; } - setStatus(tr("Search for Java bin")); + setStatus(tr("Searching for Java binary path")); const auto contentsPartialPath = FS::PathCombine("Contents", "Home", binPath); const auto relativePathToBin = findBinPath(m_path, contentsPartialPath); if (relativePathToBin.isEmpty()) { - emitFailed(tr("Failed to find bin java")); + emitFailed(tr("Failed to find Java binary path")); return; } const auto folderToLink = relativePathToBin.chopped(binPath.length()); - setStatus(tr("Collect folders to symlink")); + setStatus(tr("Collecting folders to symlink")); auto entries = QDir(folderToLink).entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries); QList files; setProgress(0, entries.length()); @@ -68,7 +68,7 @@ void SymlinkTask::executeTask() files.append({ entry.absoluteFilePath(), FS::PathCombine(m_path, entry.fileName()) }); } - setStatus(tr("Symlink Java")); + setStatus(tr("Symlinking Java binary path")); FS::create_link folderLink(files); connect(&folderLink, &FS::create_link::fileLinked, [this](QString src, QString dst) { setProgress(m_progress + 1, m_progressTotal); }); if (!folderLink()) { From 2e537e55de415d04d4eebda244c609e2c16ad894 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 17:47:58 +0300 Subject: [PATCH 047/177] Apply suggestions from code review Co-authored-by: seth Signed-off-by: Alexandru Ionut Tripon --- CMakeLists.txt | 2 +- buildconfig/BuildConfig.cpp.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecca591cb..cc01672c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,7 +207,7 @@ set(Launcher_BUG_TRACKER_URL "https://github.com/PrismLauncher/PrismLauncher/iss # Translations Platform URL set(Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/prismlauncher/launcher/" CACHE STRING "URL for the translations platform.") -set(Launcher_TRANSLATIONS_BASE_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") +set(Launcher_TRANSLATION_FILES_URL "https://i18n.prismlauncher.org/" CACHE STRING "URL for the translations files.") # Matrix Space set(Launcher_MATRIX_URL "https://prismlauncher.org/matrix" CACHE STRING "URL to the Matrix Space") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index a758122d9..6585ebe31 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -128,7 +128,7 @@ Config::Config() BUG_TRACKER_URL = "@Launcher_BUG_TRACKER_URL@"; TRANSLATIONS_URL = "@Launcher_TRANSLATIONS_URL@"; - TRANSLATIONS_BASE_URL = "@Launcher_TRANSLATIONS_BASE_URL@"; + TRANSLATION_FILES_URL = "@Launcher_TRANSLATION_FILES_URL@"; MATRIX_URL = "@Launcher_MATRIX_URL@"; DISCORD_URL = "@Launcher_DISCORD_URL@"; SUBREDDIT_URL = "@Launcher_SUBREDDIT_URL@"; From e53a5b3eca40788c4acc6e2e806e0fd77ca92638 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Sep 2024 17:51:35 +0300 Subject: [PATCH 048/177] replace TRANSLATIONS_BASE_URL with TRANSLATION_FILES_URL Signed-off-by: Trial97 --- buildconfig/BuildConfig.h | 2 +- launcher/translations/TranslationsModel.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 0626c1d50..ae705d098 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -171,7 +171,7 @@ class Config { QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; QString FMLLIBS_BASE_URL; - QString TRANSLATIONS_BASE_URL; + QString TRANSLATION_FILES_URL; QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/"; diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 39719b125..e8dc01873 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -550,7 +550,7 @@ void TranslationsModel::downloadIndex() d->m_index_job.reset(new NetJob("Translations Index", APPLICATION->network())); MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("translations", "index_v2.json"); entry->setStale(true); - auto task = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATIONS_BASE_URL + "index_v2.json"), entry); + auto task = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATION_FILES_URL + "index_v2.json"), entry); d->m_index_task = task.get(); d->m_index_job->addNetAction(task); d->m_index_job->setAskRetry(false); @@ -591,7 +591,7 @@ void TranslationsModel::downloadTranslation(QString key) MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("translations", "mmc_" + key + ".qm"); entry->setStale(true); - auto dl = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATIONS_BASE_URL + lang->file_name), entry); + auto dl = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATION_FILES_URL + lang->file_name), entry); dl->addValidator(new Net::ChecksumValidator(QCryptographicHash::Sha1, lang->file_sha1)); dl->setProgress(dl->getProgress(), lang->file_size); From 914ae6ead62f7270894b07bd7f29a541a12d7164 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 16 Sep 2024 20:00:38 +0300 Subject: [PATCH 049/177] Use macOS 14 in CI (#2826) * chore: fix mac CI build Signed-off-by: Trial97 * try what the error says Signed-off-by: Trial97 * set -DCMAKE_OSX_ARCHITECTURES=x86_64 Signed-off-by: Trial97 --------- Signed-off-by: Trial97 --- .github/workflows/build.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25e1c2aab..ccba62541 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,7 +93,7 @@ jobs: qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" - - os: macos-12 + - os: macos-14 name: macOS macosx_deployment_target: 11.0 qt_ver: 6 @@ -102,7 +102,7 @@ jobs: qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" - - os: macos-12 + - os: macos-14 name: macOS-Legacy macosx_deployment_target: 10.13 qt_ver: 5 @@ -259,6 +259,12 @@ jobs: run: | echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2019_64" >> $env:GITHUB_ENV + - name: Setup java (macOS) + if: runner.os == 'macOS' + uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: "17" ## # CONFIGURE ## @@ -271,7 +277,7 @@ jobs: - name: Configure CMake (macOS-Legacy) if: runner.os == 'macOS' && matrix.qt_ver == 5 run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_ENABLE_JAVA_DOWNLOADER=ON -DLauncher_BUILD_PLATFORM=official -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -DCMAKE_OSX_ARCHITECTURES="x86_64" -G Ninja - name: Configure CMake (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' From 77463c6d33e8cafc66ac2b3fab59e167941af819 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 18 Sep 2024 21:17:15 +0300 Subject: [PATCH 050/177] display minecraft log before instance run Signed-off-by: Trial97 --- launcher/ui/pages/instance/LogPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/LogPage.cpp b/launcher/ui/pages/instance/LogPage.cpp index 0c22d1de6..6a4888f9c 100644 --- a/launcher/ui/pages/instance/LogPage.cpp +++ b/launcher/ui/pages/instance/LogPage.cpp @@ -234,7 +234,7 @@ bool LogPage::apply() bool LogPage::shouldDisplay() const { - return m_instance->isRunning() || m_proxy->rowCount() > 0; + return true; } void LogPage::on_btnPaste_clicked() From 1243328876c7b655e15ab7211cc9162c32e16f30 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 20 Sep 2024 16:53:36 +0300 Subject: [PATCH 051/177] fix folder duplication for modrinth Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 7a3f71c3b..ba97c441f 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -302,7 +302,7 @@ bool ModrinthCreationTask::createInstance() loop.exec(); QEventLoop ensureMetaLoop; - QDir folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); + QDir folder = FS::PathCombine(instance.modsRoot(), ".index"); auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); connect(ensureMetadataTask.get(), &Task::succeeded, this, [&]() { ended_well = true; }); connect(ensureMetadataTask.get(), &Task::finished, &ensureMetaLoop, &QEventLoop::quit); From 3e1cf6b2a7a13a85d412ee5b7f06032f17fa4635 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 20 Sep 2024 16:58:22 +0300 Subject: [PATCH 052/177] fix updater typo Signed-off-by: Trial97 --- launcher/updater/prismupdater/PrismUpdater.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/updater/prismupdater/PrismUpdater.cpp b/launcher/updater/prismupdater/PrismUpdater.cpp index 6b9754864..8bf8cb473 100644 --- a/launcher/updater/prismupdater/PrismUpdater.cpp +++ b/launcher/updater/prismupdater/PrismUpdater.cpp @@ -1210,7 +1210,7 @@ std::optional PrismUpdaterApp::unpackArchive(QFileInfo archive) QProcess proc = QProcess(); proc.start(cmd, args); if (!proc.waitForStarted(5000)) { // wait 5 seconds to start - auto msg = tr("Failed to launcher child process \"%1 %2\".").arg(cmd).arg(args.join(" ")); + auto msg = tr("Failed to launch child process \"%1 %2\".").arg(cmd).arg(args.join(" ")); logUpdate(msg); showFatalErrorMessage(tr("Failed extract archive"), msg); return std::nullopt; @@ -1241,7 +1241,7 @@ bool PrismUpdaterApp::loadPrismVersionFromExe(const QString& exe_path) proc.setReadChannel(QProcess::StandardOutput); proc.start(exe_path, { "--version" }); if (!proc.waitForStarted(5000)) { - showFatalErrorMessage(tr("Failed to Check Version"), tr("Failed to launcher child launcher process to read version.")); + showFatalErrorMessage(tr("Failed to Check Version"), tr("Failed to launch child process to read version.")); return false; } // wait 5 seconds to start if (!proc.waitForFinished(5000)) { From 9567d763c1b0ed99370c1097abdc2db0a57d9fea Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 21 Sep 2024 22:17:44 +0300 Subject: [PATCH 053/177] fix java archive typo Signed-off-by: Trial97 --- launcher/java/download/ArchiveDownloadTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index ba1c96faf..6d6ab0cef 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -95,7 +95,7 @@ void ArchiveDownloadTask::extractJava(QString input) } auto files = zip->getFileNameList(); if (files.isEmpty()) { - emitFailed(tr("No files were found in the supplied zip file,")); + emitFailed(tr("No files were found in the supplied zip file.")); return; } m_task = makeShared(zip, m_final_path, files[0]); From 1b2e9b95e2dd62f844c5d019d9b0b503084dd382 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 25 Sep 2024 19:37:25 +0300 Subject: [PATCH 054/177] add prefix to non-standard packwiz fields Signed-off-by: Trial97 --- launcher/modplatform/packwiz/Packwiz.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 77a0935f3..325b0a6e4 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -208,9 +208,9 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod) auto tbl = toml::table{ { "name", mod.name.toStdString() }, { "filename", mod.filename.toStdString() }, { "side", sideToString(mod.side).toStdString() }, - { "loaders", loaders }, - { "mcVersions", mcVersions }, - { "releaseType", mod.releaseType.toString().toStdString() }, + { "x-prismlauncher-loaders", loaders }, + { "x-prismlauncher-mc-versions", mcVersions }, + { "x-prismlauncher-release-type", mod.releaseType.toString().toStdString() }, { "download", toml::table{ { "mode", mod.mode.toStdString() }, @@ -295,15 +295,15 @@ auto V1::getIndexForMod(QDir& index_dir, QString slug) -> Mod mod.name = stringEntry(table, "name"); mod.filename = stringEntry(table, "filename"); mod.side = stringToSide(stringEntry(table, "side")); - mod.releaseType = ModPlatform::IndexedVersionType(stringEntry(table, "releaseType")); - if (auto loaders = table["loaders"]; loaders && loaders.is_array()) { + mod.releaseType = ModPlatform::IndexedVersionType(stringEntry(table, "x-prismlauncher-release-type")); + if (auto loaders = table["x-prismlauncher-loaders"]; loaders && loaders.is_array()) { for (auto&& loader : *loaders.as_array()) { if (loader.is_string()) { mod.loaders |= ModPlatform::getModLoaderFromString(QString::fromStdString(loader.as_string()->value_or(""))); } } } - if (auto versions = table["mcVersions"]; versions && versions.is_array()) { + if (auto versions = table["x-prismlauncher-mc-versions"]; versions && versions.is_array()) { for (auto&& version : *versions.as_array()) { if (version.is_string()) { auto ver = QString::fromStdString(version.as_string()->value_or("")); From 6475dc5786600ee19d512f9b11f662a240922fa1 Mon Sep 17 00:00:00 2001 From: Cart <81428538+cartrigger@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:58:21 -0400 Subject: [PATCH 055/177] Lots of J's for Java needed to be uppercased --- launcher/VersionProxyModel.cpp | 4 ++-- launcher/java/download/ArchiveDownloadTask.cpp | 2 +- launcher/ui/MainWindow.ui | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 8 ++++---- launcher/ui/pages/global/JavaPage.cpp | 4 ++-- launcher/ui/setupwizard/AutoJavaWizardPage.ui | 2 +- launcher/ui/setupwizard/JavaWizardPage.cpp | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 552900d35..12a82f73d 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -140,9 +140,9 @@ QVariant VersionProxyModel::headerData(int section, Qt::Orientation orientation, case Path: return tr("Filesystem path to this version"); case JavaName: - return tr("The alternative name of the java version"); + return tr("The alternative name of the Java version"); case JavaMajor: - return tr("The java major version"); + return tr("The Java major version"); case Time: return tr("Release date of this version"); } diff --git a/launcher/java/download/ArchiveDownloadTask.cpp b/launcher/java/download/ArchiveDownloadTask.cpp index 6d6ab0cef..bb7cc568d 100644 --- a/launcher/java/download/ArchiveDownloadTask.cpp +++ b/launcher/java/download/ArchiveDownloadTask.cpp @@ -65,7 +65,7 @@ void ArchiveDownloadTask::executeTask() void ArchiveDownloadTask::extractJava(QString input) { - setStatus(tr("Extracting java")); + setStatus(tr("Extracting Java")); if (input.endsWith("tar")) { setStatus(tr("Extracting Java (Progress is not reported for tar archives)")); QFile in(input); diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index 89e536b01..f20c34206 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -798,7 +798,7 @@ Java - Open the java folder in a file browser. Only available if the built-in Java downloader is used. + Open the Java folder in a file browser. Only available if the built-in Java downloader is used. diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index f01edc5e5..0ece3220b 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -57,13 +57,13 @@ class InstallJavaPage : public QWidget, public BasePage { majorVersionSelect = new VersionSelectWidget(this); majorVersionSelect->selectCurrent(); - majorVersionSelect->setEmptyString(tr("No java versions are currently available in the meta.")); - majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + majorVersionSelect->setEmptyString(tr("No Java versions are currently available in the meta.")); + majorVersionSelect->setEmptyErrorString(tr("Couldn't load or download the Java version lists!")); horizontalLayout->addWidget(majorVersionSelect, 1); javaVersionSelect = new VersionSelectWidget(this); - javaVersionSelect->setEmptyString(tr("No java versions are currently available for your OS.")); - javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the java version lists!")); + javaVersionSelect->setEmptyString(tr("No Java versions are currently available for your OS.")); + javaVersionSelect->setEmptyErrorString(tr("Couldn't load or download the Java version lists!")); horizontalLayout->addWidget(javaVersionSelect, 4); connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::setSelectedVersion); connect(majorVersionSelect, &VersionSelectWidget::selectedVersionChanged, this, &InstallJavaPage::selectionChanged); diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 6699b00c0..0ae296815 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -67,8 +67,8 @@ JavaPage::JavaPage(QWidget* parent) : QWidget(parent), ui(new Ui::JavaPage) ui->managedJavaList->initialize(new JavaInstallList(this, true)); ui->managedJavaList->setResizeOn(2); ui->managedJavaList->selectCurrent(); - ui->managedJavaList->setEmptyString(tr("No managed java versions are installed")); - ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed java list!")); + ui->managedJavaList->setEmptyString(tr("No managed Java versions are installed")); + ui->managedJavaList->setEmptyErrorString(tr("Couldn't load the managed Java list!")); connect(ui->autodetectJavaCheckBox, &QCheckBox::stateChanged, this, [this] { ui->autodownloadCheckBox->setEnabled(ui->autodetectJavaCheckBox->isChecked()); if (!ui->autodetectJavaCheckBox->isChecked()) diff --git a/launcher/ui/setupwizard/AutoJavaWizardPage.ui b/launcher/ui/setupwizard/AutoJavaWizardPage.ui index bd72cf695..a862524b0 100644 --- a/launcher/ui/setupwizard/AutoJavaWizardPage.ui +++ b/launcher/ui/setupwizard/AutoJavaWizardPage.ui @@ -30,7 +30,7 @@ - We've added a feature to automatically download the correct Java version for each version of Minecraft(this can be changed in the Java Settings). Would you like to enable or disable this feature? + We've added a feature to automatically download the correct Java version for each version of Minecraft (this can be changed in the Java Settings). Would you like to enable or disable this feature? true diff --git a/launcher/ui/setupwizard/JavaWizardPage.cpp b/launcher/ui/setupwizard/JavaWizardPage.cpp index 47718d6da..8caae173c 100644 --- a/launcher/ui/setupwizard/JavaWizardPage.cpp +++ b/launcher/ui/setupwizard/JavaWizardPage.cpp @@ -83,6 +83,6 @@ void JavaWizardPage::retranslate() { setTitle(tr("Java")); setSubTitle( - tr("Please select how much memory to allocate to instances and if Prism Launcher should manage java automatically or manually.")); + tr("Please select how much memory to allocate to instances and if Prism Launcher should manage Java automatically or manually.")); m_java_widget->retranslate(); } From 2dc6f7504b4cfb64b59b3eb905f1b1ac387b8c83 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:18:35 -0700 Subject: [PATCH 056/177] add vc_redist as a NSIS install section Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 15 +++++++++++++++ program_info/win_install.nsi.in | 2 ++ 2 files changed, 17 insertions(+) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 91b213274..90d038f4d 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -41,6 +41,21 @@ configure_file(org.prismlauncher.PrismLauncher.metainfo.xml.in org.prismlauncher configure_file(prismlauncher.rc.in prismlauncher.rc @ONLY) configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) + +if(MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION vc_redist) + include(InstallRequiredSystemLibraries) + file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) + set(Launcher_MSVC_Redist_NSIS_Section "\ +Section \"Visual Studio Runtime\" + SetOutPath \"$INSTDIR\\vc_redist\" + File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" + ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive\" + ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" +SectionEnd\ +") +endif() + configure_file(win_install.nsi.in win_install.nsi @ONLY) if(SCDOC_FOUND) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index cc56b9bd5..c75e066bd 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -396,6 +396,8 @@ Section "@Launcher_DisplayName@" SectionEnd +@Launcher_MSVC_Redist_NSIS_Section@ + Section "Start Menu Shortcut" SM_SHORTCUTS CreateShortcut "$SMPROGRAMS\@Launcher_DisplayName@.lnk" "$INSTDIR\@Launcher_APP_BINARY_NAME@.exe" "" "$INSTDIR\@Launcher_APP_BINARY_NAME@.exe" 0 From 37d3b2a4f631d2a8ce3570a9c377576d4f5a3aa1 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:49:00 -0700 Subject: [PATCH 057/177] prevent the unauthorised reditribution of MSVC CRT files Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 90d038f4d..c9a1d597d 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,7 +43,7 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION vc_redist) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) include(InstallRequiredSystemLibraries) file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) set(Launcher_MSVC_Redist_NSIS_Section "\ From c5daca3b013bd9cc8b17283d2a63e873480c2c16 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 00:57:28 -0700 Subject: [PATCH 058/177] include vc_redist in portable build Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d70fe79b..49d3f731f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,6 +372,11 @@ endif() if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) + if (MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) + include(InstallRequiredSystemLibraries) + install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) + endif() endif() if(UNIX AND APPLE) From 8fa4467a362a55d10a3491a3b1d2301d3510383a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:29:00 -0700 Subject: [PATCH 059/177] use `/norestart` with redist install Co-authored-by: seth Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index c9a1d597d..0ce559406 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -50,7 +50,7 @@ if(MSVC) Section \"Visual Studio Runtime\" SetOutPath \"$INSTDIR\\vc_redist\" File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" - ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive\" + ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive /norestart\" ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" SectionEnd\ ") From b9c19fd3f73877f80fb2363617d893f91e5037e2 Mon Sep 17 00:00:00 2001 From: Mason Rocha Date: Fri, 27 Sep 2024 16:42:59 -0500 Subject: [PATCH 060/177] fix: don't annoy when java tmpdir jvmarg is set & /tmp is noexec Signed-off-by: Mason Rocha Got annoyed, didn't want to see it anymore. Java tmpdir noexec warning modified to include information about possible remedies available --- launcher/Application.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6379678c9..4a66271a3 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1025,7 +1025,8 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } // notify user if /tmp is mounted with `noexec` (#1693) - { + QString jvmArgs = m_settings->get("JvmArgs").toString(); + if(jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ bool is_tmp_noexec = false; #if defined(Q_OS_LINUX) @@ -1045,7 +1046,11 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) if (is_tmp_noexec) { auto infoMsg = tr("Your /tmp directory is currently mounted with the 'noexec' flag enabled.\n" - "Some versions of Minecraft may not launch.\n"); + "Some versions of Minecraft may not launch.\n" + "\n" + "You may solve this issue by remounting /tmp as 'exec' or setting " + "the java.io.tmpdir JVM argument to a writeable directory in a " + "filesystem where the 'exec' flag is set (e.g., /home/user/.local/tmp)\n"); auto msgBox = new QMessageBox(QMessageBox::Information, tr("Incompatible system configuration"), infoMsg, QMessageBox::Ok); msgBox->setDefaultButton(QMessageBox::Ok); msgBox->setAttribute(Qt::WA_DeleteOnClose); From 00f4221a836bc747ec8d220a52e7b96ed24f871a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 27 Sep 2024 19:16:50 -0700 Subject: [PATCH 061/177] reorg MSVC set(CMAKE_INSTALL_SYSTEM_RUNTIMES_LIBS_SKIP true) call Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- CMakeLists.txt | 6 ++++-- program_info/CMakeLists.txt | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49d3f731f..cea61ddbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -358,6 +358,10 @@ include(ECMQtDeclareLoggingCategory) ####################################### Program Info ####################################### set(Launcher_APP_BINARY_NAME "prismlauncher" CACHE STRING "Name of the Launcher binary") +if(MSVC) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) + include(InstallRequiredSystemLibraries) +endif() add_subdirectory(program_info) ####################################### Install layout ####################################### @@ -373,8 +377,6 @@ if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) if (MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) - include(InstallRequiredSystemLibraries) install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) endif() endif() diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 0ce559406..8a7d4868f 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,7 +43,6 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) include(InstallRequiredSystemLibraries) file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) set(Launcher_MSVC_Redist_NSIS_Section "\ From a897b012d988861a47df887f0e8d2cd55d7bd584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgars=20C=C4=ABrulis?= Date: Sat, 28 Sep 2024 12:11:25 +0300 Subject: [PATCH 062/177] chore: update Qt to 6.7.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only bug fixes no new / breaking changes Signed-off-by: Edgars Cīrulis --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..a8ee6e6cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -79,7 +79,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: windows-2022 @@ -90,7 +90,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: "win64_msvc2019_arm64" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: macos-14 @@ -99,7 +99,7 @@ jobs: qt_ver: 6 qt_host: mac qt_arch: "" - qt_version: "6.7.2" + qt_version: "6.7.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: macos-14 From ed15a28eb3af1487cff7b81ed06b91afd35de4a0 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 28 Sep 2024 14:58:13 -0700 Subject: [PATCH 063/177] fix : baking the redist into the installer breaks GPL, download at runtime instead Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 3 +++ CMakeLists.txt | 7 ------- program_info/CMakeLists.txt | 25 +++++++++++++++---------- program_info/win_install.nsi.in | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..7345ffe90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -471,6 +471,9 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' run: | + New-Item -Name NSISPlugins -ItemType Directory + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -OutFile NSISPlugins\NScurl.zip + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NSIScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" diff --git a/CMakeLists.txt b/CMakeLists.txt index cea61ddbf..3d70fe79b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -358,10 +358,6 @@ include(ECMQtDeclareLoggingCategory) ####################################### Program Info ####################################### set(Launcher_APP_BINARY_NAME "prismlauncher" CACHE STRING "Name of the Launcher binary") -if(MSVC) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP true) - include(InstallRequiredSystemLibraries) -endif() add_subdirectory(program_info) ####################################### Install layout ####################################### @@ -376,9 +372,6 @@ endif() if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) - if (MSVC) - install(FILES "${MSVC_REDIST_DIR}/vc_redist.x64.exe" DESTINATION "vc_redist/." COMPONENT portable EXCLUDE_FROM_ALL ) - endif() endif() if(UNIX AND APPLE) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 8a7d4868f..30a435866 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -43,16 +43,21 @@ configure_file(prismlauncher.manifest.in prismlauncher.manifest @ONLY) configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) - include(InstallRequiredSystemLibraries) - file(TO_NATIVE_PATH ${MSVC_REDIST_DIR} Native_MSVC_REDIST_DIR) - set(Launcher_MSVC_Redist_NSIS_Section "\ -Section \"Visual Studio Runtime\" - SetOutPath \"$INSTDIR\\vc_redist\" - File \"${Native_MSVC_REDIST_DIR}\\vc_redist.x64.exe\" - ExecWait \"$INSTDIR\\vc_redist\\vc_redist.x64.exe /install /passive /norestart\" - ; Delete \"$INSTDIR\\vc_redist\\vc_redist.x64.exe\" -SectionEnd\ -") + set(Launcher_MSVC_Redist_NSIS_Section [=[ +!ifdef haveNSIScurl +Section "Visual Studio Runtime" + DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' + NScurl::http GET "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$INSTDIR\vc_redist\vc_redist.x64.exe" /INSIST /CANCEL /Zone.Identifier /END + Pop $0 + ${If} $0 == "OK" + DetailPrint "Download successful" + ExecWait "$INSTDIR\vc_redist\vc_redist.x64.exe /install /passive /norestart\" + ${Else} + DetailPrint "Download failed with error $0" + ${EndIf} +SectionEnd +!endif +]=]) endif() configure_file(win_install.nsi.in win_install.nsi @ONLY) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index c75e066bd..a5c38599d 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -112,6 +112,16 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "@Launcher_Copyright@" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "@Launcher_VERSION_NAME4@" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@" +;-------------------------------- +; Conditional comp with file exist + +!macro CompileTimeIfFileExist path define +!tempfile tmpinc +!system 'IF EXIST "${path}" echo !define ${define} > "${tmpinc}"' +!include "${tmpinc}" +!delfile "${tmpinc}" +!undef tmpinc +!macroend ;-------------------------------- ; Shell Associate Macros @@ -336,6 +346,19 @@ Section "" UninstallPrevious SectionEnd +;------------------------------------ +; include nice plugins + +; NSIScurl - curl in NSIS +; used for MSVS redist download +; extract to ../NSISPlugins/NSIScurl +; https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip +!insertmacro CompileTimeIfFileExist "../NSISPlugins/NSIScurl/Plugins/" haveNSIScurl +!ifdef haveNSIScurl +!AddPluginDir /x86-unicode "../NSISPlugins/NSIScurl/Plugins/x86-unicode" +!AddPluginDir /x86-ansi "../NSISPlugins/NSIScurl/Plugins/x86-ansi" +!AddPluginDir /amd64-unicode "../NSISPlugins/NSIScurl/Plugins/amd64-unicode" +!endif ;------------------------------------ From c8990438165cce1d303e8754a125758fd69b8ad9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 29 Sep 2024 00:25:33 +0000 Subject: [PATCH 064/177] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/4f807e8940284ad7925ebd0a0993d2a1791acb2f?narHash=sha256-IiA3jfbR7K/B5%2B9byVi9BZGWTD4VSbWe8VLpp9B/iYk%3D' (2024-09-11) → 'github:NixOS/nixpkgs/1925c603f17fc89f4c8f6bf6f631a802ad85d784?narHash=sha256-J%2BPeFKSDV%2BpHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI%3D' (2024-09-26) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 58bc4e30f..7667a8688 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1726062873, - "narHash": "sha256-IiA3jfbR7K/B5+9byVi9BZGWTD4VSbWe8VLpp9B/iYk=", + "lastModified": 1727348695, + "narHash": "sha256-J+PeFKSDV+pHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4f807e8940284ad7925ebd0a0993d2a1791acb2f", + "rev": "1925c603f17fc89f4c8f6bf6f631a802ad85d784", "type": "github" }, "original": { From 732008db203d1ff6cc7c5d4957cb394d016eaf79 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:27:06 -0400 Subject: [PATCH 065/177] ci: drop garnix Signed-off-by: seth --- garnix.yaml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 garnix.yaml diff --git a/garnix.yaml b/garnix.yaml deleted file mode 100644 index a7c1b48a9..000000000 --- a/garnix.yaml +++ /dev/null @@ -1,10 +0,0 @@ -builds: - exclude: - # Currently broken on Garnix's end - - "*.x86_64-darwin.*" - include: - - "checks.x86_64-linux.*" - - "packages.x86_64-linux.*" - - "packages.aarch64-linux.*" - - "packages.x86_64-darwin.*" - - "packages.aarch64-darwin.*" From 2663ac5405cbfc3c29a38b32a755b7c7ebda0779 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:34:59 -0400 Subject: [PATCH 066/177] build(nix): add debug builds This will lead to build times on par with our other CI jobs, as now we're not always building for release Signed-off-by: seth --- flake.nix | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/flake.nix b/flake.nix index 987fc0eda..d07834b4c 100644 --- a/flake.nix +++ b/flake.nix @@ -118,5 +118,24 @@ # Only output them if they're available on the current system lib.filterAttrs (_: lib.meta.availableOn pkgs.stdenv.hostPlatform) packages ); + + # We put these under legacyPackages as they are meant for CI, not end user consumption + legacyPackages = forAllSystems ( + system: + let + prismPackages = self.packages.${system}; + legacyPackages = self.legacyPackages.${system}; + in + { + prismlauncher-debug = prismPackages.prismlauncher.override { + prismlauncher-unwrapped = legacyPackages.prismlauncher-unwrapped-debug; + }; + + prismlauncher-unwrapped-debug = prismPackages.prismlauncher-unwrapped.overrideAttrs { + cmakeBuildType = "Debug"; + dontStrip = true; + }; + } + ); }; } From 5adca58337e9fe2a71f7bdd0951494ceddb34659 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:44:19 -0400 Subject: [PATCH 067/177] ci: add nix job Signed-off-by: seth --- .github/workflows/build.yml | 53 +++++++++++++++++++++++++++ .github/workflows/trigger_builds.yml | 1 + .github/workflows/trigger_release.yml | 1 + 3 files changed, 55 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ccba62541..f26884c2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,9 @@ on: APPLE_NOTARIZE_PASSWORD: description: Password used for notarizing macOS builds required: false + CACHIX_AUTH_TOKEN: + description: Private token for authenticating against Cachix cache + required: false GPG_PRIVATE_KEY: description: Private key for AppImage signing required: false @@ -631,3 +634,53 @@ jobs: with: bundle: "Prism Launcher.flatpak" manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml + + nix: + name: Nix (${{ matrix.system }}) + + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-22.04 + system: x86_64-linux + + - os: macos-13 + system: x86_64-darwin + + - os: macos-14 + system: aarch64-darwin + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v27 + + # For PRs + - name: Setup Nix Magic Cache + uses: DeterminateSystems/magic-nix-cache-action@v8 + + # For in-tree builds + - name: Setup Cachix + uses: cachix/cachix-action@v15 + with: + name: prismlauncher + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + + - name: Run flake checks + run: | + nix flake check --print-build-logs --show-trace + + - name: Build debug package + if: ${{ inputs.build_type == 'Debug' }} + run: | + nix build --print-build-logs .#prismlauncher-debug + + - name: Build release package + if: ${{ inputs.build_type != 'Debug' }} + run: | + nix build --print-build-logs .#prismlauncher diff --git a/.github/workflows/trigger_builds.yml b/.github/workflows/trigger_builds.yml index 9efafc8cc..0b8386d69 100644 --- a/.github/workflows/trigger_builds.yml +++ b/.github/workflows/trigger_builds.yml @@ -38,5 +38,6 @@ jobs: APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }} APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }} APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }} + CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }} diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index 134281b2c..e800653e3 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -22,6 +22,7 @@ jobs: APPLE_NOTARIZE_APPLE_ID: ${{ secrets.APPLE_NOTARIZE_APPLE_ID }} APPLE_NOTARIZE_TEAM_ID: ${{ secrets.APPLE_NOTARIZE_TEAM_ID }} APPLE_NOTARIZE_PASSWORD: ${{ secrets.APPLE_NOTARIZE_PASSWORD }} + CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY_ID: ${{ secrets.GPG_PRIVATE_KEY_ID }} From 68bf500f7ee48f17abf2a27e942d953a9962ef55 Mon Sep 17 00:00:00 2001 From: seth Date: Thu, 19 Sep 2024 16:50:45 -0400 Subject: [PATCH 068/177] chore: add nix reformat to .git-blame-ignore-revs Signed-off-by: seth --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 2163db45b..528b128b1 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -2,3 +2,6 @@ # tabs -> spaces bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9 + +# (nix) alejandra -> nixfmt +4c81d8c53d09196426568c4a31a4e752ed05397a From bf432b5514d7c9c90761a285d17afbd736e4a687 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:21:07 -0400 Subject: [PATCH 069/177] chore(nix): use cachix for binary cache Signed-off-by: seth --- flake.nix | 6 ++++-- nix/README.md | 20 ++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/flake.nix b/flake.nix index d07834b4c..f4ca782ec 100644 --- a/flake.nix +++ b/flake.nix @@ -2,8 +2,10 @@ description = "A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC)"; nixConfig = { - extra-substituters = [ "https://cache.garnix.io" ]; - extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; + extra-substituters = [ "https://prismlauncher.cachix.org" ]; + extra-trusted-public-keys = [ + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" + ]; }; inputs = { diff --git a/nix/README.md b/nix/README.md index 76cb8bf27..8bb658477 100644 --- a/nix/README.md +++ b/nix/README.md @@ -8,8 +8,8 @@ See [Package variants](#package-variants) for a list of available packages. ## Installing a development release (flake) -We use [garnix](https://garnix.io/) to build and cache our development builds. -If you want to avoid rebuilds you may add the garnix cache to your substitutors, or use `--accept-flake-config` +We use [cachix](https://cachix.org/) to cache our development and release builds. +If you want to avoid rebuilds you may add the Cachix bucket to your substitutors, or use `--accept-flake-config` to temporarily enable it when using `nix` commands. Example (NixOS): @@ -17,12 +17,10 @@ Example (NixOS): ```nix { nix.settings = { - trusted-substituters = [ - "https://cache.garnix.io" - ]; + trusted-substituters = [ "https://prismlauncher.cachix.org" ]; trusted-public-keys = [ - "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" ]; }; } @@ -137,20 +135,18 @@ nix profile install github:PrismLauncher/PrismLauncher ## Installing a development release (without flakes) -We use [garnix](https://garnix.io/) to build and cache our development builds. -If you want to avoid rebuilds you may add the garnix cache to your substitutors. +We use [Cachix](https://cachix.org/) to cache our development and release builds. +If you want to avoid rebuilds you may add the Cachix bucket to your substitutors. Example (NixOS): ```nix { nix.settings = { - trusted-substituters = [ - "https://cache.garnix.io" - ]; + trusted-substituters = [ "https://prismlauncher.cachix.org" ]; trusted-public-keys = [ - "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "prismlauncher.cachix.org-1:9/n/FGyABA2jLUVfY+DEp4hKds/rwO+SCOtbOkDzd+c=" ]; }; } From 988ef320193e5bfb7de600bc38f99f9ba122c379 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:30:22 -0400 Subject: [PATCH 070/177] fix(nix): don't write to files in formatting check Signed-off-by: seth --- nix/checks.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/checks.nix b/nix/checks.nix index 40a2e272f..ec219d6f8 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -23,7 +23,7 @@ cd ${self} echo "Running clang-format...." - clang-format -i --style='file' --Werror */**.{c,cc,cpp,h,hh,hpp} + clang-format --dry-run --style='file' --Werror */**.{c,cc,cpp,h,hh,hpp} echo "Running deadnix..." deadnix --fail From 38fa2e0cd494d400110496a35c7f112b2b801d97 Mon Sep 17 00:00:00 2001 From: seth Date: Mon, 30 Sep 2024 16:32:35 -0400 Subject: [PATCH 071/177] style: format with clang-format Signed-off-by: seth --- launcher/Application.cpp | 2 +- launcher/ui/MainWindow.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 4a66271a3..b8dcc1099 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1026,7 +1026,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) // notify user if /tmp is mounted with `noexec` (#1693) QString jvmArgs = m_settings->get("JvmArgs").toString(); - if(jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ + if (jvmArgs.indexOf("java.io.tmpdir") == -1) { /* java.io.tmpdir is a valid workaround, so don't annoy */ bool is_tmp_noexec = false; #if defined(Q_OS_LINUX) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 3f0bb3281..09c47b609 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -235,7 +235,6 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi } ui->actionViewJavaFolder->setEnabled(BuildConfig.JAVA_DOWNLOADER_ENABLED); - } // add the toolbar toggles to the view menu From 79be2fc0622103b2d969044490fa179d31482f50 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 00:32:42 +0000 Subject: [PATCH 072/177] chore(deps): update cachix/install-nix-action action to v29 --- .github/workflows/build.yml | 2 +- .github/workflows/update-flake.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f26884c2c..ad77d282b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -658,7 +658,7 @@ jobs: uses: actions/checkout@v4 - name: Install Nix - uses: cachix/install-nix-action@v27 + uses: cachix/install-nix-action@v29 # For PRs - name: Setup Nix Magic Cache diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index ecc38ff28..0c8cfde67 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + - uses: cachix/install-nix-action@9f70348d77d0422624097c4b7a75563948901306 # v29 - uses: DeterminateSystems/update-flake-lock@v24 with: From 0eefa52dbcdc595f4b388ae306eae5f556f816e4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 25 Sep 2024 15:04:31 +0300 Subject: [PATCH 073/177] fix some transtaions warnings Signed-off-by: Trial97 --- launcher/MMCZip.h | 2 ++ launcher/modplatform/flame/FlamePackExportTask.h | 1 + launcher/modplatform/modrinth/ModrinthPackExportTask.h | 1 + launcher/ui/dialogs/InstallLoaderDialog.cpp | 2 ++ launcher/ui/pages/instance/ModFolderPage.h | 2 ++ 5 files changed, 8 insertions(+) diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index 1635f8b32..d81df9d81 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -153,6 +153,7 @@ bool collectFileListRecursively(const QString& rootDir, const QString& subDir, Q #if defined(LAUNCHER_APPLICATION) class ExportToZipTask : public Task { + Q_OBJECT public: ExportToZipTask(QString outputPath, QDir dir, @@ -207,6 +208,7 @@ class ExportToZipTask : public Task { }; class ExtractZipTask : public Task { + Q_OBJECT public: ExtractZipTask(QString input, QDir outputDir, QString subdirectory = "") : ExtractZipTask(std::make_shared(input), outputDir, subdirectory) diff --git a/launcher/modplatform/flame/FlamePackExportTask.h b/launcher/modplatform/flame/FlamePackExportTask.h index 78b46e91f..b11eb17fa 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.h +++ b/launcher/modplatform/flame/FlamePackExportTask.h @@ -26,6 +26,7 @@ #include "tasks/Task.h" class FlamePackExportTask : public Task { + Q_OBJECT public: FlamePackExportTask(const QString& name, const QString& version, diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index 81c2f25bf..ee740a456 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -27,6 +27,7 @@ #include "tasks/Task.h" class ModrinthPackExportTask : public Task { + Q_OBJECT public: ModrinthPackExportTask(const QString& name, const QString& version, diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp index 541119d10..8e5463b31 100644 --- a/launcher/ui/dialogs/InstallLoaderDialog.cpp +++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp @@ -31,6 +31,7 @@ #include "ui/widgets/VersionSelectWidget.h" class InstallLoaderPage : public VersionSelectWidget, public BasePage { + Q_OBJECT public: InstallLoaderPage(const QString& id, const QString& iconName, @@ -164,3 +165,4 @@ void InstallLoaderDialog::done(int result) QDialog::done(result); } +#include "InstallLoaderDialog.moc" \ No newline at end of file diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index 2ec2b402d..41b605991 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -74,6 +74,7 @@ class ModFolderPage : public ExternalResourcesPage { }; class CoreModFolderPage : public ModFolderPage { + Q_OBJECT public: explicit CoreModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent = 0); virtual ~CoreModFolderPage() = default; @@ -87,6 +88,7 @@ class CoreModFolderPage : public ModFolderPage { }; class NilModFolderPage : public ModFolderPage { + Q_OBJECT public: explicit NilModFolderPage(BaseInstance* inst, std::shared_ptr mods, QWidget* parent = 0); virtual ~NilModFolderPage() = default; From 5ea2dece54f27c812af3eb5ba697ec7aab07e04b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 26 Sep 2024 22:59:00 +0300 Subject: [PATCH 074/177] fix search term not remaining the same between providers on resource download Signed-off-by: Trial97 --- launcher/ui/dialogs/ResourceDownloadDialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 90d3b79a9..02a8454b4 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -258,7 +258,9 @@ void ResourceDownloadDialog::selectedPageChanged(BasePage* previous, BasePage* s } // Same effect as having a global search bar - selectedPage()->setSearchTerm(prev_page->getSearchTerm()); + ResourcePage* result = dynamic_cast(selected); + Q_ASSERT(result != nullptr); + result->setSearchTerm(prev_page->getSearchTerm()); } ModDownloadDialog::ModDownloadDialog(QWidget* parent, const std::shared_ptr& mods, BaseInstance* instance) From 946e791d39a19f50d7604b1f57714f8f3a7f63cb Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 30 Sep 2024 21:50:07 +0300 Subject: [PATCH 075/177] sync modpack search field Signed-off-by: Trial97 --- launcher/CMakeLists.txt | 3 ++ launcher/ui/dialogs/NewInstanceDialog.cpp | 16 ++++++++++ launcher/ui/dialogs/NewInstanceDialog.h | 3 ++ .../modplatform/ModpackProviderBasePage.h | 29 +++++++++++++++++++ .../pages/modplatform/atlauncher/AtlPage.cpp | 10 +++++++ .../ui/pages/modplatform/atlauncher/AtlPage.h | 10 +++++-- .../ui/pages/modplatform/flame/FlamePage.cpp | 9 ++++++ .../ui/pages/modplatform/flame/FlamePage.h | 9 ++++-- .../modplatform/import_ftb/ImportFTBPage.cpp | 9 ++++++ .../modplatform/import_ftb/ImportFTBPage.h | 9 ++++-- .../ui/pages/modplatform/legacy_ftb/Page.cpp | 9 ++++++ .../ui/pages/modplatform/legacy_ftb/Page.h | 9 ++++-- .../modplatform/modrinth/ModrinthPage.cpp | 10 +++++++ .../pages/modplatform/modrinth/ModrinthPage.h | 9 ++++-- .../pages/modplatform/technic/TechnicPage.cpp | 10 +++++++ .../pages/modplatform/technic/TechnicPage.h | 9 ++++-- 16 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 launcher/ui/pages/modplatform/ModpackProviderBasePage.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index bd6dfc5b6..dcbfe8fde 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -965,6 +965,9 @@ SET(LAUNCHER_SOURCES ui/pages/modplatform/ShaderPackPage.cpp ui/pages/modplatform/ShaderPackModel.cpp + + ui/pages/modplatform/ModpackProviderBasePage.h + ui/pages/modplatform/atlauncher/AtlFilterModel.cpp ui/pages/modplatform/atlauncher/AtlFilterModel.h ui/pages/modplatform/atlauncher/AtlListModel.cpp diff --git a/launcher/ui/dialogs/NewInstanceDialog.cpp b/launcher/ui/dialogs/NewInstanceDialog.cpp index 2e799d2a8..f16c50860 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.cpp +++ b/launcher/ui/dialogs/NewInstanceDialog.cpp @@ -36,6 +36,7 @@ #include "NewInstanceDialog.h" #include "Application.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/pages/modplatform/import_ftb/ImportFTBPage.h" #include "ui_NewInstanceDialog.h" @@ -140,6 +141,8 @@ NewInstanceDialog::NewInstanceDialog(const QString& initialGroup, auto geometry = screen->availableSize(); resize(width(), qMin(geometry.height() - 50, 710)); } + + connect(m_container, &PageContainer::selectedPageChanged, this, &NewInstanceDialog::selectedPageChanged); } void NewInstanceDialog::reject() @@ -316,3 +319,16 @@ void NewInstanceDialog::importIconNow() } APPLICATION->settings()->set("NewInstanceGeometry", saveGeometry().toBase64()); } + +void NewInstanceDialog::selectedPageChanged(BasePage* previous, BasePage* selected) +{ + auto prevPage = dynamic_cast(previous); + if (prevPage) { + m_searchTerm = prevPage->getSerachTerm(); + } + + auto nextPage = dynamic_cast(selected); + if (nextPage) { + nextPage->setSearchTerm(m_searchTerm); + } +} diff --git a/launcher/ui/dialogs/NewInstanceDialog.h b/launcher/ui/dialogs/NewInstanceDialog.h index 923579567..e97c9f543 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.h +++ b/launcher/ui/dialogs/NewInstanceDialog.h @@ -82,6 +82,7 @@ class NewInstanceDialog : public QDialog, public BasePageProvider { private slots: void on_iconButton_clicked(); void on_instNameTextBox_textChanged(const QString& arg1); + void selectedPageChanged(BasePage* previous, BasePage* selected); private: Ui::NewInstanceDialog* ui = nullptr; @@ -98,5 +99,7 @@ class NewInstanceDialog : public QDialog, public BasePageProvider { QString importVersion; + QString m_searchTerm; + void importIconNow(); }; diff --git a/launcher/ui/pages/modplatform/ModpackProviderBasePage.h b/launcher/ui/pages/modplatform/ModpackProviderBasePage.h new file mode 100644 index 000000000..a3daa9a81 --- /dev/null +++ b/launcher/ui/pages/modplatform/ModpackProviderBasePage.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "ui/pages/BasePage.h" + +class ModpackProviderBasePage : public BasePage { + public: + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) = 0; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const = 0; +}; \ No newline at end of file diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp index d79b7621a..7c69b315e 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlPage.cpp @@ -164,3 +164,13 @@ void AtlPage::onVersionSelectionChanged(QString version) selectedVersion = version; suggestCurrent(); } + +void AtlPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString AtlPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlPage.h b/launcher/ui/pages/modplatform/atlauncher/AtlPage.h index 6bc449649..73460232b 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlPage.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlPage.h @@ -42,8 +42,7 @@ #include #include "Application.h" -#include "tasks/Task.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" namespace Ui { class AtlPage; @@ -51,7 +50,7 @@ class AtlPage; class NewInstanceDialog; -class AtlPage : public QWidget, public BasePage { +class AtlPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -66,6 +65,11 @@ class AtlPage : public QWidget, public BasePage { void openedImpl() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index decb5de3b..4195683e7 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -299,3 +299,12 @@ void FlamePage::updateUi() ui->packDescription->setHtml(StringUtils::htmlListPatch(text + current.description)); ui->packDescription->flush(); } +QString FlamePage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} + +void FlamePage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.h b/launcher/ui/pages/modplatform/flame/FlamePage.h index 7590e1a95..45a3c6b22 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.h +++ b/launcher/ui/pages/modplatform/flame/FlamePage.h @@ -40,7 +40,7 @@ #include #include #include -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -53,7 +53,7 @@ namespace Flame { class ListModel; } -class FlamePage : public QWidget, public BasePage { +class FlamePage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -72,6 +72,11 @@ class FlamePage : public QWidget, public BasePage { bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); diff --git a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp index db59fe10a..15303bb22 100644 --- a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp +++ b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.cpp @@ -135,4 +135,13 @@ void ImportFTBPage::triggerSearch() currentModel->setSearchTerm(ui->searchEdit->text()); } +void ImportFTBPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString ImportFTBPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} } // namespace FTBImportAPP diff --git a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h index 00f013f6f..7afff5a9d 100644 --- a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h +++ b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.h @@ -25,7 +25,7 @@ #include #include "modplatform/import_ftb/PackHelpers.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/pages/modplatform/import_ftb/ListModel.h" class NewInstanceDialog; @@ -35,7 +35,7 @@ namespace Ui { class ImportFTBPage; } -class ImportFTBPage : public QWidget, public BasePage { +class ImportFTBPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -49,6 +49,11 @@ class ImportFTBPage : public QWidget, public BasePage { void openedImpl() override; void retranslate() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void onPackSelectionChanged(Modpack* pack = nullptr); diff --git a/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp b/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp index a587b5baf..226a30ee3 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/Page.cpp @@ -369,4 +369,13 @@ void Page::triggerSearch() currentModel->setSearchTerm(ui->searchEdit->text()); } +void Page::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString Page::getSerachTerm() const +{ + return ui->searchEdit->text(); +} } // namespace LegacyFTB diff --git a/launcher/ui/pages/modplatform/legacy_ftb/Page.h b/launcher/ui/pages/modplatform/legacy_ftb/Page.h index daef23342..a2dee24e9 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/Page.h +++ b/launcher/ui/pages/modplatform/legacy_ftb/Page.h @@ -43,7 +43,7 @@ #include "QObjectPtr.h" #include "modplatform/legacy_ftb/PackFetchTask.h" #include "modplatform/legacy_ftb/PackHelpers.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" class NewInstanceDialog; @@ -57,7 +57,7 @@ class ListModel; class FilterModel; class PrivatePackManager; -class Page : public QWidget, public BasePage { +class Page : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -71,6 +71,11 @@ class Page : public QWidget, public BasePage { void openedImpl() override; void retranslate() override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void onPackSelectionChanged(Modpack* pack = nullptr); diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 03461d85a..a000044fa 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -351,3 +351,13 @@ void ModrinthPage::onVersionSelectionChanged(int index) selectedVersion = ui->versionSelectionBox->currentData().toString(); suggestCurrent(); } + +void ModrinthPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString ModrinthPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h index dadaeb0a0..dd99e0d29 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h @@ -38,9 +38,9 @@ #include "Application.h" #include "ui/dialogs/NewInstanceDialog.h" -#include "ui/pages/BasePage.h" #include "modplatform/modrinth/ModrinthPackManifest.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" #include @@ -54,7 +54,7 @@ namespace Modrinth { class ModpackListModel; } -class ModrinthPage : public QWidget, public BasePage { +class ModrinthPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -78,6 +78,11 @@ class ModrinthPage : public QWidget, public BasePage { void openedImpl() override; bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private slots: void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp index a8f06619f..50d267b1f 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp @@ -342,3 +342,13 @@ void TechnicPage::onVersionSelectionChanged(QString version) selectedVersion = version; selectVersion(); } + +void TechnicPage::setSearchTerm(QString term) +{ + ui->searchEdit->setText(term); +} + +QString TechnicPage::getSerachTerm() const +{ + return ui->searchEdit->text(); +} diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.h b/launcher/ui/pages/modplatform/technic/TechnicPage.h index 01439337d..d1f691b22 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.h +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.h @@ -41,7 +41,7 @@ #include #include "TechnicData.h" #include "net/NetJob.h" -#include "ui/pages/BasePage.h" +#include "ui/pages/modplatform/ModpackProviderBasePage.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -54,7 +54,7 @@ namespace Technic { class ListModel; } -class TechnicPage : public QWidget, public BasePage { +class TechnicPage : public QWidget, public ModpackProviderBasePage { Q_OBJECT public: @@ -71,6 +71,11 @@ class TechnicPage : public QWidget, public BasePage { bool eventFilter(QObject* watched, QEvent* event) override; + /** Programatically set the term in the search bar. */ + virtual void setSearchTerm(QString) override; + /** Get the current term in the search bar. */ + [[nodiscard]] virtual QString getSerachTerm() const override; + private: void suggestCurrent(); void metadataLoaded(); From dfe3cd849def92682c45610e65bde3f6f5344a39 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 2 Oct 2024 01:06:45 +0300 Subject: [PATCH 076/177] add curseforge modpack filter Signed-off-by: Trial97 --- launcher/modplatform/ModIndex.h | 2 +- launcher/modplatform/flame/FlameAPI.cpp | 10 ++- launcher/modplatform/flame/FlameAPI.h | 17 +++-- launcher/modplatform/flame/FlamePackIndex.cpp | 22 +++++- launcher/modplatform/flame/FlamePackIndex.h | 1 + launcher/modplatform/modrinth/ModrinthAPI.cpp | 11 ++- launcher/modplatform/modrinth/ModrinthAPI.h | 1 + .../ui/pages/modplatform/flame/FlameModel.cpp | 27 +++---- .../ui/pages/modplatform/flame/FlameModel.h | 4 +- .../ui/pages/modplatform/flame/FlamePage.cpp | 65 +++++++++++++++- .../ui/pages/modplatform/flame/FlamePage.h | 5 ++ .../ui/pages/modplatform/flame/FlamePage.ui | 69 ++++++++++------- .../modplatform/flame/FlameResourcePages.cpp | 6 +- .../modplatform/flame/FlameResourcePages.h | 3 + launcher/ui/widgets/ModFilterWidget.cpp | 74 +++++++++++++++---- 15 files changed, 242 insertions(+), 75 deletions(-) diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index e3fe69e0c..d5ee12473 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -35,7 +35,7 @@ Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType) enum class ResourceProvider { MODRINTH, FLAME }; -enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK }; +enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK, MODPACK }; enum class DependencyType { REQUIRED, OPTIONAL, INCOMPATIBLE, EMBEDDED, TOOL, INCLUDE, UNKNOWN }; diff --git a/launcher/modplatform/flame/FlameAPI.cpp b/launcher/modplatform/flame/FlameAPI.cpp index 72437976d..ddd48c2b1 100644 --- a/launcher/modplatform/flame/FlameAPI.cpp +++ b/launcher/modplatform/flame/FlameAPI.cpp @@ -221,14 +221,20 @@ QList FlameAPI::getSortingMethods() const { 8, "GameVersion", QObject::tr("Sort by Game Version") } }; } -Task::Ptr FlameAPI::getModCategories(std::shared_ptr response) +Task::Ptr FlameAPI::getCategories(std::shared_ptr response, ModPlatform::ResourceType type) { auto netJob = makeShared(QString("Flame::GetCategories"), APPLICATION->network()); - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl("https://api.curseforge.com/v1/categories?gameId=432&classId=6"), response)); + netJob->addNetAction(Net::ApiDownload::makeByteArray( + QUrl(QString("https://api.curseforge.com/v1/categories?gameId=432&classId=%1").arg(getClassId(type))), response)); QObject::connect(netJob.get(), &Task::failed, [](QString msg) { qDebug() << "Flame failed to get categories:" << msg; }); return netJob; } +Task::Ptr FlameAPI::getModCategories(std::shared_ptr response) +{ + return getCategories(response, ModPlatform::ResourceType::MOD); +} + QList FlameAPI::loadModCategories(std::shared_ptr response) { QList categories; diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index 1160151c5..c66ece8a3 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -25,6 +25,7 @@ class FlameAPI : public NetworkResourceAPI { Task::Ptr getFiles(const QStringList& fileIds, std::shared_ptr response) const; Task::Ptr getFile(const QString& addonId, const QString& fileId, std::shared_ptr response) const; + static Task::Ptr getCategories(std::shared_ptr response, ModPlatform::ResourceType type); static Task::Ptr getModCategories(std::shared_ptr response); static QList loadModCategories(std::shared_ptr response); @@ -46,6 +47,8 @@ class FlameAPI : public NetworkResourceAPI { return 12; case ModPlatform::ResourceType::SHADER_PACK: return 6552; + case ModPlatform::ResourceType::MODPACK: + return 4471; } } @@ -82,8 +85,8 @@ class FlameAPI : public NetworkResourceAPI { static const QString getModLoaderFilters(ModPlatform::ModLoaderTypes types) { return "[" + getModLoaderStrings(types).join(',') + "]"; } - private: - [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override + public: + static std::optional getStaticSearchURL(SearchArgs const& args) { auto gameVersionStr = args.versions.has_value() ? QString("gameVersion=%1").arg(args.versions.value().front().toString()) : QString(); @@ -105,12 +108,14 @@ class FlameAPI : public NetworkResourceAPI { get_arguments.append(gameVersionStr); return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); - }; + } + [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { return getStaticSearchURL(args); } + private: [[nodiscard]] std::optional getInfoURL(QString const& id) const override { return QString("https://api.curseforge.com/v1/mods/%1").arg(id); - }; + } [[nodiscard]] std::optional getVersionsURL(VersionSearchArgs const& args) const override { @@ -125,7 +130,7 @@ class FlameAPI : public NetworkResourceAPI { url += QString("&modLoaderType=%1").arg(mappedModLoader); } return url; - }; + } [[nodiscard]] std::optional getDependencyURL(DependencySearchArgs const& args) const override { @@ -137,5 +142,5 @@ class FlameAPI : public NetworkResourceAPI { url += QString("&modLoaderType=%1").arg(mappedModLoader); } return url; - }; + } }; diff --git a/launcher/modplatform/flame/FlamePackIndex.cpp b/launcher/modplatform/flame/FlamePackIndex.cpp index ca8e0a853..8c25b0482 100644 --- a/launcher/modplatform/flame/FlamePackIndex.cpp +++ b/launcher/modplatform/flame/FlamePackIndex.cpp @@ -3,6 +3,7 @@ #include #include "Json.h" +#include "modplatform/ModIndex.h" void Flame::loadIndexedPack(Flame::IndexedPack& pack, QJsonObject& obj) { @@ -88,8 +89,27 @@ void Flame::loadIndexedPackVersions(Flame::IndexedPack& pack, QJsonArray& arr) continue; } + for (auto mcVer : versionArray) { + auto str = mcVer.toString(); + + if (str.contains('.')) + file.mcVersion.append(str); + + if (auto loader = str.toLower(); loader == "neoforge") + file.loaders |= ModPlatform::NeoForge; + else if (loader == "forge") + file.loaders |= ModPlatform::Forge; + else if (loader == "cauldron") + file.loaders |= ModPlatform::Cauldron; + else if (loader == "liteloader") + file.loaders |= ModPlatform::LiteLoader; + else if (loader == "fabric") + file.loaders |= ModPlatform::Fabric; + else if (loader == "quilt") + file.loaders |= ModPlatform::Quilt; + } + // pick the latest version supported - file.mcVersion = versionArray[0].toString(); file.version = Json::requireString(version, "displayName"); ModPlatform::IndexedVersionType::VersionType ver_type; diff --git a/launcher/modplatform/flame/FlamePackIndex.h b/launcher/modplatform/flame/FlamePackIndex.h index b2a12a67f..11633deee 100644 --- a/launcher/modplatform/flame/FlamePackIndex.h +++ b/launcher/modplatform/flame/FlamePackIndex.h @@ -18,6 +18,7 @@ struct IndexedVersion { int fileId; QString version; ModPlatform::IndexedVersionType version_type; + ModPlatform::ModLoaderTypes loaders = {}; QString mcVersion; QString downloadUrl; }; diff --git a/launcher/modplatform/modrinth/ModrinthAPI.cpp b/launcher/modplatform/modrinth/ModrinthAPI.cpp index 4798ace84..323711e02 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.cpp +++ b/launcher/modplatform/modrinth/ModrinthAPI.cpp @@ -129,7 +129,7 @@ Task::Ptr ModrinthAPI::getModCategories(std::shared_ptr response) return netJob; } -QList ModrinthAPI::loadModCategories(std::shared_ptr response) +QList ModrinthAPI::loadCategories(std::shared_ptr response, QString projectType) { QList categories; QJsonParseError parse_error{}; @@ -147,7 +147,7 @@ QList ModrinthAPI::loadModCategories(std::shared_ptr ModrinthAPI::loadModCategories(std::shared_ptr ModrinthAPI::loadModCategories(std::shared_ptr response) +{ + return loadCategories(response, "mod"); +}; diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index d1f8f712a..07be06756 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -31,6 +31,7 @@ class ModrinthAPI : public NetworkResourceAPI { Task::Ptr getProjects(QStringList addonIds, std::shared_ptr response) const override; static Task::Ptr getModCategories(std::shared_ptr response); + static QList loadCategories(std::shared_ptr response, QString projectType); static QList loadModCategories(std::shared_ptr response); public: diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index a92d5b579..8383b756f 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -1,6 +1,7 @@ #include "FlameModel.h" #include #include "Application.h" +#include "modplatform/ModIndex.h" #include "modplatform/ResourceAPI.h" #include "modplatform/flame/FlameAPI.h" #include "ui/widgets/ProjectItem.h" @@ -183,34 +184,28 @@ void ListModel::performPaginatedSearch() return; } } + ResourceAPI::SortingMethod sort{}; + sort.index = currentSort + 1; + auto netJob = makeShared("Flame::Search", APPLICATION->network()); - auto searchUrl = QString( - "https://api.curseforge.com/v1/mods/search?" - "gameId=432&" - "classId=4471&" - "index=%1&" - "pageSize=25&" - "searchFilter=%2&" - "sortField=%3&" - "sortOrder=desc") - .arg(nextSearchOffset) - .arg(currentSearchTerm) - .arg(currentSort + 1); - - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response)); + auto searchUrl = FlameAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + + netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), response)); jobPtr = netJob; jobPtr->start(); QObject::connect(netJob.get(), &NetJob::succeeded, this, &ListModel::searchRequestFinished); QObject::connect(netJob.get(), &NetJob::failed, this, &ListModel::searchRequestFailed); } -void ListModel::searchWithTerm(const QString& term, int sort) +void ListModel::searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged) { - if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort) { + if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort && !filterChanged) { return; } currentSearchTerm = term; currentSort = sort; + m_filter = filter; if (hasActiveSearchJob()) { jobPtr->abort(); searchState = ResetRequested; diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.h b/launcher/ui/pages/modplatform/flame/FlameModel.h index 9b6d70fec..026f6d1ee 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.h +++ b/launcher/ui/pages/modplatform/flame/FlameModel.h @@ -14,6 +14,7 @@ #include #include +#include "ui/widgets/ModFilterWidget.h" #include @@ -38,7 +39,7 @@ class ListModel : public QAbstractListModel { void fetchMore(const QModelIndex& parent) override; void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); - void searchWithTerm(const QString& term, int sort); + void searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } @@ -65,6 +66,7 @@ class ListModel : public QAbstractListModel { QString currentSearchTerm; int currentSort = 0; + std::shared_ptr m_filter; int nextSearchOffset = 0; enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } searchState = None; Task::Ptr jobPtr; diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 4195683e7..62798f4bc 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -34,10 +34,13 @@ */ #include "FlamePage.h" +#include "modplatform/flame/FlamePackIndex.h" #include "ui/dialogs/CustomMessageBox.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui_FlamePage.h" #include +#include #include "Application.h" #include "FlameModel.h" @@ -88,6 +91,7 @@ FlamePage::FlamePage(NewInstanceDialog* dialog, QWidget* parent) ui->packView->setItemDelegate(new ProjectItemDelegate(this)); ui->packDescription->setMetaEntry("FlamePacks"); + createFilterWidget(); } FlamePage::~FlamePage() @@ -131,10 +135,35 @@ void FlamePage::openedImpl() void FlamePage::triggerSearch() { - listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex()); + ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect); + ui->packView->clearSelection(); + ui->packDescription->clear(); + ui->versionSelectionBox->clear(); + listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex(), m_filterWidget->getFilter(), + m_filterWidget->changed()); m_fetch_progress.watch(listModel->activeSearchJob().get()); } +bool checkMcVersions(std::list filter, QString value) +{ + for (auto mcVersion : filter) { + if (value == mcVersion.toString()) { + return true; + } + } + return filter.empty(); +} + +bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptr filter) +{ + if (!filter) + return true; + return ((!filter->loaders || !v.loaders || filter->loaders & v.loaders) && // loaders + (filter->releases.empty() || // releases + std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && + checkMcVersions(filter->versions, v.mcVersion)); // mcVersions} +} + void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) { ui->versionSelectionBox->clear(); @@ -148,7 +177,7 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde current = listModel->data(curr, Qt::UserRole).value(); - if (current.versionsLoaded == false) { + if (!current.versionsLoaded || m_filterWidget->changed()) { qDebug() << "Loading flame modpack versions"; auto netJob = new NetJob(QString("Flame::PackVersions(%1)").arg(current.name), APPLICATION->network()); auto response = std::make_shared(); @@ -176,6 +205,16 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde qWarning() << "Error while reading flame modpack version: " << e.cause(); } + auto pred = [this](const Flame::IndexedVersion& v) { return !checkVersionFilters(v, m_filterWidget->getFilter()); }; +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + current.versions.removeIf(pred); +#else + for (auto it = current.versions.begin(); it != current.versions.end();) + if (pred(*it)) + it = current.versions.erase(it); + else + ++it; +#endif for (auto version : current.versions) { auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : ""; auto mcVersion = !version.mcVersion.isEmpty() && !version.version.contains(version.mcVersion) @@ -308,3 +347,25 @@ void FlamePage::setSearchTerm(QString term) { ui->searchEdit->setText(term); } + +void FlamePage::createFilterWidget() +{ + auto widget = ModFilterWidget::create(nullptr, false, this); + m_filterWidget.swap(widget); + auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); + // because we replaced the widget we also need to delete it + if (old) { + delete old; + } + + connect(ui->filterButton, &QPushButton::clicked, this, [this] { m_filterWidget->setHidden(!m_filterWidget->isHidden()); }); + + connect(m_filterWidget.get(), &ModFilterWidget::filterChanged, this, &FlamePage::triggerSearch); + auto response = std::make_shared(); + m_categoriesTask = FlameAPI::getCategories(response, ModPlatform::ResourceType::MODPACK); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { + auto categories = FlameAPI::loadModCategories(response); + m_filterWidget->setCategories(categories); + }); + m_categoriesTask->start(); +} diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.h b/launcher/ui/pages/modplatform/flame/FlamePage.h index 45a3c6b22..27c96d2f1 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.h +++ b/launcher/ui/pages/modplatform/flame/FlamePage.h @@ -41,6 +41,7 @@ #include #include #include "ui/pages/modplatform/ModpackProviderBasePage.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui/widgets/ProgressWidget.h" namespace Ui { @@ -84,6 +85,7 @@ class FlamePage : public QWidget, public ModpackProviderBasePage { void triggerSearch(); void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); + void createFilterWidget(); private: Ui::FlamePage* ui = nullptr; @@ -97,4 +99,7 @@ class FlamePage : public QWidget, public ModpackProviderBasePage { // Used to do instant searching with a delay to cache quick changes QTimer m_search_timer; + + unique_qobject_ptr m_filterWidget; + Task::Ptr m_categoriesTask; }; diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.ui b/launcher/ui/pages/modplatform/flame/FlamePage.ui index d4ddb37a4..b028e7569 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.ui +++ b/launcher/ui/pages/modplatform/flame/FlamePage.ui @@ -30,42 +30,59 @@ - - - Search and filter... - - - - - + - - - Qt::ScrollBarAlwaysOff - - - true - - - - 48 - 48 - + + + Search and filter... - - - true - - - true + + + Filter + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + 48 + 48 + + + + + + true + + + true + + + + diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp index 62c22902e..ce8c03fa1 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp @@ -215,11 +215,11 @@ unique_qobject_ptr FlameModPage::createFilterWidget() void FlameModPage::prepareProviderCategories() { auto response = std::make_shared(); - auto task = FlameAPI::getModCategories(response); - QObject::connect(task.get(), &Task::succeeded, [this, response]() { + m_categoriesTask = FlameAPI::getModCategories(response); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { auto categories = FlameAPI::loadModCategories(response); m_filter_widget->setCategories(categories); }); - task->start(); + m_categoriesTask->start(); }; } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.h b/launcher/ui/pages/modplatform/flame/FlameResourcePages.h index 6eef3e435..052706549 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.h +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.h @@ -100,6 +100,9 @@ class FlameModPage : public ModPage { protected: virtual void prepareProviderCategories() override; + + private: + Task::Ptr m_categoriesTask; }; class FlameResourcePackPage : public ResourcePackResourcePage { diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index bbb91eac2..a048dbe10 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -68,6 +68,40 @@ class VersionBasicModel : public QIdentityProxyModel { } }; +class AllVersionProxyModel : public QSortFilterProxyModel { + Q_OBJECT + + public: + AllVersionProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} + + int rowCount(const QModelIndex& parent = QModelIndex()) const override { return QSortFilterProxyModel::rowCount(parent) + 1; } + + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override + { + if (!index.isValid()) { + return {}; + } + + if (index.row() == 0) { + if (role == Qt::DisplayRole) { + return tr("All Versions"); + } + return {}; + } + + QModelIndex newIndex = QSortFilterProxyModel::index(index.row() - 1, index.column()); + return QSortFilterProxyModel::data(newIndex, role); + } + + Qt::ItemFlags flags(const QModelIndex& index) const override + { + if (index.row() == 0) { + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; + } + return QSortFilterProxyModel::flags(index); + } +}; + ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWidget* parent) : QTabWidget(parent), ui(new Ui::ModFilterWidget), m_instance(instance), m_filter(new Filter()) { @@ -76,9 +110,15 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi m_versions_proxy = new VersionProxyModel(this); m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release")); - auto proxy = new VersionBasicModel(this); + QAbstractProxyModel* proxy = new VersionBasicModel(this); proxy->setSourceModel(m_versions_proxy); + if (!m_instance && !extended) { + auto allVersions = new AllVersionProxyModel(this); + allVersions->setSourceModel(proxy); + proxy = allVersions; + } + if (extended) { ui->versions->setSourceModel(proxy); ui->versions->setSeparator(", "); @@ -162,18 +202,22 @@ void ModFilterWidget::loadVersionList() void ModFilterWidget::prepareBasicFilter() { - m_filter->hideInstalled = false; - m_filter->side = ""; // or "both" - auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value(); - ui->neoForge->setChecked(loaders & ModPlatform::NeoForge); - ui->forge->setChecked(loaders & ModPlatform::Forge); - ui->fabric->setChecked(loaders & ModPlatform::Fabric); - ui->quilt->setChecked(loaders & ModPlatform::Quilt); - m_filter->loaders = loaders; - auto def = m_instance->getPackProfile()->getComponentVersion("net.minecraft"); - m_filter->versions.emplace_front(def); - ui->versions->setCheckedItems({ def }); - ui->version->setCurrentIndex(ui->version->findText(def)); + if (m_instance) { + m_filter->hideInstalled = false; + m_filter->side = ""; // or "both" + auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value(); + ui->neoForge->setChecked(loaders & ModPlatform::NeoForge); + ui->forge->setChecked(loaders & ModPlatform::Forge); + ui->fabric->setChecked(loaders & ModPlatform::Fabric); + ui->quilt->setChecked(loaders & ModPlatform::Quilt); + m_filter->loaders = loaders; + auto def = m_instance->getPackProfile()->getComponentVersion("net.minecraft"); + m_filter->versions.emplace_front(def); + ui->versions->setCheckedItems({ def }); + ui->version->setCurrentIndex(ui->version->findText(def)); + } else { + ui->hideInstalled->hide(); + } } void ModFilterWidget::onShowAllVersionsChanged() @@ -249,7 +293,9 @@ void ModFilterWidget::onHideInstalledFilterChanged() void ModFilterWidget::onVersionFilterTextChanged(const QString& version) { m_filter->versions.clear(); - m_filter->versions.emplace_back(version); + if (version != tr("All Versions")) { + m_filter->versions.emplace_back(version); + } m_filter_changed = true; emit filterChanged(); } From 010678da53c864f08b0f900265aacdca256a4dd8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:46:28 +0000 Subject: [PATCH 077/177] chore(deps): update cachix/install-nix-action action to v30 --- .github/workflows/build.yml | 2 +- .github/workflows/update-flake.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad77d282b..f578839fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -658,7 +658,7 @@ jobs: uses: actions/checkout@v4 - name: Install Nix - uses: cachix/install-nix-action@v29 + uses: cachix/install-nix-action@v30 # For PRs - name: Setup Nix Magic Cache diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index 0c8cfde67..5e978f356 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: cachix/install-nix-action@9f70348d77d0422624097c4b7a75563948901306 # v29 + - uses: cachix/install-nix-action@08dcb3a5e62fa31e2da3d490afc4176ef55ecd72 # v30 - uses: DeterminateSystems/update-flake-lock@v24 with: From bcb1d456d4773f985d3b18d42382400a2c8148e7 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 21:56:19 -0700 Subject: [PATCH 078/177] fix: version NSCurl plugin in workflow, detect and use arm64 vc_redist for arm64 Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 13 +++++++++++-- program_info/CMakeLists.txt | 12 +++++++++--- program_info/win_install.nsi.in | 14 +++++++------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7345ffe90..16c9290f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,6 +81,8 @@ jobs: qt_arch: "" qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" + nscurl_tag: "v24.9.26.122" + nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" - os: windows-2022 name: "Windows-MSVC-arm64" @@ -92,6 +94,8 @@ jobs: qt_arch: "win64_msvc2019_arm64" qt_version: "6.7.2" qt_modules: "qt5compat qtimageformats qtnetworkauth" + nscurl_tag: "v24.9.26.122" + nscurl_sha256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0" - os: macos-14 name: macOS @@ -472,8 +476,13 @@ jobs: if: runner.os == 'Windows' run: | New-Item -Name NSISPlugins -ItemType Directory - Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -OutFile NSISPlugins\NScurl.zip - Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NSIScurl + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip + $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash + if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { + echo "::error:: NSCurl.zib sha256 mismatch" + exit 1 + } + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 30a435866..8fb6f68aa 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -44,14 +44,20 @@ configure_file(prismlauncher.ico prismlauncher.ico COPYONLY) if(MSVC) set(Launcher_MSVC_Redist_NSIS_Section [=[ -!ifdef haveNSIScurl +!ifdef haveNScurl Section "Visual Studio Runtime" + Var /GLOBAL vc_redist_exe + ${If} ${IsNativeARM64} + StrCpy $vc_redist_exe "vc_redist.arm64.exe" + ${Else} + StrCpy $vc_redist_exe "vc_redist.x64.exe" + ${EndIf} DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' - NScurl::http GET "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$INSTDIR\vc_redist\vc_redist.x64.exe" /INSIST /CANCEL /Zone.Identifier /END + NScurl::http GET "https://aka.ms/vs/17/release/${vc_redist_exe}" "$INSTDIR\vc_redist\${vc_redist_exe}" /INSIST /CANCEL /Zone.Identifier /END Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\vc_redist.x64.exe /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\${vc_redist_exe} /install /passive /norestart\" ${Else} DetailPrint "Download failed with error $0" ${EndIf} diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index a5c38599d..c0e2b892f 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -349,15 +349,15 @@ SectionEnd ;------------------------------------ ; include nice plugins -; NSIScurl - curl in NSIS +; NScurl - curl in NSIS ; used for MSVS redist download -; extract to ../NSISPlugins/NSIScurl +; extract to ../NSISPlugins/NScurl ; https://github.com/negrutiu/nsis-nscurl/releases/latest/download/NScurl.zip -!insertmacro CompileTimeIfFileExist "../NSISPlugins/NSIScurl/Plugins/" haveNSIScurl -!ifdef haveNSIScurl -!AddPluginDir /x86-unicode "../NSISPlugins/NSIScurl/Plugins/x86-unicode" -!AddPluginDir /x86-ansi "../NSISPlugins/NSIScurl/Plugins/x86-ansi" -!AddPluginDir /amd64-unicode "../NSISPlugins/NSIScurl/Plugins/amd64-unicode" +!insertmacro CompileTimeIfFileExist "../NSISPlugins/NScurl/Plugins/" haveNScurl +!ifdef haveNScurl +!AddPluginDir /x86-unicode "../NSISPlugins/NScurl/Plugins/x86-unicode" +!AddPluginDir /x86-ansi "../NSISPlugins/NScurl/Plugins/x86-ansi" +!AddPluginDir /amd64-unicode "../NSISPlugins/NScurl/Plugins/amd64-unicode" !endif ;------------------------------------ From 63172540fb467386864ae22356999451dd2ebe08 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:38:30 -0700 Subject: [PATCH 079/177] fix: nisi needs `!include` "x64.nsh" now. also, there were some broken varible Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/CMakeLists.txt | 4 ++-- program_info/win_install.nsi.in | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 8fb6f68aa..ee2e336b1 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -53,11 +53,11 @@ Section "Visual Studio Runtime" StrCpy $vc_redist_exe "vc_redist.x64.exe" ${EndIf} DetailPrint 'Downloading Microsoft Visual C++ Redistributable...' - NScurl::http GET "https://aka.ms/vs/17/release/${vc_redist_exe}" "$INSTDIR\vc_redist\${vc_redist_exe}" /INSIST /CANCEL /Zone.Identifier /END + NScurl::http GET "https://aka.ms/vs/17/release/$vc_redist_exe" "$INSTDIR\vc_redist\$vc_redist_exe" /INSIST /CANCEL /Zone.Identifier /END Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\${vc_redist_exe} /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart\" ${Else} DetailPrint "Download failed with error $0" ${EndIf} diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index c0e2b892f..24f6ee4e8 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -2,6 +2,8 @@ !include "LogicLib.nsh" !include "MUI2.nsh" +!include "x64.nsh" + Unicode true Name "@Launcher_DisplayName@" @@ -185,7 +187,7 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ !macroend -!macro APP_UNASSOCIATE EXT APP_ID +!macro APP_UNASSOCIATE EXT APP_ID APP_EXE # Unregister file type ClearErrors @@ -489,8 +491,8 @@ Section -un.ShellAssoc !insertmacro APP_TEARDOWN_DEFAULT `${APPID}` `${APPNAME}` `${APPEXE}` - !insertmacro APP_UNASSOCIATE ".zip" `${APPID}` - !insertmacro APP_UNASSOCIATE ".mrpack" `${APPID}` + !insertmacro APP_UNASSOCIATE ".zip" `${APPID}` `${APPEXE}` + !insertmacro APP_UNASSOCIATE ".mrpack" `${APPID}` `${APPEXE}` !insertmacro NotifyShell_AssocChanged SectionEnd From 023aa18e852ab1b570b378609edee1e7bbcd1588 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 3 Oct 2024 23:14:29 -0700 Subject: [PATCH 080/177] ci: NSCurl only needed on MSVC Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16c9290f2..4063df355 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -475,14 +475,16 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' run: | - New-Item -Name NSISPlugins -ItemType Directory - Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip - $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash - if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { - echo "::error:: NSCurl.zib sha256 mismatch" - exit 1 + if ('${{ matrix.nscurl_tag }}') { + New-Item -Name NSISPlugins -ItemType Directory + Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip + $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash + if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { + echo "::error:: NSCurl.zib sha256 mismatch" + exit 1 + } + Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl } - Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" From a61c93bedefced10b59c310daa567e31cb30f967 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 4 Oct 2024 07:06:19 -0700 Subject: [PATCH 081/177] Update .github/workflows/build.yml Co-authored-by: Sefa Eyeoglu Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4063df355..98caa901d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -480,7 +480,7 @@ jobs: Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/${{ matrix.nscurl_tag }}/NScurl.zip -OutFile NSISPlugins\NScurl.zip $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash if ( $nscurl_hash -ne "${{ matrix.nscurl_sha256 }}") { - echo "::error:: NSCurl.zib sha256 mismatch" + echo "::error:: NSCurl.zip sha256 mismatch" exit 1 } Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl From 859fac604bf698755e73083625c75969b59c5e8a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 4 Oct 2024 17:06:47 +0300 Subject: [PATCH 082/177] add modrinth modpack filter Signed-off-by: Trial97 --- launcher/Version.cpp | 15 +++- launcher/Version.h | 2 + launcher/modplatform/flame/FlameAPI.h | 8 +-- launcher/modplatform/modrinth/ModrinthAPI.h | 19 +++-- .../modrinth/ModrinthPackManifest.cpp | 15 ++++ .../modrinth/ModrinthPackManifest.h | 1 + launcher/ui/pages/modplatform/ModModel.cpp | 12 ---- .../ui/pages/modplatform/flame/FlamePage.cpp | 13 +--- .../modplatform/modrinth/ModrinthModel.cpp | 41 +++++------ .../modplatform/modrinth/ModrinthModel.h | 5 +- .../modplatform/modrinth/ModrinthPage.cpp | 53 +++++++++++++- .../pages/modplatform/modrinth/ModrinthPage.h | 5 ++ .../modplatform/modrinth/ModrinthPage.ui | 69 ++++++++++++------- 13 files changed, 170 insertions(+), 88 deletions(-) diff --git a/launcher/Version.cpp b/launcher/Version.cpp index 511aa9c35..e43d9d3f7 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -123,8 +123,19 @@ QDebug operator<<(QDebug debug, const Version& v) first = false; } - debug.nospace() << " ]" - << " }"; + debug.nospace() << " ]" << " }"; return debug; } + +bool checkMcVersions(std::list filter, QStringList value) +{ + bool valid = false; + for (auto mcVersion : filter) { + if (value.contains(mcVersion.toString())) { + valid = true; + break; + } + } + return filter.empty() || valid; +} diff --git a/launcher/Version.h b/launcher/Version.h index b06e256aa..f596bfeba 100644 --- a/launcher/Version.h +++ b/launcher/Version.h @@ -161,3 +161,5 @@ class Version { void parse(); }; + +bool checkMcVersions(std::list filter, QStringList value); diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index c66ece8a3..4abaff4ea 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -88,9 +88,6 @@ class FlameAPI : public NetworkResourceAPI { public: static std::optional getStaticSearchURL(SearchArgs const& args) { - auto gameVersionStr = - args.versions.has_value() ? QString("gameVersion=%1").arg(args.versions.value().front().toString()) : QString(); - QStringList get_arguments; get_arguments.append(QString("classId=%1").arg(getClassId(args.type))); get_arguments.append(QString("index=%1").arg(args.offset)); @@ -100,12 +97,13 @@ class FlameAPI : public NetworkResourceAPI { if (args.sorting.has_value()) get_arguments.append(QString("sortField=%1").arg(args.sorting.value().index)); get_arguments.append("sortOrder=desc"); - if (args.loaders.has_value()) + if (args.loaders.has_value() && args.loaders.value() != 0) get_arguments.append(QString("modLoaderTypes=%1").arg(getModLoaderFilters(args.loaders.value()))); if (args.categoryIds.has_value() && !args.categoryIds->empty()) get_arguments.append(QString("categoryIds=[%1]").arg(args.categoryIds->join(","))); - get_arguments.append(gameVersionStr); + if (args.versions.has_value() && !args.versions.value().empty()) + get_arguments.append(QString("gameVersion=%1").arg(args.versions.value().front().toString())); return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); } diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index 07be06756..b84d281aa 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -91,6 +91,8 @@ class ModrinthAPI : public NetworkResourceAPI { return "resourcepack"; case ModPlatform::ResourceType::SHADER_PACK: return "shader"; + case ModPlatform::ResourceType::MODPACK: + return "modpack"; default: qWarning() << "Invalid resource type for Modrinth API!"; break; @@ -99,13 +101,13 @@ class ModrinthAPI : public NetworkResourceAPI { return ""; } - [[nodiscard]] QString createFacets(SearchArgs const& args) const + [[nodiscard]] static QString createFacets(SearchArgs const& args) { QStringList facets_list; - if (args.loaders.has_value()) + if (args.loaders.has_value() && args.loaders.value() != 0) facets_list.append(QString("[%1]").arg(getModLoaderFilters(args.loaders.value()))); - if (args.versions.has_value()) + if (args.versions.has_value() && !args.versions.value().empty()) facets_list.append(QString("[%1]").arg(getGameVersionsArray(args.versions.value()))); if (args.side.has_value()) { auto side = getSideFilters(args.side.value()); @@ -121,9 +123,9 @@ class ModrinthAPI : public NetworkResourceAPI { } public: - [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override + static std::optional getStaticSearchURL(SearchArgs const& args) { - if (args.loaders.has_value()) { + if (args.loaders.has_value() && args.loaders.value() != 0) { if (!validateModLoaders(args.loaders.value())) { qWarning() << "Modrinth - or our interface - does not support any the provided mod loaders!"; return {}; @@ -142,6 +144,11 @@ class ModrinthAPI : public NetworkResourceAPI { return BuildConfig.MODRINTH_PROD_URL + "/search?" + get_arguments.join('&'); }; + [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override + { + return getStaticSearchURL(args); + } + inline auto getInfoURL(QString const& id) const -> std::optional override { return BuildConfig.MODRINTH_PROD_URL + "/project/" + id; @@ -164,7 +171,7 @@ class ModrinthAPI : public NetworkResourceAPI { .arg(BuildConfig.MODRINTH_PROD_URL, args.pack.addonId.toString(), get_arguments.isEmpty() ? "" : "?", get_arguments.join('&')); }; - auto getGameVersionsArray(std::list mcVersions) const -> QString + static QString getGameVersionsArray(std::list mcVersions) { QString s; for (auto& ver : mcVersions) { diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp index f360df43a..c52a1743b 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp @@ -135,6 +135,21 @@ auto loadIndexedVersion(QJsonObject& obj) -> ModpackVersion if (!gameVersions.isEmpty()) { file.gameVersion = Json::ensureString(gameVersions[0]); } + auto loaders = Json::requireArray(obj, "loaders"); + for (auto loader : loaders) { + if (loader == "neoforge") + file.loaders |= ModPlatform::NeoForge; + else if (loader == "forge") + file.loaders |= ModPlatform::Forge; + else if (loader == "cauldron") + file.loaders |= ModPlatform::Cauldron; + else if (loader == "liteloader") + file.loaders |= ModPlatform::LiteLoader; + else if (loader == "fabric") + file.loaders |= ModPlatform::Fabric; + else if (loader == "quilt") + file.loaders |= ModPlatform::Quilt; + } file.version_type = ModPlatform::IndexedVersionType(Json::requireString(obj, "version_type")); file.changelog = Json::ensureString(obj, "changelog"); diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.h b/launcher/modplatform/modrinth/ModrinthPackManifest.h index 2bd61c5d9..2e5e2da84 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.h +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.h @@ -87,6 +87,7 @@ struct ModpackVersion { QString gameVersion; ModPlatform::IndexedVersionType version_type; QString changelog; + ModPlatform::ModLoaderTypes loaders = {}; QString id; QString project_id; diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index e87a423fa..dfc308566 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -104,18 +104,6 @@ bool checkSide(QString filter, QString value) return filter.isEmpty() || value.isEmpty() || filter == "both" || value == "both" || filter == value; } -bool checkMcVersions(std::list filter, QStringList value) -{ - bool valid = false; - for (auto mcVersion : filter) { - if (value.contains(mcVersion.toString())) { - valid = true; - break; - } - } - return filter.empty() || valid; -} - bool ModModel::checkFilters(ModPlatform::IndexedPack::Ptr pack) { if (!m_filter) diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 62798f4bc..b92401988 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -34,6 +34,7 @@ */ #include "FlamePage.h" +#include "Version.h" #include "modplatform/flame/FlamePackIndex.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/widgets/ModFilterWidget.h" @@ -144,16 +145,6 @@ void FlamePage::triggerSearch() m_fetch_progress.watch(listModel->activeSearchJob().get()); } -bool checkMcVersions(std::list filter, QString value) -{ - for (auto mcVersion : filter) { - if (value == mcVersion.toString()) { - return true; - } - } - return filter.empty(); -} - bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptr filter) { if (!filter) @@ -161,7 +152,7 @@ bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, v.mcVersion)); // mcVersions} + checkMcVersions(filter->versions, { v.mcVersion })); // mcVersions} } void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index b53eea4ef..132150bd2 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -152,33 +152,26 @@ void ModpackListModel::performPaginatedSearch() return; } } // TODO: Move to standalone API + ResourceAPI::SortingMethod sort{}; + sort.name = currentSort; + auto searchUrl = ModrinthAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); - auto searchAllUrl = QString(BuildConfig.MODRINTH_PROD_URL + - "/search?" - "offset=%1&" - "limit=%2&" - "query=%3&" - "index=%4&" - "facets=[[\"project_type:modpack\"]]") - .arg(nextSearchOffset) - .arg(m_modpacks_per_page) - .arg(currentSearchTerm) - .arg(currentSort); - - netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchAllUrl), m_all_response)); + netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), m_allResponse)); QObject::connect(netJob.get(), &NetJob::succeeded, this, [this] { - QJsonParseError parse_error_all{}; + QJsonParseError parseError{}; - QJsonDocument doc_all = QJsonDocument::fromJson(*m_all_response, &parse_error_all); - if (parse_error_all.error != QJsonParseError::NoError) { - qWarning() << "Error while parsing JSON response from " << debugName() << " at " << parse_error_all.offset - << " reason: " << parse_error_all.errorString(); - qWarning() << *m_all_response; + QJsonDocument doc = QJsonDocument::fromJson(*m_allResponse, &parseError); + if (parseError.error != QJsonParseError::NoError) { + qWarning() << "Error while parsing JSON response from " << debugName() << " at " << parseError.offset + << " reason: " << parseError.errorString(); + qWarning() << *m_allResponse; return; } - searchRequestFinished(doc_all); + searchRequestFinished(doc); }); QObject::connect(netJob.get(), &NetJob::failed, this, &ModpackListModel::searchRequestFailed); @@ -220,19 +213,23 @@ static auto sortFromIndex(int index) -> QString } } -void ModpackListModel::searchWithTerm(const QString& term, const int sort) +void ModpackListModel::searchWithTerm(const QString& term, + const int sort, + std::shared_ptr filter, + bool filterChanged) { if (sort > 5 || sort < 0) return; auto sort_str = sortFromIndex(sort); - if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort_str) { + if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort_str && !filterChanged) { return; } currentSearchTerm = term; currentSort = sort_str; + m_filter = filter; refresh(); } diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 514ee4484..640ddf688 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -71,7 +71,7 @@ class ModpackListModel : public QAbstractListModel { /* Ask the API for more information */ void fetchMore(const QModelIndex& parent) override; void refresh(); - void searchWithTerm(const QString& term, int sort); + void searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } @@ -112,12 +112,13 @@ class ModpackListModel : public QAbstractListModel { QString currentSearchTerm; QString currentSort; + std::shared_ptr m_filter; int nextSearchOffset = 0; enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } searchState = None; Task::Ptr jobPtr; - std::shared_ptr m_all_response = std::make_shared(); + std::shared_ptr m_allResponse = std::make_shared(); QByteArray m_specific_response; int m_modpacks_per_page = 20; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index a000044fa..ff21e8c37 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -35,6 +35,8 @@ */ #include "ModrinthPage.h" +#include "Version.h" +#include "modplatform/modrinth/ModrinthAPI.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui_ModrinthPage.h" @@ -58,6 +60,7 @@ ModrinthPage::ModrinthPage(NewInstanceDialog* dialog, QWidget* parent) : QWidget(parent), ui(new Ui::ModrinthPage), dialog(dialog), m_fetch_progress(this, false) { ui->setupUi(this); + createFilterWidget(); ui->searchEdit->installEventFilter(this); m_model = new Modrinth::ModpackListModel(this); @@ -126,6 +129,16 @@ bool ModrinthPage::eventFilter(QObject* watched, QEvent* event) return QObject::eventFilter(watched, event); } +bool checkVersionFilters(const Modrinth::ModpackVersion& v, std::shared_ptr filter) +{ + if (!filter) + return true; + return ((!filter->loaders || !v.loaders || filter->loaders & v.loaders) && // loaders + (filter->releases.empty() || // releases + std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && + checkMcVersions(filter->versions, { v.gameVersion })); // gameVersion} +} + void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) { ui->versionSelectionBox->clear(); @@ -190,7 +203,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI } else updateUI(); - if (!current.versionsLoaded) { + if (!current.versionsLoaded || m_filterWidget->changed()) { qDebug() << "Loading modrinth modpack versions"; auto netJob = new NetJob(QString("Modrinth::PackVersions(%1)").arg(current.name), APPLICATION->network()); @@ -221,6 +234,16 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI qDebug() << *response; qWarning() << "Error while reading modrinth modpack version: " << e.cause(); } + auto pred = [this](const Modrinth::ModpackVersion& v) { return !checkVersionFilters(v, m_filterWidget->getFilter()); }; +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + current.versions.removeIf(pred); +#else + for (auto it = current.versions.begin(); it != current.versions.end();) + if (pred(*it)) + it = current.versions.erase(it); + else + ++it; +#endif for (auto version : current.versions) { auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : ""; auto mcVersion = !version.gameVersion.isEmpty() && !version.name.contains(version.gameVersion) @@ -338,7 +361,11 @@ void ModrinthPage::suggestCurrent() void ModrinthPage::triggerSearch() { - m_model->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex()); + ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect); + ui->packView->clearSelection(); + ui->packDescription->clear(); + ui->versionSelectionBox->clear(); + m_model->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex(), m_filterWidget->getFilter(), m_filterWidget->changed()); m_fetch_progress.watch(m_model->activeSearchJob().get()); } @@ -361,3 +388,25 @@ QString ModrinthPage::getSerachTerm() const { return ui->searchEdit->text(); } + +void ModrinthPage::createFilterWidget() +{ + auto widget = ModFilterWidget::create(nullptr, false, this); + m_filterWidget.swap(widget); + auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); + // because we replaced the widget we also need to delete it + if (old) { + delete old; + } + + connect(ui->filterButton, &QPushButton::clicked, this, [this] { m_filterWidget->setHidden(!m_filterWidget->isHidden()); }); + + connect(m_filterWidget.get(), &ModFilterWidget::filterChanged, this, &ModrinthPage::triggerSearch); + auto response = std::make_shared(); + m_categoriesTask = ModrinthAPI::getModCategories(response); + QObject::connect(m_categoriesTask.get(), &Task::succeeded, [this, response]() { + auto categories = ModrinthAPI::loadCategories(response, "modpack"); + m_filterWidget->setCategories(categories); + }); + m_categoriesTask->start(); +} \ No newline at end of file diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h index dd99e0d29..7f504cdbd 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h @@ -41,6 +41,7 @@ #include "modplatform/modrinth/ModrinthPackManifest.h" #include "ui/pages/modplatform/ModpackProviderBasePage.h" +#include "ui/widgets/ModFilterWidget.h" #include "ui/widgets/ProgressWidget.h" #include @@ -87,6 +88,7 @@ class ModrinthPage : public QWidget, public ModpackProviderBasePage { void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(int index); void triggerSearch(); + void createFilterWidget(); private: Ui::ModrinthPage* ui; @@ -100,4 +102,7 @@ class ModrinthPage : public QWidget, public ModpackProviderBasePage { // Used to do instant searching with a delay to cache quick changes QTimer m_search_timer; + + unique_qobject_ptr m_filterWidget; + Task::Ptr m_categoriesTask; }; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui index 7f4f903f6..ef44abb52 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui @@ -12,42 +12,59 @@ - - - Search and filter ... - - - - - + - - - Qt::ScrollBarAlwaysOff - - - true - - - - 48 - 48 - + + + Search and filter... - - - true - - - true + + + Filter + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + 48 + 48 + + + + + + true + + + true + + + + From cc0c9d208dc4b686a254138f71465199a895ee3a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:22:10 +0000 Subject: [PATCH 083/177] chore(deps): update actions/cache action to v4.1.0 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad77d282b..a659e162c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -169,7 +169,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.0.2 + uses: actions/cache@v4.1.0 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From f7bd76c7d4ce0d834f259e4d085b726e8117bd29 Mon Sep 17 00:00:00 2001 From: arnfaldur Date: Sat, 5 Oct 2024 17:58:53 +0000 Subject: [PATCH 084/177] flatpak: don't cleanup libGLU The mod AAA Particles (found in the modpack Prominence II RPG) fails to start due to a missing `libGLU.so.1` file. Removing this cleanup command fixes the issue and makes the modpack run without issue. I reproduced the issue at the head of the develop branch, with and without the change. No other issue was detected by adding the library, and I could not find the initial justification for removing it. Signed-off-by: arnfaldur --- flatpak/org.prismlauncher.PrismLauncher.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index bd09f7fd8..71e6dd11e 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -22,9 +22,6 @@ finish-args: # FTBApp import - --filesystem=~/.ftba:ro -cleanup: - - /lib/libGLU* - modules: # Might be needed by some Controller mods (see https://github.com/isXander/Controlify/issues/31) - shared-modules/libusb/libusb.json From 03294f0000eba56edc39cbd80cc53418a2429528 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 6 Oct 2024 00:24:57 +0000 Subject: [PATCH 085/177] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/1925c603f17fc89f4c8f6bf6f631a802ad85d784?narHash=sha256-J%2BPeFKSDV%2BpHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI%3D' (2024-09-26) → 'github:NixOS/nixpkgs/bc947f541ae55e999ffdb4013441347d83b00feb?narHash=sha256-NOiTvBbRLIOe5F6RbHaAh6%2B%2BBNjsb149fGZd1T4%2BKBg%3D' (2024-10-04) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 7667a8688..6897c162d 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1727348695, - "narHash": "sha256-J+PeFKSDV+pHL7ukkfpVzCOO7mBSrrpJ3svwBFABbhI=", + "lastModified": 1728018373, + "narHash": "sha256-NOiTvBbRLIOe5F6RbHaAh6++BNjsb149fGZd1T4+KBg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1925c603f17fc89f4c8f6bf6f631a802ad85d784", + "rev": "bc947f541ae55e999ffdb4013441347d83b00feb", "type": "github" }, "original": { From d5990cca4318121dea8d6b669abdada64944c88b Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 6 Oct 2024 13:51:36 +0100 Subject: [PATCH 086/177] Disable retry for private pack fetch This is already handled with a dialog asking whether you want it to be removed. Signed-off-by: TheKodeToad --- launcher/modplatform/legacy_ftb/PackFetchTask.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/modplatform/legacy_ftb/PackFetchTask.cpp b/launcher/modplatform/legacy_ftb/PackFetchTask.cpp index 8f1a6e2ff..a0beeddcc 100644 --- a/launcher/modplatform/legacy_ftb/PackFetchTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackFetchTask.cpp @@ -74,6 +74,7 @@ void PackFetchTask::fetchPrivate(const QStringList& toFetch) auto data = std::make_shared(); NetJob* job = new NetJob("Fetching private pack", m_network); job->addNetAction(Net::ApiDownload::makeByteArray(privatePackBaseUrl.arg(packCode), data)); + job->setAskRetry(false); QObject::connect(job, &NetJob::succeeded, this, [this, job, data, packCode] { ModpackList packs; From 6e5f616ced96acee9a9aad76193f82e6a0c2cd27 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 6 Oct 2024 23:33:24 +0300 Subject: [PATCH 087/177] move checkMcVersions to Filter struct Signed-off-by: Trial97 --- launcher/Version.cpp | 12 ------------ launcher/Version.h | 2 -- launcher/ui/pages/modplatform/ModModel.cpp | 2 +- launcher/ui/pages/modplatform/flame/FlamePage.cpp | 2 +- .../ui/pages/modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ModFilterWidget.h | 9 +++++++++ 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/launcher/Version.cpp b/launcher/Version.cpp index e43d9d3f7..2edb17e72 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -127,15 +127,3 @@ QDebug operator<<(QDebug debug, const Version& v) return debug; } - -bool checkMcVersions(std::list filter, QStringList value) -{ - bool valid = false; - for (auto mcVersion : filter) { - if (value.contains(mcVersion.toString())) { - valid = true; - break; - } - } - return filter.empty() || valid; -} diff --git a/launcher/Version.h b/launcher/Version.h index f596bfeba..b06e256aa 100644 --- a/launcher/Version.h +++ b/launcher/Version.h @@ -161,5 +161,3 @@ class Version { void parse(); }; - -bool checkMcVersions(std::list filter, QStringList value); diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index dfc308566..1f0329321 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -123,7 +123,7 @@ bool ModModel::checkVersionFilters(const ModPlatform::IndexedVersion& v) checkSide(m_filter->side, v.side) && // side (m_filter->releases.empty() || // releases std::find(m_filter->releases.cbegin(), m_filter->releases.cend(), v.version_type) != m_filter->releases.cend()) && - checkMcVersions(m_filter->versions, v.mcVersion)); // mcVersions + m_filter->checkMcVersions(v.mcVersion)); // mcVersions } } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index b92401988..9abf4a9c6 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -152,7 +152,7 @@ bool checkVersionFilters(const Flame::IndexedVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, { v.mcVersion })); // mcVersions} + filter->checkMcVersions({ v.mcVersion })); // mcVersions} } void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index ff21e8c37..2c19d54ad 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -136,7 +136,7 @@ bool checkVersionFilters(const Modrinth::ModpackVersion& v, std::shared_ptrloaders || !v.loaders || filter->loaders & v.loaders) && // loaders (filter->releases.empty() || // releases std::find(filter->releases.cbegin(), filter->releases.cend(), v.version_type) != filter->releases.cend()) && - checkMcVersions(filter->versions, { v.gameVersion })); // gameVersion} + filter->checkMcVersions({ v.gameVersion })); // gameVersion} } void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelIndex prev) diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h index fdfd2c8bb..50f0e06c9 100644 --- a/launcher/ui/widgets/ModFilterWidget.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -71,6 +71,15 @@ class ModFilterWidget : public QTabWidget { releases == other.releases && categoryIds == other.categoryIds; } bool operator!=(const Filter& other) const { return !(*this == other); } + + bool checkMcVersions(QStringList value) + { + for (auto mcVersion : versions) + if (value.contains(mcVersion.toString())) + return true; + + return versions.empty(); + } }; static unique_qobject_ptr create(MinecraftInstance* instance, bool extended, QWidget* parent = nullptr); From 5bd5627a9646361ccee2d96bb555de58072bc7ab Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 15:06:50 +0300 Subject: [PATCH 088/177] extended the modrinth search and applied the suggested change Signed-off-by: Trial97 --- .../modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ModFilterWidget.cpp | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 2c19d54ad..8803c6dd9 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -391,7 +391,7 @@ QString ModrinthPage::getSerachTerm() const void ModrinthPage::createFilterWidget() { - auto widget = ModFilterWidget::create(nullptr, false, this); + auto widget = ModFilterWidget::create(nullptr, true, this); m_filterWidget.swap(widget); auto old = ui->splitter->replaceWidget(0, m_filterWidget.get()); // because we replaced the widget we also need to delete it diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp index a048dbe10..68adcdb71 100644 --- a/launcher/ui/widgets/ModFilterWidget.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -64,6 +64,8 @@ class VersionBasicModel : public QIdentityProxyModel { { if (role == Qt::DisplayRole) return QIdentityProxyModel::data(index, BaseVersionList::VersionIdRole); + if (role == Qt::UserRole) + return QIdentityProxyModel::data(index, BaseVersionList::VersionIdRole); return {}; } }; @@ -86,6 +88,9 @@ class AllVersionProxyModel : public QSortFilterProxyModel { if (role == Qt::DisplayRole) { return tr("All Versions"); } + if (role == Qt::UserRole) { + return "all"; + } return {}; } @@ -113,17 +118,18 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWi QAbstractProxyModel* proxy = new VersionBasicModel(this); proxy->setSourceModel(m_versions_proxy); - if (!m_instance && !extended) { - auto allVersions = new AllVersionProxyModel(this); - allVersions->setSourceModel(proxy); - proxy = allVersions; - } - if (extended) { + if (!m_instance) { + ui->environmentGroup->hide(); + } ui->versions->setSourceModel(proxy); ui->versions->setSeparator(", "); + ui->versions->setDefaultText(tr("All Versions")); ui->version->hide(); } else { + auto allVersions = new AllVersionProxyModel(this); + allVersions->setSourceModel(proxy); + proxy = allVersions; ui->version->setModel(proxy); ui->versions->hide(); ui->showAllVersions->hide(); @@ -293,7 +299,7 @@ void ModFilterWidget::onHideInstalledFilterChanged() void ModFilterWidget::onVersionFilterTextChanged(const QString& version) { m_filter->versions.clear(); - if (version != tr("All Versions")) { + if (ui->version->currentData(Qt::UserRole) != "all") { m_filter->versions.emplace_back(version); } m_filter_changed = true; From df9f54454ac8cfe40fad525e64e6cc3578f26a77 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 19:19:03 +0300 Subject: [PATCH 089/177] removed static functions Signed-off-by: Trial97 --- launcher/modplatform/flame/FlameAPI.h | 3 +-- launcher/modplatform/modrinth/ModrinthAPI.h | 11 +++-------- launcher/ui/pages/modplatform/flame/FlameModel.cpp | 4 ++-- .../ui/pages/modplatform/modrinth/ModrinthModel.cpp | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h index 4abaff4ea..3ca0d5448 100644 --- a/launcher/modplatform/flame/FlameAPI.h +++ b/launcher/modplatform/flame/FlameAPI.h @@ -86,7 +86,7 @@ class FlameAPI : public NetworkResourceAPI { static const QString getModLoaderFilters(ModPlatform::ModLoaderTypes types) { return "[" + getModLoaderStrings(types).join(',') + "]"; } public: - static std::optional getStaticSearchURL(SearchArgs const& args) + [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { QStringList get_arguments; get_arguments.append(QString("classId=%1").arg(getClassId(args.type))); @@ -107,7 +107,6 @@ class FlameAPI : public NetworkResourceAPI { return "https://api.curseforge.com/v1/mods/search?gameId=432&" + get_arguments.join('&'); } - [[nodiscard]] std::optional getSearchURL(SearchArgs const& args) const override { return getStaticSearchURL(args); } private: [[nodiscard]] std::optional getInfoURL(QString const& id) const override diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h index b84d281aa..070f59dad 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.h +++ b/launcher/modplatform/modrinth/ModrinthAPI.h @@ -101,7 +101,7 @@ class ModrinthAPI : public NetworkResourceAPI { return ""; } - [[nodiscard]] static QString createFacets(SearchArgs const& args) + [[nodiscard]] QString createFacets(SearchArgs const& args) const { QStringList facets_list; @@ -123,7 +123,7 @@ class ModrinthAPI : public NetworkResourceAPI { } public: - static std::optional getStaticSearchURL(SearchArgs const& args) + [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override { if (args.loaders.has_value() && args.loaders.value() != 0) { if (!validateModLoaders(args.loaders.value())) { @@ -144,11 +144,6 @@ class ModrinthAPI : public NetworkResourceAPI { return BuildConfig.MODRINTH_PROD_URL + "/search?" + get_arguments.join('&'); }; - [[nodiscard]] inline auto getSearchURL(SearchArgs const& args) const -> std::optional override - { - return getStaticSearchURL(args); - } - inline auto getInfoURL(QString const& id) const -> std::optional override { return BuildConfig.MODRINTH_PROD_URL + "/project/" + id; @@ -171,7 +166,7 @@ class ModrinthAPI : public NetworkResourceAPI { .arg(BuildConfig.MODRINTH_PROD_URL, args.pack.addonId.toString(), get_arguments.isEmpty() ? "" : "?", get_arguments.join('&')); }; - static QString getGameVersionsArray(std::list mcVersions) + QString getGameVersionsArray(std::list mcVersions) const { QString s; for (auto& ver : mcVersions) { diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index 8383b756f..cfdb185ff 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -188,8 +188,8 @@ void ListModel::performPaginatedSearch() sort.index = currentSort + 1; auto netJob = makeShared("Flame::Search", APPLICATION->network()); - auto searchUrl = FlameAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + auto searchUrl = FlameAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), response)); jobPtr = netJob; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index 132150bd2..417ff4080 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -154,8 +154,8 @@ void ModpackListModel::performPaginatedSearch() } // TODO: Move to standalone API ResourceAPI::SortingMethod sort{}; sort.name = currentSort; - auto searchUrl = ModrinthAPI::getStaticSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, - m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); + auto searchUrl = ModrinthAPI().getSearchURL({ ModPlatform::ResourceType::MODPACK, nextSearchOffset, currentSearchTerm, sort, + m_filter->loaders, m_filter->versions, "", m_filter->categoryIds }); auto netJob = makeShared("Modrinth::SearchModpack", APPLICATION->network()); netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl.value()), m_allResponse)); From d31c947b36c907f59e82150f4fc60781d70185ab Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 8 Oct 2024 22:02:38 +0300 Subject: [PATCH 090/177] fix crash when no resorce version is available Signed-off-by: Trial97 --- launcher/ui/pages/modplatform/ResourcePage.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index bed118465..dea28d6d5 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -254,7 +254,10 @@ void ResourcePage::updateSelectionButton() m_ui->resourceSelectionButton->setEnabled(true); if (auto current_pack = getCurrentPack(); current_pack) { - if (!current_pack->isVersionSelected(m_selected_version_index)) + if (current_pack->versionsLoaded && current_pack->versions.empty()) { + m_ui->resourceSelectionButton->setEnabled(false); + qWarning() << tr("No version available for the selected pack"); + } else if (!current_pack->isVersionSelected(m_selected_version_index)) m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString())); else m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); From 093313e5914b3759bdb1147cd0fd1ff6627bdb31 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 07:14:47 +0000 Subject: [PATCH 091/177] chore(deps): update actions/cache action to v4.1.1 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5dc02edf3..dc45252fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.1.0 + uses: actions/cache@v4.1.1 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From 909114bf2ae1090e7c4d2d757645b413c71aaba1 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 9 Oct 2024 15:07:09 +0100 Subject: [PATCH 092/177] Change LaunchTask to only accept MinecraftInstance Signed-off-by: TheKodeToad --- launcher/launch/LaunchTask.cpp | 4 +-- launcher/launch/LaunchTask.h | 9 +++--- launcher/minecraft/launch/AutoInstallJava.cpp | 2 +- .../minecraft/launch/CreateGameFolders.cpp | 5 ++-- launcher/minecraft/launch/ExtractNatives.cpp | 9 +++--- .../minecraft/launch/LauncherPartLaunch.cpp | 29 +++++++++---------- launcher/minecraft/launch/ModMinecraftJar.cpp | 4 +-- .../minecraft/launch/ReconstructAssets.cpp | 5 ++-- launcher/minecraft/launch/ScanModFolders.cpp | 2 +- .../minecraft/launch/VerifyJavaInstall.cpp | 2 +- 10 files changed, 34 insertions(+), 37 deletions(-) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 4e4f5ead4..0251b302d 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -51,14 +51,14 @@ void LaunchTask::init() m_instance->setRunning(true); } -shared_qobject_ptr LaunchTask::create(InstancePtr inst) +shared_qobject_ptr LaunchTask::create(MinecraftInstancePtr inst) { shared_qobject_ptr proc(new LaunchTask(inst)); proc->init(); return proc; } -LaunchTask::LaunchTask(InstancePtr instance) : m_instance(instance) {} +LaunchTask::LaunchTask(MinecraftInstancePtr instance) : m_instance(instance) {} void LaunchTask::appendStep(shared_qobject_ptr step) { diff --git a/launcher/launch/LaunchTask.h b/launcher/launch/LaunchTask.h index 2fd8c78c7..56065af5b 100644 --- a/launcher/launch/LaunchTask.h +++ b/launcher/launch/LaunchTask.h @@ -37,6 +37,7 @@ #pragma once #include +#include #include #include "BaseInstance.h" #include "LaunchStep.h" @@ -46,21 +47,21 @@ class LaunchTask : public Task { Q_OBJECT protected: - explicit LaunchTask(InstancePtr instance); + explicit LaunchTask(MinecraftInstancePtr instance); void init(); public: enum State { NotStarted, Running, Waiting, Failed, Aborted, Finished }; public: /* methods */ - static shared_qobject_ptr create(InstancePtr inst); + static shared_qobject_ptr create(MinecraftInstancePtr inst); virtual ~LaunchTask() = default; void appendStep(shared_qobject_ptr step); void prependStep(shared_qobject_ptr step); void setCensorFilter(QMap filter); - InstancePtr instance() { return m_instance; } + MinecraftInstancePtr instance() { return m_instance; } void setPid(qint64 pid) { m_pid = pid; } @@ -115,7 +116,7 @@ class LaunchTask : public Task { void finalizeSteps(bool successful, const QString& error); protected: /* data */ - InstancePtr m_instance; + MinecraftInstancePtr m_instance; shared_qobject_ptr m_logModel; QList> m_steps; QMap m_censorFilter; diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 4fad6f15f..b23b23ed2 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -58,7 +58,7 @@ AutoInstallJava::AutoInstallJava(LaunchTask* parent) : LaunchStep(parent) - , m_instance(std::dynamic_pointer_cast(m_parent->instance())) + , m_instance(m_parent->instance()) , m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; void AutoInstallJava::executeTask() diff --git a/launcher/minecraft/launch/CreateGameFolders.cpp b/launcher/minecraft/launch/CreateGameFolders.cpp index 36f5e6407..07bdbb600 100644 --- a/launcher/minecraft/launch/CreateGameFolders.cpp +++ b/launcher/minecraft/launch/CreateGameFolders.cpp @@ -8,16 +8,15 @@ CreateGameFolders::CreateGameFolders(LaunchTask* parent) : LaunchStep(parent) {} void CreateGameFolders::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - if (!FS::ensureFolderPathExists(minecraftInstance->gameRoot())) { + if (!FS::ensureFolderPathExists(instance->gameRoot())) { emit logLine("Couldn't create the main game folder", MessageLevel::Error); emitFailed(tr("Couldn't create the main game folder")); return; } // HACK: this is a workaround for MCL-3732 - 'server-resource-packs' folder is created. - if (!FS::ensureFolderPathExists(FS::PathCombine(minecraftInstance->gameRoot(), "server-resource-packs"))) { + if (!FS::ensureFolderPathExists(FS::PathCombine(instance->gameRoot(), "server-resource-packs"))) { emit logLine("Couldn't create the 'server-resource-packs' folder", MessageLevel::Error); } emitSucceeded(); diff --git a/launcher/minecraft/launch/ExtractNatives.cpp b/launcher/minecraft/launch/ExtractNatives.cpp index 405008f40..afe091758 100644 --- a/launcher/minecraft/launch/ExtractNatives.cpp +++ b/launcher/minecraft/launch/ExtractNatives.cpp @@ -70,17 +70,16 @@ static bool unzipNatives(QString source, QString targetFolder, bool applyJnilibH void ExtractNatives::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - auto toExtract = minecraftInstance->getNativeJars(); + auto toExtract = instance->getNativeJars(); if (toExtract.isEmpty()) { emitSucceeded(); return; } - auto settings = minecraftInstance->settings(); + auto settings = instance->settings(); - auto outputPath = minecraftInstance->getNativePath(); + auto outputPath = instance->getNativePath(); FS::ensureFolderPathExists(outputPath); - auto javaVersion = minecraftInstance->getJavaVersion(); + auto javaVersion = instance->getJavaVersion(); bool jniHackEnabled = javaVersion.major() >= 8; for (const auto& source : toExtract) { if (!unzipNatives(source, outputPath, jniHackEnabled)) { diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index 2b932ae47..10c14a95f 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -50,16 +50,16 @@ LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) : LaunchStep(parent) { - auto instance = parent->instance(); - if (instance->settings()->get("CloseAfterLaunch").toBool()) { + if (parent->instance()->settings()->get("CloseAfterLaunch").toBool()) { std::shared_ptr connection{ new QMetaObject::Connection }; - *connection = connect(&m_process, &LoggedProcess::log, this, [=](QStringList lines, [[maybe_unused]] MessageLevel::Enum level) { - qDebug() << lines; - if (lines.filter(QRegularExpression(".*Setting user.+", QRegularExpression::CaseInsensitiveOption)).length() != 0) { - APPLICATION->closeAllWindows(); - disconnect(*connection); - } - }); + *connection = + connect(&m_process, &LoggedProcess::log, this, [=](const QStringList& lines, [[maybe_unused]] MessageLevel::Enum level) { + qDebug() << lines; + if (lines.filter(QRegularExpression(".*Setting user.+", QRegularExpression::CaseInsensitiveOption)).length() != 0) { + APPLICATION->closeAllWindows(); + disconnect(*connection); + } + }); } connect(&m_process, &LoggedProcess::log, this, &LauncherPartLaunch::logLines); @@ -77,10 +77,9 @@ void LauncherPartLaunch::executeTask() } auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); QString legacyJarPath; - if (minecraftInstance->getLauncher() == "legacy" || minecraftInstance->shouldApplyOnlineFixes()) { + if (instance->getLauncher() == "legacy" || instance->shouldApplyOnlineFixes()) { legacyJarPath = APPLICATION->getJarPath("NewLaunchLegacy.jar"); if (legacyJarPath.isEmpty()) { const char* reason = QT_TR_NOOP("Legacy launcher library could not be found. Please check your installation."); @@ -90,8 +89,8 @@ void LauncherPartLaunch::executeTask() } } - m_launchScript = minecraftInstance->createLaunchScript(m_session, m_targetToJoin); - QStringList args = minecraftInstance->javaArguments(); + m_launchScript = instance->createLaunchScript(m_session, m_targetToJoin); + QStringList args = instance->javaArguments(); QString allArgs = args.join(", "); emit logLine("Java Arguments:\n[" + m_parent->censorPrivateInfo(allArgs) + "]\n\n", MessageLevel::Launcher); @@ -102,13 +101,13 @@ void LauncherPartLaunch::executeTask() // make detachable - this will keep the process running even if the object is destroyed m_process.setDetachable(true); - auto classPath = minecraftInstance->getClassPath(); + auto classPath = instance->getClassPath(); classPath.prepend(jarPath); if (!legacyJarPath.isEmpty()) classPath.prepend(legacyJarPath); - auto natPath = minecraftInstance->getNativePath(); + auto natPath = instance->getNativePath(); #ifdef Q_OS_WIN natPath = FS::getPathNameInLocal8bit(natPath); #endif diff --git a/launcher/minecraft/launch/ModMinecraftJar.cpp b/launcher/minecraft/launch/ModMinecraftJar.cpp index 6e73333b1..e06080ba7 100644 --- a/launcher/minecraft/launch/ModMinecraftJar.cpp +++ b/launcher/minecraft/launch/ModMinecraftJar.cpp @@ -42,7 +42,7 @@ void ModMinecraftJar::executeTask() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); if (!m_inst->getJarMods().size()) { emitSucceeded(); @@ -82,7 +82,7 @@ void ModMinecraftJar::finalize() bool ModMinecraftJar::removeJar() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); auto finalJarPath = QDir(m_inst->binRoot()).absoluteFilePath("minecraft.jar"); QFile finalJar(finalJarPath); if (finalJar.exists()) { diff --git a/launcher/minecraft/launch/ReconstructAssets.cpp b/launcher/minecraft/launch/ReconstructAssets.cpp index 843ccc554..21ae395f0 100644 --- a/launcher/minecraft/launch/ReconstructAssets.cpp +++ b/launcher/minecraft/launch/ReconstructAssets.cpp @@ -22,12 +22,11 @@ void ReconstructAssets::executeTask() { auto instance = m_parent->instance(); - std::shared_ptr minecraftInstance = std::dynamic_pointer_cast(instance); - auto components = minecraftInstance->getPackProfile(); + auto components = instance->getPackProfile(); auto profile = components->getProfile(); auto assets = profile->getMinecraftAssets(); - if (!AssetsUtils::reconstructAssets(assets->id, minecraftInstance->resourcesDir())) { + if (!AssetsUtils::reconstructAssets(assets->id, instance->resourcesDir())) { emit logLine("Failed to reconstruct Minecraft assets.", MessageLevel::Error); } diff --git a/launcher/minecraft/launch/ScanModFolders.cpp b/launcher/minecraft/launch/ScanModFolders.cpp index 7e08a4e36..1a2ddf194 100644 --- a/launcher/minecraft/launch/ScanModFolders.cpp +++ b/launcher/minecraft/launch/ScanModFolders.cpp @@ -42,7 +42,7 @@ void ScanModFolders::executeTask() { - auto m_inst = std::dynamic_pointer_cast(m_parent->instance()); + auto m_inst = m_parent->instance(); auto loaders = m_inst->loaderModList(); connect(loaders.get(), &ModFolderModel::updateFinished, this, &ScanModFolders::modsDone); diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 1e7448089..bc950d673 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -46,7 +46,7 @@ void VerifyJavaInstall::executeTask() { - auto instance = std::dynamic_pointer_cast(m_parent->instance()); + auto instance = m_parent->instance(); auto packProfile = instance->getPackProfile(); auto settings = instance->settings(); auto storedVersion = settings->get("JavaVersion").toString(); From 98adcc60a30a95a86b564ebe69bb0ad276263424 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 9 Oct 2024 16:59:56 +0100 Subject: [PATCH 093/177] Use UTF-8 to decode logs on Java 18 or newer Signed-off-by: TheKodeToad --- launcher/LoggedProcess.cpp | 3 ++- launcher/LoggedProcess.h | 6 +++--- launcher/java/JavaVersion.cpp | 6 ++++++ launcher/java/JavaVersion.h | 2 +- launcher/minecraft/launch/LauncherPartLaunch.cpp | 4 +++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/launcher/LoggedProcess.cpp b/launcher/LoggedProcess.cpp index fadd64e68..35ce4e0e5 100644 --- a/launcher/LoggedProcess.cpp +++ b/launcher/LoggedProcess.cpp @@ -39,7 +39,8 @@ #include #include "MessageLevel.h" -LoggedProcess::LoggedProcess(QObject* parent) : QProcess(parent) +LoggedProcess::LoggedProcess(const QTextCodec* output_codec, QObject* parent) + : QProcess(parent), m_err_decoder(output_codec), m_out_decoder(output_codec) { // QProcess has a strange interface... let's map a lot of those into a few. connect(this, &QProcess::readyReadStandardOutput, this, &LoggedProcess::on_stdOut); diff --git a/launcher/LoggedProcess.h b/launcher/LoggedProcess.h index 46bdaa830..75ba15dfd 100644 --- a/launcher/LoggedProcess.h +++ b/launcher/LoggedProcess.h @@ -49,7 +49,7 @@ class LoggedProcess : public QProcess { enum State { NotRunning, Starting, FailedToStart, Running, Finished, Crashed, Aborted }; public: - explicit LoggedProcess(QObject* parent = 0); + explicit LoggedProcess(const QTextCodec* output_codec = QTextCodec::codecForLocale(), QObject* parent = 0); virtual ~LoggedProcess(); State state() const; @@ -80,8 +80,8 @@ class LoggedProcess : public QProcess { QStringList reprocess(const QByteArray& data, QTextDecoder& decoder); private: - QTextDecoder m_err_decoder = QTextDecoder(QTextCodec::codecForLocale()); - QTextDecoder m_out_decoder = QTextDecoder(QTextCodec::codecForLocale()); + QTextDecoder m_err_decoder; + QTextDecoder m_out_decoder; QString m_leftover_line; bool m_killed = false; State m_state = NotRunning; diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index 5e9700012..bca50f2c9 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -48,6 +48,12 @@ bool JavaVersion::requiresPermGen() const return !m_parseable || m_major < 8; } +bool JavaVersion::defaultsToUtf8() const +{ + // starting from Java 18, UTF-8 is the default charset: https://openjdk.org/jeps/400 + return m_parseable && m_major >= 18; +} + bool JavaVersion::isModular() const { return m_parseable && m_major >= 9; diff --git a/launcher/java/JavaVersion.h b/launcher/java/JavaVersion.h index dfb4770da..c070bdeec 100644 --- a/launcher/java/JavaVersion.h +++ b/launcher/java/JavaVersion.h @@ -25,7 +25,7 @@ class JavaVersion { bool operator>(const JavaVersion& rhs); bool requiresPermGen() const; - + bool defaultsToUtf8() const; bool isModular() const; QString toString() const; diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index 10c14a95f..d9a2b9b6b 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -48,7 +48,9 @@ #include "gamemode_client.h" #endif -LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) : LaunchStep(parent) +LauncherPartLaunch::LauncherPartLaunch(LaunchTask* parent) + : LaunchStep(parent) + , m_process(parent->instance()->getJavaVersion().defaultsToUtf8() ? QTextCodec::codecForName("UTF-8") : QTextCodec::codecForLocale()) { if (parent->instance()->settings()->get("CloseAfterLaunch").toBool()) { std::shared_ptr connection{ new QMetaObject::Connection }; From 2bc6ae97568f9c9e522c4a64988cb325eb4d25ec Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 11 Oct 2024 19:53:28 +0100 Subject: [PATCH 094/177] Prevent directories from being removed on instance update Signed-off-by: TheKodeToad --- launcher/InstanceCreationTask.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index 9c17dfc9f..d89a00d6c 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -42,11 +42,11 @@ void InstanceCreationTask::executeTask() setStatus(tr("Removing old conflicting files...")); qDebug() << "Removing old files"; - for (auto path : m_files_to_remove) { + for (const QString& path : m_files_to_remove) { if (!QFile::exists(path)) continue; qDebug() << "Removing" << path; - if (!FS::deletePath(path)) { + if (!QFile::remove(path)) { qCritical() << "Couldn't remove the old conflicting files."; emitFailed(tr("Failed to remove old conflicting files.")); return; @@ -55,5 +55,4 @@ void InstanceCreationTask::executeTask() } emitSucceeded(); - return; } From 09c9da268fdc833304f6159735cfb7e80d0e69bc Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Oct 2024 13:26:20 -0700 Subject: [PATCH 095/177] fix: prevent inf recursion when mod icon load fails; cut max pixmapcache to 1/4 previous value Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/MTPixmapCache.h | 6 +-- launcher/minecraft/mod/Mod.cpp | 41 +++++++++++-------- launcher/minecraft/mod/Mod.h | 8 ++-- .../minecraft/mod/tasks/LocalModParseTask.cpp | 41 ++++++++++--------- .../minecraft/mod/tasks/LocalModParseTask.h | 4 +- 5 files changed, 55 insertions(+), 45 deletions(-) diff --git a/launcher/MTPixmapCache.h b/launcher/MTPixmapCache.h index b6bd13045..0ba9c5ac8 100644 --- a/launcher/MTPixmapCache.h +++ b/launcher/MTPixmapCache.h @@ -101,7 +101,7 @@ class PixmapCache final : public QObject { */ bool _markCacheMissByEviciton() { - static constexpr uint maxInt = static_cast(std::numeric_limits::max()); + static constexpr uint maxCache = static_cast(std::numeric_limits::max()) / 4; static constexpr uint step = 10240; static constexpr int oneSecond = 1000; @@ -118,8 +118,8 @@ class PixmapCache final : public QObject { if (m_consecutive_fast_evicitons >= m_consecutive_fast_evicitons_threshold) { // increase the cache size uint newSize = _cacheLimit() + step; - if (newSize >= maxInt) { // increase it until you overflow :D - newSize = maxInt; + if (newSize >= maxCache) { // increase it until you overflow :D + newSize = maxCache; qDebug() << m_consecutive_fast_evicitons << tr("pixmap cache misses by eviction happened too fast, doing nothing as the cache size reached it's limit"); } else { diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp index 5442df7fe..9663026cd 100644 --- a/launcher/minecraft/mod/Mod.cpp +++ b/launcher/minecraft/mod/Mod.cpp @@ -36,6 +36,7 @@ */ #include "Mod.h" +#include #include #include @@ -241,7 +242,7 @@ void Mod::finishResolvingWithDetails(ModDetails&& details) if (metadata) setMetadata(std::move(metadata)); if (!iconPath().isEmpty()) { - m_pack_image_cache_key.was_read_attempt = false; + m_packImageCacheKey.wasReadAttempt = false; } } @@ -290,45 +291,53 @@ auto Mod::issueTracker() const -> QString return details().issue_tracker; } -void Mod::setIcon(QImage new_image) const +QPixmap Mod::setIcon(QImage new_image) const { QMutexLocker locker(&m_data_lock); Q_ASSERT(!new_image.isNull()); - if (m_pack_image_cache_key.key.isValid()) - PixmapCache::remove(m_pack_image_cache_key.key); + if (m_packImageCacheKey.key.isValid()) + PixmapCache::remove(m_packImageCacheKey.key); // scale the image to avoid flooding the pixmapcache auto pixmap = QPixmap::fromImage(new_image.scaled({ 64, 64 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); - m_pack_image_cache_key.key = PixmapCache::insert(pixmap); - m_pack_image_cache_key.was_ever_used = true; - m_pack_image_cache_key.was_read_attempt = true; + m_packImageCacheKey.key = PixmapCache::insert(pixmap); + m_packImageCacheKey.wasEverUsed = true; + m_packImageCacheKey.wasReadAttempt = true; + return pixmap; } QPixmap Mod::icon(QSize size, Qt::AspectRatioMode mode) const { - QPixmap cached_image; - if (PixmapCache::find(m_pack_image_cache_key.key, &cached_image)) { + auto pixmap_transform = [&size, &mode](QPixmap pixmap) { if (size.isNull()) - return cached_image; - return cached_image.scaled(size, mode, Qt::SmoothTransformation); + return pixmap; + return pixmap.scaled(size, mode, Qt::SmoothTransformation); + }; + + QPixmap cached_image; + if (PixmapCache::find(m_packImageCacheKey.key, &cached_image)) { + return pixmap_transform(cached_image); } // No valid image we can get - if ((!m_pack_image_cache_key.was_ever_used && m_pack_image_cache_key.was_read_attempt) || iconPath().isEmpty()) + if ((!m_packImageCacheKey.wasEverUsed && m_packImageCacheKey.wasReadAttempt) || iconPath().isEmpty()) return {}; - if (m_pack_image_cache_key.was_ever_used) { + if (m_packImageCacheKey.wasEverUsed) { qDebug() << "Mod" << name() << "Had it's icon evicted from the cache. reloading..."; PixmapCache::markCacheMissByEviciton(); } // Image got evicted from the cache or an attempt to load it has not been made. load it and retry. - m_pack_image_cache_key.was_read_attempt = true; - ModUtils::loadIconFile(*this); - return icon(size); + m_packImageCacheKey.wasReadAttempt = true; + if (ModUtils::loadIconFile(*this, &cached_image)) { + return pixmap_transform(cached_image); + } + // Image failed to load + return {}; } bool Mod::valid() const diff --git a/launcher/minecraft/mod/Mod.h b/launcher/minecraft/mod/Mod.h index 9bd76c2fd..a0d9797ed 100644 --- a/launcher/minecraft/mod/Mod.h +++ b/launcher/minecraft/mod/Mod.h @@ -82,7 +82,7 @@ class Mod : public Resource { /** Gets the icon of the mod, converted to a QPixmap for drawing, and scaled to size. */ [[nodiscard]] QPixmap icon(QSize size, Qt::AspectRatioMode mode = Qt::AspectRatioMode::IgnoreAspectRatio) const; /** Thread-safe. */ - void setIcon(QImage new_image) const; + QPixmap setIcon(QImage new_image) const; auto metadata() -> std::shared_ptr; auto metadata() const -> const std::shared_ptr; @@ -111,7 +111,7 @@ class Mod : public Resource { struct { QPixmapCache::Key key; - bool was_ever_used = false; - bool was_read_attempt = false; - } mutable m_pack_image_cache_key; + bool wasEverUsed = false; + bool wasReadAttempt = false; + } mutable m_packImageCacheKey; }; diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index 60257ce0c..d456211f8 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -647,11 +647,11 @@ bool validate(QFileInfo file) return ModUtils::process(mod, ProcessingLevel::BasicInfoOnly) && mod.valid(); } -bool processIconPNG(const Mod& mod, QByteArray&& raw_data) +bool processIconPNG(const Mod& mod, QByteArray&& raw_data, QPixmap* pixmap) { auto img = QImage::fromData(raw_data); if (!img.isNull()) { - mod.setIcon(img); + *pixmap = mod.setIcon(img); } else { qWarning() << "Failed to parse mod logo:" << mod.iconPath() << "from" << mod.name(); return false; @@ -659,15 +659,15 @@ bool processIconPNG(const Mod& mod, QByteArray&& raw_data) return true; } -bool loadIconFile(const Mod& mod) +bool loadIconFile(const Mod& mod, QPixmap* pixmap) { if (mod.iconPath().isEmpty()) { qWarning() << "No Iconfile set, be sure to parse the mod first"; return false; } - auto png_invalid = [&mod]() { - qWarning() << "Mod at" << mod.fileinfo().filePath() << "does not have a valid icon"; + auto png_invalid = [&mod](const QString& reason) { + qWarning() << "Mod at" << mod.fileinfo().filePath() << "does not have a valid icon:" << reason; return false; }; @@ -676,24 +676,26 @@ bool loadIconFile(const Mod& mod) QFileInfo icon_info(FS::PathCombine(mod.fileinfo().filePath(), mod.iconPath())); if (icon_info.exists() && icon_info.isFile()) { QFile icon(icon_info.filePath()); - if (!icon.open(QIODevice::ReadOnly)) - return false; + if (!icon.open(QIODevice::ReadOnly)) { + return png_invalid("failed to open file " + icon_info.filePath()); + } auto data = icon.readAll(); - bool icon_result = ModUtils::processIconPNG(mod, std::move(data)); + bool icon_result = ModUtils::processIconPNG(mod, std::move(data), pixmap); icon.close(); if (!icon_result) { - return png_invalid(); // icon invalid + return png_invalid("invalid png image"); // icon invalid } + return true; } - return false; + return png_invalid("file '" + icon_info.filePath() + "' does not exists or is not a file"); } case ResourceType::ZIPFILE: { QuaZip zip(mod.fileinfo().filePath()); if (!zip.open(QuaZip::mdUnzip)) - return false; + return png_invalid("failed to open '" + mod.fileinfo().filePath() + "' as a zip archive"); QuaZipFile file(&zip); @@ -701,28 +703,27 @@ bool loadIconFile(const Mod& mod) if (!file.open(QIODevice::ReadOnly)) { qCritical() << "Failed to open file in zip."; zip.close(); - return png_invalid(); + return png_invalid("Failed to open '" + mod.iconPath() + "' in zip archive"); } auto data = file.readAll(); - bool icon_result = ModUtils::processIconPNG(mod, std::move(data)); + bool icon_result = ModUtils::processIconPNG(mod, std::move(data), pixmap); file.close(); if (!icon_result) { - return png_invalid(); // icon png invalid + return png_invalid("invalid png image"); // icon png invalid } - } else { - return png_invalid(); // could not set icon as current file. + return true; } - return false; + return png_invalid("Failed to set '" + mod.iconPath() + + "' as current file in zip archive"); // could not set icon as current file. } case ResourceType::LITEMOD: { - return false; // can lightmods even have icons? + return png_invalid("litemods do not have icons"); // can lightmods even have icons? } default: - qWarning() << "Invalid type for mod, can not load icon."; - return false; + return png_invalid("Invalid type for mod, can not load icon."); } } diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.h b/launcher/minecraft/mod/tasks/LocalModParseTask.h index a03217093..91ee6f253 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.h @@ -26,8 +26,8 @@ bool processLitemod(Mod& mod, ProcessingLevel level = ProcessingLevel::Full); /** Checks whether a file is valid as a mod or not. */ bool validate(QFileInfo file); -bool processIconPNG(const Mod& mod, QByteArray&& raw_data); -bool loadIconFile(const Mod& mod); +bool processIconPNG(const Mod& mod, QByteArray&& raw_data, QPixmap* pixmap); +bool loadIconFile(const Mod& mod, QPixmap* pixmap); } // namespace ModUtils class LocalModParseTask : public Task { From 72cfad8fee7f81d85df7389ab9e32294d13a4707 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 11 Oct 2024 21:35:13 +0100 Subject: [PATCH 096/177] Continue deleting before failing Signed-off-by: TheKodeToad --- launcher/InstanceCreationTask.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index d89a00d6c..3e7b3142f 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -38,6 +38,8 @@ void InstanceCreationTask::executeTask() // files scheduled to, and we'd better not let the user abort in the middle of it, since it'd // put the instance in an invalid state. if (shouldOverride()) { + bool deleteFailed = false; + setAbortable(false); setStatus(tr("Removing old conflicting files...")); qDebug() << "Removing old files"; @@ -45,13 +47,19 @@ void InstanceCreationTask::executeTask() for (const QString& path : m_files_to_remove) { if (!QFile::exists(path)) continue; + qDebug() << "Removing" << path; + if (!QFile::remove(path)) { - qCritical() << "Couldn't remove the old conflicting files."; - emitFailed(tr("Failed to remove old conflicting files.")); - return; + qCritical() << "Could not remove" << path; + deleteFailed = true; } } + + if (deleteFailed) { + emitFailed(tr("Failed to remove old conflicting files.")); + return; + } } emitSucceeded(); From 97f4ead0fbec5508f7ff6785f07dcf869ed663c2 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 12 Oct 2024 00:19:54 +0300 Subject: [PATCH 097/177] remove client overrides instead of double deleting the normal ones Signed-off-by: Trial97 --- launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index ba97c441f..3442fd19c 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -136,7 +136,7 @@ bool ModrinthCreationTask::updateInstance() } auto old_client_overrides = Override::readOverrides("client-overrides", old_index_folder); - for (const auto& entry : old_overrides) { + for (const auto& entry : old_client_overrides) { if (entry.isEmpty()) continue; qDebug() << "Scheduling" << entry << "for removal"; From 3a1c06de027ab2755c2a27624f41cbd445a156b4 Mon Sep 17 00:00:00 2001 From: Mia Moir <63592337+archessmn@users.noreply.github.com> Date: Sat, 12 Oct 2024 23:47:58 +0100 Subject: [PATCH 098/177] fix: Tab order on custom command inputs The tab order on the custom command UI in the instance settings is off, it goes 0 -> 2 -> 1, This re-orders the ui file to fix the order the inputs are in. Signed-off-by: Mia Moir <63592337+archessmn@users.noreply.github.com> --- launcher/ui/widgets/CustomCommands.ui | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/launcher/ui/widgets/CustomCommands.ui b/launcher/ui/widgets/CustomCommands.ui index 4a39ff7f7..b485c293e 100644 --- a/launcher/ui/widgets/CustomCommands.ui +++ b/launcher/ui/widgets/CustomCommands.ui @@ -38,19 +38,6 @@ false - - - - P&ost-exit command: - - - postExitCmdTextBox - - - - - - @@ -61,8 +48,8 @@ - - + + @@ -77,6 +64,19 @@ + + + + P&ost-exit command: + + + postExitCmdTextBox + + + + + + From 3c836ece71c61c19eacd7bb4f324940071c6e89a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Oct 2024 00:24:52 +0000 Subject: [PATCH 099/177] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/bc947f541ae55e999ffdb4013441347d83b00feb?narHash=sha256-NOiTvBbRLIOe5F6RbHaAh6%2B%2BBNjsb149fGZd1T4%2BKBg%3D' (2024-10-04) → 'github:NixOS/nixpkgs/5633bcff0c6162b9e4b5f1264264611e950c8ec7?narHash=sha256-9UTxR8eukdg%2BXZeHgxW5hQA9fIKHsKCdOIUycTryeVw%3D' (2024-10-09) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 6897c162d..7bf13f75c 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728018373, - "narHash": "sha256-NOiTvBbRLIOe5F6RbHaAh6++BNjsb149fGZd1T4+KBg=", + "lastModified": 1728492678, + "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bc947f541ae55e999ffdb4013441347d83b00feb", + "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", "type": "github" }, "original": { From a108b5b420b7d2785c9850d4a0bcb9c628d073a4 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:32:12 -0700 Subject: [PATCH 100/177] fix: ensure all connections to the ProgressDialogs's Task the dialog made are dissconnected Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/ProgressDialog.cpp | 21 ++++++++++++--------- launcher/ui/dialogs/ProgressDialog.h | 2 ++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/launcher/ui/dialogs/ProgressDialog.cpp b/launcher/ui/dialogs/ProgressDialog.cpp index 0ca3a1bd9..9897687e3 100644 --- a/launcher/ui/dialogs/ProgressDialog.cpp +++ b/launcher/ui/dialogs/ProgressDialog.cpp @@ -90,6 +90,9 @@ void ProgressDialog::on_skipButton_clicked(bool checked) ProgressDialog::~ProgressDialog() { + for (auto conn : this->m_taskConnections) { + disconnect(conn); + } delete ui; } @@ -140,15 +143,15 @@ int ProgressDialog::execWithTask(Task* task) } // Connect signals. - connect(task, &Task::started, this, &ProgressDialog::onTaskStarted); - connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed); - connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded); - connect(task, &Task::status, this, &ProgressDialog::changeStatus); - connect(task, &Task::details, this, &ProgressDialog::changeStatus); - connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress); - connect(task, &Task::progress, this, &ProgressDialog::changeProgress); - connect(task, &Task::aborted, this, &ProgressDialog::hide); - connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled); + this->m_taskConnections.push_back(connect(task, &Task::started, this, &ProgressDialog::onTaskStarted)); + this->m_taskConnections.push_back(connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed)); + this->m_taskConnections.push_back(connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded)); + this->m_taskConnections.push_back(connect(task, &Task::status, this, &ProgressDialog::changeStatus)); + this->m_taskConnections.push_back(connect(task, &Task::details, this, &ProgressDialog::changeStatus)); + this->m_taskConnections.push_back(connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress)); + this->m_taskConnections.push_back(connect(task, &Task::progress, this, &ProgressDialog::changeProgress)); + this->m_taskConnections.push_back(connect(task, &Task::aborted, this, &ProgressDialog::hide)); + this->m_taskConnections.push_back(connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled)); m_is_multi_step = task->isMultiStep(); ui->taskProgressScrollArea->setHidden(!m_is_multi_step); diff --git a/launcher/ui/dialogs/ProgressDialog.h b/launcher/ui/dialogs/ProgressDialog.h index 15eadf4e7..4a696a49d 100644 --- a/launcher/ui/dialogs/ProgressDialog.h +++ b/launcher/ui/dialogs/ProgressDialog.h @@ -93,6 +93,8 @@ class ProgressDialog : public QDialog { Ui::ProgressDialog* ui; Task* m_task; + + QList m_taskConnections; bool m_is_multi_step = false; QHash taskProgress; From ac13579b9963a312b909e712c372cb115f21f0db Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 14 Oct 2024 11:10:54 +0300 Subject: [PATCH 101/177] fix heap-use-after-free in modrinth creation task Signed-off-by: Trial97 --- .../modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 3442fd19c..994dd774f 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -301,6 +301,13 @@ bool ModrinthCreationTask::createInstance() loop.exec(); + if (!ended_well) { + for (auto m : mods) { + delete m; + } + return ended_well; + } + QEventLoop ensureMetaLoop; QDir folder = FS::PathCombine(instance.modsRoot(), ".index"); auto ensureMetadataTask = makeShared(mods, folder, ModPlatform::ResourceProvider::MODRINTH); From 7519c63f2e8a5ebc9480a470a1e7702436178c51 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 01:11:27 +0300 Subject: [PATCH 102/177] Replace http with https on skins Signed-off-by: Trial97 --- launcher/minecraft/auth/Parsers.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/auth/Parsers.cpp b/launcher/minecraft/auth/Parsers.cpp index 3aa458ace..f9d89baa2 100644 --- a/launcher/minecraft/auth/Parsers.cpp +++ b/launcher/minecraft/auth/Parsers.cpp @@ -180,6 +180,7 @@ bool parseMinecraftProfile(QByteArray& data, MinecraftProfile& output) if (!getString(skinObj.value("url"), skinOut.url)) { continue; } + skinOut.url.replace("http://textures.minecraft.net", "https://textures.minecraft.net"); if (!getString(skinObj.value("variant"), skinOut.variant)) { continue; } @@ -221,9 +222,9 @@ namespace { // these skin URLs are for the MHF_Steve and MHF_Alex accounts (made by a Mojang employee) // they are needed because the session server doesn't return skin urls for default skins static const QString SKIN_URL_STEVE = - "http://textures.minecraft.net/texture/1a4af718455d4aab528e7a61f86fa25e6a369d1768dcb13f7df319a713eb810b"; + "https://textures.minecraft.net/texture/1a4af718455d4aab528e7a61f86fa25e6a369d1768dcb13f7df319a713eb810b"; static const QString SKIN_URL_ALEX = - "http://textures.minecraft.net/texture/83cee5ca6afcdb171285aa00e8049c297b2dbeba0efb8ff970a5677a1b644032"; + "https://textures.minecraft.net/texture/83cee5ca6afcdb171285aa00e8049c297b2dbeba0efb8ff970a5677a1b644032"; bool isDefaultModelSteve(QString uuid) { From 522d105dbe50d6392e1d74dd9f1dec2a3ef7a357 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 11:59:32 -0400 Subject: [PATCH 103/177] fix(nix): enable checks Signed-off-by: seth --- nix/unwrapped.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index f75acf1de..7fc383ff3 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -87,6 +87,8 @@ stdenv.mkDerivation { (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}/Applications/") ]; + doCheck = true; + dontWrapQtApps = true; meta = { From 0bae14999f8e4997be96a8fadb4e4ed14dfd5b40 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 12:33:40 -0400 Subject: [PATCH 104/177] chore(flatpak): don't bundle JREs After https://github.com/PrismLauncher/PrismLauncher/pull/2069, JREs can be managed at runtime. This is great for the Flatpak, as previously *all* JREs had to be installed and could not be updated independently of the launcher's Flatpak. It also makes using unsupported Java versions easier as the launcher can download any version in the sandbox We don't need to include these anymore Signed-off-by: seth --- flatpak/org.prismlauncher.PrismLauncher.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index 71e6dd11e..f33432d23 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -3,9 +3,7 @@ runtime: org.kde.Platform runtime-version: 6.7 sdk: org.kde.Sdk sdk-extensions: - - org.freedesktop.Sdk.Extension.openjdk21 - org.freedesktop.Sdk.Extension.openjdk17 - - org.freedesktop.Sdk.Extension.openjdk8 command: prismlauncher finish-args: @@ -43,19 +41,6 @@ modules: - type: dir path: ../ - - name: openjdk - buildsystem: simple - build-commands: - - mkdir -p /app/jdk/ - - /usr/lib/sdk/openjdk21/install.sh - - mv /app/jre /app/jdk/21 - - /usr/lib/sdk/openjdk17/install.sh - - mv /app/jre /app/jdk/17 - - /usr/lib/sdk/openjdk8/install.sh - - mv /app/jre /app/jdk/8 - cleanup: - - /jre - - name: glfw buildsystem: cmake-ninja config-opts: From 01721b593b16bbbf9cd15c4f262176d0345681f8 Mon Sep 17 00:00:00 2001 From: seth Date: Sat, 19 Oct 2024 12:38:17 -0400 Subject: [PATCH 105/177] fix(flatpak): run tests for launcher Signed-off-by: seth --- flatpak/org.prismlauncher.PrismLauncher.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index f33432d23..09dd8d73b 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -37,6 +37,7 @@ modules: env: JAVA_HOME: /usr/lib/sdk/openjdk17/jvm/openjdk-17 JAVA_COMPILER: /usr/lib/sdk/openjdk17/jvm/openjdk-17/bin/javac + run-tests: true sources: - type: dir path: ../ From 2030041fcc14aa9d56f59e0a61c8a26ba6522a0f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 01:10:04 +0300 Subject: [PATCH 106/177] Fix tests segfault Signed-off-by: Trial97 --- CMakeLists.txt | 12 +++++------ launcher/Application.h | 6 ++++++ launcher/CMakeLists.txt | 10 +++------- .../minecraft/mod/ResourceFolderModel.cpp | 7 +++---- launcher/net/NetJob.cpp | 5 +++-- .../ui/pages/modplatform/ResourceModel.cpp | 20 +++++++++++-------- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d70fe79b..4c1ad3373 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ if ((CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebI message(STATUS "Address Sanitizer enabled for Debug builds, Turn it off with -DDEBUG_ADDRESS_SANITIZER=off") if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") - # using clang with clang-cl front end + # using clang with clang-cl front end message(STATUS "Address Sanitizer available on Clang MSVC frontend") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /Oy-") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address /Oy-") @@ -225,7 +225,7 @@ set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build agains # Java downloader set(Launcher_ENABLE_JAVA_DOWNLOADER_DEFAULT ON) -# Although we recommend enabling this, we cannot guarantee binary compatibility on +# Although we recommend enabling this, we cannot guarantee binary compatibility on # differing Linux/BSD/etc distributions. Downstream packagers should be explicitly opt-ing into this # feature if they know it will work with their distribution. if(UNIX AND NOT APPLE) @@ -438,10 +438,10 @@ elseif(UNIX) set(PLUGIN_DEST_DIR "plugins") set(BUNDLE_DEST_DIR ".") set(RESOURCES_DEST_DIR ".") - + # Apps to bundle set(APPS "\${CMAKE_INSTALL_PREFIX}/bin/${Launcher_APP_BINARY_NAME}") - + # directories to look for dependencies set(DIRS ${QT_LIBS_DIR} ${QT_LIBEXECS_DIR} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif() @@ -495,7 +495,7 @@ if(FORCE_BUNDLED_ZLIB) set(SKIP_INSTALL_ALL ON) add_subdirectory(libraries/zlib EXCLUDE_FROM_ALL) - # On OS where unistd.h exists, zlib's generated header defines `Z_HAVE_UNISTD_H`, while the included header does not. + # On OS where unistd.h exists, zlib's generated header defines `Z_HAVE_UNISTD_H`, while the included header does not. # We cannot safely undo the rename on those systems, and they generally have packages for zlib anyway. check_include_file(unistd.h NEED_GENERATED_ZCONF) if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib/zconf.h.included" AND NOT NEED_GENERATED_ZCONF) @@ -533,7 +533,7 @@ endif() if(NOT cmark_FOUND) message(STATUS "Using bundled cmark") set(BUILD_TESTING 0) - set(BUILD_SHARED_LIBS 0) + set(BUILD_SHARED_LIBS 0) add_subdirectory(libraries/cmark EXCLUDE_FROM_ALL) # Markdown parser add_library(cmark::cmark ALIAS cmark) else() diff --git a/launcher/Application.h b/launcher/Application.h index 7432c9683..bd1cb2dea 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -81,6 +81,12 @@ class Index; #endif #define APPLICATION (static_cast(QCoreApplication::instance())) +// Used for checking if is a test +#if defined(APPLICATION_DYN) +#undef APPLICATION_DYN +#endif +#define APPLICATION_DYN (dynamic_cast(QCoreApplication::instance())) + class Application : public QApplication { // friends for the purpose of limiting access to deprecated stuff Q_OBJECT diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index dcbfe8fde..a70fe668a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -608,7 +608,7 @@ set(PRISMUPDATER_SOURCES updater/prismupdater/UpdaterDialogs.cpp updater/prismupdater/GitHubRelease.h updater/prismupdater/GitHubRelease.cpp - + Json.h Json.cpp FileSystem.h @@ -625,7 +625,7 @@ set(PRISMUPDATER_SOURCES # Zip MMCZip.h MMCZip.cpp - + # Time MMCTime.h MMCTime.cpp @@ -1265,14 +1265,10 @@ include(CompilerWarnings) # Add executable add_library(Launcher_logic STATIC ${LOGIC_SOURCES} ${LAUNCHER_SOURCES} ${LAUNCHER_UI} ${LAUNCHER_RESOURCES}) -if(BUILD_TESTING) -target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_TEST) -endif() set_project_warnings(Launcher_logic "${Launcher_MSVC_WARNINGS}" "${Launcher_CLANG_WARNINGS}" "${Launcher_GCC_WARNINGS}") -target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_APPLICATION) target_include_directories(Launcher_logic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_definitions(Launcher_logic PUBLIC LAUNCHER_APPLICATION) target_link_libraries(Launcher_logic @@ -1376,7 +1372,7 @@ if(Launcher_BUILD_UPDATER) add_executable("${Launcher_Name}_updater" WIN32 updater/prismupdater/updater_main.cpp) target_sources("${Launcher_Name}_updater" PRIVATE updater/prismupdater/updater.exe.manifest) target_link_libraries("${Launcher_Name}_updater" prism_updater_logic) - + if(DEFINED Launcher_APP_BINARY_NAME) set_target_properties("${Launcher_Name}_updater" PROPERTIES OUTPUT_NAME "${Launcher_APP_BINARY_NAME}_updater") endif() diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 941e7ce58..ce3e16bce 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -35,10 +35,9 @@ ResourceFolderModel::ResourceFolderModel(QDir dir, BaseInstance* instance, QObje connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &ResourceFolderModel::directoryChanged); connect(&m_helper_thread_task, &ConcurrentTask::finished, this, [this] { m_helper_thread_task.clear(); }); -#ifndef LAUNCHER_TEST - // in tests the application macro doesn't work - m_helper_thread_task.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); -#endif + if (APPLICATION_DYN) { // in tests the application macro doesn't work + m_helper_thread_task.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + } } ResourceFolderModel::~ResourceFolderModel() diff --git a/launcher/net/NetJob.cpp b/launcher/net/NetJob.cpp index e363c911d..3cd3958f7 100644 --- a/launcher/net/NetJob.cpp +++ b/launcher/net/NetJob.cpp @@ -48,7 +48,7 @@ NetJob::NetJob(QString job_name, shared_qobject_ptr netwo : ConcurrentTask(nullptr, job_name), m_network(network) { #if defined(LAUNCHER_APPLICATION) - if (max_concurrent < 0) + if (APPLICATION_DYN && max_concurrent < 0) max_concurrent = APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt(); #endif if (max_concurrent > 0) @@ -161,7 +161,8 @@ bool NetJob::isOnline() void NetJob::emitFailed(QString reason) { #if defined(LAUNCHER_APPLICATION) - if (m_ask_retry && m_manual_try < APPLICATION->settings()->get("NumberOfManualRetries").toInt() && isOnline()) { + + if (APPLICATION_DYN && m_ask_retry && m_manual_try < APPLICATION->settings()->get("NumberOfManualRetries").toInt() && isOnline()) { m_manual_try++; auto response = CustomMessageBox::selectable(nullptr, "Confirm retry", "The tasks failed.\n" diff --git a/launcher/ui/pages/modplatform/ResourceModel.cpp b/launcher/ui/pages/modplatform/ResourceModel.cpp index c8eb91570..50a170fff 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.cpp +++ b/launcher/ui/pages/modplatform/ResourceModel.cpp @@ -31,9 +31,9 @@ QHash ResourceModel::s_running_models; ResourceModel::ResourceModel(ResourceAPI* api) : QAbstractListModel(), m_api(api) { s_running_models.insert(this, true); -#ifndef LAUNCHER_TEST - m_current_info_job.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); -#endif + if (APPLICATION_DYN) { + m_current_info_job.setMaxConcurrent(APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + } } ResourceModel::~ResourceModel() @@ -60,11 +60,15 @@ auto ResourceModel::data(const QModelIndex& index, int role) const -> QVariant return pack->description; } case Qt::DecorationRole: { - if (auto icon_or_none = const_cast(this)->getIcon(const_cast(index), pack->logoUrl); - icon_or_none.has_value()) - return icon_or_none.value(); - - return APPLICATION->getThemedIcon("screenshot-placeholder"); + if (APPLICATION_DYN) { + if (auto icon_or_none = const_cast(this)->getIcon(const_cast(index), pack->logoUrl); + icon_or_none.has_value()) + return icon_or_none.value(); + + return APPLICATION->getThemedIcon("screenshot-placeholder"); + } else { + return {}; + } } case Qt::SizeHintRole: return QSize(0, 58); From 2d234b127b1561fcedd0beae5bd242d1012c7426 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sat, 19 Oct 2024 22:07:31 +0300 Subject: [PATCH 107/177] make sure that tests are only disabled fro cmark Signed-off-by: Trial97 --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c1ad3373..b677b0b7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -532,10 +532,12 @@ else() endif() if(NOT cmark_FOUND) message(STATUS "Using bundled cmark") + set(ORIGINAL_BUILD_TESTING ${BUILD_TESTING}) set(BUILD_TESTING 0) set(BUILD_SHARED_LIBS 0) add_subdirectory(libraries/cmark EXCLUDE_FROM_ALL) # Markdown parser add_library(cmark::cmark ALIAS cmark) + set(BUILD_TESTING ${ORIGINAL_BUILD_TESTING}) else() message(STATUS "Using system cmark") endif() From 0501c1e17a75172b8c3b8c15da27a86cf64c420b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 20 Oct 2024 00:25:22 +0000 Subject: [PATCH 108/177] chore(nix): update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/5633bcff0c6162b9e4b5f1264264611e950c8ec7?narHash=sha256-9UTxR8eukdg%2BXZeHgxW5hQA9fIKHsKCdOIUycTryeVw%3D' (2024-10-09) → 'github:NixOS/nixpkgs/4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0?narHash=sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c%2BcHUJwA%3D' (2024-10-18) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 7bf13f75c..a82e6f65f 100644 --- a/flake.lock +++ b/flake.lock @@ -49,11 +49,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728492678, - "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { From 9a810dfa6e609d736511fb166efa403eaf9506b3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 20 Oct 2024 23:14:05 +0300 Subject: [PATCH 109/177] fix sparkle signature Signed-off-by: Trial97 (cherry picked from commit 0586d38e03de6890bf5697c7e1a965aac9bd36fb) --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dc45252fa..a1ed0a25a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -410,9 +410,8 @@ jobs: if: matrix.name == 'macOS' run: | if [ '${{ secrets.SPARKLE_ED25519_KEY }}' != '' ]; then - brew install openssl@3 echo '${{ secrets.SPARKLE_ED25519_KEY }}' > ed25519-priv.pem - signature=$(/usr/local/opt/openssl@3/bin/openssl pkeyutl -sign -rawin -in ${{ github.workspace }}/PrismLauncher.zip -inkey ed25519-priv.pem | openssl base64 | tr -d \\n) + signature=$(/opt/homebrew/opt/openssl@3/bin/openssl pkeyutl -sign -rawin -in ${{ github.workspace }}/PrismLauncher.zip -inkey ed25519-priv.pem | openssl base64 | tr -d \\n) rm ed25519-priv.pem cat >> $GITHUB_STEP_SUMMARY << EOF ### Artifact Information :information_source: From ff97affa7210524a506a7ae25d8d17c41ca6f0ae Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 21 Oct 2024 14:41:48 +0100 Subject: [PATCH 110/177] Fix /norestart Signed-off-by: TheKodeToad (cherry picked from commit 78e24962f93b5cc2350d04bebd7e5231d1bc4819) --- program_info/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index ee2e336b1..e693d757a 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -57,7 +57,7 @@ Section "Visual Studio Runtime" Pop $0 ${If} $0 == "OK" DetailPrint "Download successful" - ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart\" + ExecWait "$INSTDIR\vc_redist\$vc_redist_exe /install /passive /norestart" ${Else} DetailPrint "Download failed with error $0" ${EndIf} From 1cf91fa5d93aa2a4b2caab10a20b65ca4b95869a Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 16:17:48 +0300 Subject: [PATCH 111/177] do not require java if auto-download is enabled Signed-off-by: Trial97 (cherry picked from commit fcadbbb739076096a9057ec340f7f6d39bc4b72f) --- launcher/Application.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index b8dcc1099..cfae3a807 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1071,6 +1071,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) bool Application::createSetupWizard() { bool javaRequired = [&]() { + if (BuildConfig.JAVA_DOWNLOADER_ENABLED && m_settings->get("AutomaticJavaDownload").toBool()) { + return false; + } bool ignoreJavaWizard = m_settings->get("IgnoreJavaWizard").toBool(); if (ignoreJavaWizard) { return false; @@ -1083,10 +1086,7 @@ bool Application::createSetupWizard() } QString currentJavaPath = settings()->get("JavaPath").toString(); QString actualPath = FS::ResolveExecutable(currentJavaPath); - if (actualPath.isNull()) { - return true; - } - return false; + return actualPath.isNull(); }(); bool askjava = BuildConfig.JAVA_DOWNLOADER_ENABLED && !javaRequired && !m_settings->get("AutomaticJavaDownload").toBool() && !m_settings->get("AutomaticJavaSwitch").toBool() && !m_settings->get("UserAskedAboutAutomaticJavaDownload").toBool(); From 577f8074e1ec203e119b50b1588d2b789eb40425 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 21 Oct 2024 16:30:08 +0100 Subject: [PATCH 112/177] Fix removing portable.txt on Linux portable build Signed-off-by: TheKodeToad (cherry picked from commit f3f4c446206647b69b9c19e63617b163b99c6164) --- launcher/Launcher.in | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/launcher/Launcher.in b/launcher/Launcher.in index 1a23f2555..706d7022b 100755 --- a/launcher/Launcher.in +++ b/launcher/Launcher.in @@ -39,8 +39,16 @@ if [ "x$DEPS_LIST" = "x" ]; then # Just to be sure... chmod +x "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" + ARGS=("${LAUNCHER_DIR}/${LAUNCHER_NAME}" "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}") + + if [ -f portable.txt ]; then + ARGS+=("-d" "${LAUNCHER_DIR}") + fi + + ARGS+=("$@") + # Run the launcher - exec -a "${LAUNCHER_DIR}/${LAUNCHER_NAME}" "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" -d "${LAUNCHER_DIR}" "$@" + exec -a "${ARGS[@]}" # Run the launcher in valgrind # valgrind --log-file="valgrind.log" --leak-check=full --track-origins=yes "${LAUNCHER_DIR}/bin/${LAUNCHER_NAME}" -d "${LAUNCHER_DIR}" "$@" From 199c5497d327f35d0bc70aa7949be397ed583aa7 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 19:28:34 +0300 Subject: [PATCH 113/177] do not try to import skin if path is empty Signed-off-by: Trial97 (cherry picked from commit 9a5b773e69e7198cc37413ab7d69ba6d0a66f854) --- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index 6c85ffa96..fbf4ef1f4 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -139,6 +139,9 @@ void SkinManageDialog::on_fileBtn_clicked() { auto filter = QMimeDatabase().mimeTypeForName("image/png").filterString(); QString raw_path = QFileDialog::getOpenFileName(this, tr("Select Skin Texture"), QString(), filter); + if (raw_path.isEmpty()) { + return; + } auto message = m_list.installSkin(raw_path, {}); if (!message.isEmpty()) { CustomMessageBox::selectable(this, tr("Selected file is not a valid skin"), message, QMessageBox::Critical)->show(); From 6da14d66bb80cbd6818582347b49bc6eb3a4c1f2 Mon Sep 17 00:00:00 2001 From: Alexandru Ionut Tripon Date: Mon, 21 Oct 2024 22:59:51 +0300 Subject: [PATCH 114/177] Update launcher/ui/dialogs/skins/SkinManageDialog.cpp Co-authored-by: TheKodeToad Signed-off-by: Alexandru Ionut Tripon (cherry picked from commit 69028969f1a6c42b698b900256ad2e6d9ee208eb) --- launcher/ui/dialogs/skins/SkinManageDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index fbf4ef1f4..65840eb08 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -139,7 +139,7 @@ void SkinManageDialog::on_fileBtn_clicked() { auto filter = QMimeDatabase().mimeTypeForName("image/png").filterString(); QString raw_path = QFileDialog::getOpenFileName(this, tr("Select Skin Texture"), QString(), filter); - if (raw_path.isEmpty()) { + if (raw_path.isNull()) { return; } auto message = m_list.installSkin(raw_path, {}); From 51a71d04715bfc47c1688bd7606b3c4f043cd3d8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 21 Oct 2024 23:53:23 +0300 Subject: [PATCH 115/177] skip QSaveFile temprary files Signed-off-by: Trial97 (cherry picked from commit 562c3013269dbb9cad411f58ded333dee1aea158) --- launcher/Application.cpp | 23 ++++++ launcher/Application.h | 11 +++ launcher/CMakeLists.txt | 1 + launcher/FileSystem.cpp | 22 +++--- launcher/PSaveFile.h | 70 +++++++++++++++++++ launcher/minecraft/World.cpp | 4 +- .../minecraft/mod/tasks/BasicFolderLoadTask.h | 4 ++ .../minecraft/mod/tasks/ModFolderLoadTask.cpp | 4 ++ launcher/modplatform/packwiz/Packwiz.cpp | 4 +- launcher/net/FileSink.cpp | 2 +- launcher/net/FileSink.h | 5 +- launcher/settings/INIFile.cpp | 1 - launcher/ui/dialogs/ExportInstanceDialog.cpp | 1 - 13 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 launcher/PSaveFile.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index cfae3a807..686d934c2 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1883,3 +1883,26 @@ const QString Application::javaPath() { return m_settings->get("JavaDir").toString(); } + +void Application::addQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + m_qsaveResources.insert(path); +} + +void Application::removeQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + m_qsaveResources.remove(path); +} + +bool Application::checkQSavePath(QString path) +{ + QMutexLocker locker(&m_qsaveResourcesMutex); + for (auto r : m_qsaveResources) { + if (path.contains(r)) { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/launcher/Application.h b/launcher/Application.h index bd1cb2dea..363130cdd 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include #include @@ -303,4 +305,13 @@ class Application : public QApplication { QList m_urlsToImport; QString m_instanceIdToShowWindowOf; std::unique_ptr logFile; + + public: + void addQSavePath(QString); + void removeQSavePath(QString); + bool checkQSavePath(QString); + + private: + QSet m_qsaveResources; + mutable QMutex m_qsaveResourcesMutex; }; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index a70fe668a..0f0949a3a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -30,6 +30,7 @@ set(CORE_SOURCES StringUtils.cpp QVariantUtils.h RuntimeContext.h + PSaveFile.h # Basic instance manipulation tasks (derived from InstanceTask) InstanceCreationTask.h diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 7f38cff04..512de28c2 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -54,6 +53,7 @@ #include #include "DesktopServices.h" +#include "PSaveFile.h" #include "StringUtils.h" #if defined Q_OS_WIN32 @@ -191,8 +191,8 @@ void ensureExists(const QDir& dir) void write(const QString& filename, const QByteArray& data) { ensureExists(QFileInfo(filename).dir()); - QSaveFile file(filename); - if (!file.open(QSaveFile::WriteOnly)) { + PSaveFile file(filename); + if (!file.open(PSaveFile::WriteOnly)) { throw FileSystemException("Couldn't open " + filename + " for writing: " + file.errorString()); } if (data.size() != file.write(data)) { @@ -213,8 +213,8 @@ void appendSafe(const QString& filename, const QByteArray& data) buffer = QByteArray(); } buffer.append(data); - QSaveFile file(filename); - if (!file.open(QSaveFile::WriteOnly)) { + PSaveFile file(filename); + if (!file.open(PSaveFile::WriteOnly)) { throw FileSystemException("Couldn't open " + filename + " for writing: " + file.errorString()); } if (buffer.size() != file.write(buffer)) { @@ -971,8 +971,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (!args.empty()) argstring = " \"" + args.join("\" \"") + "\""; - stream << "#!/bin/bash" - << "\n"; + stream << "#!/bin/bash" << "\n"; stream << "\"" << target << "\" " << argstring << "\n"; stream.flush(); @@ -1016,12 +1015,9 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri if (!args.empty()) argstring = " '" + args.join("' '") + "'"; - stream << "[Desktop Entry]" - << "\n"; - stream << "Type=Application" - << "\n"; - stream << "Categories=Game;ActionGame;AdventureGame;Simulation" - << "\n"; + stream << "[Desktop Entry]" << "\n"; + stream << "Type=Application" << "\n"; + stream << "Categories=Game;ActionGame;AdventureGame;Simulation" << "\n"; stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n"; stream << "Name=" << name.toLocal8Bit() << "\n"; if (!icon.isEmpty()) { diff --git a/launcher/PSaveFile.h b/launcher/PSaveFile.h new file mode 100644 index 000000000..e0b5a7a2c --- /dev/null +++ b/launcher/PSaveFile.h @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (c) 2023-2024 Trial97 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#include +#include "Application.h" + +#if defined(LAUNCHER_APPLICATION) + +/* PSaveFile + * A class that mimics QSaveFile for Windows. + * + * When reading resources, we need to avoid accessing temporary files + * generated by QSaveFile. If we start reading such a file, we may + * inadvertently keep it open while QSaveFile is trying to remove it, + * or we might detect the file just before it is removed, leading to + * race conditions and errors. + * + * Unfortunately, QSaveFile doesn't provide a way to retrieve the + * temporary file name or to set a specific template for the temporary + * file name it uses. By default, QSaveFile appends a `.XXXXXX` suffix + * to the original file name, where the `XXXXXX` part is dynamically + * generated to ensure uniqueness. + * + * This class acts like a lock by adding and removing the target file + * name into/from a global string set, helping to manage access to + * files during critical operations. + * + * Note: Please do not use the `setFileName` function directly, as it + * is not virtual and cannot be overridden. + */ +class PSaveFile : public QSaveFile { + public: + PSaveFile(const QString& name) : QSaveFile(name) + { + if (auto app = APPLICATION_DYN) { + app->addQSavePath(name + "."); + } + } + PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) + { + if (auto app = APPLICATION_DYN) { + app->addQSavePath(name + "."); + } + } + virtual ~PSaveFile() + { + if (auto app = APPLICATION_DYN) { + app->removeQSavePath(fileName() + "."); + } + } +}; +#else +#define PSaveFile QSaveFile +#endif \ No newline at end of file diff --git a/launcher/minecraft/World.cpp b/launcher/minecraft/World.cpp index 1eba148a5..bd28f9e9a 100644 --- a/launcher/minecraft/World.cpp +++ b/launcher/minecraft/World.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -57,6 +56,7 @@ #include #include "FileSystem.h" +#include "PSaveFile.h" using std::nullopt; using std::optional; @@ -183,7 +183,7 @@ bool putLevelDatDataToFS(const QFileInfo& file, QByteArray& data) if (fullFilePath.isNull()) { return false; } - QSaveFile f(fullFilePath); + PSaveFile f(fullFilePath); if (!f.open(QIODevice::WriteOnly)) { return false; } diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h index 2bce2c137..fb2e22de6 100644 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h @@ -7,6 +7,7 @@ #include +#include "Application.h" #include "FileSystem.h" #include "minecraft/mod/Resource.h" @@ -52,6 +53,9 @@ class BasicFolderLoadTask : public Task { m_dir.refresh(); for (auto entry : m_dir.entryInfoList()) { auto filePath = entry.absoluteFilePath(); + if (auto app = APPLICATION_DYN; app && app->checkQSavePath(filePath)) { + continue; + } auto newFilePath = FS::getUniqueResourceName(filePath); if (newFilePath != filePath) { FS::move(filePath, newFilePath); diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp index 501d5be13..63996e584 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp @@ -36,6 +36,7 @@ #include "ModFolderLoadTask.h" +#include "Application.h" #include "FileSystem.h" #include "minecraft/mod/MetadataHandler.h" @@ -65,6 +66,9 @@ void ModFolderLoadTask::executeTask() m_mods_dir.refresh(); for (auto entry : m_mods_dir.entryInfoList()) { auto filePath = entry.absoluteFilePath(); + if (auto app = APPLICATION_DYN; app && app->checkQSavePath(filePath)) { + continue; + } auto newFilePath = FS::getUniqueResourceName(filePath); if (newFilePath != filePath) { FS::move(filePath, newFilePath); diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 325b0a6e4..272900f0e 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -72,7 +72,7 @@ auto stringEntry(toml::table table, QString entry_name) -> QString { auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << "Failed to read str property '" + entry_name + "' in mod metadata."; + qWarning() << "Failed to read str property '" + entry_name + "' in mod metadata."; return {}; } @@ -83,7 +83,7 @@ auto intEntry(toml::table table, QString entry_name) -> int { auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << "Failed to read int property '" + entry_name + "' in mod metadata."; + qWarning() << "Failed to read int property '" + entry_name + "' in mod metadata."; return {}; } diff --git a/launcher/net/FileSink.cpp b/launcher/net/FileSink.cpp index 1ecb21fdf..95c1a8f44 100644 --- a/launcher/net/FileSink.cpp +++ b/launcher/net/FileSink.cpp @@ -55,7 +55,7 @@ Task::State FileSink::init(QNetworkRequest& request) } wroteAnyData = false; - m_output_file.reset(new QSaveFile(m_filename)); + m_output_file.reset(new PSaveFile(m_filename)); if (!m_output_file->open(QIODevice::WriteOnly)) { qCCritical(taskNetLogC) << "Could not open " + m_filename + " for writing"; return Task::State::Failed; diff --git a/launcher/net/FileSink.h b/launcher/net/FileSink.h index 816254ff9..272f8ddc3 100644 --- a/launcher/net/FileSink.h +++ b/launcher/net/FileSink.h @@ -35,8 +35,7 @@ #pragma once -#include - +#include "PSaveFile.h" #include "Sink.h" namespace Net { @@ -60,6 +59,6 @@ class FileSink : public Sink { protected: QString m_filename; bool wroteAnyData = false; - std::unique_ptr m_output_file; + std::unique_ptr m_output_file; }; } // namespace Net diff --git a/launcher/settings/INIFile.cpp b/launcher/settings/INIFile.cpp index e97741f20..2c7620e65 100644 --- a/launcher/settings/INIFile.cpp +++ b/launcher/settings/INIFile.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 9f2b3ac42..7e00f18f4 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include From 85422427b9794a3bb6765e9947c03844862035e4 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 22 Oct 2024 09:41:00 +0300 Subject: [PATCH 116/177] Replaced QSet with QHash Signed-off-by: Trial97 (cherry picked from commit 73d33f93b30f658f9671358ac52bf4e03afeaefd) --- launcher/Application.cpp | 13 +++++++++---- launcher/Application.h | 3 +-- launcher/PSaveFile.h | 21 +++++++++++---------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 686d934c2..ea749ca4c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1887,20 +1887,25 @@ const QString Application::javaPath() void Application::addQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - m_qsaveResources.insert(path); + m_qsaveResources[path] = m_qsaveResources.value(path, 0) + 1; } void Application::removeQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - m_qsaveResources.remove(path); + auto count = m_qsaveResources.value(path, 0) - 1; + if (count <= 0) { + m_qsaveResources.remove(path); + } else { + m_qsaveResources[path] = count; + } } bool Application::checkQSavePath(QString path) { QMutexLocker locker(&m_qsaveResourcesMutex); - for (auto r : m_qsaveResources) { - if (path.contains(r)) { + for (auto partialPath : m_qsaveResources.keys()) { + if (path.startsWith(partialPath) && m_qsaveResources.value(partialPath, 0) > 0) { return true; } } diff --git a/launcher/Application.h b/launcher/Application.h index 363130cdd..692625f4a 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -312,6 +311,6 @@ class Application : public QApplication { bool checkQSavePath(QString); private: - QSet m_qsaveResources; + QHash m_qsaveResources; mutable QMutex m_qsaveResourcesMutex; }; diff --git a/launcher/PSaveFile.h b/launcher/PSaveFile.h index e0b5a7a2c..ba6154ad8 100644 --- a/launcher/PSaveFile.h +++ b/launcher/PSaveFile.h @@ -17,6 +17,7 @@ */ #pragma once +#include #include #include "Application.h" @@ -46,24 +47,24 @@ */ class PSaveFile : public QSaveFile { public: - PSaveFile(const QString& name) : QSaveFile(name) - { - if (auto app = APPLICATION_DYN) { - app->addQSavePath(name + "."); - } - } - PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) + PSaveFile(const QString& name) : QSaveFile(name) { addPath(name); } + PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent) { addPath(name); } + virtual ~PSaveFile() { if (auto app = APPLICATION_DYN) { - app->addQSavePath(name + "."); + app->removeQSavePath(m_absoluteFilePath); } } - virtual ~PSaveFile() + + private: + void addPath(const QString& path) { + m_absoluteFilePath = QFileInfo(path).absoluteFilePath() + "."; // add dot for tmp files only if (auto app = APPLICATION_DYN) { - app->removeQSavePath(fileName() + "."); + app->addQSavePath(m_absoluteFilePath); } } + QString m_absoluteFilePath; }; #else #define PSaveFile QSaveFile From b983ae0fb000b0a413115f4b8bd64f8447cca80b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 22 Oct 2024 13:43:16 +0300 Subject: [PATCH 117/177] fix small leak Signed-off-by: Trial97 (cherry picked from commit 836aebc0d91fe8658052b8c4a5a4ab31da4a4b15) --- launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index f2feb8c7f..a6fbf5088 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -124,7 +124,7 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr ui->actionsToolbar->addAction(ui->actionVisitItemPage); connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages); - auto changeVersion = new QAction(tr("Change Version")); + auto changeVersion = new QAction(tr("Change Version"), this); changeVersion->setToolTip(tr("Change mod version")); changeVersion->setEnabled(false); ui->actionsToolbar->insertActionAfter(ui->actionUpdateItem, changeVersion); From fb7d19941f7f7e314df1c776fde8cafb3fb248ad Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 23 Oct 2024 13:44:39 +0100 Subject: [PATCH 118/177] Fix CleanEnviroment()'s usage of stripVariableEntries Signed-off-by: TheKodeToad (cherry picked from commit e7cd8fe078e3a68bd3179816020a9ed08f1b2847) --- launcher/java/JavaUtils.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index bc8026348..f3200428e 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -102,6 +102,8 @@ QProcessEnvironment CleanEnviroment() QString newValue = stripVariableEntries(key, value, rawenv.value("LAUNCHER_" + key)); qDebug() << "Env: stripped" << key << value << "to" << newValue; + + value = newValue; } #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) // Strip IBus From 729cec5f45468e9647027ea75155fc1fb6d7c0f1 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:23:10 -0700 Subject: [PATCH 119/177] fix don't hang the ui for a full version load Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> (cherry picked from commit 7bd04ae928527b065174021fba98dc78d0d119a3) --- launcher/minecraft/Component.cpp | 5 +++-- launcher/minecraft/Component.h | 2 +- launcher/ui/pages/instance/VersionPage.cpp | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/launcher/minecraft/Component.cpp b/launcher/minecraft/Component.cpp index 1073ef324..ad7ef545c 100644 --- a/launcher/minecraft/Component.cpp +++ b/launcher/minecraft/Component.cpp @@ -222,11 +222,12 @@ bool Component::isMoveable() return true; } -bool Component::isVersionChangeable() +bool Component::isVersionChangeable(bool wait) { auto list = getVersionList(); if (list) { - list->waitToLoad(); + if (wait) + list->waitToLoad(); return list->count() != 0; } return false; diff --git a/launcher/minecraft/Component.h b/launcher/minecraft/Component.h index 7ff30889f..203cc2241 100644 --- a/launcher/minecraft/Component.h +++ b/launcher/minecraft/Component.h @@ -72,7 +72,7 @@ class Component : public QObject, public ProblemProvider { bool isRevertible(); bool isRemovable(); bool isCustom(); - bool isVersionChangeable(); + bool isVersionChangeable(bool wait = true); bool isKnownModloader(); QStringList knownConflictingComponents(); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index 0c25b4c0c..cb04f9db1 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -243,7 +243,7 @@ void VersionPage::updateButtons(int row) ui->actionRemove->setEnabled(patch && patch->isRemovable()); ui->actionMove_down->setEnabled(patch && patch->isMoveable()); ui->actionMove_up->setEnabled(patch && patch->isMoveable()); - ui->actionChange_version->setEnabled(patch && patch->isVersionChangeable()); + ui->actionChange_version->setEnabled(patch && patch->isVersionChangeable(false)); ui->actionEdit->setEnabled(patch && patch->isCustom()); ui->actionCustomize->setEnabled(patch && patch->isCustomizable()); ui->actionRevert->setEnabled(patch && patch->isRevertible()); From a839258c07d1faf7958c9c9b0246faacefaabedc Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 25 Oct 2024 00:19:06 +0300 Subject: [PATCH 120/177] bump develop to 9.2 Signed-off-by: Trial97 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b677b0b7c..728e9c246 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,7 +181,7 @@ set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE S ######## Set version numbers ######## set(Launcher_VERSION_MAJOR 9) -set(Launcher_VERSION_MINOR 0) +set(Launcher_VERSION_MINOR 2) set(Launcher_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}") set(Launcher_VERSION_NAME4 "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.0.0") From 008d69e5e5fc7e0b05125a464dcd23fd95c9fcb5 Mon Sep 17 00:00:00 2001 From: Arcitec <38923130+Arcitec@users.noreply.github.com> Date: Thu, 24 Oct 2024 09:52:40 +0200 Subject: [PATCH 121/177] fix: bring back Flathub manifest improvements to the repo - Brings back all manifest improvements, such as the incredibly important Mojang Java Downloader (without it, the Flatpak doesn't work), and important fixes for Wayland. Signed-off-by: Arcitec <38923130+Arcitec@users.noreply.github.com> (cherry picked from commit 4ce025c0a209a4eec20f7f1b9a7777bbe886be8c) --- flatpak/flite.json | 20 +++++++ flatpak/libdecor.json | 36 +++++------ flatpak/org.prismlauncher.PrismLauncher.yml | 27 +++++---- ...on-t-crash-on-calls-to-focus-or-icon.patch | 24 -------- ...ning-about-being-an-unofficial-patch.patch | 17 ------ ...007-Platform-Prefer-Wayland-over-X11.patch | 20 ------- ...rsor-position-until-the-cursor-is-lo.patch | 59 +++++++++++++++++++ flatpak/patches/weird_libdecor.patch | 40 ------------- 8 files changed, 112 insertions(+), 131 deletions(-) create mode 100644 flatpak/flite.json delete mode 100644 flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch delete mode 100644 flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch delete mode 100644 flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch create mode 100644 flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch delete mode 100644 flatpak/patches/weird_libdecor.patch diff --git a/flatpak/flite.json b/flatpak/flite.json new file mode 100644 index 000000000..1bf280af1 --- /dev/null +++ b/flatpak/flite.json @@ -0,0 +1,20 @@ +{ + "name": "flite", + "config-opts": [ + "--enable-shared", + "--with-audio=pulseaudio" + ], + "no-parallel-make": true, + "sources": [ + { + "type": "git", + "url": "https://github.com/festvox/flite.git", + "tag": "v2.2", + "commit": "e9e2e37c329dbe98bfeb27a1828ef9a71fa84f88", + "x-checker-data": { + "type": "git", + "tag-pattern": "^v([\\d.]+)$" + } + } + ] +} diff --git a/flatpak/libdecor.json b/flatpak/libdecor.json index 589310a35..1652a2f04 100644 --- a/flatpak/libdecor.json +++ b/flatpak/libdecor.json @@ -1,22 +1,18 @@ { - "name": "libdecor", - "buildsystem": "meson", - "config-opts": [ - "-Ddemo=false" - ], - "sources": [ - { - "type": "git", - "url": "https://gitlab.freedesktop.org/libdecor/libdecor.git", - "commit": "73260393a97291c887e1074ab7f318e031be0ac6" - }, - { - "type": "patch", - "path": "patches/weird_libdecor.patch" - } - ], - "cleanup": [ - "/include", - "/lib/pkgconfig" - ] + "name": "libdecor", + "buildsystem": "meson", + "config-opts": [ + "-Ddemo=false" + ], + "sources": [ + { + "type": "git", + "url": "https://gitlab.freedesktop.org/libdecor/libdecor.git", + "commit": "c2bd8ad6fa42c0cb17553ce77ad8a87d1f543b1f" + } + ], + "cleanup": [ + "/include", + "/lib/pkgconfig" + ] } diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index 09dd8d73b..7aaa4f379 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -1,6 +1,6 @@ id: org.prismlauncher.PrismLauncher runtime: org.kde.Platform -runtime-version: 6.7 +runtime-version: '6.7' sdk: org.kde.Sdk sdk-extensions: - org.freedesktop.Sdk.Extension.openjdk17 @@ -19,6 +19,12 @@ finish-args: - --filesystem=xdg-download:ro # FTBApp import - --filesystem=~/.ftba:ro + # Userspace visibility for manual hugepages configuration + # Required for -XX:+UseLargePages + - --filesystem=/sys/kernel/mm/hugepages:ro + # Userspace visibility for transparent hugepages configuration + # Required for -XX:+UseTransparentHugePages + - --filesystem=/sys/kernel/mm/transparent_hugepage:ro modules: # Might be needed by some Controller mods (see https://github.com/isXander/Controlify/issues/31) @@ -27,11 +33,16 @@ modules: # Needed for proper Wayland support - libdecor.json + # Text to Speech in the game + - flite.json + - name: prismlauncher buildsystem: cmake-ninja builddir: true config-opts: - -DLauncher_BUILD_PLATFORM=flatpak + # This allows us to manage and update Java independently of this Flatpak + - -DLauncher_ENABLE_JAVA_DOWNLOADER=ON - -DCMAKE_BUILD_TYPE=RelWithDebInfo build-options: env: @@ -47,18 +58,14 @@ modules: config-opts: - -DCMAKE_BUILD_TYPE=RelWithDebInfo - -DBUILD_SHARED_LIBS:BOOL=ON - - -DGLFW_USE_WAYLAND:BOOL=ON + - -DGLFW_BUILD_WAYLAND:BOOL=ON - -DGLFW_BUILD_DOCS:BOOL=OFF sources: - type: git url: https://github.com/glfw/glfw.git - commit: 3fa2360720eeba1964df3c0ecf4b5df8648a8e52 - - type: patch - path: patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch - - type: patch - path: patches/0005-Add-warning-about-being-an-unofficial-patch.patch + commit: 7b6aead9fb88b3623e3b3725ebb42670cbe4c579 # 3.4 - type: patch - path: patches/0007-Platform-Prefer-Wayland-over-X11.patch + path: patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch cleanup: - /include - /lib/cmake @@ -91,8 +98,8 @@ modules: sources: - type: archive dest-filename: gamemode.tar.gz - url: https://api.github.com/repos/FeralInteractive/gamemode/tarball/1.8.1 - sha256: 969cf85b5ca3944f3e315cd73a0ee9bea4f9c968cd7d485e9f4745bc1e679c4e + url: https://api.github.com/repos/FeralInteractive/gamemode/tarball/1.8.2 + sha256: 2886d4ce543c78bd2a364316d5e7fd59ef06b71de63f896b37c6d3dc97658f60 x-checker-data: type: json url: https://api.github.com/repos/FeralInteractive/gamemode/releases/latest diff --git a/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch b/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch deleted file mode 100644 index 9130e856c..000000000 --- a/flatpak/patches/0003-Don-t-crash-on-calls-to-focus-or-icon.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/src/wl_window.c b/src/wl_window.c -index 52d3b9eb..4ac4eb5d 100644 ---- a/src/wl_window.c -+++ b/src/wl_window.c -@@ -2117,8 +2117,7 @@ void _glfwSetWindowTitleWayland(_GLFWwindow* window, const char* title) - void _glfwSetWindowIconWayland(_GLFWwindow* window, - int count, const GLFWimage* images) - { -- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, -- "Wayland: The platform does not support setting the window icon"); -+ fprintf(stderr, "!!! Ignoring Error: Wayland: The platform does not support setting the window icon\n"); - } - - void _glfwGetWindowPosWayland(_GLFWwindow* window, int* xpos, int* ypos) -@@ -2361,8 +2360,7 @@ void _glfwRequestWindowAttentionWayland(_GLFWwindow* window) - - void _glfwFocusWindowWayland(_GLFWwindow* window) - { -- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, -- "Wayland: The platform does not support setting the input focus"); -+ fprintf(stderr, "!!! Ignoring Error: Wayland: The platform does not support setting the input focus\n"); - } - - void _glfwSetWindowMonitorWayland(_GLFWwindow* window, diff --git a/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch b/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch deleted file mode 100644 index b031d739f..000000000 --- a/flatpak/patches/0005-Add-warning-about-being-an-unofficial-patch.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/src/init.c b/src/init.c -index 06dbb3f2..a7c6da86 100644 ---- a/src/init.c -+++ b/src/init.c -@@ -449,6 +449,12 @@ GLFWAPI int glfwInit(void) - _glfw.initialized = GLFW_TRUE; - - glfwDefaultWindowHints(); -+ -+ fprintf(stderr, "!!! Patched GLFW from https://github.com/Admicos/minecraft-wayland\n" -+ "!!! If any issues with the window, or some issues with rendering, occur, " -+ "first try with the built-in GLFW, and if that solves the issue, report there first.\n" -+ "!!! Use outside Minecraft is untested, and things might break.\n"); -+ - return GLFW_TRUE; - } - diff --git a/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch b/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch deleted file mode 100644 index 4eeb81309..000000000 --- a/flatpak/patches/0007-Platform-Prefer-Wayland-over-X11.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/src/platform.c b/src/platform.c -index c5966ae7..3e7442f9 100644 ---- a/src/platform.c -+++ b/src/platform.c -@@ -49,12 +49,12 @@ static const struct - #if defined(_GLFW_COCOA) - { GLFW_PLATFORM_COCOA, _glfwConnectCocoa }, - #endif --#if defined(_GLFW_X11) -- { GLFW_PLATFORM_X11, _glfwConnectX11 }, --#endif - #if defined(_GLFW_WAYLAND) - { GLFW_PLATFORM_WAYLAND, _glfwConnectWayland }, - #endif -+#if defined(_GLFW_X11) -+ { GLFW_PLATFORM_X11, _glfwConnectX11 }, -+#endif - }; - - GLFWbool _glfwSelectPlatform(int desiredID, _GLFWplatform* platform) diff --git a/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch b/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch new file mode 100644 index 000000000..70cec9981 --- /dev/null +++ b/flatpak/patches/0009-Defer-setting-cursor-position-until-the-cursor-is-lo.patch @@ -0,0 +1,59 @@ +From 9997ae55a47de469ea26f8437c30b51483abda5f Mon Sep 17 00:00:00 2001 +From: Dan Klishch +Date: Sat, 30 Sep 2023 23:38:05 -0400 +Subject: Defer setting cursor position until the cursor is locked + +--- + src/wl_platform.h | 3 +++ + src/wl_window.c | 14 ++++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/src/wl_platform.h b/src/wl_platform.h +index ca34f66e..cd1f227f 100644 +--- a/src/wl_platform.h ++++ b/src/wl_platform.h +@@ -403,6 +403,9 @@ typedef struct _GLFWwindowWayland + int scaleSize; + int compositorPreferredScale; + ++ double askedCursorPosX, askedCursorPosY; ++ GLFWbool didAskForSetCursorPos; ++ + struct zwp_relative_pointer_v1* relativePointer; + struct zwp_locked_pointer_v1* lockedPointer; + struct zwp_confined_pointer_v1* confinedPointer; +diff --git a/src/wl_window.c b/src/wl_window.c +index 1de26558..0df16747 100644 +--- a/src/wl_window.c ++++ b/src/wl_window.c +@@ -2586,8 +2586,9 @@ void _glfwGetCursorPosWayland(_GLFWwindow* window, double* xpos, double* ypos) + + void _glfwSetCursorPosWayland(_GLFWwindow* window, double x, double y) + { +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not support setting the cursor position"); ++ window->wl.didAskForSetCursorPos = true; ++ window->wl.askedCursorPosX = x; ++ window->wl.askedCursorPosY = y; + } + + void _glfwSetCursorModeWayland(_GLFWwindow* window, int mode) +@@ -2819,6 +2820,15 @@ static const struct zwp_relative_pointer_v1_listener relativePointerListener = + static void lockedPointerHandleLocked(void* userData, + struct zwp_locked_pointer_v1* lockedPointer) + { ++ _GLFWwindow* window = userData; ++ ++ if (window->wl.didAskForSetCursorPos) ++ { ++ window->wl.didAskForSetCursorPos = false; ++ zwp_locked_pointer_v1_set_cursor_position_hint(window->wl.lockedPointer, ++ wl_fixed_from_double(window->wl.askedCursorPosX), ++ wl_fixed_from_double(window->wl.askedCursorPosY)); ++ } + } + + static void lockedPointerHandleUnlocked(void* userData, +-- +2.42.0 + diff --git a/flatpak/patches/weird_libdecor.patch b/flatpak/patches/weird_libdecor.patch deleted file mode 100644 index 3a400b820..000000000 --- a/flatpak/patches/weird_libdecor.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/src/libdecor.c b/src/libdecor.c -index a9c1106..1aa38b3 100644 ---- a/src/libdecor.c -+++ b/src/libdecor.c -@@ -1391,22 +1391,32 @@ calculate_priority(const struct libdecor_plugin_description *plugin_description) - static bool - check_symbol_conflicts(const struct libdecor_plugin_description *plugin_description) - { -+ bool ret = true; - char * const *symbol; -+ void* main_prog = dlopen(NULL, RTLD_LAZY); -+ if (!main_prog) { -+ fprintf(stderr, "Plugin \"%s\" couldn't check conflicting symbols: \"%s\".\n", -+ plugin_description->description, dlerror()); -+ return false; -+ } -+ - - symbol = plugin_description->conflicting_symbols; - while (*symbol) { - dlerror(); -- dlsym (RTLD_DEFAULT, *symbol); -+ dlsym (main_prog, *symbol); - if (!dlerror()) { - fprintf(stderr, "Plugin \"%s\" uses conflicting symbol \"%s\".\n", - plugin_description->description, *symbol); -- return false; -+ ret = false; -+ break; - } - - symbol++; - } - -- return true; -+ dlclose(main_prog); -+ return ret; - } - - static struct plugin_loader * From 98819a0d02499514590809049ed46feafbb7501a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:48:29 +0000 Subject: [PATCH 122/177] chore(deps): update actions/cache action to v4.1.2 (cherry picked from commit 210d0d8aa25578cbbf8250797504ae1652544600) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1ed0a25a..6c167d8f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.1.1 + uses: actions/cache@v4.1.2 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From 27c6596bcbfd079c404d99a08688d1a9e72a498c Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 24 Oct 2024 01:33:01 +0100 Subject: [PATCH 123/177] Use Launcher log level in AutoInstallJava Signed-off-by: TheKodeToad (cherry picked from commit d8702e1357d36423a0d40b916d49fd937284a204) --- launcher/minecraft/launch/AutoInstallJava.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index b23b23ed2..1083b7efb 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -78,7 +78,7 @@ void AutoInstallJava::executeTask() auto java = std::dynamic_pointer_cast(javas->at(i)); if (java && packProfile->getProfile()->getCompatibleJavaMajors().contains(java->id.major())) { if (!java->is_64bit) { - emit logLine(tr("The automatic Java mechanism detected a 32-bit installation of Java."), MessageLevel::Info); + emit logLine(tr("The automatic Java mechanism detected a 32-bit installation of Java."), MessageLevel::Launcher); } setJavaPath(java->path); return; @@ -136,7 +136,7 @@ void AutoInstallJava::setJavaPath(QString path) settings->set("OverrideJavaLocation", true); settings->set("JavaPath", path); settings->set("AutomaticJava", true); - emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Info); + emit logLine(tr("Compatible Java found at: %1.").arg(path), MessageLevel::Launcher); emitSucceeded(); } From 5f06517b62745219183fd364e2557f23dcc04d66 Mon Sep 17 00:00:00 2001 From: seth Date: Fri, 25 Oct 2024 02:33:29 -0400 Subject: [PATCH 124/177] chore(nix): sync with nixpkgs Signed-off-by: seth (cherry picked from commit a5c554cf6ee32afa41c5a2af1ea8e8feb0087a49) --- nix/unwrapped.nix | 20 ++++---- nix/wrapper.nix | 115 ++++++++++++++++++++-------------------------- 2 files changed, 63 insertions(+), 72 deletions(-) diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index 7fc383ff3..237f36c1f 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -9,20 +9,21 @@ ghc_filesystem, jdk17, kdePackages, + libnbtplusplus, ninja, nix-filter, self, stripJavaArchivesHook, tomlplusplus, + version, zlib, + msaClientID ? null, - gamemodeSupport ? stdenv.isLinux, - version, - libnbtplusplus, + gamemodeSupport ? stdenv.hostPlatform.isLinux, }: assert lib.assertMsg ( - gamemodeSupport -> stdenv.isLinux + gamemodeSupport -> stdenv.hostPlatform.isLinux ) "gamemodeSupport is only available on Linux."; stdenv.mkDerivation { @@ -66,20 +67,23 @@ stdenv.mkDerivation { tomlplusplus zlib ] - ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ darwin.apple_sdk.frameworks.Cocoa ] ++ lib.optional gamemodeSupport gamemode; - hardeningEnable = lib.optionals stdenv.isLinux [ "pie" ]; + hardeningEnable = lib.optionals stdenv.hostPlatform.isLinux [ "pie" ]; cmakeFlags = - [ (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") ] + [ + # downstream branding + (lib.cmakeFeature "Launcher_BUILD_PLATFORM" "nixpkgs") + ] ++ lib.optionals (msaClientID != null) [ (lib.cmakeFeature "Launcher_MSA_CLIENT_ID" (toString msaClientID)) ] ++ lib.optionals (lib.versionOlder kdePackages.qtbase.version "6") [ (lib.cmakeFeature "Launcher_QT_VERSION_MAJOR" "5") ] - ++ lib.optionals stdenv.isDarwin [ + ++ lib.optionals stdenv.hostPlatform.isDarwin [ # we wrap our binary manually (lib.cmakeFeature "INSTALL_BUNDLE" "nodeps") # disable built-in updater diff --git a/nix/wrapper.nix b/nix/wrapper.nix index 5632d483b..ab9b7144b 100644 --- a/nix/wrapper.nix +++ b/nix/wrapper.nix @@ -1,73 +1,65 @@ { - lib, - stdenv, - symlinkJoin, - prismlauncher-unwrapped, - addOpenGLRunpath, + addDriverRunpath, + alsa-lib, flite, gamemode, - glfw, - glfw-wayland-minecraft, - glxinfo, - jdk8, + glfw3-minecraft, jdk17, jdk21, + jdk8, kdePackages, + lib, libGL, + libX11, + libXcursor, + libXext, + libXrandr, + libXxf86vm, + libjack2, libpulseaudio, libusb1, - makeWrapper, + mesa-demos, openal, pciutils, + pipewire, + prismlauncher-unwrapped, + stdenv, + symlinkJoin, udev, vulkan-loader, - xorg, + xrandr, + additionalLibs ? [ ], additionalPrograms ? [ ], - controllerSupport ? stdenv.isLinux, - gamemodeSupport ? stdenv.isLinux, + controllerSupport ? stdenv.hostPlatform.isLinux, + gamemodeSupport ? stdenv.hostPlatform.isLinux, jdks ? [ jdk21 jdk17 jdk8 ], msaClientID ? null, - textToSpeechSupport ? stdenv.isLinux, - # Adds `glfw-wayland-minecraft` to `LD_LIBRARY_PATH` - # when launched on wayland, allowing for the game to be run natively. - # Make sure to enable "Use system installation of GLFW" in instance settings - # for this to take effect - # - # Warning: This build of glfw may be unstable, and the launcher - # itself can take slightly longer to start - withWaylandGLFW ? false, + textToSpeechSupport ? stdenv.hostPlatform.isLinux, }: assert lib.assertMsg ( - controllerSupport -> stdenv.isLinux + controllerSupport -> stdenv.hostPlatform.isLinux ) "controllerSupport only has an effect on Linux."; assert lib.assertMsg ( - textToSpeechSupport -> stdenv.isLinux + textToSpeechSupport -> stdenv.hostPlatform.isLinux ) "textToSpeechSupport only has an effect on Linux."; -assert lib.assertMsg ( - withWaylandGLFW -> stdenv.isLinux -) "withWaylandGLFW is only available on Linux."; - let prismlauncher' = prismlauncher-unwrapped.override { inherit msaClientID gamemodeSupport; }; in + symlinkJoin { name = "prismlauncher-${prismlauncher'.version}"; paths = [ prismlauncher' ]; - nativeBuildInputs = - [ kdePackages.wrapQtAppsHook ] - # purposefully using a shell wrapper here for variable expansion - # see https://github.com/NixOS/nixpkgs/issues/172583 - ++ lib.optional withWaylandGLFW makeWrapper; + nativeBuildInputs = [ kdePackages.wrapQtAppsHook ]; buildInputs = [ @@ -75,45 +67,39 @@ symlinkJoin { kdePackages.qtsvg ] ++ lib.optional ( - lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.isLinux + lib.versionAtLeast kdePackages.qtbase.version "6" && stdenv.hostPlatform.isLinux ) kdePackages.qtwayland; - env = { - waylandPreExec = lib.optionalString withWaylandGLFW '' - if [ -n "$WAYLAND_DISPLAY" ]; then - export LD_LIBRARY_PATH=${lib.getLib glfw-wayland-minecraft}/lib:"$LD_LIBRARY_PATH" - fi - ''; - }; - - postBuild = - lib.optionalString withWaylandGLFW '' - qtWrapperArgs+=(--run "$waylandPreExec") - '' - + '' - wrapQtAppsHook - ''; + postBuild = '' + wrapQtAppsHook + ''; qtWrapperArgs = let runtimeLibs = [ - # lwjgl - glfw - libpulseaudio - libGL - openal stdenv.cc.cc.lib + ## native versions + glfw3-minecraft + openal - vulkan-loader # VulkanMod's lwjgl + ## openal + alsa-lib + libjack2 + libpulseaudio + pipewire + + ## glfw + libGL + libX11 + libXcursor + libXext + libXrandr + libXxf86vm udev # oshi - xorg.libX11 - xorg.libXext - xorg.libXcursor - xorg.libXrandr - xorg.libXxf86vm + vulkan-loader # VulkanMod's lwjgl ] ++ lib.optional textToSpeechSupport flite ++ lib.optional gamemodeSupport gamemode.lib @@ -121,14 +107,15 @@ symlinkJoin { ++ additionalLibs; runtimePrograms = [ - glxinfo + mesa-demos pciutils # need lspci - xorg.xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 + xrandr # needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 ] ++ additionalPrograms; + in [ "--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}" ] - ++ lib.optionals stdenv.isLinux [ - "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" + ++ lib.optionals stdenv.hostPlatform.isLinux [ + "--set LD_LIBRARY_PATH ${addDriverRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}" "--prefix PATH : ${lib.makeBinPath runtimePrograms}" ]; From 31031ec92311c1ccba385ce4cb10553f8172a2ed Mon Sep 17 00:00:00 2001 From: seth Date: Fri, 25 Oct 2024 02:34:15 -0400 Subject: [PATCH 125/177] chore(nix): use `self` for version Signed-off-by: seth (cherry picked from commit 63b10738b2a1065d55077e729fcada6e7f64d10a) --- flake.nix | 26 ++++++++++---------------- nix/unwrapped.nix | 3 +-- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/flake.nix b/flake.nix index f4ca782ec..54add656d 100644 --- a/flake.nix +++ b/flake.nix @@ -85,24 +85,18 @@ formatter = forAllSystems (system: nixpkgsFor.${system}.nixfmt-rfc-style); - overlays.default = - final: prev: - let - version = builtins.substring 0 8 self.lastModifiedDate or "dirty"; - in - { - prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { - inherit - libnbtplusplus - nix-filter - self - version - ; - }; - - prismlauncher = final.callPackage ./nix/wrapper.nix { }; + overlays.default = final: prev: { + prismlauncher-unwrapped = prev.callPackage ./nix/unwrapped.nix { + inherit + libnbtplusplus + nix-filter + self + ; }; + prismlauncher = final.callPackage ./nix/wrapper.nix { }; + }; + packages = forAllSystems ( system: let diff --git a/nix/unwrapped.nix b/nix/unwrapped.nix index 237f36c1f..1b14886ef 100644 --- a/nix/unwrapped.nix +++ b/nix/unwrapped.nix @@ -15,7 +15,6 @@ self, stripJavaArchivesHook, tomlplusplus, - version, zlib, msaClientID ? null, @@ -28,7 +27,7 @@ assert lib.assertMsg ( stdenv.mkDerivation { pname = "prismlauncher-unwrapped"; - inherit version; + version = self.shortRev or self.dirtyShortRev or "unknown"; src = nix-filter.lib { root = self; From f06505b1381a13826a04adfe42acbc6369f6e012 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 11:58:34 +0200 Subject: [PATCH 126/177] change contributors name Signed-off-by: Trial97 (cherry picked from commit f373a5cea0e816158cdabca3423107989aed0a85) --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index b652ba991..84bae70d0 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -101,7 +101,7 @@ QString getCreditsHtml() stream << "

" << QObject::tr("With thanks to", "About Credits") << "

\n"; stream << QString("

Boba %1

\n").arg(getWebsite("https://bobaonline.neocities.org/")); - stream << QString("

Davi Rafael %1

\n").arg(getWebsite("https://auti.one/")); + stream << QString("

AutiOne %1

\n").arg(getWebsite("https://auti.one/")); stream << QString("

Fulmine %1

\n").arg(getWebsite("https://fulmine.xyz/")); stream << QString("

ely %1

\n").arg(getGitHub("elyrodso")); stream << QString("

gon sawa %1

\n").arg(getGitHub("gonsawa")); From 42a6bd11515e9dd7fd51d79c015e9a62ea99f925 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 13:17:58 +0200 Subject: [PATCH 127/177] change ZekeZ name Signed-off-by: Trial97 (cherry picked from commit c4cd7cf6c173b7052f31614b4641d2172defa91a) --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index 84bae70d0..a8d60aef1 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -77,7 +77,7 @@ QString getCreditsHtml() stream << QString("

d-513 %1

\n").arg(getGitHub("d-513")); stream << QString("

txtsd %1

\n").arg(getWebsite("https://ihavea.quest")); stream << QString("

timoreo %1

\n").arg(getGitHub("timoreo22")); - stream << QString("

Ezekiel Smith (ZekeSmith) %1

\n").arg(getGitHub("ZekeSmith")); + stream << QString("

ZekeZ %1

\n").arg(getGitHub("ZekeZDev")); stream << QString("

cozyGalvinism %1

\n").arg(getGitHub("cozyGalvinism")); stream << QString("

DioEgizio %1

\n").arg(getGitHub("DioEgizio")); stream << QString("

flowln %1

\n").arg(getGitHub("flowln")); From 9560447c92a5d5c794f9a890134de38839eda81e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 12:06:45 +0200 Subject: [PATCH 128/177] swap search with filter button for modpacks Signed-off-by: Trial97 (cherry picked from commit 61448a61ea400eebd91f97aa07e9419cc2f35823) --- launcher/ui/pages/modplatform/flame/FlamePage.ui | 12 ++++++------ .../ui/pages/modplatform/modrinth/ModrinthPage.ui | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.ui b/launcher/ui/pages/modplatform/flame/FlamePage.ui index b028e7569..cf882ef1c 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.ui +++ b/launcher/ui/pages/modplatform/flame/FlamePage.ui @@ -32,16 +32,16 @@ - - - Search and filter... + + + Filter options - - - Filter + + + Search and filter... diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui index ef44abb52..d6e983929 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.ui @@ -14,16 +14,16 @@ - - - Search and filter... + + + Filter options - - - Filter + + + Search and filter... From 8e4994590bd59bcabca2c0b27e4b064f49d00c31 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:02:13 +0300 Subject: [PATCH 129/177] fix unzipping typo Signed-off-by: Trial97 (cherry picked from commit 685d3c79ac78d7e41ab257de82dc743020189a33) --- launcher/MMCZip.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index dcf3d566f..09dc23f0e 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -577,7 +577,7 @@ auto ExtractZipTask::extractZip() -> ZipResult auto relative_file_name = QDir::fromNativeSeparators(file_name.mid(m_subdirectory.size())); auto original_name = relative_file_name; - setStatus("Unziping: " + relative_file_name); + setStatus("Unzipping: " + relative_file_name); // Fix subdirs/files ending with a / getting transformed into absolute paths if (relative_file_name.startsWith('/')) From 98fe035442edc0efa9b58e9b4924ca05da864f8b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 12:39:26 +0200 Subject: [PATCH 130/177] replace unzipping with unpacking Signed-off-by: Trial97 (cherry picked from commit 9eb1ce3ad7dde0b2ca551b0b281081724e6fd58e) --- launcher/MMCZip.cpp | 8 ++++---- launcher/modplatform/legacy_ftb/PackInstallTask.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 09dc23f0e..b38aca17a 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -378,7 +378,7 @@ std::optional extractDir(QString fileCompressed, QString dir) if (fileInfo.size() == 22) { return QStringList(); } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); ; return std::nullopt; } @@ -395,7 +395,7 @@ std::optional extractDir(QString fileCompressed, QString subdir, QS if (fileInfo.size() == 22) { return QStringList(); } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); ; return std::nullopt; } @@ -412,7 +412,7 @@ bool extractFile(QString fileCompressed, QString file, QString target) if (fileInfo.size() == 22) { return true; } - qWarning() << "Could not open archive for unzipping:" << fileCompressed << "Error:" << zip.getZipError(); + qWarning() << "Could not open archive for unpacking:" << fileCompressed << "Error:" << zip.getZipError(); return false; } return extractRelFile(&zip, file, target); @@ -577,7 +577,7 @@ auto ExtractZipTask::extractZip() -> ZipResult auto relative_file_name = QDir::fromNativeSeparators(file_name.mid(m_subdirectory.size())); auto original_name = relative_file_name; - setStatus("Unzipping: " + relative_file_name); + setStatus("Unpacking: " + relative_file_name); // Fix subdirs/files ending with a / getting transformed into absolute paths if (relative_file_name.startsWith('/')) diff --git a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp index 7157f7f2d..d6252663f 100644 --- a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp @@ -138,7 +138,7 @@ void PackInstallTask::install() if (unzipMcDir.exists()) { // ok, found minecraft dir, move contents to instance dir if (!FS::move(m_stagingPath + "/unzip/minecraft", m_stagingPath + "/minecraft")) { - emitFailed(tr("Failed to move unzipped Minecraft!")); + emitFailed(tr("Failed to move unpacked Minecraft!")); return; } } From 130714a9ab24ce45ad935d7e2ab2a9440b2708fd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 18 Sep 2024 21:01:34 +0300 Subject: [PATCH 131/177] translate standard buttons Signed-off-by: Trial97 (cherry picked from commit bd82737efbb99dfc488d6d073046e5fe62693a9e) --- launcher/ui/dialogs/BlockedModsDialog.cpp | 2 ++ launcher/ui/dialogs/CopyInstanceDialog.cpp | 3 +++ launcher/ui/dialogs/EditAccountDialog.cpp | 4 ++++ launcher/ui/dialogs/ExportInstanceDialog.cpp | 5 +++++ launcher/ui/dialogs/ExportPackDialog.cpp | 3 +++ launcher/ui/dialogs/ExportToModListDialog.cpp | 3 +++ launcher/ui/dialogs/IconPickerDialog.cpp | 3 +++ launcher/ui/dialogs/ImportResourceDialog.cpp | 3 +++ launcher/ui/dialogs/InstallLoaderDialog.cpp | 2 ++ launcher/ui/dialogs/MSALoginDialog.cpp | 2 ++ launcher/ui/dialogs/NewComponentDialog.cpp | 3 +++ launcher/ui/dialogs/NewInstanceDialog.cpp | 3 +++ launcher/ui/dialogs/OfflineLoginDialog.cpp | 3 +++ launcher/ui/dialogs/ProfileSelectDialog.cpp | 4 ++++ launcher/ui/dialogs/ProfileSetupDialog.cpp | 3 +++ launcher/ui/dialogs/ReviewMessageBox.cpp | 3 +++ launcher/ui/dialogs/ScrollMessageBox.cpp | 4 ++++ launcher/ui/dialogs/VersionSelectDialog.cpp | 3 +++ launcher/ui/dialogs/skins/SkinManageDialog.cpp | 3 +++ launcher/ui/java/InstallJavaDialog.cpp | 1 + launcher/ui/pagedialog/PageDialog.cpp | 2 ++ launcher/ui/pages/modplatform/OptionalModDialog.cpp | 3 +++ launcher/ui/pages/modplatform/ResourcePage.cpp | 1 + launcher/updater/prismupdater/UpdaterDialogs.cpp | 4 ++++ 24 files changed, 70 insertions(+) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 5c93053d1..a02f527de 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -51,6 +51,8 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons ui->setupUi(this); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); m_openMissingButton = ui->buttonBox->addButton(tr("Open Missing"), QDialogButtonBox::ActionRole); connect(m_openMissingButton, &QPushButton::clicked, this, [this]() { openAll(true); }); diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 770741a61..e5c2c301b 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -109,6 +109,9 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget* parent) auto HelpButton = ui->buttonBox->button(QDialogButtonBox::Help); connect(HelpButton, &QPushButton::clicked, this, &CopyInstanceDialog::help); + HelpButton->setText(tr("Help")); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } CopyInstanceDialog::~CopyInstanceDialog() diff --git a/launcher/ui/dialogs/EditAccountDialog.cpp b/launcher/ui/dialogs/EditAccountDialog.cpp index 58036fd82..9d0175bbc 100644 --- a/launcher/ui/dialogs/EditAccountDialog.cpp +++ b/launcher/ui/dialogs/EditAccountDialog.cpp @@ -15,6 +15,7 @@ #include "EditAccountDialog.h" #include +#include #include #include "ui_EditAccountDialog.h" @@ -27,6 +28,9 @@ EditAccountDialog::EditAccountDialog(const QString& text, QWidget* parent, int f ui->userTextBox->setEnabled(flags & UsernameField); ui->passTextBox->setEnabled(flags & PasswordField); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } EditAccountDialog::~EditAccountDialog() diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 7e00f18f4..d25cd32b6 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -51,6 +51,8 @@ #include #include #include +#include +#include #include #include #include @@ -84,6 +86,9 @@ ExportInstanceDialog::ExportInstanceDialog(InstancePtr instance, QWidget* parent auto headerView = ui->treeView->header(); headerView->setSectionResizeMode(QHeaderView::ResizeToContents); headerView->setSectionResizeMode(0, QHeaderView::Stretch); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ExportInstanceDialog::~ExportInstanceDialog() diff --git a/launcher/ui/dialogs/ExportPackDialog.cpp b/launcher/ui/dialogs/ExportPackDialog.cpp index 0278c6cb0..ed79a741f 100644 --- a/launcher/ui/dialogs/ExportPackDialog.cpp +++ b/launcher/ui/dialogs/ExportPackDialog.cpp @@ -103,6 +103,9 @@ ExportPackDialog::ExportPackDialog(InstancePtr instance, QWidget* parent, ModPla QHeaderView* headerView = ui->files->header(); headerView->setSectionResizeMode(QHeaderView::ResizeToContents); headerView->setSectionResizeMode(0, QHeaderView::Stretch); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ExportPackDialog::~ExportPackDialog() diff --git a/launcher/ui/dialogs/ExportToModListDialog.cpp b/launcher/ui/dialogs/ExportToModListDialog.cpp index 908743ab0..c2ba68f7a 100644 --- a/launcher/ui/dialogs/ExportToModListDialog.cpp +++ b/launcher/ui/dialogs/ExportToModListDialog.cpp @@ -64,6 +64,9 @@ ExportToModListDialog::ExportToModListDialog(QString name, QList mods, QWi this->ui->finalText->selectAll(); this->ui->finalText->copy(); }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save")); triggerImp(); } diff --git a/launcher/ui/dialogs/IconPickerDialog.cpp b/launcher/ui/dialogs/IconPickerDialog.cpp index a196fd587..a7b44eab0 100644 --- a/launcher/ui/dialogs/IconPickerDialog.cpp +++ b/launcher/ui/dialogs/IconPickerDialog.cpp @@ -63,6 +63,9 @@ IconPickerDialog::IconPickerDialog(QWidget* parent) : QDialog(parent), ui(new Ui auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole); buttonRemove = ui->buttonBox->addButton(tr("Remove Icon"), QDialogButtonBox::ResetRole); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + connect(buttonAdd, SIGNAL(clicked(bool)), SLOT(addNewIcon())); connect(buttonRemove, SIGNAL(clicked(bool)), SLOT(removeSelectedIcon())); diff --git a/launcher/ui/dialogs/ImportResourceDialog.cpp b/launcher/ui/dialogs/ImportResourceDialog.cpp index 84b692730..e3a1e9a6c 100644 --- a/launcher/ui/dialogs/ImportResourceDialog.cpp +++ b/launcher/ui/dialogs/ImportResourceDialog.cpp @@ -45,6 +45,9 @@ ImportResourceDialog::ImportResourceDialog(QString file_path, PackedResourceType ui->label->setText( tr("Choose the instance you would like to import this %1 to.").arg(ResourceUtils::getPackedTypeName(m_resource_type))); ui->label_file_path->setText(tr("File: %1").arg(m_file_path)); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } void ImportResourceDialog::activated(QModelIndex index) diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp index 8e5463b31..7082125f2 100644 --- a/launcher/ui/dialogs/InstallLoaderDialog.cpp +++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp @@ -104,6 +104,8 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr profile, c buttons->setOrientation(Qt::Horizontal); buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + buttons->button(QDialogButtonBox::Ok)->setText(tr("Ok")); + buttons->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); buttonLayout->addWidget(buttons); diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 4e38b4187..2f6c6d9b2 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -68,6 +68,8 @@ MSALoginDialog::MSALoginDialog(QWidget* parent) : QDialog(parent), ui(new Ui::MS } } }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); } int MSALoginDialog::exec() diff --git a/launcher/ui/dialogs/NewComponentDialog.cpp b/launcher/ui/dialogs/NewComponentDialog.cpp index b47b85ff1..b5f8ff889 100644 --- a/launcher/ui/dialogs/NewComponentDialog.cpp +++ b/launcher/ui/dialogs/NewComponentDialog.cpp @@ -68,6 +68,9 @@ NewComponentDialog::NewComponentDialog(const QString& initialName, const QString ui->nameTextBox->setFocus(); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + originalPlaceholderText = ui->uidTextBox->placeholderText(); updateDialogState(); } diff --git a/launcher/ui/dialogs/NewInstanceDialog.cpp b/launcher/ui/dialogs/NewInstanceDialog.cpp index f16c50860..d9ea0aafb 100644 --- a/launcher/ui/dialogs/NewInstanceDialog.cpp +++ b/launcher/ui/dialogs/NewInstanceDialog.cpp @@ -109,16 +109,19 @@ NewInstanceDialog::NewInstanceDialog(const QString& initialGroup, auto OkButton = m_buttons->button(QDialogButtonBox::Ok); OkButton->setDefault(true); OkButton->setAutoDefault(true); + OkButton->setText(tr("OK")); connect(OkButton, &QPushButton::clicked, this, &NewInstanceDialog::accept); auto CancelButton = m_buttons->button(QDialogButtonBox::Cancel); CancelButton->setDefault(false); CancelButton->setAutoDefault(false); + CancelButton->setText(tr("Cancel")); connect(CancelButton, &QPushButton::clicked, this, &NewInstanceDialog::reject); auto HelpButton = m_buttons->button(QDialogButtonBox::Help); HelpButton->setDefault(false); HelpButton->setAutoDefault(false); + HelpButton->setText(tr("Help")); connect(HelpButton, &QPushButton::clicked, m_container, &PageContainer::help); if (!url.isEmpty()) { diff --git a/launcher/ui/dialogs/OfflineLoginDialog.cpp b/launcher/ui/dialogs/OfflineLoginDialog.cpp index b9d1c2915..d8fbc04fd 100644 --- a/launcher/ui/dialogs/OfflineLoginDialog.cpp +++ b/launcher/ui/dialogs/OfflineLoginDialog.cpp @@ -9,6 +9,9 @@ OfflineLoginDialog::OfflineLoginDialog(QWidget* parent) : QDialog(parent), ui(ne ui->progressBar->setVisible(false); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } diff --git a/launcher/ui/dialogs/ProfileSelectDialog.cpp b/launcher/ui/dialogs/ProfileSelectDialog.cpp index fe03e1b6b..95bdf99a9 100644 --- a/launcher/ui/dialogs/ProfileSelectDialog.cpp +++ b/launcher/ui/dialogs/ProfileSelectDialog.cpp @@ -18,6 +18,7 @@ #include #include +#include #include "Application.h" @@ -70,6 +71,9 @@ ProfileSelectDialog::ProfileSelectDialog(const QString& message, int flags, QWid ui->listView->setCurrentIndex(ui->listView->model()->index(0, 0)); connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), SLOT(on_buttonBox_accepted())); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ProfileSelectDialog::~ProfileSelectDialog() diff --git a/launcher/ui/dialogs/ProfileSetupDialog.cpp b/launcher/ui/dialogs/ProfileSetupDialog.cpp index 385094e23..a6512784f 100644 --- a/launcher/ui/dialogs/ProfileSetupDialog.cpp +++ b/launcher/ui/dialogs/ProfileSetupDialog.cpp @@ -70,6 +70,9 @@ ProfileSetupDialog::ProfileSetupDialog(MinecraftAccountPtr accountToSetup, QWidg connect(&checkStartTimer, &QTimer::timeout, this, &ProfileSetupDialog::startCheck); setNameStatus(NameStatus::NotSet, QString()); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ProfileSetupDialog::~ProfileSetupDialog() diff --git a/launcher/ui/dialogs/ReviewMessageBox.cpp b/launcher/ui/dialogs/ReviewMessageBox.cpp index 66c36d400..fa79e4ed1 100644 --- a/launcher/ui/dialogs/ReviewMessageBox.cpp +++ b/launcher/ui/dialogs/ReviewMessageBox.cpp @@ -20,6 +20,9 @@ ReviewMessageBox::ReviewMessageBox(QWidget* parent, [[maybe_unused]] QString con connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ReviewMessageBox::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ReviewMessageBox::reject); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ReviewMessageBox::~ReviewMessageBox() diff --git a/launcher/ui/dialogs/ScrollMessageBox.cpp b/launcher/ui/dialogs/ScrollMessageBox.cpp index c04d87842..1cfb848f4 100644 --- a/launcher/ui/dialogs/ScrollMessageBox.cpp +++ b/launcher/ui/dialogs/ScrollMessageBox.cpp @@ -1,4 +1,5 @@ #include "ScrollMessageBox.h" +#include #include "ui_ScrollMessageBox.h" ScrollMessageBox::ScrollMessageBox(QWidget* parent, const QString& title, const QString& text, const QString& body) @@ -8,6 +9,9 @@ ScrollMessageBox::ScrollMessageBox(QWidget* parent, const QString& title, const this->setWindowTitle(title); ui->label->setText(text); ui->textBrowser->setText(body); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } ScrollMessageBox::~ScrollMessageBox() diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp index 876d7470e..30377288b 100644 --- a/launcher/ui/dialogs/VersionSelectDialog.cpp +++ b/launcher/ui/dialogs/VersionSelectDialog.cpp @@ -68,6 +68,9 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList* vlist, QString title, m_buttonBox->setObjectName(QStringLiteral("buttonBox")); m_buttonBox->setOrientation(Qt::Horizontal); m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); + + m_buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Ok")); + m_buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); m_horizontalLayout->addWidget(m_buttonBox); m_verticalLayout->addLayout(m_horizontalLayout); diff --git a/launcher/ui/dialogs/skins/SkinManageDialog.cpp b/launcher/ui/dialogs/skins/SkinManageDialog.cpp index 65840eb08..f112e1acf 100644 --- a/launcher/ui/dialogs/skins/SkinManageDialog.cpp +++ b/launcher/ui/dialogs/skins/SkinManageDialog.cpp @@ -93,6 +93,9 @@ SkinManageDialog::SkinManageDialog(QWidget* parent, MinecraftAccountPtr acct) setupCapes(); ui->listView->setCurrentIndex(m_list.index(m_list.getSelectedAccountSkin())); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } SkinManageDialog::~SkinManageDialog() diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index 0ece3220b..d38670d05 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -212,6 +212,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget buttons->setOrientation(Qt::Horizontal); buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); buttons->button(QDialogButtonBox::Ok)->setText(tr("Download")); + buttons->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); buttonLayout->addWidget(buttons); diff --git a/launcher/ui/pagedialog/PageDialog.cpp b/launcher/ui/pagedialog/PageDialog.cpp index 6514217cd..d211cb4d3 100644 --- a/launcher/ui/pagedialog/PageDialog.cpp +++ b/launcher/ui/pagedialog/PageDialog.cpp @@ -39,6 +39,8 @@ PageDialog::PageDialog(BasePageProvider* pageProvider, QString defaultId, QWidge QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Help | QDialogButtonBox::Close); buttons->button(QDialogButtonBox::Close)->setDefault(true); + buttons->button(QDialogButtonBox::Close)->setText(tr("Close")); + buttons->button(QDialogButtonBox::Help)->setText(tr("Help")); buttons->setContentsMargins(6, 0, 6, 0); m_container->addButtons(buttons); diff --git a/launcher/ui/pages/modplatform/OptionalModDialog.cpp b/launcher/ui/pages/modplatform/OptionalModDialog.cpp index fc1c8b3cb..5dc53d9dc 100644 --- a/launcher/ui/pages/modplatform/OptionalModDialog.cpp +++ b/launcher/ui/pages/modplatform/OptionalModDialog.cpp @@ -43,6 +43,9 @@ OptionalModDialog::OptionalModDialog(QWidget* parent, const QStringList& mods) : else item->setCheckState(Qt::Checked); }); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } OptionalModDialog::~OptionalModDialog() diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index dea28d6d5..817079439 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -465,6 +465,7 @@ void ResourcePage::openProject(QVariant projectID) auto cancelBtn = buttonBox->button(QDialogButtonBox::Cancel); cancelBtn->setDefault(false); cancelBtn->setAutoDefault(false); + cancelBtn->setText(tr("Cancel")); connect(okBtn, &QPushButton::clicked, this, [this] { onResourceSelected(); diff --git a/launcher/updater/prismupdater/UpdaterDialogs.cpp b/launcher/updater/prismupdater/UpdaterDialogs.cpp index 06dc161b1..eab3e6bbb 100644 --- a/launcher/updater/prismupdater/UpdaterDialogs.cpp +++ b/launcher/updater/prismupdater/UpdaterDialogs.cpp @@ -24,6 +24,7 @@ #include "ui_SelectReleaseDialog.h" +#include #include #include "Markdown.h" #include "StringUtils.h" @@ -55,6 +56,9 @@ SelectReleaseDialog::SelectReleaseDialog(const Version& current_version, const Q connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SelectReleaseDialog::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &SelectReleaseDialog::reject); + + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); } SelectReleaseDialog::~SelectReleaseDialog() From 3d55236fdf14cbe0c39b922ed7ef21e831a3688e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 25 Oct 2024 01:05:58 +0300 Subject: [PATCH 132/177] add extra protection against empty download link Signed-off-by: Trial97 (cherry picked from commit 8daa1219a508ddb37070c01046c78b731a277887) --- launcher/ui/pages/modplatform/ResourcePage.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 817079439..68a12c479 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -39,6 +39,7 @@ #include "ResourcePage.h" #include "modplatform/ModIndex.h" +#include "ui/dialogs/CustomMessageBox.h" #include "ui_ResourcePage.h" #include @@ -324,9 +325,9 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI updateUi(); } -void ResourcePage::onVersionSelectionChanged(int index) +void ResourcePage::onVersionSelectionChanged(int) { - m_selected_version_index = index; + m_selected_version_index = m_ui->versionSelectionBox->currentData().toInt(); updateSelectionButton(); } @@ -358,10 +359,18 @@ void ResourcePage::onResourceSelected() return; auto current_pack = getCurrentPack(); - if (!current_pack || !current_pack->versionsLoaded) + if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selected_version_index) return; auto& version = current_pack->versions[m_selected_version_index]; + if (version.downloadUrl.isNull()) { + CustomMessageBox::selectable(this, tr("How?"), + "You managed to select a resource that doesn't have a download link. Because of this missing " + "information prism will not try to download it.", + QMessageBox::Warning) + ->show(); + return; + } if (version.is_currently_selected) removeResourceFromDialog(current_pack->name); else From 1d9c97803a51ac1a4d44fe23adf129388688dde9 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:05:30 +0200 Subject: [PATCH 133/177] rename snake_case to camelCase Signed-off-by: Trial97 (cherry picked from commit 44894a29b1784cfa8a04807c17d21169230ff922) --- launcher/ui/pages/modplatform/ModPage.cpp | 2 +- .../ui/pages/modplatform/ResourcePackPage.cpp | 2 +- .../ui/pages/modplatform/ResourcePage.cpp | 52 +++++++++---------- launcher/ui/pages/modplatform/ResourcePage.h | 14 ++--- .../ui/pages/modplatform/ShaderPackPage.cpp | 2 +- .../modplatform/flame/FlameResourcePages.cpp | 2 +- .../modrinth/ModrinthResourcePages.cpp | 2 +- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index c9817cdf7..f0cc2df54 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -99,7 +99,7 @@ void ModPage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), changed); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ModPage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/ResourcePackPage.cpp b/launcher/ui/pages/modplatform/ResourcePackPage.cpp index 849ea1111..99039476e 100644 --- a/launcher/ui/pages/modplatform/ResourcePackPage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePackPage.cpp @@ -30,7 +30,7 @@ void ResourcePackResourcePage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt()); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ResourcePackResourcePage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 68a12c479..1fcc2bdd8 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -55,7 +55,7 @@ namespace ResourceDownload { ResourcePage::ResourcePage(ResourceDownloadDialog* parent, BaseInstance& base_instance) - : QWidget(parent), m_base_instance(base_instance), m_ui(new Ui::ResourcePage), m_parent_dialog(parent), m_fetch_progress(this, false) + : QWidget(parent), m_baseInstance(base_instance), m_ui(new Ui::ResourcePage), m_parentDialog(parent), m_fetchProgress(this, false) { m_ui->setupUi(this); @@ -64,18 +64,18 @@ ResourcePage::ResourcePage(ResourceDownloadDialog* parent, BaseInstance& base_in m_ui->versionSelectionBox->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); m_ui->versionSelectionBox->view()->parentWidget()->setMaximumHeight(300); - m_search_timer.setTimerType(Qt::TimerType::CoarseTimer); - m_search_timer.setSingleShot(true); + m_searchTimer.setTimerType(Qt::TimerType::CoarseTimer); + m_searchTimer.setSingleShot(true); - connect(&m_search_timer, &QTimer::timeout, this, &ResourcePage::triggerSearch); + connect(&m_searchTimer, &QTimer::timeout, this, &ResourcePage::triggerSearch); // hide progress bar to prevent weird artifact - m_fetch_progress.hide(); - m_fetch_progress.hideIfInactive(true); - m_fetch_progress.setFixedHeight(24); - m_fetch_progress.progressFormat(""); + m_fetchProgress.hide(); + m_fetchProgress.hideIfInactive(true); + m_fetchProgress.setFixedHeight(24); + m_fetchProgress.progressFormat(""); - m_ui->verticalLayout->insertWidget(1, &m_fetch_progress); + m_ui->verticalLayout->insertWidget(1, &m_fetchProgress); m_ui->packView->setItemDelegate(new ProjectItemDelegate(this)); m_ui->packView->installEventFilter(this); @@ -121,10 +121,10 @@ auto ResourcePage::eventFilter(QObject* watched, QEvent* event) -> bool keyEvent->accept(); return true; } else { - if (m_search_timer.isActive()) - m_search_timer.stop(); + if (m_searchTimer.isActive()) + m_searchTimer.stop(); - m_search_timer.start(350); + m_searchTimer.start(350); } } else if (watched == m_ui->packView) { if (keyEvent->key() == Qt::Key_Return) { @@ -248,7 +248,7 @@ void ResourcePage::updateUi() void ResourcePage::updateSelectionButton() { - if (!isOpened || m_selected_version_index < 0) { + if (!isOpened || m_selectedVersionIndex < 0) { m_ui->resourceSelectionButton->setEnabled(false); return; } @@ -258,7 +258,7 @@ void ResourcePage::updateSelectionButton() if (current_pack->versionsLoaded && current_pack->versions.empty()) { m_ui->resourceSelectionButton->setEnabled(false); qWarning() << tr("No version available for the selected pack"); - } else if (!current_pack->isVersionSelected(m_selected_version_index)) + } else if (!current_pack->isVersionSelected(m_selectedVersionIndex)) m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString())); else m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); @@ -327,18 +327,18 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI void ResourcePage::onVersionSelectionChanged(int) { - m_selected_version_index = m_ui->versionSelectionBox->currentData().toInt(); + m_selectedVersionIndex = m_ui->versionSelectionBox->currentData().toInt(); updateSelectionButton(); } void ResourcePage::addResourceToDialog(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion& version) { - m_parent_dialog->addResource(pack, version); + m_parentDialog->addResource(pack, version); } void ResourcePage::removeResourceFromDialog(const QString& pack_name) { - m_parent_dialog->removeResource(pack_name); + m_parentDialog->removeResource(pack_name); } void ResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pack, @@ -355,14 +355,14 @@ void ResourcePage::removeResourceFromPage(const QString& name) void ResourcePage::onResourceSelected() { - if (m_selected_version_index < 0) + if (m_selectedVersionIndex < 0) return; auto current_pack = getCurrentPack(); - if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selected_version_index) + if (!current_pack || !current_pack->versionsLoaded || current_pack->versions.size() < m_selectedVersionIndex) return; - auto& version = current_pack->versions[m_selected_version_index]; + auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { CustomMessageBox::selectable(this, tr("How?"), "You managed to select a resource that doesn't have a download link. Because of this missing " @@ -409,14 +409,14 @@ void ResourcePage::openUrl(const QUrl& url) } } - if (!page.isNull() && !m_do_not_jump_to_mod) { + if (!page.isNull() && !m_doNotJumpToMod) { const QString slug = match.captured(1); // ensure the user isn't opening the same mod if (auto current_pack = getCurrentPack(); current_pack && slug != current_pack->slug) { - m_parent_dialog->selectPage(page); + m_parentDialog->selectPage(page); - auto newPage = m_parent_dialog->selectedPage(); + auto newPage = m_parentDialog->selectedPage(); QLineEdit* searchEdit = newPage->m_ui->searchEdit; auto model = newPage->m_model; @@ -460,7 +460,7 @@ void ResourcePage::openProject(QVariant projectID) m_ui->resourceFilterButton->hide(); m_ui->packView->hide(); m_ui->resourceSelectionButton->hide(); - m_do_not_jump_to_mod = true; + m_doNotJumpToMod = true; auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); @@ -478,10 +478,10 @@ void ResourcePage::openProject(QVariant projectID) connect(okBtn, &QPushButton::clicked, this, [this] { onResourceSelected(); - m_parent_dialog->accept(); + m_parentDialog->accept(); }); - connect(cancelBtn, &QPushButton::clicked, m_parent_dialog, &ResourceDownloadDialog::reject); + connect(cancelBtn, &QPushButton::clicked, m_parentDialog, &ResourceDownloadDialog::reject); m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); auto jump = [this, okBtn] { diff --git a/launcher/ui/pages/modplatform/ResourcePage.h b/launcher/ui/pages/modplatform/ResourcePage.h index b625240eb..09c512df4 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.h +++ b/launcher/ui/pages/modplatform/ResourcePage.h @@ -62,7 +62,7 @@ class ResourcePage : public QWidget, public BasePage { [[nodiscard]] bool setCurrentPack(ModPlatform::IndexedPack::Ptr); [[nodiscard]] auto getCurrentPack() const -> ModPlatform::IndexedPack::Ptr; - [[nodiscard]] auto getDialog() const -> const ResourceDownloadDialog* { return m_parent_dialog; } + [[nodiscard]] auto getDialog() const -> const ResourceDownloadDialog* { return m_parentDialog; } [[nodiscard]] auto getModel() const -> ResourceModel* { return m_model; } protected: @@ -99,22 +99,22 @@ class ResourcePage : public QWidget, public BasePage { virtual void openUrl(const QUrl&); public: - BaseInstance& m_base_instance; + BaseInstance& m_baseInstance; protected: Ui::ResourcePage* m_ui; - ResourceDownloadDialog* m_parent_dialog = nullptr; + ResourceDownloadDialog* m_parentDialog = nullptr; ResourceModel* m_model = nullptr; - int m_selected_version_index = -1; + int m_selectedVersionIndex = -1; - ProgressWidget m_fetch_progress; + ProgressWidget m_fetchProgress; // Used to do instant searching with a delay to cache quick changes - QTimer m_search_timer; + QTimer m_searchTimer; - bool m_do_not_jump_to_mod = false; + bool m_doNotJumpToMod = false; }; } // namespace ResourceDownload diff --git a/launcher/ui/pages/modplatform/ShaderPackPage.cpp b/launcher/ui/pages/modplatform/ShaderPackPage.cpp index ebd8d4ea2..cedf985fb 100644 --- a/launcher/ui/pages/modplatform/ShaderPackPage.cpp +++ b/launcher/ui/pages/modplatform/ShaderPackPage.cpp @@ -31,7 +31,7 @@ void ShaderPackResourcePage::triggerSearch() updateSelectionButton(); static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt()); - m_fetch_progress.watch(m_model->activeSearchJob().get()); + m_fetchProgress.watch(m_model->activeSearchJob().get()); } QMap ShaderPackResourcePage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp index ce8c03fa1..4e01f3a65 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp @@ -209,7 +209,7 @@ auto FlameShaderPackPage::shouldDisplay() const -> bool unique_qobject_ptr FlameModPage::createFilterWidget() { - return ModFilterWidget::create(&static_cast(m_base_instance), false, this); + return ModFilterWidget::create(&static_cast(m_baseInstance), false, this); } void FlameModPage::prepareProviderCategories() diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp index 85dcde471..4ee620677 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp @@ -144,7 +144,7 @@ auto ModrinthShaderPackPage::shouldDisplay() const -> bool unique_qobject_ptr ModrinthModPage::createFilterWidget() { - return ModFilterWidget::create(&static_cast(m_base_instance), true, this); + return ModFilterWidget::create(&static_cast(m_baseInstance), true, this); } void ModrinthModPage::prepareProviderCategories() From 1e696328bb89ce363e36d3c460b9ec05709b8644 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 03:05:56 +0200 Subject: [PATCH 134/177] fix #3001 Signed-off-by: Trial97 (cherry picked from commit b593ff09e9c4b5fa30ca082eea4cd69f12a286e5) --- launcher/ui/pages/modplatform/ResourcePage.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 1fcc2bdd8..80258946c 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -484,11 +484,13 @@ void ResourcePage::openProject(QVariant projectID) connect(cancelBtn, &QPushButton::clicked, m_parentDialog, &ResourceDownloadDialog::reject); m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); - auto jump = [this, okBtn] { + connect(m_ui->versionSelectionBox, QOverload::of(&QComboBox::currentIndexChanged), this, + [this, okBtn] { okBtn->setEnabled(m_ui->versionSelectionBox->currentData().toInt() >= 0); }); + + auto jump = [this] { for (int row = 0; row < m_model->rowCount({}); row++) { const QModelIndex index = m_model->index(row); m_ui->packView->setCurrentIndex(index); - okBtn->setEnabled(true); return; } m_ui->packDescription->setText(tr("The resource was not found")); From c3cf5d31da70ed980ebab0cbf0a2216156dc835c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 12:54:21 +0200 Subject: [PATCH 135/177] replace currentData with itemData on QComboBox::currentIndexChanged slots Signed-off-by: Trial97 (cherry picked from commit 0cafac84ac6328fefb8992de2c6a2385b1c0053c) --- launcher/ui/pages/modplatform/ResourcePage.cpp | 14 +++++++------- launcher/ui/pages/modplatform/flame/FlamePage.cpp | 2 +- .../ui/pages/modplatform/modrinth/ModrinthPage.cpp | 2 +- launcher/ui/widgets/ThemeCustomizationWidget.cpp | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 80258946c..2c2f97b77 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -325,9 +325,9 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI updateUi(); } -void ResourcePage::onVersionSelectionChanged(int) +void ResourcePage::onVersionSelectionChanged(int index) { - m_selectedVersionIndex = m_ui->versionSelectionBox->currentData().toInt(); + m_selectedVersionIndex = m_ui->versionSelectionBox->itemData(index).toInt(); updateSelectionButton(); } @@ -364,10 +364,10 @@ void ResourcePage::onResourceSelected() auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { - CustomMessageBox::selectable(this, tr("How?"), - "You managed to select a resource that doesn't have a download link. Because of this missing " - "information prism will not try to download it.", - QMessageBox::Warning) + CustomMessageBox::selectable( + this, tr("Download Link Missing"), + tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."), + QMessageBox::Warning) ->show(); return; } @@ -485,7 +485,7 @@ void ResourcePage::openProject(QVariant projectID) m_ui->gridLayout_4->addWidget(buttonBox, 1, 2); connect(m_ui->versionSelectionBox, QOverload::of(&QComboBox::currentIndexChanged), this, - [this, okBtn] { okBtn->setEnabled(m_ui->versionSelectionBox->currentData().toInt() >= 0); }); + [this, okBtn](int index) { okBtn->setEnabled(m_ui->versionSelectionBox->itemData(index).toInt() >= 0); }); auto jump = [this] { for (int row = 0; row < m_model->rowCount({}); row++) { diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index 9abf4a9c6..de6b3d633 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -273,7 +273,7 @@ void FlamePage::suggestCurrent() void FlamePage::onVersionSelectionChanged(int index) { bool is_blocked = false; - ui->versionSelectionBox->currentData().toInt(&is_blocked); + ui->versionSelectionBox->itemData(index).toInt(&is_blocked); if (index == -1 || is_blocked) { m_selected_version_index = -1; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index 8803c6dd9..7d70abec4 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -375,7 +375,7 @@ void ModrinthPage::onVersionSelectionChanged(int index) selectedVersion = ""; return; } - selectedVersion = ui->versionSelectionBox->currentData().toString(); + selectedVersion = ui->versionSelectionBox->itemData(index).toString(); suggestCurrent(); } diff --git a/launcher/ui/widgets/ThemeCustomizationWidget.cpp b/launcher/ui/widgets/ThemeCustomizationWidget.cpp index 7a54bd390..097678b8d 100644 --- a/launcher/ui/widgets/ThemeCustomizationWidget.cpp +++ b/launcher/ui/widgets/ThemeCustomizationWidget.cpp @@ -87,7 +87,7 @@ void ThemeCustomizationWidget::applyIconTheme(int index) { auto settings = APPLICATION->settings(); auto originalIconTheme = settings->get("IconTheme").toString(); - auto newIconTheme = ui->iconsComboBox->currentData().toString(); + auto newIconTheme = ui->iconsComboBox->itemData(index).toString(); if (originalIconTheme != newIconTheme) { settings->set("IconTheme", newIconTheme); APPLICATION->themeManager()->applyCurrentlySelectedTheme(); @@ -100,7 +100,7 @@ void ThemeCustomizationWidget::applyWidgetTheme(int index) { auto settings = APPLICATION->settings(); auto originalAppTheme = settings->get("ApplicationTheme").toString(); - auto newAppTheme = ui->widgetStyleComboBox->currentData().toString(); + auto newAppTheme = ui->widgetStyleComboBox->itemData(index).toString(); if (originalAppTheme != newAppTheme) { settings->set("ApplicationTheme", newAppTheme); APPLICATION->themeManager()->applyCurrentlySelectedTheme(); @@ -113,7 +113,7 @@ void ThemeCustomizationWidget::applyCatTheme(int index) { auto settings = APPLICATION->settings(); auto originalCat = settings->get("BackgroundCat").toString(); - auto newCat = ui->backgroundCatComboBox->currentData().toString(); + auto newCat = ui->backgroundCatComboBox->itemData(index).toString(); if (originalCat != newCat) { settings->set("BackgroundCat", newCat); } From db32b2ad992a534b8824d905339ba15d3bf371f8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 19:19:06 +0200 Subject: [PATCH 136/177] remove message box Signed-off-by: Trial97 (cherry picked from commit 9cdda4377b0090a035e286a86fd78f126f995356) --- launcher/ui/pages/modplatform/ResourcePage.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 2c2f97b77..77cbe29a3 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -364,11 +364,7 @@ void ResourcePage::onResourceSelected() auto& version = current_pack->versions[m_selectedVersionIndex]; if (version.downloadUrl.isNull()) { - CustomMessageBox::selectable( - this, tr("Download Link Missing"), - tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."), - QMessageBox::Warning) - ->show(); + qCritical() << tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."); return; } if (version.is_currently_selected) From 63a6f823fd9a35c749f061b26f53d5b0623f50cf Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 22:27:40 +0200 Subject: [PATCH 137/177] add qassert Signed-off-by: Trial97 (cherry picked from commit 94f65f8727bfd12cc50eb8b62d52bca308cef9b5) --- launcher/ui/pages/modplatform/ResourcePage.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 77cbe29a3..766070f20 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -363,10 +363,7 @@ void ResourcePage::onResourceSelected() return; auto& version = current_pack->versions[m_selectedVersionIndex]; - if (version.downloadUrl.isNull()) { - qCritical() << tr("It looks like the resource you selected doesn't have a download link, so Prism won't attempt to download it."); - return; - } + Q_ASSERT(!version.downloadUrl.isNull()); if (version.is_currently_selected) removeResourceFromDialog(current_pack->name); else From 698a838b56d47a6be806eb92107e2ae617583d9f Mon Sep 17 00:00:00 2001 From: Ben Westover Date: Tue, 29 Oct 2024 18:20:00 +0000 Subject: [PATCH 138/177] Shorten metainfo.xml app summary Signed-off-by: Ben Westover (cherry picked from commit fd109c47401c755e35da9c2884e9b38532bed56c) --- program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in index a482f0e38..3c542c060 100644 --- a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in +++ b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in @@ -4,7 +4,7 @@ org.prismlauncher.PrismLauncher.desktop Prism Launcher Prism Launcher Contributors - A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once + Custom Minecraft Launcher to easily manage multiple Minecraft installations at once CC0-1.0 GPL-3.0-only https://prismlauncher.org/ From d105d76f2af754d71104f0d05c4911b57b71fc00 Mon Sep 17 00:00:00 2001 From: Ben Westover Date: Tue, 29 Oct 2024 18:24:19 +0000 Subject: [PATCH 139/177] Fix some typos Signed-off-by: Ben Westover (cherry picked from commit f6511c601e1fd63a864f1681beef0f85adfe6f7e) --- .../auth/steps/MSADeviceCodeStep.cpp | 20 +++++++++---------- .../minecraft/auth/steps/MSADeviceCodeStep.h | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp b/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp index c283b153e..38ff90a47 100644 --- a/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp +++ b/launcher/minecraft/auth/steps/MSADeviceCodeStep.cpp @@ -74,12 +74,12 @@ void MSADeviceCodeStep::perform() m_task->setAskRetry(false); m_task->addNetAction(m_request); - connect(m_task.get(), &Task::finished, this, &MSADeviceCodeStep::deviceAutorizationFinished); + connect(m_task.get(), &Task::finished, this, &MSADeviceCodeStep::deviceAuthorizationFinished); m_task->start(); } -struct DeviceAutorizationResponse { +struct DeviceAuthorizationResponse { QString device_code; QString user_code; QString verification_uri; @@ -90,17 +90,17 @@ struct DeviceAutorizationResponse { QString error_description; }; -DeviceAutorizationResponse parseDeviceAutorizationResponse(const QByteArray& data) +DeviceAuthorizationResponse parseDeviceAuthorizationResponse(const QByteArray& data) { QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); if (err.error != QJsonParseError::NoError) { - qWarning() << "Failed to parse device autorization response due to err:" << err.errorString(); + qWarning() << "Failed to parse device authorization response due to err:" << err.errorString(); return {}; } if (!doc.isObject()) { - qWarning() << "Device autorization response is not an object"; + qWarning() << "Device authorization response is not an object"; return {}; } auto obj = doc.object(); @@ -111,9 +111,9 @@ DeviceAutorizationResponse parseDeviceAutorizationResponse(const QByteArray& dat }; } -void MSADeviceCodeStep::deviceAutorizationFinished() +void MSADeviceCodeStep::deviceAuthorizationFinished() { - auto rsp = parseDeviceAutorizationResponse(*m_response); + auto rsp = parseDeviceAuthorizationResponse(*m_response); if (!rsp.error.isEmpty() || !rsp.error_description.isEmpty()) { qWarning() << "Device authorization failed:" << rsp.error; emit finished(AccountTaskState::STATE_FAILED_HARD, @@ -208,12 +208,12 @@ AuthenticationResponse parseAuthenticationResponse(const QByteArray& data) QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); if (err.error != QJsonParseError::NoError) { - qWarning() << "Failed to parse device autorization response due to err:" << err.errorString(); + qWarning() << "Failed to parse device authorization response due to err:" << err.errorString(); return {}; } if (!doc.isObject()) { - qWarning() << "Device autorization response is not an object"; + qWarning() << "Device authorization response is not an object"; return {}; } auto obj = doc.object(); @@ -274,4 +274,4 @@ void MSADeviceCodeStep::authenticationFinished() m_data->msaToken.refresh_token = rsp.refresh_token; m_data->msaToken.token = rsp.access_token; emit finished(AccountTaskState::STATE_WORKING, tr("Got")); -} \ No newline at end of file +} diff --git a/launcher/minecraft/auth/steps/MSADeviceCodeStep.h b/launcher/minecraft/auth/steps/MSADeviceCodeStep.h index 616008def..7f755563f 100644 --- a/launcher/minecraft/auth/steps/MSADeviceCodeStep.h +++ b/launcher/minecraft/auth/steps/MSADeviceCodeStep.h @@ -58,7 +58,7 @@ class MSADeviceCodeStep : public AuthStep { void authorizeWithBrowser(QString url, QString code, int expiresIn); private slots: - void deviceAutorizationFinished(); + void deviceAuthorizationFinished(); void startPoolTimer(); void authenticateUser(); void authenticationFinished(); diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index d38670d05..dc43ea4c9 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -132,9 +132,9 @@ class InstallJavaPage : public QWidget, public BasePage { m_recommended_majors = majors; recommendedFilterChanged(); } - void setRecomend(bool recomend) + void setRecommend(bool recommend) { - m_recommend = recomend; + m_recommend = recommend; recommendedFilterChanged(); } void recommendedFilterChanged() @@ -202,7 +202,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget recommendedCheckBox->setCheckState(Qt::CheckState::Checked); connect(recommendedCheckBox, &QCheckBox::stateChanged, this, [this](int state) { for (BasePage* page : container->getPages()) { - pageCast(page)->setRecomend(state == Qt::Checked); + pageCast(page)->setRecommend(state == Qt::Checked); } }); @@ -261,7 +261,7 @@ InstallDialog::InstallDialog(const QString& uid, BaseInstance* instance, QWidget container->selectPage(page->id()); auto cast = pageCast(page); - cast->setRecomend(true); + cast->setRecommend(true); connect(cast, &InstallJavaPage::selectionChanged, this, [this, cast] { validate(cast); }); if (!recommendedJavas.isEmpty()) { cast->setRecommendedMajors(recommendedJavas); @@ -344,4 +344,4 @@ void InstallDialog::done(int result) } // namespace Java -#include "InstallJavaDialog.moc" \ No newline at end of file +#include "InstallJavaDialog.moc" From dd8dec8be8c9c12f659c89a13746e4e52d0d0aa7 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 30 Oct 2024 17:15:42 +0200 Subject: [PATCH 140/177] fix macos system detection Signed-off-by: Trial97 (cherry picked from commit 14c95b9d376975144faddc33e7154cca86621804) --- launcher/SysInfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/SysInfo.cpp b/launcher/SysInfo.cpp index 0dfa74de7..cfcf63805 100644 --- a/launcher/SysInfo.cpp +++ b/launcher/SysInfo.cpp @@ -81,9 +81,9 @@ QString getSupportedJavaArchitecture() if (arch == "arm64") return "mac-os-arm64"; if (arch.contains("64")) - return "mac-os-64"; + return "mac-os-x64"; if (arch.contains("86")) - return "mac-os-86"; + return "mac-os-x86"; // Unknown, maybe something new, appending arch return "mac-os-" + arch; } else if (sys == "linux") { From d21cda188061778ab678cc69bfaa004b7bf99b59 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 27 Oct 2024 12:36:14 +0200 Subject: [PATCH 141/177] lock m_instanceExtras Signed-off-by: Trial97 (cherry picked from commit 11d4d948aa1a1ba67cee59193eb98a7fdad2d909) --- launcher/Application.cpp | 11 ++++++++++- launcher/Application.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ea749ca4c..b64b9decb 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -48,6 +48,7 @@ #include "net/PasteUpload.h" #include "pathmatcher/MultiMatcher.h" #include "pathmatcher/SimplePrefixMatcher.h" +#include "tasks/Task.h" #include "tools/GenericProfiler.h" #include "ui/InstanceWindow.h" #include "ui/MainWindow.h" @@ -1380,6 +1381,7 @@ bool Application::launch(InstancePtr instance, bool online, bool demo, Minecraft if (m_updateRunning) { qDebug() << "Cannot launch instances while an update is running. Please try again when updates are completed."; } else if (instance->canLaunch()) { + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instance->id()]; auto window = extras.window; if (window) { @@ -1404,7 +1406,7 @@ bool Application::launch(InstancePtr instance, bool online, bool demo, Minecraft connect(controller.get(), &LaunchController::failed, this, &Application::controllerFailed); connect(controller.get(), &LaunchController::aborted, this, [this] { controllerFailed(tr("Aborted")); }); addRunningInstance(); - controller->start(); + QMetaObject::invokeMethod(controller.get(), &Task::start, Qt::QueuedConnection); return true; } else if (instance->isRunning()) { showInstanceWindow(instance, "console"); @@ -1422,9 +1424,11 @@ bool Application::kill(InstancePtr instance) qWarning() << "Attempted to kill instance" << instance->id() << ", which isn't running."; return false; } + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instance->id()]; // NOTE: copy of the shared pointer keeps it alive auto controller = extras.controller; + locker.unlock(); if (controller) { return controller->abort(); } @@ -1478,6 +1482,8 @@ void Application::controllerSucceeded() if (!controller) return; auto id = controller->id(); + + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; // on success, do... @@ -1503,6 +1509,7 @@ void Application::controllerFailed(const QString& error) if (!controller) return; auto id = controller->id(); + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; // on failure, do... nothing @@ -1560,6 +1567,7 @@ InstanceWindow* Application::showInstanceWindow(InstancePtr instance, QString pa if (!instance) return nullptr; auto id = instance->id(); + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[id]; auto& window = extras.window; @@ -1597,6 +1605,7 @@ void Application::on_windowClose() m_openWindows--; auto instWindow = qobject_cast(QObject::sender()); if (instWindow) { + QMutexLocker locker(&m_instanceExtrasMutex); auto& extras = m_instanceExtras[instWindow->instanceId()]; extras.window = nullptr; if (extras.controller) { diff --git a/launcher/Application.h b/launcher/Application.h index 692625f4a..164ec3a4f 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -279,6 +279,7 @@ class Application : public QApplication { shared_qobject_ptr controller; }; std::map m_instanceExtras; + mutable QMutex m_instanceExtrasMutex; // main state variables size_t m_openWindows = 0; From 484d90899f293121558a5a6da984bd7eb5a1c508 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 17:34:29 +0200 Subject: [PATCH 142/177] disable retry for modrinth currentVersions API Signed-off-by: Trial97 (cherry picked from commit 6f2f3c2d3bf6a170060523ad47fe69fef57bd9b4) --- launcher/modplatform/modrinth/ModrinthAPI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/modrinth/ModrinthAPI.cpp b/launcher/modplatform/modrinth/ModrinthAPI.cpp index 323711e02..a954f65a5 100644 --- a/launcher/modplatform/modrinth/ModrinthAPI.cpp +++ b/launcher/modplatform/modrinth/ModrinthAPI.cpp @@ -34,7 +34,7 @@ Task::Ptr ModrinthAPI::currentVersions(const QStringList& hashes, QString hash_f auto body_raw = body.toJson(); netJob->addNetAction(Net::ApiUpload::makeByteArray(QString(BuildConfig.MODRINTH_PROD_URL + "/version_files"), response, body_raw)); - + netJob->setAskRetry(false); return netJob; } From 40af3cf3d2fbf0c931eb9e137e6a69f6e8831a86 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 11:03:47 +0200 Subject: [PATCH 143/177] use isPortable to determine if the MSAStep should check for url handler Signed-off-by: Trial97 (cherry picked from commit 99cfb6237030f03c148e531da78b8da8f7d4c2f1) --- launcher/minecraft/auth/steps/MSAStep.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp index 74999414c..151ee4e68 100644 --- a/launcher/minecraft/auth/steps/MSAStep.cpp +++ b/launcher/minecraft/auth/steps/MSAStep.cpp @@ -85,8 +85,7 @@ class CustomOAuthOobReplyHandler : public QOAuthOobReplyHandler { MSAStep::MSAStep(AccountData* data, bool silent) : AuthStep(data), m_silent(silent) { m_clientId = APPLICATION->getMSAClientID(); - if (QCoreApplication::applicationFilePath().startsWith("/tmp/.mount_") || - QFile::exists(FS::PathCombine(APPLICATION->root(), "portable.txt")) || !isSchemeHandlerRegistered()) + if (QCoreApplication::applicationFilePath().startsWith("/tmp/.mount_") || APPLICATION->isPortable() || !isSchemeHandlerRegistered()) { auto replyHandler = new QOAuthHttpServerReplyHandler(this); From c0394c52b7e944c7e5d14e8da5128b5f92e19ace Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:10:38 -0700 Subject: [PATCH 144/177] ci: bump linux qt version Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> (cherry picked from commit d63a3364111a99337c2096c807550f3d7c62b47a) --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c167d8f1..90f74fae5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,14 +59,14 @@ jobs: qt_ver: 5 qt_host: linux qt_arch: "" - qt_version: "5.12.8" + qt_version: "5.15.2" qt_modules: "qtnetworkauth" - os: ubuntu-20.04 qt_ver: 6 qt_host: linux qt_arch: "" - qt_version: "6.2.4" + qt_version: "6.5.3" qt_modules: "qt5compat qtimageformats qtnetworkauth" - os: windows-2022 From 7f074ca7b94d56a8700752ede95c7474291ee307 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:30:55 -0700 Subject: [PATCH 145/177] ci: libxcb-curcsor_dev ? Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> (cherry picked from commit ba6743d134589294ac3ba754e6ad83c2e59d4ffd) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 90f74fae5..2cefa8100 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -206,7 +206,7 @@ jobs: if: runner.os == 'Linux' run: | sudo apt-get -y update - sudo apt-get -y install ninja-build extra-cmake-modules scdoc appstream + sudo apt-get -y install ninja-build extra-cmake-modules scdoc appstream libxcb-cursor-dev - name: Install Dependencies (macOS) if: runner.os == 'macOS' From 1dce1360bdea93e5c8450585e1154cead29463aa Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 31 Oct 2024 14:51:18 +0200 Subject: [PATCH 146/177] Fix installed typo Signed-off-by: Trial97 (cherry picked from commit 670c932f32753fd67979f95810b052d7a62a0006) --- launcher/ui/dialogs/ModUpdateDialog.cpp | 2 +- launcher/ui/dialogs/ReviewMessageBox.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index f906cfcea..308072c5e 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -418,7 +418,7 @@ void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStri auto item_top = new QTreeWidgetItem(ui->modTreeWidget); item_top->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); if (!info.enabled) { - item_top->setToolTip(0, tr("Mod was disabled as it may be already instaled.")); + item_top->setToolTip(0, tr("Mod was disabled as it may be already installed.")); } item_top->setText(0, info.name); item_top->setExpanded(true); diff --git a/launcher/ui/dialogs/ReviewMessageBox.cpp b/launcher/ui/dialogs/ReviewMessageBox.cpp index fa79e4ed1..96cc8149f 100644 --- a/launcher/ui/dialogs/ReviewMessageBox.cpp +++ b/launcher/ui/dialogs/ReviewMessageBox.cpp @@ -41,7 +41,7 @@ void ReviewMessageBox::appendResource(ResourceInformation&& info) itemTop->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); itemTop->setText(0, info.name); if (!info.enabled) { - itemTop->setToolTip(0, tr("Mod was disabled as it may be already instaled.")); + itemTop->setToolTip(0, tr("Mod was disabled as it may be already installed.")); } auto filenameItem = new QTreeWidgetItem(itemTop); From 984daa450bbc53cec83b183472d83e022efc3739 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 7 Nov 2024 14:45:14 +0200 Subject: [PATCH 147/177] Close the window using the invokeMethod to not block Signed-off-by: Trial97 (cherry picked from commit 9601fbf2d5b36d3609cce6b1a3b458db0d170531) --- launcher/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index b64b9decb..474493f5a 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1489,7 +1489,7 @@ void Application::controllerSucceeded() // on success, do... if (controller->instance()->settings()->get("AutoCloseConsole").toBool()) { if (extras.window) { - extras.window->close(); + QMetaObject::invokeMethod(extras.window, &QWidget::close, Qt::QueuedConnection); } } extras.controller.reset(); From 76602391f4079b303f31143cf60b4823e2a2b2b2 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 14 Nov 2024 16:26:21 +0200 Subject: [PATCH 148/177] Fix crash caused by invalid resource pointer Signed-off-by: Trial97 --- launcher/minecraft/mod/ResourceFolderModel.cpp | 15 +++++++++------ launcher/minecraft/mod/ResourceFolderModel.h | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index ce3e16bce..b577c7272 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -261,7 +261,7 @@ bool ResourceFolderModel::update() return true; } -void ResourceFolderModel::resolveResource(Resource* res) +void ResourceFolderModel::resolveResource(Resource::Ptr res) { if (!res->shouldResolve()) { return; @@ -277,11 +277,14 @@ void ResourceFolderModel::resolveResource(Resource* res) m_active_parse_tasks.insert(ticket, task); connect( - task.get(), &Task::succeeded, this, [=] { onParseSucceeded(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection); - connect(task.get(), &Task::failed, this, [=] { onParseFailed(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection); + task.get(), &Task::succeeded, this, [this, ticket, res] { onParseSucceeded(ticket, res->internal_id()); }, + Qt::ConnectionType::QueuedConnection); + connect( + task.get(), &Task::failed, this, [this, ticket, res] { onParseFailed(ticket, res->internal_id()); }, + Qt::ConnectionType::QueuedConnection); connect( task.get(), &Task::finished, this, - [=] { + [this, ticket] { m_active_parse_tasks.remove(ticket); emit parseFinished(); }, @@ -317,7 +320,7 @@ void ResourceFolderModel::onUpdateSucceeded() void ResourceFolderModel::onParseSucceeded(int ticket, QString resource_id) { auto iter = m_active_parse_tasks.constFind(ticket); - if (iter == m_active_parse_tasks.constEnd()) + if (iter == m_active_parse_tasks.constEnd() || !m_resources_index.contains(resource_id)) return; int row = m_resources_index[resource_id]; @@ -629,7 +632,7 @@ QString ResourceFolderModel::instDirPath() const void ResourceFolderModel::onParseFailed(int ticket, QString resource_id) { auto iter = m_active_parse_tasks.constFind(ticket); - if (iter == m_active_parse_tasks.constEnd()) + if (iter == m_active_parse_tasks.constEnd() || !m_resources_index.contains(resource_id)) return; auto removed_index = m_resources_index[resource_id]; diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index ca919d3e3..354eedc28 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -76,7 +76,7 @@ class ResourceFolderModel : public QAbstractListModel { virtual bool update(); /** Creates a new parse task, if needed, for 'res' and start it.*/ - virtual void resolveResource(Resource* res); + virtual void resolveResource(Resource::Ptr res); [[nodiscard]] qsizetype size() const { return m_resources.size(); } [[nodiscard]] bool empty() const { return size() == 0; } @@ -285,7 +285,7 @@ void ResourceFolderModel::applyUpdates(QSet& current_set, QSet } m_resources[row].reset(new_resource); - resolveResource(m_resources.at(row).get()); + resolveResource(m_resources.at(row)); emit dataChanged(index(row, 0), index(row, columnCount(QModelIndex()) - 1)); } } @@ -333,7 +333,7 @@ void ResourceFolderModel::applyUpdates(QSet& current_set, QSet for (auto& added : added_set) { auto res = new_resources[added]; m_resources.append(res); - resolveResource(m_resources.last().get()); + resolveResource(m_resources.last()); } endInsertRows(); From ea9029d7b62a729206a8f137d58065e574540b7b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 14 Nov 2024 13:17:52 +0200 Subject: [PATCH 149/177] Fix file remaingin open after program closure Signed-off-by: Trial97 (cherry picked from commit ce61ed2f86d313f63c999d012d768425ea3793c3) --- launcher/InstanceCreationTask.cpp | 4 +- launcher/InstanceImportTask.cpp | 64 +++++++++++-------- launcher/InstanceImportTask.h | 7 +- .../flame/FlameInstanceCreationTask.cpp | 1 + 4 files changed, 42 insertions(+), 34 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index 3e7b3142f..bd3514798 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -61,6 +61,6 @@ void InstanceCreationTask::executeTask() return; } } - - emitSucceeded(); + if (!m_abort) + emitSucceeded(); } diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp index 57cc77527..71630656d 100644 --- a/launcher/InstanceImportTask.cpp +++ b/launcher/InstanceImportTask.cpp @@ -69,9 +69,11 @@ bool InstanceImportTask::abort() if (!canAbort()) return false; - if (task) - task->abort(); - return Task::abort(); + bool wasAborted = false; + if (m_task) + wasAborted = m_task->abort(); + Task::abort(); + return wasAborted; } void InstanceImportTask::executeTask() @@ -104,7 +106,7 @@ void InstanceImportTask::downloadFromUrl() connect(filesNetJob.get(), &NetJob::stepProgress, this, &InstanceImportTask::propagateStepProgress); connect(filesNetJob.get(), &NetJob::failed, this, &InstanceImportTask::emitFailed); connect(filesNetJob.get(), &NetJob::aborted, this, &InstanceImportTask::emitAborted); - task.reset(filesNetJob); + m_task.reset(filesNetJob); filesNetJob->start(); } @@ -193,7 +195,7 @@ void InstanceImportTask::processZipPack() stepProgress(*progressStep); }); - connect(zipTask.get(), &Task::succeeded, this, &InstanceImportTask::extractFinished); + connect(zipTask.get(), &Task::succeeded, this, &InstanceImportTask::extractFinished, Qt::QueuedConnection); connect(zipTask.get(), &Task::aborted, this, &InstanceImportTask::emitAborted); connect(zipTask.get(), &Task::failed, this, [this, progressStep](QString reason) { progressStep->state = TaskStepState::Failed; @@ -210,12 +212,13 @@ void InstanceImportTask::processZipPack() progressStep->status = status; stepProgress(*progressStep); }); - task.reset(zipTask); + m_task.reset(zipTask); zipTask->start(); } void InstanceImportTask::extractFinished() { + setAbortable(false); QDir extractDir(m_stagingPath); qDebug() << "Fixing permissions for extracted pack files..."; @@ -289,8 +292,11 @@ void InstanceImportTask::processFlame() inst_creation_task->setGroup(m_instGroup); inst_creation_task->setConfirmUpdate(shouldConfirmUpdate()); - connect(inst_creation_task.get(), &Task::succeeded, this, [this, inst_creation_task] { - setOverride(inst_creation_task->shouldOverride(), inst_creation_task->originalInstanceID()); + auto weak = inst_creation_task.toWeakRef(); + connect(inst_creation_task.get(), &Task::succeeded, this, [this, weak] { + if (auto sp = weak.lock()) { + setOverride(sp->shouldOverride(), sp->originalInstanceID()); + } emitSucceeded(); }); connect(inst_creation_task.get(), &Task::failed, this, &InstanceImportTask::emitFailed); @@ -299,11 +305,12 @@ void InstanceImportTask::processFlame() connect(inst_creation_task.get(), &Task::status, this, &InstanceImportTask::setStatus); connect(inst_creation_task.get(), &Task::details, this, &InstanceImportTask::setDetails); - connect(this, &Task::aborted, inst_creation_task.get(), &InstanceCreationTask::abort); connect(inst_creation_task.get(), &Task::aborted, this, &Task::abort); connect(inst_creation_task.get(), &Task::abortStatusChanged, this, &Task::setAbortable); - inst_creation_task->start(); + m_task.reset(inst_creation_task); + setAbortable(true); + m_task->start(); } void InstanceImportTask::processTechnic() @@ -350,7 +357,7 @@ void InstanceImportTask::processMultiMC() void InstanceImportTask::processModrinth() { - ModrinthCreationTask* inst_creation_task = nullptr; + shared_qobject_ptr inst_creation_task = nullptr; if (!m_extra_info.isEmpty()) { auto pack_id_it = m_extra_info.constFind("pack_id"); Q_ASSERT(pack_id_it != m_extra_info.constEnd()); @@ -367,7 +374,7 @@ void InstanceImportTask::processModrinth() original_instance_id = original_instance_id_it.value(); inst_creation_task = - new ModrinthCreationTask(m_stagingPath, m_globalSettings, m_parent, pack_id, pack_version_id, original_instance_id); + makeShared(m_stagingPath, m_globalSettings, m_parent, pack_id, pack_version_id, original_instance_id); } else { QString pack_id; if (!m_sourceUrl.isEmpty()) { @@ -376,7 +383,7 @@ void InstanceImportTask::processModrinth() } // FIXME: Find a way to get the ID in directly imported ZIPs - inst_creation_task = new ModrinthCreationTask(m_stagingPath, m_globalSettings, m_parent, pack_id); + inst_creation_task = makeShared(m_stagingPath, m_globalSettings, m_parent, pack_id); } inst_creation_task->setName(*this); @@ -384,20 +391,23 @@ void InstanceImportTask::processModrinth() inst_creation_task->setGroup(m_instGroup); inst_creation_task->setConfirmUpdate(shouldConfirmUpdate()); - connect(inst_creation_task, &Task::succeeded, this, [this, inst_creation_task] { - setOverride(inst_creation_task->shouldOverride(), inst_creation_task->originalInstanceID()); + auto weak = inst_creation_task.toWeakRef(); + connect(inst_creation_task.get(), &Task::succeeded, this, [this, weak] { + if (auto sp = weak.lock()) { + setOverride(sp->shouldOverride(), sp->originalInstanceID()); + } emitSucceeded(); }); - connect(inst_creation_task, &Task::failed, this, &InstanceImportTask::emitFailed); - connect(inst_creation_task, &Task::progress, this, &InstanceImportTask::setProgress); - connect(inst_creation_task, &Task::stepProgress, this, &InstanceImportTask::propagateStepProgress); - connect(inst_creation_task, &Task::status, this, &InstanceImportTask::setStatus); - connect(inst_creation_task, &Task::details, this, &InstanceImportTask::setDetails); - connect(inst_creation_task, &Task::finished, inst_creation_task, &InstanceCreationTask::deleteLater); - - connect(this, &Task::aborted, inst_creation_task, &InstanceCreationTask::abort); - connect(inst_creation_task, &Task::aborted, this, &Task::abort); - connect(inst_creation_task, &Task::abortStatusChanged, this, &Task::setAbortable); - - inst_creation_task->start(); + connect(inst_creation_task.get(), &Task::failed, this, &InstanceImportTask::emitFailed); + connect(inst_creation_task.get(), &Task::progress, this, &InstanceImportTask::setProgress); + connect(inst_creation_task.get(), &Task::stepProgress, this, &InstanceImportTask::propagateStepProgress); + connect(inst_creation_task.get(), &Task::status, this, &InstanceImportTask::setStatus); + connect(inst_creation_task.get(), &Task::details, this, &InstanceImportTask::setDetails); + + connect(inst_creation_task.get(), &Task::aborted, this, &Task::abort); + connect(inst_creation_task.get(), &Task::abortStatusChanged, this, &Task::setAbortable); + + m_task.reset(inst_creation_task); + setAbortable(true); + m_task->start(); } diff --git a/launcher/InstanceImportTask.h b/launcher/InstanceImportTask.h index cf86af4ea..8884e0801 100644 --- a/launcher/InstanceImportTask.h +++ b/launcher/InstanceImportTask.h @@ -40,16 +40,13 @@ #include #include "InstanceTask.h" -#include -#include - class QuaZip; class InstanceImportTask : public InstanceTask { Q_OBJECT public: explicit InstanceImportTask(const QUrl& sourceUrl, QWidget* parent = nullptr, QMap&& extra_info = {}); - + virtual ~InstanceImportTask() = default; bool abort() override; protected: @@ -70,7 +67,7 @@ class InstanceImportTask : public InstanceTask { private: /* data */ QUrl m_sourceUrl; QString m_archivePath; - Task::Ptr task; + Task::Ptr m_task; enum class ModpackType { Unknown, MultiMC, diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index b8c40ee42..35929d2da 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -444,6 +444,7 @@ bool FlameCreationTask::createInstance() setError(tr("Unable to resolve mod IDs:\n") + reason); loop.quit(); }); + connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::aborted, &loop, &QEventLoop::quit); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::stepProgress, this, &FlameCreationTask::propagateStepProgress); From eefeb5799df51ef7a1d634c84596553a2107555d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 6 Nov 2024 23:57:24 +0000 Subject: [PATCH 150/177] Add scrollbar to Settings -> Launcher -> Features Signed-off-by: TheKodeToad (cherry picked from commit 71e55f88294976577ad0b2f8c21b635cf8fc9735) --- launcher/ui/pages/global/LauncherPage.ui | 636 ++++++++++++----------- 1 file changed, 329 insertions(+), 307 deletions(-) diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 3cba468ff..09e7bca5b 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -46,317 +46,339 @@ - - - Update Settings - - - - - - Check for updates automatically - - - - - - - - - Update interval - - - - - - - Set it to 0 to only check on launch - - - h - - - 0 - - - 99999999 - - - - - - - - - - - - Folders - - - - - - &Downloads: - - - downloadsDirTextBox - - - - - - - Browse - - - - - - - - - - - - - &Skins: - - - skinsDirTextBox - - - - - - - &Icons: - - - iconsDirTextBox - - - - - - - When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). - - - Check downloads folder recursively - - - - - - - - - - &Java: - - - javaDirTextBox - - - - - - - &Mods: - - - modsDirTextBox - - - - - - - - - - - - - - - - Browse - - - - - - - Browse - - - - - - - Browse - - - - - - - I&nstances: - - - instDirTextBox - - - - - - - Browse - - - - - - - Browse - - - - - - - - - - Mods + + + Qt::ScrollBarAlwaysOff - - - - - Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods. - - - Disable using metadata for mods - - - - - - - <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: Disabling mod metadata may also disable some QoL features, such as mod updating!</span></p></body></html> - - - true - - - - - - - Disable the automatic detection, installation, and updating of mod dependencies. - - - Disable automatic mod dependency management - - - - - - - When creating a new modpack instance, do not suggest updating existing instances instead. - - - Skip modpack update prompt - - - - - - - - - - Miscellaneous + + true - - - - - 1 - - - - - - - Number of concurrent tasks - - - - - - - 1 - - - - - - - Number of concurrent downloads - - - - - - - Number of manual retries - - - - - - - 0 - - - - - - - Seconds to wait until the requests are terminated - - - Timeout for HTTP requests - - - - - - - s - - - - + + + + 0 + 0 + 473 + 770 + + + + + + + Update Settings + + + + + + Check for updates automatically + + + + + + + + + Update interval + + + + + + + Set it to 0 to only check on launch + + + h + + + 0 + + + 99999999 + + + + + + + + + + + + Folders + + + + + + &Downloads: + + + downloadsDirTextBox + + + + + + + Browse + + + + + + + + + + + + + &Skins: + + + skinsDirTextBox + + + + + + + &Icons: + + + iconsDirTextBox + + + + + + + When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge). + + + Check downloads folder recursively + + + + + + + + + + &Java: + + + javaDirTextBox + + + + + + + &Mods: + + + modsDirTextBox + + + + + + + + + + + + + + + + Browse + + + + + + + Browse + + + + + + + Browse + + + + + + + I&nstances: + + + instDirTextBox + + + + + + + Browse + + + + + + + Browse + + + + + + + + + + Mods + + + + + + Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods. + + + Disable using metadata for mods + + + + + + + <html><head/><body><p><span style=" font-weight:600; color:#f5c211;">Warning</span><span style=" color:#f5c211;">: Disabling mod metadata may also disable some QoL features, such as mod updating!</span></p></body></html> + + + true + + + + + + + Disable the automatic detection, installation, and updating of mod dependencies. + + + Disable automatic mod dependency management + + + + + + + When creating a new modpack instance, do not suggest updating existing instances instead. + + + Skip modpack update prompt + + + + + + + + + + Miscellaneous + + + + + + 1 + + + + + + + Number of concurrent tasks + + + + + + + 1 + + + + + + + Number of concurrent downloads + + + + + + + Number of manual retries + + + + + + + 0 + + + + + + + Seconds to wait until the requests are terminated + + + Timeout for HTTP requests + + + + + + + s + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + - - - - Qt::Vertical - - - - 0 - 0 - - - - From 1c94a3e3e5e6273216987041c926652c8bf6f34c Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 29 Oct 2024 00:40:13 +0200 Subject: [PATCH 151/177] fix leak on resource search Signed-off-by: Trial97 (cherry picked from commit 8e7d84d05beffac492522f4b2c0d9e638b15146b) --- .../helpers/NetworkResourceAPI.cpp | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/launcher/modplatform/helpers/NetworkResourceAPI.cpp b/launcher/modplatform/helpers/NetworkResourceAPI.cpp index 974e732a7..7a234a8f8 100644 --- a/launcher/modplatform/helpers/NetworkResourceAPI.cpp +++ b/launcher/modplatform/helpers/NetworkResourceAPI.cpp @@ -43,11 +43,16 @@ Task::Ptr NetworkResourceAPI::searchProjects(SearchArgs&& args, SearchCallbacks& callbacks.on_succeed(doc); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); - + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); QObject::connect(netJob.get(), &NetJob::aborted, [callbacks] { callbacks.on_abort(); }); @@ -102,11 +107,17 @@ Task::Ptr NetworkResourceAPI::getProjectVersions(VersionSearchArgs&& args, Versi callbacks.on_succeed(doc, args.pack); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { - int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { + int network_error_code = -1; + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); @@ -153,11 +164,17 @@ Task::Ptr NetworkResourceAPI::getDependencyVersion(DependencySearchArgs&& args, callbacks.on_succeed(doc, args.dependency); }); - QObject::connect(netJob.get(), &NetJob::failed, [netJob, callbacks](const QString& reason) { - int network_error_code = -1; - if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) - network_error_code = failed_action->replyStatusCode(); + // Capture a weak_ptr instead of a shared_ptr to avoid circular dependency issues. + // This prevents the lambda from extending the lifetime of the shared resource, + // as it only temporarily locks the resource when needed. + auto weak = netJob.toWeakRef(); + QObject::connect(netJob.get(), &NetJob::failed, [weak, callbacks](const QString& reason) { + int network_error_code = -1; + if (auto netJob = weak.lock()) { + if (auto* failed_action = netJob->getFailedActions().at(0); failed_action) + network_error_code = failed_action->replyStatusCode(); + } callbacks.on_fail(reason, network_error_code); }); return netJob; From 4c4017d7ca84162ff8c508d4b9f22a979d6c223e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 28 Oct 2024 19:13:14 +0200 Subject: [PATCH 152/177] remove task parent from constuctor Signed-off-by: Trial97 --- launcher/Application.cpp | 2 +- launcher/DataMigrationTask.cpp | 7 ++----- launcher/DataMigrationTask.h | 2 +- launcher/JavaCommon.cpp | 4 ++-- launcher/LaunchController.cpp | 2 +- launcher/LaunchController.h | 2 +- launcher/java/JavaChecker.cpp | 4 ++-- launcher/java/JavaChecker.h | 3 +-- launcher/java/JavaInstallList.cpp | 4 ++-- launcher/launch/LaunchStep.cpp | 2 +- launcher/launch/steps/CheckJava.cpp | 2 +- launcher/meta/Index.cpp | 4 ++-- launcher/meta/VersionList.cpp | 3 +-- launcher/minecraft/ComponentUpdateTask.cpp | 2 +- launcher/minecraft/ComponentUpdateTask.h | 2 +- launcher/minecraft/MinecraftInstance.cpp | 2 +- launcher/minecraft/MinecraftLoadAndCheck.cpp | 4 +--- launcher/minecraft/MinecraftLoadAndCheck.h | 2 +- launcher/minecraft/auth/AuthFlow.cpp | 2 +- launcher/minecraft/auth/AuthFlow.h | 2 +- launcher/minecraft/auth/MinecraftAccount.cpp | 4 ++-- launcher/minecraft/launch/AutoInstallJava.cpp | 6 ++---- launcher/minecraft/mod/tasks/BasicFolderLoadTask.h | 8 ++------ launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp | 7 +++---- launcher/minecraft/mod/tasks/GetModDependenciesTask.h | 5 +---- launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp | 2 +- launcher/minecraft/mod/tasks/LocalModParseTask.cpp | 2 +- .../minecraft/mod/tasks/LocalResourcePackParseTask.cpp | 4 +--- .../minecraft/mod/tasks/LocalShaderPackParseTask.cpp | 2 +- .../minecraft/mod/tasks/LocalTexturePackParseTask.cpp | 3 +-- launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp | 2 +- launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp | 2 +- launcher/modplatform/CheckUpdateTask.h | 2 +- launcher/modplatform/EnsureMetadataTask.cpp | 8 ++++---- launcher/modplatform/flame/FlameInstanceCreationTask.cpp | 2 +- launcher/modplatform/flame/FlamePackExportTask.cpp | 3 +-- launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp | 3 +-- launcher/net/NetJob.cpp | 2 +- launcher/tasks/ConcurrentTask.cpp | 2 +- launcher/tasks/ConcurrentTask.h | 2 +- launcher/tasks/MultipleOptionsTask.cpp | 2 +- launcher/tasks/MultipleOptionsTask.h | 2 +- launcher/tasks/SequentialTask.cpp | 2 +- launcher/tasks/SequentialTask.h | 2 +- launcher/tasks/Task.cpp | 2 +- launcher/tasks/Task.h | 2 +- launcher/ui/dialogs/BlockedModsDialog.cpp | 2 +- launcher/ui/dialogs/MSALoginDialog.cpp | 2 +- launcher/ui/dialogs/ModUpdateDialog.cpp | 9 ++++----- launcher/ui/dialogs/ResourceDownloadDialog.cpp | 2 +- launcher/ui/java/InstallJavaDialog.cpp | 2 +- launcher/ui/pages/instance/ModFolderPage.cpp | 6 +++--- launcher/ui/pages/instance/ResourcePackPage.cpp | 5 +---- launcher/ui/pages/instance/ShaderPackPage.cpp | 2 +- launcher/ui/pages/instance/TexturePackPage.cpp | 3 +-- launcher/ui/pages/instance/VersionPage.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- tests/Task_test.cpp | 2 +- 58 files changed, 76 insertions(+), 103 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 474493f5a..1d5efe7fc 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1853,7 +1853,7 @@ bool Application::handleDataMigration(const QString& currentData, matcher->add(std::make_shared("themes/")); ProgressDialog diag; - DataMigrationTask task(nullptr, oldData, currentData, matcher); + DataMigrationTask task(oldData, currentData, matcher); if (diag.execWithTask(&task)) { qDebug() << "<> Migration succeeded"; setDoNotMigrate(); diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index 27ce5f01b..4ffa26fd4 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -12,11 +12,8 @@ #include -DataMigrationTask::DataMigrationTask(QObject* parent, - const QString& sourcePath, - const QString& targetPath, - const IPathMatcher::Ptr pathMatcher) - : Task(parent), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath) +DataMigrationTask::DataMigrationTask(const QString& sourcePath, const QString& targetPath, const IPathMatcher::Ptr pathMatcher) + : Task(), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath) { m_copy.matcher(m_pathMatcher.get()).whitelist(true); } diff --git a/launcher/DataMigrationTask.h b/launcher/DataMigrationTask.h index aba9f2399..fc613cd5e 100644 --- a/launcher/DataMigrationTask.h +++ b/launcher/DataMigrationTask.h @@ -18,7 +18,7 @@ class DataMigrationTask : public Task { Q_OBJECT public: - explicit DataMigrationTask(QObject* parent, const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher); + explicit DataMigrationTask(const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher); ~DataMigrationTask() override = default; protected: diff --git a/launcher/JavaCommon.cpp b/launcher/JavaCommon.cpp index 3cbf9f9d5..188edb943 100644 --- a/launcher/JavaCommon.cpp +++ b/launcher/JavaCommon.cpp @@ -116,7 +116,7 @@ void JavaCommon::TestCheck::run() emit finished(); return; } - checker.reset(new JavaChecker(m_path, "", 0, 0, 0, 0, this)); + checker.reset(new JavaChecker(m_path, "", 0, 0, 0, 0)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinished); checker->start(); } @@ -128,7 +128,7 @@ void JavaCommon::TestCheck::checkFinished(const JavaChecker::Result& result) emit finished(); return; } - checker.reset(new JavaChecker(m_path, m_args, m_maxMem, m_maxMem, result.javaVersion.requiresPermGen() ? m_permGen : 0, 0, this)); + checker.reset(new JavaChecker(m_path, m_args, m_maxMem, m_maxMem, result.javaVersion.requiresPermGen() ? m_permGen : 0, 0)); connect(checker.get(), &JavaChecker::checkFinished, this, &JavaCommon::TestCheck::checkFinishedWithArgs); checker->start(); } diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 687da1322..aaf84eac4 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -61,7 +61,7 @@ #include "launch/steps/TextPrint.h" #include "tasks/Task.h" -LaunchController::LaunchController(QObject* parent) : Task(parent) {} +LaunchController::LaunchController() : Task() {} void LaunchController::executeTask() { diff --git a/launcher/LaunchController.h b/launcher/LaunchController.h index 6e2a94258..af52ad450 100644 --- a/launcher/LaunchController.h +++ b/launcher/LaunchController.h @@ -47,7 +47,7 @@ class LaunchController : public Task { public: void executeTask() override; - LaunchController(QObject* parent = nullptr); + LaunchController(); virtual ~LaunchController() = default; void setInstance(InstancePtr instance) { m_instance = instance; } diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index c54a5b04b..772c90e42 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -44,8 +44,8 @@ #include "FileSystem.h" #include "java/JavaUtils.h" -JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id, QObject* parent) - : Task(parent), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id) +JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id) + : Task(), m_path(path), m_args(args), m_minMem(minMem), m_maxMem(maxMem), m_permGen(permGen), m_id(id) {} void JavaChecker::executeTask() diff --git a/launcher/java/JavaChecker.h b/launcher/java/JavaChecker.h index 171a18b76..a04b68170 100644 --- a/launcher/java/JavaChecker.h +++ b/launcher/java/JavaChecker.h @@ -1,7 +1,6 @@ #pragma once #include #include -#include #include "JavaVersion.h" #include "QObjectPtr.h" @@ -26,7 +25,7 @@ class JavaChecker : public Task { enum class Validity { Errored, ReturnedInvalidData, Valid } validity = Validity::Errored; }; - explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0, QObject* parent = 0); + explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0); signals: void checkFinished(const Result& result); diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index 569fda306..aa7fab8a0 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -163,7 +163,7 @@ void JavaListLoadTask::executeTask() JavaUtils ju; QList candidate_paths = m_only_managed_versions ? getPrismJavaBundle() : ju.FindJavaPaths(); - ConcurrentTask::Ptr job(new ConcurrentTask(this, "Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + ConcurrentTask::Ptr job(new ConcurrentTask("Java detection", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); m_job.reset(job); connect(m_job.get(), &Task::finished, this, &JavaListLoadTask::javaCheckerFinished); connect(m_job.get(), &Task::progress, this, &Task::setProgress); @@ -171,7 +171,7 @@ void JavaListLoadTask::executeTask() qDebug() << "Probing the following Java paths: "; int id = 0; for (QString candidate : candidate_paths) { - auto checker = new JavaChecker(candidate, "", 0, 0, 0, id, this); + auto checker = new JavaChecker(candidate, "", 0, 0, 0, id); connect(checker, &JavaChecker::checkFinished, [this](const JavaChecker::Result& result) { m_results << result; }); job->addTask(Task::Ptr(checker)); id++; diff --git a/launcher/launch/LaunchStep.cpp b/launcher/launch/LaunchStep.cpp index f3e9dfce0..0b352ea9f 100644 --- a/launcher/launch/LaunchStep.cpp +++ b/launcher/launch/LaunchStep.cpp @@ -16,7 +16,7 @@ #include "LaunchStep.h" #include "LaunchTask.h" -LaunchStep::LaunchStep(LaunchTask* parent) : Task(parent), m_parent(parent) +LaunchStep::LaunchStep(LaunchTask* parent) : Task(), m_parent(parent) { connect(this, &LaunchStep::readyForLaunch, parent, &LaunchTask::onReadyForLaunch); connect(this, &LaunchStep::logLine, parent, &LaunchTask::onLogLine); diff --git a/launcher/launch/steps/CheckJava.cpp b/launcher/launch/steps/CheckJava.cpp index 55d13b58c..0f8d27e94 100644 --- a/launcher/launch/steps/CheckJava.cpp +++ b/launcher/launch/steps/CheckJava.cpp @@ -94,7 +94,7 @@ void CheckJava::executeTask() // if timestamps are not the same, or something is missing, check! if (m_javaSignature != storedSignature || storedVersion.size() == 0 || storedArchitecture.size() == 0 || storedRealArchitecture.size() == 0 || storedVendor.size() == 0) { - m_JavaChecker.reset(new JavaChecker(realJavaPath, "", 0, 0, 0, 0, this)); + m_JavaChecker.reset(new JavaChecker(realJavaPath, "", 0, 0, 0, 0)); emit logLine(QString("Checking Java version..."), MessageLevel::Launcher); connect(m_JavaChecker.get(), &JavaChecker::checkFinished, this, &CheckJava::checkJavaFinished); m_JavaChecker->start(); diff --git a/launcher/meta/Index.cpp b/launcher/meta/Index.cpp index bd0745b6b..1707854be 100644 --- a/launcher/meta/Index.cpp +++ b/launcher/meta/Index.cpp @@ -140,8 +140,8 @@ Task::Ptr Index::loadVersion(const QString& uid, const QString& version, Net::Mo } auto versionList = get(uid); - auto loadTask = makeShared( - this, tr("Load meta for %1:%2", "This is for the task name that loads the meta index.").arg(uid, version)); + auto loadTask = + makeShared(tr("Load meta for %1:%2", "This is for the task name that loads the meta index.").arg(uid, version)); if (status() != BaseEntity::LoadStatus::Remote || force) { loadTask->addTask(this->loadTask(mode)); } diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index 6856b5f8d..f96355658 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -34,8 +34,7 @@ VersionList::VersionList(const QString& uid, QObject* parent) : BaseVersionList( Task::Ptr VersionList::getLoadTask() { - auto loadTask = - makeShared(this, tr("Load meta for %1", "This is for the task name that loads the meta index.").arg(m_uid)); + auto loadTask = makeShared(tr("Load meta for %1", "This is for the task name that loads the meta index.").arg(m_uid)); loadTask->addTask(APPLICATION->metadataIndex()->loadTask(Net::Mode::Online)); loadTask->addTask(this->loadTask(Net::Mode::Online)); return loadTask; diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index 6656a84f8..36a07ee72 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -38,7 +38,7 @@ * If the component list changes, start over. */ -ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent) : Task(parent) +ComponentUpdateTask::ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list) : Task() { d.reset(new ComponentUpdateTaskData); d->m_profile = list; diff --git a/launcher/minecraft/ComponentUpdateTask.h b/launcher/minecraft/ComponentUpdateTask.h index 484c0bedd..64c55877b 100644 --- a/launcher/minecraft/ComponentUpdateTask.h +++ b/launcher/minecraft/ComponentUpdateTask.h @@ -14,7 +14,7 @@ class ComponentUpdateTask : public Task { enum class Mode { Launch, Resolution }; public: - explicit ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list, QObject* parent = 0); + explicit ComponentUpdateTask(Mode mode, Net::Mode netmode, PackProfile* list); virtual ~ComponentUpdateTask(); protected: diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 98ac7647f..d6d45af6b 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1093,7 +1093,7 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt // load meta { auto mode = session->status != AuthSession::PlayableOffline ? Net::Mode::Online : Net::Mode::Offline; - process->appendStep(makeShared(pptr, makeShared(this, mode, pptr))); + process->appendStep(makeShared(pptr, makeShared(this, mode))); } // check java diff --git a/launcher/minecraft/MinecraftLoadAndCheck.cpp b/launcher/minecraft/MinecraftLoadAndCheck.cpp index a9dcdf067..b9fb7eb0c 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.cpp +++ b/launcher/minecraft/MinecraftLoadAndCheck.cpp @@ -2,9 +2,7 @@ #include "MinecraftInstance.h" #include "PackProfile.h" -MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent) - : Task(parent), m_inst(inst), m_netmode(netmode) -{} +MinecraftLoadAndCheck::MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode) : m_inst(inst), m_netmode(netmode) {} void MinecraftLoadAndCheck::executeTask() { diff --git a/launcher/minecraft/MinecraftLoadAndCheck.h b/launcher/minecraft/MinecraftLoadAndCheck.h index 72e9e0caa..c05698bca 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.h +++ b/launcher/minecraft/MinecraftLoadAndCheck.h @@ -23,7 +23,7 @@ class MinecraftInstance; class MinecraftLoadAndCheck : public Task { Q_OBJECT public: - explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode, QObject* parent = nullptr); + explicit MinecraftLoadAndCheck(MinecraftInstance* inst, Net::Mode netmode); virtual ~MinecraftLoadAndCheck() = default; void executeTask() override; diff --git a/launcher/minecraft/auth/AuthFlow.cpp b/launcher/minecraft/auth/AuthFlow.cpp index 45926206c..19fbe15dd 100644 --- a/launcher/minecraft/auth/AuthFlow.cpp +++ b/launcher/minecraft/auth/AuthFlow.cpp @@ -19,7 +19,7 @@ #include -AuthFlow::AuthFlow(AccountData* data, Action action, QObject* parent) : Task(parent), m_data(data) +AuthFlow::AuthFlow(AccountData* data, Action action) : Task(), m_data(data) { if (data->type == AccountType::MSA) { if (action == Action::DeviceCode) { diff --git a/launcher/minecraft/auth/AuthFlow.h b/launcher/minecraft/auth/AuthFlow.h index 4d18ac845..bff4c04e4 100644 --- a/launcher/minecraft/auth/AuthFlow.h +++ b/launcher/minecraft/auth/AuthFlow.h @@ -17,7 +17,7 @@ class AuthFlow : public Task { public: enum class Action { Refresh, Login, DeviceCode }; - explicit AuthFlow(AccountData* data, Action action = Action::Refresh, QObject* parent = 0); + explicit AuthFlow(AccountData* data, Action action = Action::Refresh); virtual ~AuthFlow() = default; void executeTask() override; diff --git a/launcher/minecraft/auth/MinecraftAccount.cpp b/launcher/minecraft/auth/MinecraftAccount.cpp index 5b063604c..1ed39b5ca 100644 --- a/launcher/minecraft/auth/MinecraftAccount.cpp +++ b/launcher/minecraft/auth/MinecraftAccount.cpp @@ -121,7 +121,7 @@ shared_qobject_ptr MinecraftAccount::login(bool useDeviceCode) { Q_ASSERT(m_currentTask.get() == nullptr); - m_currentTask.reset(new AuthFlow(&data, useDeviceCode ? AuthFlow::Action::DeviceCode : AuthFlow::Action::Login, this)); + m_currentTask.reset(new AuthFlow(&data, useDeviceCode ? AuthFlow::Action::DeviceCode : AuthFlow::Action::Login)); connect(m_currentTask.get(), &Task::succeeded, this, &MinecraftAccount::authSucceeded); connect(m_currentTask.get(), &Task::failed, this, &MinecraftAccount::authFailed); connect(m_currentTask.get(), &Task::aborted, this, [this] { authFailed(tr("Aborted")); }); @@ -135,7 +135,7 @@ shared_qobject_ptr MinecraftAccount::refresh() return m_currentTask; } - m_currentTask.reset(new AuthFlow(&data, AuthFlow::Action::Refresh, this)); + m_currentTask.reset(new AuthFlow(&data, AuthFlow::Action::Refresh)); connect(m_currentTask.get(), &Task::succeeded, this, &MinecraftAccount::authSucceeded); connect(m_currentTask.get(), &Task::failed, this, &MinecraftAccount::authFailed); diff --git a/launcher/minecraft/launch/AutoInstallJava.cpp b/launcher/minecraft/launch/AutoInstallJava.cpp index 1083b7efb..854590dd2 100644 --- a/launcher/minecraft/launch/AutoInstallJava.cpp +++ b/launcher/minecraft/launch/AutoInstallJava.cpp @@ -57,9 +57,7 @@ #include "tasks/SequentialTask.h" AutoInstallJava::AutoInstallJava(LaunchTask* parent) - : LaunchStep(parent) - , m_instance(m_parent->instance()) - , m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; + : LaunchStep(parent), m_instance(m_parent->instance()), m_supported_arch(SysInfo::getSupportedJavaArchitecture()) {}; void AutoInstallJava::executeTask() { @@ -179,7 +177,7 @@ void AutoInstallJava::downloadJava(Meta::Version::Ptr version, QString javaName) return; } #if defined(Q_OS_MACOS) - auto seq = makeShared(this, tr("Install Java")); + auto seq = makeShared(tr("Install Java")); seq->addTask(m_current_task); seq->addTask(makeShared(final_path)); m_current_task = seq; diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h index fb2e22de6..168e4b6fa 100644 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h @@ -26,16 +26,12 @@ class BasicFolderLoadTask : public Task { [[nodiscard]] ResultPtr result() const { return m_result; } public: - BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result), m_thread_to_spawn_into(thread()) + BasicFolderLoadTask(QDir dir) : Task(false), m_dir(dir), m_result(new Result), m_thread_to_spawn_into(thread()) { m_create_func = [](QFileInfo const& entry) -> Resource::Ptr { return makeShared(entry); }; } BasicFolderLoadTask(QDir dir, std::function create_function) - : Task(nullptr, false) - , m_dir(dir) - , m_result(new Result) - , m_create_func(std::move(create_function)) - , m_thread_to_spawn_into(thread()) + : Task(false), m_dir(dir), m_result(new Result), m_create_func(std::move(create_function)), m_thread_to_spawn_into(thread()) {} [[nodiscard]] bool canAbort() const override { return true; } diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp index b9288d2b3..b63d36361 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp @@ -52,11 +52,10 @@ static bool checkDependencies(std::shared_ptrversion.loaders || sel->version.loaders & loaders); } -GetModDependenciesTask::GetModDependenciesTask(QObject* parent, - BaseInstance* instance, +GetModDependenciesTask::GetModDependenciesTask(BaseInstance* instance, ModFolderModel* folder, QList> selected) - : SequentialTask(parent, tr("Get dependencies")) + : SequentialTask(tr("Get dependencies")) , m_selected(selected) , m_flame_provider{ ModPlatform::ResourceProvider::FLAME, std::make_shared(*instance), std::make_shared() } @@ -185,7 +184,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen auto provider = providerName == m_flame_provider.name ? m_flame_provider : m_modrinth_provider; auto tasks = makeShared( - this, QString("DependencyInfo: %1").arg(dep.addonId.toString().isEmpty() ? dep.version : dep.addonId.toString())); + QString("DependencyInfo: %1").arg(dep.addonId.toString().isEmpty() ? dep.version : dep.addonId.toString())); if (!dep.addonId.toString().isEmpty()) { tasks->addTask(getProjectInfoTask(pDep)); diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h index 7202b01e0..29c77f9fe 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h @@ -61,10 +61,7 @@ class GetModDependenciesTask : public SequentialTask { std::shared_ptr api; }; - explicit GetModDependenciesTask(QObject* parent, - BaseInstance* instance, - ModFolderModel* folder, - QList> selected); + explicit GetModDependenciesTask(BaseInstance* instance, ModFolderModel* folder, QList> selected); auto getDependecies() const -> QList> { return m_pack_dependencies; } QHash getExtraInfo(); diff --git a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp index 82f6b9df9..19b15709d 100644 --- a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp @@ -157,7 +157,7 @@ bool validate(QFileInfo file) } // namespace DataPackUtils -LocalDataPackParseTask::LocalDataPackParseTask(int token, DataPack& dp) : Task(nullptr, false), m_token(token), m_data_pack(dp) {} +LocalDataPackParseTask::LocalDataPackParseTask(int token, DataPack& dp) : Task(false), m_token(token), m_data_pack(dp) {} bool LocalDataPackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index d456211f8..fa5d479ba 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -730,7 +730,7 @@ bool loadIconFile(const Mod& mod, QPixmap* pixmap) } // namespace ModUtils LocalModParseTask::LocalModParseTask(int token, ResourceType type, const QFileInfo& modFile) - : Task(nullptr, false), m_token(token), m_type(type), m_modFile(modFile), m_result(new Result()) + : Task(false), m_token(token), m_type(type), m_modFile(modFile), m_result(new Result()) {} bool LocalModParseTask::abort() diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index 27fbf3c6d..0b80db82d 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -358,9 +358,7 @@ bool validate(QFileInfo file) } // namespace ResourcePackUtils -LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) - : Task(nullptr, false), m_token(token), m_resource_pack(rp) -{} +LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) : Task(false), m_token(token), m_resource_pack(rp) {} bool LocalResourcePackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp index 4deebcd1d..a6ecc5353 100644 --- a/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalShaderPackParseTask.cpp @@ -93,7 +93,7 @@ bool validate(QFileInfo file) } // namespace ShaderPackUtils -LocalShaderPackParseTask::LocalShaderPackParseTask(int token, ShaderPack& sp) : Task(nullptr, false), m_token(token), m_shader_pack(sp) {} +LocalShaderPackParseTask::LocalShaderPackParseTask(int token, ShaderPack& sp) : Task(false), m_token(token), m_shader_pack(sp) {} bool LocalShaderPackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp index 00cc2def2..18020808a 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp @@ -230,8 +230,7 @@ bool validate(QFileInfo file) } // namespace TexturePackUtils -LocalTexturePackParseTask::LocalTexturePackParseTask(int token, TexturePack& rp) : Task(nullptr, false), m_token(token), m_texture_pack(rp) -{} +LocalTexturePackParseTask::LocalTexturePackParseTask(int token, TexturePack& rp) : Task(false), m_token(token), m_texture_pack(rp) {} bool LocalTexturePackParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp b/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp index 9d564ddb3..74d8d8d60 100644 --- a/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalWorldSaveParseTask.cpp @@ -170,7 +170,7 @@ bool validate(QFileInfo file) } // namespace WorldSaveUtils -LocalWorldSaveParseTask::LocalWorldSaveParseTask(int token, WorldSave& save) : Task(nullptr, false), m_token(token), m_save(save) {} +LocalWorldSaveParseTask::LocalWorldSaveParseTask(int token, WorldSave& save) : Task(false), m_token(token), m_save(save) {} bool LocalWorldSaveParseTask::abort() { diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp index 63996e584..2c3439ca4 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp @@ -43,7 +43,7 @@ #include ModFolderLoadTask::ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan) - : Task(nullptr, false) + : Task(false) , m_mods_dir(mods_dir) , m_index_dir(index_dir) , m_is_indexed(is_indexed) diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h index 24b82c28e..ff064c904 100644 --- a/launcher/modplatform/CheckUpdateTask.h +++ b/launcher/modplatform/CheckUpdateTask.h @@ -16,7 +16,7 @@ class CheckUpdateTask : public Task { std::list& mcVersions, QList loadersList, std::shared_ptr mods_folder) - : Task(nullptr), m_mods(mods), m_game_versions(mcVersions), m_loaders_list(loadersList), m_mods_folder(mods_folder) {}; + : Task(), m_mods(mods), m_game_versions(mcVersions), m_loaders_list(loadersList), m_mods_folder(mods_folder) {}; struct UpdatableMod { QString name; diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index f6f49f38d..5f04e3c12 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -19,7 +19,7 @@ static ModrinthAPI modrinth_api; static FlameAPI flame_api; EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) + : Task(), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) { auto hash_task = createNewHash(mod); if (!hash_task) @@ -30,9 +30,9 @@ EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::Resource } EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) + : Task(), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) { - m_hashing_task.reset(new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + m_hashing_task.reset(new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); for (auto* mod : mods) { auto hash_task = createNewHash(mod); if (!hash_task) @@ -43,7 +43,7 @@ EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform: } } EnsureMetadataTask::EnsureMetadataTask(QHash& mods, QDir dir, ModPlatform::ResourceProvider prov) - : Task(nullptr), m_mods(mods), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) + : Task(), m_mods(mods), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) {} Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Mod* mod) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 35929d2da..d6eb45ef5 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -677,7 +677,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop) break; } } - auto task = makeShared(this, "CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + auto task = makeShared("CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); auto results = m_mod_id_resolver->getResults().files; auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index"); for (auto file : results) { diff --git a/launcher/modplatform/flame/FlamePackExportTask.cpp b/launcher/modplatform/flame/FlamePackExportTask.cpp index d661f1f05..3405b702f 100644 --- a/launcher/modplatform/flame/FlamePackExportTask.cpp +++ b/launcher/modplatform/flame/FlamePackExportTask.cpp @@ -103,8 +103,7 @@ void FlamePackExportTask::collectHashes() setStatus(tr("Finding file hashes...")); setProgress(1, 5); auto allMods = mcInstance->loaderModList()->allMods(); - ConcurrentTask::Ptr hashingTask( - new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + ConcurrentTask::Ptr hashingTask(new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); task.reset(hashingTask); for (const QFileInfo& file : files) { const QString relative = gameRoot.relativeFilePath(file.absoluteFilePath()); diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index 70bf138a8..fd9138ec8 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -40,7 +40,7 @@ void ModrinthCheckUpdate::executeTask() setProgress(0, 9); auto hashing_task = - makeShared(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + makeShared("MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); for (auto* mod : m_mods) { auto hash = mod->metadata()->hash; @@ -91,7 +91,6 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp // it means this specific version is not available if (project_obj.isEmpty()) { qDebug() << "Mod " << m_mappings.find(hash).value()->name() << " got an empty response." << "Hash: " << hash; - continue; } diff --git a/launcher/net/NetJob.cpp b/launcher/net/NetJob.cpp index 3cd3958f7..335e360b2 100644 --- a/launcher/net/NetJob.cpp +++ b/launcher/net/NetJob.cpp @@ -45,7 +45,7 @@ #endif NetJob::NetJob(QString job_name, shared_qobject_ptr network, int max_concurrent) - : ConcurrentTask(nullptr, job_name), m_network(network) + : ConcurrentTask(job_name), m_network(network) { #if defined(LAUNCHER_APPLICATION) if (APPLICATION_DYN && max_concurrent < 0) diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp index f2ee40c31..ad2a14c42 100644 --- a/launcher/tasks/ConcurrentTask.cpp +++ b/launcher/tasks/ConcurrentTask.cpp @@ -38,7 +38,7 @@ #include #include "tasks/Task.h" -ConcurrentTask::ConcurrentTask(QObject* parent, QString task_name, int max_concurrent) : Task(parent), m_total_max_size(max_concurrent) +ConcurrentTask::ConcurrentTask(QString task_name, int max_concurrent) : Task(), m_total_max_size(max_concurrent) { setObjectName(task_name); } diff --git a/launcher/tasks/ConcurrentTask.h b/launcher/tasks/ConcurrentTask.h index 0d6709940..d988623b9 100644 --- a/launcher/tasks/ConcurrentTask.h +++ b/launcher/tasks/ConcurrentTask.h @@ -48,7 +48,7 @@ class ConcurrentTask : public Task { public: using Ptr = shared_qobject_ptr; - explicit ConcurrentTask(QObject* parent = nullptr, QString task_name = "", int max_concurrent = 6); + explicit ConcurrentTask(QString task_name = "", int max_concurrent = 6); ~ConcurrentTask() override; // safe to call before starting the task diff --git a/launcher/tasks/MultipleOptionsTask.cpp b/launcher/tasks/MultipleOptionsTask.cpp index 5afe03964..ba0c23542 100644 --- a/launcher/tasks/MultipleOptionsTask.cpp +++ b/launcher/tasks/MultipleOptionsTask.cpp @@ -36,7 +36,7 @@ #include -MultipleOptionsTask::MultipleOptionsTask(QObject* parent, const QString& task_name) : ConcurrentTask(parent, task_name, 1) {} +MultipleOptionsTask::MultipleOptionsTask(const QString& task_name) : ConcurrentTask(task_name, 1) {} void MultipleOptionsTask::executeNextSubTask() { diff --git a/launcher/tasks/MultipleOptionsTask.h b/launcher/tasks/MultipleOptionsTask.h index 9a88a9999..7a19ed6ad 100644 --- a/launcher/tasks/MultipleOptionsTask.h +++ b/launcher/tasks/MultipleOptionsTask.h @@ -42,7 +42,7 @@ class MultipleOptionsTask : public ConcurrentTask { Q_OBJECT public: - explicit MultipleOptionsTask(QObject* parent = nullptr, const QString& task_name = ""); + explicit MultipleOptionsTask(const QString& task_name = ""); ~MultipleOptionsTask() override = default; private slots: diff --git a/launcher/tasks/SequentialTask.cpp b/launcher/tasks/SequentialTask.cpp index 509d91cf7..2e48414f2 100644 --- a/launcher/tasks/SequentialTask.cpp +++ b/launcher/tasks/SequentialTask.cpp @@ -38,7 +38,7 @@ #include #include "tasks/ConcurrentTask.h" -SequentialTask::SequentialTask(QObject* parent, QString task_name) : ConcurrentTask(parent, task_name, 1) {} +SequentialTask::SequentialTask(QString task_name) : ConcurrentTask(task_name, 1) {} void SequentialTask::subTaskFailed(Task::Ptr task, const QString& msg) { diff --git a/launcher/tasks/SequentialTask.h b/launcher/tasks/SequentialTask.h index a7c101ab4..77cd4387f 100644 --- a/launcher/tasks/SequentialTask.h +++ b/launcher/tasks/SequentialTask.h @@ -47,7 +47,7 @@ class SequentialTask : public ConcurrentTask { Q_OBJECT public: - explicit SequentialTask(QObject* parent = nullptr, QString task_name = ""); + explicit SequentialTask(QString task_name = ""); ~SequentialTask() override = default; protected slots: diff --git a/launcher/tasks/Task.cpp b/launcher/tasks/Task.cpp index b17096ca7..1871c5df8 100644 --- a/launcher/tasks/Task.cpp +++ b/launcher/tasks/Task.cpp @@ -40,7 +40,7 @@ Q_LOGGING_CATEGORY(taskLogC, "launcher.task") -Task::Task(QObject* parent, bool show_debug) : QObject(parent), m_show_debug(show_debug) +Task::Task(bool show_debug) : m_show_debug(show_debug) { m_uid = QUuid::createUuid(); setAutoDelete(false); diff --git a/launcher/tasks/Task.h b/launcher/tasks/Task.h index 883408c97..e712700a1 100644 --- a/launcher/tasks/Task.h +++ b/launcher/tasks/Task.h @@ -87,7 +87,7 @@ class Task : public QObject, public QRunnable { enum class State { Inactive, Running, Succeeded, Failed, AbortedByUser }; public: - explicit Task(QObject* parent = 0, bool show_debug_log = true); + explicit Task(bool show_debug_log = true); virtual ~Task() = default; bool isRunning() const; diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index a02f527de..b3b6d2bcc 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -46,7 +46,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons : QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods), m_hash_type(hash_type) { m_hashing_task = shared_qobject_ptr( - new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); connect(m_hashing_task.get(), &Task::finished, this, &BlockedModsDialog::hashTaskFinished); ui->setupUi(this); diff --git a/launcher/ui/dialogs/MSALoginDialog.cpp b/launcher/ui/dialogs/MSALoginDialog.cpp index 2f6c6d9b2..40d1eff1e 100644 --- a/launcher/ui/dialogs/MSALoginDialog.cpp +++ b/launcher/ui/dialogs/MSALoginDialog.cpp @@ -85,7 +85,7 @@ int MSALoginDialog::exec() connect(m_authflow_task.get(), &AuthFlow::authorizeWithBrowserWithExtra, this, &MSALoginDialog::authorizeWithBrowserWithExtra); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, m_authflow_task.get(), &Task::abort); - m_devicecode_task.reset(new AuthFlow(m_account->accountData(), AuthFlow::Action::DeviceCode, this)); + m_devicecode_task.reset(new AuthFlow(m_account->accountData(), AuthFlow::Action::DeviceCode)); connect(m_devicecode_task.get(), &Task::failed, this, &MSALoginDialog::onTaskFailed); connect(m_devicecode_task.get(), &Task::succeeded, this, &QDialog::accept); connect(m_devicecode_task.get(), &Task::aborted, this, &MSALoginDialog::reject); diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index 308072c5e..4fb6154e1 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -45,8 +45,7 @@ ModUpdateDialog::ModUpdateDialog(QWidget* parent, , m_parent(parent) , m_mod_model(mods) , m_candidates(search_for) - , m_second_try_metadata( - new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) + , m_second_try_metadata(new ConcurrentTask("Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())) , m_instance(instance) , m_include_deps(includeDeps) { @@ -89,7 +88,7 @@ void ModUpdateDialog::checkCandidates() auto versions = mcVersions(m_instance); auto loadersList = mcLoadersList(m_instance); - SequentialTask check_task(m_parent, tr("Checking for updates")); + SequentialTask check_task(tr("Checking for updates")); if (!m_modrinth_to_update.empty()) { m_modrinth_check_task.reset(new ModrinthCheckUpdate(m_modrinth_to_update, versions, loadersList, m_mod_model)); @@ -187,7 +186,7 @@ void ModUpdateDialog::checkCandidates() } if (m_include_deps && !APPLICATION->settings()->get("ModDependenciesDisabled").toBool()) { // dependencies - auto depTask = makeShared(this, m_instance, m_mod_model.get(), selectedVers); + auto depTask = makeShared(m_instance, m_mod_model.get(), selectedVers); connect(depTask.get(), &Task::failed, this, [&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); @@ -261,7 +260,7 @@ auto ModUpdateDialog::ensureMetadata() -> bool { auto index_dir = indexDir(); - SequentialTask seq(m_parent, tr("Looking for metadata")); + SequentialTask seq(tr("Looking for metadata")); // A better use of data structures here could remove the need for this QHash QHash should_try_others; diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp index 02a8454b4..06fa6dbf3 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp +++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp @@ -298,7 +298,7 @@ GetModDependenciesTask::Ptr ModDownloadDialog::getModDependenciesTask() selectedVers.append(std::make_shared(selected->getPack(), selected->getVersion())); } - return makeShared(this, m_instance, model, selectedVers); + return makeShared(m_instance, model, selectedVers); } } return nullptr; diff --git a/launcher/ui/java/InstallJavaDialog.cpp b/launcher/ui/java/InstallJavaDialog.cpp index dc43ea4c9..5f69b9d46 100644 --- a/launcher/ui/java/InstallJavaDialog.cpp +++ b/launcher/ui/java/InstallJavaDialog.cpp @@ -317,7 +317,7 @@ void InstallDialog::done(int result) deletePath(); } #if defined(Q_OS_MACOS) - auto seq = makeShared(this, tr("Install Java")); + auto seq = makeShared(tr("Install Java")); seq->addTask(task); seq->addTask(makeShared(final_path)); task = seq; diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index a6fbf5088..8d03b6d9a 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -209,7 +209,7 @@ void ModFolderPage::installMods() ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -292,7 +292,7 @@ void ModFolderPage::updateMods(bool includeDeps) } if (update_dialog.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); @@ -423,7 +423,7 @@ void ModFolderPage::changeModVersion() ResourceDownload::ModDownloadDialog mdownload(this, m_model, m_instance); mdownload.setModMetadata((*mods_list.begin())->metadata()); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index 85be64256..054bede01 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -37,8 +37,6 @@ #include "ResourcePackPage.h" -#include "ResourceDownloadTask.h" - #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ResourceDownloadDialog.h" @@ -72,8 +70,7 @@ void ResourcePackPage::downloadRPs() ResourceDownload::ResourcePackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index 40366a1be..61ee01445 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -65,7 +65,7 @@ void ShaderPackPage::downloadShaders() ResourceDownload::ShaderPackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); if (mdownload.exec()) { - auto tasks = new ConcurrentTask(this, "Download Shaders", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Shaders", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 7c8d7e061..9c8ee3c78 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -74,8 +74,7 @@ void TexturePackPage::downloadTPs() ResourceDownload::TexturePackDownloadDialog mdownload(this, std::static_pointer_cast(m_model), m_instance); if (mdownload.exec()) { - auto tasks = - new ConcurrentTask(this, "Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); + auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); tasks->deleteLater(); diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index cb04f9db1..ab1c48ed4 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -435,7 +435,7 @@ void VersionPage::on_actionDownload_All_triggered() if (updateTasks.isEmpty()) { return; } - auto task = makeShared(this); + auto task = makeShared(); for (auto t : updateTasks) { task->addTask(t); } diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 2b270c482..6efd3f581 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -460,7 +460,7 @@ void JavaSettingsWidget::checkJavaPath(const QString& path) } setJavaStatus(JavaStatus::Pending); m_checker.reset( - new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0, this)); + new JavaChecker(path, "", minHeapSize(), maxHeapSize(), m_permGenSpinBox->isVisible() ? m_permGenSpinBox->value() : 0, 0)); connect(m_checker.get(), &JavaChecker::checkFinished, this, &JavaSettingsWidget::checkFinished); m_checker->start(); } diff --git a/tests/Task_test.cpp b/tests/Task_test.cpp index 0740ba0a3..463e78b42 100644 --- a/tests/Task_test.cpp +++ b/tests/Task_test.cpp @@ -16,7 +16,7 @@ class BasicTask : public Task { friend class TaskTest; public: - BasicTask(bool show_debug_log = true) : Task(nullptr, show_debug_log) {} + BasicTask(bool show_debug_log = true) : Task(show_debug_log) {} private: void executeTask() override { emitSucceeded(); } From a9147474169bdad603c139b5b8bad4e1912563d4 Mon Sep 17 00:00:00 2001 From: Kationor Date: Sun, 24 Nov 2024 19:30:59 +0100 Subject: [PATCH 153/177] Improve MANIFEST.MF parsing Previously, we would only properly parse LF-encoded manifests, and even those only if they used the recommended casing. This commit allows the parser to recognise CR and CRLF newlines, and also makes the name comparison case insensitive to align with the specification. (Though not completely: we still don't support multiline values) Signed-off-by: Kationor (cherry picked from commit b40a1973bfe590fb21b486419a8d223b2c6aae7f) --- launcher/minecraft/mod/tasks/LocalModParseTask.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index fa5d479ba..7417dffe6 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "FileSystem.h" @@ -15,6 +16,8 @@ #include "minecraft/mod/ModDetails.h" #include "settings/INIFile.h" +static QRegularExpression newlineRegex("\r\n|\n|\r"); + namespace ModUtils { // NEW format @@ -487,11 +490,11 @@ bool processZIP(Mod& mod, [[maybe_unused]] ProcessingLevel level) } // quick and dirty line-by-line parser - auto manifestLines = file.readAll().split('\n'); + auto manifestLines = QString(file.readAll()).split(newlineRegex); QString manifestVersion = ""; for (auto& line : manifestLines) { - if (QString(line).startsWith("Implementation-Version: ")) { - manifestVersion = QString(line).remove("Implementation-Version: "); + if (line.startsWith("Implementation-Version: ", Qt::CaseInsensitive)) { + manifestVersion = line.remove("Implementation-Version: ", Qt::CaseInsensitive); break; } } From e7e9265c40a1621e5a7f7c08db47bc77dc859896 Mon Sep 17 00:00:00 2001 From: leia uwu Date: Sat, 30 Nov 2024 11:30:25 -0300 Subject: [PATCH 154/177] fix: fix system icons This sets the fallback icon theme to the current(system default) icon theme before launcher specific themes are applied And removes `Inherits` line of multimc/legacy icon theme because it can end up making it inherit a default theme set from /usr/share/icons/default/index.theme instead of the user configured theme (probably a qt bug?) Signed-off-by: leia uwu (cherry picked from commit fd9c80db62436b1a364cb8342ba45a059c53f899) --- launcher/resources/multimc/index.theme | 1 - launcher/ui/themes/ThemeManager.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/resources/multimc/index.theme b/launcher/resources/multimc/index.theme index 4da8072d9..497106d6f 100644 --- a/launcher/resources/multimc/index.theme +++ b/launcher/resources/multimc/index.theme @@ -1,7 +1,6 @@ [Icon Theme] Name=Legacy Comment=Default Icons -Inherits=default Directories=8x8,16x16,22x22,24x24,32x32,32x32/instances,48x48,50x50/instances,64x64,128x128/instances,256x256,scalable,scalable/instances [8x8] diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 691a51668..81afd0412 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -36,6 +36,7 @@ ThemeManager::ThemeManager() { + QIcon::setFallbackThemeName(QIcon::themeName()); themeDebugLog() << "Determining System Widget Theme..."; const auto& style = QApplication::style(); m_defaultStyle = style->objectName(); From 9791c306dcd0ba4b33335c649fe56cc08e394193 Mon Sep 17 00:00:00 2001 From: leia uwu Date: Sat, 30 Nov 2024 12:50:57 -0300 Subject: [PATCH 155/177] fix: icon search paths memory leak Signed-off-by: leia uwu (cherry picked from commit 3f67ef968bb9be3b1cdfdfa68e2d38ddf8e1a3cf) --- launcher/ui/themes/ThemeManager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 81afd0412..bbf614855 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -37,6 +37,7 @@ ThemeManager::ThemeManager() { QIcon::setFallbackThemeName(QIcon::themeName()); + QIcon::setFallbackSearchPaths(QIcon::themeSearchPaths()); themeDebugLog() << "Determining System Widget Theme..."; const auto& style = QApplication::style(); m_defaultStyle = style->objectName(); @@ -94,9 +95,7 @@ void ThemeManager::initializeIcons() // set icon theme search path! themeDebugLog() << "<> Initializing Icon Themes"; - auto searchPaths = QIcon::themeSearchPaths(); - searchPaths.append(m_iconThemeFolder.path()); - QIcon::setThemeSearchPaths(searchPaths); + QIcon::setThemeSearchPaths({ m_iconThemeFolder.path(), ":/icons" }); for (const QString& id : builtinIcons) { IconTheme theme(id, QString(":/icons/%1").arg(id)); From af74d5f41012847ee3116bf38d3b40cc7996bee8 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 24 Nov 2024 20:29:07 +0200 Subject: [PATCH 156/177] Make FTB Import note italic to match others Signed-off-by: Trial97 (cherry picked from commit a09af619cee3265710097724f539d9457695658d) --- launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.ui | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.ui b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.ui index 18c604ca4..337c3e474 100644 --- a/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.ui +++ b/launcher/ui/pages/modplatform/import_ftb/ImportFTBPage.ui @@ -13,6 +13,11 @@ + + + true + + Note: If your FTB instances are not in the default location, select it using the button next to search. From 686e0b7b189dd0dfa5852fe0e8c47ce439fdd577 Mon Sep 17 00:00:00 2001 From: guihkx <626206+guihkx@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:51:09 -0300 Subject: [PATCH 157/177] flatpak: update xrandr to 1.5.3 Signed-off-by: guihkx <626206+guihkx@users.noreply.github.com> (cherry picked from commit 4a50e949672461b5b69b039ff240ced6dad9bdd5) --- flatpak/org.prismlauncher.PrismLauncher.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index 7aaa4f379..e2c8a0b79 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -75,8 +75,8 @@ modules: buildsystem: autotools sources: - type: archive - url: https://xorg.freedesktop.org/archive/individual/app/xrandr-1.5.2.tar.xz - sha256: c8bee4790d9058bacc4b6246456c58021db58a87ddda1a9d0139bf5f18f1f240 + url: https://xorg.freedesktop.org/archive/individual/app/xrandr-1.5.3.tar.xz + sha256: f8dd7566adb74147fab9964680b6bbadee87cf406a7fcff51718a5e6949b841c x-checker-data: type: anitya project-id: 14957 From 73b4223b6136898a76c12e4531f651aa0c529e16 Mon Sep 17 00:00:00 2001 From: guihkx <626206+guihkx@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:51:09 -0300 Subject: [PATCH 158/177] flatpak: update KDE runtime to 6.8 This also switches to the Docker image provided and maintained by Flathub collaborators through the 'flathub-infra' organization on GitHub, because it looks better maintained at the moment. Signed-off-by: guihkx <626206+guihkx@users.noreply.github.com> (cherry picked from commit f6770a847a8419ef0b1acab30144077f745a48ee) --- .github/workflows/build.yml | 2 +- flatpak/org.prismlauncher.PrismLauncher.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cefa8100..d2db67054 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -633,7 +633,7 @@ jobs: flatpak: runs-on: ubuntu-latest container: - image: bilelmoussaoui/flatpak-github-actions:kde-6.7 + image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8 options: --privileged steps: - name: Checkout diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml index e2c8a0b79..136aef91a 100644 --- a/flatpak/org.prismlauncher.PrismLauncher.yml +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -1,6 +1,6 @@ id: org.prismlauncher.PrismLauncher runtime: org.kde.Platform -runtime-version: '6.7' +runtime-version: '6.8' sdk: org.kde.Sdk sdk-extensions: - org.freedesktop.Sdk.Extension.openjdk17 From bbf21e5824a4e271e071c72aa3604b0ef1b012d3 Mon Sep 17 00:00:00 2001 From: guihkx <626206+guihkx@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:51:09 -0300 Subject: [PATCH 159/177] ci(flatpak): update build artifact name Just aligning the name of the Flatpak package with other build artifacts. Signed-off-by: guihkx <626206+guihkx@users.noreply.github.com> (cherry picked from commit e0faee7f262fda898ceb8ea5ab40249dbd6c52ea) --- .github/workflows/build.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d2db67054..5e092b4e4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -640,12 +640,17 @@ jobs: uses: actions/checkout@v4 if: inputs.build_type == 'Debug' with: - submodules: "true" + submodules: true + + - name: Set short version + shell: bash + run: echo "VERSION=${GITHUB_SHA::7}" >> $GITHUB_ENV + - name: Build Flatpak (Linux) if: inputs.build_type == 'Debug' uses: flatpak/flatpak-github-actions/flatpak-builder@v6 with: - bundle: "Prism Launcher.flatpak" + bundle: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-Flatpak.flatpak manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml nix: From a58f125535e45fea0bf9b955f9babba6afc524d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:29:11 +0000 Subject: [PATCH 160/177] chore(deps): update actions/cache action to v4.2.0 (cherry picked from commit 94c893bd865ceba286dffc1d6392df07d47c11d9) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e092b4e4..991ddcd8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: - name: Retrieve ccache cache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' - uses: actions/cache@v4.1.2 + uses: actions/cache@v4.2.0 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }} From 887db29f35f7037994fbbdb8db3f5ebfcefe03bd Mon Sep 17 00:00:00 2001 From: leia uwu Date: Fri, 6 Dec 2024 16:40:07 -0300 Subject: [PATCH 161/177] fix icon theme search paths using fallback search paths breaks qadwaitadecorations Signed-off-by: leia uwu (cherry picked from commit 614574f15c507f884fc2ceff74db8c919674a0f1) --- launcher/ui/themes/ThemeManager.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index bbf614855..30a1fe7be 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -37,7 +37,8 @@ ThemeManager::ThemeManager() { QIcon::setFallbackThemeName(QIcon::themeName()); - QIcon::setFallbackSearchPaths(QIcon::themeSearchPaths()); + QIcon::setThemeSearchPaths(QIcon::themeSearchPaths() << m_iconThemeFolder.path()); + themeDebugLog() << "Determining System Widget Theme..."; const auto& style = QApplication::style(); m_defaultStyle = style->objectName(); @@ -95,8 +96,6 @@ void ThemeManager::initializeIcons() // set icon theme search path! themeDebugLog() << "<> Initializing Icon Themes"; - QIcon::setThemeSearchPaths({ m_iconThemeFolder.path(), ":/icons" }); - for (const QString& id : builtinIcons) { IconTheme theme(id, QString(":/icons/%1").arg(id)); if (!theme.load()) { @@ -348,4 +347,4 @@ void ThemeManager::refresh() initializeThemes(); initializeCatPacks(); -} \ No newline at end of file +} From 344ae87f257f2d3bc706d7ebad56e405b2330165 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 8 Dec 2024 22:04:16 +0200 Subject: [PATCH 162/177] fix crash with invalid mrpack format Signed-off-by: Trial97 (cherry picked from commit 1dd0728a58159bc835b2e7724a707776ae0b93ce) --- .../modplatform/modrinth/ModrinthInstanceCreationTask.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 994dd774f..3592d2ed7 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -261,12 +261,14 @@ bool ModrinthCreationTask::createInstance() mod->setDetails(d); mods[file.hash.toHex()] = mod; } - + if (file.downloads.empty()) { + setError(tr("The file '%1' is missing a download link. This is invalid in the pack format.").arg(fileName)); + return false; + } qDebug() << "Will try to download" << file.downloads.front() << "to" << file_path; auto dl = Net::ApiDownload::makeFile(file.downloads.dequeue(), file_path); dl->addValidator(new Net::ChecksumValidator(file.hashAlgorithm, file.hash)); downloadMods->addNetAction(dl); - if (!file.downloads.empty()) { // FIXME: This really needs to be put into a ConcurrentTask of // MultipleOptionsTask's , once those exist :) From 4c28a94de1ce8a64fa16c187379c4cb59b2bbf8b Mon Sep 17 00:00:00 2001 From: Kenneth Chew <79120643+kthchew@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:43:28 -0500 Subject: [PATCH 163/177] Add local network usage description Signed-off-by: Kenneth Chew <79120643+kthchew@users.noreply.github.com> (cherry picked from commit c3e44554abccfd16ff7f84740932848e59d28474) --- cmake/MacOSXBundleInfo.plist.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in index 6d3845dfc..3a8c8fbfe 100644 --- a/cmake/MacOSXBundleInfo.plist.in +++ b/cmake/MacOSXBundleInfo.plist.in @@ -8,6 +8,8 @@ A Minecraft mod wants to access your microphone. NSDownloadsFolderUsageDescription Prism uses access to your Downloads folder to help you more quickly add mods that can't be automatically downloaded to your instance. You can change where Prism scans for downloaded mods in Settings or the prompt that appears. + NSLocalNetworkUsageDescription + Minecraft uses the local network to find and connect to LAN servers. NSPrincipalClass NSApplication NSHighResolutionCapable From 1d29f63bec66f0dca653e4f1b75924172a6e25e5 Mon Sep 17 00:00:00 2001 From: Kenneth Chew <79120643+kthchew@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:53:39 -0500 Subject: [PATCH 164/177] Fix tab order in launcher settings Signed-off-by: Kenneth Chew <79120643+kthchew@users.noreply.github.com> (cherry picked from commit c3712ba6483f6386e2930ec0ed059d8c94f671b6) --- launcher/ui/pages/global/LauncherPage.ui | 32 ++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 09e7bca5b..a46a6fd5d 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -35,7 +35,7 @@ - QTabWidget::Rounded + QTabWidget::TabShape::Rounded 0 @@ -48,7 +48,7 @@ - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff true @@ -365,7 +365,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -465,7 +465,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -506,7 +506,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -615,13 +615,13 @@ - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff false - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse @@ -667,15 +667,33 @@
tabWidget + scrollArea autoUpdateCheckBox + updateIntervalSpinBox instDirTextBox instDirBrowseBtn modsDirTextBox modsDirBrowseBtn iconsDirTextBox iconsDirBrowseBtn + javaDirTextBox + javaDirBrowseBtn + skinsDirTextBox + skinsDirBrowseBtn + downloadsDirTextBox + downloadsDirBrowseBtn + downloadsDirWatchRecursiveCheckBox + metadataDisableBtn + dependenciesDisableBtn + skipModpackUpdatePromptBtn + numberOfConcurrentTasksSpinBox + numberOfConcurrentDownloadsSpinBox + numberOfManualRetriesSpinBox + timeoutSecondsSpinBox sortLastLaunchedBtn sortByNameBtn + catOpacitySpinBox + preferMenuBarCheckBox showConsoleCheck autoCloseConsoleCheck showConsoleErrorCheck From 335941fb46c8be4d6043bd882bb8c555ce648984 Mon Sep 17 00:00:00 2001 From: Kenneth Chew <79120643+kthchew@users.noreply.github.com> Date: Sat, 14 Dec 2024 00:42:08 -0500 Subject: [PATCH 165/177] Update Sparkle to v2.6.4 Signed-off-by: Kenneth Chew <79120643+kthchew@users.noreply.github.com> (cherry picked from commit b6cd46ad27e8046962dcb7b3b43a973ff08564eb) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 728e9c246..4e7f14ac6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -397,8 +397,8 @@ if(UNIX AND APPLE) set(MACOSX_SPARKLE_UPDATE_PUBLIC_KEY "v55ZWWD6QlPoXGV6VLzOTZxZUggWeE51X8cRQyQh6vA=" CACHE STRING "Public key for Sparkle update feed") set(MACOSX_SPARKLE_UPDATE_FEED_URL "https://prismlauncher.org/feed/appcast.xml" CACHE STRING "URL for Sparkle update feed") - set(MACOSX_SPARKLE_DOWNLOAD_URL "https://github.com/sparkle-project/Sparkle/releases/download/2.5.2/Sparkle-2.5.2.tar.xz" CACHE STRING "URL to Sparkle release archive") - set(MACOSX_SPARKLE_SHA256 "572dd67ae398a466f19f343a449e1890bac1ef74885b4739f68f979a8a89884b" CACHE STRING "SHA256 checksum for Sparkle release archive") + set(MACOSX_SPARKLE_DOWNLOAD_URL "https://github.com/sparkle-project/Sparkle/releases/download/2.6.4/Sparkle-2.6.4.tar.xz" CACHE STRING "URL to Sparkle release archive") + set(MACOSX_SPARKLE_SHA256 "50612a06038abc931f16011d7903b8326a362c1074dabccb718404ce8e585f0b" CACHE STRING "SHA256 checksum for Sparkle release archive") set(MACOSX_SPARKLE_DIR "${CMAKE_BINARY_DIR}/frameworks/Sparkle") # directories to look for dependencies From 9cb2a3ab2d0aa89a081ce65f9a9c84f7c20493a5 Mon Sep 17 00:00:00 2001 From: Kenneth Chew <79120643+kthchew@users.noreply.github.com> Date: Mon, 16 Dec 2024 02:27:26 -0500 Subject: [PATCH 166/177] Correct symbolic link destination on manifest Java download Signed-off-by: Kenneth Chew <79120643+kthchew@users.noreply.github.com> (cherry picked from commit 8d53242952ceeed11bd1a57c9ac43344d854ac8c) --- launcher/java/download/ManifestDownloadTask.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/launcher/java/download/ManifestDownloadTask.cpp b/launcher/java/download/ManifestDownloadTask.cpp index 836afeaac..20b39e751 100644 --- a/launcher/java/download/ManifestDownloadTask.cpp +++ b/launcher/java/download/ManifestDownloadTask.cpp @@ -86,11 +86,10 @@ void ManifestDownloadTask::downloadJava(const QJsonDocument& doc) if (type == "directory") { FS::ensureFolderPathExists(file); } else if (type == "link") { - // this is linux only ! + // this is *nix only ! auto path = Json::ensureString(meta, "target"); if (!path.isEmpty()) { - auto target = FS::PathCombine(file, "../" + path); - QFile(target).link(file); + QFile::link(path, file); } } else if (type == "file") { // TODO download compressed version if it exists ? From 7bb686c85bab381fd8a2b4a8dc18e958f22c134d Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 12 Dec 2024 17:29:46 +0200 Subject: [PATCH 167/177] Do not fail curseforge import if modrinth file check fails Signed-off-by: Trial97 (cherry picked from commit a1c1c0b769d77eb8c44cef3dc0966e7184b2ce78) --- launcher/modplatform/flame/FileResolvingTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 4c2f3d69e..d69bf12c0 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -144,7 +144,7 @@ void Flame::FileResolvingTask::netJobFinished() << " reason: " << parse_error.errorString(); qWarning() << *m_result; - failed(parse_error.errorString()); + getFlameProjects(); return; } From 0c962dff599fda5818161d08e65ca7ff06cc7eb2 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 1 Nov 2024 13:44:06 +0200 Subject: [PATCH 168/177] fix the flame loaders match Signed-off-by: Trial97 --- launcher/modplatform/ModIndex.cpp | 13 +++++++ launcher/modplatform/ModIndex.h | 1 + launcher/modplatform/flame/FlameAPI.cpp | 38 +++++++++++++------ .../modrinth/ModrinthCheckUpdate.cpp | 11 ++---- launcher/modplatform/packwiz/Packwiz.cpp | 7 +--- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/launcher/modplatform/ModIndex.cpp b/launcher/modplatform/ModIndex.cpp index 8c85ae122..c3ecccf8e 100644 --- a/launcher/modplatform/ModIndex.cpp +++ b/launcher/modplatform/ModIndex.cpp @@ -31,6 +31,19 @@ static const QMap s_indexed_version_ty { "alpha", IndexedVersionType::VersionType::Alpha } }; +static const QList loaderList = { NeoForge, Forge, Cauldron, LiteLoader, Quilt, Fabric }; + +QList modLoaderTypesToList(ModLoaderTypes flags) +{ + QList flagList; + for (auto flag : loaderList) { + if (flags.testFlag(flag)) { + flagList.append(flag); + } + } + return flagList; +} + IndexedVersionType::IndexedVersionType(const QString& type) : IndexedVersionType(enumFromString(type)) {} IndexedVersionType::IndexedVersionType(const IndexedVersionType::VersionType& type) diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h index d5ee12473..8fae1bf6c 100644 --- a/launcher/modplatform/ModIndex.h +++ b/launcher/modplatform/ModIndex.h @@ -32,6 +32,7 @@ namespace ModPlatform { enum ModLoaderType { NeoForge = 1 << 0, Forge = 1 << 1, Cauldron = 1 << 2, LiteLoader = 1 << 3, Fabric = 1 << 4, Quilt = 1 << 5 }; Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType) +QList modLoaderTypesToList(ModLoaderTypes flags); enum class ResourceProvider { MODRINTH, FLAME }; diff --git a/launcher/modplatform/flame/FlameAPI.cpp b/launcher/modplatform/flame/FlameAPI.cpp index ddd48c2b1..53eadcf02 100644 --- a/launcher/modplatform/flame/FlameAPI.cpp +++ b/launcher/modplatform/flame/FlameAPI.cpp @@ -270,21 +270,35 @@ std::optional FlameAPI::getLatestVersion(QList instanceLoaders, ModPlatform::ModLoaderTypes modLoaders) { - // edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update - auto bestVersion = [&versions](ModPlatform::ModLoaderTypes loader) { - std::optional ver; - for (auto file_tmp : versions) { - if (file_tmp.loaders & loader && (!ver.has_value() || file_tmp.date > ver->date)) { - ver = file_tmp; + QHash bestMatch; + auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) { + if (bestMatch.contains(loader)) { + auto best = bestMatch.value(loader); + if (version.date > best.date) { + bestMatch[loader] = version; } + } else { + bestMatch[loader] = version; } - return ver; }; - for (auto l : instanceLoaders) { - auto ver = bestVersion(l); - if (ver.has_value()) { - return ver; + for (auto file_tmp : versions) { + auto loaders = ModPlatform::modLoaderTypesToList(file_tmp.loaders); + if (loaders.isEmpty()) { + checkVersion(file_tmp, ModPlatform::ModLoaderType(0)); + } else { + for (auto loader : loaders) { + checkVersion(file_tmp, loader); + } + } + } + // edge case: mod has installed for forge but the instance is fabric => fabric version will be prioritizated on update + auto currentLoaders = instanceLoaders + ModPlatform::modLoaderTypesToList(modLoaders); + currentLoaders.append(ModPlatform::ModLoaderType(0)); // add a fallback in case the versions do not define a loader + + for (auto loader : currentLoaders) { + if (bestMatch.contains(loader)) { + return bestMatch.value(loader); } } - return bestVersion(modLoaders); + return {}; } diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp index fd9138ec8..fcabe24fc 100644 --- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp +++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp @@ -8,6 +8,7 @@ #include "QObjectPtr.h" #include "ResourceDownloadTask.h" +#include "modplatform/ModIndex.h" #include "modplatform/helpers/HashUtils.h" #include "tasks/ConcurrentTask.h" @@ -97,13 +98,9 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr resp // Sometimes a version may have multiple files, one with "forge" and one with "fabric", // so we may want to filter it QString loader_filter; - static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, - ModPlatform::ModLoaderType::Quilt, ModPlatform::ModLoaderType::Fabric }; - for (auto flag : flags) { - if (loader.testFlag(flag)) { - loader_filter = ModPlatform::getModLoaderAsString(flag); - break; - } + for (auto flag : ModPlatform::modLoaderTypesToList(loader)) { + loader_filter = ModPlatform::getModLoaderAsString(flag); + break; } // Currently, we rely on a couple heuristics to determine whether an update is actually available or not: diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index 272900f0e..04c8a926e 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -186,11 +186,8 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod) } toml::array loaders; - for (auto loader : { ModPlatform::NeoForge, ModPlatform::Forge, ModPlatform::Cauldron, ModPlatform::LiteLoader, ModPlatform::Fabric, - ModPlatform::Quilt }) { - if (mod.loaders & loader) { - loaders.push_back(getModLoaderAsString(loader).toStdString()); - } + for (auto loader : ModPlatform::modLoaderTypesToList(mod.loaders)) { + loaders.push_back(getModLoaderAsString(loader).toStdString()); } toml::array mcVersions; for (auto version : mod.mcVersions) { From bbfa5a5ed151d5d7966160f044de89a82550a264 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 16 Dec 2024 14:51:59 +0200 Subject: [PATCH 169/177] Fix automatically choose mod provider option Signed-off-by: Trial97 --- launcher/modplatform/EnsureMetadataTask.cpp | 17 +++++++++-------- launcher/modplatform/EnsureMetadataTask.h | 4 ++-- launcher/ui/dialogs/ModUpdateDialog.cpp | 13 ++++++++++--- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp index 5f04e3c12..fb4a32918 100644 --- a/launcher/modplatform/EnsureMetadataTask.cpp +++ b/launcher/modplatform/EnsureMetadataTask.cpp @@ -19,27 +19,28 @@ static ModrinthAPI modrinth_api; static FlameAPI flame_api; EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::ResourceProvider prov) - : Task(), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr) + : Task(), m_index_dir(dir), m_provider(prov), m_hashingTask(nullptr), m_current_task(nullptr) { - auto hash_task = createNewHash(mod); - if (!hash_task) + auto hashTask = createNewHash(mod); + if (!hashTask) return; - connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); }); - connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); }); - hash_task->start(); + connect(hashTask.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); }); + connect(hashTask.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); }); + m_hashingTask = hashTask; } EnsureMetadataTask::EnsureMetadataTask(QList& mods, QDir dir, ModPlatform::ResourceProvider prov) : Task(), m_index_dir(dir), m_provider(prov), m_current_task(nullptr) { - m_hashing_task.reset(new ConcurrentTask("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt())); + auto hashTask = makeShared("MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()); + m_hashingTask = hashTask; for (auto* mod : mods) { auto hash_task = createNewHash(mod); if (!hash_task) continue; connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); }); connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); }); - m_hashing_task->addTask(hash_task); + hashTask->addTask(hash_task); } } EnsureMetadataTask::EnsureMetadataTask(QHash& mods, QDir dir, ModPlatform::ResourceProvider prov) diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h index 631b32ae7..14b75a1a7 100644 --- a/launcher/modplatform/EnsureMetadataTask.h +++ b/launcher/modplatform/EnsureMetadataTask.h @@ -20,7 +20,7 @@ class EnsureMetadataTask : public Task { ~EnsureMetadataTask() = default; - Task::Ptr getHashingTask() { return m_hashing_task; } + Task::Ptr getHashingTask() { return m_hashingTask; } public slots: bool abort() override; @@ -58,6 +58,6 @@ class EnsureMetadataTask : public Task { ModPlatform::ResourceProvider m_provider; QHash m_temp_versions; - ConcurrentTask::Ptr m_hashing_task; + Task::Ptr m_hashingTask; Task::Ptr m_current_task; }; diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index 4fb6154e1..81f544a90 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -8,6 +8,7 @@ #include "minecraft/mod/tasks/GetModDependenciesTask.h" #include "modplatform/ModIndex.h" #include "modplatform/flame/FlameAPI.h" +#include "tasks/SequentialTask.h" #include "ui_ReviewMessageBox.h" #include "Markdown.h" @@ -402,9 +403,15 @@ void ModUpdateDialog::onMetadataFailed(Mod* mod, bool try_others, ModPlatform::R connect(task.get(), &EnsureMetadataTask::metadataReady, [this](Mod* candidate) { onMetadataEnsured(candidate); }); connect(task.get(), &EnsureMetadataTask::metadataFailed, [this](Mod* candidate) { onMetadataFailed(candidate, false); }); connect(task.get(), &EnsureMetadataTask::failed, - [this](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); - - m_second_try_metadata->addTask(task); + [this](const QString& reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); }); + if (task->getHashingTask()) { + auto seq = makeShared(); + seq->addTask(task->getHashingTask()); + seq->addTask(task); + m_second_try_metadata->addTask(seq); + } else { + m_second_try_metadata->addTask(task); + } } else { QString reason{ tr("Couldn't find a valid version on the selected mod provider(s)") }; From 6934381c28aaef077dcbe198d2ef26bd1e3c0079 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 13:18:59 +0300 Subject: [PATCH 170/177] style(lint): remove unnecessary spaces --- tests/ResourceModel_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp index 6d8c25535..dfe74b2b3 100644 --- a/tests/ResourceModel_test.cpp +++ b/tests/ResourceModel_test.cpp @@ -61,7 +61,6 @@ class ResourceModelTest : public QObject { private slots: void test_abstract_item_model() { - } void test_search() From 3cdb7986709272d28f488713bbeed9cea03055e9 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 13:19:58 +0300 Subject: [PATCH 171/177] style(lint): use clang-format --- tests/ResourceModel_test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp index dfe74b2b3..13618d8c3 100644 --- a/tests/ResourceModel_test.cpp +++ b/tests/ResourceModel_test.cpp @@ -59,8 +59,7 @@ class DummyResourceModel : public ResourceModel { class ResourceModelTest : public QObject { Q_OBJECT private slots: - void test_abstract_item_model() - { + void test_abstract_item_model() { } void test_search() From 97aa15621ece6eb92fc0ee41852eb323db2a8194 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 13:21:22 +0300 Subject: [PATCH 172/177] style(lint): use clang-format --- tests/ResourceModel_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp index 13618d8c3..9eeb24d39 100644 --- a/tests/ResourceModel_test.cpp +++ b/tests/ResourceModel_test.cpp @@ -59,8 +59,8 @@ class DummyResourceModel : public ResourceModel { class ResourceModelTest : public QObject { Q_OBJECT private slots: - void test_abstract_item_model() { - } + void test_abstract_item_model() + {} void test_search() { From 92940adee32f8f3120abe71bab1c51b4574a2437 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 13:23:06 +0300 Subject: [PATCH 173/177] chore(garnix): add placeholder variable so that function is not empty --- tests/ResourceModel_test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp index 9eeb24d39..69ea6b016 100644 --- a/tests/ResourceModel_test.cpp +++ b/tests/ResourceModel_test.cpp @@ -60,7 +60,9 @@ class ResourceModelTest : public QObject { Q_OBJECT private slots: void test_abstract_item_model() - {} + { + int placeholder = 1; + } void test_search() { From 4498660b0e9d68ef372c2738b7e2af032b774fd3 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 13:27:00 +0300 Subject: [PATCH 174/177] style(lint): use clang-format --- tests/ResourceModel_test.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/ResourceModel_test.cpp b/tests/ResourceModel_test.cpp index 69ea6b016..4df8c32f5 100644 --- a/tests/ResourceModel_test.cpp +++ b/tests/ResourceModel_test.cpp @@ -59,10 +59,7 @@ class DummyResourceModel : public ResourceModel { class ResourceModelTest : public QObject { Q_OBJECT private slots: - void test_abstract_item_model() - { - int placeholder = 1; - } + void test_abstract_item_model() { int placeholder = 1; } void test_search() { From 225c9a592bc129c473950ba8f2e24aa152c79ebc Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 14:09:02 +0300 Subject: [PATCH 175/177] feat: add new cat pack (miside screenshot) --- launcher/Application.cpp | 1 + .../resources/backgrounds/backgrounds.qrc | 1 + .../backgrounds/miside-screenshot.png | Bin 0 -> 1038696 bytes launcher/ui/themes/ThemeManager.cpp | 1 + 4 files changed, 3 insertions(+) create mode 100644 launcher/resources/backgrounds/miside-screenshot.png diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 5da81d436..b78f801f4 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -562,6 +562,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_settings->registerSetting("IconTheme", QString("fluent_dark")); m_settings->registerSetting("ApplicationTheme", QString("freesm")); m_settings->registerSetting("BackgroundCat", QString("typescript")); + m_settings->registerSetting("BackgroundCat", QString("miside-screenshot")); // Remembered state m_settings->registerSetting("LastUsedGroupForNewInstance", QString()); diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index c74aa81eb..35116aa27 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -1,6 +1,7 @@ + miside-screenshot.png typescript.png kitteh.png kitteh-xmas.png diff --git a/launcher/resources/backgrounds/miside-screenshot.png b/launcher/resources/backgrounds/miside-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..604899c8b5b32d30ebda56922809bef3e3a0ec1c GIT binary patch literal 1038696 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

lS>*agSnC&+qQ^ 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

F?!Lgy}{Upa5KltKRzno2!YVQHD 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 z zR2o`_;>StqE0k>u6q+(oLXT=GgNzJnw2m`k6j^;%O&LJzO=sJ7NN?akqgfTI+McCn zI-$e8ptaSft2#wj{hQm<`Prnr*recDuU}i}?=Qn7f7U3f&^<0o1bi(6m6Ru>o(zh0 zb9+=QRg@h6(9A^>VZH9G6+=Jx;$YC_NX+C}8QtEnp6jpCDIX89))@`5720G_L?`A? zEwb^W(weNzlzOsjJslRsM8jXMB$wmtgiS|z1o_CbOW+QvnU-*7%YV{LwJW2Ez%?O3 z0U|C~ou z&9xO8eXgA%JSWj{8k#~kT=GQgO-8&jE4jXX`SK+{wapJ`{YyPq!11H#gMNd8Vbs;f z&fq(!&u)Uzc72C54(SJ{>&(YgLq`OiY8vY~>BAduk6QW9F-%5J*R7-UHDBz+-at~I zt`DcaM$O6S3@XVp*yA+MZ=no~J#9oq4ZwNEz3N6HW)1As=upyRvnyx_%07QAlvOY? z--FS~=yQ>0$67zwJ{jLB3_RqVoU}2K#8WBb3M}nYfptBH7 zNn_8a^Zot(Q5#FG;ec}re)@q+-sjJsISD^~`h*LgUmugaLkX!SH_$l?z()#^GHQFu z0MVv2{GeDy+=8`e6Kl2Z;SG#dBOQbj^eV*Yxic3SyCvAu4ECh>34c`R%(oGfpjd18 z8uEUuqpW*i53vnKt8lEc>u1yn)|^Xlt<_pTnJ*AEQ0MOe^udDpRcuB9n||VdA=>ls zHa;rsbnNYJa0c7+Is5z%89H;s}O!Bi(( zXA|0i&!wqh<(e=kK!Tww8oKP=nE6RmQ1w3!(3gnt zbJCs9dJtStN>f&1C{?AECni{H2@*N^H(xmUMdPX%cEmsZT{1ttxjE!XbfYO#8R6HX z(b7-jv|JqhR}b~$Nmk`N*&(`2yIK}NfO*CC4LqX9$45#GNl#0qV(KoJ+};M>DD?wQ z?%NMso3c`=ds8NpIh3BBFFQZ=4TU~r`*J=xFLjZ=#9Bffe3G^mCju;(y_#kQG`y(c z+?S3y(G2HpSbd7p%h7nO2hd|bEHH_3i8ZIp zj4|Mx9x6sSV>xR({~H}5^q6Nj>71?*Vhu!#R`s@|36tLjL?a>9p*kXtIF%`9QC7A= zG3WEM(;eYN1lp_@iqmv@CrD<%(fK$y>1D^F%E<#K%uRDQT0b#PCLLIT8K30*1CqcQ zX^sI^8zw4eLhFsVN-Q$8q?iFBd2Q%fBcjAxtI9*@z47`eOxaw9DX}>g{8TAvRHrQ| z>{S>1ABK;LyXWT({w8X@8jyKam3QLw8yK1qXdW z>fz?Ko@HAH!_(vAz4m7M@xFkRc0rua&q<7kRM~g31*8f>XN-IIL0(FDqj4w_pb@&@!A{)N`2ta4~OVJJ67 zc`yH2zg>d%B><^)TPbz3 zdW9-Xh=2ve-iqmQxp{v6a<3l=0fy)JdQ(|t^ZI(jy{aB7pY%!_AUgjmAFXmE*Y^E> z85y3K;Xvc#bp8Sl{e@K?uSYYbK)bocZszt-O<=8vlg_t6B@oXLw6U-8zEa%B167&~ z*rBgil#aN?Cz@D&dHVh4_RP|KI%!qEJLXqp?kH!!d@}tS^2_P0zhT?z6&es!NjmGJ zXN^|2*Tda`4Aq=K;yJ?H6par$gQzj0oxTKUMtM=rp5hERI&ReVFg~aak*?^=z@B;d zT}roy0O`Zf3{VI#I_ez`4y&I}hqxWS_{GA}K?~t$I-$ohZ4Wxt6&5-q!*qt|Q!Y9k z#Tjgwdz5`-!vte{yEnmu6gB%OeLSQqD8mO4fmHMNM5{XV?WCu+%>0`tjQu?F5m3Mh zb1Y+GN$ESci3!5*Saax~wIA2Nmr{r%A7+qb&wfLE4ZYpE zO51sc6gnR~`f^>%+;-&gaj+aiMuW zak-@a`uX!0wNCHLV|dVaIceO_x4vD%N>@7PMz?Tr%T5JJuuia=X^& zwHfF)TN=h#hopie(lX#wb@WaUTY9cEXiBC2hPLe(sun&VD+Y z9Z@i$awc8vF=tYT`i@5n)ieB9Ec)T=m^!K^M(8kq7Gsy)zm z!nNM_Mr%7yJq>|RnQd0n(QnC_?{}}-6wrhF?#2#PiRTP-&|+aM|EcApD?^NP!*{u? zHfJrSfl?APjtTuzzXjf(95`pulOKG>d0wCjTn&K=8&=y4u&rd_hcFP7+mwJ+0x*%V zif3p$mnQe#=tLw3a#14qr0zbv^}}dqxO1Zm;%82%6EGzm%QX4S#} zi1ESqrUJ+~F5H^Pr?6=o=0a4=fd*+{=#G)Yd_}ozo0aQRx2%aEl`zM0*7o`okOt7B z4kRh{$Gg!1&`DKN=~Z(8bU0B9(P`jksvTA7I;A=26lYF=2uCN1*MThFmb1ypW*F< zbdes8+L9XO%??ojHYsR#XC0T)NvVs3(e=e_9u^xysfS2um=vTxgzh5oEAv@Op!->r z`N`6#4eW3jbL$D68-+c! z5oyrk4e00RdIK7{4s{nq{-mwk0_I0(O0G3-w=rFUZ*?uog|9KKp`Un9eg^n@Uo&(; zppRj<0tv1ol;^qrTg{&W>r6-I+k8qOiNOi8i_lKhCxZKa%SZiKx`#rGNuD7!qt=`uBsMZm2 z6D9s>aQyW6kFO?f(!;-buZ2>bznWO50 zAMU&Pg|O*!&lCNUBITurUU#|p(EmTC00lw%zCU--hMxA*C+QaGFn<8t^HaE<0Mq#B z?|`PJf$pz9E^%F|W32CikMh2qC+C4c$=m}?=aw@;;l`^9h=9uX|LZR6M_^kA38Q;%1qE$A_; z!Yf-_STh9T3_XBD6$0}{=CZsq}os>j6+99HL12t_%aj(2w&86~eL(JXAPDlzw%+E9JX z|GPUB>8mtWjkwjf4UOHGIrxKeFTHAFD+Q@T2q zW7{Xn(g1qY$%Rj|!~Bj&LyXmePuQeSL;N}UoG9Q*mv+t9_Fy!ya5d>gac->C!1o-5xqs=sbXqs58Z%d7ThxFjiw5sM|xpoVDib*pB)plK$RTa3I&A zc>>`{;a9-9HtC|O`J!uI?k`e3`zOZ`p#6r^w2TD#c`5KpS%9xgRIb5_Cua)fZ}-rt zMu(_c9Mba*7Hf@I+IUz-sV1p2bod;tLwj^Pr>rR1(7Sn7o=RmPLht~gXNjp!#8co? z;d`ROUW(l1eH3V5QFHqHVIAfDaq-YGjuzFT_A!n093_4erD_!G=SRCff=b=sbm&Ax zA;2A5P@ij!IjxYKDdPj^oKq29h~bQ!p@&%F%C2UmE9yJp&3wjI?6&CLz;j2jR@fDN zx2%2)a+O)5PvfY8k-i*uHk}I~oT}^~I>BiB^MJ&P`Wm9?rflGQw~i1+{T$HMcQG4! zx!D&mgQ_>ggdG(k=*;7YJ_PZcxIM{BqIBg{uR^y<+y!8wkdkUjrD#}180qf^qF)6} z7KwSgEI>zrG8{VJDpTt^q89x%A__EEdJyA7UvV%iZ*T7PgnC`xUQ^1XP#JtQ%KODA zv+srqvqG1K2r^zDf<#%P#6KJr{$iBb#n8=SI|~3Fn9rcVGod^&uh`>gZD75}8 z(F!^50;;GHf;(0AwRd;-%4x_d-rz*Jn}ly4I=jOU$2X*sT1T#Ya^)z)NI{ERznhZK zIMGYdMvs#Y45-Egnlc_>K0R&!K5`&0E&p%`=Parkq#9+T7BS)F_W9}j{PaqBdVa}q zKEIw%B&>UR9eQx5@7bg^IKyakdpWuxP~_Hd;FP~Ie@1MEj;j!3brWxh-oUq6frVl6 zccW(;Ea;A6HFVBGx~Q&^Sl@u8w?Oz^fiekz&|}#_b%D-|0_b%3LFe>xBs#{qv2kFB`}I*6l=?5ji~h!^ig=>j(@&h^(y5^j2KNon4szg)%=aV zh&mz~5q;3J3aECVra>}BlTAc9YBBHplmT=^(4!iNH0351X<(bh6J`*8i10gSM3|dU zLaWTU1ynVD(*v-30t?T^LroZ}f8xKa!RR{lhW8 ztdmQ&zTptiz?3~=_bii!Jda*;QicF1G`#9JdYUUIRMRr_8VhL*zO{qrXPETOn3eF~;Vs5&g?iW*1`}{oDNPA>Q7P za(6M(t~J))!mr8-(O;v)E0lPJ68|))v{oqb78bqqMyGus>U3JcgSLS(`{B5B0qVV6 z`L2Mps5V&vbj;rmymcaUVuiWJo@i~g=8PCcBb^*5VWtcpVhQsi{rS;TO#=a!E;h$% zgGC{m)n(rbKmj7CH`B_~9_Aaz6n>zG5?>(r@g2PSoHtul!;YVD^ys>+iQ zeK=#e2E8_3Xl1$545#z0vfVS0_OS>SL$l_L`k^UDCWvNGtbti|qgVqnJ%ncG4bX^>`0qXF}X0M(+5C|rV3IkvbBB7%rC2(x#4 zFGED9BOJ;&1f3tG8jPH-Iby*a_20l~6%$}47hTL>{1W-u&z)aS=cm)@iSn%94b>Ge z6DO?$@ze2o)^(^OIv~%f!$Ga@0X8=SAt*a~HBr_eH!geq;3}94VTi?%97c?swe%+h zNiOnq&+YC%M|zZ#5~(PlVp0Q~`A0=G6YRmwd7z)?Hwp-LQKVtzZAc zB<0JiUXt*%@Y5^xM%i9c-W>GnjZmvnzaG2bn|WleFeFue59qG5l|L)gCj->;E*ZEG zI(c66{k*dY{J$F9ta}!@3~H^@?5FE$WdMi#&}H@q#|F@`3#h-xw{hEugjhpC7m_yR zFiAdMVYJ9NXNi)nwI+mf;LKoE)^FvWbU*By;oP#`8+UgPc*D6Kt@)8n%Z<1s&kg6Z zo-gZ5bSg7tZ=CcuS2^P=G!d1Y-fJ#KE2kbvT-2VQpFe;84CnFj5eNN2&sRYd_o^qe z0Uc4*=QzFU??D;5k*72vI{ly?_4m?fC8?+Fa%hea=Wift_LI3(bPx`1K~gHSj|2XT zGTeke0BK#C*-Ma4?ny#Wg_&y5PLn?Uz7ZO{Ef0N;r5t+l)gapjNOkp|G+ zgA=OrH~a;p#3*GO>0MvZ1EkW3PLJN8BLb;XR^8~;5R@I=4@3vm==c0%Gqbdg-UoMC zETgBL^{>RMkGIsrpPBjVqf&HHZ)+q4`WAee<`rjMt=<5vsjL3Pq z#=3Ru9{3BFBfYmqiQkQKw?c`38r=T-zy5zk4j|D!;W`bW1?wOp9HemkiU(8ljvdMG zzkT_~KmNg{3hD2^|Ni;&=lh4ny`{P!9w0t_`t;jxzs=X*UHEav>%+qXZi)B&tlgX5 zSQC6BkvlQ(5%Jl*wLPo8zWL^?Tzf?GrS{9OkB!cDO&1B0q*1c+`T{`}HOwK>1j-N{ zR5A7bOduhAvZ0Jr=Rv3AeZ4cHI8@_^IlarWNPc^DmEo>z#%gO!}XO`o3{; z@`}*)bj{u2{&0ttzOXwtkN#WivyDjhc8J{n+N=jecUS98$;0abC0LXg%iv6(zOb2Q zkn|^o>D?FIETwzk*!*+@&k18IfzdiXnF9G+fPB(9V+ru2gt>9mi*BV;d|}=+)zuJ) z-lA@@MiNt(`kNE66;lRCY7$B#I4FOc^!%sj(H~<$qf5K$UKkzy0h~MCK5$xVl9%~w z?Y2`MmgBX;m{ppYxc2G%eJWZ0UcARovKq0-oN}!r&>Upsg|N zO}@W>lwExKK^M$G4{$4PEj3VZMEQI6rK4L`Ep&Is+xz=_hJcyF8jI%ntP_c42ptex zIWzD8P=?7A#TClA%RQgRXrZ^wj$q(-*?hMpk~ZqJd~WJw5&X?|+A|p*nD}QiAvljy^Ah+n4|P z@BjPDFOLrox{mz%%imB-|1hJiF-={Pp>=5tRkuyeAQtq4)|r=l13sF%vXI#Czuml^ z9v*c$qk25(j~voNvNggV%XC8MAZPK&nbGak7|oSc(;1~8-WEVgN?7IR0&!A=zI#-V zj)$yQLx7o2b$zWTqt3A&SqSh0*CzgmG1iEqyKXSox~%`xH8aQPY1br58Izob$){%}sUI+rZTFLtxabC?QFy%9rX>m~!-vL6 zdbRVx%aDH`7xF2;!V!&E!X8B8$zOBK=QiLPsi1>t>10 z1aR6KtPoksMiWMYoYS{d0lQyHswi~8p@gY72ADytit}+(!wIfO=CLRf{Q`}psdf-i zAI?80{Wh;U5-5!ddaB?w@IlXN)B)|Rt?y#4ijnA@3EfMeZz3POS=Z2RYNi|=mLIJ$ zH#c9te0g}dQ#d#D%jai}LMj@NBUcSiMM!`xJPjrgfk*DE&S3S z{EX$;&u}t_)l0Yc`4K|Y0{FBkH`ZQFdxwN<*wgu!-0YHa(THo8QamAU#jWN{My==ncJ3Elk1;fTurLhR)~u0NCs zN4cjzV$|8|=RJ(xFY>dKk4~1hc2RbEv3_o1-p1?t^IB|Y|5bP*ZS+sOL!?TR!LPsE z>q;u#G88(`=kq`R`OmxK!{7e)FD%UJtFPUBEwR&|d*e0l+Y6xcVrJDFnCct2I@W;q z2cjQpP&m*jtK|6~CftwR6V`()j&Xl5?0acz6o zy%c(k_#<)r<_M+k)S=9ZrnSqyU_v{z+_Tc*V8@tDQ1=CDgK%BQXiuA7UL+bKG8SN&tH`8-93GEfBzt%rCH|fNHDFGvLZ1XoNjMU{-sG(HE@R12VyLP8Evl$-7r=YU21~~=+%XEvsaJ?2a_Ym7ehgn z(N815RN`njAK&bI=SCj)Rvdpd!{D1`nW^-Ge2aBh4l$mWf`XPR>omke(aK zF~uqUK*Cl{d&iUlIKiZueilzvpT+jWf1PFG=J{aWL0Ed6qr5c8PYWu-%(0}Ip;3VD zWuGe0en@1hrJdAgp{g~3by{eqlD(=Hj{CNjR*>i@h&HmiCKLGj-&Vo}a&0=Y#qmKgR)3zTt@LhSdj?ib~>11BtLkDwieez>qiTlbr^cjkE!vr6*Iy}fX1y{0{fY7d;a>`c*h1P^l_YJ1 zz8u%;CvM=#g<`Ex;uVr@bVhos#{^7@TH?C=e-MUUN6_-GY~2HDI9pVjyx9hHnC$Fh zkH?4m`+L;wWK(w+SYWlr(BbbxZOoP+L{W2$ag#|U4 z1JEy)(W@qK(vJ~{wl7F9y?vY?ddmuB4$gvQnFqyNQiAB`(l+M?7*`^E%>Dat{0-oJ z6NsEGvD)MrAWJpUhr!Ng`zS3X-46Y-VXWe(qkDco;yl^*Se;(OMt@>(7U-FBE5X?I zK##ENU7P9lX#|{n1#@$9=cy&goYJr9g$^7X5Xi5?e>CLG;?X@wP^ZS2%up{Fgm(w+xZg^GMAP z*CbM7+#ELL(5KV+;o%|okY{~+!?P^QWQrm`uJ$*ep~D%~Mqq+ko>ug|J5}Am3AQRz zRAx?4wZ4PCT5LqxY086s;a3hLOceM@m;@j|h;9|4;Eg?@P{=J|;zv|OCF*`D&L524 zgz*h%m}-D=Jl^$(M=5jnsPDblLLBB|;sJhyq$ ztDRWD7T*yS#uz(4^QtOFqzk5yhm;;SrnUTlMEdGy=k6*rgAvkG#`t<319_DlFG0+VmCXf2% ze=adxNA7WW=dbG#7gX}KPzP|7E<_%`SQ|iQ{Ax_i0qV9FE>9>*cm4*nI3|EXn3!Q? zW{^XhY;->6$|J&`^ar&)+p*HSA05c0rmJBM@~Pju{-C3>^P6M|eKo{rJ|LVRRh4a+ z!Uv{xmgNKy$9#=#b7;nxFM^U*tr2ZwQ5hsk=zQQ7 zm=ut9zR1!oeiP0Ret`etg0{D*YQtEc0?e_tN}lsK*2T&CQguthGvn)s<~rOOYKbvc zAsj#9RLw|%h()y}M2xK76?Y2isyv!E=lN_SDJlsQx(?@bINXudrhPP1f+5OwIC*Ors})Gi$BARr&Zj&_3Q}F; z4H4j)J1O{+h+tgzrqt*2XM{4?LWJuQSH7xKElyzi4Xk_bt0otrhaPiyBcBUWy$JZ} zP@jAas1-Fw_;w?7dRnaKh|U&1rd@mZdJ8wPb&|OWm2H|sWAE=ZZ}-~3dCQjg?t(X< z_r_wk+dd4}<}=}v`Ll;|u|kP|CL}Q$oAgqR=>7OWSARIhwp=?m+^Ms!h=&EUBl>HU z_}%!1{EM1nlMnMf=g!ZJ#AEv9-QGz^m4E(tO z^bCOgbaj0k{JL$MhbbLgpS@$LFWoLso{bD#OM6-U@z{%d1wT{N>&DgtX!K>0kqrSn zVG7~%$3(P}b7#q>jIg9j!zVg?JDYvqv3MoU}J4t0Ocal=&XtTv-l$D0wB2=tc!#N)Bo2yC{0!|VJ zTrbF(R>Op*5m5$ZW<&u%+kZgQPBiEK{sC9C&P=bpwazEcJT*}AIyF7{LHCdIqyM%+ zqL8R8H4rrDnQn_u_g?A8TFSzZb8&=`9#rP=Q1)X{?VQdh6w7PKO~5{58m8w8GH$`FM%IXj=s)wj*nOxY($XLJE94?zQhzHTK? z>`e5u^?s%z(@`^G)}M_Q(fX4zh=?f>qH}^4zxZ7`YRwF+6E&T;lDaC64)t>*!s*9h z91GL3caw8O+K>3jA;ql&J3RxP9~k5-JAyo4a9yZYAD5ZJC;jV)T+My>brC9xJdV8Ka5y1!S$K~0#_DMZQ# z=Mxkcsqq2y^I1=s5o5|sbT>l3_%Cc|e9=q{8|K0!pod1M`EL(}PWL<)@RaxL(%N1` z=(#X# z7FI)a44xMY$#|^Mt=;_xBdLvc{S1?CEqo+&?@#a2AgqE=KZMLOE@r#8==tlWz*KflQb+_WUC% zYTou@eK%xZ+7nw;FUMZ~e^k4!#U*(zs#jsp_B}p-B>pUUes3%nbo!-t%{YfH2Uei_ z8GoxWOfb89ybM^y4`rUn;G}!*h<~sU!70jEOFIW5wA~2dcdR)-5=rU(D0g$HZ#5WghU`v%1pGKW*_;8NAz~7OQqQQ2g+f3T{)@lBmMb@ia%uVx zE>U~QZQlmCPq4!3K;*uljodu+L!3Ad;)MTI-+(lV99ow=*NEEXh{HXUlA%22d9FDh z2t1DoB%d`(d@;)GVx)~hv5auasS$ovE=H_C)f)%rjAoA#X4bvXA))}fav(=m@T3qr z2Pg5<)j+I9wXO-EIrRdhgTn)x-8^IJO!QHMmVdnghRNZTGr~d{HAunwF`@MHuj-1V z;FuN}5doN|SN;8{-+udz-8Sbh>jUR+)Yd37W31xYP1oQqh#+d6kgtYt*64=l&3_A{_l{^lA)OX&Ibt5gBs|ZPK?!rOBHlckRAx# zZ5KKtMo}^hr#tBge_e)H&_OtxD2=&Jg6@S5u`pSnD~xJ=g&$F}hHe#vIRcYSQM_%U zH0FT6=bv&df@5bJ*xRoLaWrZyTqo9MG64U3qW7ROC$XA0Nk3GH> zrGUc6-vB9 ziGLbYQ&%YQHTY&jdi|@N6NNQO{KHYy3WDS`Qh-sGC5!w(~rmdw!}nppSZe&wqqaiz$bEpuRZn?vBsTPxdJt zGxf0sKJkBdr}tCrT))8$?R0=YM%q9}YWg|7!a)-uOwe^GQNa1($c{%(%p{#)!(LEK%Jt81+t=$OV1hgC_ZuwP-nR;J3V5Xa)Z-|S;EA34#|Z~oVV>I7Ml+u zy&i7#T@yL{jz$jYOLGfyWMu9cikKmbYZHBl*9UV>dZHXk?`HAo@7V}vanNIKypofV zk>)6T;7>gyXDnuKaC{veTHuTn$sHo3Z1V99=ssRMhkLPA_0+!7jy)LZcj9VSG-NZ+ zy`$PcKumQQp_%O&3r0T#+|E%|40&KmhM??(#fc&?bIhc`gGzi*WQ=0eOm1}h)#fnM!_mO0oBL}0cs z(jzj*qYTU|EbDPX$5K?Xg06^KguBLTh3eJzQ-6h&y{SaGqNv)A zGimA%4Ja!KTDw#M)?Q1|JjRrw0y zVNW^IPJr-rC56^yRpTv=uflwYUh7|rVRg!UD|$G_xxIHdqa{Mk6rII(4fSV-hdh|^ zFTs`luYuh<7HZQ`b3T(|$kS^zyi{2M)HSbPc>|hN`*b?p-Q7Pt+}9#M#=78e9-9Zv zSa5Xg>u(=f`Nt0NO#oh|9A?MBAFX!vcaB6^AJzYFVz&5Pdp=&^e+{j7L(o|Q3+&~y z*Kb2UZ@K+eIPndX_?s}A$6GL6r@l{Her7D%-qEY0DD;OQaYvsY8zSD;DDeujjnRm) zgMu|@6J0G)xqH`*e9HhSJ2P$0cHnF`&V-`zdj-#=2qVXs69Q)wB5 zet39ze0<&HGGlnilw zUtRPZcmUBHQQ{Tie~l8q8x?+q5?_q83oPi50z*$($vM3-L~&c%`q{=X{{bR8EjmG% zAvzXS5S=wL3LTvTQI-wiIN8~_cTP790ict75GN7!Du5Wf1tRoFSR!;fM52s{e+U`R zF*2y$&39qMbxWw-vu@Y3iFPk4J|-B96;3Tc%1VwBkmCH`rUl*aa^YT;k_ zF!a9dNS{~bPmA7)HSs?Z$4{U19nhe+HdQVUT==Q>VU9>!8WB^E=<$UfG~Z)#de(1J zQ+;@NIGywq<8*$;1WwGyk_~a5I7m%D_q)Rbmwh;EkVf_*sAV$^2Rh%~S@~2_wV@Q1 zoQn_d_15o)P(i1pzNkYe842^HtGY(QM=jq{-SvCg0Zh<+>W75#AyMl&KJ~7j(+evJ zrKP2GA(F%Uk+iGQ0Eb4>y51)=mPS$D>T!}DV?{IY9%6S7OeOI0-hbDM$oFH zP8of&lGsTpQIUD}5iX6FsJ7iw**+ho-B2te-h#DsjkQiVd+3c?08vp33}YP+BT6u0 zW3tHu{h|(SOBoa=1?$g2&sZ^mNB7pjEM_v;J+?Y9OqJ;h!BBWKIMFzXVCoI!3@ol} z&OpC1{^#>45kdV)B!3?hON3eK;m(4J{mq^O+b@g^8R_BX_Tc>G2nYr_;;hH1&L9N2u(%S38gqk#Fq#HQ)cOf+ zO27nV)&pHa;Mz~}2U2KVk)^;~2`Kdw9rqXxFd@*%I~+=wn8;SAm4+U>_>l+GA(TM^ znF$eFEV~XIxs+aN1l`R_{{c)r_wL+)B@UtR2t3ClSUn9+o zbc_xML<$gvW4A5;ChBy-d$}MC4D%Td<%_47nMf-NNEB3Dt5SpOzfn=<<^rn6!+kCd zSZO{C!_jqu@b%sLO#~u>AOt`rNA$3N6i2T*8Aqt25W_PwzWJdHAELc*o74onb)9e| zrEpdtOb`xvBUJND5m=uvRglRRIeB{CTQzfW8wtS@RStrn==zi4JnC50X=y~igI)^}4s7>8WZOtb(a;IT- zF9;1Piq(SfM;%*y0Lq3oP5{wXoHjHcfm-RjCKamz z4ihBjz83+m{?88&nnUZ@Ia|LxJwZG^e1g^){k|mk`f!AD-$IEm08zjtCh;5;>tfI? zWog?)q?h(ufKE}1Sl6D9{mOb7#&8?a*VxG?wn4FsHs6F|{gkK_jbg1(Vxw3qFwjNK z@wV0Fh@Uk|yuus#6m=OAB`DULVE$7^89Hf<=AF~ajxlFjTomzRK@JHG#^m360NrUR znzom4hRY!rXu<33xnB9n??iL!PJxCM%3F|XZrh+yu3NZ`#d$)ULu3q~sk=S4(x!p! z0PLxeQmze(Omd5kpY94o-}h8#%3kWN%kmI5wEd`!5)Xaa{j@})U@ye|`5r*;fu{BC zGSy6j@d312)q2dMQ1>32pr^6YV;6ao!#Iia=0SiNeuvHZNH4A6g*#(Pn$pyh-*hHc zV&DS*D2Zi3VOaDNeGOa7%b2bF*7OkIP*N4AJ+T#%kCGsv@)PB+!)H^1+E=#{Q4`9| zqw3aKH~^7ts~SXKM9EDb^a!T?^|^4>Ld((|bGA?}Hn7Lv#n46})qVfl*ww%K24LmK z9>Qh5shiqp(t89B-CL1Na$bZU2_So;c`XheLWBt*SwZ`0!P)833SrHZ1)oMWW68p$ z&^XF7NL4-*zTkC+d)cfRA&Y$Cp6YF}s(9NP`(4#`t__$MN` z%gT_%N~aOwOtjCDqHbP4fBya9;gQlZatr# zxH+YuCB*f->lI&u1Q}sztadp}T@HRbTWVwJ=jDB%)UJ%!FG%JTfzv?jEt? zf^mw><4#~Oikc%otGK(@dIEj&4iRMO%bs3dh-sIs6;|2ym9y*jYE~gi1|=MoI}Juu z)B-!~O~}7*jFXC<<0>n;(E4hi1A5wFf>c51FgM`qND!*n4dLTIu!=C!qy7ROdCIgv zWk$odt{`)KqT?!MJQE56F%e;k?|T*qIPrNc;(5fH6O4T5pz41FDuWeD+Uy|slh zTVWJMGg!FQFc{2&Vhvc>z7KXat(OysLQ1Q?+~> zQTy>2Lywspe|h`|q!000sWaPjj^gWLS{pK5bmc$@k;|~8tho;l4=fGrz5DL2~M4a84C6+>+k)w<*$ zrzYwx;Lwy@AwowXke4J`WUe~N?a%Z8`p7W&DH08)WPeHCY`uugZH78c6T@lHFmTxe z=+@Yq<1xdBrQRZOF9|qTKe~1PDG3z2~+fvUDw=IoD^plj9bWg9T^ zlC2Jpi$rbYD~hMBLVDlo?R^~w4vCzQ;GFDU)|29!2Oe~)cycC`?`ojz%#NeWEYu#w z5Bn57rB5`6gdu&ZZjX+%3_liIrsnDHD05kA5!M4}KyW*s9~F1wxDH81vFC{Na_pNV ztILlS-0KlAZxOfpn5m%D^-pATq10;BO~4t)Uj3h#H;Sv+jE#g{-k< z)t0Y_I`nnxlHj3I3cu5ypaNBw%LmXYLo`mR7Ri8$Jkj{DYZ&CViF6@{}2G3h(yCJzHTtSJbih%e}Kb!!ZLypno+eP z?eq7n84f5F4oTDiKD0*XOp}dIV~(n}4f67t8$Lu z%Zbn0E}kb#+%9^9dP}TItKz`Y6A;Ih%usIevw8e z2Efrli&Ez3{2XbV2tHYb$eC7nBb1;30->rkP&#l)u?A|<4?2yXUX5F`i@!#{m|??b z3>Tj1-{j=yp_3?f9fUyFWOTGC@wW^$lc;m~bBo~v2;8EHR`)QO7#iYsUN1x}(A3#d zYB51cYVus0lz~9j5Sv`DfGssl4@WlN@DOvCjtw};n9C{{t=h1uk(qq-tIfncprlYN7%cGVmWgw6J2&azbv6y4E zAK6{orB#@Vj=QIR^2doF=%802vI{xaADt^cOkH!e!m`qGqovI^`>lru{pR&E>*<+Q&@1WO zxlL+oqTO6}OJ;7O+r|V=*9zfecb8QUU1u1QzNtNDM)o5y1!{`LjGn%sS z0WE^)izdX|Zo8aLg7%z6#y>O5mgaz?^$ONCyX9cIyD=)R-Do?OT_E*nVq^LE0J>Ng zVHxggP}CLR@Ac0|AyF=ZXG^ph{bZQ*ykhM6v6ZDU0pXhnZKh{?pt_`G3%U0IItn2` zXesG_wrEQ>2#tMpuZF%2c_C^{jIlb{detqd`yrlcV~Rq?4w{y#O37)+>cLr0k5S?c z9h_*b@nh&XL~RVm{~k9)($>s2SXb$sr>8IXenXkX2yb)&YL%4H)CGyWaD~7sgrf;? zvOFlKvCxYS3^LS%@n!y(+xq4QO#K5PZsp8HOHS4SqT;y*ACbghvFrRHdH} z0_e;`f>PyjZLLDL3el?_!$m{rYMLE8KpM4V0!20b-}xn?y5(QE)feRf$mEa6`R~RB zF(1p0Ud=|W|8ND2{hY)K^V~p}b^^nhNfX80m_z8Pz66&?xjOkmOv5Q@uPz|+cgxOR zS&Jk9Jg$H09CeW+qRd%?P>o4e{7*7%yiyG;oUX~}6lGDWW7&xeC8dVLnkv_wwL|9fgb414+SK7fvDXZGsL zt2Q@T+@%NH(p$e-%+;LT5BG`y9Tr@w*}z$+nV1Ho0$6jC6DaWth{%C5n>kfQX2R?}7Af-qVvQ)&Jn`4F1aTMz#+)Mq8s^O_{`CoGVs0VAxJ=dh zan86<<(5wUuO3d{chpRgh%qGM`oO$$9A346IQb_ksy1eA@jb6li4pTs77YZWLP={hq2$Exq2Au93+FF`nAVM@blPFQ{i|s$0R&Q$=geh! zi10@}fc6M(;95V|;tKzsEzxGOshirm;T40GfFXk{(QePQBS9nPe57Our(FV%bD1^BI*1j z54S`oyxU?EIfalf`bw`mKxG)dge4KN2^k9AY-%$w+DG2^v4qS z5OfF&;OkjG+s-T^gr&9(Wq3})%IMVLi8!zNg;3E+*PvchTYtLmsp{(&L||bdRwL82 zn9QNWQIDa?JoCRvg<(ERJ@bHs+h_}Y{s4(=LPTnj3bhJAE6s$ zT%-^`>GRXe>Gr6%(I@AnJ6Xiz`f&6OnnTZYUc5p{q}fmDs>4*~CGDZrMtDkhimtcm zB&sUlR4-%Mc`3JT`L0>4rxZ#;4`lTQv=pR<($wt$J_%rKGwHN^6u@+eY6hZWElFKI zowQi77*evW(n{s)h_sBj4MrNws-C%gQg*`ZO1QXlz*GJQ*1zJk{GGi~-oiCTPtW>F zDCLi4@`o7n54M8u`efAVHGyIMM4=}Mh*A_7$oT2rMz>&Q-R zrBBJ}pl|UO(v$ji3b}7*Z|VCQ1VN7}^bjkF!IAfTRJ9lgj1D$ zL=8Y=9^%L2!l=E0IWtIhahShka%jBtD=7RsYdVOVb{C?4W6E#DIfeD(9CZS;&tOFi)-Ls+Q8oY(OLgTz@1s0+;e*)&%f{& zek8v4JRJS+(IemotRzJlCH~1qV@`Dw zR-Ylv9u%zA#*}&)bWQ+0x(eWTCIr~iT)-}u5kCa+{QZz-R)exEUk%2)|KpLR4 z0Me8JhWfE#<1GBxVgn^!=?7h5)7zR3HeG#JB!MxFzq-edrNkqT@SxJ$i!<6LbY&^^Le|L^GhOJmyVEHOeC*4Z2AuN@uG%Fs;^lEfEqOc$=DQq%2x|hpT0alKZj14xrD>?l6&iC1i7W*RX5&9Sbe&M5?_omTcN}& zl=$5!cNe3NAm|@pwB`dnhQ&4U14?*g_LpVtadvnqD59?H8f?g=dJTMr6X{% zATGgI-TsL%HarifF2~r(8jrRG;f{rJ=D8u&D2E8=IxL<$f8`l8nXs+Y*Mu!fZ^rZL z=unFAmoK;D70tt44rq?^>n+C%`r5*BWb-Oi%r|j(#gYvZ+p=kA20y!~&`L&MGR`Ew zJ>R@?5H3M|=;Gim@)kZK1BqjvI>9p;06ujTgUxxSZg1_dxg`&c9S z1e@VNJnW&Hj6_E`Aen%w8;j~UW9@m3QDLoL=^9+h7OVHDEQRJF=*(|G%!7CXRi9&z z@01H;6?$<|+jAbi&YZTQf>c4Or8*$aQ&L@W25PM4a)Vr?LQ1@U=O-z?~jMO{Ojn-EF3k5| z%~mwLdr{N=QO!?Wqx*#DG&&or>Q9BC30EV}tn*-q@eN=|giNELBd~>_K{BeoiRl5^ zeh22^(Z&m^-9#eA*29TqDdaw2ECoH5;)Y9yvWG+K@>IRP%OaypHCtOIcUmntb0Va+ z3Ell#CkRa}V0oc41M9}EqI0xNP_29E=*&^f>J~jTOp-SI{vdQuK1j91KRxuDfJ4W2 z+QN?X|Exu^QqnDAr}jIlBVP;@9YSMh!du#cM37 zs%MfLC7Qj2V+Hx-#Obfm;SkOnh%Jb%&P1OSb~Yi*@I!PU8sIl*j01gp`=Z}KNU1Rs zlZXkrcD0E;HKo-=BTeX3K{5#)=^u&P*ZfeSe!9R4*nTkRPM{q5 z&dV858Em5rm~7AfC2LkZO6V_NzF=~HuRoHpKsO)JnTleh3Y=8Uhj11&WzVGZlW;g4 zRJ$e!E$_Gbvo6s23X#+4^z@`hLTS#&!oOfYp)zZ;s6#!z!s0rDT2VXb55ZSh2yz8q zY>gI|^(j{9u}n{nRfvuxAG&J>a6*tObToD97!kc6+5LfB0T);Yf-?+-lft26RPhh*ePHACA5JZ~ygQ{vS%~OzjE5 zdQC|KC^3-st-ix9SK{tPA6$TRb0T%N)W3ZC8ww8(kLUC0KmYSTxyIyb9fxRUgNSE1 zzyA8`@4x?!j|6%f=zse3i4x_{pFd;89>9`HQsn%ZqqCOI`9*(W_Vz}ZQzakx&>#vB z_Yc~doX^j2NGExwj51cxY`eK{BORXsoI9k_vvrk`K9`-%okJ4Omae=Q#IH5?Y;TMvH^`Ng_3SwvKZ1N2P+ zMW(e4aYbUZ^w|EW2#t9@onQS1M0AorP?P-x4VD^Nf3Wd|q_oF6J-^e`#*t<~DC0xGq~a&`JbI`|aikf%aNT3jY-4i4nX znlY72ZzPK*-z~)Ca-@GCQpUV9FUPfUvCw}TrBVK#li68VBd|UhODSEN%wMp}M$S9ww}B9xGgYFzFnPqP9|=%eLtmN8XzTkx9S7+Bvisxh)0f}j=$`2Ajc-$tLq8r=C*qq9?j7r<5=u;vA{Y8_adG z7orf1^oU!Z5lFj2{Nqr0RDTIp;mp?4Pp%+b7w95-27JbvcWJe$NRw;VI*s{_6BB^ZJx1(lt6i#88zV znRP?IT1{2C-Q6)i$&j*Np&|ve-39{HqFSE8`9)vq3h{sc@Bi=9!y`B_hFoydQ#NFQ ziw9uHRUaf8tO=Mzs1hxaY7 z3L>+Yxt*Y3r6US;vIA5)oyHb*v!t;ZE~v%_jst*L*(t&${;c%Ws^# zxh|jd%l=Bqzg30?rT0-Z>-EG8O~Ne5jPGy1{gz9H_2q3AMXOz5hhwu9Na9?k3OIu@O1n*PxBDU0`hch)rdZ_4L`mjy`kvxz7j67tIgP4NmfbpVHX& zv*&-0zlXi{?%?+M{K76hcSG%@s4c58ogIZ?FE?U0&$gB>z;1_djB-lMnF+uA!fuL* zU9RF&ovExezW@23|HZ!f?|=U{vBJzkc{z6S0Ts?=x>4oT{ zGq!eCQP|a;{Fhk5kHa;(R1ae8CsxO!w>w_wAVhmbH&X}`6VmW#Rnwv%{!nF1eYHr! z66N9{7p0(Zogc%97BoOE7X}w-6%mvEB^dpG58yq|o?5N8vowXiL1d1aPbR0l zf}w_T9b2TPuFylB+uOV2y=dKxW@i?0=&AE}V3Bt>R;}~RCnIO0Psp;iUjcWD#img1 zwUv*EGIR`_fT=x@7%jzDud65EHcs*feLnCXI#1uIYIEj&n+lx>N)B$D1lBQ?Ts*V5 z-%%ag9>_n<$BAe1s|SexdPeyW6}WUrbouWGKyu}QA{x%IeId&zN74SJ4}sL5N-YYa zeKxIO!z-}RPxV?SZ(z@rx=bRs*C@sGK*6kZ$>^s@3Ft~h28kh;|~(tX$GjK(FZV3m_j-HjOa0&#=&J_wxJIPPFHc{do}Qkc{Vk2+bD(lQ`WCU^ zd4hNSw9KjYnbQd+(r6{o%Cx$3KzbkxGLTvJ4F1pPcOA<$)7@k{8T_P|@^`lS83fdL z@}Iv1+Re|;^#glAgJF_j{-&knHFgVVwRTn=NutUDh|DX5NfV(*5lsH;nCk}%CnIdM z0eWL?1^?vJsd~qr>m5m_4ow+4Qfwp@qxzzxO{de?a*T8J9M49vf~G<~W!w-=@vEF7 zSJrMLev|6|d215}QJ^EtKlt*M@Lbxm%l!qG4 z@Fdp8ZqVuI%mw-bYr&j+V&a;xwj8AaZkhw3E5J;2PO;1ukOeKYq}GiN4eEY29gc`$ zcZ>dHyP-Y-;aP88X!pdb!};!I14l8_xvy)YmJ|Jv+pG^sn`;y2zSS!5Jhz>|!+ED# zL(Z(IfKHd#%2pAdYFD@rBp!Pl?O6_d?L;ZH9+>YGw7P09DL5Zn$fx*yZKymo2iu_g zxikFe;DW2IUQeb2Q-%PD(G0LHO14ETFzUPy1W@p#r@9B4RuVGo3~`9}i_X zF4If$lm3~b^YK5GwB9B%bPreA^e;SEL)px5(8IHXt2FzZ^?^t&bb|#CpXnLDq!7A6 zTLkq%s$0jwzaR_9EkwW&7d3~wXafq}Fsd<~Gk0J%ozcl;<*ueLG7p#74NWVykaa0R zV++A`ta~6RT;j$FsP4e#8wiI*i(>J%A2# z6DR=m{ThPQ@C=9R6eSld%Z0^b5nHQD8Zu;?Xygh9kuuPuKjq1OLLtxx1Vscv8D$b? zC)7D%E@*(<4)`dJI}JUPwYQk`FTv>ldjRj*L+hBT+#E11O81GWirNCh6+4&W;a+`PU7=UUm{hjP zmJ0<2(@r#q==AeMO#bUbe&EQxSp+eiip&-+&IKCL1=dLiLb7gFKBH5)!!29@Iaj)e5;TN zuWtX6i5$3_e`P;)NGvvP`Y4gDB6Y>sWsJPw^UY~ zJ8<=TEHAIeyE~LnhmaBebv_?N$e--t-~&H_j2jfbp;y+T4o8?oozCY>RG(V6nKtwT zmnX{1&+dmZeH+X?cwV)NXu2j3pxvut*FCkN`P=ZI_2q{Dly^sc=RJ2>cTlXqRF8Vt z%OS#te3~DTmqZ2s^7;4E^V4{oPmJpG^V9SB`Ag??>FFuNGp7lmlLKk>Lka8T()k5} zv{!xjs^uTHV5YfFp0?7o)fOOcDp?0Z%@Lhnv;ltyy=bS0;CUP(j%T~Q)yxl=Z+G|d zhz`?|F(On-5gbBg=M0)Px-(3kK>`hBY$)6~)^p$D~WN@;CwHobRWs#;7~GWHW3B-t0rr`BUZwo&#tlW+~N$ z+69Q4v|;A9WAIq(XRN$Z6y5w-?ggu_kPtzb-lz(s+T-;6k9QA|Mn6)Bv0a@n)Ec}* zN#BjO_VB+pHe|wVAi=vkw&J=g)V0tO$L-N|rWHf<)@cXYnI`vEi-Sgq08UeeG2^`b6A_p`w0bHsJtLGoLnq^tZt z3Rn4jL)qDFpv2!T|Bph_>*$eMCsww>Z(1&D=TN^ziV& zt@7BvkuDGg%Jlox!VcFtLi1YTVk-^Z?pI z!Jein3^Y-TreUH~6or_n{3IZobPjadqF!?kQ1$&Y-BK;B*3mH+KY;F@At*aNbkQyd zRG$+>XVa59pHA+)7pyw_>5xaRbn&CqNKpr_VR_wV^G z9zfT|!e!&7Eq=V{eJ9Nl*HMT{S+_mzNlksXlh(oV7)j=I_^**7jW8J?4_1C&hK^59AE-lCo^@AvsD}2g zAty%0xA_TkDiy|9a28T9h{}09cV@70kHsBw-kx5o$25Qv5bPN3?k zt$uX(x>uXXRdE>AFn!;0;~yNv}J{ej%Rf94d=scZ4_4DV?%vTT#Kaj2dEDYQ2Fq1eB`ugUn#6YICm-a$o2J=rsJLvl-d;VU;q3iBi8esr{W|LBC2nv20QF&Rl~ZqBJcGJUg^+3xDR5lP@X#T8ncmwRe%eYf z%QFX{Ss7ky#dI}rD%h%+qC4d zfK%PT+tM}ada*(^aRqO0w}8dgv6nv}ddf~v(h;6xnqcxOj2?!WV>z4q2j zaL|}Tu!YgjF+FXM17!f(FRZiCTl{QVIY2ZkVnG+4zF3tkM?p z_f59CBBC^iYKhd)_r3ug;%#u}UzA}JaY&$Z*nc*chogTrQk%C@D1D?uIbm6k7tk9v ze*hhfGzmB>ohhjz(}M|N@dk7#m5paZ|9}Lw#E3W0A3&S-=qRt-^C>$^1pLp#0%`g? zMw5@EdHtWy@xE9|sDYmJR#s%iuDGIiHb8rbtM3Qpw}ld~P~yzaTh^||S6`{UuBrFh z5l*Bzgc#z4p2anZ;8P{i>zoYrOF4d=}XXK1a3=or{@%MQgUa#$2AqLuqM#(asVxIzv zB4~=?R%#qDVz@ryc75>QR{0b{E6RM8Fhdb(OK$S%B6@}k3Q{zqY&D^(mQY36T}s_? z#i)A^s3_x;5S(IpP9#fRfVi$XVddNiBlL!v|ihwzc`aMJPaGyg@sq@#Pxax2MHTu*2gXz0_ z)T%t*ACI4Z|Gi$OrhIyOe)^&Z(@#%lm7n#XdMKZsKmYz2;xparX92X1KGzH1ZUkMY zE^&L94Vp(V)HTR%UQpC|%%oCp(ra5s+cSW%3~i2xBWF!ZBNxs-C?gI;STHoYX9 zS-5s6ShpPxTH&Yj`pK9h<3LBuYAG2GjC#Ugq&w6hZc7(Y9W^8E=*m`DE*+VG4!v=l znJu(qXf>l|4m4Jg@?W!xl0A;*Ae7;_rqN%bvh5h_GkwqCqTLW?22q%plv!;cO1y-6 zM(2PXj(!3-oh5q6ycnU|h2Qmx<&G7Xj4gu=V0(yvyxExK(pvJ#d-ncXVuYKR3_&YC=tQI z_YRR=0-x9$xXQ^JNOt~TEhJS&TbT|IpxqB@0>bF%p>Y2puD)5V9v@Ff@cN9&)*&ct zJHj-bOlGAwGsaXC~>7u;{&@iGfp*co@jRviFeEcO75>UU__OE#M}cJ_1Z|;Ab2{_q!CpV_^1tDa5c)H{P|LbBy%o8= zz4x0_k1YDX{PHVqe*gXV&tHB+bniEp<1@habUOX*Z-4vpP5CFLT~#;o3X0>7*n{xwdoeZc)x(k3kI%)%ZaH zx|eWpg9i{zxyb&YayIQh>T)^a{QH4D^n?H6S!#g%*+bI==!Xa0&U5dNO#Son!hAsV zGXEolg69jD|KX1iiX-MQuSWW-$RGH^HUAkDVlk>>=)KYkeK_8Do5yzW{{Ds=yqgy? zoPK#N9uiJvOIKL;EQ!%xz4exMwLd}#s1>sf3RPuAI}dtr0}~FTOXtvqFE4b_8BZ}e z_~CfXRZ+lQap%8RbF1lxE*^k7%^R8*|M9xl8#!lVg$k3J&T|4t-6wwdb38s!n(w*C zow#uJlMqn~s68DUz1re?EF9MF_(+cb^xO)FiuyiCN*@9F!I|4!jgj+e*s>Mv20Qa) zM4jvmab8l-BEamhbcyQW){x#DIyPPJnoG|CeLB6i6zP3Q_rLx$7WXz97oR~)E;z0K zQ%>2k5Er!rJm4JH&HMUOY2wf`WTme%uoEy6_@u-wfF`|U2pxrB zq&Ja=Yw;H4UcwAgHT2hjI9a&LJU%{Br%}KB@(VhwTJaM-=&Gve>aL6(9BNTZH3a6+ zT(bzlg@y%?rO(PQ?e<{Gt)K_c^6cJ|i1T-*(9l^(Hx)*VIwlliM0yMnIY0Vu+|d=3 zBu}<|6h=+T4ytWU5;7T&x3B-_|NNg{9%=N0@1|etZ~Yqdcv1Lt8|B2ee_{<|7mReS zxFWi~=?qE`ew8auz(vZQ1geyHpnN#qX%yNYy@S^Ga<+2hNT*%U@jyBC57M(vwp4Su zPN2h`&Ufg3S!7{ACF?*;0-8t3(ogI1Q+BjGe?FlceK45dm42SqlZ;C#cxI+b_Tm^` z>}A>ggjjO|T1$yE)vtm+8O_Ja+KHs?G&Mbo)rkdvtj5r6A=Rz`l+oOTQKuXce!v9_a1FiO)_GK68Z@?*r+tOr)+Js^3iKKPt`LlWZgV#>4<*$A=R9W zXquMQ-My~1Z)29fGg-q)egGI^GF689lhKMxs;3kCqI>-j!W-|+=oCRKe;Oryw@6nX zXCiumT$?}OwqR)-19^PsFJ)NFW&MFLKV=GFeXtFe?8a2z8KmnkTXQObiip0`V5bYJ+%;GdU z(Q9HQQ0PvOFeF(~!c4YQA&^pLUcyOppiuxaZhm?dIXY2G$)}1YcX{0fpgaFgz`KU6 z{rM*j8lMCDc&CR_xsHn|~=uBHqTM=sewkbnOD@zrB8O$aB97G7go{{^Ia1KLhB!Fm{(I7rQw{F<0rO%$~f+TJxx zX$gF}!_cP60b})M>kJ?-w9YpPgsY(6n0K+~8UbAFD&5{EPQF!sNe939UnO zU!`de4MI&e^%EzG(Zw$d(2QOe#%KJ|Y;Mntz;fHemX>Hj_oU{qM3&n^(PF*Nn~nLKbQr=$wQrK^-0xiT~}Ro1u= z*5{zFH4ER%SJnkXpEJlq z62nb0fmQnI%TQzF)qlsT9y$okPUP%?VfMO*aq;PU1&QQ~prhtLd~;5;>nD<2R( zpl+5cM%P(j&adk=%ydh+8xZZ$YNVsDrVZ5&P7^sckcCMvDV&{zuhMRPR(q0o4=ExC zY0_^4XQEqZqtW7nr6_^uKUSNh0fT`{gWAZsPe{cphCVE&q&e&lSP__7an+$=m1q8w zm=73@_Eg_EIv+#(n^nWfQWj?Nyd2$+Tn#=`rURWr!IR6}5>r)gw0Y>#%dfQIXEut` zVY#%`26e7{h)&|N&#N$n?q?6#UapVcvF|?Q%Gvtou(e! zp{D6)UB03T(phBaBk05gIoO0AfGXPJ=-1!bp)KcvRfof?Ig3LVWj9=-Do*u-29B=Y zIL7s7LSAQBANH0&@jS)#9JutrHl+#KidNFj}{gae^Bp!=H9Az|U^NpCG*3;iEz%+ciqOLWx%>@efCZUm?@4D}??5NVqjhd@=UsKQ~3!{Sm^(QPqoeNzrAq z#m0;U^mID=eKb~nz4G(){Dm^RHolaboUef9#9w`K${T1XChiRSw#crz}H#Q ztH(EE8kQzET^6AufuK<&867}14e2J~OWSlW4e4~4e#Bv*BJ2Gh+9n&otv?lgTzfP6@UT7JDJ!RT z@UMU|US{|%B#%fO3n%IGIC7~R3xoSYawE}J*YglHX^!3mb%pOOZ6r0g+7BruKRs#T zm}vf#PID(w9za9OL)iAu&dv^P<+o;-i*Wpl=26t9(*$f#gD6uO$~o6@?f<)yW;>`U z?YJ?hGtq|Ictf;@m@Evx_XZ*>4^mome$m^+>01_q(paMV(OKVtIZiSroCN^RJv&O> zcWfX!fx5UTcHy{@r=cWyy{X|hWptwHwO*ZZN+3hy6c}JN6KAQ;QQ7Xb3Mf)5@!3x5 z%t?~KLzV1`kWgxtHjbvnZGDAHcNK`$n8`MMZlcdaO}3(%$r_3>pex61szH)J>IGK4 z_)MRpK%*d{9Q|Gf#fspm_I`eS$#2H^JgR|E=^Ju!#uDb8 zze~DD5qv6Hf$hFa&#RoCkB^^FhZ9|-h?st1u1~**#|MT3AE@2kX=u>2x9U&O387*N zVdRPtol!FibOPmq4@Uh_%3?&>`2lpit${uY>Y;|vr9W7~r1Zs3eInY@MRf!m@~4cb zJhW=)5Fq?G# zxWV)y^jLABvbhQ$j4quHP!GVjn(A>=&TJZ2Rw#s~u)ffJM-$}t^Mb5A9nl;i4;yS@ zQ~w(%k_lp{LPaZ=%yhezcI$f$$XQB&H#6qSOw@bzdB)rr`!@^YMIde&7x$J zD?iI}wja9$x-=T5C*Udy3pm*gZ00|r^cu?D#aMeV)bIZFLAAQ+3`x$f7%q34a21#u zgiBCLI1t<}=;vj%fQhNH(O`H04JQ8O*y#r$-WEQu4WXR2P~z{2L|MeT_WseyZlJ_p zLo_efAF*kBt*1QQTBF1tgg%Sjm`>k@N_T}4|MaMIS19qjvDe|*QDp5+I5fevp`Gjo zO8jml|IuOm_f%7M93LM39;%D?2tea;#9lBvf%KILD3#n2!eRUF8(`gCux~rpJ)tsa z%C$M8inmXnK5@I-dlp!+5Dr%T)*2emFmWDvHbAA%&2py)LRV$QRT|314+_mMj@8I5 z4-oCwQjp7M{A4On&3=^p;RE;~A~hizg|l9miooUFaqBu%OO8oMDnj2^u27 zuF6&kG&ivI-kY-1>vdrgE}47!x@2Ewj^R&h7O0YUYl~Ew&4d))<`2n3FvwP^j)D`Z zCyuH)7Q@qJyW9{ZNBG*Sz&a&G$R|Yi%^2{cWS3v6`s9!)4!l zM9TeblPaj*-D7_$QosW~m4(w(+~Gz7SnE3MS#9#o+|}Piq+|~v5YwDAh zy;}rEIB}#_{K{pBn;H#Vtt1ekl^AOA zPdx;EBBh4d0O+(1q}o9>N%u0y>eqGjLA?Q0N>Yuq6bx5pAv#7bkxr-6!~NawzyD7E zv4$i73kt0u0nVl9JU%{B=2=}cR)j=BGdxMf_fm)X>q}lC*M)u0HLS+XvYfB z6s%F=mKrJ@kytb(gfys{Q)sk(6i~KxF=Gpdj^fe`L(@+}`?FNf<#blcCPc>kEI}5kGbuDM5L=;^JNYF$%&?uma5)3g%&O#e@bjA(M(l?X@nUCP|_eQ>vRGnSgg`H zX3Wsf_ih!WxuH!KJ@UID(EQ<|;lIQHxE5eX&}T1(SioeqV@V>!w#tZa9;q@yZEP)$!&}s>{PYym9F1syg|y zvh5@<2dSz-7em>T*3jXda}{Fy4Imumw3d>{bm-mPz0S}!h3MnSzvg&H=x+}_f(}>d z37>Ez@bGYdMXz!FGFbwTTj6i83~d^%vfOan5{Omu4ja zxkf}44*>^r#)}#<5t=srKlht2>f_Lv< zJ>wdkm9(G3ly*`yySk?*{rOi#G9p?)w~Kyf1R7;~#;rv7)}qJQ zHSJX2*7^#{^59kcVFdwm5A5|_cG3HN`Ruq zG9fx=n*Z(8=rg1f9pP97VyPeC3WqDeB(c64RFl#7W?q0lmY*IUxq^(K<&@ZFaZ5M= zr+un*=pcp8pV%!7*BaE7kAJ{MMF|f%mm_1OL8=R8&_#oE=`(_4&i~E_%3*|SWz{ft zG$bl&?D6p1Z@(Q6x-{$QoF2@n?I<8ckIsaq^p{@DgX*La(4-V+NCPJQOo=&F_3DkH z91nQ%?_xL|>&gj9K`A+yq|$tbS;|@%>s?))V5>HQRBbnd)p0zDLg^|39BxG380|;` zfo&&0(In#rJhGf^%iZLn5hM{<;-= zP;&EByBj{Xn$ zR!D?tLT}w15;;}%Ei{BW*t_WCp{};w7UB(zxqT;)h?~RO?zN(}++2US6xKkKiQ83s zewO{D=UE|XI;26Oe2f>A5%4z=^NY)Gz_;`$2^ZC{=6pDM2=$kH*rRlFcmI&HAPO+) zx9GsAPaz5)lV|2X4pYK`xW8wgS?A`277zutsO*KZLm=mF3pxQt`scxBhI{$%p*J~Y z$D%r5kAEE$yMY{v+Yo+L=E@6{#^tzr#rpX6jwta@k4kri692^bwj>u;slMTAPxJ;q zsJfSsL@cWZI%Boz0@DL%)L3v; zebKW3OXbz(B6`V+n_o?}Q0ST?P{?KuX%y^MqFi7KZI7m`23P$7G=3t=z7QInrkn#4 zRfF!w{Bp=n0zcU&h0_VpG!;nDD=&eG(hBps4Pp=RognuwuMhY4e3CZ1Dt1`3?d7b! zl;0`jmRg!j21>mUrCxOx_1&oYvy)uy^7I^oI$zsLze=P-Z(MFafKD}OK)bz?s=E?b z(}P255_y*9kz)0pt<;G!6erIlA=Ja(g5pD(!vpApw!zj!Nnd8l{SR$W9PNm42uHf< zAe}FA5mYjjs$pW%Aoi?7rh`nzqjN@`i;is!DQ!S)b*FWLwuN2*PcBpQT=j6U;G9kz zOIQbAjI*9s2COqO-U8z)gVmu)(we9dQorkPnw8Cnz4mH+Iy_tSfkXYGhHKz3(F==? z?g~OP$p)HHe&u;~NF@$yGUjkw$kg=0L=Of%wJZujH@FW^Ds@fJufpVjBPr9>KU7MY zD!_xgaCTHa%j5Rps4w6lEZxoOq;LDXJ=`Df7(g*Sxe@6weR>|hv-|Ah^uovKIZOsy zSu^Bhs@Jz)nI~!%&D4vLG%R1(t)Nsqwn{Gfpq9SHfQzMjT9AV|qSJ|9U0~#!rnd`a zXqpgIlZOVWL9LgH4rMK)R68)RR~g9#LqL!I{`>E=POt0MEASeXTru-Xc_O-Nu~Mo3 zu5iRzM1K8Bphnjob-6zw;`BrO^!&^M?lI6Sl{z~}$c7xp!FNC@q(&cWD&z zj;F#GIR)R_#o{IuhHJsJtWx9hs#Kh*GwMad@exnhP5qSyhsW<^b1GFSX)H_xZFb-f znSMTpf6WWR(Z%M_rtJsNW7=~}*Sqg=5LiuCbS3QdgY%v?>z5Aor^U%%U8csUIV5z@ z9DsnwtZ3~RA@v6L-U>Z|3y;0-+3Ov(NNrjkeLh@xU?Yb^#$dsj9qP`>{F{%QH9cEq z4jebh-%_Y5N*WVOArO)5*y^Ywx@HP(Tp5JSe;S<<4#XP|pwVG&up7PC@2xWDH4S8| z8Kpotlb6;>d6CDax&Htkkf>DRII;J=w z)Fgd)+(Ww?Xox;c1PDTOsVY9(hcnVs!H?UT?XnzPPObu3HfHDhD}r_UgHC|tgMxD& zptf+LGgRlXJaG+qc|Pl#0%qll1nOZ*yoIKJQl`TxLjaujp!f{|KgqYURw{LazC=X7 z7YPR*O+c9{p47b7=lX9D4LuY7i$9G&V(PMnn2ZDf-#{S0h6`q^P7aHoiV+(A2=jz4 z_2-1X&bXq`EO}2)Pp}>zA6Z-_b-%esxPjC9!zEk#4T+@ENd65 zXZxx@+=r$o1_vGQzZb}w)=xzL)Ul(FVxO~>lBkT?5dvT2ia(M_sh=yTac!-131rbu z0RN!0<^cDCO4xJ5^F(6_(d3OGN{s zNI^I01p1az_gUJOh5XSo+HGc(gh^1!o7;(%wn0cR1=}s?f)=q?-)W){xX=p>S zjI~24a3I)noADjNNo|v%3AJo!vYpPFKY0M1^$?n_VIoD1s|IBVT#eqx+-e87N_cGJ zC>m$@h|Fhza`Xur(H=&(1FCoAD%1*N2kOzDQgRc_sTo*G&Z#A0{@QDCkmfXm$mz^J z;o$FN57SzLHP?Owmer!>7|q`Y1~*-&QHJoDsCyhYJUjD*Lr0$+r}o7`^^H$M{??=@ z$ao9skTpttDdx+-_kd@O8*&*o&&GWZdrcno)sOCBF529I-rwJ63N{^GxIJoM^cLFp zj2DB;M^STdUJyTNBrb$^JDLE|2~t6al-R|3FZ2*AIQ`^l$qR8?l?8Us+HGioy9T>) zR~haR;LZF$CZ93fh&S@@z_z1U&0)-;uZ?>xF3Iyf_$&X9#pU^g^S%4$T98jqi3~f! zSz|B%H%vCMd;r~vu{zS;aj`g>ZZ}b46+L?cnza;`-X&`fpi=@nsVZx3e*@aW+36il z2v%g&^85mV>v~d~_BgMlkPSne;Unwx44@T~R_9Ao-RLJidM@0)f@5r{>fT6VqN?oW6mpgWUke~?+~(T{g5u%at5#8eK=k01Zo9>Sr=2hifDra;a-(KS*w z@r?I5s;6V_fr16}Tf|}YqG49)NCQXoCVy8fLO8NG?br90ATO&WVMuyI^fLPi<#Po& zDRO{@cMIvy)~kXBKtqtvOTqco!Ff%Zu)FV9a;&(B|;D2vE}wq9!1RCJF{-KqyQr+k$x3+LUD zI^hs8%W9&Lke(y^#bs`XG0 zqtT$0l&P*?pb?>~7!zF=HLcNvX*p3x$O->=)0^UkZ==8`OvCS3AKcTyA(x42Ka*^mrp=t72K*5|~ zj8=TY^uC21F^ER$QK9tc}&@p@4JgJT5!OUjILHFDZML6NwSIxo1pd6zFOcI$G zxxBGdP%@>o7&=8(G4pS^9OXR&{IKj%0xlvfT03b1dBAxp6OoS}rjDB+_{@SVMf_h4`w{J)UZ1)~Or(7c=vIe4}-V3dT zPD!H-!9e3aHy|uG4wSVkX_L_5bk+}RVX{0TSR|7k%kahX`j}m$2UvOq6!`WSy~|TWcxTJ?1Gdk!k6C`f}2Z>&xq>Px`{m-#`EJ%a<>4g%i2+YD))a;I`u3V=oJK8VG=7mi?4@=Bitq`Kyvok<|28JVVAQGCbt8NVRj%3o4H(9mWqFFKCc*M;jNk%#E<54Bh)AQ-} zu7(>aC7GlZ$%_7f=}nKU_;`8M%b2gP&$s%0Q6&KX)(^+^3s#hN&ZNWY`7F13DuPb^ zR)PGyD3`-oUogm7_aKM*bIA{W$eym?K3fkW^BePI$4EIt?|5{=vA=n`ZQoLYADV;0 z-SL64^{28L`jd({Z-7`ueJI{`tK>5xjo3$xYP!@DRV&r`G<$!uBSSg*OeT%9%t|A( zg;=dy!O2wAmUN9->xQw=BNanCNKYzwIGm}kTCqmc$t;>my$Pt_lh#JMm(ttuL%%t? zKovSwojn6!rerpT9+{~w5PsZl;5_?5AZpCyVLs2mg5)4z#$V#kZSk<{{ZtB2Ef-(Ek?eAOYKGH<|n-utO-mA<{1BDa(Aac3MVJ6SEHkp z)bEvc0EZkDq`}UlqXpA`!UwiMP)tf18G)@ZV^E@6W`qePzw?C>VlugXKN(?HI9Cz z03v>LaycuA(KB@Bp`ZB|#A{vAi9N*Io?4F;c~1#=yEiioo$_#}*A$@9q|CBFV_W{r z3hyp7uf24<<{P>z8NeihMvt;Xf-EC-&Ix2g;8n_7tR0UUmk zzcZZtWM5R3mXA47E>WJI8rc#wlPUiZ2?V<55U;}Y(e5>Pvt{Ecbm)wYSc7v^lSgaR>GkIR zz%t1;PgASEQp5FvomhW!xjPSXw<2QBAK!EyMLqciNGVGq1WRj}7?MNGmvQIS39WNc z82fp2k{nFG-l>fYrCOTbg=DQ$S9_-lUs=&{HiVy5VurpYR`S{^L(l{WF3QKdPlzJz zY5=K?R~W9v-vzIXyLy{xz_o=uPkOtV%ff^H%DT@ERt9IQIYY@1eE#wqeDs+W=>m%i z>9Jg@V&eXMSLwmq;P36UCjz3GD zd-${GAB?TYMB2k2)!t;)qj%!%Y~PRDfBVP(TjU%$#{fiVm|9O)51;{@y$8_jy?+1v z&(EJf$5lMX1UhTn)9E%|IdfDVBPz!g_7K#SNO#Shi!^jHD9>KOleIGX0UtX-JtKj8ytZ)KDT0yS{+ z0rX2!&E+%i8XfU~l#=T4P`{GD9`OO14|?K}aMF_6XhNCiMW(eobXpr z^Ya(q3%D)fx`E&H06I=U&oEe2zZrXedfWx}`08V!9x>1dnN)hpD5RXAPMLe#%4Fi` zDbW__?V{#5Xzukc&1_so92AH&WazPoX6ZBhQ+k>$jDOXPx!b8aS=IPb5@;%4)y5fz z@^(HoM&K|$6Jnq-oaN9pLobMff1P=R)wSwYeU78wXCV+^!o$h=s1sq{Sb5>r@l+Qt z5NWW!pN;u154xiD5O6q^;~zQ?r{XH*dFY`$9@WWzK7ac3DNOLjP2lKiBs#R5G?cO# zp_R?tDmgc)^-aU?YU2ZFeT6)|ef#>`Z@)c%`TXzy{_oFEy3*bFt3`ku`bUTV@gM*3 zZ~yjh{f1w?(?In>Kc_4@i20LG3;L4_DEC^dNOuQ1Q{TP~AAM-nJ-QcAWqoR0U1`T0 z0!~`g!8v|^(9OI=zMoHth|5+_hUCMi>+;7HMH`aZCpzM5_Lek%jPuLsOE|skqf80H zEZk;4gA+wL9`0#%e*i7HmD3iWb`4t~((7~{;`b(igu%w2LcA@oWbUk22^5Sb?1mCF z%sv+Vf%wwDPxdg!Y&$)A`~S1|r_GThNtz}II{|l(E3e4xs_LbgnxdZV-lbXE|Njei zKhB4t?e6NLsh;YpJR>tBGQt7aweP{o#;T%fFvH$ zoTHQ}^hbxA4FBTBjCbBxUJG za&j2tGGObdQiKHYGcC@I3b9{!1(kJj{N0iEaU|@Kx(2$2v_8sogw}U9Jr~&pHrh4Y zSt>0LX#CK;(%F!%E#hpI2M?gF2R5@j7CAKzIb3x^5Jg>T`wBfj>H#!{x*K+va>Cr* z@%b{pwI0W&er4Vdpsx;F{~g*be|v_<)ZK;;pzYJC3AsC`XOSbXeXq1*ZV(}sEYyXN zYY}{U+FQ2LxJO_xP<6LpOa`@_^#Dpf^#Gb9t-Gc81X68{EI*HW0G)jtFw^{hLC$^v z9Se)jr?+=MAcegiK$GqmWT&h_Il4%_KKMT~}z2hg52ZpA6u z#ojqwE&Kr5Ge^Pj@}-+UWx89Q@tME{U|`31!~^I%aKFJt(e*X1i{dLuv40iwu~R9J z^07RC#;`zW!9il1S_`SO?}plzn+6#_1TY!D%sw0ta7cZo^q=B?32L;bBRtVxS9EH# zRJPclmez_bX_*GChsuL~&Sdfdw3j~skHGCgxjXRsrql6ar=NK03@fGPm?=r1bz0krkd zK<`r91IcU%p~5)?sg>5NFrR_`H?P&B-UI0U)qb^Dt=DVx3x+UY0k0W1 z(L1fx{Hcy(s5Bo?gqeXVo<+DC#Zb=|^VxE_UM@LjaCX)nq~#z*D;Q%phaKyN27^GG znFe(}+iy2~P{zyOgC7m-x4X^uUJjX)ea@D+G`2%Kbr+msDqt_;@-39p51`dwnr(Gw z%UUYs<>7v(N5l8|02<)LkJ9=8ns16M7JdK?52%t4p!a-c#izx4K7+^cqfb8c0Gf9s zx|T&b9AanDt?s8+t82yJE0V)*zu9i@=NKm4Qo{hvvxB^J&I>Z`S?G^UT%b6xmt)F* zI{_?D*|VEoc`%y%_6epOVHL_`1XKxW+;i1%7%`}W)R+8KqbDM92t?JGlP$%-6R*U> z^(}8IL>D1#(7z1Wf>V!Ml0{xElWZuR^qOX00bKFetf`(@qiG(?(CAP=zxfNNtf<%! zH&Y>X&v^%nthbr%2k|HTf(EVL`@?>rhmTPDc(j45C%!o}sAvPE(IO(}BRBprA*SpF zNk5P+evTKCUwhzh~*j>jt5P`fp2T4P2rX z+>ZS7um24pe0Gg9_}$lE{|aZ1&tAV#WnNTpUt&eVL=lJiVzcG9fM=)S3aNJ-g%UYH zmEDHFYXx+qM+#61xmzBOwe%-)^vJ|?4K4Kdf^d4k0*x8rchoQ=Rum44*%JLhia-zy zRPfB|>ZUaY%Q(D2zyXVCd3$^R`t@hjcMqT)8%@=HL<|8M=+V2Q+yyouhXUBxq+4e} zx{CFvpK8Tos)zbI3h+<%K9m?+2gB;tnc4*4$qw~-m_-Upq&OB*w%)T2-dyoa7`|{M zRO$P0aEL*4Fi!D<$(#ouy5RUBqtxd+dcpd~-t8F~db;C2mE-V(pZ7qI00R zf>QRY41#4jAaqu`>A|e_egN&`)Et}OurG1aicG0)0Zk8Z6DUHJz*0K}OwBTc#1tude|vyL1<_V5G?xvbm&X!<|_0&yQ&Yq zZAqcKur#$UmLBXHltS4}I*#i7J-=83l`tXZ^A%FaxP-gfZ(sn^?b#2Y+agegxyRH4 zXatFP&@Mt9x*GF8)!+I6I>$e;6VE!!xPGUh){4;w&=`cg+=f0E*dw}(QAJegJ%HvF z>>@tMgfh)QjlaMpQvy=7bWVC9y$8^|@W76Sdbzk+Ec6?P95r@9QDdrbiTvTV>=5x`T_K3pM8OVF;6&`5M;MLIQS}$^07RCMmh?LZBs3gI{R`||AX*Q1TuaI z1A__-Li#Y6if5_|pW=TBYE&mC515J{dRKI6vsAX&pqAE(r>V83>`%9QKC>@B|5b>> zev#Ty?S@jUit$DOvaqrq@UuoN#<+rCEH)cnGrxYt8_Vlg{N?3uzxxwh;W|u#FJ=u=EBwJ z9ydQ%xQEB!qZQoeW1z6#v9Do+T1=slJjq}ja82CZ^!gST}&o>^8mtf`M8` z!uRqplVQV59C78ii=RX6p~VA|r72kdbf(&!B$gDw8?yuh;)4;gN`ooy1G51*nz1L( zN-vC`kAv8FZJnC#cp!E?5_B9079(-<1WitF+a?4`^?9Ux|0MxxBx88a=E5;ch3W?UoDn6T&+abMab%N zyCACouLh>-6DzYw^P%rytX488IZvE%~{*SBq&1bLQym|9#y}m(po*+T_$_pMT8akYB z=C8i^r~mOUP`tT*^Y-p7cHi~<`hI`^YQ<}S<$QsGg@APrq5kB{FP8J!>zg%h<*dgJ z!h(xv{mnz&(GhzMS0Y$-+18G|n;-UmN{(J@2_9sewa$c;Hkoqkqu** z@k4RxSd@DFw=zLCXId?C70;6vevY;4jPKz6n&fmfI)l4f84>M0`EiZrXGE&PQs4LD@i$cpGd zCua=&(jXkvxWdOU^3x$KDGUDnRjwxs9N=6Qm&s$TqqxZ$#{T6Ex zvheB9x>kC71j-C-0GbG?qncSpTL1zY%2Igb1M9I7sn-eBTU|G5z1Y99tP_AQkl@(C zA;hUm88eo}GT@+ffuS47;;?rSHNs~QXr+uJ(Y@eB@#@;UBRSR_C6*af;SBdm16koy zGe~)|5vp~hMp(h}iGWd>z%`s}{r9)`aKP$-{B5OygODF*(x+wINz+A|qz$ZoT}d4-EW z?BAZ5>*7H9^Pm5W)%CN_KEt$!23G>8>$9Y({%Z_Xe<%;cs}1L9(WEel`C%r;|57e) z_nA13NS~>Ao-0cGe}?g&U^4#hxNvH-RDL)-*EmdJ|1UTGFU^M*=U_a6<-s}wEKkMn z?|?>~I3@dptzf4cwrt_=v(91isXGjP*#-qKG*i63l<*Blr_d)w_9Fh&KJP*7spV#qQ4^b~FB zPknZenB82qjud+eX4Z7EZRdwOxMy5!g%LdO1L)54v7Y5A`%AgZPh5?8RbeEF^rXsw zZ-|dEFiZ46_7Zdh)-vTEGmmN4>lC{E)iB}zG`029BaC?&(s@kv%M&s(g{cS78P$YC z>;)c1I8rSS&R?1CaAczm9DPc0y-vArnGc|y)_A!XKYk=< zIV98VGW@_P79-8S?x*#Ni#KODew_YEX+#7s@Z9Ch& z{_2a(-TfD<^-o^C`TW(J#cKJN{bqT+{G6}G)0G=V3|LknKm%_W9ms3_;UhM>+btJ5 zcW7=bR_nKK-`>1_150*XBjzALI6-WJa(CWAngi;h6g=js1g=saBvtePx+A|`qVG2M zBba&yZF{$6tif>9Y&8IbEWklxp)Hz#X00)rOJz0>8FGP3MGt zl&phvfvY|~fL`eH)O-MqUADn=$6d*z9zgS5S%qZi=*bVDA!|j7QV6(av^-$y0d&3m zX=j2{$87o12hjFeTSSaVdFG}vu3a%)sy_Jux_YQ|pB)jn3aPViHJlG|*Lj3-PWsm_ zcU@H0fP>ZQ`go_Hai9UagH`3z1L)^tVm@~x89?SN!u8CI51_GYpwupSB`pVyS1+x%hk_W zOpO1f^kROOT-fe&Mfq&wKf%;^LhmMO0IB?Nn2P_ocbP?G+^~siz-6^Uu=lcCT(egT@b_zx&Idk)jA5{Qw$8 zNd36;=H|wiblt5_o`a8z9n1hca9QsjKyP>V$l9LKXf21CDnzv6cyXT(pivQvz6Dq= z_&NjMfQAMa67cT}1sL0>G(2v7MTLNoLWvX=arXp9_Gwoc?j#S(T z@Hagu_Z~Dac>MZbTJkFyW;lTPi5d#!%uy1=>CVOg}tg z#rb^2hd0Buo~M}As~>LPLiU4Z2xyu`f*;Qb$o8|{?eFgH{^ei)2NwL@)oy+@#}34P z^~}YbP#VEl#u|FFe)alh{dS#em*_lwz|e)!8De)rqY=Bw@g?Gh)etHqzMZvXyo z{^$Aa_bYy!zz<>(5`saaXc_^)8=pNL;4nUKz-oNG=J&&@EeskTKwrP|*IRMFV;%t( zX5anxQ-37fI|$YutEgS1b>zX(zON_U2UJHVvdL^>&D5{-w)O`56=^Mv-ggYL$2Y`9 z%F%i$>NIh@4E%TwSedP-P1+U>{b2S|(>;L3PSGzRVHx0T@dIdI&(!0$9PoeniU$oaZOA?jn#=KQ!Z`Y=1=XyM zVa{-9rs6M`pV)K9ePJbd z#%kdHIuJYmFdsmBO*ZX#+R`yw?jAs6WT2pY`T=xp7s$zRWGtf#?!|n*#0kI!qqGt7 z++1*w08LxygP7Rj`Ctmbr|)PeaKITbcCoI&LJ(g z0W=>-V$B_U0FCr7-+#N^`b*RHI8DPR*H*Sdw|<+6Pln@eC(psX#SXRPe0y{KT7LKd z8d=!Gl}zHo5vd*?5Jg8nPy)1ry0~xD1tK4_!UHYz2PJSy&@Ck^`qmm%oT3&|S@LoL zwIF0Efs1+BQ z@r|10lwVF-@Po3*bdx7#3&vSHXz^o+mcA2?zjquWWH9~9O&a%4sK@H8%IgO75lYqt z4?TcJiiXf)R^;QWi3iZCq?rjjjMs9un6EIu;1k1}51{9ZYnV?xfQIC*xjEJ=51_5F zJsQF^ob7MjAlp^!k9z=p8v8e0TaWYfWOQ>><8dTa(*rkPyi1y&netZTA)A_BY9CQ` zjD}s6-F_T0+208~VOo5>jh|FEb=NU&gr8)U}O*7 z182xC0ytK&fAn}cWbLuz+t5h;)-&!X`Fyj};3)S4=$o5YaFCJYWb=Nh5n8S{oV7Fw zv#!X|wtl9lv)w6zV}XFTtR6clZsZR4o7>F~w_kkm86t!Rs|`xMI-wp`8{98_{`u$p zW+4Hay!VlPX}1%g+TkV~BPw#_v2(rOv8q~QdjLNy706;3L2BG01)YnrMlO~&SQWqf z{(G-!D3bd*E=gd3PC&_@fWG6Gd$5FV?(X;Zo9)#`%k*|WyS_c#{%`;Oe|?QJ;cW5! z-P`~AumAl&{XhR7Zw_0ugg`PF06$)Sd6#)O+~_YQpivYdP&UIbuNI4IzX9#Kux}qg z`*9~`ruALb04nRVmVuv;`c=xo(b0bZjda9D*x(Tlpwlx_2ZPl8rA29)sWf2F)5Q9$ z%ZSE+nJJdl=TT{JInxQ8z?ezgk+`bl8_?Lhw9g07NGtW2MX6gUZIKLPpvSDU06mtM zL8+-KT#{D*X+Nkq(d#2sSzYz?!$AtFyM3$x!|K(h;s?;ZR>rC)Jw@phNaGws;Mp7A zCgQIT`uzqp1y*4N*R2nrF^NLb;f$jis{{^b{{iQG01dV{gHXc{nRa_zN}=-b0rc(N z2CD(47Tnn{lt}9XXlvZ8S#iSSq>|Y!|p1#djJg&FgvEYzktV~-shCgGpRD1ht%mWe*mqDxHc1t zlL1@oe#QBi~X(f{dNw2hfWp&&5z?4BfC_fa_+h zV|70zP;SsiWcjsLof7hL<%!yvY3_B$%k0~4zr}3#184+4pXmZdWo9bo+HRfC)t=L| zudzIc`C%r;|6)Hc%v3x$(n9JpW&d2gvj6kP|3e$kOZm{^zjXXBWy()&vGTF+-{)d+ zv;GRBlpF8Il~UlciZkL-4;i<97(0NG_1H>)QvP%yq>G2cYRSv8#gdQfHk*6Modv5Q zYfGf4j&!%h1;1@_->89ts_Yl~bzR7Ohl-Iz3~&=aK`iT0WI177R^*Me1Q!uo11Iw z!zehyfw;ZB)kj>hwg3)bCucm&bOKUN3yeSRv@m`edDh}MYg6^m(~OSROTN&)+uZXn zTOIh-%8ZG5mCU=OCvxc*Ce}8+6+dNcweZzXI1?L&0#x52>a)*3`{MJ@zx?8hpZ(+~U;pIiU;pguuYdN-&wujO?YBSt@@GFsFgNRK z1pTjn{N2~T`1S{G`%zmIqmBXyB(dshyh?|MAnLo@zML2@5NdbbP0k&#R&FXy9;1N(}?i zzAcaGamC2fhNxkA$a~|X;&$Zwv5kXTu6Xn&bh_&~41-}K9kup^4M)4fs|_m2E#+EG zg@hT6*qG1SWXQZy6*#HtJdeTW<87qW@=5{j{7FPVbu65x6b7M><#6l)we8YL>71(I3OsQLw{%6s5_wX0Dbr-lTXyXA_n*WmDU z*7`KCa1mqGwZF!ku~9wWfQ;60&4U@z+rONR{NeQO?hc{qnu@DOq$)FK#T-6KwI6gJ zoaJqV$JP2!cxa)&k9K4pO5e;qyc5*q@iUNLAD@+IG-`>?o9_MdD*0^)Owu-LzJS( zIi(^@j+W=()?W_CgUcy&Et=EiAY|@$y?X5a;`$2$dIUZ9cnn?O(Si+s6g+Mq>^iJ* z5vcM-VB{H_u*QPs6-l9<{+S&EdfR87W5C)Zn}F<8%@UOps1brpdk>)XIE_D*gsq-1 zGGJe`qG=x-u+TBZTOIyT4H$CvYSuwxQ`L>Aph4=aWmrDf188^{#bJbzP(;V$=!vM2 z3qbo(v)}6h4id=1W@n|sGwMmHy|t+fMj}@&jDi6*DHdP2;r#}`MW>FWfsq=F=8~El6d5bC$l+DX(OLtJ)r+;{VO>P-b0Rvmxx2r) zxkkTesk1hJ5ccr)_V)Vvnj_Fr?tNmxu|59Fq4#cg%Z^n`pI*v5Ec_GtPO;zI-$M4@ zL|`6Rq%@^-R z0zFQo$M9y0&1SP)9seAqr=sQVhnIq5r^)~mR`95H>CsYfCO68&wNl7zP%4Fox>Lun zhhYrGt&5}gBiaZ=)p zpFLQsGeM9Lt0w8iFEN_ySspXlmdsL5H9YAqgC_!KxBP`aHtzSP{Qw#ZfgY7&iQ7ZP zW);JB%fA!Dn#C{hEb5IjiZ5MxJ1WM`u!f_bss!)R$5Y=9cXr=+(4vTlorQ@$)FCeOYFhp2q z6V+af=bQiIs1qZgiLmGs#SK$MuJz+%aee){Zdr1}0Az~6<5r6>7COTts|$E;JZEy4 zb#&uu4EJ}iSuWR5;=~L#+j}g*ZW1%W0`$8bzexk~a=F}Ww!AImjce|+uuRZ88utTe zSi&CHf?CrJ?Y+x=qM{&J*i{FtOEW(BhLC!8lV-GZ7_6M7!Wzr)!<$TfwTONCDpf-h zpdR#H_rnS4g7S|u$);Zn`q$MIPuuRQgGY+!(OC}~_OuH5Y}5uc##r(FLjG>Fy6T_w z$#W@Y$lk9Aa!9D-oWW$FTsJFQeQp|tp^_T{@Q}MXra3=3DUK=6)!bX^#W*O!I2;Z9 zw3of?RY8`!UP=f6LJZ&)=QE2>K7dBTc4(~5b3Ew~I|7pwBdjj*;IebI#j9T03CC%f zJ{15oa3w#!N4oq0H15QC><>3OXq4F8g_hdlQ{c>M8a=V``w;l58^hJudythyF*+?} zYIL=F%s#jc+k0pmRDWpWH16tB;8fAJ;QOO|B^R4CoXncf*y$H+dhwoJ9%vSe<>H5XF|_T_e#+Ppa(8j_it}szkY=k+qR%H#%eRWy}i?SXLZkBQL521suG@S1Kt7H z_;#~4j38Dy*t!NbXe{vOYRxZU#qcgyIJxc)SDW4b_I|Tit+6oC(|myqMd%8>^W%ZT z=I)L)_!kTKL>ei}=4cfA2nJXXc+4YRp>4Q_T5BsmPCe|l`#rYbeDmvH{q&bNxPv|L ztEGSU=Rf`Xzx%uSezTb2TptG?JYl#Pu7^%Lm&eJPzxgG78I}2Rv)wMs8_?*X<_kq6 zn1m{U$jK8z*-+|@GsnK6#{YVvV~5}Ju8i7FJ5XTVcHHen>CHo@8C#Xz##*HnlpZ-|T-=#a zFPReqYt(MH!FX_yLYbaN^C!<5G@H*gXZW%)wAgF?2hiO;4ycVYw65Kt78iOp6EK?o zE;F2VP^;va4z{XPuf6pqYOzFK@F&-}?$CpUVxXN-Az=npWl6CFsrk>MlqG27xxR8A z_6~aHV(aO(X^(S56uj18_q`1@VFL--K5jiSeR`9PM=4_9DMQy|Jh!RHO`wQYxbml! zt5fJXm&_Op%|CGhj{nFOd*rA=p4W8TFB(^5xlcIo*a`Yusz>98H|-_KZ0IO(1~Doo z18_O8*V}23(d3HfeF!nb37znVQ$B#!8_+D^4D|B^v?3Gt2oAJK6Okwzo2JkRm+B|! z8hYwhVt$uf9jmjp*gH?<*~b4u(!W-o$i8%=A0Y2*{HOTXcLCxbbiorW?}m~(@mh5E z!Ncsl6h9|$sVFO~Kxu|0+aoq`h-We|h7&takOfgJY8A*y%??U4YhemB=XBK4r5_jW z$b%hEY9G%TE?kQP2*&za5ppH84f_dDB_v@dz%nXE!yWeaEZ9HO>98L_?_JqXGRU@^ zFnF-;v*TfpjA)O?cTe5X9ux0<#|E4QwmF}u_GH4{5RRJ-BG3+xa|?R+2;7*lCfqeR zn3f1@43yff{im@7R_?eu@UPoV;iUtV?8;wVB7xbIm&>(m^i>&>o$jyZydB*0j101Zkj&_E9Zm|^7A=8)YLZXnm#DHzzz zb`N1TUtZt5e)amZtJz|=zuN9`wK2b%bGJg?@}*~fKZgCo?H%^cEq2kJ9w~z@Z%Yq5 zeU0y)>0ygluei%MSNpBM@)&o03*5Kr$iu#41%CAs|GXi?Ql~7?<96%6kx+p>KoL9N z;JOy722{CXGgGrJZHeLuJoqiO;yHd=Tnh}c9u^2ta##g+lg*4vFU79xyy6zaNI)5q zK&_A_I6P2J+}0>AwHc@~7-R=T_44RyfO{Po0n4b>RDp&QxE$K3tE2F&^Rlbdx-Bw% z23l{~?z3QTmA1voXc20KbRL)5|A_Hux1eZrl%lvHiW^)y*Gm=p$N;9C=a%D;RvH>T zU}B9PEj$lqg+0<#(|$CTnon^ zM&iNvf0V>@oD_uFYjyoV|q12@n1cQn^#}(G|3U^QsNKodm8*lP9N;@TrA~r zjYA=BxA;CD@BJ2U-@bkQ`ZHYhq6D}7u*7{JW&mW`3S@DIj=B)m>osoe`LQI)wYW1C zYK3p$!t(n1S|1qt#v>k!z(iTC^@rn{?ouE*E+Y`91%<@8nJ(zz=H^;XXaj@v13`M; zl%fdzrBi`g>Lx>$B6-MaW8^d_J!Gl5i*v`yJmL^Pg&DyxQsL`S_i$X3&n za2TwqV(fHBtQ<=rxC&+kG?uf7R(k0VE%Ctz!qZ5_yH&dIMV@WwD`xllW1jNCz!3l8 zieHruTUJsnn7Ijn3^c&4d;VJk0hUnOn9ldR+2Q!dGZ`7o_N)t~s<5KHapQzW$ei<@g6g}9^gc1-86S*p#vU6AnRU_YIY-6m;V56t z7Dt)y!sBpR&6kV$B2s?M@SK1BlYglOhrx>Jl6s`;8J}{`k>a2JROgD{Nx4|+*Fcuk zFIRIcl&HmTevq|5V-DD~<6{j|9h<31kTsF-a30RnzhyKU75ZR7fDHs21BYnY+AM_t zS4d%ScYnLzY_G4^7yu}30Bnr(_V(`P=B76v;wNzvVJwZ=>5XYS4(YWZHIM^?%|_*dmWzCAhOtru#p1$mlF%^c!MoAuc)j=mtTK9-)-i)7V^M4cz|8cYXB{+P+_k4?I%9C7Su0Ru+f)1 z_WGMk8uWZ`R2yT`rcTAep2GqWd39VG+IO2Q+=N}#EsKr%urKSY7EkA64QURd5bU_;w zX_R7QkYNAO#?bzN)95h@806TNm@$*|Dl82=F=?rGjKibE^{^LzreKfYA~0_;k__Oe zJQg85rOqM~GX!%VDT8N4q&xs105pw@bFOImyPf#4)o=A>NGSmK+#TWn4%mPk3T|CT zEEt;s&u3_yLgTa=Gx(0Ghg}GrzLvJn?5hH;))@|&N*v1!Dq=uFQvxdv;BLoHlCT$* zTdd)rg-0vM>OaneBS&^hkDb zK((5%sU}|jG${aORI`Lqq!?ijGOEck_B-fo!c02u9T<4@FbR1Kl@_}yx(w*J{gTRH%!o9#ayjgyY@;j@dpXXJ604o{g$MK(((-)t$1h)Vdy!r*mmM zut$-H(KZmUzn4pXrE>1FWXk^(upg}wD*docf?H$EC-()@^?JSLZ^Bg{TBltZ!?xLM zFpDtf5k3NTN2|Tvnox;QiBL71E`2$s_SgHO##0BxRX%n2Yfk${VWW=(C)~g!Y8j#9##rBHZ zB#YqR*-BQqfayQ+oYaQeCfYCtJSM77e4@igx8c-(Xg$~RaGcc-+Fu60P(T}QHP1-- z`ZJ#&;5K-e;+h{@n)OotW%098_X>T~&j14z(o3RUF@pCLNHdQ=1Zyg)K_Giar_yrz z0ab3X6Jrkm?b@xWMYbFO?SjuO_VX)li`fBNU*^tpip}pY!yBKjvHCH>K?81`0*!Qb z(5*&X2T8--&n)~MPk9+RVB7-zvSt8^rtB?PU$MR=iW{bi+^#{^PU`qq zlsa3n-i@}nv?VGx)cIqLaGf@u`6JWf&LuATBJ|oQ61Q1R<$Yb^*N1=Q{To@v3+E^p#YJ8CTe#e z*X)_NFOd;;GEkmFTjdc>rf~0ovkY3hz}XLz>^=m~2X{fS59bdw0|Ce|aMt<;3=5a- zy3P1EROb5qr`Ys6QY#DmQ_r)dQ&{R5bjbYV83vMhoxn%fX#1k6g#g|i9-q^MX@mDd zOH?~an2K=siBJ3}@Ol*)9bzBXJpb6^|HS*n^QT^KJn#IOA9nlEZJ{qYPM) zpEYaPI2u_xJM6CZTR$e?cS>{{?(=!8Uo>^&Z=3S<8vYV=Zi8&yP~>f(ua77Ev?Aky zP&ZpT=E|dYZVp9)F*(Ou4xNqVCTg_;cY{b}7FBGJI6F|D1t0QUvb{8e<{sQW@!WWY zKXW@DOk>XE!R|Y~5v15KvCmESv-zGc>y4!dgRe^?aLPWd>3jIjO6gyL;ePcP>c4*1iy6MEgeYtu~ygm zs9;jI{y}VP*bBh}6CS+jDWQ#xZP0hi)kQ7EW*MaZ1lf9`T2OMM$iW%e_)$@##FFAm z$@FmaV*xv>X|bh7ULrisjmH7E)idDixiFpqE=q%H*{juz)l;|L2tOOOBbJ%!EB^Hc zGB>_vzR-8}FPGf9A`6(e{GR{*#uLC5>MZN#qUC($b6LA#cO#w8`3%}wY&d42jhUp$ z#EpM+fWKd$Z6Lcp7tEX-)+cTlyJy)3ZgYFkV6bsnzhoO!KW;I?XKktxr)jUN&%Zqr zp72@{5c82ij~?8j+RIV<{t<3I@V(Uwg~2f97QOz&3!^1J@KIo*_!B=;aK^?d)+bsJ z-=T?ACtVt3s&mcofW&mM5OW0!y?}?E{&F-@KQGsG3eXabABFuxfS*jy$ItKW0Vo_| zx5h;lGW%%Y+$nBZ@Y711x-DFa0(?Q-L~TgT9>*CP$eJMpyK-5+o>lXQ*cjL>32j3Z z=U8>Pv?XJ+khruWHBMc=kFrah=M%BA-b0IIq{2klr7;vz+xV1I}8X zr2s{lWi^rZEjEZuapnDac~nzXODC^BQ%09dxtSZ_kry{BMV z-Hqe4>RrV}mO(87&JGyW+upRAY&Tm^!a`)$MJ@INZ04>36j?J6Y|NUS-u9M}!+%d0 z8>A)D8Ynd8bT&C{Gsqg7O#uT(?)~U0i47`QD{*$9_fX)14TAL;u9P#i0JQuc$CCjG zmzp#NGCyT+xmE!+tE#HTbCl*f;G0meTGw5c7LRnsa{VGnW=@&xTd-fb?Y8U4~y4fo!|Q!1sNKr^s?Zq z(8?ai`81uA^X)Gqs)e>HnvG}t3VaYGb0L~%zd zEu4?5zZ}ub*+jJ$BbqszsMZk04O%fCxPN&H(aekSvBV$lK3bw14N?5j;`x((!CHEH z{@Ai5iW~U#vN|QBC2X+7sh1i*H?{`t>I95dk0%nHR+yE4l3AoURd4kb$&MZx1dXf= zAG25Nd_Yy&?WozKvCl!k?7(yvTr@C1RL>jOOVf7H8uS8!KU9Fgbidv2HrRICdu+_^ zw|rrUFBk9iCeIFOZi}ng=(glnvBrjM_jcCRa&~H4Tpe<=1_7d7{`P8o=Q5v4`1Z;h zN;{dy(%|WN;$EMRN5+CRgE36Kso6mlq*=GhCx8b#u>h>EOzD5*=>7T&whxU#cn@tj za&oJ`889$={Pr?v`r=aknD#p^_1Lm2k{}7Xebb zbP8C8)XAs_aHcTZ4k+!mmO^%2y^M0)0Gl4W$(4BoW(~l)&076024y#RS;Gx2V}lOc z(WpG61}y7$85MC#Nh4hml`f-1+u+#*vfMh3`aY~slx(-Z8Jqb%Q*YKF7F@p74N$L? zJywd%O6x5IodJ!cVyO{#n;S=W2n@_S^k7mnfe``5y(fJ01ren0Yra=bwVr zhmSn8`8R}VkSR7D{;WHoj#X_1ce>tq zbo*?g+Sx?47bBW!h~kDQZWt{(VgJ6+?9|!+6QB6RC;mFnz0(!Xaf?dK`j1JW9RX*HFM#94SS&bFK= znj)*9m29ZWPr-g(j%cPEnaHT!d`gR~OZgN*<;j5uv?&n;0r0$kbK#i?#;$4YSr zY8khk>SHwT15@H?%B>%&YL6VM?~L48&N?38ET}RVjUP&zIh)v~1x0F;I19Yrt+5hW zEcIJqfoG8pWH-D0W_Q5mhYSAFrIeYXXdkIJdrtTrO(I*&Y;wSbPiN4jF=J`kH|B?< zWk^w~Zh7W}hbn0L$Mr@Uqj%LZ$;Zm4fu+-miwv@E(b$0PcHaR#(1WTm)_^Lv*fn*Y24r(73~)uHFvzqD)vN*o1KE}yPnUv0m9U<$x4tr{K80O@f!t;v zN4R*JlSTw0QnxU$9J_oxfpkIjFR zP*!{jfFd4Gf)&Mst)E~JeEMvG8A@&Jv^9pt$}})43=fu#%_;+fPdqOe?u)id=_c~I z+g~GmFWYZtKb-RSF!Y-l{BDP``MpxhEZXZk;`K`#RPI@1`9z8>LhAE~V-N?jahAut zaP}pzbGMRBI}6glOlcB(0KS3&{$OuD*I#_nc9<``bze7(3+3UqIn1_K%e%v3u-!|! zxmw;s&P|^eU_TzN_(uY+_FMhj9k$zi%N84U7B^(~{4;ODzct`@Y=?b8mR!}R4|=Nl(uWBVYpnb$p;9|41Vy5jG7tEn#yhfX1o%U>%Vyp+h}V2i7~a6AI zD@|r=7ZOz>k?%;Q1(4^~bEqCpkd`%Dp$j$bB4<+oRR+~&KrJ;~DLRF1z#wa^)N#Nu zOat#zlR<*Re1?5m2i!KTU}SQ1dz$JNqzC^%5RhS02W>FN5*wImQ}vK*c8Wn~LlRTf ztKKpKX!i)}cIH9e#iy@)~>$mWIoZp^p!vXN!YU z{7W@Lw0)H)d_kqZN;!$|Qf8yncX)3h91X28n_eAUl5xYl3@h5(y%zq%aZTgqL z{N?-a-`?KdZg3*zyUe_STrSt$DSycmF;4tE8AFDE3q78OeU*T8k2@Wow7V=oY14&tzKKpU7V$SeV)Ur@3p9@z{TSrT`yO_>55+~&F9*L;<8QcD^mpKUC4(I zh|?z*eq_RHNf7tJmUsNQ-}3Twx4qx)?vdxaa_EI_WO#!~JPyYc`;RZ);l7OB-Ompg z5Wf>QgN)wS6gGUtl24{!w=WL|b8h!0m0tCzTGt-b}9OsO!yD+qu;C=zf z(Iw&1mm`{)#%2+mM&6nMY0R(JTyVEq16mpB6k2HGyg)n86McB8{ZDj7aYV~~4=51^ ze;rF-(Nt4@Qa)c@&6nN|vjsLdkEtm<_w?c~<0wVmyEs26R`ex)9)YWn3aBZEe5)D` zIF50q=^6WZoNd@z4iwG;9ib`MvW=wWK`R(2PGaL|m4BEqlvR&?p?VyLe#9`qDn>E9Gbe#TBHP>K$bZEf{>%vh3hN#&1yM6n376GAGcxO5{shtQmE2#tw?|2wGMl z(&0yb(vyK~EN7Z{99j^k28qBdl{J1~y>T{`nMDI)}&CYq@2M3D1i>;2iE`e z2~OKTj_O~b9kb_?eKd_9?IWE&8dBMoj`via^?gAXl7sK8cL8v=;hD$zBxiLd=L2x$ z{rNz_YYtMB!pv2A==WNXQsD2yaKoj)^?Jn2l!l!QhbfBLkTN}u_ zV_hm9Z-4^AZsLERD6k+@XA{*LG$bQLH4&!5qtOzk?~g&upZLT%c)f{?_(10KnSAW= zf8zb(`IC!huJF!2o!Mt^{yl%_j5SEn3{sqi@9yr9TC?Y=+^4tRMXjRZDcM;>tdsO% zyV@N#pk)*)e{CtS>!4Da?4E#wXe&n}DTd3$Ty2X8Zg5d(`61s{ZmJ zJ*c9cXGK0Y*K-0G*v8<7cD|s}Rczn+=cnJWfzq{H%35k2J;HtRX0t)-C`B!3P-Gie z;lJy;?|Z&ef}&{MEm}U4&htyb4$k>1CHiuGeND~o;C`_q2aTkVIQh~g`@CccBE5lV7ccdEK@z3+Bs%DUXJ)7 zqsy3VifN9!)LLsfU-5h5_{Zz1fy_U%d&OUQR^xnYO7jQZWZS6k(Ey$>oh7e*cl+IZ zHeavT7u9nM{1%v9oXa;bI>b67{Da8Hmj=fXUtiUmex7uaH zdvEIvAEA$t)!#9--9f0yRBYA$eZ@aT#+HFuaHd9Xc`E)(`!zm-)6Az1_-EpD{I#@i ziCN0yT}$gQofo~2vX(mju_h?nj&{FYQZ!!Jorb=)mzEIh8RsNxz=-E&u;&ZfRLdG+ zm7OkU3n;D66$V&t{Vx_P-LA9XFW>&@)vN3EN*?s}7TxG^Vfo{qzWwa8*WG7zq(%h; zoED*hfGmY8{zYQl$sf%Cd?STt>j$OCaxM0X%ypCJaHRFKw0@Nsd{DJ$1*_;dJmG-_Eb@XS4s~KmY&!)Bp5;UvtXO?sxnD{a^m;fBFyq>zl)N zdDtLc819i`y%%(XQN?mOpJS|EzkZEn+*bt}GyXyt#uk@SH`lMFj4K?Gy8)ALsUO4M zDdv!Cie6bp>+TESVB%CQXwwzRvbGz8KY+u5an|^0kE02vVNY*7wFaG&5m$)=01ymh zILA1V-F zG1XN8PU?^WEYp~!A~gWcfj-j-aA6Trhb!_LG5fBE-IfR5Lh3>9ytKweNC(5}2GcSx zLIq3pf-pc9YRdqJEt=p&!YzRQoVa%uFWogzwC9x&{PzL_2pM`1nGWWs#-&EFk8f5K?m8^cDu!Oy$yi<;C`cKi*xjjGLD4%`&(4!wcvsGL3ej= z`3oEv2iibwpBS1QU&Y>U7jquz2iy?N7Pt3zxRBoMwlwLM3+#euHRdO&{Q}53pLz&B zeygSByo5t%0c4kMvBGu!D{|Eu5)V%uHB|C76fU?ZlI8Je zGJ|YTuet$NG8$^i@vjqc#l|>aU%&FX2(2JbNwNaqxdN?WFL0IBak`}y4tee)9VQqe zl-V0Wb!dR+JiOW`N2y$IlZ>sz)3yNR_Y$F=ofxNa&&5;XpW-FruMt+BtF82Jhof$%VmOED zu==?){we#X#P$+kZTt+e;xGd#04#q7N(9aOHnCpc`0b?CYR&&^q}(>nkdB1S#BSnx*WDpbK9)@pJ>_(T|1m zc|?`V@Xdo3V(e~ebW@G%X-x<8BY?;q8o43rvI}dfi%AKC6iom&-G^f~0ZNalHOg|A zBGHLG_4ckDp_$-3#E&@*P)<=%8hgnV#$}gac@DL{(>Q87Wq|Zd9VgGalfNb zVpgEgkwe%~=u?XnLY>QsPiNPVXC?+Z?{5|Z{f8JQyDef8_5hwXIywX~Bl zZ!I|A$;1Z>W;PEc%XRWsR7#vd0y`cX%x7Dq%BE=SJesh+TBl_SS~!R&K;lyTi2M=h zJA-7PktH=ctA!@hW7e4-&_yrq?{4{(OZ=7RcvjX`XS8qM-dwOSiM<9r+kT;(av!bH^VCV zyFdK)=U@JOi4I;ZaGv|kw}1M@&wjo-Z1qJeJWJ;Luk>I+DHdN`7rFarM5#xE55<&|bBD74PJr{)*A&IHF7`l*m=B8Kh>AL6JAetVijc7$DXT=gax-u; zMQe6!YZ}|sx~0~zx=yLbQif<^9}Vqs6(W0;#;KE+bMQk=P-?+KK;#qNI4iR$msenh ziIlPl`M9r()L;LxQ{`MVkprs7;m0bv{)u+&1F)=v4G{JM*D|&Qx^6lGOAEY~uz)#S z_j@;&fDM2$Ow<(2hVk1bJT!!dfx~3ztT%=g97bru9^4iL?q3|ueLTX|vWpE_E))m> z_cAE;hp({0QS9SLb-4ivhxtKY+JF^I)TJT*pIpuc`EyuiLvS_jZAv_v)F@!8y7t?{Hjxo< zi1Q}KXUFgH@PM#I2@D|Z@iVKBxW14<7(Y5r^)AM+8)5ukF4xa7sPt*)J$Qrx9K^LK zV!&#%>^|;7Jh+tNgl$pPtv(@Ht=5f2 zYd5c9Y!EWvS)j^Vrz}=5h#Y|-MHcZu;}p1tQjIAiK!XRh(sOtbkEn7Xj2{uBNA&?T zhFbCC6w2V;7nP2K{*E(IwApTR!|v3)Ah7ogYb#nA^RL^iw@|^rF)BNefatxk6Gd=} z9gHf+&3Znt@Wg%qPgj7w&AGzo(Tf?MRO8rS;*HnQ-Nu7Qb{KzE1-cnVp7T`>yQ6@z z54RcZZE3J&rw^IF`GS%*L z>E9QVamLRhusjj`iK1uWrHAcw{I#@`iza>!sh9od#NTVh=}5anq_3+;SR$ii@~Ei- zBpc*oAp-;2aO?G})T5+j?3hhdTL$Vqjg+@ig|err=bsOixSr7S=KhWkpt*>}V((hK z-FZ|| z2$5RPEP`Y&>C2Bae)osp{o<=%=mGS6e|7lHx8MBYXFppV_~qd423?7C1z%Ji_y8K+ zM{`hf@s zMp$T-qh?7)l~~hO;`vWnq&mH0qdq1sQ*6~+=mA`E#P~M!70#g6Dy0SXH9t6sc3q2m z6T_=aZ&%72vq*KJ(SsHkH`vhjMYs} z#V#cnpTwUsS!Pk!7Yo*?>%8h#Q^&b#%b+K!R!5puB^YFFR(jCsQx>900y)mckX^%xW=N2xdJfECBB86Yz ziwDq}b;$BZV}2SfTTf*$KY`_oqxpEqu32bD-~-`DybC^3ut!epl&9>kr_}veSgco{ zYXE~#YXL=ym%zWH|J9=JJY-PjYejz(>II z#ntutX0=}M73%BdYPp8IT<~Gp=6<{5)5snF06w2}Z}vM}L2s?+L+>kozwmN3XRTFy z{{R}oMIM0Qb9ogKE$-1NYh2e)`Z^6$Xq>}|Kq)Ozi;amK9|-6k3@oQ-8B?&C=`NMx zhf6;!+*v(z_IO%G@QN1y@slHIOD8Si?FrZkr;dP-GH@1Dc>wPA6PO`QeXXVP;UjAs z4D`q%E(j=1T!c`aRqV&9g7O><4Gf@wvBeky$WASwLe&sjA*+-Rs3n9NlMqe&;6g<- z8Z!5f#t#AT*yJ<$Ez-rJx5E@wcyo+OE3M`f_W5$0)GQrIJbupvny{Jnlyez|yG0q*d9h>c{Gl zfkR}wy2snyzMo^RUz3mEPz&Py-7UX|nctxiXRfXmC#N4k%lU9f*_IzSi=5aHxGXua z0=(7zb(+>@s#ev*zvE$BTCO3>pbH+cNkqbDj`R6%^#(N8%d0t-Q9poQ?)3(A=UE;C zG~osj{H=t3@LL9|NX{>jgp<>E8$!jf`p`9&1 zP2l)or0Iul;otL(_A`B@5bO32rPKKMZON+zwy2IEi@|YwPiJbJy9dx7Mu@Oe?=;%J z%5^-54}uIHfL;V7x0`u&lUXR?O*8p;Zj#B-zuQG>VFDHDa8MQwIKsXGY`b0D_i!t$ z(!o%9COusC0D6Mcr4?JciI-z4o~d@9%N`~1^BiWg<>IB@fL7#~A5iKjK0+DBFo4zT#WkCV?iDEtfJpW=PR|I*aa@K~9r%pX(_X__hj=hXcWSgcoX z5UQd@PrPD=oLOu>KRO+3w%l$vx*FisEjC=S@oMbA_nIN=s&}g^1>ck&HniXF4=~+0 z-R*bV?fv!5^>R7a*Ly7RKhv9=oAsJsegF^fzS-Q}-QT^v{Q=k2dIK7bs%^eJ%lBs& z3w}o%yU6Q8{X~?y{?2`d^#!5iMH2g_J%_B7HWPGGH~5DV&S2{lN~9Vz;#!?>e2}VK z1dyd45ZtGH=!|r^jxTdyjJVaD{FWHE(U4O zmOG)RuUiR&lauFi#1^UEp4g!`=$b*FQUJbZOPobr&$8S+=c@*rHA(~da1-6e?=Lwv zp(56Rz=7pJqXYQK86};y81Miw;ueF3-eAre6m+wsY$|y?@?{*?Eprbd=e%X5l~!|# z;`T*2$A7i)U>f$bBUBA1iryKH;r&K3)jE&JF`g^h(|&4cCl^ipB$&@IFn;K1jSh!X z&{Q}Z)-|dsH>eQ*x#?E6lX)wP!q8BVri2-9co};$I)M3K1+3L>p{HGBJ4<4R&d`an zM`UOf8o_F*+~Mx_Eq|Fw51{QB5z2~#=?Bor_qtFrSj>=mVX+1WBX7x-m7iWPDHs>! z@mou)3fwj23oN0~*m(`!pUok`>WR>Q_lMv8{0n~t2OmKH`rB`Q{oS+z>3O8q= zSGEB?L?R=n`pMq;b#-p&64IHvY$YEs!kQI$Apo5owW^5Srl#}7AMPw-;}1g-r3&nb zv(_gr8ElwoXq7P`8@uYbQQ2&YWvGnJEzNbkr0nO!aD@7}FT<6jl)mR1C z0S$3|&Uig67#@BT#YP%hBUNn7DGfMKoq~?gu`w8ch=F|&1YayuM(8aZc0Kb|Uxorw zUsKvLt0;w1hoQn_0y~TzKbhb{V6*M<0kn=*$>^xcw-`~}>InYk1b^s@jA8CQz$O6Z zC4Qo=M*B>#rq~NpZ<4X^;0iJt!Um0_Dr5E}=x~e^51?5pJZRy76_oK|Y~YqT zNudC&2Y9v2TTb@gP@95q(*UNHkyfG-k12&icuMfSkIs1d$s%s2v8AERGwJ(z0R7Tj z+RF3UpXJ9RjQ`L006L^fccp~l&=AVDM*;zJPtOx*IpRl(&4x=WE*o^bgpG{Zk@HbJ z7l0-PSn1NiL_L#B?cXI2#+C*UfJflzq}wx@vcJ^NbMaj5zOVS-CGT>qeBx+{;tw7y zjIVKw8s$l=8O?9cXykz-SXa;8~;$7zK2>mv_|IoP9F`I5u=FRB=dWqv|h;n$cU&7)|E&A_IDg;JNoX zJ~EOibd;ZrJ-4{D3u_V^AoYHMkQxgqCssloKRdE0TOZ)Sl2!xK5_7{@sUr(CnSs+I zJAEUKahYq`+_m_(ECU`#D(7Q@Yy_KnK@B#D+NeV;u*mQzYf54lOE(;iF%6No5u*6T zm}~x+iG8?)sS4q)!8e>OQT$|1yQ-y~Tr}~s#~?Ul zsF_AKLr+y>8M`LsN>%h~IqfvZqVn{iR2}o|w9^j)7}z6gji-=hTV!^CRrIQd<*0af z`xa+XoW_w;;m8AMWshA*&;%AGq;)}NFpaG{(gJ&=jz66!GcVEF#0!H=7)L!T^1B*4<+QXhBz*gW1 z3pk1f?e^&1d+)X`QzxIML{X@gTKLZQ9ex z`t-oi_1MT+fVqcKK8fRPe!u(A@Z^~S22L4LgG)jB9D&2xtLs|moO%%&8r5CXMAgMFeOHJs zLxg*bA?qs!{KPmgM?b1Xc}`j1d9qs0aq~ev-%atzyJ3um15g7V8`M4TPztmMTXJ5Z zkM3rdW$6iWOl&`eXK9PC2jD_}AhJu;>$x*h3(&+&m}rGHJ2E7|r~XOk_z^O_7mP7k6Ys>&&o(=LT0gU#C+0sXjBf6!e7Br-++b^vKHzQ zSZ9op1K=cZbsVk;=N z!}ma~hbF6Z1~hh&h3d9iLU55Sk;*M&Lly$R07R)}-Z(FCc{I;&zh%gLsOp!L*?Bur zyU~Q5cm4^kLzI=ZCKiG)kYV5l&^m4KK`o54)V2~>*VRP`S$aN?sB$6j&n7fh@cRB`7^@s5J!<@rV`-F&2SS?DvJ~{W`1ta zpvv*h>ll*QSVeVvnofv~*Uk9HSCIH7Qm3bL)Yaxt-K1opSJFBIesIDbDD@^StYXtG z4K0wmng!h~ZgJ=6jZdtVm2<%n5IC?9@8kn$2iR=r%|H`d>)~06{n#+2znaB<#5Ni8 z2e3tK*m>4;0{1TEW8|KYQjTsf+ec38mt=B3idx#q8Y^wbV~bOpYq&R#V#+7|o1Ts4 z4;48Amf_8*PaIt-Dr1CPzxrWtIMTY&D@E`Sct_hQj>*sp+8?*Dw6Qgvp2{vOJtHD0 zv1b=CKR^{RY@A@UySlr58(+b}o)Rx>{MkK##?lnlePDnhwBwZ=8l>1Od}4!EykR%F zQT&s}>-n*FtjDMoGFuP9Rivk7k&k-UhE6}U)cJu3pC_eF7O}Qw%8rkbX!^T9{Ql=( z{ET1uf3?`o4!`~LAAkO{pRTX=3)NypHrL^%HQK1n?|{ZtLHAp?7zVY@&vD}cG=F)Y zZ5}rbGM`|1lk;)eSqV8$)Cy%5p&OE;tb^@#_J)=MddpSA6gf5Lv=g+0`kBpAL zcJS2IHBEyqD=CcY#&{&q2LHP(=96k1;{>6H?zllIGg|~w_sI6~pQlB?ZuN z>^%P-Va!_^InFpecdos^eEyzcN}zUUNm;l%sFmaFUbwBnUONHDnci^l0bYBvhy0r> z`NuWqjhk^DOTO6|x zaA)W0Ol9OOs|dy*C4@`?O~V`h!`?RfkTS*rr4B#P?-Pt{@<8LGQl8P>%N{@@9oaRSQ_kc+*o1F#YtZipA(WM6)EoT z`3Cgh0kqQIzI~WMgb!`HzxIgrHXKqGWJb5j>W|Qt>Z4m%>x17)oLW|?;gGWn!^{42 zH}B3DV`Tn(;vK>xv%d=li}`>l{W+Xdw|8yT^bq`7`qkg*> z8Ws7`n9V4|3Mqaja=#_uV-wEyNagwFtak8c5XrB zkCBWIT^LPJ4J_ySU`-dNZkswFS6bzXteqouRwF^^qQN#vRko$ZdN|DNl%=r&h`eYu ziH4`Qei~O9g%=%6#~lu^bJ>UU!T8H6x@oGJWe{Zz8NWS*_1VLfq^0ZHiDNMJ!azb? zDhzPNmh=x&02w?$*2ZYUr5`>y{?0mh;2s&Q3GNq=RXnt?khrw7ISLhd10zN621nI} zL8|=j;rMnSwj@-FEmXpqR9YU8dJE~t0#G5b0UeFunP6<+;`tL9ank$~?*i<*keJB!FYCeA(`k4$95$2C45 zOZ<+iC5oSkbeLn}@iA`Exb)@lEIps7_Q9}NE?@cWu!JNDdUp;QO1TlFQ*pzau2!X+O*wn z*XuP>T&ydMh#X<=^b2~>!`wxv=xCY3Ip1bDcH~)bD^CYOB84}@Tahci@qsQg{_g#5 zVEf!JpjNEFWm7fhY053~1z4KMKSWq}GX$I347uu4BjwRXauAQ& z`NuqMLlh^?SVXKY=)m&k9(O~j*}V4GR#6$6G&YP@^ZP9x+_i^g;B*(ru5^$ z&%l)f!z8I$+aRrjqN*eGZ20zh5ULNAh*DUCj@0Z+P@NCPHlzVZle3ueeKnP(y6|JAlkgWdplq9eK54V-|bhc)ponZ zfq8d#5BZ1N+tqr>B@4Zwqv&1T+yFK%h44D#A8@D_`U4P*fdPOeTkno&2uNKd^GR&! zWxv*f3=Rx|!|3xG1=t+;TlAE#W;s*atC&{l;`uM13)Eo zoPEd1YzLcT%yrA)Yt|anMbWt>P+C7O6^B98f0~+vZr8Ez!A`@v|REnehwCYH;#vr zjgeBI7+1U=H|7N^bwbL0XxtqgXo0G<^jpAQBMqEqX?5tY4FOO(01F=d1WFz_EaJq= zP^l-p+(j4A6<@TXHvVn->wxm99^;smQtYr@`F#H$b2wS`lnz&)idKO*>}uT(^LKR zHP9vS5=*|$NuLj#PC)IRPdSvhhVwTj9!`1nfVE>}bLrUD!vSO%9@eSBeUJ0t*+F02 z9dy2C(!PI&&rOW^Tu ziQ*@duJS+w&*=Ys;qJ6V@pGenLLx6})}^2x`;eo!A;N8l;tz>SqpJ281Pkiih#w3Q z&c6_r%cZ{1ke^Lv|f+9Z}Y=n?%_qWUU-4XE&P-G?)pP2DpE|zrROp$hvfZ zD_%s@JcFpvuaX)IEjB|r6F=V*m}r_8F;P?Y;Ah1&aMt?bmZWl^Hv@gmTFBHw;*cUU zhD((?ex?II4j%gsO83j83>&BN6OCqnjSVWQ8dOcnsR33#kx@TTI^Y3OJWb=R_V*|c z%rc`7EFNGG23(C2#piLUeakt6a}iGu$=FYZH*lN!8b53XW+$i>Ap_LSBfXYBir(?^ z6wdF_hY5E{hsW7O@m~#Icn!LLOi$kZeIllg(8LL%_{BhTNZpoOcUFa;_{2NHGq5F! z&nBuhMDddecMVb8F!=^_($t5H(<;(4x92=@)<{B*=gW}KNb!^LjBO}tH`FPwMGV00 z7H++8^6;u;77O01up0H$xVjfF6j8;;^HO%g)0qnLa?s!TjGrH%3w{Hdz(2dG&+6m8 zOs|aa`!N#r+OWQ}wCZ6EmA3KLSq`>pU$;rUd|m){0q;4{ubv<5FuH0sez*8oTO6YC zjn@{j@uQB+pon{48!hRO5?|T%HiaxY|9oTdn0t8R@iG8Mx99WS@+8-#I(+1p1<!J20gPO&rlNCoxO0wr`j0>D+;@xu2 z2X>WvQbvA{@i3e7Mc3uxn{U4P;>{P=%N10(dic$s|M>Ht{A_vH@q52ipVo;+5+(5O zx5c5^ak4QakA_}=-L01V%Z(b0!Tg~EjqPz`E7e4uv(g4uNQdH(Fr)kqY27n6pbt@% zRT!Xwb`-x5qdCTq8(lC>rFMlh7N7|O5sju$QZu=OijAQL z`(!cO^7r%5N77w+267e-Z2;gXBu!TorE_R3;2?s$SS(S5zHzoo<5Ju2>l(|^jRAri zmBY9jpektdc!F%&@ZD$WA0#SH7+0ros4Ne|>~f;7tGCI_?^E-lmZpA<(G9SoJfL0V z6ebqA9Sbl%70QYwg(tuj3$;>V^Rp5PWqZMlC^k7+=s*Er- z_?TZvyC!YKRKvp50zpSlwJ;>=%ANvxx`H$ClBiS7?cxIgxGzQC$+5Tt zNtAUOQ%(~L6XSlfSuIzKB|q9%z(LRP8O$cf=iO~QKpW+mn?`SJD+d>Mbn3mGF0EVt zAkA&E)`b1^_KC;fW8p)9tIR{ev<44W0dgFK>TIT}G^hKs;(s~Xc+6Bt4?lqJ!J`pe z)V=Y5E+x;<3AzfTLlbW0!E|bTrf`SH`@38&d3`Aq3C$3ul?b>yHz`EnOAxsYpDBDW zuseu}UEptp@_YuZx`Pg}n<|en)nnUd!27oaO@!3vQu{MWx6|$NrSHg`)m#@R?$8UU z*wqaWoo2FMi8Izu&F4XtBf1gpL(Az0&=YnFKa4Wh(UT5{w6FJb+&C0d)KVwSK>KyX77AMt@#-$v^VL1Hs+^%q&n_4iMWM zzgby&D{IyoXOSX{6w5M=WPq&oHn1L484R*G^P-BEcbtaphfaKt2z$h)So{DQ{ruw} z|M>Z<&#uw^!*X|Z_|3Q9{NyJ;SsixyM+m_%0J+`ocI&mDG9N7g&K+C+Jt7xbSE0)4 z>ekc~lYw*Ky!Ban6#PSkO(zUu%PM_hpnzIq6=%^G45^;PMQkYbm5(a+aK$NVmC@=` zq+1CQTbCtGyS1TW97l=Gq3k-V(e)5x+OsUei|Hq^$RjNt$>s)qbd^Yphf!BqcTn19 z=d;Cjx8dL5D$~`VRLHEp)La5%@fcGNpaC_i1;Uv_i zY6Cx0>Bvq21<FX8WwXM_{R~86h0klI`@6V)P6~`0Xzsh zn9=w{_Il2^Sa7V~`j4V<_dQ|^^--&@!+o_+9oqF?y9j+4cj*J@Q9PIsvKFXvVx

z0!CduBk-Tp*pLnBTqf-D+Y6ya%{ z=nKF1Pg`cSDD6<&vh=}o?Vh>A*tCLv^`>J>tW^RW>{d;Uk6{|%ZVvZI&SL0rPqo?bPq&XU z@RnH*JBV@bu+5+ru*OBe%A{&6hxal6$)J{jJlG4U<;NUBJa(M#`5c7h*dXv~fd09$ zNDrj^jx|d6m>bw2a6{32k5WIG7;ZdIsO4i+z#5a;6#Q~-w4%+WrcO>XI2}B+*_EI5 zsCvi!{XMd))e1ws-ER369J{OKVvVVe_6A$;Kxj5pv;I}Xlq zLq4~nuVd)h!uR5}@d2APa%;=p)-{)Df~=`ocdge!e(=$4@OV6OL-015O-%|reuFtT zG}2wIdJdpFbM#1!&yj^dc@SPFyVt-PPz_qLXkepCB=Tc~#h8bx93@LFoJnWzaqc0f z+!v7-)xSquLa$K_W|Cf0@Mu4RK`U_Ri8`2y?abuUFFyc#=j5~*1aJKy&eK~0R|9X! zpt&itQSz>hb6r@EmEViMv!D35@Q%y9`Qb2nWfIbd7w!3Az?0~Vh~iIt;v_M3L`)qK z#UBigDgqT#8WYvdCaN_=@srWL(FjreWFp*#C~kPRhF=mPG~W*(RAY=9U>=6l;91&n%-Tukjgv&;Sr3SFF96ijMh7(&wyEi}p;ktS;tz%h zt09WdCU#px6hE1=LyzI5^4;SwTB7**&|GFWpV-+G)g8IoAy!uTH0PK-=xxeiN?%EX zYB^9MO;S0~S6pf`3&FeCsWpi;J`2M@FZCS#R2z_fD$v->$S^cMxmc4}qjHkUln1z| zlFAGKq?{UHJmOiA83K~b^2xStm&Pl@VY@%96Xr*^*tURBr;_59s5t(i}fvoE^saaO& zXf+@;E*)jmz?z97#KzMTpK*6)NFBCMUclKFx)7PI$`*w%i~*#wEgjXg%JZpp9d-+f zY^J7;_RfOHcT`PVigw~Bh8inGpZ57_#_%Av2a%uPL4zr(^G7=Yt&=*)127;SftIkC zz~0gfS>vn;RZ*Vr*`$nG@^m~aJ?Q7984bX(jl!N^LR5P(G@L;+DWbR`OdF!O;dJTK ziEtaD_-q`cqpi5Kb?8=FqWHy#X3i$6y%;e}BAOIY+z`bLQQQ#4W1zIQ>#QnWfa|tI zaYGb0MDYhhgmpGi?XR8~j)o|1h|9HxC_Wp{d_<$(An<3{qV|qMQBHEeOjw6cC_vni{7T28=4Hg-A0Jwlhh_G3^?Hj1>7duvcA40XH5t=db?Uy z8WxRtn>3weSdF$;qx|<=TOS-#3x*Mch8l<~(XqfZ(opb*1 z3+5so_Uu^eUgC5;aa=O-y?<(${8Vx#8O9%@2bUcBg3U`V3@-bJB1O^Krkzs7?Sz## z-v!R4Cn8BsqJKB@zI-eV+ZRyUozv0|z_u+gNuG?s$jGO5Tll4`jP(4e5K)tJbjZ0v zi3_hap+Nv-Wvvm(R!X{v*o~554sZOv;nxZwQjBrR-pQp5FaetP`84T$dN_D)US+Yd zG1}dMEjJs*FCKQR_@W#Z)imaIIe)YCT>$QfWd%=HG#yL`NBN~1LMwWuqWCJ^=r^k* zG{pMJ(%*PE*5&Kf^11vaLE#METsW!$$7& z69u(5|24eAzmewa7;id6lpVvLR(*^J-8{cin{C|wDw5-2F1YgVg#1T6OY`64pC?94 z6_FD}TFY1(tVZO4^%+<$e{LCmSRNU|=PFW?f;jeDV;rwt-M$Nfyv2ARlXHsX1eyiU za8B?S9A==wsI)kJ%d6n!@A#E2Y4z8{-X=FzsNoA&04fhx-vQWU$Ua`fXF9dB3$P9K=G{MkIKsV%~I# z)AkxLm5#LzYSdwVNWlZ%v7X?QN{vI|PfvaFb%G*wg31_gxukFj1m|bU_`%HXiY~FU zQxB$u)*Mx+oRzAaL8tzfD#70}OGEes*vS1OmgJF1j4%S9$#_15i)i}iGAy+J`XG&_ zJ%{Kc94fs)5@>{IoI&r$u{9bCY5ngurp&U~J=c{iL1hQ0=$7q=>{Q{3q0XY|^P9zXlN3s1pFr3_YnU)H z8VGYhvDh`_N1X8DPp6;jTN`wd+w{GUUo5VvKH;T;hi0GXqAX&r#@Ur$Omg`O?Z&DE zD*AwjhHQ&y2{=LEjLH9db8uJ$Ou#K658)V$2~Kxa$$?^bGjfl;MZf72&YJ9t?ubtR z>vH0kC#GnRt?iFkjEq>!3ZsL5LaQS*@zp`^ovMq)!{q~eyEpHUMNSy?M0B{d*$C1N zZKW;k1nOM;pd8*aX)>rLXmOvXAP~Qd$SjdTo@OIdYl)KG>7Ij{eTgMrYV<2JJDEE8 zeLms+->|K-#h-y7T-VsLb+HSpL5EFsGg`7(C za+}lN%tHn~@Txb?$7T&>_>bvoC631n6;P0&sQ~Die4pcp^Ex)-dg;LLSq%0`RsFH$5Ahbr{b z@7%7E!3FlNU~nvMU2a{$;-$Z_mfy zPOV*?ot>T#06a=@=e9lP4FVJ9Kp)RmX>H5v0>h?1N1ge!`lH-$nm8`mE`A6ey+OCB zLosSKtL<7pe~6x{IBCpoIbW!lH*S^&cNVadbo{l%GLaZXOS`sz*3mH)2$)Eeiafk_ z8%nERwh;ukfOk;cNK0>7^Hfd9A6&*mPw7ogvdrAm7Gps_s5UkEE*@z+YC1!jq-Dws zNf!emc3|VOe$+h^8>R$~Q=bjc5D6e-N6g$mH;YtOzqZcA+=w}on};o$tEd!MkV_x< z%YSH>Cu)zpt1p7U$Oa+6Wc&n8xq$~KTIdm`($wC+p-eNBXQidv7ki;=?_exzzfG&k zx+8t|=k7x!q~;7Lz+T(BsMz8iWB`q2#W)!--`u}$?=Z&P%XCiFrbgHuN9JSd&suMZ<9^}M)_Tm`-pwAN z@1=ZEwFmop=QcfF!T6uC3Cd*zh!T6JtJtj;lv~_Zw;)%x9B6! ze;y{xL|D$Or(l9OXFcU=yhhA_1)mbU>Q~$Ck0n*?D$TK%6&P!SXN`l)9Q(`StZ@0W z9}-h$!QfO@^ZWbeYQqgnJ14SzhPMc5ChA_}NJ-#OunDA(_2nr4goutQxO20TKyimQr%ZvWKn}HX zo(%a^9=Yar$w;?iIs2i96tO%k&O;FofdVD=L(78K`X@!t_Ku`0&&XE;y&|I>v7`hR zVe9It1Hv{qdSBzqG}~{XExE**Y=|AEU12ECW%#dZ=W0DTcmbc4iUBVnBmr%1Eecmx z&C*}EGk{SuKkwI^Vkb9=uv@FabE8H!oI`dBT4Y{Zd%Nz*#3A|n59Y3psw}@eUVhRJ z+YMu|I)EovS&pr86UtP}EVYawQZmb^bujA=Za+4u4QtuP#Nl4auPCRaiFnUgyTH%= z#vg z0S1vaDJ~U)TT+YV`%`-1(G44{zH_$K^ShG_l7^V}8#3aYi3jO~BoieMj0nr3vZF1K zqj$4*CFV78^PSTAbu5})O2tS1LG$TIK@?ALognX}X9 zXQY%z@A{eD`46P;N363tJKp^rQ9Out(5t@FeD+ABTrG%`Po1Nn)5{4Esu`Rw*ZsVL z384}fK5beZz}~@}%F+)J*MzT|qEQenQJc*Yk`IxBXpMbCTbZG)MZXK$6ne|EIhGef zzZ#~H?xu;D>Z#fps!296Qs!Clt+`i*WwGayIYl=)%I0(Ay9s^w9*LVU*F!Km+m1)T z&!tf8r%*IMALqA`?-n*5*oqIsxPPl}W?+Tj+L!OAdMOi4*=~bW<#k?_Xrq>}M!C;% z01+?w=-VQRAg#vEHq0pF@NptE=9H4Z7vtRwD&uhmg0lWETJlSxMrRx3d5rAwgAlI9E!x-I8uy9CynR(BmOpwd9ji((Gc2B1%W)-LYXwECkYFDs zC`Gdw{MH)c-Lp#kbd3=#+n=+&8|NqL!|d3_$&b7aQOdNOlLQ*F$u!VYtGLR6l%Dnm z_P{F)<-JCNRzjOD7Y-u>MXxzrWorQdp`y3zc`y7;%{t70t0gx6Xt;MY9|TW?#)s(f zqgIyczoygRkp&U@V-ou1jg_pzm_ekN9pKJ`2yhwNXYYX7*z(@IeJDr#q{{Ycc~kx( ze7N>huj4ujeW3K((@MH*-pA5XQ!!?o@(q+3XdA^H%pr{w$WV4Y{dkcq%H%=~U$n?wu zGAc^bUtd$}OWg=Veyb|WVxg}$Yn+_VfY~YF53y zybP7ld+&PPxXwtQMU7+KEyteE7bIh$DHN2;uU{lMNTKeS-MUuc+XMw}+X<4N53ZJgb4wo0Wd`ZJQqc&&;f7WPr_Grm+Jt6rJJ~T{}I>tb~25HKxC`` zLnln1Y@b5*)a_U`@7cEm4w0)9PKzQOR4F>XSCkuM9C_41&ib1VuNRQ70?$rg?8OiF z(g8_45ct^T_e$JsaRO247I=A|G}rDcxUQ+M*VD7UQC^}r0FfCkxTV^v7R|UxihXsO ztlrd`d?ey{YLC2l4VI7MORTB)p$(c6oZRGqCftCw2{Y=zpA=3F6hh8%utM*{j6P9J zIpS|KzUjbHSo@K^q7cg#B$7=%3*>?9NvnF->@K}T%JMsZvk z=F0bYq#HYld)1r%xpc99^D$GL#;<418-9=bjTNYuoWFJHS0;=JqUShlyZLaxExLebhJ3omRpM}+S-I-ws(&Ugjz=-5FZ6N=~pT?_M#0X@A@8kY6mWCa#4HbI0#=_a#fjgV)IGF??B%OB zEK^$z%{OVFdlM**VK3~3Lr8#h#MbVkuSkC$Psa0obWD}*oqzLF*-64zPKt*T{6yt) zWM7OV!`>_NiN{!1u^WvFq%Fz5E&qzZ=LsN_sJr720lru)N`2}L&(s469@+2@&WSlq z2RWxfpNcbsQ)pW1@pDoAO<(8pw%nby$;$=-g*Yl+tfIa7w_iJVxH|T#>D>zC>~Hgw zd&^#s4_WTDl}3>7qkC9mjP`Njzn(yz3Qu|hR^_H8uNWYzlgOZC258sNHd+~K+|vS< z$ma2Ug{H_05Hi7I?^D&iYy$+dLC7}06S}57-oohgxXT3KTnJRIjV+3pv}iGP53<$8V3no3faUI!YG9O zvw2N$h}wWI9!Mc>i2StEq(HW~th539I&h*{&J%3WWC!3P+(6ritoJlF(_h>~CRE{7 zV3I4$ad8U>E~C`Zf!M~Cjb+#_aYnsHMgkWps{J%GMkyxrAj zEE|J!dbM&XB)h)c_r!o>?B{)vIDLnf1mn7;bPFMt`@q9Ne3ikL~<`^^PYS3%SCK`H5cpxR{ zFZFZ;d+WUqXq%_lP!HVNL-vpWC&;AI6T0R2d(tL9nCSY`lpHW00NC*A!LHZ498=y{ zgg^Y21^+DQwZWq5+s&E&;r=|*c~ZD)2ORS%d)c*;)n}?wP^UL^%+RpDg7tuTH}-4- zdMWYuCHs@;Dbl3(Ds0KBx>o*A&E962Wp-3#iiC1+uYW8YMee4*HT zRSeP+(ShITq_Blb3v-B+XdKomM-BPc*?-VyS%MRFr&$w=k&u;6cjwdJHxB#>9Fax0 zSfj7O)-o)6V$`feinniR2U210&L}S4!eHV;Ugk9oJKMSpNSi8N%WQp@w6)H;Bm3VV zkf(_Z9+AiE3f8U%IL!bcMg;Brj1Rq~H5-j0S_saaO5o?R>`2>Tb!f_YB3IefgM#g~qm}Q+Xlt7VRDSd+H{{Cj@!yW@(hJ=546a3VO#B~Z=u&%Hao39XsIY3smAKsFb3;+$! z7LA}WD}r$CaPbuVc`M8`BKl^yi$LZ9`-+Cb(yH!<tego<%TZp>#qGo0 zx>rgC(c`UZd}VPBCv$&+sTh)o!iiBx^Bj+6|EGxgN40zTo?n4BGoBD`E=)*W`ERWb zAP4;birqhUC&^UAF!D2ii;ntKsL=o&=4`nIluZId0BUK#Vs^nxuiM<-0IDD6yZK7( z9%RY?Ks`t=@aA@m+#WvFfM^lFTeB8CXW?)@ep$@V6$VX(l$@-=$w=OxW7mCn9Uv)5 zeL0+)Bbg>t=;Es_h!(aw*kBJ>DLU98G(dkh!R;{S;96=gYAWb>aMYQ*7&OO~=S9I3 z^qT!0DGMRFfH=lPi{t??9Dmr_CC($N5XKe!fS_N zns#P8fX#W&;TQB78^_m)oVSOwoNj1F_w#DMO^CRXH6+!{im|teD{1{?F`5n zy%B)|{{832DR2xU;W&lg1HdC~%q|cl7ofI5q>hthLGHX|+o0ILf0Exio8P+chVCzR zKTd!jFrZsro!K`Zr+p|MJz^YA4*Iu_pDh1+&8ro!`|o3n=ggCOzc-DImmZ%!y%#jN zW?tsRJ*RwT;=M*YoP<%oZPMZS@}ur9@o%huTa!CT^P6;R5*y5N1lO6z4?hzj$INH= zc3^V9=S`euRf83FQpSQ9!=vp!GQNe;L$0H!wYFg#abUg?OdO0&2zBp%uhptm5QR5j zL!VapS)ICyarrycc`poTKS)R$?h8F?TN4YB4(_HQl7mC#qmg)e}wToMzb8JDAcldww;^XojO&p<*}g^ zWr!ZrblBw|iFhfR2pdhvL?qMRJw-Wgov-a{^qTnez*6D-f?M;l`F8u0C%1k6)Tdmr z#Yx9KxmGWlX}*rb4BFMxi;qozPfKVRl~)YU&#`(v?(ORQx^naQ;+SgU^cQ!E2KYtB zUIS<0v#pyck%J2g=d^hN+xm|f`A&TmouX@TlLZS^a=GnumqO=-Xv*kX@jT^&=h52=v_0oQ^=-xrjlt}f3u1XhH1>D-U6M^} z)W7hTeMJb7r}SF!(!B@^^er7E2%75!!R=NYs2^a~9MWkvafw~tm9aKaN?;iKCsjVi zv*Dc$%}2tf7t#Pl-5{0l94Hcs-(e`${@O`n=qs@fvRVq`chF=mR6eho)R*9#6X!qh zA;(@5{Yix~yjtl2W+}-SM*mYAM%5M=KP5f|LS!yU${l8HG@l;>%L_&D8TOkOaPzkwA7X0;HeZ&0%1mw_m@Asnyzobn3a?s=m++17IG5#$3gzK)0d1*}^RP2FzBOIh)&`!hp3z4v zy8;D4Sp5H;8>WIo$$}5G1uX!=*VAlMw)dIj2yI>KoSF(lMGrekN_MRG8ukF7c$Aj( z#(f|RA5Un##dH<~RvQHcXIVqw2sThp=Kw)z1lpv*_x?JRgR^2DKdGkL7^(rCqimS( z#_+Hu_?5Xr&8=vE-JbYFazq+g@LNuFDBnr;=2#;0=o(bcP}@xNpZ7WhxjQ>2T!4C0 zuP&!JuZ%hEKEGnF(h1Df3E&>CUZIn^xb1ny5IuYG6EX#tD))75rm{j@dISdGHeL>O zT%NXqcoUSec74VUwq2ZKN)SF8&(Phc)aTYyAW5eFNli)}Z_nz=7zbycs43CNbQ8N>F=wOL@dTAFd$ zV#|h0WB!U#O!vEdmavs6bhwQm4S^A3Wzc3CtlPn0*6W_IM|?Jb72e^ML8d1W@8PNq|biDrc%x<_9q3x?0aY>eJ1f_e6B z@M1TSE>pO5gkIHVt97hS=A7)054+*7WWlrofi_l1+Na8V$tt7zfwk9HjE(MBpckpd z%)bD?+~jmUoYtRska5Qqm0L%gH}f8`Qa=Br9176HImN9eN|x;sIz9;q)6m*JnMK!C zQZkH@n6Y3#fFQ>@LC>nY-uCR8+qJ8C?nzD=Tz!h0%adj9 zLm!iKsK(uGOj^x`@Z$s~;Akpa399}3&hFgq*WAI602nIZ6(Q#Y0zyh@CwppNzFG(Z6mpZ4eRs^@8v1Kt@`!u&3 zGEwr1*_)f`;7;k~XZX)pB&>8Z#H`nqJV0xNse(u^4cxbEm6Ccmj959CNGyCRiyV{o zB5?eMMw(p03slsJb$mL1a~I2g^ODoxvYE0p7h|6xhkX;! zY|y@ZUg%_s4>2Tgq;`y@l<>yf>J{~Bu=HlsFY>R{WmhjAf|XQ0LnWSB31-@YCk|r9 ztgCiTbuuVB-vaSS$85Yr`a_y3&6~yje@i4KlOp3GTP@YS7XD$FnW{O0eDueb2$&0Q zQc6mWoovUSFw&%@A61L~{U9A1!+*}}ANAf8sWu97)h%1%h!<4bBzjNi4hzrBZ!_pJ zhW_O|!;c{M%dyTNVzL>wOD%~My2atUab>g4t{=|y{a&c*g2bYylMxYM8yn*(NB#w3 z3h-Q#y@^P?GPkULVo|clJ5ohi+#LDlO5`d`#Gg--y>lLxPmV%Yj$Z!}1-yB(R8NoQH|1vW-xP{1i02e*YhBONl`1>u+BACicye95?OU$t@&{UHMDvzHV* z&8U==0!7m4T8|yy3s{3+gZ{Z^{sH`3BBaNqE9zB$sTfLk6|=s}G(7Is`0ClhFA`?m z1ms+8(Xx%Y=CX7%cQM*H%*rUCnP9UXjKY2phKBLoH4gRvz}koPlo4HanXO zg9o9iGlS))!W)NRyG8Aj9C0s!9HiAov0@l`EhSH$A3n6Rvl(J{a#G$i{36l!!eJes zb~+-@-isbJF>AsWW?t3ABr;?g89A@`jsE=9W;5TMTcRcBPk{gTx8KzO!QsUP82W7Z z_L6c4_Z@eF;H8c%RlL4M=aR@&WPm*Trdit6fn zvw&JUD?!+}JS7*F28D-Z0TjRnopU~u_6qh8*ODwwfJuNS^8 z{>(VfW5pO^0ky<|{UXwboa^62< zv~E!fjpIKc*U-toH#mojJwXF#IPL_5>Gom((@LvqyAEhF2E$nN$|K(=> zn8@5&Vruy8?EP14>fj17=f$ul>wMsGdgkM=?25J1;j|2c z1>$8y^IBt+oxG{V6{B}a6h^1+x?P7q=8e1i7e@YC4lvHmqp7RK->vi+4A#WZLTr+9 z@}kMUO`jlZ{377iTnYa)tX*RU@6V`-rH%1hP632^NpCtdA3^XBE!zc!UVmX;&mj9NM=eAkE?C-Cw zRc-k1%N$0t@eTF$Xi@?!TLAV|+Dn8)=VLt%AJsYL4tw;I%LFtcWm}pQ_YR~Z^V(zd zJ_FAb`ETJ&v2Uc~(uD^nyVE%mexBintQ38mtGe`T>yFfn_0ggjcwtKHZggNDf(fHUmw%6%a*hy2T(%_d z)hEyXI%}#HdpxBAdQ}a*>%SLydEJ1rW;_d29+y_XvJ0FxGXWA?Wq*2Weu>@aD5?U) zwG|47qLzM>TAjDm3-IeBQ`B$kY6Y#R>93qIT%|wK3qVrduq21^D@)vILSh@MGfT&Q zu46P+K@Eu#jTNsZuA1d-`Zn0%ez9m~sjZQE6F$gVgXYfmS#NMs1UXTjxTmPxA&yyw zwoN2@om=Bu)B}IfkYdcvxZmZ7i61@McqF)SM2@0J$4Kb9~uW3tNJE^WHcY^#| z_3KU})l`2rc#V&=Nv85%IJQySLne?de6>A#e?&NCD^v;+qc)Z0qx2cKmsPIOp5<6Y z{&o;L3D|*gGzJIof!*C}64^oKbbVKO5nFD5KJ z7-JuF9#78k~|?jbMtoJP;=0of_f0&SY!&kcsk z9kJuJj?LfP^!orE#~wK10CcZHd)`f*E$cnQG0%F4Bxz?oO73Atvv#)aAYkmnp!%!Q z-Nur$eroBqKDU=BeAem1Ny8>T9#7e`$1C4!P2u#^-HQcQjO0AYwu%v7k_v5@ zHpQ-wtaFSfB<&zFyRH?HKYxf&wFsV0#?@0;Tn9ZEB)l#EyvAG6hh>9VW+z#Qh!a1g zs1g;sqZ$y9ajty_qEZmX0K%GY;4Qx!ZyqpYC$IsTx}B{C1)QDQvCPbemcj870_EX4 z=}u4XO(sCFI$NB6WG@-|*rQ2FxA%C)A9NQ7WgjoYoBcQ_!Tsul`v!DxjJ4}lauB%X z+!LGD_AS499GdAqV8GJJL}5%mbg|`14KZwsx(OfTe7uFX)JzhMA<}2J@v_s-T$UBsv3kY0*w|*BaW$Zkv*TYX zTr=Xz_1X_pmmQ3n7v079TVcshb4;YtzU(PZ)|u)-dMG!-E8-|t`yei_07VnooDhYP zS4i&+UyqKCLe!gU7=q(@LiL#>j|;bxsi`!Hl1w;o<_c-q4)2{=b11v<>@jb>GNDpa zK4_>EQXa+i!)iR?3Taw(X^EylRqH#8%bcSG$|6tUQuuK7ORsSy#zBB@`^LhWvRS|R zmtAjm(yKSJ=#6iW$aD-1Jsyewiv)4VKeEVwh{f9v!{EO~j30lLLYssP&Aw`L3M=9y zu!8uKe$e!uz(x%@g;$_{N>*F$(1nc~gtzoX2%X|E{tqKFFeR@I?GEKY=J_VHC<(+j z*aCGALK@Oa5I31{dASHBRwn}w%fNEdPON`WmA5cL$Ie{PluDxDy>KM(Pa$Eywf^^w zNUIU;{j5LQ;T>mP{j^&%#3)jSw&u2a9s%YnSyM7~$>}qW#dTlRL`o-_y`JOr`BQN>nBe#Le zNpz%FCciI!2V5ym02gq!?`7jh#jqMx7K~;rU8?dB8Dq3fxS7aqKLUL9$6Nuv zyuW5`$1hq6<#nSh4k1e~uOw{!wXvs8O)n!;eouF2y3Dx0BC{{e*#4f5yN5oS^R#bF zoqv{}@aqaVO?;|gX*;*y8fHy@csi->em!5M@M{^E#}(i>NZGlrNNL>9-SO#L+mK3X z&1+agl$oU({_w%mnX zr=GezmO5s3sW87{d?z|F%<9*@Fn;{SdPKKW655xuFbbtj`Z}+rP{~3w>h>|Q_(X}sQfDuyfn6)80l(r5786}bY2a&7r5{D~z!*z=&tO3>^ zu_L|M@Y*3X|8ksi;5{S=({vIf@y98jv2(*MU}O4BbNDw&U+;z9wgBDwiU3`@eb{zi zDTiYfu-+c_P0VZpfBO4P7MExD3mnl6$}_|1)?R9a^LqrYz#Me%-UbRnniHKKbCw`# zAq(_V2miCR;0nE96Qci#zW@IRDR1^tjyUP7;s2Ukk_gN&yX#|&aWfjfI1+en|Dn6y zR2ykBvf9Co+T*MrI&+)cW1j+L`r`8`et7l!0`y`bp(;Mp>oxrhQa&-bx@(?}xu>^rY^JXA> z!@xh9LuGj36umyt*!H0G!;}K}Iw7YrxkBXSD&u+0%`h+|O`2SMJHL=o7cgD1gwcIP z`y)0mu47rNEz446o-Dlz7i9F4Qx+Dnpk;2@cM4oV6j#*rP8~5Q|NC?U(UKY|OV4+h zc&p47D$GYj0<(btGu_%12|F~o;}TR{8#X+s+8U0a)&SzNhPn2_ftcoef9X}}YVzj^ z^1^82Tt2L0zJ_@Utk#MGYX3}aycmc4L+#Y-sfWQ901EE2)U;$F3rJo5?ZmP@e*1S| z2FYaF4t?fgC2J)SXYzlBCI4^#7Xy74)ATW7gO6`hw10yHd_vVSysT^kb^7ud zO&ipEMW^}{OW^v15N=K@6J$X#rBzJAdo~EX^!dQ7=M-HOekdN%Rsdn=eSc5L?c`OL zScK(g`B#*=ZlwJUB=Ih&87W^4cG;fd3-Tp8*(LdXHSNkUKV}*R;?Oeo0Gd|abs2kG z{pwlMQ${di-4#=`jO1azOrlEax+Bg^M;I-9We$z3CAwABHTh8Mppt3*ptkA9Ao6~0 z7VX40Bs)XoobJC~+`iP440Y!_4z8Gwwdc*mY^B@G+f#mMPjxw02+PBAO1`vi*;+gK zC7aDkWZ%7{nq2MBRFd7cL`_X;`Y)3U$qTjRnbbdj3>p_FMA(@+8G7_-)S)70#sfd} zQwTqwe#U)d=ZsJi@^0(aA^oNC+&_BsRwK83G;gE-ZOgf z`~t5*!hc#Lh>WMbL!BUbs}b{I_!GaF2G1llmqsA)l<*n%KT%&(*P}Ob`L9bBb6Ii~ z6w0qyfYb<$Q`KmFR@;(u$|vG8GXDG2dk z4zB;)bicegfs9IC8_=@OQ_ghrwNUF~cU%ZB$nM)d0%c-FX+!>{Rngj6sY%`%8d_@> z=T!9;o=i%;i3J~5@KAuzDVk2^cnANxz?S#6uP&+Q8|Guo^uL%+6sb^TQ$iJq74K3O z5tB^)&W{m>QIQmzPT0}^N=(LO?)S(GBY(KR5hfqJQr2Sf3g7JNwu&BMUKuEFfz&;y zmf&P~`_UEBq~A9DZvlD^IDwPXS4hvPuM}ya=~(Ji%*`4*UdbN5It(FkGDaR3%3Z>etM322>Tcg12b$LGo&l5|f2w zX>k2zzou_H^^1R&8F|p$_`RlVnLGNQ5Ei`QCBv4Rx%5}^~tc!RB;jYEu| z)H1=3?%;c#6Ug-w-(#ugPhZ4xF00cHD!*!nNJvG-H9INop6&*? z{6yC8i48TwO+@#1L@y93G#h21mrO_F(+zRntiM3d{FFsZqGq2p9_R7S#VIGdxLuOo zU0p}&-Pm7ukMqpWXS+02`^(D6(&FBHMduFaE%otOr_a;Juu`TONA%su&yF&u4k?X) zdtXoGlZ>{0(3b28!1q$w?r3fywAlSyd;ukD`#yZ|cO>)*K>%Zp$m+3e(wW;O)%S;7 z+dj2-a1LNApOhL$6Y_oQFyt^Af?~zPqjSE*S9z_3GlG@A8=(uN{eeDgW|PoFRm|s1UPRJgXe!yq{im3VZtw~ZB4V~hh|^AG&;W|>y#`>hJ`47> zz~eD>&#_S+cl?elfy%{`vpe#qHM{z09=3cd8pSOlSI^}Sv0e#S_g~Z)JHuSOx%-{B ztRA=`?Y8~v=`R=;nYwDi1*kZyN{m}%!)j(4AFo;kuk9k|UvYE6t!1ASZ#_(S`ue~0 zzBAQqneVT`72qpO+4_yZBZc9>I|UPjVT!CEgqEnl!zNZX217{$xtRO3|2C=AR3vf^ zexyDexiO*qFE*7NX&z8a3}4`RgxLEYX{<0H^(${_`clcp1CiuVEwGw2eVUf z{9&l$abYRjknTOvVkiCj74m?Sv+I&wQz+RT{)-WRwFXmTT~OnTp4g8+R8%aBd#OTK z(mEVQA5?cfbAeRvv{*@luA<;-eyK#_oS0nfKh(5_zt*V$-aQv|7YS9^gki#*Byxwngdin+lA(JRF zt{hVR@o9P)y9X3@zB>`Q2htboPT1t=V;`YPBdq(X`DEku zXrdyc8aTF|U2I_~oRWUmeF$LQN7b1Ti|&9jQ$fZc5DY*Dw4A}p?QI}is)mQxa4$UW zQP|FErj#p&^{!}$uR}-Qo|}ZTcG-5ZB4Y#kb`QO_hdxn2cfh+yT9?fe`N zLbY^vyF*|`>yOVG##4Z)Hv z@6d6#)?>@%ZyD{`=tB0Mhtmh?Cda|;lRNIqm%8zVwP4ZYgKAv3mbzAr%WNc1WZ9sy<2zk)U)HE&&LC6pt8*nDG3Yu1?x8Q7wFq}P4l}j%fyy{i=RUUhT zGj|e*YwQR3rwB2l@n-jo_UCq<>J0~CX01`)_61u{Vbz?8nvqF$SKv;q_+J(VFZ#Bp z-omO?@%BiFiT}alY}srv2cBZlir~Q1m?M9mvq{D=frD!ax5U$@XYV$5L~f#tdi7-| ztCy)giwNQ-D=x*YKMw?B^8{4c@(_s8UtUAXVxSLCbz0Kk+uEJUg&a4v{}JEbLs?`W zHbx1eO6Kr;*QRxy89D}2?(iAt@{&uxZ6=`gd<*4FbTWICL$sUP1T6n{v=UHA0=Vkpsv0v(7qE;c0A&+<~D2NMI`0=@{|3kSC z`s;q2DSp{Knu)W#6k0+?>V1WKtl)AQb0Xm0)bbr(@rEqmm=_sOTQ>=SLP7QWd zEMnE~>z$DH@wjrwoU%Yw^)I6`Gt>fqtUzTcdIePP|Ii+BO1#3~3IJVu1vFc498V^W zJ1BxaLT*D?jRnURZCJx(ju?1EfAUPM+OrWpI6XI9^8SiO*nsaP1qMhx9uPw&gIF|%MoHlMN`4QDxahw|3*)zs9v;RO8#y6wQ0{A-7{wUj+ zcIm&2*Zq6T*iAmA@1$=wppT)f-493CH6a5S_B>79&?H00L|#)2{a!10 z?AJ-rbrbvHB)xu-zXfDY)2W~Zu*&ReD`tKis`fFK+^%X9?0r8L8QI&s;oIERYQUUw zvbSBcTCGu$MQ#`qXc=F=j^(~Z?P54p!$9y?gv%%=4V^^3;e+0CzifEt7;$bL!9)YyW&!h#>5xrj<5K7wPB7}k&y!9WP zx>y`=udHo78mkj<=`d8(PTepM3jJ)u4F~K(*Ac3q<4-OdjtzWLC|+sn_1GRwHv!N> zL&)%L;d?Q;g+VY+#M%jAVF|T&p2>FQ&glf^R+|-fAqjsMOrapRCBHo*<2;gh1y4~T z`r~E1cIC@@6?%9wV+d6-+qvsQUSOj|0GqpB=n;E6Lo=3tuqd}`sn5GZWsvdcet6A+ z=hw0yZK|utF->MbNK-6w3(0F60X>aWW8ZVi0GuZCO{YQk^hji{bFn!wPdQB)I;x!> z$H&5Poq`PhykiBSl+pokrfBu!H4?!tzhGs*6Eoq9L*GVjNPOe^JcU@Nd8t~cP?~-_ zOw0QtLBUEE0CThl{gM`q0=cT{42 z74=J39==$N14&=LSeIhFIfI;Wko2_15Vc6yG9r9^GN*&9YgS<HT<7!&;jpkrrO+KXg;K<{JXnx-~GAW zuL{}yqWr-|$}!$H3POi05U(xAhJ;#4wAlu8gDDyY7msIanpssA0`$rpq_{-HVNElP zK~WpaxM~@^A3#l`=D9?Pf#o9_lXJ1xubSpYpLO;~MOeqpU~3M@^3sji zTvUTlIz;8-(bO?)Pa-V&{{t3Rb-W$G#C~AJIo)Q_ST7T=zJ>hWEtpi@f+dF#gbP5p zaF%-HZ7`mnvxG4_`@-#-4~7QiI<=SW?h>$Q53gaGO%Ru1w@ji|3Kp(=-C$EH89;1j?b!XZ@dvL0qC)}^e{?V! zmZrqN7XAnQo6N93I~@K`9AB&GDe0iwz%QT47I^3V(A6FaV>&R8eHot6rVmC}y#E8(gbt9hnhuICQMuB*gsCtRs{imKU_i=_W^ z`u1IAhJkRG;9Hy|MS_|#i;@*TgOafpl&CD+M!}7Wh=c0C&{+tlKyhANelF;~TF4pm zNYm51kRbb7r@=(e+PK?}wpJy2z9SJ&H34zvTvRy~1$UoW5#U{Cnt z1?Y3zIcu3NW-Fg5qgt03dyr9>mNbEtdPy_5@3?l^uJ+QV>E+cVg}B)a_}BH#{>m>0 z+k@hsQ8VS-^E5=^4crs?yx`Kgiqy43aCrCeaa*6#mUOXKIQHW&!t$*4!En*~u;b3F zgq9p+2=nT(z>;@cWrs};*PWLTr#xn%#cZyaakeT$rqX7l4O33NNzQYujX=3#N#dk? zK2@iAU>(Rg-uj|Eq}`bT8hA=>noB>R&U6cQ3%2mP6`W7LHwPxN-Vp;qMBYl-(E3lH z{|kBecP-}OWh_MGz^}E1@;H_E`d`ACdxIkpRGN6Qo<`F+h)|Z^_)UK6eJG4h2RG@P zHv<(ccim95#Tpr4wgCak0KqNm->CNw8Zi>w{twjwAl-nhd2qvT2S8yAtP%;>f77AN z{*$i$)3E-7iGRAinCe9%GuDDX>VjUmqOHypSpifY$#Jx9vp&}>O5V$l{YShY%($mlbjvi>ZEB~K z`{Syc8nv1GG!+EWlDBxu`@yn@Kd~~|;e}6>d@wBEnFo<~u8}04&~kDuPVe{Jx_Zh; z+ALvv58P=$g{-Icmu0&T9TSkwsjR6n!T-b4JBCNnc3s1o3dZLS&CEAbk2S%HXgU=O^H!H*Igg6` zMUEc}+e`rIcG&GzqOnVXT$yvup-l+$na|Iy|GNLZ-mJ3l_b!z^d)l>Y4`=}jMOttT zjm{OOGzbqDqo9#O1$+{wv}u1>6g}}A(nFkgDOoVAkwK}24$2YweWQetd5c_U3|3z& zUpat71V7KG*#7eEENyUaPx;=Sd%EVuUEOVH5xaewe#gReOqK!cT}> zQ&SySCd6PQCEm#I1qntO$d(Tyg_tAYsB4U z(h0R^+Ng1jB;&|2BE<#N#^CIV>iupVcjgz(P`7afU2R0QmXQ1l7r;ltIjwwOM2XEYFN2mH8YXg*=kuO{Z67=~L*~K(inc6Uk?qZ8O znp>m1kqWE~3FX$yP?4JeM}{hP2?Wu+}g~biX9y zpIg5s=I$d3>YF$@r#UVmCt>bIf)`vO6bR+M;T}b>)r4@?t^JwV_N0DF8lA^LTZ1Yx zICO!)Tr)$1sZC0 zruF4lnPwxODCs59Z}->mdK| zar(4ImvS*0*FL$5j zAWAQb4o~y*Kz8L&0taIo=Mc8&jKQluR6ygl>9$9xM?$|QLRKy)kb9KhxfbdN+Ulz- z5E?VZWd6hFjf_)};k#cXCz<&I5&Z)`+8Vs^z;zl69j^kiNVPk> zoW`?d!XJ8r@p8l_!^ZOn>B@Mk*OcmS)3jCd;CbKP2$P6~_)k2RH+ZErO@Gf#Wp9d! zcP1EsK>MXdKXFv0cG_)S_H6)~3HAslit1fQ7FFGPU)-E;DW@H`XBjTTGAB7}>F!!) z$I48DlMW#oszX!wCRk*(GxaGe+RP5CR1sH|tzd0351TXY6BM1jo-mHostfZ7#!@Cd zUFI)++O=QkXw*)^oZ#{KknTnbqzD}#Vx8<#&2u}NcO238ibq#h8;_p9$`4;*!O@8g z&pGmljToJHR7HM4?w(;n;n2hBmhWLjjLI7~o)Z?~Efj-#LF)Po@`y=RB>I>8P$CG+jOWc@}~Y zxFPSxty}6V+g7bwz?$Va@443c)ExJ>5PaRZOr{9e? zIl?lK&6~#MK43MZ9v~{qEWTSnB?!oZeiB9`#Wu=}OlH`+X-%^Ov>UV(md5QN6$h@6Q09rsGq4$o+G*S59T1KQ7III9?869f z8Ky1OS{7KwnaNmS3V)4DOpK^%u+L`sVv4Ys?;~1#9)nL`aA(JT2ey>=p2tV=&?p(` zw>^HP2scpxD!F3>gCOA!#aY(D3;1)w7y)$Ki*YSlt+PWsB5d4|gre}E6|(}zWtJ=8 zs(*C)#Z)A+Ad`|Cx64FCjoZK&TxKCUX<0bL*EGkl1AIdV&e_?@i{ztlkVdB+gOd?g z>5hK`J1StZy9^_*TYk?PD{mbZZC`bW&((PL?&Qp^B5_(z~2!MIvjr5GI?K9sa`Z34*v9@9;@ovT>JxNTE52Ckcq7~WX!P5(HT1d2x< zX&pN!3=0)(vx5tDrTyhK3_qI+ZpytmvKG{S(KpUuk^K`={?TiBa&0!DLJ!F;gvKE= zO~A?{_3~dK7bvHOI42|gzpBYGE>NA?qOveQj?Z@!6LA{`&~xpkzWLU6J<^-#`pFG0 zY?CjyqLTBEgyoPc{&JFqMGEwdb6x*T;D6$6z_@;U?_xg<`IxQ~&5^&wT^|MN3y&(7 z@4ls#NLE1?^p&{0c2(PC@SdQD4P+GiM5)bEq&QW`HFIjXT3A`x0GXbFm#}pk1=uE{ zVNpini`JKEBQOrfuMmX1t3|I!7ev$ch@pBO@}QIT=gggCLGg;%d^xai$`FFHf*riZ zRESNCURE>NS?$~&qY<7O!78dZEV*$hNZR4%pu?bZYkOxWtQ%BS=aUs#tK#hP1T0PNrK*!MVM*D#Ri}PO9RBsZ3`-Ovxi&DPolTc7#C0Vr@S}Rfo zf)1CIM)+ih#poqqx|bQi(&A))0W3zD;CTQEvmnUBxy3E4%fGz}UV(i#%uJiW()|Bq z6MHX3t-ym78w&yJ|1xqoR|rB=^kAi{t{1X=8;ehwe0uw)xtB;u(L^+4{Z>V3~hcS-tC)b%2Uv$ho8;jQj%AMAJ@8Y^G8=!QH%*HSDSD|nm zGGdR--G~E*2h0tfQD2Xs0P*?2Bd)`t`$PedryB!0@inYV&H8!-v?t^6b$o)9Bgc@n zD8-YU$W~b3lu7?2O>=~HATe7U>qn#&Vo-g>-Tm$fEuwO@yMPv+#)RC@Kp#U9MW3ET zF|OBsx?@~fUu@%M4a01IkdFt=lqwG5{*%5 z6=1x}pin=+MZnVUOMhnnB3?vFa*~`|>Xb2JtrKh+&ZMD#xm8aUl!`siXr$lk05O$F zV99Ja2=hm4fb&X8uD}~DTzpmAdfZpPq7wK<5F&R_1s*i7sp6*i=;1uSRDm<0U`!w= zhSdFmKdV5Boa;PFVa+d2J?(>qt`1H24FDa?YEjwABy2@@5S^ge31-Wb+~ORcjE=pZ z#kP6F5V8!l?0lECgO3of16tj4=xEjeM z@ArPZ;`bia)79BEFox|T8f{eptwS7AzXf)2#1|fzc&Z^H&>?VJ68RfXP(E_|3;Tz| z6=Mn4@T{pW(;vW4tVI5kcL|%JZVdI0E2%B(riW(X;R#L8_`2 z5T6oo71%$xiY?lD8A8MRdFj=GIct;R*~vtoEA1zX$`*}F?~4G&PEzc@PO5|Cs@FIi zAupdB$7yZ~6>z5PAbwl#Ih)dVyQ3YsMPYm6R}u>X|67 z@G*d`I`Eg79kc+lTt*`&fS__9GE!S8ypS#|Z58LGB1|v0KN#n@7wBVaVj@%{=+P2%luwtyghsya|JhPVq1k9D0%9zq9bjN%Xsb`gwr)<$v!S?I%ai&&@zY%ba(;^ z9RhQ}!xvmy!DMmlRedS#uIXT8=s_0GkB$eW^X=Be6COpN+eL&iMSHMMDtj_AkbOqE zsUj6Tw~q2!0b;5M*6#FQb1ZBjo^O|JkOt}HDU7rMW}vse(159+Q63SM!&+=gd&2it zb`koXTZiu+g2kg5inDw3goMp*DZkim2x9%DfeFf~-oG^EADaGN#25HYC#D9&yJX%F z8G38(JzQYev#5q7=#Sb_>aY!v?G}V2zCZo-ckR8AQapid3YB%UZej+&(%3*#Y0=@9 zk@A$Ue{A~o_qn(j|NJVa<1Xd_hX1l3@$%+CUWG_OH4XgQjDR5iw!H%j{@-V!94v$c z9EscO{=2X+!IucV@wX7mepdU4^jCKn)RyoH80yzs#d~_W#vPC+vTKHMI?ee}R%Y2E zo)MxW>q8f6YNaL>b`Y+k=yV>IUox4<1q9k{xUBIZvLFk~P*OOnAgITS3W+lr`C|!E zTRnDbrR*mmRPo9zi0lsjOzARTpYngd?vA8GVV~=zeO%j=n}xr%z>{a!KWd>(>&K1{ zdCNr%B<>;GZAZ_@t)-ve7qZ7yHsLK65W;Gwl7L=t^aLwADB3c|otfC;W;_kZ#0Lr1 zL=VD|sex0sR|i(tm19dv-v(q2?P~PO7W;v>_trFpwsKp|`x@WF!3vQ>nfCTNbc#(1#=wU$^k& z7g!)zjV8`7JBJ*Y8&@6+@l43Y=)Cvq3gXl~a?m?Xum(?S7#|scS!X5`rAZ)S#1%iL zNz?tUsboz_J3{HjKCTj-`ZaOD#g2rWBkteb{2be4m5a{7iH7|8NDuNqZggae4xu(L z938%;FGMC?-4Hw}p^nKS7Fi=cynU8h{L~vSkbk;RzpOv+*LgoY80tkl`&3uYC2i4R zs~>4o85he1NjLlUvM}jBEjZmD+t%g{*0FI`&EeT$-=!D&tZDhNR#GQjGzVz|z=_lr zs1d;r{k*%nYQ9;|s(Q4LI=nm$acbz)ZbJR8qLZ4^Q!^^Cca{A*5XdbP5Q|?hZs0;ZUtSVV6@eOxZgLD3p$F} zYsfHG_&R>G=2S?>&L3G!avIH71*`trB(@Su>6MOvTbG9@bq`RohHmJS%(yUXq)z1L z3SSW2f>7-4e-)A!xM_qmOeHy!Dm$MQG6U1ZmbisWS1vIti12|uHLo&^h0d@UsC>zF z{|(ONTb5%&Q$e9?$JIqxV>=`FL(GQ+2BF5bMo&l2SzgU|ej!fNFqT#PD7+1AfdYh9 zzIH{sMlC2{8x;RTVjT+1BRl&6CL}3E;WZAslcV<-NJaQM;Qw&t%0zevHz~LLotr*k zrXd_XSQPmya#Up+=IlK4Pp=0@cOuq)to$%xO5 zgIm^da;OA&O>DeIfZlqnV8QoOLm@d>}5!LPvZ+!>Syj&?ZXn3D}&ndUQl9 zda3!^b@O~HNXzkWX>KY|{%Nq05-!zS@jHShic!tIY~|{4K9rFNo7YP(_17iSa=1pa zOUCpnQx0eas76nj$P$MOHBPWQbDnSeWJ;7l>mUl-00_C|C2a(Wr0Vi$jqec`Dr`)Y z$@=9!k1e7^$n45H+{8~z8WoxT7H9tatV`!_O^*4p#_}I{#R`^%bIWM-ZV|H$g}=#l zM!Mt$CTL6}X@9kNi$=V{iGEj+X#7QLbxg7}=Tm$Q?vlT+_-J88d=__S@O_5$ujoKi zC(XJDu8{V5XHM6qmNRiSZvQV$L3sgM&qaKHPh{NRB^&eTN4rgJ{cG{wgX9wf+g5%# zrz#P-TjZ^JKkbuEI~uQ87Ukllg};0QJ_BtM}>47FySG=st&!N=KFtDXt?~Ai3%^N z)fbPcGk*R{Q!w2AET#P1;zzN5VLyT1{`*l@ozV@ztZzkx~{=B*M$8V;kws-dl8u-7k}RaPf_` z(kw>(8AGEiB56}V>T4_z3EENgkDQ*D)}9t_gbTuK)tNhg!a0NL7bm z82FSQmI?>zoin80R4oOi_^_xq`XttHB*qYv%1ihWmS;tPwSoq}q5CHO5?BP|CRZ-@J70A$o|#KpHE!&TA` zM4Lstj1Y~LKLZBAQmXpE-s6ICh8F?7GI5so&&0SlWxt?f0u!L#ow?Le*H}VBSPY3$ z%D_@0WEAMhan^h#A$4jv1t^_CO9Kb29;)5n#jJsX)a z6kp7Ch@9%|%&5_E4m zbjP5yCC`%xKod6?^@`g%Dmw$enrZiEVF#{LuS*1tf-zU;V{juR;IdnZjL(NUlgNQy z&7x7j!YY39>Y@k%V44!0kbX7^n!W~?YD%WIn?v`$8_0~(>YvV8jse-MBcfe@^Fayp zO$oSV#mi()tf;Kl-A|uY{vp+MpORF&h#=N(E?Gp>MmYzI>7@DOR z5sCj4sh;ro7Qo||0uz(GlIZ`K7biF>Fey`5G?!ZzWM~scYWkCioG?1+Dv=c3k5Q>5 z2pH?4!CE|(^F_WqNGw?pk@MpyF~x?e$bcgs`Nb|%0Qb#WkrG0Qv>geJ14PxIlQ5Mo zsLNprr4}dxYyVJ~sM|jnI87$&Hw0C@h zs*A^(7S`9gJ&oN>OSYaA>G`b|q6h=*5}qK4T1Hpf5KS`m}yaefdeL3_RCP#@%S zVimr6Gj6S_rrF!eMPym9O96>V7-u(a*BKUk*d|Su_g7iHMgdW}I}n!DU?mYXmu3c) zpc(Qnlw)gPtefQHDl9=A&46kg^nw(?u#j2?nBpTksfgi9?a2s}xd0;v2a@uhfRA*C zV-O$J5=Z&yu{LbkXoy@sVIs@^1Sq@#XX~MhI*>9`!;p`!N92Rsv^{$V2f?q zWDzv*L)BD%U0j;<@@f}pF3TOu(!3wp3_iu-(#rB8f=Sa5#Zi5jCry=8R`pu+v*QN8 zz3&dKoxgy>Y6E-U_LB9SHG9ecF%7j+>w|l#7mk33c^r7b8W(t&Yv`G@Q#V<-d)ax{C3 zGFWn8)OtkZ5DmA$T@@QU*^OLdhx(tLxsvPeoqOKzQk6SL5*vRSyT!6`<1gs(J{R)q z8|cqozTi&u_5RpcDk2Pinsaa{J(~@#X)0V6(bqHcB)pzbbOVm{En&(-FytdD)1p5d@g0popOjqV^IBau@yt6+W0#7t9LOrV#>9(QeQyE=jtXy^jFjYm19>GDWP#?+ z;BvD+S>g=wzZX{?!&ScqMmJ8+OJ3YLp~H$iF~SEhu83j#FAz-N$C2D(7_T6&Cp#-V z>4FJa6CKNqR2TV!`rZ0FL*Vi0khUy-3K5%JvFnSroHa#NT)O!4p|sD$*jqqyCBop{ zz&ZPrDLF-0GdYN|6Uf5vIT~itO*^!L-H8qIKXEy-j#!iS5f(?cM&WM zDp?ljr?zp&8TIb;=t^W7KU{#efW!|S>>?D2iDwW)zY-pEqKUO7LN7Vw0)}rs>nb$; zcngq9j+&O(gbqYcF+@zaoWWwe!kEo~@8z(1;I)8ja?F@SDfYJn!Iz~!EVAw~EK!^n zJ0_z?)EKTS0!9j2tfb|u_?N|u&h$&e;Nq$%Y>_=NX5A6dO0h+_U}k1A6p2yyQJ6pU zm<37}&J1R?8BVB(sZCd>_UDoUiUy*$Eb7%IHxVsPFa+2Wajs{{UwYfrTOQ=Wk%%#^jTWW?xS zh<=y~w8)c^YsJn1fdg|FOrH20r-1|xp? z#;rBU2N{_eqm;QB7cAOr7FxMxNiZtup?o*2x$^u$puJ{tGfLd)`5?0RYoM3_vMfDE zGuiU9!ppsgZLQY*CtbepY-rMlML0u|=8EZ_$-76FX3C7<0)MA2mrX|Q04s4vi$b9= z%_msqkt}yP0*m7uKOEz5T|Cr>wUQBJxM$Elaym#8xulD%50=dya+!Kkhf06EcG_6kGT> zvh_F-S`9u?oD{(N;F}0Ch&B-f%coVRskLW5_!VFD+ zRqP1#3afQTD{3|2({D1FnnFQjar>a=ptGI?zRzP1K4y4eD_{bhFazc3Amo32O+wi4 zYVu)EY=9mHM=R>Z-*I3Sqv&u3YOP4#a>M*IOy3@GXHbftX`D-SK`L223I?){#}aUc z5^l;DT(D`Xrij`+b}wk~GgD$Lmp7puXbWOPwJL>_@Fm82cFiLf5C2&zN2N7h1FrR8 zNIn8t8^dEgZhnr{FAAVRS@i<(p}Xw<=aI*@p?DxF)JkFX)i)Xk23MK03{)0WCF!{O*KiJkStGb3q(yR^ATRZldI zXkqQTZxPx7iBais=~%fy1mkOpv|F={M}E=4fa%!277^Ca|LvJYYLRq&p=_kBQ{mO- zgS+)OPzoX1O7efktx)hsZ3MwhnpCu+@-%--5h11`3oL!3maST4GT}YP09mi_RjCXd>@w1#Dth>C{SutaZNb|TAD$<0KYDR zh+xLWRDQPhB_O*hyurthpOcfTKYe`f+r!V*12}ua$h`LM(sX%qa7m@a7pi%oxHW6h znF8*?I}pAtcDP#bIDSzuJDC&YT)oDrmaSY{83$sh9mktwbpz#0~3ZJFq7H`uSIb?D6N^v&6dmifvJsl#ofFxKx%+;Nhg_!k32&*@l4 z+Fa!P-^M$VoKXSeVE$!SbMU86M6j%JDy(r0TVb(x)f-%*V6Jr3OOUP*1QxV4d%GUF zlC5eYMDKO!5Ab}LWzU0@136Yoc1Rk%5>@`(Sir>Eeigt;eR5|DmuB~koO+^;*zJ_c zkjWm+MJWRLdSEQ@pIt=etUv?;Go&TC*`QwwcPH}r$VY!Qswc(j_6kJ$Wl-uN@R%C7LcA>C6E(tm18 zE|=ViU0dKFLgT7)^Q^9!pSx?9z_(sQ;r7vNZ3(~2H;T~bVhJqwL5{2FDHQyn6Gr%1 z;$q1Hz?|uLRn~SjH|A@XhY7!{#B)r(12OMfNG}5Q$rxcYaCLQc^crG!xVLM~I(h6V z@{@-z>Rh64%q&94qIpFO0||WovvK<4%STA)l2cl^C3drelfD_xA(a z5UobZVs3!7-^@#cclnNUspl8up-Q+Ae~eJ6aNxr-nu5vJy0Bi8iR$Nzw$?@y53ol= zroi>}nMi8U!gN1JhGJ{#?c>9{`N_Mi!Be*jap#_R@buETkt~F-JUtyHg31d<_^^e2 zhn30_9NB`tTxd3FXGK_wYz$`0m}yd1MVJ<`mrc~d`CA`rN~gwHh3jno72)5H*1faW zdvp1>puVNYEubdp$9-+Li6v?JIq5{&uSqbgIoPlva8DkBi$^r3-9Hd}R@Js19ND=! zIR*M5;lFUuPn86xz}edJPq2BR)~ z5JY#cJnsxlHEHy5ck8kI`!%>4b+I+Q<~V#ANz%*iR^)OF(@_hh$T%NJDO@RE*hpEG zQBpDTbVjG}+=4e)%~Ea3FfP+t3zrD1c)E#VX_2R^Hxymdq27QP3`IfCr6UT&xxnL8 z@uj0uG&b%=-eSb}4+Y`MxO?{I`YeW2c&JCuLbi4imGT zZ4)<0xIsa||0O5sc%@~SEs+sAt9{qrC5h{O`&g>*O`GNFIf1#8Xl`>}5`My{@|C4{>67q-hmZFZ)$wQ|Ln8uX=!9)19WSFs>Z2v4|N zmFFPn0}a2D9v1_X0@wOdbVB_1OHK^iW(oqSzkEq=&ua?%^;aI&AB$IhR6I$9Rg}+J zGTu`BsiyeMF-T`8vA!Um%6&PZzyE?{R15pnYuNLb7cK#CP5YwkRk{7A-;tR6A@rII zMBJ$e-a)wD1-nYGKyap`GgpohlJ#0a@Y((8zCIfl8kb6-{TNTHm!qabMcu}(IPQ)> zo&AakDMG1Z-BU5-ogH!UyvHg}zs=g9aI_AAHa%OB87ALhK+lTM3!|OvY;9%dS}Agb zxeB|pFSwcj=DWBMJN1;|ZL^3v96+|Bz%6j(Y|ylSdiV?Vc`j+rw{1a|^zooMY@Fe+ z3I3uUcvrSTd@PE84~kj^TCGfkH-iGCK#sPuUwVgAQc2-pbuO+Q$E{FtLh6l zWwpY1Kc~$DgQ|YmXSoSDzrRSUy=Hw$_6#kwZSzh+Jl8w-PicMf1mE1-$elaCe`$3U zGJs8<+=o}lf-ZJz$G_Ll1Xi_#o_=9(NN~x)sbCLLbL@~e-03unFxIL-&*q5*D?&O~ zrP!_tU_b$Q6gy|3ZEZ&1@F63XZ|W$_(zWvW3OMlTQHP((%0Z-N6I72Dx^U=b>FS3q z;aCG?EQr%T8qEdlJs3;^Ia{g-Xx)|=^s z&+9wk5d&-dvmAxn0+zRX6e0pPT0*7Uyl%r`Jw~o|D5dZj{}~XoMtTndauxM+t2Ba- zDV>CpX>OQu4FWE!WESRj%2*22f4koXzVUXonQRq}R~|L>XeR5TDeIC>B84g-QPa7) z7`*jjd!Z#yXd&f2{tVTIpj@u45-}uR*kI8^Fbg_`sz;9iw^(Ymk(7nTL)XExXh~IE zZWYliL>c=UO%_h-T*{z2dd`=zS;~DSzvPLHiLQ$5)32BUN>r1;r@tUOX>U$L7mG?m zvXCd!YXDT1YVRK)hst#C~l!tU=CFy=0k^@(72g`1^-pf z{qZVhLgVR0UdX3ePTmBf@Knj>Ipr6r>Ios)e;zP1xhavnE@*#eE!Qh0=NK#O#*>LG(103P7e_8Nl<4Y2Y~4= ze??Wp;kSyEPDxFX#xQFR?4|F+0e_${LwfK8S`UaW;PFoI`-U$=Ks>eUa~g$%ZQJs{JFv|zwRJPSa!Z78s9_B`TKyYM#zB%yGWt9-@1`V z3p3vEv^C3&PDXP#3={K(XFImu4@5L7IP>T#)qR|bp-yNLT~7h#RudY86UZ(gy6ZcU z8B8`U$K1p@GFw-d&LOC_gr@N}b%-6mdCn2^ZZ*1QMds@7K(R#xDo zyu=ew&oGs#8fv5M5Nu;b%3A|(lBf1MCJz-VaQ$ut$(jkkds2nNWvM~uav{tpZ`NTW zDaH^@276zhYjQg4bZ}=m25r(b3=WxbQeLi5z;EbvGn8{|*RF?4vOp}TTrAO`#X^W! zk5x)W&cmM0M5WKe8okC0C`8Jm4Ztw5g|U85I|)dl)yX>bLe4{sP`x`P9?L?}tb)2B zL@~;dFFJBV%BxjQlG(DJB+M2dc{y6P!sS(G&49fR!&MWsD~3j!9TJdO;3LFmt# zH%1Pv^VTI$pgl5LOCC-G_2u-pHOl4X7fo^*%dQB`_4M(RyHYjM?;_~Lzu(-aV(hBj z3=`7aCpN{W-NAkM0ZdCQI$+AnTk=u$-k^X*Db~tFh?>5WKz}-c*op~tcFK+W`q8iW=?Xf7g=6m-iFqGVQ>3|o1dBC1z< zj##dd7@UzJ6*?kttWk_QdnkKc)MF4toj)NgV-l0{>ALsr1bG}6Ujq`_X}=k_lds6p z?;|;T4a_PDSor5Yt~wa0*|Yup8Y7}s?0n!;VaCno8onj*YfCmtnErBBEIEPi8Ux)C zdZ(NIXsBwa-va^`H)asr@nAREX&GEj>YEX2EvC?KqqRGPyNeqeowx4JOniQhw+|m5 zRh^o#;=HfqN9a{k5Z-wf^DS#XUO&oQ5%?z zYf}7Pd8%|s<>Y85D2(bQXNG?)yKK!HjR*jmPMO;mZg0BF%ZWYRpZ8G{=9!P@ovnUf zPf>PIL3&}T@|6uayo0_plabq|g8Dx=E{ZWGrmR>mg=Hw+JfD}W$~&sn%}b4|Q1Dl^ zQ^D5$V##qTw*C=TYUui;m=^U*6-QMu49l2iJ`8!OY@vIphaM#hSaBO#j|Wcqe~Cw zZMjMjI4e;|Kf_O=0WVHFqw0XPIll(C!ZNj3u!uZ$MEB}{kq8CFZ+6yPg%^C)vj}vl zWx`JWJt$LJtts@qT*Wk7v0E)br_3-Q!F2j_RdLSQ*^1f)IVq%HiJ}divKEtD3%M@e z|LKIFNC|&yy92M7ibctpKdC-}b>vtxoBau03e*fjd~71}+vW3WESaVN+Nesz?U>pA zn=+LIszxtGH~>nfbK22<_~4;3cx0&l3BuJ3f%Ks+r(D&GfX@o#N@kHn)rqz+LM_(A zM>1YOnXcLRTal-+CNrov;#hOeNT4Y`W8px`&fH0Mb@C_2~-wb9#`w2bNF&N)Hdpyla|q! zv*=1+a4i*t28+h9%ZA-WNzo4V7T zTv#NT;ye0~U2-f?9A3a3o0qlIl0^s@;fI1ZYE(re{jMxMT#3Uk7T3hay`3dU<(BU8 za%3mS&5oHKDOA+gmm-pubt<_LOj&J_h#sCdejZ3@=hR_v8luKR4DHIvanP%VDSk0o zxN&)Zt66?}Ny9ywHe)+|mt+(*j0ydmll=R-K$(hZ9+bFkKO4JnLY~kyZMOQ0L!egO zvqm$P{bCW3&sKA~bfNQN+S7p#C;ylCfS?;wZh@C*}7q?Ix+mUiyXW9B_E_Jb*oM>7r_rHA9#iF?DlA%rCn0#hbTm&$JAAgPciJ zjs_khb{#y)A;ZDR*2E0TYpy^4;{~#37xN=Jp5rPO@_2duVLbR9R_$l17eJ}ScvmM_ zPiR~!-B#^>0FEXgR9uwC3{#~@GZlxfQC=A8c~Z^v75EA_2w8^0QZAh;Z3p+ss!&kD z_k#s@^i{+Z_{Y2n^^U^*tgC}{(h6AjvG)w_o(eZt^%ha>Gt%~zS})i7uZGedkhB>} zriguSSXV)D>0!Y1%F3Jb=Q-pOI?fWt%lN49q_}$qiD=YFA3G++m(;6(#L^=AVH$7t z=DF>6eMypzQHX5mhOaz9akGH&vEJff75y4!oj@cW!UgE;GRW+WiU2EW3B7!BdG`fU zmXuib52*gh>TC*Tp(Bjx9FpgKfqLYiDMo8Qsj|4LAD2HYcNZxn8nh;YFIyNWNO=1` zvRcuLi_R#rGUD6NQJ&q4KHk}Y5d0}t*Ywz#1<$3Md19xVoxc3F?ec^($klH#`t?5p z>@Hq!n^5RlFe|&;Kee79^GXvpUY&tRu%;#lB`uk=e`kT$1)FB(QeeiZgGK)m$>mB! zOw_-wJ_Cc-=4SVPgIi-GDTu@1bljX znle#-lw~NT--ZJF7!t6MN%{W$f%OFzgvnDusPTxiSBUVIEt3Q1DWr@<`H3)wd z)hMM|qV_tI@nI1N=Non`du2l?efUVsBikJAm0{j~ zzea#qo(8r#|{NJ&E1+_+T=4XQhCY%<=TPx z|0sb#7#K)20j`Z_S05zzUwsC86tH5>_gw9J?+<%qVU0C*O|ijGxkmMs1fEox~R8z@m=40az#@H#ea| zjzK0kvfW)n!iWCiswO!wOFGRe_ja>#<(a70!E;qC;XwgcFTcDz7$%1#S|vIdvu2kZ zq4?o2n7H}7W6>LiOk+@Aogk=~SvO|l-JTWeEsXdrj#U_%9|KYsInwAc*+sAj+-2~L zKPcOsa{}GAVjieG2!D)T=$vQHfy=rrAvu&6cOI%o0dV9N(QOVZS#sr5X|r`k6hZt# zl6~QHDCHjfhABwFs+Rx2Vkb--H)~85pX^4NMYl6cDHPXf&b@`#e7g^_#;lf0RGil) zN*t1U)%t6h3_6ZS09j(_$wv(FekI~~gI;_y%O`mcDGyQZnP|l77k^HB91P*eYN%~v zPsCXrDr5kC1}UamVYzF8`UIOYu6PRROo^Wq{xN4B(KX!H3$h6XdyI%c;G+4NqoQKIocZ-vRYcX*`$fJ zR?Vkbfo{zojn>tWjFiZPl`3@cyd_3mm&}_L{UB>d7--AEN?dzmJm+A<;%`-d!cvF8Dn-SYX8G?8bbUBoL{tpo`L; z95$<y%Amr=B+}>Fl5p& zwc^GRzZ(+~@urjJ-D;)2%ydVud4Jm}p15hR5@&J+ZZtAg{99$(hfJetC#FyV#UvBn z%YTzK^f~H0w~nqt)2{XpDxdCjY%;^G4AqxkmMxAg3|akzWEj z)jky(yWiwdhOgKPaDnuBp<=rHc;<5|wg?ept^fXD1SWIOXMZ7%%owZ5uWyg86IXa% z%3vnk#$(z&wG(q0#yyiC_L?g_jvGZaNjGGu&>B^ntWao=eoA2fT;;z=whFL3f-xz8 ziW+M9A=-Yy@Cb5O;v+Di1t4#vwnupAmaW11xwJ6##?F$Wp6c6LF4eI5RPge|#Rt%; zD2F^V1cKTmi>Jwd|JKy;qSx$(W$yrYxLi1o2qFe!)77Jg@^615Ml6Idxcq=uY@aUA z8hjH=Q6BXzFb)f`3Y(=_Y80x@zC9|Zd`8Xo4L>b-=5VbXnpI>BxiKdGCK6VBP!;lX z#Q(VZ>_!$6I-Hk7{JnKKcWBoeFsshMbbwCOrrMgV)QI=(aZlw?JL>`FE(}{ zO(gsbmP|Kf%aq0P^rUGmi*ks)d+zrz)rZWUY7X!qXVEty-q6obm*4T_KAdE^)4yvFOwL)H!;2m1@;4#veOP zNn6Y!!~fu*qKpI$p96h-%lUr*_dp20xP?aElMmYN?(VK{Z(zD!M##Sht2oZr?!I4MOc zv@-X>YD=Vq{b*HQW`uSRQNLL(r_<@p&CToAuV1}-W!pd!z1L~L!l0yqQ$HR_T?0AQ z1St6>TA7~@Y&J06+P+Txsi0Yf53rvso;)2zCzDlezPbmkZhS9(T7G^I;HXxl7^R zB1p~FKuUfzXzRawH+t0i^~uoc3i^Da8t9Bpze(gz6Zh2ZDD3G&>(zX5(n-rk%pRLw zSLYY>hG6P8j6L`1>8bC;mdiQa!hMDNL#c>oewlWpFThUSSf>X~j=&x}@4<)nQ9Y_s z;p|L5dGF^wmTTRUm*b&x5@$NS5$18T%sUPA(3JysQbtAg&^#*#2D^WZ~2#qASzUYCY;sb-hfQEpu3`MLKYKy8BBtS^& zWICfd+??wbyG!ip&u97+y4M?`7UdL0M((Hd`C%xOZ72Q3V$MysJA#S~xE3xkN0W0l zz0Jvh3Ir23q)+2}{SFS4fOUm7GzgvkY8^kb9*4i{^)jj2a~7OmpIw8^ux2A@`y7Sw zd|cdqyN(o0L6koj3~3R0dL7TSAs+%C3ER^G+wf?p9$ZSL?=_=B*@%Ye(vwYOd5cB! z?JG#nCoYz1efm6o5}!kt^TRIMoxe|izZZv10konVW8jqXWmOoIgoycA78*%#e|?*% zWuZg^&8UT7Y(iU1RgT9T0UQ%XtLsW;!?4tUYPt4Ccl~T_gyF6vhIt0jRkRdDhNG6x zNhSzO^PJ>?3?F!o!qt<>1lnR5dd9K>*|uT9IkrD!ou$GWN+w29ai$=c^akwQEEkuT zmvE8<*vK>dCA_-5J3l|CeTfdLIfRfTR~f!u7+V!lZkaL@n6|uO+Wb_aB@kz&??1VH*PD2JaxH~R7K6cHI$OkUA^KbNUhe^vQ3tZyp=!dV*uz_9tfv4o zCi7X3)pO9B+)Y;}tJC2r;qQO{d&(Mg2OHL%C0=2{ML3PR)A8x`^k&o@uGZ^c{pvSQ zo?QID|HuF5H(&nh;{2R?v*%fFmZRb6bav-C0odW5uCXAG7b-{95Cae_91?4Q?ABn% znzKf@D@VoNsWY3+2ICm)&?Gb+uj+ zk~hBI5mQRQr39Gzwu7`rV7~_@H6;xGh7B1LA#D{RJIM31su4vv%nA=g*+0v?H9b~d z5;g4O>lwf{N0;4}ZE3$?>CjfH@jgrnj-!h}W zxzm-BDmsuA%4^XsFo{~2R1^2S)u$CZzAg4Dmi3~V7%t;W5AJZz6q?tKPF4b>EC`q$h zPxE=KitWfnlf~H=i&;1BhTJfg(L?o>J*+rL+8DU1QSc8(?gCz}cZYId3lQBCuLIYzU-=JdNPKpO8^p=p=6 zT5zX1?st2$`DEC)pjPBPgX9ck4a(FS)oHN`7hWKJ3%;P_X`w zw|}plKhpiobygb(HvJqc!O9}%?_#_}RUoKE(PR_erX-_W=yR}mR+~4r8@+2WLL|MxT zF+*|{69IFqhdXZw-8?9-n*&B?v0Tz#aoEirIU54qHb-iAnU1j4l)4vVhZw4edaHdB zFQSB#VF9D`2~gqvATC5%e4hlK(rwZhik z4`ZZ7FgX@}X*}&_qVb!Je>6x3#nu2Gfwk;n26}6-ZPT z!r5Y>)Tl+8Q>vLHVgh6lmE>;fmM#ImmgHzndMo3D+QOd+!LS&HG4tEJHIuMvs?;X1j6OI#9S&e z`CB`YD~L$XF3ll-xY-$w#;dh%cQF+s`n~?2|MKU_-Q>lKmzNip=NA`TPcEN4d;a|8 z7hk-5`Nh{?f6eXg(`V0~UOxTi+h1QkeL5Ts$-A5^&d)DciPXoJD<&wJI$!EUt@4I% zPM`%$uoO2B$I#$Us>_di<}LB`{lgH%Q1Z zu_Q$kv{pd^i7b$n9||&5C>0VlQ7grgz)`0XW=;()CI*^W9L-D!EB6tk27WrG7oWcE z)e0uF;&^MK$q5`xG$QEt^tI0eNM`on6VQN&|MsAkrGpiU2)nO}j;4gGH7GDrD$?ZmFf|3Sp zN9wM8kh^eR6gmo;`g3Yi@BP@7PgP41)lf8?DA47mB`g?u1yDx)3FP(_-9ES?sVpdg z>5zU>a!8IKKn8LFMmpF1iYfEhjbu46l@TxqQ7W>A`|;*DH1 zWGXO9jO;s-2OyW_@RLDCf7%iaJQjcIeoB3h@uy8}FDEmDc?+GbwdKH3VA{-5ulX6Z zs6p4Jhk)G2Ab@AT&3e_>fjHZemDa3iEN={i_zDqs({VRyF;TdwuD8dJj| zGLMbY^TtEl|G0Gw^N+FLi&o$;`yUxc&nTaP%|9c2O#lCTKyTRRu0x&fr+USX=Fu+q zmE2~s5<=maKz>*feI3OnU~$F zKFNO$uJCPKlE)Q0 z9R63d!m0>g!Q4j6i=1>(byBry&#z*QhSxjLE1l&uD-grvFIhcHL5OUi9Qpw9{G%@9O?}>#hS2H{ocUczP!T7_A8a% zTsFgr>&FxJi!1}1gJfOX<{{>ugKtQ;c&HD zuKJAk&BkNBLwrjf%^dySv%VB(Zg3R5$&`ly#Z-oX-sPl zAQ6Y47|oaipFMZYti+Vsj3cxn+ zyI0>|TwI=?pD*GQshgXd*=%-qclY$kldCsxne;}3;d;5ezPe)7W9m~AQf$<>YC2sp zeiQckHux9@B7O|^WXTO=Y}+f|0UcAKCqVs*NtCOpqj>;L!<2|D;+rrsA7r0z5&fd- z9Hp>(wW2C0-~<3&s?ABes^1UGCsmCG$XZ=^gpB&ir0_{1{U?yEfQ|-lL5L+3G~Idc z0kr9D>6J_-nrM+prfn^Bl0$T(ADRxplpcK7u^m+|Wr2tT=%|E@uC8jy;KE}l44pBn zYVCk|#HAh-g{APlm%gyD&HnzY>WPna9choe4CqI7L{hAD-qsp1TD9x~bL1#k6#+6| zVa!I=wU1654-lH$EuI0B$rC2MR~t#3nC1}Wf#Fpi9n6-HOqkB4^7Y?zpdd?B@(rZ5 zPnRsL=zUkLYe!tQ?C-sj4P_?^darGTO;dPiikt7h;P9|Qvxz!h2-N%P7!jTCu%5d(82Gnq%eIY$1t74 z8i7I`HS4J_9Y*NpKE5~{XA`KEW=Y0@Ab*LGiX4gI3Z?6R%YF-_g6=^!20&LawAs%Q zcMFDx3E5{y(L^J|`wMv#WLrNHRLb>A@v3j6NCStID!)`3GC?U0fjg?{9h}go^mSvA zkr!hsd*uJap(6LdElA5j3V&ZYK~RG+|gd#-oZqgp{a~3YXTLOSy^Kp_7GW>OJtxk%gPN znjBeJ-PSJOdjP%A0W@`irq59|2v^Xe0NE^0QpMaU_x@-`=2NdyW}kcpZ7J`^v*$L_ zHrpQOwhF6)3o)NB`a>NS>o&RDnJwltDak2UA@61l23=hG!vpT36pTkGON$YGEj(sn z>j-)qv{Wa@owN-*J-QmrL?0&lKmX%@y?p-i^z`(vfBow;aC38W{qE|`n>Vjtzy9IP z4{xvDUSD0md-v|`+qXYlzg;a>Po6ya_Umuy%Cb@qKBq|uj}fShEn-CIwF8mPn2_*x z_7JiY0y%=)sWlzxq}N@nmRz_*YS@8}hO_CU-|zlk|Mq|V({FzJ_19ml5a7=Iq=QxG zXXoF)etUg${hQzXc5-#sJ6WHfjmb!MIVGNhuA?wPRjT0Ki-&}wYJKCex-$aJ3PmuufId2W{_n5gC*5)Ge=`$fciYAamh4JYr z6QzD?@Z{t_|N0+`>GJC8>h-%HPF5R;XHTAu&rV6Azn!0-pPii%%JjwZ;^G2rfBNB1 zJxNc5RPD1SfNXhA(hS?-Bp&*!V0ts14cojgr=jNsxZ|z_AL?h(TvCl#R&nB zbP|n0+k#4R2RI+?RY3_@D7^uc<K5Qh!~H@iVD)8Ze79aS55Oh z#*~w0DP{|s*sthe5WZ=#f1f=i?yKgf!cX1)eK^GapA&wp`l|OFHGV%cJhtC{v;*kJ zuGj-Xy@wDgcN*_TGEK-9m76Qy0cy`wO-~ksj=ailB~n_!%8$XP>$|aeO5g^Pkor;u z?wzUfK?l$}J646^YwuY+0WD5=1D!0xEV|MV{>(|<{`mk}(eNrXk{H0vJRux2iOQiN z0}W@r($`3#k%tY(Avf#T5M}9nE1FDssRbeJNDeZ_-D&cGY&+2t&}?bY0AM<-Au}Pm zU259leuX>VHFqw!Ei9lM40mM|A^?GJ<(4Qnq@uG^$j=q+wTc zxK8eJ6CF^Sb(v>E-&FGIe#rI4bJtmj^{x(dzUWL{$=8qb5>v1I}IwSYAeTIt;Saa!tRFA;uql z;zIS4%@7rhrE!HfQrH(;PfSNGWVPNF611KiZ-vq;qQqb@>h}k=D^A8ngqahk^SZE% zTrw$aq+T?zM=@1Z4GF6YEar>lGM%JX(BYsm>hx15j}(MVzpvVr2Uz7mRB;tiHVikx zM0Kf|8OBPz=gKG*nkZ2+gVx}u&N_rT-~c+@pg9EscR3760a?p8(d5@S)(mQVDsEz* z<{GFAssJN`hQK@;MW&vt?04xwlh-_GYS8J;mn$_Ejil7>Vzw9!hk03a!8QO@sD)NE zs!!hw^OaRIIBmV&z@_Q6TTmCG1y-YjKMyi&-*96Z@&E& z;?0{k)bxCOdVY3xad!Uv*|V1~UVQoT%geK~7tf!+c=_UsFJ3->^6bgw#b`Lt0*j&a zPX?8~n*c*4Vl6$t28Kke>V9-huq8m1RgKc6ng@Yjpzo&B`EuE3l)3twlfh^>nNCi} z117C*@8sQ47!LHkWei&AM;aJD>+9?5%Ztm~o2!%6^6As3C}s>Yi%=pZ zXwIedC@jnnU0plvPvMP~*ZG$6e2a+P8sH|Zvhad_H7ZpmH3JnVf?h|Oq z-YzZ_IumNy%jD?2>AT^y_hPw#)(cfn^l|!Xw)*1b%hS<#G#t|$a4s$`r?VMjYBrlK zm&==*o9T2qnM~+=bVZooeDTd>qF0Jb-|lzUcCFY()KHb!j;Z_W_z2KyPPg{~G*KpZ z2%1renj^C{YFWCY-uSC!0)J{|iE*y)9|Uctw$N2lm6=S^S;dRGGs+8ZCCcSy87wSa zn$g0#7rXMgY87IttfUmON>DBcdtyAww3M+T3awjry$7L6$Nc2T3PCC$PEcedRh@A!u{PUcp9g>OEcqj3_b+4#0rP@}pbI{jcE2l0l@&tD2s+$`3&t3w$zctLi%kmwxyGG(1;O zu85^~S^Wq@WVS!Mt7SUXwZ}5T^Ra!XJP9m@0X032niDznO;4hxVIzYebom6d?kr@z z&cx%hYQNkg_A9!ha4so~ZOxkd3m2zS11`~o`4B)^bPAy#dSWNKIiY*#M2mFd(zk6& z5wb^{6|%~+il`&8R|!Y&*>XAmK3J}Rl@Qv`A>bB_tvp$xq2(@O@>|OCv9LXdBW3$& zM8oZ9i^fSU)x@y{TN}`b*d5e0EyGQA+#N3 zwpOB*qpTr>k3cBf0eYl4ie2fZT)*TQy-R(pr-S5#U{}#}P%f$rr6nc;50)I_ZWmM* zT0_a7>wtI%jCU{(a6eE3?U`jtdDAr@&vZg5E-@^EkcIde0qiF)lMggCmO+K*N+(jc zMD5Z$^J9flpazvtr8dQC9HPi$B>ABELyhPntZs0UkU*j`5-#F6m0XI3OiohmqI4K$ zTC9ZmO*Hv6PCkGJ`;?TRyHGlM>PT#>sR_hqW>NZmgu6l|F)@o|-ni z4pN2|NQ1Hz28|LBgzZj^t7R)ANWE+*-o-f@kB7q{8vu&Fxw-l7Z{Pj?)$ebvuK)P` zAO80GuiyXh-9P{KpH4@kySwYNvk~ej?%msW=NIRb+v%IDH{X8!?RVe*g)#Hu`E!b; zIOYb{);Ow`=M}0bV6O&MnXgEslN6~IP)NT>v>FJ1RccB^-lV4hV>?m1$dcI-!#+%r zNHtQt0sGsu#aiXJI_m}|!zZi{1lgVT_96-c#`BOSwSRtrm z#xx$0Z3QxEt1?}${4v;tS|N;T0YxcHDC}_)ME%TBOo&x1c$zDm5*i}a8YGeE#A(M?ENB7> zgprv-MT@Byq^LQdvrHzMXpu>^$(0gJ5MqK&!o$qy!I!I>Q08r}REwYS0dy0p#_{$a zZI98gD&}pVyG7lpRSn8YXD>S%ooX*gbt@ZXb)cQMrh%vdt@>A4EI;UL4*<*42uzHl zCs_p{`zvNX=E*9fLUrp3?rtd(aB($efp)&Mv>_!w8ay?nNFdwaiX`;e;HPf?J|uHL z8cE$}k7VwnAr;d=Gd1_06#u+o`yUUV;{kM{J`2Q>Q!QqOHw{coDW-jfZqb)na>JKf9k8*M3oqLo(x8o0wR^`I63nH5J}a8}F3dczH>&afh@ z1WDqqJ5C2=YP1!qbcPa-h5Cd@yAb%;Vte2-SXTNnCM8N2@`kilwwYrnqq6te3|SS1 zI4_|RqpqP|9R3rRIibnf$;hSjwB~lfk$}#Q0DD;!#1?#gX^ZK!Y76F@kgeJs9cJ6OuZ;#bQ1l4p2i9^_5g) zAp~1a)tBrv7(RNYdwccKQsvfm;Vzc2D8CM;R+Y}-d_JR6=Vxc@ll7a|Z+`QeUsKP; zaz5zwH8`d-R^he2V6+JZde1Um7>$N_W68Q|p)bFcyn@zuS!s^L-<*zM7 z_6?e;WJD#dF;LkR4|z+br|QOvBKs7mVD=C3o|ZT7-u~ww|M1tV?^cWTmtTMN55M~D z%NNi8_kZ~>|McsB_~wf*8JefV{?*lM4A+@B?pdxb&dw)y(^prozIyTXa<-T)CNE#S zTyHdCu)APRz|nGVxLR4%40;aRm-{5kudQ(#33?_Q4h%R!Bd;w@lB|LDw9jkECmjcZ z4ktHO)|lXm&%qPTrKFh5Dc3fa;XSw~xzymgFJZp zCttq!lBR)}+)eygw9i#&-_d9^Uo2j|el;2lFV4@Wv)S$K?KfY1HJ{JXu+*;_Zs1&A zUgjO3CQR)y)M!=FTf^j?%HSPrZ9E$L{F6#7$}&y=@yEB-Sgqax?H}Y+zLb%_rt>6k zNFw+~y$GkIj!+{3rKE|)P{~Eqa1py=l{Wu57?!s}jh@1C(bdQXiV2!XBP#in61j>{ zxg6z>!u_yVRhQNS=<2U}4uV_dW!Q?Gw3SH}N`K%x$sxMY4^0Qi2hft+gDO|*%zsx0 z&>xDUt1L9Ea^K_jCFbd!18C+L&okygWE#|>_Z&bIy0bYnvW&Fs$|E)$a8J5sZue3p zGa`xk&O+?3AelLIiO1 znd|ozb$s8`+dl>J>Hs1va@8VJg`?}*4m4YNMrb#wD!d=m_|bQtj}EoP?hRqwOX#k? z6-lUp(x27|Xw5_conCCS>(-)q5v0^!yh^o-?ng4Kft1`pXiIg3_V_ZLVGX9~mQJMx z(K)3Vre&INt|nZxQPL?}3<~tK;hxXu)9Ex^Rzh!jMl5A(ASxuFJW+wcpyz9-Z}ume zYcv`(ukm;o16=oPxYi-c2?s)YX9;jBl8UII1Y6?jm~Nsw2pxgYnJ^4cNBD%p;mFNi z4aSxsS(b87iAEUJf}CpNaNro{@e`~E;;4eMOM!e*L_wIJwACa{lx1Z)GPS^|prr3X zh|wsiT|~VvU#n(y?W$v|?^eCnsU?u9X)wn~tX;t8-W6^0`D`+ooL`*1dGn^%?{4BD zO@^C(2Xo2D(loVPE@rbC1Rs*IB9rk9-ie5W^G(0Mkim^3o`!Yhrhmi z_l`~leLg;a^5hA^Z{NJ3MPI%CVR*`{domd75smTr+1=e8jqBoS6;Zpip|UN3Xhvc^ z8VdiX4iCB=KfW#FYc|xPHI%9MOYQ@u6Xv`o%zPw7ja&7%H&zoi^1bzKiZ!>Nt>Y_a zd2bP)9`BtHexktDHE-|lC!Y)|z20Ytr<+!xW?>nP-u(V9?ONx$hZ}@gBsEub;@(g9 zxAE~*{sK`5CmG=E@Y8y<2g=ZP|B@n~J$|wO7yLcrm;Q417+wUi!N^n!U~dc zna{`^wPP2H1tCm_x+@G!zZUd2O=I-KI^ zR@;^bV;9bL2&yuCnMEl{AxSnK!*E430fq$QArM9X2#89z6m5PJ)VS$luG}FApw$P| z7lYl%u^+hz-SVra$kQ>1H6W5yXBj^_lyZhn(GF~R(R?K&At9Algj$WD2ZP~cGQGQ-Tt0b1 zfp6cwd-nVVZAUwj8NKWL;*55l&L+#1dfIZuU}5%QE$%Lt-QM7AzSz8a`>uO3{QmnN{~RMJDz)s)C=0R~5qXiZXAKrw`5WR4xWEp>%fe zvsFeGj|7x-*J4B@nwWMMAw3$@A*_pdWK(15hywABx}<&b+aKz+{>$|eYx@K30AnWAJgb(HtJKo~nn0SA!fe%@=7|Wt5+^DG8u^N({4xm1;n8y}TFJzOdn9x*$LakpRAGzs}gzN*E($$n=R%(HI zmbx7L=t0#Lu+^@L{Fds37t%0PFI8U>;ZUC@kt_JRWec%XRv;86RQel8?hIjQMT?9S zRq26XLW@xor80)2;bc`fpW)BC42?`kOOraj7(2!QtJUX15UR0i6CY-6=xQ45(SkNk z_0oV1I@*-(5V52uqsk$E33DPO$TFyM6v9t-OPCU3v!NTA9kA%x%gTq}sjQq4#!_@R zCRQGZprcR-`3oYn2c(UFdWkv;kxd1Lf8T$#V{2Z(Rsq$nu0faUyTi0AN=|WwCw7d) z!x23abnVpg6?AW9odllQ)B=#>nb{{T3zQ5#>t{1o}@Vf&3^%`Wqn6E(eFm|6hD{5k9{Z6v z+Ro1mwqNaC!Te(pYU~QBw6_7BC74DM$W#-1{prU&cG|ZtS>}Zm1#;g) zeM1U4IB|L#r__4f8!Q$J&s0=|?0zJZ(Y9F3`vXQ?yn&Z&p*hhK6e3IZQgz$ifagGq zL4F`~T36pcVT<9egRdqrvQT#Fwn1`Sa(r$eTBBFD@?VSN&d> z&W#Opd-|E^$fdgN!jI=O%Am0vNj$>{WE(PjWxYKek8ZBtF$B-f$9I#v*>pM@4aeiLKHZ5E@J@HI zT5WEpvw!=K|M>px+uq6WSHJ%4(>^ zN^)_7AIUyp2%0RS36!X#siv#=?@;FxqBJ}3*B?8RQ;K{((Exc|1w;Krpr&~z zhOVtZN$;RwlRr`WL9yo-7n8~K`sU`@^DpQFv&HJ|n|I%Q^(&^to4f0a^Gjy1?_T}w z+poW7Ze-eCt@PefX1n=v$>e)GolvFIvvWBbGRmE$gn=4h;PV`Q^XfO34DNM+;3v)CR2H63G`5%Z%tN#QFI*kUP za-uBH_A(%)RPr^qL&`j-7JS2!h?odTxm33Y=I}p45YUVgGLc^`5 zRQ^&IFViGgKCq=LzKu~7VLuH6B1y>EO%NKHxz%_WQ0`2}XWc=qv4HIU`0i8zJ*}$D zZz3f(vF(8w7LHIeElsD7!00`U#PvqsKuuTl)v8j_Z=*AjM{NunI)45q1VUd$IAa5P zP$SZnML&sc10qf;6Q;A`UBXCGul8LPIcM|PU@&6dqjxDW?BS161EK6F949Z6_8_O) z40?#OJSvW@?N12!Fi{5}9N&VJ{G;L!Gi+@WDY;TY*E0Rs^N-QgcC7w=@}I{3CeYuC zoJxopncjzE?Z02!;rQhM`n^yy@JCgz3WIJtfaXqB_iwRbRW`&TdjA2mVi6vM{Vjmz z2XTgtDHj_!I*eeItV&m<;$zWBQzMfClq;&Hx-a9ce`MUGn=Zms)7;&aDK-ku!a8g| zkQN2nRAhOJ5zREEsEF!@Kg@y;Pt2^DyCbqdfN*<~aW#-32$PS90lo;6&d? z)tQ$oLVBuEM(9t3b`@R9O*J|M7Nv;f2Ce?;Ki-ryp_Jng@{Mg=m`yvnu6C~z%AWAy zINr|B5o(O+QGn=nMmQLy8=#ZB)!$&C)5+Vg5Z}RGf9~0!BOg%5w(+}wv%}o0KFu@r z3(Yl7_$ieO<$)G8)$8z};UJ@PS{*ti$BNV=$U3}^Ok(O!5EV4Uf4tokg> zbCO57XbBRJj4I1>jvo9Jt#j5j{|Og*nRKF;i-peMs6ad>WBpW3L^mECjawbvdZaL( zrU@fdVz?9<*nWiIxGL02~Pp-Rb~( zq#uO~rn*;|bG}^bDOc4EzGTqsn!1QcNfnP&du9igPmx_T*`aQ)AF`{85(S8C6@WHp zw}4oo&@L#PFPHs+9$yVw3f8!T;1tJzv^~unc~Bddsut z&zGysY&QGD_kVivlUb+NADy1fmz&9SHW;4{ zhod3$gItDZ*Nf$hZ7_XszML_;Pp30VnNFw7Z-9PycXLa3rHkh6mO3XxgGGT^vBlWE zKsNiKSC{P87ua@zhIXPNam0L*=L~v##sl-Svr-fvI5R4*T zN46GhX*z45QkX0NQSO#s6e^V3?n9;3e*y&^9xz;4v7}iBq=b+siqlF1Op<9EDPT#B zxFABO$}$JIV6zld8eFd&%|sK@(w2$_E3taRt;Szy{!$k;`mRfzYE*n1qbPfs(2$i2 zIlBo$BQv)e4?{NT_^dnFm;EEvK0JyZSiu%X==0xBk6DNOt1szOU+B zf;H%yUd5Fm*&W0lPR^Ga>tVqPJ>fJJwek1%AQ%cEteE6u^@qv_(Bu|h%M^CBbeMy2 zoP5)pz@`#9nkN?X&3q(0uJ&K>p`hI}a>qCpW&bf@RiU-L<@fPF3{7pv>Oa=bhqeD$ zPHu^L=1fJs1z;hH4}<5j9SOBo_vK)B&`!SW@|; zIJB~iITqnZ;=w!-VX`v-#|O|lXHmW4rf9X2B$cobNz~5OluZ0cIyAYgGy5b$EzBub z$m1o*;sBZjUSHTGNjXC@i&ZjWQi`1%1tFu1*%DG+Xio>hf)oba7DUPJ+5w_uQ2|w< zFiC}o(&KCR{#`O9N{>B|B8fr1$j!E3dHCAETHH4g*IVdNED3 zT zB?S81h{RK+6;0rby?B&RzzDs|B8nthxDePILi6CyuoBZ2w&_i#qxVB%y9dy?$w?@* z3S_`+zVjo53afKi03pffOGG2w=|2`Qk?BfOAjQl&D&abUoi*eTSih78$I+}MxQ*6*DQIfSG~n6NRRUb=#?~rDEb>GUj&uB$1Y?$QR)@$bafU zVfIfA>P2xxetmO8ON~ZjY`(g>IzKwiNJYTvwhJ073nhqJRYm9p0BKBm*@a;5%* zc`*#Nagx*MKe3NG>2?+9Hj=}kvy#>sL1zMjtJXqeCEPoF-ekCAkHqu(K< zd(hwF)4nAFbhE{LPB+-M-vDKmO{+2{ih5-_6G=E=x~Xa}^Z{Z009pfCcIpbiPPPz< zArq`L4W{`Jj>Qtp2#KH)5KdH}7QN>HI!i)lqMrSI*tdU3DE5u6tXL{S2Bd_l1wF%< z4nld!Hy|eE=Qf zJxYiqA!j#1Xk_MA<6+1q9iMdvvU0a}W%GSJP*u}Lafxcf-lB^hSV59jrrm|C?$KwX zLNvjO89LQP-$$a3qJsdWXd5Rg`0>TKv^N7v4Ir-q0;U~OAOxfWHMk&t7{GSV1SKe^ zY_*}E9>64-e)4W6L#~rDr`RvJ)UcS<3zWe;=%HA3i`~4f`}al>NtIUwvyuzt@r<%YN>K z+n<1@>|8f!LnfMaFpkb}Bp%yCG=cp<^>bm+`wpO4OW3eF7h<%cXKi4~P~i3^^!?0z zW9DEylqYOVvNHfjj|;`exlxNafUfRL0LWzlXzvLql+ZN$2KaIR6Gn!XxET<=Z9M4=<#N7SP!y#@dTnMj}3Y@BSNd+fub-`gL+2~1XZOViju|9`4t>hp$)VvZ7tm6C28ago&sVOqhba3};m!34F0h^27u|Z}<=OoC{ zc-~PQUood@1od{FO;(|VjK_X|NEqXr31g7M;c#TaoO}fb=!}fedGpol>e;<+M>2#e zfS67v(&UeQ(OuSYFQcd|m!%kV!t{{uc9<+YO$OTheJKcnKd{J%;Oatsd1yS*h}ct5JXfHy?TXcwH=UGOqFn!GE7Tk z9hK?^NYE9f?S$%*8n$X6O@Gkh??7fpe)Uwu^a_sANGpmOqNfAsVfz6zx?OR?hCpcD#;RxB^{sEpRfk+vm@o-`w0_!poO0zx&~@y-sg@din0^W;&Z|D)05_AF{L8 znM|k5my7^rzuutJA9R>d=|XryCoG*F+heSusqx3NXV2+l5YyYqd^TqkEanR|ot>TQ zL_6lY+C@czP>rIpq6L!Fh6$Mt_e+A%FrC8^a7rb+NKYh0(<}bK2hi1@8Y1HsnWHi) zflL@pKfrYKa4-tuZ<(>6qaBQ}g(R0N15!dIpJzhCNDacN4a1yW9W#i?W%-n(NLEo~ zuhq0ns)3|ts{2WWBok1pg>De5uwJgXT?7MLy5idyMd>iEMb-jxb`yj~W^Oee29!I~ z@mX6?DtQov8T+*D`hSa*+(gj>Dr43-ly`WSLe&AU;MN#`mQnyC)E`rDOuc=ZiVhBU=Uc5$&!O z+RjwgkvJ}wOxlH+)Hl}}B6BS8cz9gxKOXk^Z681Pw;EFNC&#fx+u9PDnFR>xQJF3Y zP|^>DkJov>hR3$QiGBS9B#8p=9lvF&X*ZA|r4OL9|r6`%zfY%QTY2On zQ>9jgb3cY|fmo;zh?>Up&}65eh{gjrm4HDso=r?!4W|Mm*;ZN!8noSr4M(o2nW4j# z!ZOIX=a-?$&Y%TS!&Qn#DRh%QRe(Mah(>AZLPXzt03A76kdj*vNsVnBSyV@z&m_-O zlE>?VJ|hYlTdWLl&ua8jYRIErfCZ- zQVv48&^DwWDl|v`7*Me(kI`qHw%Q?S`U7NSN(RXta)<|rNlRV9IM zA=Gw(rWtWB3G^opm`)apWnWJLa~DgrGh65t98t?{UKhdts^Q!pbmpsy$CrovVgYV& z;q#ZI#Bn_$Kx@#B)Dan5fO0LJ9X(7s9F3;a>BWU!+Ix3*_w3m-dYgp8D)g?xm|!Gr zCP?&`5*Q#3?JM*!SVFLlRx93(`T0#7j&ev zv$H2pp7aO($z=NW&D%J&WFU3*;+;*L^qu%S3h^fBUT?KrP3~r=r{n%$aI#rP@7XX$ z5yu9s3?EWKd@CEGqA;QWWI>z0ni>&=MJCLFPG`SoCRj?`|1CC{y(6m%(DAD9ZX=-a)Yp>@Om^p86rubky8r|OBqKD~ZJRTELuKMlfWHcJV*KEktH_$J8xB3TA zM4}41-3tL!fihPudJu{ypq-VDs!2>%>I%S?ArM4j>;x-{^NeR9izNi3*^H6J!UA~{ zWjaq%l}wf=6=XhuR+fr3@g77Kc0iFiuljNVyx_Zt5KIuEcp$Mv$UJm89_%eF=@A7H zI#m`Cb7CJHrKfTeT*1sKlWHKTHC1LMC5j?Ll&&kL<^+zaBqdU(ubgTEXLT^27&Y^% zN0ovj8d+9hwQBrP-T*TjQxkw~0zf;9lmslSJJ!gHqr|Ox3#8Z0+B=}dHxY9JaUVdV zA6@9t`lS4ll)!%ftMqnk>rx_RYvP`zBuWR_jC<_ahfweUNa{WtB(n}i)5+$i$fLof zd_0o6gF%+oew9_3unhD=%|FPuBBz?jaB34Nxq*F2pML(lAN$HZ*8UU;lmgHXg8SY9 zoq=4U039pl$pf#)MyY`>B|R+%(0J$pE~#%Ye`1%K zptxu#TBpW*-&M62ZJOo>qvDrgKt%_mez~JHE~9w%*@#Y+Kv~MID>_>mYdcqEPXoyn zWF}V;qN?ENheg-A1M>(nD2n1->EU2Bi1$&%{=T~U`kl1C!o2%WC&=UuFDWmB3iBe$ z81s|P+TtskZYj8@P=Qp!VzN&44J*=};WpfCe8k|}OHbGGK)6R4ohyf^j5$qoT$Qgn zo8@vAg;sg=I4263Oja1>?1OSu7XJr4FE}V$@Tq5Lrq2BZN%VsZfzgkCISDaYST8 z^qh83XQ$hqVTMyPfsr|pCI<^*^BXbbaQphaOm|^ zH1Kk-8nIIALAI0EKfGD0I(KL17kvi4$_b~dxae4{%JOi0??4_*L?l&&I7wcPsPa~H zybC)XhYoF0m@cOU)4DvTuZiSnqP7Gtj9RF;6df8IPEAq7SQ$95#V4NhS!lbk*8invg46iOK!J47Wgg?QnKu*GqMf1;pwg z&jadAC!q{`yi#VX6h}Uiq&ZUWJ%A3fiELGAp7f->S@M7hgH#Drd_&zkuFAeL+IA&u zsU2FLOmJnzl7%uLC4{`hD zNAXFXfYw&3>cacMLYc9OW9+#NmoUGq}umfF+x>V?b=r^>;}Y(CgYZ?M~w03 z186w#)ExRz{rH=O^?fyO6nAE1va(gv#!U}TY(uXJTTASmP^C2mJ6%Gkj52Bt}@ln!uY}TV_m943rP5J zaO8O0XaBLl*NNJNy3kR0Ap1*uG)q-TtOnj|zX^+lrgl~P_T|((cHwMM0DE3w|D;t0d~D5AKd*eAJPW+rb*o2;B+w3tnv2PxRi;(7EAWfQwNO zBQFiTm44bqW6h%}r-CG~@{0t3jy??{2zZ=kII2R?8lNG>NY>Ad4f9=N3R-a)l4%6Gx4b4*$2n3rdj!Fm+f0dR;D>)=@onTWA9zzO^3^jhup0Q$hnyH4=aq(WbLDW{@Wk_?GNBjfAF{~1&oqzV#9X6 z-$TiN`G^1Vv$OepetLS!JvRP%`}XZZIQvFfuMLo}ZmvPVVM6*LTRA zpI@>gWvuu6LuBUjWnXV@7<}=?SGS8vD!SL#NbB`=)sD6N9 z)9J>1M2LA^9hXAKEl3sWy~7daOQI>%WTEV2BgA;~nK%f6j!$qiVmc{k3DtRmW=M;( z2O3&|6sOev;|oNyya!3Nf#?XfWOIIY$<#y-`R2=SUVix{?FIMGfBiGWpZ@%(zkt8} z<@)*>!%&Fi^Ow))Xv~mLo?LwWbSobUYr@6PWbS$qf1W^=tYbHt3_Qy&gIat|OqtLNw|2_TT^F*yupCNE*hCQ6aB=Prwn0vO94+xh$SbvMo-qOQeN)t)w z7+4_$6>(YSfJom8G-2}q0?C41B)LYHW+t@XvT_!Lb$Wxmx;viZl=n(t?!y*&~@7a7~Sr+`y03{~roJmi;cJiIjXWek}Xb z6VT<@@K8zpC6E$g%#@NpMcDqbQu{bYZh>IREsioF$4O04$ct8~HRl+h2Zg>8C_=Z(ab(I>^&S!~0LZcrVzHgPC>b(cz;cBw$#0&E&CCpgs#gZ#MmbhMXAGI0`N93iA(8H|} znK2-4%cKd6VSvRQs=4>LJpl=d!$N2*S#K~>UyjBl z7O3G6oh8CKSeFKP#guY9!VN#6?gQf)5IQrJw9F$R+whYBZZS-oc_cI_TZlO*64`GFw&KK$N5D08#)MNXUyG{fmm{MNp&^byf zLmOop+v3C)f&hU?RHYQsucAQpt6+vse>yD=E1yPI94Lv2bC}F9l@OB{edvUb1caW6 zRJl>pE_qQwPhLjz$QSyGy;9{b238#XF2b^q!S zNTkFFJB-lrc(hn>E3z65`)HWYXG?#nLI=~b5aY4Orjis3gsK~*%MbJUoGIIjMQ~ID zLuM+JSSFOM0!%nYVg<}kk=0MF&t9{jbESHj_HfBu9ijxeVLM!b=aKgR|_6hB|c(NqUPsK+i{p zGQwkWnzZ=8q=X<_;8cM9LROaoGA&>xM*v*{druCK16 z%Bp&dZ#qe8o7&})4mK(x9veNwH81EOu?IGA=)6RH)tg2pZ# zWQ%|kZM5m=L2Smn(gylD%5|4MzZ#6kMx*=mX?gu9k$e`OF;L zhL^&5n4(z;5>xfQ5t)IhcCC`AX?l)65bjq8Fw6v50BpI3VX<8G^>{LbzP*R4KYsUz zFP^-KN7q{0pOpthdKAV5@ zz@-VV_q2A>Z^Obr?Tyz#i<5I7Q znNaDWj7Gsax)vcU)P!9z{ue?i-Pkpu&neIw=b{sZ{_(R+1c3G|EY}%R82kDX|l^20}~G{`3TBG(@^k zY6!_KDyILoAdA^T6J-W7KMdKW87R*MeLT?9s>)1NB#?=HXtPE<+9<45TQLqa->Z)i zO2BGUUiP*p-SK!#m4W$~VGn4NR+&+To?c3hL+^`%L{F5U1U)6K{Qzpr2Z!~SmgjP7MQ0iFO99K*st{_D9wQ}u5Kxtld(w8fN;*qZFC@6;>8k96dJ{7UMH4v zWugr>CfON)qh)~&C`ANA*{P@&SA7R^JN!(z^r)J1xi~qhqg?6h$;nG`Lgc-gDnJoZ zphC4z-ROqU$eICBXfty`(pG^aLMien(s!cuWqwGKs=BbN))(Hb2g2cUnSPqT#>X)1 z#B7mjf@DksAuM!y{b7zKCHF$*Ri43ssDV3Ads&fm4D5{RNGO9SCE*yH=>ur|q(*Uz zKN^m<|B)f@w85$BOaVtf06Uw@=y-Io=w@zt7i7vEIBk4uaL;T)UA9OHZ9>6}VVJ@M z1kjmjM}g@AKE5Jw(l%r&K;B`&*C#;Pslmh&k3k*A2|CdhqCgF<^=9eEke7O@ZnjwH zL1?;VKtj|d1~Ph81?f5E$pOPTNox8YolV! z4NR&;nN_0Plhta8k2ikQn!G3a-XiuGu49GF+_vLC zJ}`87?R6X@e#8AaSZ?@frgL+1Ll;8Za5%iUxE%C* zlgWhQ2L0h;G1rT>dwLl5?r!qz#q;@WLESnh{pETyoh|?KkAIxamM_2f>h^lFSgxnj z8P{aW&HMcN=JxH|ck}7|c5?Ub`s(WX`s(`j-Szd&_084I)z!_-+Zzmlx_)>4_TAOh zyQ_C^eZ5l%=dGCAkn37G-@Qw@Pg=+h z*LrRmpY-EL2?xy1^b%U3gj^KEpO&)65H&mi<=6twWl4i*qW1SB=c)lyx_z|^li2zB zxsQoE>kb}#^7QHH=_xbW`Q^oTZ@wE3#)yqZ!@s@xbHCetc6m7-jTZCeVm=>@MlYT| z$6GI-y+GgT==AFP=J~Ui^V#y^;^}ZSU@FG|G>cekb9Hxj7w=U{!;sPm=?{c-WQ3_Z zNzN6PrV5q>Nf6rER+8ptx)ltPL7FbPf|~yK7T1=XczA}f#-P;m zMVdpHUObId9t*K<{Jv3a+fs4nn@)YK4N15jT3%7gQ4lS~3@{ur$;Bj~=>R!RBW^xh zq{kY#+tSamk})(yDA^3NKN=Kd!!qd7QSRpjH(3)Y`C!ztIC_tseMv``9DU$^P*z4_ zJsyr+0pbj%1-1T@xCi^w(R<_{3X~wT8c4}4co>uR6>)FT4}cFS*GV;jWA)S~lZ<=H zZAE7|{yLF|LC1~9z+YK?JREC}9ap+(AID(H@YoYG4iuc~AGPBKlW4cA4fJN+=?~(8 zqaOF4dTP}gSnAkw6Ai>OP_Z|O+l`er<$FG~*@Kp?Tfm1hnkiO#M3-ex?~bU>O?-&i zQrQMFxrzAde-g{-!&d z&HWu=+<@>VzRW(G&A2`1-bS^6=lQPF)6WjY{tr+x?j;E#oSz=P?e1*%f(`*vQxX%i>q#d>eyG733MZv4Up1?ybGAg3FSf;9R?pJAc4Fj01^qPyH zxvZR$2>~}pt~&@q-oR9f9t=jLU(oL!xhvg z8c2L65h92l_}qo1e3*(?15Pc8R`|9pMFLU;Cq4?PC4t(0pcH_%Z@r4qUgAW0%0;8A z!@0ldMHVb*?{2Qwt4)76ph9oozW&vhFIk;JTFCn8D`mw|esOWJT+LC0m*}Vx?&^ov zSkB@!HnP$Cln|+5Luqgcxh{|eO39@@SkYsoZ{EE5)vta->EC_#-LHQ2D}5fq8W%tK zhGm_8vZM*LVJE9Fc=6)JWHNz6u71BfKHI{E*PtCzw>Mv`{_j8j-~au;{dd|34RoHn zySrhpuQxfY7U$>ZqmiBsXPGC7362F$-F~zB{`>ErKYvP1HyxJXd4D*bEf)XZ|M~yZ zFGrm8b>er@`Nv=Xy4UNfQUjfA;^Fi0DeDv(WI;5ieMMtxOzUP}DcOObq<4{9HuX{= z^5dLtuY+^2oa#_oIx=2)EntEpGkt(*meHUOwqpo);}~KvIve%%Zsg8tIcE>lY~^Hs zj2F}r0-|Zh)#w;b&B&?l&-Y-*51o_c`eb~1etUC8b#8BONu_~km)@XHHBZkj2uYeP z7iXszH&?H}{PJ?Wn)f?B8fZ8eC=%|B0V}NI`o85G@ttnwWA1xb18^zi--Z=9FCTB zb(&bR2<=vlsG;6iRotaOZ;RW-UVd0rCTe{Qd#H(b<^avHW!5(dh(@sjYBMeQs+ocj zgf$n3@-R&(i(=L0Kfau#SG^#n-@bC_z6|6&#`*b_=88^WGr40u7cK@Kx8VwEdyb4NBvGgbmb%%uRGqg#Nste7{ zZjyFq7G+;gEbiTq4ol((kk|wuKAr2kL1*WeaNOTqm+D^c!_erH0n8w5_7JRh^b@1< zUL9py9D*Om`u*5fub&F`*>C=KC{@JgR^Pq-s_6Oq@KbNQ2L}$>=eJ}1yidN@>mT<7 z^!uA}7oM3P5Bt>L-T${PZN zDp&0zediV_D3QnDv!8Q8dL~RtSeJEVk9O(ND?VZk){Zo8BEx1v>vYu0p}q5#1z|(p zh+780)ag+`WFVVII)wSof(EO~V$MtMrIfRg3A3VFrbTU$qkEr#c8N{k0YbJ-h=e=_ zXydZ;srW}BY)JP3b#y!G$Hv zh;pmd)>RNqB74^POqY4UYDZmxT0u3GsZGg}v#HiQe2D9r2^WjG&Vy84fuu73 zVyOdG_+fTpCb0;`4?j3s=B_w9s4=6(x2jA7&A}C?#Qit$mdD!=G?@}YbIKFFg8uDD zuivLH-rU^WO(r^m@AYpdH>vBAOz;58DsYe=!=UB(x7QaNrrP$u?_fWbvz!E>+0$X4!7tim)bV8a$#Z+ z#=O3I{l&8{&f^`>R8}v84*iR{-hqzh^Ye3t7e+4i5&Y`zZi12hLH|#G`OD>#i@BaT z?c=5&-n_fLnST4tZ{FNo|MoY(yS}CTS@$jhMC!~`yj`Tuk_8PtZpxg7$ zn`%Jm^C~X&;C^o~&|9Sy5;La?iR#o-AEir|)C@8`=utQ3t$w#R!bigqMqZqqUtU~3 zefsptlV^lapFZQye##F;chl)&zP#4c(|26*irasQtLdm_$7e_LaL2`|V6bfh~*4mRQ{XrG2Ib zV^upZelQvGgo*@qRPI?JZBH|->N@jiKG`%RY|bfmS7Ko209|ogOSwtF4I+N{B|dJq__H7|K9e zqC%&{Vu3trEbXhY_$~u|d3VcFo9!pbv}E?e!sTWQj+kDyBd?-UlDCsPaqes7jLoSZH9cYMfol8k& zHPEhee_6qAY_pJ8^_vIKRpZrgNL@Z99?Bm1ybVr`J|Z}JJZep;KIvgqsr3j|aekXs zPupm$(%e#Bp`>{U44N1_D57KQQj%J{gfoFa(?==#;~4OmMcbV{RB zZA_FW7fX$@>_8yh@n&b}s4V~Wp-!9^bE_Xc4sl=Ah_k%a$Yz`q-yoOj;KHm(rRue$ zQ8mTG&q1KFvMpJdLQ?eI%!)5svr)>MvjcmEzYG&*AeDPU^JyuaFXsL}MmBsy_W`uih}v?OTWH&Rz*<_^irp&Ig|{4PpGLt+UyttM$VEKB=w!hpS%43q ziO`ghH6`T`K9h3DDvE0&9#;r$qZM<9?~mU?KWszMSW-=!nb1_|3$>ki-iHhfH+|%} zCNz>)V^&mqo}Bat@q~LEb5Ccp$!x0E+V*;9qhTo9DHocEY8rMDvc~BET2ErBGr1RH zK^#qK$ZH9KO6BIDQJn)omgWKU&CN~i6&%o#^lZ?$$U=QFm|l$%9~4%@rv+jD4k#d0 z_fEQf{6+MOmoIVkYBk3LD`mdXVdBY>#x4Ky}esbCoi5o>G!&H%t4<4%U^wDrP{IS!V0w?g{OM4 zvEY9+?26`>jcU_Ghj4^3k|Ef;5$Q(lG^(|qP^gzfGbLzapc9U6zq46VD3aRk1)*~B zSSp=mw5JKAFC#Y>=Vxc9I@}))`oqz9G(P3RBV2>g2+rMPs%;34=vMEcW?t?0mwr_} z*0^K4R=!+PaTy{SS7eEr6c=FpzWVX} z7W2!Cv&C!@)^!;h3%#Vf6W@y)%@?biyF092ZC3BD-Yqp_$NSK=EDUH+B-QY%6(j5P z?3~ue8o6RLhCoQnUZ4I+FGYV?7e+E7Jp4^KAqcMKctNts%#fpEn@8WnLPC!Yr>f|H zqkz_CP{f3v=5V}$eNnU*4j@~ckN?uIq#%U+5vfhC=+Nf4au#sj6xl_209_(yDO2y! zvlk8BtZszpK^wa9n3#@4dK6(s;*#hF*?L1j+ncdZh`VcFcKu|k|n3kUE^DSdXiIn`az++VBp>&3` zTac0)xF_jHfvs&KCEtrA8c3{Pum{Oa4W#6Q!Itmmc>taK(LhQr&}8m%SR<bM2^DB0#%MWY+)0=ooH^eoTYgHEjP8n zxjr6A-A5y-dt~4oBgKz~Gb;3`a(_!*S8!{J8HBz=pNiZCZ4_DS;MSN>W$5fhpb_ap ze#ET6e7S@pHh+-9D2kJH0dL=dbnbv?`xP}%=u1OI-@#`RP&Ra85}||w$(=e0)X7&2 zt5tEANB>7c*^#n*XqFPP!RhM-?r`FaDDKRoAmmThDpwPZT!Mq`Egc%`2|Ka|Ur$12 zy2;V=l=>f8V}JmgPlzgN7q;o=I=SDN&1W{dvPAMx7jX(&+8|&I2BXla@23yrYoVc# z8ezY3MM#j~qta4sjo62pz&`m+b;FDS)O)p}i_CQ^CARovbWV)KJM-cl(9HwrlqH%b zQq;>#G?8UMrpvsBqh=+#K(M#40S2i=39+2$PEz`-R9hImS5Gg~I|m~@_DVpr592%$ zfm&H!0y2}legZm%Rb&8qgkQztF_)4Sj%`p^n;~O%>tZ-cZx6*MlgZ@ClcxyZ+}vE~ z324=Vb|j?oR6I_=TcD?jM|u=%Hk+NDox!=gyQ7Dfg_ejeyaUx!_UPlU#d7}Y^{eq< zbbfx`>*_duJk(RP!+~DKFr7|sZ*N!2Wq&x3pX0msZ{EC~Gkm(;$#gn89rybE*rga&r~!h_)kUAANnsMk zqNn3#LVaeE_@246E~*9y&<)g2q)53OsvS|t)@;nFuu*_q!KQp7aNUKfU_% z%NJj)JL~0YIgQ_9rD}94_b&P;6^BW`gh^$I&h-nQsw|vbKO31tQVAW+{2Br5hs}O;dz*tLEMdvjIxoz1+mV%dHehua~Q>Am;wNmLpOA_6Y zO8e)wE>YL!eYFc=3INb(P&^Qt6Qaz7#8Q3Rk(Fd?fjJo^#{!2VWqUNFVj4)vyD;AZ zH8k&B5Y+!@9nG=2ql`H??O>BO$w(l!bg==**fF9-e}eTiLbrIp_f|=tw&<|v2GOR- z#f~n74?lob*5lCLgFL}PB)#DZqI+w*2cfJ5DY=1^+(1fh;GU!(1-ABZq->9dR7?XY zxq*~?FjBS#s@+IJlK$};D;3{BN^T$}H;|G8wdmg!YLmkUBb?fTl-z*th<0Y7`!oE4 zjM8s*BS`TE?n(M+uzG1NNwF=sYe;+F*hhV=0a=542yoOWIb~8USCBiFB&MD^()zu% zGaf23h$X6eV${p0`Ov;?i)^vU=nlG_?Js&k_?`el&^>aRPaTR^DReaRGjfs%Bi(8| z94OcDjGvK`4~A`Sg#}8rnF-3WO8(yo?3N}{@b zPPB?k&v~)SEv^KW)uqtxVAvZB^v!h_ooj6(fWp1ka;cZvuem?oD4AU@O~nZrgNN78Q}T@hUxiKqXJb*d!WCqBtEHX%37l!IA(y)QAb8-y2dv zeVtxk&>#A8w7lZ<87Cw;U9>Vk1_vsX(QQb{0cu%Pbc=m_wP+AEJvFqZ(tL?3TqlFt%BtI0L`^GW zfy`g&g`+z1cV7fFCu4!)?(XjBHm9ejoqq4;=0>^#$RsKd9Y4_}wg!_PAc}HxN}$1~ zOCJU_WWsQ?1WcB`)@yb*nNOx#6_=}%)p|8wz#R7aPQ4$swxE>p=!}u_```cm?c29@ zer8?0@yu7vFsI)!Es2zL@%#|Ni>dzy9#U5BT=YyLZFkaC|z%+vvHyy?yuY z9Ry?W$=Q?1WHKD}pPrsyy?e7>%t!s+$!f{uH5~K@JvI;a-@3C|bx+pi6|=)Vp=DB- z^)R;8DRRhAUopom2;EtfUB_vZSY4)3wUM^Xa)B{q8S3+_&7hBw>Q`=kLVr3KpAxFy zMT!QBr!4#iG|10Z$w#+$K%CfL5sYb zs73tN=E-DwbA30tn=$7NN9Wz%h-%#2-Cp17M;c%K@co;2uist2efs3-AAk7MnvG}w zWN74^pDSN=s3L~99N6m!Dnh*|PI~Vt%2VMy(;Q$^ ze?bjyg(gz+!N^%kx8I{D3fW05GyeU+erO^kH_%MA-!jut(>2M*K$z2ll>BIDmQq&y z@vyJleSF|(DPU$z{?njk4mE6F6Dj%c9(IL&0?dpx>At=4E-ZPt{QIHv5xs+=qfc0M z<5oU=aX6Z_$o+(#ng`VfTAoe9!sztXq9(R#<7td2mcf|b zhRpc008nZS4d>Ds^oftH<2Y}fU5fYgo*!xvV!1!7zFhlUSBB&YH=L}N8=XOIk$i%A zAs|O#l8b|OY6+N4eyb#)fcV=!^qgAB2&VUGGr}>40##H;7H_`dCr{w*} zs)Wk*kS5*>=W7B>KoSbEY`;-;%pI6Xg%#?2G+mCC;b=6P#k+dXE-&QFzkIiJs6 zdJ`_)@SEoePxQd-rr$kz{`B%6fA#CT_1)_qUa`oMdUpAQp?7_IH=WMU&Mv&HRQzM@1K#*}wklzkc=YH+S() zWu`aG=xSy=naxy$Y>>;T?1pYa3j&z>iUng+-wD%UI?Nt(jg+b)WeAY*Q(^S8@LzDq z*weIP4u$AoSrc&#fBpBT3n`42vORiH1u^rPva~0Q%?8K>pcLfM36!&2_h zK%q0%Fz9#tJ)M)&ORnC&yScjV_lK{3_~CSPc0IlQ>gku0$?WuO^uyH;Uw-+;8Mt`b z?dZoj=gZ}AI2xawK6&!w?Bblt+}zx}y}qLJJUx3l>T5L_3{_-FCE#=Gf{QV$w$}MxmsbJl!8x8J4`tvZ(eqSQKhyWIR&(= zBr1$|Si-3_)W&R8+)n@>Y^ugj%cI0~+@s&a^Y0C*8wGGqMoMlVB{z_gKQny1VXhsZ zdocP8eC5zG;k*QM4oA}7g1Rc&M=Pp|Q0TJaPulH=ltAW0JwEJ^6bZy4^Uxc(kA@u8 zhLrrXfcuS+Sf34&yBl!-fv^~s|I&Yc#(1yC+|bbmOp*CwkIp2noBfuH zdzIKj9C~TTUn+m->wc6T`7j4D^x|^NHyGZtazmmdxZFyFW}RdDnLc*j?5!1zovt%S zqrzZWB8zC4bcZ2{$j&a0Nh1zoh>4{y{%q$9 z$!r0itiJLpl{rFJCp#M*RQ2?u-oOfUUqhu($A%sfZdYGhrs;{YkMHPBh_XP>6mb)X zp?y6U6URi|#S$+mBSK64{usBEx=}+jDsc|t9X+9$KF~Iw&~qPjv_+~51TMwS_zM1# zx+5l!^H1lyn1qlVBT;?DUSBbmUL6(a`5TDMT2FF96EPp{4)sSq)a{8mQ8&pY3lfs+ z_^-Z!CjQ0aQbJtZuwpf$+iiDvy}P)9C_Qs+2XRvno}pc$Zp{%}5@;tfVF!(78F z3Q-l*+X;1P93|JM=j6DE_4S-`#Fb5BMm90B5bP>KPww@HUA^wJvs|ultZIPHsH&VV zO))ZMZ@R2N8Y#HPETM53mMhC3-Xws8>Kt>j5UtG;#n$Xn<_IVh{1#8A@Z}fVN*<^|>v6iW`M>A8HiUx~?-aSGgR395;2Kih_$l(zyrah<$^GY^B z=XF(Oq9(c`+EtP+J!_i1fL>jqPvXQ(6R3I{ld2j<71Zn*&F==xS9Ta371{(%D;4s< zcF4*2@V7lbolS$4okD;i=Q#Cx$|p_LVR(`UH3 z8etTZwJR77u@&_zxm_C51&2#z^FLnUg0|^mes+Gg+N^HxZqF~y^(x+OmsPN*7cR>% zM8n+rHJi`z2m-8{C|=@Uw}Ab!3)PAmhdY%>{?IGCSg=^N<}=)U)*t=w_RabE`ID#5 zrBEG>jzZh9x^+*-=a-iklj-Ey()PhjIZAFXJ6di&F}7}chl)V{pMf3fA^|? zGWhbvm#?pXcye}eeRs>axqSMJLMO8sa~B;(7RdSX2DQ*8EP92STgyFjCK3wO4>j9R zHQH-C#<-L_I+faSdkJ(EHZ3u0$&*xfG#=vs_89%a0Ozyc(-$lTeZ&AQjsbU*$#6Vk zg7tYTdem@XrFvm5fCh>o#GYk58lh{@>#Ju+2FfZgw?6r5d|!-NGRYeihyqGa@d|P@ zOnNEhua-}rTn_s~{lMdT^W^;L#o5L5ZoXKozWDM>_n7Oech@)9Dhd~eE#(LbTYlXe992Hd3SSpeoBX;i1BFH@9KoQ-|3y=x0CMa=#++` z$s-Mkrv&^$Q%>$zP=O>OVh3; zBLUaN0MRg`pRlP`4^e9T(kzJ*+jQn08q!BbTy0Q_Rvx)WaG|smfodv<<39vh z2Bb6*&Z|dcG{b8shAB}j{a>OsA#_GRk2rs#ebdS!uZ6e7QLmOZ5g`}VBPDdi|JaH+ zEjV0Jl#*np>3}RWGZb2h_VB5)+63tBNxsUQ*2CPBb80^zRrGH8Ep$dLLO3Jmb+pu3 zf)wWkVN6}N8Er*MZs7jZ$3x9Co~Ck5+kla@r38{tw1#F4maX^(hdwMv;cBh*MyjO| zf;kzuh-ef3h7MPp5MhnHxT23m2h<4m{Nrc{p2P&DxjZ_myI-=LA}PmZkx>dpM@U@S$So?;I8;tA^YmRa21TiDsVXS!%*5; zs@-S*zM|o0B-XuXN|p^;atJ|9_`y+@TjIU^Ok_J9ts(P~F~=~!iJI7Z!QS||cR(`- zAB7{uA07B8QHQ|}_1=rh?iB$cLCvDUsyr z;h<2YBA}JG0s>CTu$`e#kSS?f5Rdh-f$-Zi!#FsEF2YR1(O@qlL6o+_m9LaRKr0%3T$^cPy7?UR^%HFj!_{iRI9x908jfgER(Cm3A`0^;B?{8m zhah|S%|#;zFaDo+Dv$x;TFHihe$-LJNB_{mKL(mYicJV5g1Nd!tg5CuM<0`_lkRjn9gW6VMFGpj z{Cud_VMnH2B>kxrm6wpBl%-=9eWyV$_i#r_NhyScV&plEy}kOe#Bg0OH(cR#c}z(G6FCY@kyCao7K7n{v2l8KHl0mhy?RaS zpP!#o0qs@#THlvTofNFrtMPa|@aHbHU2j12^z33hKASI=fBEZQe*Nul^{LEqGnq|h zchgaCaC38Wx0)~+3_@`n$+GsY{`_p64YW{QJr zu$IsRKkq}Lt_w{t0llFkzEd?E4i{_5kjq;p=q{sMK9qgoJcXEB7Wm>GM$j) zt1rKt&lmbBNJhe9Mt(gwKcCZ%gWj;;AK;Mj=ybhY4f?&soJQ%z5N8Xj1KiC5BZ=yz z&usJH#JfIb{cdkMy&Vkn&@|JP+#QhJRb6tlhNwgfEbls&DAj~-6H33uX|V>QT1uPM zr8-LpC^h!9p5!_w{%R3Pv}}y6SS%vVLtZ*F-2~IhQ9xCq3OY(?DMFk|rcB*u%;9i} z5S5}7jW7{Lq?%8$41j((wtxnLhGIlQUzk_rE@dONN-&-NSTqovK#(v>K7?yub3!2^ z+L9vZ8q$kC~=@)c&3*mQv=%!7@nxZP!v^1GO~iB^(C-^Wt!NRbS!@# z_Ss+4LZ{kr%NYY|8 zw{mPFgf=2a3A({SJ;Bv9ZB@}1xzNcX%06AMN$qy}@rkZblV|6EkWGl6dr$T&0YwOG zISJ4x;ob&hpF@-!WFSPZbfHWIg;pt!V{Frj!)-)p%F0vr08u=NO98iJAemBuTKlY@ zB!#+hOAt5sfXvzlsVrG_Pslx6(0*)74>19GL7-DN91iPjA|)S;T@MH!rsr6=lqOR0X9N4EiDYgADY=2r70+KBa@FCnUm|gm=3Ug7 z^m+_qtkM0L$_Og~W`Hya#8?$bazz{s#B5Qi)xN(vv?Z3d{=ruggQ&ad#*E{Mpqd)E zg-{sN!HUovjku7MSh7bK(XB$uNNhVcD+|e$43JfE#e>PVR+lQ%=vSn!nE^X`E3wZe zs@f?*tW9@)k}gda66maiR5%oWzoKA%G-mj@UG{RKQ|pNqGjoYF@&juAyvB)zo>F1GBV$xQPLj( z=?$39VMZjj@M~ywi_z3jMl;hmJ3I3x#C)AFo-Drm?z{i_KmX@!Hak5X(SPQ1{j8;5 z^h_U^FBjcze>^@zc%&b`TfKVq-F!M(oXp3g!E!Ns{_M&5aJ-3A>u1lN{ny|9*X4To zuYdekx{Z!{7YkHToJ*t%ZflAFs!<#@*RERg`7&xuU%f$}Yq?&{7IU&gcY0mIQ$26a zMr$dVs!$BGD*RwVW-tK+^vH3%CQWYwtHKqYK%xtgLi3}`9Uj(UpBQdj!b}h%fc-wD zhlMotVh1-o9Zus%0!hERy28)jeDf96oJ=M(6K(YD>9f&zI2;Y0J%38{_V#+Qn31|z z&L`75qS$kDb3>9rL2OIxA2jIg;+xGfW&ADd{-gFtF4{pNs@ZdR&H zJsR7s$b(^@<*h)V6)E}A5dHlKq--CJvT9i^gr{Pr6wfd@iOon{bvU&N*}8iRW@gS+ zhBag+@+J)Uq4mL>0IcwEq-+gfTQ=LcU;eR?jVaBjS@=2Qr((a&Ya%6oG?KaoQu4t_ z*#fvRBPBl?nx)u=6#4A&x!M2OJpo&=wndaf$kIY*`k# zM{U5C+$X~=1e$HL3e`OoH|=R14Xe^qLR3w^&~;Kifv8+q>r@O38|_Bj{^)fR`tDMC zV4M&KN$alJR;Sc}O9Y_@|0F15KtgUfbzZr~{Di75z)2F1nwkkDW*L2p+$UCwx)c+Z z0p=u}^i(QFMyS&pT(;8fVjNr1dlZr?VYCKODnT=a@ZS}zh;7j|NDq}h@I5VMx`RXQ~)5^3ZL`oLEiKs%NQ$ZP3EEQa#jMXv#_e@0iKl4jk z`zlv+fifyb2y_-py{3cG?H~Bgi#b(PhAG)IVPPkA0V0Y~5I|*`?mGHrZN~P4KqB!s zHEyH^U(X@7BNZBiX+jwl-3gd4o?uB;e>fT|RgZhmPX`0lCM4RhRbC-QL%(cW#S_q0 zk&_jMmqfK`m!>wTNkZ3hxkP9_pP!$f!@0e^H6fYUgjg(<)CNgrleVZ^(-7DJ?wYTb zbG=!s$Jjp|kH7lz>$}PH-R-;E>syxi%gf92)3e25F`La$&cH$+JsC##b`|Lu=gZ?4dGcXzjrU(W-` zFBc1iT+1c9I(h#5DPxf~JUtyxCU?WpNE7aIH5!fP^O+uL-#`yn>jh0o zo6y|L#fq(yz8xQLPmqY{Ei7Fr7ma2}Siwlwv#b zyV~B1ePXt@i38QX7wBn4t%#Do54qoMp^Vx~Y6{gSpkh^nQ8UhV&$a^$NK{~7`Q&Y8 z7pLG=q!eNR(0&vBMG45L%6>j2H=#jyP~z}H0I2B#j5W91(k zR3TA^*;dN`6!BBH|DkYfKYR?o9ozRl2ki3$_Gcv4gF5Z+?iC!zqVhXF$LZU78A7MA z>BS4NDbcb5p-n0T3rr4`Sj_2>MN4n&P}y@MK+-{%?2skULMV|QJrL~&%6w0uGfF+y zqBE3AzX@_UZv!r(9g&t^!J%l>1w+ue(R+&Z5;w}!u>naWgk`L6U2?&T?An{1a6hSc z4odQ*qpvr{H$X{_eH4epEHDW1(TR?GM@7e0i3$Pc$f&E4?9<@fu+g1HJfs zXSLFMCzg5ylG}BCa;94gOC@N;#U*)d`gDI3!hVr^=tUN0O--KpKE;y|$YzKODL;YcR>0DiK7`O(AG$>ZIwx>S88YlW<$niQ)kUY|@x7}2o7 zdO}k|6r@ZJ;iPig&kwgKCqQM^M}hfr``C4X&So~74o4##f=#RWd^j3Pq;ch3RvR`7 z!H{8;OLLP%`SMs49s(v4Frv`9y^v|W42odALY)twDeLa;F1>;SL|Y`oq^I9gz-t_f@5OQh>G#hvTrvYj~6hd5ma{}id zdL^Z)H4G7$FKviKQbvq2ICOnYF6?)ZWGF;;!h?G1{POaG%*z03Mxzma8V>bo+11tC zXV0GE6UOjrxjsD|<3O5>_S&%1Lw7tdL7AHJ<97~Zg5G~R_0!Pk!M!#Kn*A23xhX-I zxt&aEu(l@1Vxr6#^frS=dj(ZL5VS&QH5&;m0X=+#O4){oBo+;+Ck*t598&9|Wd89#;5|igY{>spf|_*t6$6@!_t; zEElF>x%@1M4=X8&b`h%*C!W%SAvKcF1y?O(nlM%p!gy<9q-)0B>b6cdmKGs1W3?wq zqcVwBNubIqL`D!bQi>|8`cjl@l>`LSIW&85eZEj+pcGsv0vLq^GGWPKk>qo_BV#Y7{ zJH$`D?>)Bto$=`FL>`9L@1WfSZEk-IloR5|Ky$RFSKZ98?6F{&Nt8`?yaP^~Y&Mb zOYG$0)H1C=kz;Gg5zt!I;ogHvSrtn3Fi5Az-5iB@ji+3ee>^~i7K<6Tm%6L$_pw0- z<38invBiR0RBp_00;z;-OXrI@D>m+mjiHwCI84xC1e$^KX5ch);shi$iY0T@uvqvF z$Dw$;iPQ~a=np!z0vyxkm!OuV8ChT-;Ws>&aQ3EVgBwnTHn=JX0(nI%2j-*_rM!v5 zQQAZG)nt^o)+15rF`vV*ujqaCJr)n8XCL<2?=F#nn7b3bCc>i;6;WPX4XQpFVRE=? zy05zX{D5tV+C`=RQ0#5To%-5Z+v)z9d?Nn@rt=9QlIp@CuVc7PcQn>hD)aetG#XB( zw+t($5!{fTa!RO|WeuJ)`~4w)Llv`56eTmFnoLS7O+M>oXj{{rF;91%GBWustlCzS zjG4{^AP095aiXQkKiu0L4#&(n@gqajD$Py^Ys%4&E;9S!0WR^ZB$peq%7V7e$)MjG zt=Bq+y}P>`kK?xu*LtRSrFUmbI5MRP3iPBb^8@#O+t>4n<;&B8k|@_`?2N^0F7tFi z(7Ag1mT7-5jCVjYBM3o9749Z8EpSna{li*GyR75z5x}>kbCqqHeF7pWK|Lf9+(!BX z3?uqmppv&eqHV2yCHWZWN2O@lQ09eFN5JUyC&%5++qZAeFZGfEteW25Twa`&?#iI# zLl=bS>D-$v-p1C&N zxN}dC*lsH%G%{GyaMe;IqN{}-7wrxD)9Li=`~oNZ{!f4Y=9_OiF$UkgdHc6Ff9s!g zzy0#tmoM}yg2S@QXbswt#f;cFQHj(>XTjA5>E=%FWuDIGdail7=nr~V@2*cr zdfxomvnP0&=^7n0nYMfjRfP6J4@xdCFR!lOQXNe9c@P+M^_)AKMyiINDdqHZv|P=H z{lRRe^XTwK>QRI?8?}xSHlY`-HL98O8f9L;2gzXTmnis!dcTKz6%YuQ#?;W9uI>>g$z^03Ld6CF$G$Q%iG_aC zMoE7#Tp~ah3d5FU3^Z}|q1acuxJbo1yrk7XvZndg@H7*us70Fdl}oCXCU&)$+ND7A zB~Uj;lAtmxG$pdS--)nj@kmz#+j_ydwr0ndIB7xc(6Ai)Sud0=P|np=X69I`hs89$ z?inc)f)oT0vs%+RG-2E`KRd5!6L6x4t+tFTTtiJPV;_H?o_#pBT;!ePjI?Z~?}P7> zOeZL#N9AC6h92B+&CpCZ)@($fiLSxxb!k8uRR^eOD|ep+@M*h9m2H%$LiO5zW=hE* z58a~xnylAnmhj%`^!x(O&P`Ua2JKtF_CcS3?tu+1A$tn9l!%J7pyZbd_wkPf{!P?R z6Z`!3Q-Qi-8$PB@OYHN{$LRkUpYJR8Se^UE!cQIh)|Y)aw(jihFIc}1zm7#M`y*WJ z2{iZDu6R^UXS1236^bY>D#YG<=@B})9>+>sZU!2LC9OJAi5u_u^p*LXT>(kRvjVaC zAcRje=Y=pQS~u^dQj&>%;NDeFqjh!I-S6u?#Uix6DyyC-ixp+5!xwf>+>^r4rOIQP ze5Mr{+6oT`wWl~&O;Mc=tWZygG72^m&Em*KGC&(L{G>&gd@Bj5-rQA&TTWI=jN5Uz zP;wWMK&(c}0bHm&6@(nVi^Sni00L=Lap~|Qj4(ln1}CACSTGXdOMVSeLSN=o?o1c$ zt@|}>4k9j^R9E>_yKy3y|Tg0D>jnp zD%|^l2%jrEuC}+$E<&N=9}2Zv8&Yxu_awDLUg8g>X&P+7^&a9E6ET*h3aX)Vx;FMgojI@yTpydW|#*z}ijJVSsO zJv;F2qLEmE$myv`H=<}GjER6dQcq2^9#ff2BBFbaC{*_9aNJb7EEZqeNLd(SltMy$ zCa0SXmK+47Bjh6_Z-S0TBhl&7S}89t437>SBdCI%nJM^^ zmt4GpBYJPjX^+8SZgQ{AAU!;q+#7yQ(>P%WB*^#*u4o0xRQ!miOtRCGG5@x}a!rJn zbYj3#LEk}>X!t$|>*!#2JRGYpcTSdz#b`LNRPDkPLK&g{EVuij0CB=IzM1_0v-juC zkt9i$CkVhUTn_h$$jGS5v$Kl2XLo6bdcXgdnE9t^dUu+#yQ{0R@`%Xr3zr?h{@#0{ zVq&JIaIfNH|;Ap zIs^1qW%Mpd$r%oP$#||Fq|iWNh{^${vzdnWkxrA@pU|>@{_EFY{_M;7-JGFu`QrTY z{9-j<{Q2#l{`}2f-o1SfkiqP)zyA7v{jdM^uiyUb>UR0rt5;uq{`uYQwe&u&rc$_C z+~4b5`+k0NdwX_zc71*Q-~QYG@9ysI^Q%`cU%p%}<~isQFy6g@9;jC;V`=Zw4=?Pz z=#5I@&wrAxyhg=!}4wne%I}pc&&}=HO(@srG>~%5a6wT?GngnG$0|Wln z1zcTnV(yam!pMvtn(zGL{O<1lukXJ7{1t6+cXNGnes=c${WV+Ao11I>IHX^%!Nhre zeaoiw?3Dg?Jef?YKRZmBrTVWp*hx(M7u+lmhYf5su zkR;tscde|!f8nP&6wCkGq0QXzL&s}ZQft)5jt?laRe@wA+TG(s4SYZ-rdRo(C^pFK zzo?QiHbEfjk1j+I<_cZIHmN$NcacW%baEHG(d`xO!nORs)ylNjK+;nt?Y!Eu)>m7)L;bVD+5$V|pesFU$K@NS z_OkqL{q_8$a?*n7b=|d2-E6YmI`_IZ^sFz+jlro!#Khe2+a92md&-}>RGDXhrvj-; zH`rqSs1OUcP|`jcMO_aixsQSNQa_{*_-Z>gv668=JXQ2AWTdybZ2n*f7@@v zd0vc02fl*i#|JsIkDZP#)FBx8B^zBS3elWaVeQ~%0V11bcwTh4iP5$6nt%WR|MW>j zK~$XvGP>XJIW@?x)JjT|BVeW`P-)cANy<}pq6*pWUaK%cI65!QdAB#nV?TBj1CYrr zzfMV|1V)p84`5z<01Y58pOusXRYX=P%6V8p3oS;7Hz1T9hI8py1!ty6b-#J|o54Ioss(ek0WDFQV$KuPq3P%|~CW!0h~ zVwf!Ewk~$c7YeywBg%gy)f$L76vy;ZiFtx@16!PwB^1V*QwIakzM#?JXz?avHEI7k=>Y@6qinaBxuN83|ae)*@GFQOiJ00LNoIyt4z>e zWJH!TXu3LL=wdEXXnRpbDWVD8AmKwKRZ~PBrk;#vsP&LsOFZhw#U95wsKpRH(qd)S z?2}t5IXPj5(a|}V4AAJ8hQ;EZxhPJPLNl#uO#mj@LT&O}prKIIPB}`{&Mz3!=@g9c zYUPY`{}x$Z!J#%#M#)RAJAk$u1sCnLz_0Q^O!cunc#9VA7%{1oo4lcoH7zSTgkK^? z$}Od98!Er;L_2?0nkADJ9zyqs3YFPgTm6wXzu0#+E$@JyFBh}vY-brZquO1(Avn%o zG^n}l2O8S?oQ0$=8)(Q4$bbPPNxt2604)iB7+?d6Jws?qc|vw8sg2I>=hSY#(9aB_ z%gc(!(sZg{7o0EjCgqn`S3i68vy0OU=sZ6Br*Ho>zny>a#TP&S{O2!Tyf{BUzqxro z%bQP5PVVk*C;rf#l5XzqC)3$iKmUpfzI*rf%b$Ju^74hMmR?s-Y9anerT0Nt-t*8OKSc8 z-TS+{JF=kal-|;T>K~82H??`&)|%DYnP?xls8EN4Ay_C1@gYn6K~d`KJ-_l5*%}>zW@td=brYIk60R zM>@-+E!{HA9Y~(NQOYnv6NcDbL?<4ZXTdI2#Ri9k2%H)|2CBb>18OQ*Q;h>H3|&^D zzmq1$n>&lve((YJpHqy~vnwV-l75=?(DQot5U`cD9Z9rSr>;Ux`CIGwUg zOD#(XoD=<~ioWcl#pZa#u6m?bH2Ch_i&j<|mKlU0;D;s^+Jw&j9?0Ty;3stm?C)!K zubUxDO}WR{nJ=TzFW4l>$(ZVly5r#%2);B}P3cMH15fKB>;v;2e0Yuhkx7kK{?RQg zA-B0yL{H(Ymhc}ifsMV=RG6;SY8eal((0wY#ExO|fZsYAuSV3>V){uH1X2M8R08DQ zrb5qzH=IZ&I|yABf|^=uBm?Z4ig19e)B$lpEGKM{Bv7*OAEyA+;N^}+PpNi7*pCW* zDzXE`lpbp3O1wki?#D;}mS^HRqRkd-0}=joh#4jF5qL&BtEv!BG|Cewqs;ZAL+DS} zv7Ii>Fv16B9)KsTDjJ(wbcG&*YzQNaK(8z=qb3K?7$v?piy96`daBVA zl=$?2dLOjS&wW18dL>0f4xKghb&RX2OyBR$8KTdKtq<-A<4FaU?J2eq@$<{adLyf! zL8eHb2k9v{GLH+Nl;d#;H7L{;e(G7L#*{nOPX*=!MSYuCl`79@xvX-xX(RKVcS3H7 zCbMYpk|CxvAL;Wj3ejhHCr8WWV#!Sjf!-g&T%y-lV^eGx9m#Z*lR$l)QDy+5u51Bx zhxCV%nwz(h&|vET+F_0?wSFz;bL7iZYK5q@T7eCOR=u$-#1bmz=988x6A(kj?OQ;- z3T3MbCA4&_q~!;xS_uIQPD$wj8P`GHR|DWcbs-u@EkiPXO}#{HP*+Xs*V;`S}MwcIw^l_GfKqjipDmzp=MOIUD_hpsNsgs)^PTMIJQJw zDLfCc^e^%0{T@DmK0iN~Lx5#Nvxq0N%J-#iNUE6O*UPCYdLz= z+s{Ayj4FTg`s?%4^Rwv;no3j~Y(*E>;L?3Qp26*e&~aB0=pm^Q2tf~j`SRtje)X&W z_#gk{|NVde-~Z*m{Fis{-od0gOa0j4>h|{b_3PJY{_SsnJHNjtdVPIOaX1^G0U2r2 zUJt*{(iwQS$GaRKRahop@9vVrdhQ-p$cV?&F6FPBC|(5VwRK_ zykvNvWDDGR0$PNqGPqH~gmBjuU()7>w%{5`4GPPUZ#t;cS|POD7)eZGkLp%*iu#5O zC2QsxeT0CdE~A(#s;LE`wC#dctzD>k0MSaMbB5m1+(soG`OXYbP5KTXZ&lkC6#eql z8sfVHZ^1K|W(N6Jy2x5D^-X8hJ%;9JLb?kbT8*ODU8EJ<3<5=zmjS99priZ9Q)v+q z6DUc8QE&ll80=l-ndHsXI};FPoDxA;bC?R0ygzkLLzli0tf>wzR|7ECCV!SZmC+$I zVI|Cd3aBEiSt=(Esmy1`klt!fq9A67y9-GjLMsCizlFJtQh@%nWziWt$LbZ1bdAjU zQ+>5UKv@(g8vTO5t3+efq;}k;j-Uv4CiVG1QG3f})q`(IriGM2AU8c$>k)H_Kc-a= zQ|=DY5DYaywPAl0jm<<+J5L`GaJ~&BH7G2ju#Ccb65rW=h_n&3{H8VP0JyDpAe#F) z+|1qBseh=@pAe|RPL$*xhT45F%fO71Qi8%N*sZ6C_E3_0D9Jt4u@f->r)65I5QKD5 zx+`-L<2?^uLDxlme^7)K3$?f>kX%D(1#JHCe7gzj7Ggs{v`~kGdHbS}KTTwH|8&Tc z4U}S!uiHsn&479!jub_-Wv8o2*egmABV#rcjSdB6!rtC&ml#Z_y zA3IB4nKU@@SJ}x~Y+WPYcNeq!P)=?Ree+&e;;a^nIknI|f?Pzn(rGG%XyT9=m}8<` zzU`5bD$F+kBD~@3h>jAp6)j{3vVbZU4Pkd~*@*o7+mBggaF>GqRH zDsd>XqwEH|eC}Q>lyvn|vj``t9o>{R%r!03o2tV- zwWm$yEm*3N<^s7$_aXYs314yRi?9ybFtavDe5l!FspG|brBq5f537vLc{{0wwRjEF zUt8X!7N`J5xRfi^bwzzh1x+ps8CH#+kMd4t0Tje}6xjOz-uC{%Ag5 zoSmMjBUlw;MmfBwrKo}3D4?`JnPAli(CN;2wx{N^{mf&Op* z?Z18V%{R258dnnK9%DY&Ytujf{PWp#`u6SHckkX29d)yN^c)?JCVHA4D*GIrps_>q z@IFGr`}a3*uHU@9et&&^eSf!r!(2t;(r>z;k?B@UM|4P{(4MSxL8lA5AUQ3C!Xg_e z26PA?B?v*=B+a&^yZSGBQOPVe(F8c2j;5!lXJ@m^ch}dhlcm*^tEVjdZrHA&Hv6vV3Xz7gzqS6h@Dz(-tY6EA2TiSdE@9&!l`c~#&}RM! zl=>RbHR@iv1Figz0j)hYzeW$UlYGg(g_7Jy(=LC*$D_Erhmzb!Z-jmbpS-<_#T~-g z3b)WQcM5zETN=Kbl8S!zk5TwBdAZNNB=`Q;q2uwyEA}V6m@4tWC%dSE{i{h?wHGaf z7&Qmb)RirL4xrmRQiwzW(QpV!^^%#54t`aVR38X!iM7Qkj)1VWI>*tu!D#CH9LmZo zp|zRPDqgl~WMGJEhos1`0VI&UJ%C1-TXzUn&)iPH(VFiag6>8N%p6(9_a|l=j*%=0 z9A~0ls*DWEhC@iXeZ+xl#08sIZs6pp?W-ODkt#xt(yKGr9_VrMa&+L>#ui_3{N|+^QfWv#eAgu}Y+P!{Z6251wc~oijWr2^28jmUf0f(9jf-~K;ymw# z32OS@2WQztV~x1nJ#{PQOrCo{03t2KC1E zmAR3T3;$zgsNk zK0ckJBGq%2G*jn6*WDbQk_XZh!Wk;m&TA%rm64EA@mLO^$9g&yHg+OWiVRI9nCufp z(tb$E8wJTv;y6;ENGsE!{rUbDv3P%8n#Di{r;2aOjQp}gj&!=>6v(I4FyqY4A!ji9aJ z=7#}mM1wk&=^719Z-UMNbRK*jdIxlRgf5wH!t|QIdGY^gptev(DMfip?z_ADv$M0V zldfck`ZOI~FmrwloKwovlftHT7-7=Gj->)#Pd` zRX3b!Kw5)ZFlzNoauG06I-oaMA1yFg-$=%04|%dPLu+urck%EgiRDnK7NMlG)6f^K z+?zTyWC!)Gh@?PuM5{`nu2e_Ya3e`Mc3fyR;i+?g^C_-s*q+x`_WdtcM{|g2{_n1r zTq}3>TiHq4nKR|Hz-nuUbDgcr)j-cuSPAms6!`O{TsC8a-Vy45K}Sj<28eVKjfm%2 zS*QbO*6Rt=qkr$c^cq9;?=a|xp?-4UrLQROzP2?#@AX{v7dIV%t?VDX{)QhGTg~yo z>-#`|O4&Whn5lhKd7Pz$JB7bb>}mfKK)zyo3OxkOeuupSx?O+8&p=6 zJo`7+7E8Cf#U4t{z6~3ay$>bn{#yNJ;=$8w}s6;_( zO1Om_F-NA4asb@} zdZ26b$@$_PP{g73{8W&7#aD$WOw{;%mF#Ekuce%b6?l<3mk z*6W}AEU2kLr3+DR0^3}oovIJLI&@>o@}04yOF3ZHAndq;2!Au(cZNB>TOSacuUkQj z%0FrV>2)DpV051+HNzR*nqrS0=X3p7*|LMqap!Zw&i|V@E>BjYjl42Yb=1(%DRLn`-9Me=g6bc!@9$$kDl$8)jg* z=t2pg7I$}d-M3APOFLL+cej>~7r3l~%{-*QP{#HEdZOPPliik(xt;X(0W@`tiXOr% z#u(zH7MnR*dRx9lGHrxCnE>ClMWj&vjK(9agJx1I>`$smwav}V4Q^lP_w~7HT#`oL zj7+gjM^s|C*3l$7Js3ISM5WWa1=>w_r%km=@kZBH+lU4!G2ql_r9XH89m!+~T6!lw zkh}{n%b|E3>uB^aC6hKlg9BJtMhJ}Cs_kaJZU;XO$zyJMT z{_>ZMHMEgRXNdhU(R_Ax_S@h7_RoL*^S}P#56Gm~!H0IC$CJs7E!peWumAb$e_q}% zfAh=V{PtJBeevRIHk;`%Lcr27G@R43)6c*7;?=8HpMCb(tCz2?UR+V%^RshGdGqGY z{r&yz-R<4|9YiKECNnbWw9byu@9}t~uY+8^xP15SEpx(KLVrQTKR3c(4;#%{xkf9G4vLls)ba>u1~b8cgRNx$ z5#SR>J_z0NLwC`2+ku)ih-QGPz8%6XrBpsMgIuWgRcR^^BsE??5XNYVOhkt;ZB-H8_~* z^le0ar%fnyt8^bU>N`>@nEEQ+>O@Ah^8qwd<8(4*mW03A>}_PX{fDADmaw*+e3ee$ zgYxV`>#^?>F{y9=6Q=IO4`u&z;m2mb`pPbpfU=a=6+-20GbY$)hOKs z)P5tS+UUSxouOCJFQx5?i+t8mp!|l^=gPDT4U-MGMp(vGcOSkXp(g_HXF?=Iw?iQ61MCg@vx7tqCYb#&2G zlS1J9^<&G;C9R!?&8xK$g@u+YN-ZnW1m%QCE_0Zxr?yNq;iS>*f%9S7*?pf9)LpF{=cS&pyt_ya+uJ&)R-Ou z5=m9)pMF_T$=M*eK)HO#xT!M`PcsUC%VmqYE2iu6w3BO7 z(MAL$btCM_Y(ceX;Lin?EQ*@!x(`R;vu#v+A05AY_nu~%&sj4c?iP2X(GBS|uB_JU zyj7W2c24KD2i$xc2hftDm*fd(Whz)xK>Z0*wlDE5sjG>`Vw8iY51^^1=ngIY6jas$ zmj)Yz`yBll6L0+lbXOc~?8hF*Ec39$`Er*t9?=L0IZRj4e>qQ{Ibl4%d;k8`%U9I& z?c3Lv7kUC(RkP-T_}s36O=~@J18_28oDf38ky2lBPSYj%AE$xhJ%4@b=Rg1XS6_Yg zumAe5fBoxUlUn?#;YUx=DHxhD?3cgz#lQaH4}bjgpXemx2?d_e$0(3)!+z|a{^g(k z^7b!}i-+I+`ak^o*S}`qtR7Zp=Vyq?l*}`J5w;)D_e1yNV;x8nolR$_v)SqN^z8J@ zpMUwq&p!YBi_foKUY(tvG9fV6Emy0zZ{ObD+;QFC=}>yP!1jmLlDSCFZ>H-&GnY=r zlrUQ|zp38cibIX`UT8L8M~fxSR`l-fp5p)d?YDIOZ{NPgF?jy;^z`=b=KTEh{mnbn zt`>gzv!BQIyMpvNpLUvxF0f6rxi*hLMp91KoyOg6*oj9oeDHM7K3_jg%GMPX_APltL zSPvX}BO$wXZI2q|L!k2%szWvA!M83Vtx7kfEQH4w?EKm8#~912K>gKSc6N$bBx|j2 zHz<}nZJmCsf7ro4t)pDolvBEjsj1;O6=vaQqt{0=7NJH@o1?Wbbpb82Eocim-q{om zc1u5njU2vr5_F%k3u~^LM4Quuy74Adms*FU>3hlBkma?$MoaI;ru-U1{CFlIT_PK} z$A@F}A>9>hV@S_)q2E%$q2)fWof;<|DgKj|8tT!zfjz033BAFFxdLwkr@O7oZ|leM z-F_GXBfU^P^j!*P$Ug)Ar=PmM8(m^er$z;ScRhaw->{*W zL4Ms}sJw7GGzrUZ(@@%iRSq~3- zGPJY5g{*q?rx!gtH_`MipGH=!`J3)?sLueX?to4Mfr>=$m-ncO2blH<)e^M#XhNqw zIUfDxo3GE$FPD1CmGyo8_^`aZykJ46vUtk!^2v!0>+vvoV^1DuP1};fT6uh;rE{@Z z>30IaTj9!mftwqpF3FTK8D3aSspQzIlsDFfF5M*Cv89emtT7kjez;Oj>>5yCbcARMd{f z_YaT%>tFux5C7qJ^ZEQ={^g&3{^ieK(mKoKsIfC^Xtbe^jH!DKrD^~Vl9fQsMbVV? zpZ?Q-`p^IQKmW_W{LBCGfBYZU*VnU|hMQ|7gYiE$oS&cn@BjP%{+r+Y=KuUZ|Ih#H z|NCD_MU2#iew$jyuD3V$Uw`}8U;f=Mzxc}|e)cM?v`L-7 zapy`OPwLS4=KA*X<<-Cb>z}T!u9T$4I$o~k7Z+#u_qQlPvwy5_J@oXUjwSE?oe*gD zjkB@dTT+tbS3z{wbVSKgB1Qy2_(i^xasG|*z9rwHrf6!LJXy*`07G#8e=$N{*N}$CbwFaB(rlD@2kEr$Gw?V$PU8F&MNpuZE z1dRzBXfpE|;QDLjt)) zVC$?MwW5x~)bntGxZvZp6sp|&fj*AJc627>f zB?>G+tfM191ho%-WH?3W0XtWRvZ%Cf3Oq&CDUqC3B1pf!M*=B>!*TeySS(jdJ>Y5N zcGO=pf1LXT7wez$Q`X1DXha8Qnx$NbBRxXw5jGy{C;sxwg4jS9I^jf*8u|@_(0Whs zXi6|1O=0La3iW6Wp&o&)PdDojh$w_kBz50Y-m8}p{YY(9Va@O%Ty6aGfO)tKvt_yb zqCO=L>+0l4Qj;pX66{5%&~l6U{oUPip-%y^3W1cMTB}@@*mfeZcj07%pAu9Mo}^or zA0hOOHwofXPUIx1)6YDTj!{U;;MCogR)p8i(r^m3jdjK?9p&#Dva^Kl`S?BwTcE9D z4@P3}(pW4Ov&lp)RSt3FRy6|NKGBcA(G_lQ@6XRJr!xe(CinOEv)L4H(EZ3jE|sjn zHn?(bO?3cs1PJwQe_x8;>CV5di`!{0NMVEMhbY6u?_MwUZE@#u3I)!Y}ktb!MRuy2&;2QN&Qg>l1waTZOTlAskJb`EqRHTuDU^om! z)8dIVut}x}n+zt4a)r5#2$;JRY9qk(Cc2JvN+$s#WvO8r3wOfPj27p_+-iCYnYiMk zfWKPLLFCQy^5!E>E$tn46lR6yBP-ZOSG=(;bPYoUYibu-$)L~q>B62+b?mn%>(%Sm z_?TRt`lcr%e^}0fp+@XU9<9jU>Q4g|Y>R&gjhP)O6-;*`ZD(5(Xcc{Y%oIw8W*W~E z(E2c>L+#;4oBR2ZT}mG%`EU3e{)Q)!!BU4zJKHCO!$hPpzH9&agX6mm_IA!hLq%cj z4R*5^h1|rDuDUbW6W^tBhhSszXz(3;F$Alk917ZA7k!vWe}YYdZZdJGI~<{ROWvaS zhEpmmCr$`&s(_QM#9Fr?{oREP3Ae#6Is2!o!@DTTh2wkg?imeZrFB}*+5l;L(g4Aw z?l^#+&-EovDy#RNa%-={B7LP9tv)zb=!+smC$H+fu7(N?rw-tK;ChpI#Me=4X~ z(}qpBiRZNwFQudUPkL;^eGz*)tCUy$!RR<{2)4+si=KuMt#g1j)F~@8W^9J51>Ex^mv~QH zY1ruV?Sv)i4vKcz>i~MJ{@LAqqXz-lI+BfjnVd0*tkc3$1AR zg)p{t#?CI()t3k`lIDRxQq?i&LHY!%1%{hq!$;A#@9F3lj#gDLxt6Cet$Qe zP3Y6orf#5&dHfc_CKP4f8x(u^E3bHrQ=;!q*Ot<7AB4I^htewyjY@YxmVYc-ES6_y zr*Lj>?=LPc(-z2JW1)>ofY8yo3%mKl@{MNGcX#(X6Sq?+ivQ^Y$45EWIbrw{rBRd& z-<^yms@1IiF@5sp&6}4mUsB_@@7`ZtT(FZt1A~S}um*iFkP+f6+Vs=bbO1MZ`4(gp z_JNnGt3$vf7X$_U`q#g{y}f<=_H7<3j;f_zbM|;~aY5==Uw!pI|L6bw^Pm5`!X^u- zt^LZ2`F!#1^_!o6{^evcq2?%GEa&89cvE*x(ZI8-z3cGkXt`Qw?#P&Or4ss=8zHoV zXA;zZZTK{4*yK!ERFf)5j42ixsp)ibdOD+%oS&aDZ+!m6&p!X+^Uq(sx-wq8xVSuj zad~lm{r-BfT)uz*{^sWT{{H^;^|zRMe|P`>`t9rYukY{fm|Ag&>f(8d6vDi`vKN$h;)gku=+6%Rb;*(7j|86G9 zedhF2p$|0YDQsyDQYZ|EfoR$|kp^p9kZ25Z-lANgny3RLrF3p(q?C!mOAZwe>*72$#jF5dL7={-h+T!LmuZQXHlTjTA0@OI zP1i6)uuJC}tz^*Wd_UM(sgE?KYC!prs+5~iY^p-?(NDq>38(AMWP*i`yq zG-^7Mzy6tra>u>drbJZB4qApm-K|Drknljo4zf=-fb+!$?Ka#7p zv!(m!ml(h&8V+H^T4p#&qGiMEBLWarzGEu2k02eA~U-3bjESsmRWn%9#1!MR#%+xmJ4>#&uupniXIKX|+r zX!EBJb&mB=nLoG^Gg?8Zlg5+=EH;oDi6ed0uyWeaz9tX1Slgk#YRcb^bD}SFdjq;l z5B$_Qoazx9QhZWDG!s!D@TtYR4i4dHelUM4?D(;Hn;)NSa`bo_9PZ?acd0r+uaXX9 zIM}efBC|ATn;xWAm01b;0D;rlOfVmoZk9PbXjDlCFU4>0L3+_>`wXS%G;EGrhf=>j@fGB0WRMx*yDVzpE$d` zIFlLva*xFH-Es6&!1!){PX~s6c<_&GJoaC~v96=uII_l8-D|%RA034GezX);BiBdy z{aW~o@jLk2J+{J6U-Cz-S-uW0?@=}Vej2Ut^*4Wg`SO*UTQz?B_U&h%eRjfnr`2B{ z_@F;UtjeUW6IK+`veVHx{!fcMx~=mC{}Z3Sb~RPG@%fOQ0jUviUO^{&Cpuna8?js* z=@lG5yF%u#-@Ma{FX$=S{!Xcz&pcP#-R(m_ZJ{<1Gx~V&BiJ|Bw{!^>k>zsv*T260 z^2;x~@g+CPMU2l>;qmzH?heUBvpbKBQaAB%e6l(|`jZT9Ku|MlPh>p%YTA6{PS zfsejDEm}_cB%B~j3=Um60Gf(xR#ETL*yMjnYvwn>BM2pOR5xFBPQYCZ`<2&=veFR( zG^|#SddKtXak&uV_FS@{zEwTIX*PG z&;YHPlEEOln%|Q%QRK;s7m%T&YPvPx>yO;;8Iz@}b4UOy*+Yj3C~@WaEohU5fQ^U& z*Lb}&K&W{fMGV5ia)I*+VSWh8z7xrwA^?RF>OJ9W*ddwbC*zO zkqvaV6d`Eef&})eo53Jln`+pSH6jL~(DPLvRe#MA$cj&jvX|H!y|xZ8l`wUzfLZI} zYAF>usX|wJl1$LmyCVF-556S}ZAzD8E3IzHJaNo|lDtJ*)K=wHVOyN&w)BG1cBBTK zo!ammkGgT4*+(??=m9UyJj$qv!F(k3Dt!04faMX`VZCfsWD{Fq4pnq0R7zxZd0Fj zC8-fk7-2%zl}guC!bA^3tD&WL0s*IbkK@q06FAxcO~zAiWMhUn53A$x*smKOYnwiq z>K+U|NGg@PPk~i2s*YBA@I|{7qFIWhOL1n zPHSLSC=Dnaot$D=Y?gI?0iSo}>l?xnmL1u^hQrp9F*lZG2=ja$Ua!fcc*&$_WmzLS zWky%xhX0=tLkG}@qUPGlzK^z6My+d3Wmen5Nfa6aPgb!lL;#}7cTA=BF{GzOwFFdo zn9wva9S>rm{<5L1HK31vYB=ijJ8|d+H&}0TE78I_qj_LMJP7C7Szm~NHchD1<_2;f z&{q=dzR_yhYcpfnP416Ye4o5S^$Ne$ z5Kipu=Q`9sL;bVmwxti%Wvkp8t#;OoCCP_D!InNh%!r- zSCO8SV_3$odRT3>gekWztEH2g!%*Gp^$wsbU($4*$MM~K&YA$b9zaXO#u5;F1T+*% zX!wn7;fGTXpcC2#$b#^LBGa5|wW&imIi9KzaJ=+kA0A^wV7{KBBK7OPetmWI(uOJi z_RY;_pTE>u=i_pEa=dz2XfbEic^oUd4$YufIB;~LgRPT%DD7G0g9p$`^{mnd?HlKG zE-JNK>94-j0Drj{-QHg30Q#G+{pMx$l;!C79JSAT06m0<<#INg&F^)ths}4w{PWL0 z@9Zzz9vPp8d_2CtFCSo#l%v2R(1Y&rk52yOkN^6!FaMq_zyDwV<5z$G%d^Ss;c-+qfr@$*+- zeT6-L`qQ6&|NGzn9bbCaccOPXpFAAteCnV7_%HwAH@~?&J(Fp@+QDg=m8MhG zq{`e0Qn8&em^~2DjKS0nGuGL=Ifo>sjL=(1uId>{YWGO5p5j<&I5ibeU&*Yrm6fD7 zv@DMI_qU`fsarI~re2G=^KBGC7<)o96l-`kJEI6a?Qpaj9gR+>rxzC&v)Pmir-{ju z!+NGDXewKcOp~Hg)zvfRtCN#4yJ$u$;}@Hm&?e*A-Te*YbapyfJs#iQT_01**>rJt znjdpCbP`i+MpVvh&x*!8#2xksOViFsZjetCGW(6`}3jw z@R0u0rP72OmT#6$l4doN3cO^(G=HQHd8FGGy{pKyWFp!5EkrngjD_lGwW{){6}r?i zWf6vm2Fj#;-Ny)2mge6qYDd}#(N~dDslI=APgr4Q6yMz3u$G;lf8YSxZ~xgqS9%KC z#tzEbfFA2djevJ6%>gv>Iz?vtF10a3OBD2p-q7s@)tea0v$NOp zWe5=hnA~A@sW3yC*5WrhKH}C+MIx-{qKc>Z0rB+lfZi2Er!{;d)5b(734l$XB@5PqqG@_+Ul0 zfV^!N5)G2t$56e7vTVtx6v3?=teLy?B$coxwK9W4yE_bOQ=tLb%NShfFcI~M`v}{bz}mM@96%SHLg7oN zYt*PJC^ve&By29!W>TYk137?J>haRfV)?>*g9p%W-dunF`K$f`^y7n`LzhDcbgc9^ z9;wNW_38t)j{@I3=Ky*%@-1um_{UzgfkSpyv;yR+2ha@6)pDEzXy~m2Xma`Kcy0%G z>)&!?#Ru)#02Pp^8+_Tdr%&JjRO6*r~plZ8|rYYaOdxv>H z|M|~<`O9AtUR_;b=V+v}$k(r5|M8E1{KFsq0KrH{n2=n@Cpi$AzJB|LLG-I%{o-uW z^|wu6UMy@wkO92K90Hw^(sE>haGE-0wJvS>M|x|=4v-oF>2bM4@hr`|apc%pb<+KS zXI&h->~qGf&IXxS^l=fwIvAo}@*g9aD(b@_)QB_E&+HZRRD_S$v4m}Kbdr=*m^c{$qR1pQ zfJ0Km5>}*rgRP_?M0vasB1q8?Frx}Ohp@q(`iIbFM{{}ic-^!GngeK3l({>AmZ)0< z-$#{FjY>L3FnI zhl~eL*SAf5LJ8;>6i%NXx-Kqz;_1?VJb2ol`(sGYp*WsRe_qJ_Fl6Y{2DQ1K%k*HV z13lsBHcO?SwyLc7Wuu&~xp4q(nQ{O<@-GyP#*d4|{d6{2`T#nw;GkD)x1xL2vZ>|% zlzpT2j=FKc5VluZkXX~2W84$yWMpHvSj@A%X0h~kN~Yz0&pV!iu2N&}1_7D%T#oLC zwIrwXt}g9h+r8o7jvNbf0FAb20Q2R73g+~@9zYW|#)DSp^9<}kezqo^K&nY7-|fPX zp65ag*ea!ERvLnCaJW5($+!AjI%b4`Prt%r5X;qf*S{AI-Qcz;o84aTZFTN(^Rofx z?Ry4J2*xmk$MS=_`l0=q+|uLGtWp@ikZ5zd?@Zhjv4LAAMSA#d{kcu8^-6RLN$o?o z`Mq33hvci|kiZs(>II@IVYCr47wyzMR9xrheKBNB)wAV_YJcAVlB)3lT2UWBhaZH_ zX#%x_p3mnnHPs(;Q>9cU+#Eoko}TMgI1?|EzkBZ_&MJw_h3OwKLNzH4xp(r z2EdomxkYRapvi&(>dBk0;E-73#i0Y}O|1Ek-T1YhHL8BlCe;JzmI*!7?&}-BLk^&i zb=b9>jZU@>phZ!xSK+DG-TDNy_Xw(2djJi`cDmJ?8V$i_Y~VpJHz)_t`#b^tG1Kin zU}wO7U^YF?hUE3@*RNiEKAlcsI(>Z{Kob(Omq9WI&@$2;o^WS-;o;+x@gM*4=d<&x z^Yion@h|`Mn_vEV%Fe1BK(BHP-5vC&Wp}sxFa{ljN$K`%fi5pEU%h&T4S47>5MpNu99RC>|B{OccHzI^%fpZ{#C!;!N03qr5mvKiI`%0yeDMU>FT zm<-(0gz^DruiI>lozf2rs&cX<*EZ*PqOGb|KtzGXH|WXr!$y zyW$6S)cV0$eVhIW8jG3Gpvg4WJ3sV7Bso?;n7N>1dYi3rN2oC+k7J>Zt>YHLm=VBf z-54UM?F+V&b^<+7-a0djPL_=Dqe{Z|e6WxHePjTdgXcPcei~S{^8gw`Mz}*FmKC;E zVXN+7{{!ejoJ_I>!sYD&^kezf(Z?P@XYF_bHA|o@hhRt^RfXEZfeS|Y9JPno3{eY; zC5eRD*_I>b-RK`c12}lX6#Z_rbpS28hYXn=uy{7zojqbzlR73GYP8a=IWyRU%F>h0 zWw}{uMLSMY<^URK=GRuCJAh{LWd%{4K;!530Gb^|q4q;HZwuA_JuxKD04vlchU5<` z^@qcu{u#oj_WyI~AHw&bKdMqtrHAwn@!RadkmW&JXwY(6J$=dV6GP>;7Vd)~`RCF< zghTcJ?Et#aAF@h&oq7Q6yt@yeS4;L@ep%;)y{z5=z5Ku{IIux`N_28FoOMxUc~b>e zY_)wO!O}}2>uc&t5k5_Zqq7O3pnJu0*@ro*Ot~qNbvi88DJQAYQkJ^)f~RtJAqUXh z0M;j<0ZQ1@>j%WNk;X3R)b0y!*yaw+;)KRTt>hmYflZi>+6bf=c0gp|HNo|b>2UI(EqC3I*1HnzrH zEpBK$9*VYILOhKjJBR$1gOU%TX0Q7D3NxS}Vk$JyGc+BN8blAXJ;L+3zOK&1i+Jw2 z`UlX~x$z1PKV6&ijdJQ2wDc1|tUZ9fI6qAhsztYWaXa50KtJ&cj;7Go{{y~l=Y-Ai zTlEZ$5hl_09{2;5edJbE<6SuX0D5|IOl5sAb+q*aH1ecs7WHXGcN^)q61#ScdBX12 z)U9T#^Au+v{fd+(@Ud5W0R8zFFGyOy1A6lb=+(e{^#Moqkkb1=4_kuS?3A4bUFENT z{p%NBdgrdL;2|ML(3>$ku9 z&4iXZ`~Z4LzuI9}5=*lOptn`H+JKf`%B4r~1(Tc=|v7^?&~Q?|%L2 z)zw(zq70uPH1a#c4B!^wQ&6HCs(dzA<2fvd{06a6zqNm=00`aM2Cbh3I4RGn69!4u z9+9RQ)y>J#q`0jQ-U)(V^C({vwlU~VAU^*M$-`{A% ze55bbKR)Oi4=W~L{f_1_b4T7Ztvv%(Q%ln~mf0Z0hCntoz9m{HVTivQ%p?)3jRKL* zKpksARi@S1(nHwi8(pYPDTF_^1LzPXT)S4V@V}P>=pp_PP*tccv}^H4AogsPBBsAi zwT^Z&9TT3I2?dX7(nYH?lq`5c{6{~MgieWO zBKqdqpv6VOi8d#Ii`fJQ{0RvwQoE-uKY#KzAba{%4hwhhcK)P5M!lQpG}A^F|h zA0LM7KNO$Z|3i9yZ1xYK4xcEj^r7~*N`j{~w8aHOdHb5bPYl)KPy z8DEmNKb|OHCu(YlXGdGgo@lGEx8EaHLYF94u;ug_fw*jL;IK*89lCZUD1R7@b%KC= ze$^ex&fZe4p5!Rm^~Kes0c~mm?xws%vAS|Isb5Q9=`N0PNB*Q2&T_S!jP;d3l~r7l zEQC;sq6vkHSynpwz&we(YPTV)qw_yyZg|;E+`ec!>e9G!8 zp$}D7)G0Iyx8pbHDd`|9x60K|VDm328yVdX3$U#~-$z($C_0R>-_sh<@`cijlk}A6 z*~TV{F|49$(UM}F*xgsE2>hUlgf|FN$eh0q5Q#PqXC8{aMxoLh7V zQ0XlPdYXZ=)|}?H^1=bOlW4rjm{jYlN0jFCyivM6wM<5jdJP#A=DlkANq<7pRPq|d zHb4gF72=$Lq(W^Xx%w!{d!uCQq13pClH9{?=^qZQ4?hJ;wL6EG$n*Js$o`VtLrLBn zCEG{a{{-49d}MR%Z&+V49L6;^w5eMY!WN$Jf1y4ODW#8+yf;d=9uDn4LnzsLD9JsP zi_drzxsvEB%058$FezJIHdp(uGAJ z%c0El7Kg&Q-SVR#dddLMB4izp$}>2~*mTMI?phppo!PPq{h^6DgyyRB4up#iRoFvR zm65jO;vTY8JOy>5*nhZ3Mt zf@vFqb32syAew6s?Ci%aV7bGasj>^TE{F=*jVD z=>zEKGSWYl+tCyREoO;#VT(;pmJD|=mF{oR>+#PqwAM*0EE>tGw+*b~aBL%0odGQy zI@k1O;TsXqS)#CX1~UkVCN-g30lt%s7)HonhZ`tD+rZ5pes-`o_qs)MEPhkBLOO4lrmU6kapUi@@DPdgY zA?%6mnigQq@yWfO$zM{tckkbS_UaW)r>A0N=imW!bPk~{%l;Hh7k)TCoh$^?7l6Rw z;kef2jT6(U9A zq{Sc7z{$17M2;+#C}A%CBdIZ(W2O^aEc)LY+ z7mI~XrPY33gAkvNr--F}Z*FdG@9s!~^Y-S=ai=kzeJen671s zrR~em$hB^oj-%||)iQ@ba)I-d48wK~VXbEiLwcINvESvs*t>8CA%o_Gf$Y(P`(nJ> zm2$$-C$?yz9rbG$F(EbeDS&+5@yKJ+KqG?_V#JMbdDu(sq6YG3Lb@6|*QT}hYC2Rq z%9u4&R@80uYH}c@Lde+d`~06`nM~*d2&w6933al3daFJgL!ZC;qq1^$A9Qsz#NMzu zQL8Ha_8M@%%pj}+QNq*}=KhyP;Z9g-AFjBdI(N~^+yNS^SLkzI1NN(8oo&^;%G@8x z4q6%{bq5Zu?|}VJ6>$h+Eof8Sipoutx|;V{y5 zwwM)FNlopR?BG31q36BQfxaaBT6QdxD# z8zZV2M(EwHfQv!sjGkmKHA!(D!ruWcz?fKaiQWUwvjZ-42eNf&QzKs@2cp#zdLLD7 zuJ}B;Y)C<62BFE=GPlsr1%~8@`D>3lT9DL$Xqp&cQQ>xgS*QV|`h=A*`*|?bBT8}~ zjM_ucSG7}lt=*wOSu&zFHR+GXP);ljQKO)8c48>078+E})BdS-tOP0u)=|@diD)Of z`Lh_75KxPQkh~@GqzAqmQj3bhWr5TLzwUA^UC}a8RB~?W#1%fs^%=%yl#rQxD`c7{ z355s~MH{6k)cOlSq2uN1VKSML&^g09RMN_rC3lk6CfUYq*KKk_XFeCD^KaQR71Qg0 z4RAryf7k)^rvKIvs!1w@rJB4ZYdpdwB7Q@Qj~;&`XVd$Eo9 zK?l$}zjlozX)W#;>l)xVk*4j#Li;eTAU5|=Yh4MLj;aWq{i#!xC!pcq?s@`xRc<() ze-qKx$1d5YKv(gxY~J{+FB+enozt1&yNK8v6oRBWf*@iE;ST7D)bZW?{_cK3?cQC# zfA!J_(0T$IOP_iIx2#W+(RO!tNBaVlQV>j9pX}%+RkH$8^v8tQq1SY5a0|&jw@CIrO7cfzpjd%Y z1)_}pK!5e=XsRbcm%;M9$5-t4NfJD*lM%PztS+$)*)l%IyD_8RFhF+?n ztO*K=4OS%(^#weJd)HsisB)m=P}VO*r=s)GP@rwxT~cWa}=J^l3Z$wLU4^M9~j=2_1`|zhay|r=Of*P0SCcs4K6Q z`T-N}H@NMZ&+k~INFo;#2a+t2&}?FJn}hsvq4!B@7u&8nMqPR`NDS^U^@}|yxu4%- z<7_%(7d@ZPvF+q|G#Sqj#uk-mu+A+X=2_m(PS41W{9?K24u-Nuei%3aZR`QaczSwD zDJeolQ>*gjxNHjTx3Y(5S|Qu+@^SROV8br`ox)1HpdFw|4np)`d7_}tX)#!C_r2pS zYoFHBFE`ou$B_OOt<7xn2wP62+5FKD<6AJB%~1aExbb^X5q`q|L)gd87RaZFgvnl+ zr7t}V^)zLP{n0>n2<$)9&uLJylW~o5qj>=8I~Fy%9mY;32mB8Utr=?(18@j2Ak|M5 zS^+qP8b&MMV)dZk3hQG?-c}b>nZEEk>9KSbIJRA=b%_k9bYE4Awc4JT6&EECI5Tum zlY%xHI_+DdYpDAa{}Wa^VuXPNV^Z@@=OILLs|rK`swjexITj`a6=9BLV8T&J`cPBr z$aplnzPUR)yYQJ}Y}P!?pOJrl2QwWOds1A&Cy;86yleq1dRQ)RZm#`v?GJDXJ5|t3 z&!gL0J#5Q5Lsn(+{NaO^isD<~TopT}5h-s*x1UNDs{PTNhG^mPux)!Im?DS*=-Psb zW_`Ecv`EX7eh2i)Xrg?N<8S`@&DG17&ZTcWy?t|Y_3~058Xv93N8A!G$0x@tw64&^ zSk~}Nlx z1AB5qzOAXk`CLyBgS3eG>u?KLjwj#W-u&g8*T4AtU;NX*{_}tM^>4>VC(G5{MEjW? z?|}9@d4(tpold?J-IJ;X2p4Jq49Mv0q5@8!zH9{V6-@RpgYf-A@bX6U%Iu>}IvKC&HbaUC+Oeq<7b8lls-4B*f4xR|o$8@(wDT=d z|8*k6ygl`0Y=2*Vx|4_WTKCVP)nuI5JILj9#HYzE9k?>Vp#;*5V0a@ zgc++-E|$25Qwuys*Tr4p$6Dl9ZM$rOR1p0k0<$x^-3shq>}~UHRk!E)4nTucdK4d( zJ1_AS?ZPZ6C80rGI|799s|@Sz*Gj@J^tA>471yYJ&=a|W^?1!yCOWf@O6OQ@50@1u z3X8#}2|XwZGn`8Iv84fm&OmjXxG#qENBRC3*0V8xeh?ZcTQH0HBt0XlfM%;OnT&65@3??IU5#hl4{^;y~CeRfT9%j%C&W%L9t*V}@`P_6s`)OI;v2v$ zRD+@&FxS|m$|sbbj+5+C?I|+E5R#=uvOrXU5Gr~X`u?$+@)p+snFd?Yf+`jbDHLM; zJkKT=O@J8~R3eB#h_#;XKnEseQ3|<;>U370AswG|ui#*uh%fJHArj$_Lix*oYD^e` z8iv>jyM$@JcnQIW)pD`$uez&aibH5wsX02<R@*k4*|-5fEm50VPC4K*<;-5F1o%f;+e zFWk7ho$CjV9+vb5tW)+!{Z5unqLObDL*-&$h}HlZ+8~_N2t98zrWA(Df11QG_&L5Zha{*=At8j*=`ANrNOT_7ph zg^dq5i~W@o!X17auv&YnS2mP))rXycXeS^gCQ85Wu&&OgZQH2Xt4!WFpR$q`%k>*y zg1RDc+5#xmPoqgtM~d2w+Gb26DCg~?oAE@Zx3&{cx}lc|2x4%U33PZ?7L#$?X7m;kMctXKtf ztQIj)jVan27XfJW@RuwefZ?!iEaR=Nf<;^=Io^kb6}I|8ml_oo)BIV46Q->1hG@_f zCwLl-$_8Qd6Z)khgRck@b9flKj}HO!eM*R))SCaaG5_TDm=KS(=7lC~nP4lrg*G)b znyF4WABm@n?gROqAf-s`iLL$w9ETm46|l%X>Pxa-ORsdF03UB> zG<>|Cir(bVjo*PH;O|69{&$1XWOPBLcU+#gb9u!sm+zu}0+(*WdrVzV+P{%2k_31| z0Z^CH9H4kva@_N>;7ORB5*)UJY-qJ@@_Lh02y&x=9CEQUWS;aQm&4f|m%p#5i~roh za37pAWwh8JeJ?V{6VYbdD0PgPY+B8E9FHdKim=pMQWb4JAy>)vBvflkCZsG|Za*AT zM`efZyi}D}IBKy&f&W}7R8pz9E3^~)7s27^8N7q@K_rWN$eMmyPd_!;_eb2)zgjiO zP*6}%MNHHv>tGaqz$l(KGA}ny2A0nS_8Y5y$tOAN`I=uS7 za<%}Uwu=D7LC8$9KaTyJXRfXhAPBelxhSFuOZPr$H_G@4=wc)%jvEo#E0h6to%$Q=A{+)Nqf{X%c8(Na!+WO*^q*qksg1WC*QNPiF%@j5j+(T>P6;`4X2%yLEj_N6q1B```^&vpQ< zS}eT_9Z&R1A1txjk`rJ`p=5&u^tT(Tp?BNQB|V?;+KzXZ%-VI41J}i9!b*qOg*Nv` zT!XIov0=-+4_^OfkscCMx=(Vt`#R9K>`B&ornltW&k~)3VWNC>gjT3loUdLAs0*FF4kTgSIJx z@+Dw#^Xhoa?)QXktzHt%6kK-6mYitQsh4#w_428$1z>0~SfkoOUX-Mc*5mzhF*qWw z*JgDZ?B=gCZvt0U{e&&O8^bA2;3nHo*So9gfO!!W3DQPmY7 z4JuWzsa{uitYet8$T$u3YFVKH7ma-i?f z;Obom&_HV+sn~|)bUoWfQ0f(A3Bv@L5fM(j5}>6k$iR4DIK02PxxBc1cm4k5)l0P--j&)N2hjXY z4{^ep9zxq!_d(38I@^L6!Yb|P=>5&@)r+gs(^G`4y$qkWj$}#RfFz~r#|G*@8V}!^c$AU0vgb1lLQJB9Q9zk(x%J);hlB zZ({oI{g_PeWGF;IjUIyJa-o`;6WdaiNXsm>Frzh?kV>)(P{Mb@;Rn#`In!c7HKt_( zN27BGTH(+ePX0tVbip_Xa?fu4)XP;%*wj5O8<-~v^*4FL@7ULXQG$Gf#GpTSL*t^% zipnp|nO8JRC}|BVFGaZZ{m&RYfKDgQQxMDqh%x%$5Q6AWzv_zH=s%SXu|JZ%k3;nw zjLy_O?H{sp2v6wQiIV)I!6*0s0G`YL&xp3@O7{r>{X_X}2-pK!BYV@u28Qf^BFjz; z>G`SPZwJsD=+_jEnd)0!<7n^nGfA?vxSwTHB1!hKBwCC+E_Q)>sV;jzQXycIgh0xX z9;uYhp)11OMUd^Rk1CE<-hi?~>TQ88g+c)Ly(2vlrEL&NOf{i z=ngnd9$3fb|$+W5uF&mQ1v}B>kalw~X(>q)Vsn(pqR)xh0zGK&T3v(^)tr zatM+usw(}os(xx~$$t2-sr^z~PBqp2b8T>1dFTLo2u0!m?9PHQh3X*f;$ciV%jgWD zKR{-rL|fT1nqD_F7?U=d^)sA`lYO}Z3=wx!D2Ya_KnZVfVU9oD@147)=hc?>2{S6Ul?&<(tqb+|6 zI0VE+Ap&|SU>_e;x=#dc-WE{{N_{#Ik5x&k^wK{73thxIgac9eAzHLd8bM)$@G+YZ zZP|vM%#QexRyU(EkUUX zb&!BtS8%N8mg`q=?0f>+57iz3<+IPFp@D4e&_>yG zELTfL-C{{NdiVa_`S~RsSiKZUx4xJ1ROgsG@l?c2aT0Ba=2CTami_+v=HmR~`sU{4 z)z#yQ;oyhJ2M(ZPe^BYR&$LJ{i;Soa;q1b8QiKW7rqMYb-CW;YU0pFoC^LOVK?lSN zwMhfyP`0z|Dhbi%lDsm|L)Gmd)Hl0J4bb&4k4lIWk66iL?fTk^`a+CO_JAhzs6lmk z9_mWa$1qi1mRHl_a0oR&y}=<2o4-b;)cyrux~e*u1|!r~F+Z@*$rP_J`pgW6ua=K` zC!QbLaLXPo^(&p{XJ=>FBc0Y0g%$FU>=g8QALYCD?qr3w`3f_^Fze_6Wi>GoHFGRl z>DwzTcz$D^{HL$9Brh2?C|r0>tEZFMg&vc>{Oq&O&Q8xSU%Ytr^0Sw(UcI=yIy*lf zkMt(@#nN+$3f2V?|HKYWYn@FZj#(z;H7uKqr+PS4+d0+H(-KMD%8sxJS-1;vNb9T0 zOss}d(s@-mRsNdpd;4i9d(mbWx|}d8O4%KAT?9?m(MctAKcvrmNBr0hps7wcp9~uo zR><^SU@Xc5dtY+Z_SKe16$1vVE~OhTtM!Teto5HgUOq>0N4CNpP}(jauFzV;ak+wf zPHUT$mm=Ky{%1UK0IeKss944Py$6j)mm-PiPrvHQ+UP%(9zq2AAgNFvhl90rCdGgc z+OI6nfoD|pZxZRueU#)M0&VG)?i1jLwetz=Z{&~A|33)+%^pCfIr}Kd1LzBM9Ia+v zEDKEv6ibVHQZ@mwSv$HMT7>jOQf|&k&0@n8OpZ+C(&-5qW~Sx}t)IQwo`Uo}TfHvI zMbS2tP`h)( zCJ3Ykx`Eh*NxmuV1LYu`nwO*yK~Qlzb{s8I+?^-W@` zqa#ewI)B0dMUIa~H+MHPzk-7#QuGRrnO?!c!gm6PRo)+wo*a)=^Rg4L<&CejCOfnq z8x~7c7APeP=I;-RjCysF-YYn^o`5da9EOb?wqFhm5p2+|HO0}UMDOqKFD@>j<%y)P zVA51dvpKd>V;>F^pBDXqFe?UVFIi4_@HKmCsdhQL?lDEh`Ls1i}00=y=bSc z>e;C<(1NNaE?!dE7VZjK7Y9esAZY~z(WQvp1tm+cozZ9n#E}tkR|vmqNqn;~w#tl- zN9Px3d9pp=_+Fwur@f`66=G&;yq1>6TR zMHEb@OePXTnHhdk`%$~Ebe66_jj73Gswbu|uP!g?_%B6Vyx_XHcyWDwOIx}*%Vqj_ zI+;RXPD1LY$>NCn2-yfBG1Wb(8jO_ba2u(SDv0#(%?mz%u=W^^+*c7%&e>78tu z7;BTMe&!vPY_^}Bh_s|qC>@qi%ymsghv_QP)RjYGgiW|DkZdmp*9M!GaRy`IhK=-Jt}29)&aB* zqaW~QGLqE;grH`n=%T+hhEQU=pge|Sy6K{FtQr%S0$WL%+f}3(C!@t;*?ql6c}j@T zx`;KchXD;myvn7x3N?%#4&3e@LFF^7RfYgLLB_u9ut}XBmlbcw!0u`-DMbEwiuswk0zy1s$ zb?n0)K(o8eN=Iq!D>&+p5MqgJw#N^;$k2GN0R5^?$8QCgPNvf-U4n+YySt;@*;LPu zN4|E=64eJ?SFfl76)Lqu8-i+Q*=VM}aW1kxZEZ78HtdM;W-n1Q0IgACE7BVE{%dn_M(x`O2r zM@bfHA-zVTRRB(vRsUBCYG_>49qX}Uf0Cz9x&$>kWBL5-oO$J8^}yspT_h}>e;3uX>t7Vzn87X={$3zcB5=MD? zDFgzu+3f7>4BI?CG83*ZI2RZC3B(sKt_VXXWD@e!fY~yNaIB}HCsRET?VntuUArU; zxv6`IJrJ!25;Y;ZhOG>!3Pm4?WU)e;hp4VClu~;M%FrRHggEQp(g8Hp3FjlRWl4kG z{8XxsK{W%Qzmdh=xI#)adbrA8h_Fr8Qo6E~$9~>AfHr?O2JMg11V-j1;GWYegm#Zq zlezV~+)N>u(RF+JNw~irIA7=*1kUB43W43Z|Kq|zb!*tGEZaj^Ez)E|lc ze?#yi^nY7)rTYZ<4n|Vn^1 zRNZ@;!t?)ZXtD{A9vuRh;!c~TaIsvly08I^q%`CJTG`Y4^>v{jdg1fGu6BebC_>?h zo^IA!$UQ&&?ys+L;%rZl9w*lPJR1tJesf_XT!T#E&cua+KAc^`%2NECT#=F zTGev^?PXDC&0hEwiHuBjP!MVzKNtfGn36sXzO(Yah0srH>!(&v?ukRKt^KN^mgxSu zHdw8U^9K%~hfpMX7*5*Fk0ll1(ED=wT%zu`NnH6Qh(3T`aihS&*r7WEcep@Bx>i^V+efR6rhXO-HYjF!s1>k2ul(r$r7*Q^Bz1m1#N{){weW!C1&NqF?gUa;YCAWbK-r zp3?F(8*1?uS*Ft&0&9!9<%=O~=WLW1loCssYrqJzO@hwJGC+N00*Z!)FBAQiYK%-O zlFX|>(+Hi)puKFOkc5U-D2M zjV9KkAwz8IqBa`fGmaqW;`I;SC9e}xOztGv!L;0U=4D<%V z=n|60=bDb@N-E*Waru$D?*^|6K%-u>N1~W&LWRh3yn+A*bCoH*Gf$|-v`pZrgmFVG;vAoL~`{} z-0zHL$cP~Q*~z83)mY->;=g-@!QkrXO)DH*E;Z6w5zvXHgshts5&bcuD{iCzRC)-c zeo`D0$?d zg#Q0Qa6Fs-ypW#;KYgFFLgXGvJ#3|~_G=DR0*ePXI>*OTKjXs|SH0?JG@sA8?^-PH z$79x&MI^(_F4IQ_Izocr{)=rTn@&R1OK*e5dtOtu@@bVrVK$wshlR`nxn=SKfeq!? z7!X+A5f*y&$UinuM7US=E-K4EDEkfs&<;*ABRtvT`^jbA-Y^VV1}~EM@1oY zhz8Eyd2dhb(j!oGp*Eo{?x)01xvqOjsy4$(o3^!x*igOn;_fxpn@f6Lp@j0(81U2P zYpdXMV_iAf4Yp5waLZ7r4}lIwGe11)0}?tXoVH#=_75Q%(htKy3D8&9)iKug`{5Dx z@N0kOZ;8_7JqC+oPyGEgIe&ZX7>rQ*ukQUK2CLH(KNN2yJJsS^kDUj-sST(w-yF6r z(qUhJ?t;CVFvH5X6Y+outnn`zQ93l~FtG*R$%A$qqVKSQD-?P${o{4h^qmU3F4<}JlAu5W|J)?AD z+JW(1sGhGt%UK&XfEW`ZmdG$zMM*JID~JyiEPwp=?c0m<7wH4Xqm%cyH|OW)6DF01 zg^pWt*m!cRkG;m!U5du;Cnv{`v)QCmo~|X^kX9UDD&m$Jnv+XA3ekf}i2~2+%BZB{ zhs7KN^|tP-mzQwfyngrU)vI!#`lvrt83Dbfo2G-eM`(~=laHLHlP394@U1>#)RY+Y zIes`^Jh0n2VV}cp2j*(NI6XaOr$P6i7ojWm*Gdq*Uo7x#$Ja&$LJ9}K_+riY?|=B` zU;X@7fB5qsfBUQ7t(J2dL66{SH-}Ep^hSM@ElV_=f!sn<7>Egl!(;5Gro)yeCliehQd8d`v@~>iYbtq1<0)GL2$%tMfB=qV^f6aZ1!%&o^=Jdp5Sk>S zWUrx*_xSr1Qc4gSI}&{YZ7zmPp`g2ydC`p?ZKFFZo!;7+u+<5O0^Ah>$akyK8%q=v zLH$we=;+0Z%M-m$NbMERz@)Jx)WEsK*_yI;qRl(xQi>q_V7)4q-F_Rya$ruG#6X+3 z%4`_pZbQ|{)ur%XwDpKj2*0DX$6)ZLFCqQr%^NHSanu%24&TmGHzSG}2&bf^0%$ly zaVDF$ElWbvZXQR>Fv^M=IE2#)^Uz9%jkp?QNIO+vB8$X+6;L`ECp#PB#RWNR;ofSKpCz@V*@D)H=ltb z^iC0zB$Jz4Y9k$mCA4%0XAikIcIkN%hZgWm=+`|?bBvw?r(B6{G3%v$w;IitpQp-& z%cCt}vZrZ5SOJoRrOAqP@*3@KXc%NyPtx7D@)m8qI_?iyW^_T zheQSoD+@RH^j{0>KWR=^msZbJ*WJ1Z>y~Qw5chg2Jp(x&(-$2o82ivvi5ScZ) zTv!+lT*^x`<=h7&^^=K@GW+!Ol-^jTH+w+Fl*(;~X_MGdLoSt3b_n{b+PX$;KpZOi zpgBtCF44t4hyH*8@2{_ClPUJx&+l-Z5-sFOnExVlFcjS?s1Q$p4v(tq_t$572lVaP z>`XHxck$|AI&`88D(TZ_V0GmLpex?E_hb87SM@bAy%6H|?*8@bH&h0zC}KRCAgz~m z`uo&5&!RKpMjv76*Ekld<;D3K+7@}n)+bz}$(W6pz5qAYdmb3M`0euY67S0nI)`g& zD}*Pi?9oo9wb|H^5aS_ayr1)hresOD2?E3dXe74^O52e)Nn4PBGX|Ajv-ZSRnY&PD z6_9=fVnf0T%&450v>6s+&CyJWd{G4^r+Vtp&0b*fwSTq<;Ph?Og0`_+e1|qP3@UMI z6|Q38I1mRS7g6gLXwO{m36o2a#s-jR$ISF7dH14|@p!^b#Odi7VSTv=1lRfbMZ#SA zvWH%x&BVjxgH;qgBD?NF7y$Z?%UF|x?X}sGA+i;wKcgkD$HgAjJAbk=*I_h+P52sgPEAM9bxbQI@r2l>y#8P)F`NQtIg#L-EoqD5!uiz=`a(bFnv<)g9V@E1ZSxw=t2(Ic=7viWkZ^Hu7rA0Z@*KO{tw z5uslrR30Bd=YhN08KhIGf|zBr`Xo$)3DQ@}?oeXb83I^jEmbqoMH9|ux~;vtyVC)5 z(;U$B-m-M;4JJy=_KM>|RbE|yfWLI_6hefLkH@Qr$9M0q@9yqjzI;XA+xvUwCJ3!; zR_E197I`w4N(CLHYZ%94y|nk;_4~hv<%o{>@NPq_pd zCI)+m=>V7Q)SEYNUcLH^33$0!USHpU)rwslt)yjw5=UdT6b{70J|oi$&1SRdyZ7(V z>$k1wWy*`?YCd0Z`RmnsBL4R7{)J!28^6{1ZPiq!Hk{JpYCeVLt$`$Ft2N!e7^#Wr zL5JO#k+ud^xY9-KCSdka(u_9Ba4gg&Y7t-~d&jmBYkn)^N)}|Hjkc;YM9tDhYbe4W zi;9q*B5mQ~B{kAiM^t6>8Oa_Zhz8IyKL{&pr!JwY8p4o3HNF+tidMjHYXrh&?ym;~A^5Wv0i|F~q+1VL0&}=f* zbg4mKrgDWc+I6oqP2=(f^uqT*TTZ7_6_w9?PFMp$-kh8IYL(Q^O|{hiEgxy2Rf;tw zWwalUq+z53M8;qy2=}|?V#W2y&}B+K9{Hpj8&M~*ay2x?SscGm+3}t8p2I+lpn6%{URKFj#M?gVs=xywnTvCS) zpa;s`4V7zcA{A&LXxm5Mv$h0EO8e3oBy1FOeLL?inx&^!!?{=kPEPLUcf{)fbkZxf zE-44lgvrYq=2U4&Uhh93+AkTcC#DLodB_&9>Y)m? z`p*`vy!w`1S9U^OrUGuFGT*Talb-x%2c_Tt){cC9GJ>NW75hA7NuC0Lx z!?tf9Ko8-=5+8|YD!@)V0BzkXZ5?c z1FC2=w~0bk9t|XIv_!Q>@HS{4bWM!rb*FWTu%UAgwEiS-0G(aB;K%u^7@Zk`*pN-I zl9Z~Govv*4YOAaEw6zn*Y&3W0`WDWuh-H8dF5JQ8Lk}W~aafUpgoG{H5)Xy))-5uX zWk{Obs0EM-79fPKoJ0xhcqIA+A`>JF%o5)hQPTRM?-Qf+w1HHkwWp;&9Vn%ujm9~k zG9h3t{kDztMmP|@wJ2^6v)pDFacAKhq50o3p8%RcN=cNAc>)>*MTJ!DbpV}4=-cxI zTw){zA=b_z;8q3EzC#d&`AU+Zi+ z{Ac1fEu`!Y>uR>>@(R==L?$k_1gEEZA=vHhZHNl0Y}$oq+Qe<&hX(4m-VO_f@ND8=l;Xgpp$ zKEA)cL7`5S#_VAA7IHn5e!S|mr~owsnyTs!>2HiLe8v7}xm-?Xr+<3=r+@tIKfZkV z^8D-!%Sol(U%!9-?&jU&>Tx!kjVD=lwIq=Wfy0-})pSbVzz;`x`9@M1EUP8u=v?^v z=K5z}eBr^XyfV&%6u=1)NPAa(0F9i+T*+7vF&kgb>?CQAnTXU{TS6>}OgI(c^ih*) zE+DfCxs4%JoAQeFCF=?Z+-kxTwgoa~vw1PD8ko)s5Fmtuqv()&KHVOxs4^AN05in? zke))WEeTrx0~Ktv%&jcXg;J7xQK4M5LT!SMsxD=;+55(a@RPzKlEo=X${5L501OkR zqx19g%S(orj;Qs=2#q8HXJ=jl#6KucE*vyY*XtgmFkH`VxPnn@f~7p1Toug{}lS z%HK^i0)zBEI7}L3y4)KFnzOUEQc>%*)vsy>MayVQ((VK3<_2RQNRQwK&uFGCfo;%L zqy(ih-$%f78dTBoIFjNQ@mMP*$Mg9dO?h=^-^1JS=Rhp{cs!4m?+Uy3Z}* z42TwLbA9<3XzXq73c6AG)5df8=f{Rm{toEp!VlGl*n+rA=Ot*YaStoK#Y}+n;P+v$ zkYFA=9LYSE*FF0k&||*?TDK+KFdzeAZCcMlA06o{%)ncs^1?9qsjmfOL*zl;u4ra) zNYs*DM0p)ml4LNq#?}lwr)*BpsWfG26BdREuey)6gujv|56dQ%6m3aCzoYGaYO>q< z`VMF~(br-h|V+nqO1FwHt@w*cicTFZ5P<#(k`8!n#x3pzT#Jy(ZE*u zAumlPO1mMT_rB__E|xNy7tz)1PXlfAUN+*`4^5YV*%rO0o-MQ*00eypX87inC`E@b zU-#SUW!+r_V(ydDz)sGBJN;>Q;S0Q?(kD86)~&_ZkI4WjCrOm$sq3-7O%BHcM1sn@>D_Hp-G32RT=NlF%rVJOizuih{+orLaT^F5a(=m zX*AW&-)QqE3OhT0&>9modOj7}Lff+9RfsTS2~0X2a~(7u_D6pDaFHm8m@>Pjq0`f9 zG=LuR0)@7!C^1M|!z2}%yaSpTokL}#?{RcIn%vyn%}&p{J2A|#CB^3o(_CQ7ocp0--(9nhzztQvU-G}(dHg~!Ld0~!}0Oh$W2HjrcmLg?g*rJ1FR(LGzL&Bpfj zG0|2(Sj!CD@WKn(VMWTT{CPV8Uk7*1RDc7=VGzA zy1F9o>({UK4rtdg0y2;KZaTNZ#qC13V|$$crDA%{z!uLFnk?!*Whjpvut@rJ01@?4k4SljFaB`(~l7m%h3G`O8-$ z7EL*P>E4wYosm#V*$G+`iKk~z$zW&pH{(t{}RJy19tTljIeDlrMZ|>jBj%Md) z=a-k4nGG@_l5F}MGiU<>g#(2E3Sd_JcC}GWFK><3^!ffnmQ4Hu1Jx`!$Gg{#X_s>#dmSdxp zY2N|8^@x6zhiK~pjfLS5CfdFOdYQ*EJnH!ijdOI!IMogr=cutdomELiN=bMS=zC-@ zk*1oJs5(PnSfXGfWBI$m1Y6OA&{k(iPuQg5A8aEFG+}FJiwKnA(DgdNM3f>Dt-|!x z&`GV((Ce6l75=bFoG2j-KQtjoG++uU)FxtBiF8Gv`Rj zdf(_!TQb?g%9yfHRw|otxpcYRD>%4G^xLkF^hLe_v^@}l(DYM&t~8-4(79!Q93~BV zGw=tnYb|>M`G#d5U47+V04MdOs}V%Nx2@1=S^eOD{~gfnz0V%dRHWkEsnr&~eWrUb zd8nXRTb3DVKG6?9l!<8MxeFT3Y^EJiyn(VxV;WYyd-sk~&M#hy-}7+WM$Y*Rh=qL| z+8>_Fo&v0&_mj{+b)WxR?K9uUD>$A7Mcwy~ ze8Ncwh!vrMquSaMj@nmnc**kaZPo4Vi!fl-Aw(cF`!=10bwDy100Ip`P@-riBWMXg z5;O~>L=AG;R2J;qlVFY3Ri&MfDKq;n&l01wmW492F2W*15<03~#qoR8_mrE^Mc3L8|6H-&i zCYag8NX(#-rJ=Utj(+t)q?MoX6&%T8w`hw-=Lg{fchs_z3p2DsF6G4}Cjz2jx~f7+ z*o01q^jBL(OGyqT>aZ3dR6#;+Gf;Tqp|q`WcL6rzJ41PCJX4Q;hkGp4AhiGx2kW3x zedwfy-zJ3_Vhhr;nUuV#>He@ML91$aiMu4%kg6XVaa{nN3Id{pb`JtNMALeng)frPBrjyp+1Cc#cC-D^8_>oxVNasOXWUKK$`+v_5^)qS7Ks{GBCKi#tBR| zrIQ7&HJx_ZdjgseSg1HT(KWZz59*{4U=eg#9QVua{XYj(6#GO{8jdD!>! zd%f+!G`#WzG@fATl%q@SR{9aGlbn9*IMl}#EYU@?l&v+J5nqaKpMVBU1tZ@_vFNTKo>XD8b7;=iCS~;Y{mtTG>3RBu zvZUHxOmoD+PuCM~Vc5;>9Uc4YufO^Gum1k>@`aD0^sRsDVi|q-bai$0#mg@+iR%3I z{a@d|dyfVA#ASZZ_|u~aegxrYzFghj-re8NyC742gXwSbw37-Fix^8MvuX!$>V` ze!MC;wl6;=$XqU#cpieWJ?ZVa;$0ZD{#YC&OU77CLv%m~*B1b&DhdJ-mANzgAs zlSP-lujx0fkw};eI?)jNLPQ607m9uCW_`Qp@#*Q=baKjgpUp}LW>Yqv{W5ZY4B0<~A^lET zqZ4MTDEdWrY&^*yI@pd^a13k+lCy^*Zp|79EF%VY^!omp)5X?WWF%VXrt0)Q{qZVP za+DQG^_|b>Sjeh@YI;cQuPE}*ideWmO12(Kat|f>6Qf^HO7Ej2|7b8|QmpNxB>!Yl zs?mcw{4SK_XF^eGc>J#S2|rP!UY`!7nC~59{3k*G?I+mQChTgL-AEUG z_IE%h3;|M#j4e>-he5BVhpPj3FR_7{ciotFCNr~xRV{bGPE|79ok5y?YTlPBIvT7> zuC>n?Xc~I1U#X*#JGzIRg!xQ=jCY?~BUxFbs++Cy>SM75Etyy2IDpgUw zLf4BDH~A-itfI)Ik#cET}UmainE zhLIDnV>}+QAbVnoRjHZ6u9LY`*}oH!7bt}=W``eIEvV)@Vjr-2)MKC1*^EMO@9t)& zr%H;I$m@LEZSC^*xs2|`{MsvwsWW?y`^DmqU;p{$_KvN9exvNgi?g${@pQrr7U$gE z-cZizOs}W7zq_5yX7Z8_kg->OTbI!694aAb#B{XgYG_U6lgX4iyngo<=4^I$c6v6O zPV5N3`PDl8Un{ItDnDgAw!XZF8RbFeH#cwp!>@mbkw}mIQjYn2PA(lq&1M<``j*@D z^Uptj_2L!gfBXL1*VnIC_p7tBbIQUs?5fCedwWjkE%6k5IUP1eLR^!oQy~F<-)r={f==mNHa5Em=^>)Aw*Fp7O>#3Lhv5um@3(4KVyI%#8(LP!F zG;%eos%fVaW-6jEX^tcTscymzLVnnB#k~@8pAIwS23rc#pe>Tr@;9>BHW8cHM-S+W zft?B~lB$=KXrX!3+*RH;<(1Jo1ESqUPs#cO+f_CrLyT0a>CBbwo90+68zbThz3LSCjsg`_V>JoD&VHsb-8^v z;UZCH5LbH>*OzbB(pH$#iWsf1;}smTDk?WFKTyVs?A4Y z%TZwHPWsvGIne)JFg^gacZWg!--|zgSg88n7rxK3{)YX*N_t+%PlLl7ez&{^>n@b! z9!l~@BRAxp!9mtS?JXSL_z}WV=8+Gey?fJErprqdWNU?hcUk$4n?9WPp@UQzBC?l7 zn>m73678;SgYFOn_*pV_@8JafUssm|gyRwatLeIf760?h!Y z3pbioLjJ3tUJ@C36Xx^R@(x1>PTC9JMLpXAG^#?#INt%#g}C2fELfHF`yuF!f`|f! zNlbtwAA3RHeW1X%6UvbP>uPqOAiYQ1cMJZ#Ec(5M3iiZ`axdZt-C8!Vt+W-GQEm~8 zN^GHD=>BkJI}Iv7Udn*&0IkY*K7_8R;R84wbGMyHwi!WcT_XEKz0rSMbV9}Zsya!B z+t`wSN{{hfOx*=<&WrZZ%#AoI%-m|Or@m^EYnohZ<|a+Ch1vu%Eef}5 z>u?CWC!nDf_)>rQ-~n_vL94$-%hzi*gp$j3Umrm0#>7w-b%Dq6NJF^#BxWbvLRZSR z4gDQ^%OF=pVHt_W=RxS^-R>Lk9I|esYH*GfD$I02P|&>t=*40_o{mSVynd=HgO^lK z_4EVfWlF+nM46|$%DAjzZ1l%PNiGRJl*|<}$$uMKt-v2D2thdW)4S~x(2-0xE}43W zl0GKZ7Co!w18U#DfB*LG?Js}+%d^unJyPn=(U_nRDf#`mQ;)*M*d- zZx8qjZDavSB7}y39}V!Fqo8U_Dq)ba$nMXxNaw%uvao0es71VR2+`rKqY7b9S&ObA zs0D3-bc`i&xtud@q8~j~Gj#Mj)KpL_*eS10hQcHf)I|0`YoEUx$sW2ALudtt=ud&? z(m$-H&le{hAh|+o_CJ1P)3Z)06Fa2D=r+3#p!WyDdg%&TXuby>4!U$Sv)H(x%x0N1 zG*Wy3Ek6Hq8lZ@~h6G)DsbMU!{f8VtJ68|ICp~Pbsu$D`Z(*R0CpF*|R)6^rrdq?7yktt4F?Y#E<$C#fgw z9v_#F+~xTmEY?EHvWF#GHHu(~hT!HF0V*=_OAl8M>o>k><=*Z8a8j?ID!O(VL@JJ$ z-ST*HGJV+9rPC0h5r#In$zN(yEVnC3J06LhppN#)WV%w0;%(YAUGd>@NxPu|CaW5| zA!+va$hhqn?KiQYB6+KZgo#!f(E9Z1qhr1DG9Z;OSrQGZ5<==#>6WNyGd55ze-A)M z#L%f!ElcoYVEWoxc~=H95n$ioIw(6K*23e7lmYH1Fo8q(k~2$TCL?FsY% z8Lno8s(a&PpPX#LE%Z^auR1+AoSPfj!?w0-9SVmp8@i)U2y9D@!iQG1-8XPfw0$IG z#xCIbltQ@>7HdsX6F>miq6h48#vM?`&D7B0KLdPI5wxYW`ZvmY)Ezh#gk=2D1mYR% z?7cU$gK%o7JC$Z=L=68B0ts~EPLu6QU*S&@pwOF}n;b0CXXut%YaX~)9^c;H&rZ)6 zGFGeMkA!a16qWLf`oPQ`X!%+17z=4fagHCauir5hj3=Y9j#dR^^z4bs&^ZOd7#Vqh z{nb(7fRsYkLos)Z6(b;&tDC@C*ai9V4A2 z=u+3{{Aq2aY9%kNKwj=_U%YsM*qb+RuCA^upj47*5sXR2yS!2uo#BKI!db2!C$s6@ z-QC-_Z|PhQM-M;y>*}-dhsWd9lKPz-jr8a}`whJ04>cZHn?`xIPy+#= zACM8luqsg?Riye|nE>^;B!=N#T4%mk-Yu4IuiyXXSHJro|NQ&YqtP#a@pli)0kZuzMK z#P$1I^st-4MR$Io>{9E|<8(Z|U*6LdE~XcsfA-n=`MH&7N-Tras%oezH=J6;(FqmN z+d{tm_FI^QY`r4Jgpglsi+KnWVg*Tb+Rr}w41)T?q~e6+3Q|On&e(Dy*~)_&Whx8- z$Q2}7Wm=-`!*!(tSX=Yv9ngtBy?jL;q_O~Wps~ua(s>9|@#C>dzrWY-rr<-G-jBEn za7ap_$wf5GpwI&c&_if7^pVsytToyKbtu#(hV&2WalKs2wE#+j5+BZ9(F(V8yPj_F z2aq|ik7_`aR8<{8D#SXZkt>}XrZ>>HXG?hp<)wVsbcBfbFq%<`Y<{Tlv3og*#uP&y zK)AD+f21=?MpL5hQ{Kwz3w%4E_UQQ>PS3W2nv`6%S(Wx2crH~>*k7n^8LdZ~SW6~X z3H{qPtRr%^!4l)Y(vS&YGM;IfbNb1#et;qKTOV;CAXhB~F#UTKVb#_SmUOrB<7|57 z9GN;aw^)Y#Zn4%3NnikX{b6Qw&~j_~WWpN3EX`arnVypgJ1GLSk}=lx$4=krs34;f zWDK!|mS2Ux1BUb;jC}X+S+QYTGym*`L+v?Ge|x{v`hU=$pVL(x-g~^x@d;xI;120EgnZ*b{dv%o7$xzuEpw zp8E=KYJH!=I>|c3#+ZO$;pfQPlJe%!?h`qa?$`9ECh@H^fWbk z$5bz%FDO|+V%-MLU1MuhW}2A4u8Q&|1X~$v6e36zBrj;0AYveA0WM09qL?RvuJlr< z`S2J`t{t0B^W7w{R2d{{N(t4zL?E$I1>;Jfv8%XsRZvhUo?~c=&@YNO08o)<)K$CXq{qp zKCsNXj$LXWr6j_PIH0AP4aZ9FVn)gR{eAa|MNx|qt*NnQ^7;>G35moHy^CMbOM z8Sa`*W~bwsCPtqNUteEi=j|<_KorMT;0KucA;-;MZ~Gtr^Pk?leM@${ad~-pb#?XS zmtVem_3DL@1L(8`xu~7prL%PmfGMLJ`-3)GyI7bhI?*boI-5^e`7IN`Of;MjMq6~t zUxS=c3%pfY15SudouyEtjjqK)&`1zDI;69y3vE^{M1*Tzu-2152clIKP|z0BRvovil(!)_NSm)=Vlgacw#g_D%pEDJQU1|x#dt@%U? z)%l?k9d_1N9Fov!LSR5Kqp}V%66bTq=wivHkv*h@Eng-)wQ}YLcvMNuU7aXuOQb`e zQ&E#b#Ox>J55+U8+KFNPef|a~85OGMsF#EfaK2L|fIpzUN6|;h&@`aD^ko06t#3Uo zLB`w*NPtquBYg-VwM9^75Ft5A2zB4=9ZTjJ!KHVqwM`=rGdVzJB%Ls}*X1<@?S5V& zh6>tm9@t0b)8iA{aOnJVs6B`3Z|1kX{QrsVr#F7*{_|r7RVdUhw6*(TYr5tCI3Ij! ztDZ~$r|v(;r?amL`ELu)*TC7KYj2cQ=VAB>Xtq%KgbD#}W_CUSomA)2BV*(uB%_qB z+UJPd0Tvrtte4>+dOAtgVC>L~njcq7eaNPR0v*O-@WYX|O;bM<<7ZAOO}{|M>bW{v z__r5y80xK+FxEGT>%&v7wewJAS3#c!*C(KjQiVhsh_kUn`~(=--##0fYHk3209~6; zVY$O2q{-HyU5Lz@Rx7xh;O7T@9-s$rNl44GxjClu_=r|f=TUY)b9Zv2{?jqlH+)o- z*J6s`KdnTFv^j&Q`e|IX?@x?y6q8QSvg=tNId z-21Jd%DsjpJ`U3GfhV9>;>#@qPe9{9B;f!!$@uY*8M}}tpm9|C8-(3yUrHQnjp;xCj^ME!X$J%3-+Rb zBuO_nH+~7g5%W3DW@_Jh0vi9*oifIcACpU(b1Yhsg8FFr(5yr#OwmJ6K&RHD<1y_{ zw8}esK6zccDuTVI7_wM@a?1C(QuIlmT?)LJIrBZK0Z02-!pbqDR~Pi>4ZNXuN5NN zeHBJwUKOII6g*O5rf*_9Xhav%))uO>lhpczltq3~@UDBm_uOH0H@C9S8cizx#(ON%n*!O{Y_7w|`lX6L^Ew7=Fxq1L(1RI3&)o7q%szRept=RblG|<;%I`|h$8uJE# zel!r~+2_#I(xE`-f|*vE&ox2ORoIQwP%uH1q@cL50)C+eDguTqWFUmt%D5$8Q$w_= zCCQx7Z8%i!o+!$VmJU$9<%)`w+s{%~`96OaBH7*X%~>MHdI(i8U9;v zQYnZq&D7WMK@4RWR5j3EL-2a~0kmZ?Q5R|xRMuijjeJ6Us$`>m0y^!SC!m)om9)0a zUXKS6m$qP~fJrMHpJ<~?n=+%KXEHvu&&!I;iX>rXE=ybTG2gyo&0?O3Sh^Nzq61IP zbf-O^fW{yKDen-v=G&R#YVMy4j{nZ(DgIX77FI}{c+_7bx0_zb<+-M`n#*DzSLW%d# zCiKNrc2n{0Zn^5O@^I9|$H)3fy6IH!fYvi_KGmAe#?HaaB1zg(vA9cfv9muusG0R8 z?(`Ft=m4nosWx(+aV)RMn(R>R*+Rqj9Khcc#57f(fX=%bB+|7=!Z0h6eFzVaM{jQ5 z{Oq%z(f#i4^p;^VKvSI4OJ17QllO|cVIA`W4jHir(u@X8vCQ*?+E93#A*cDY?&MKV zT63q4(>z<~q4Y;RXZ`qacYF8l`u)4NZ{Ocs-`?EZ+}*r>_wD#(^qXJ*hPvL*@893P z`|Rb_`RwdZU;pd%_1neW{Srg)unHefCe!QdYt8t}%=z?H5o5oLgIaw3%{PDlcYlw^ z07DEubx4h{HBjxkM+XvZp-LMlB&0sbQ17f4Wl-3|>JBG*4p+zOKBQ=&^ZnV3CcC(} zxVpOf?6c24H*Wn(jo3_A#0;WHqQ8`A*aQI?qAp8C6C#gfEU#e*P};9cB5$JBS`$ka zkajLyBmB@?Nnn$+ro&HOR=`4_->DG(yBp-KYN>LiGnx{`HRi~5R3AU!HXK%g4AKdO@CjS>*%$D{uZlAWk#?CH^BrR?1HLm;lv z(m*rME|g@WunacZT|tg^UZP(SR^c2P>hrTBJ*=Zet6up}5vrW!wZ8cqGMfLFiuXX4 z^Mc(H>7g zXC7!%(NDCP@+8_^`^f)P(AMiy<752xecCw$^`2e*r$jy)ALE~Y4~YLm<96`0|9@=$ zjQy>_&)a`SW2|p}LUd@O$i$c}z!aaXvOpnrQLv&EsQVRe9*!Qz$9hNAa<%YoNm(Rvq~G)z zPe!ZN+$UnX=xB5{t;pWz^N(9O_^{E5{jP#F>~#RGT5MJ9`SHmMcnUOO2sJ=L{_eVz zUN5We4`a zcV&MR2hiATGm1%t<(qs6k^qF0x~U9mT$MDD12bld@^d2Wbqc zbUlE^B8FC&AS7jBGr|B&R^awq;slP_j z%hgqB>+=5s&*vaLhhaEtUcmvsh#?p|dvNYX;U*@N>6`a&UR}J@@^9ttvn$He4Y&M2 zZ9RK?PDY)|(8FnRkJhAz$E99%^r&;$lM$YrFX*;xkjAsqv*jwTlXFxrxrKa3fBE_^ z@7}+^yT3U)IXXW-yLxr?;>G3V<;CUM`D`{}qrz6?voAh>0M%w>gYFYK!!Es1Tp#?;ks6vaZi zBJ14JKM<#~I;cHXdM_wCGq3VErr7ODvqN$szx8v#!?XBn&a3KZN zHlg9W18ggdR8UwQ=yM^Qq|~&FpHvm7JO0FP^#FQ(Jk%jsT2xLy=>ym{@B@e+N~FWV zh3<`hSs=wFiEt+@xC`pzPhHa8$PA%q>m*8qtZK$}_FU-Hs3~KMj!lM27i{@($fdBk zJa;RXVft!_i{CoX>T~Y)e_x^1op8qNO|I_uK(PVsy#*atQ z_r2rO7v0uR6N+{lbs_Rn=i3JTHBXdQtmXhZT*BN2Bzx#?`3%aYIl>Lv=-{M=VcLW# zujHY1WN@N~dRRo+cuz)?sa|KP+f?5)N{+SD`zOh>bUv(>Nva?-Sh1&)m@O~gV$89- zIMwnBd0{6?`X|GI1r)3HM#(k+nvifq>_he>3!V&!5t7Y(c0l?Oe3QU;vD)+`t9jPI zKB?+S;hSGQGwq;s(oI-RL8WDlZko$i;6aK2$f!#h;Z)Eoq9I9yk#u5-*1YacNUI#b z$pH~6uG?wo)~X_}&7QuLouuTHjq=;N2a+mL5%MH~t|<3o3kbOL%2ef7nsT56nwZ0G zDEWm3+w~N7@eYHH?DWW>7}K>KGzGhMLQI9QVM!H22hR5lDC&A(a`4}_8x=F)=3@X@ zG%;*j9+_=e$qtm{Pli&=Ca^O}txRZ=f<%K>z*rv~`w7be_w>pa!U2`8nxn9)g&&%{ z5X(gll@u2r|1%5p4xmeJi9jh*r-5keqtAzfy_L^xeLaBQXmzK{sa&~=bf5ot&_1xcziUvyT8K-N+dR(==g6o zD+kc7i7ZiSzO$0rX&!mhtfMjm@pXGDs20&*O012v4Qme7c%W-v!z%epD?re%who}7 zBOKa!)>!N55Shxy=Jz-6UtYcpXFBDcS-qE<5e-u};m!zjE-fbQplMW9KGw@fs4rcL zJp?p2-fT6NtB2dWdp0Fvz}h=Xdk#>l-W_ zSwEv`4({eJU%pHqK0Q69pLbtWSR>V}o-?N~#dqfy=!czUZgKDUs+&~G;wJJNT zOda&Aj3a9msE(d`rsjULO61`n79_7cvs^9=XqX67m#y*GMr$Z*)J8kdju(K2AnSWg zD%@Vbs@P205Q`qc{E+TE8&GiZ=uQmE zY})^XDw1kyzm9M!GaQSTvAjQ`2bB1Su)k!i>LYyg3<-QBs{TYlOSgr#G%~FisL_aR zSxYA&Oy_}MOf8lR%}<%Jjc(apBLe2@G@QZ0{ggZPZj@{t%-Pl%RN)Y@s;}XL7|MXE z-Jl|eV95R!7Ax2#t<+B2HeyYQl&MQm8j6sKmej&6AB{WGL#9fI8V1%z_?SoIlg@vC zW(hx2hqADYh*pyW+oeL8VQBWj18Cxzw3&|TJD_dnTB?=L9->4Ho4Id~swl~Oqh$M0 z;`=l&-q;@{+m8lyv8$;4r^G)FuJjLpQv8n|)&B|Od@xi6)$I_JY(13Z9!m1w_|*M} zJ?>>8f0}qMM+`&F))i9MB&{oEC}7EPJ88?3kQJppfUfzotx5LKk(WlnH!Woot~)p) z;%qNr9a!GhGW>yvt=ar(FQosz?O_G=Gjw|JXYsgT^~B7YD;HVy>MOX)uB+K&>CSC* zJQhdyAuO|0xl3zqw}M*b2IBO&&x}uAz;2}dLf5*(!J|Z;xYEw*J-!ru)aDhB=E*|! z26OZPqK++mzow!jE)BX16D((j((+fZ3gXJsr4OPSPycimZTn}bAOw9ooFIHamPEq` zq1lrWk}DY_sfW=?GVOB}G(%uz{lKvvq@ z5iD0a`Uz-5Yud(aI;Cjcni!#TCQ<=2fG*h#q6@!*Lmh?=ODdgHQ_IFHIGoA8Qor@z z{O=HnKDPKoscU62lg#J$GE2R)IEU1vKYaiV5hf@Z!U!2}n=Yxwno{aIwnJMFLkG~+ zo+#;@9BECRDpl(#oJf*>%>L-^{+_wlS@iiW4dGXCkV6O1I0{u(s$6Opf%t=t9J^Uq z2h!puCT9AHYUk3#cDA-&O?B7yC${Ef5%+UdGz6g^Qr1gLLnM`qSc5=U@dD@|(N4b* z=3=qDyT7}-yizsEj|QLNmR!erjXn|OBu#x%i`0pJ1`xq~l$}rij+dU<^^pQM^T&E| z_WgYE?)uHm?G4wpubZ1||GW9>=Rd!?y1KYHXPA(W5d;15<%_c^>xd4c&o9py5ic$g zP@PUsr}%iWT-@K!@8@$YIXk;}@$%Kh`T67OWO6(?Jw3gh->g)f``6cRXQLSdZn4lS zvnPK1nSyYD>U5&t67ckoH@M`7&Tam$Ag)uonmiMrE9y(Xkl}N6(lmqU&vG?iGK$%Q z74MNnxjG`#f>ayvC}|N$DoB)uMj&vrlvS1R?(XjF>`VnT&ptz2t5E6E*iBM^5@ez< z(GVco0L<{))D|gaGj&5!l}U9RE%NqojaF29RBD5^;`}AL)Q5nYzAB%P=J5Qfc1#t* z@1x~I4~Y$-FC7iFI*C@bTh&}+)BX?3KZ#aJ)exd;?l7buez~eGzSiie+JVDm*5&4E zJ%A*#jkqa&&ZRA%#;=SOtxVnrSH1`ax;lfnom$C-L(if+nW^)-ADLm7ru9a_Yo{S_PStFOusZA&3q zuU_f!4D@u4l}vPwPW+nzG_R_Yg1QWws4WXDToHLM0pg>B8HUwCznSD4tWI1HSg1QV zzSiKW`q>VkNiM`DTKRo2B!8He9}d`GvC)72h9`l$3blzL{!bn5ARARnZ~39>J5=tc zw&%I@e`@=GbO+E>Y$r-`4^JfRM6~r$l6Rm@7olZnecnpv7L!$ng@nGI?KCUOcRzr( z!VaNY^V-Q5eo5-`@K<{-+334JRykT(k(C~g0x(%cRc7v8wRu9u+4XwIF>#`{5gE`552cjEwJRHfc)&*37 zTNeAjXtqDa#{vKm4_l^q8-xy|=s7T?s<7=+WPB{5r%tlxjxmL3ZV&nx)_)lPP{cw) zdO|?&DU|yLVL0wrpb$x|8hrnt4(w3h?}m0%oIccYMjEjq+JbN@9RdMp?tUpki$$4o zn*->HMpotq#Ff`Rrz()JtwyLix3I-0s@CgxXyf)<2RG`S%pNX6c^H8YtQ~kJoR|t- zi54Y^L`MnXi0N>{4{Opxzk>w}TKN`AE94H4D;Xn&{f=(x@^GZJH6F)P)xG>+AWoQ){lrq4%F{{Wg$w3*B+o-ci3(t5muCCPMhdwV-OJ$K`eA1IE5oUQ6oMKz~C9<3f8 zR}aj$nq(Kt<-LBk>-PHg=KY;cmfzoA&+jm53GwFo_4UmSrJtRheRlQo>hi_q`6btj z^UJGCA}@$Alvd06{QjQd=eJPkSwb`|<^!r63ketv#> zdOBq|PDj(xXt_Yg&FOUX*{iF^)$)Q=+_HMOy}da*d# z9FMgi=p`%ER=^&@c)mg$tuz9@^%5o~pxY!0Xmw_QG3~C;03@gX29lW&(mLT=K`97N zl0C6A zQm+ccDhg{8Pup2jqX8!j%kS3zsS(3K=rD~P_EZ7q*bs2NO4ZsrB9`bz#mml1%niN= zP7wX9zd$p3SDeSavShW5ONkTp#1FyrNHZ=yyOvxPvU}5VV9tga6;(JytnF*~Acisw zt2(rZ57^%W{3nXoPIA0taY-F*cn7U*2@Kti>rFh&leEJ2g*jW7vMA)g8a^U-RBwl&yNjMs!*F4?B_pFmE(Vi7(n>_`2V?zi2bd$=e7U%boNytKP9j@ z%>Y6S)q%Zwp*B(HXu>vcRl6s&*X^*CH&Of>It8t~%z5oO%F)+q#ZAGS`-yD#;jn|A zjAz{Oz~P>a<%fHK(=+{y{&>vlqAyp%^liL;0-h-78d4hT9Qz3B6o#8>1T-yiG=G=O5EQ;T{Q7;v!PL#}XjMC*#$_N-MRRQlH;W zruE3F*iW>Y(H?vNi<#JIW&>;JR&EuxyS`Q77Cxwd3qyKpML=H$j%>3GG)VP>HgCFH zYgK5nr~|N9a*L~D_+VnCcO0YLcLKrx0eMfe=IqA$(WFo&Qlc z$L41r-CTib!P42Vt~87`;@Z~ileyU z+f?66Am*b3a_NnwyB2YO}*fmEbQpZHw5LJXVx)aG8P*9;Z(aJobs$w6RC$N=WtyNm{DS~jQT(^5k zC9H(fcA@n{GzTr+BJI-0kbIU22ntFoL(C?Vaz~QUHyYnu-_6c6LUoYXVLf`t?l+hZ z!Gmd|npy_@(|IWu!zU-Bo7?vgr)M*IW-Os&0y3fjf~5_EiIPe`BqMafFv$WSSS2Zi zEIQnC-4l|k;`at>3$+QqwsQw!EkumTV1aJ+#F7qP-Hs;=kh^=mb$2?^Z~EQc-<+RK zC%EWwQKqSA_Onq;FgnmxO_j=kWpYL&0%{G56P}DblN+1mt`W(g+7I$pdJ%4h)PfL) z-{0R~U0uO^|NcD$GRc?*MP@WPxm(OnC#TDY%&KZ-bj1C7Ly;>&NE0|=C%U!t%^kQcbv34|z=l+GaRZGBH`l($$!gIyuv z*RS6qKORkg_q*R^7ep%E*dOzt2aZB=k%VLj5P~qMNr?i}n5@oEd2rh7ZA%j^l)Gi2 zj0i(KFyg#)LZb&rwUsAIM$ESB%AkAw`t|3Ze|~;`PG`WerPf_P3_?r4b3ych^5jK1 zQF)b$H2ZU+WS4XOu?IBFstp3P%|{3g;7=yy(-AY?5 z{-QI9ret44>fPPl#l;yV!XcVdD%%#vmew&{N+hW;z2~v+G5|xT$AX9fXe8-xmA_fa zZb)tbQIZfn35kZTXa#~T0nn=2l5d$$pv{%A%d#$ONXaIDO@FY^idORJT-b&{WU8Hs z?nF{6;3OCQ2O>26pDx5Gb33lxe7lu5 zQ3OC}25A}BKLoHLa|QE1VLK!34>A(A8EZ8Y-NH~2ZLT)_0sXTR&2+UFzP|%#!Z`8i z2FRv=AACs9kSEp+);4xsklJ>I_9Lj>0W|-P+1>g8dNf)+==EL_d-M}S*d1#3J z%ITTTquFL;3yyp}fR>m$w~Nq*6#)RB5T-HIv374<2I`CTx&w4s*+y$^J3i5o!Gmh0 zn3h1@K>DLwjW~^eEFn~?9VLzr4d8GyqxU$@bPJ8u;@Ehi%IxepfQBI4Kyy&iBDq52 zF^7tdj@LKp`=IOvo)!ICz)4L*gH%5VKPYDuja8w^LZgtH7KheXcGXB~UwthNhvy^| zPg2~#0W@;lv@i71$ra72qRWOx=Rr{PSQoK$+mUhi_>wL|T1|(bSCc9gG_jr?*uI-W zCUFRbR+4Conk!KVICLl(sL9>7J}$W3cI_!FJH?5Q7)DfTG@>UTEm!x{#iO7z!!Ayr zaRm!(2EFZ6kMNUIdsD`pkDLGh?EUF>B)O8M3z9aHboYoeRc79*zH9Y;{|D>-(OH!z zBf?1=+27t93WHAOW&S{2QVLO1_H)ND|*icB9>Lq*GB zoDT$&9oLG9G5Zd75FsBJj9cfByV=`}88C&Ai&31bB#c*&Tb8cFk-+v+UC@Ek@z27muG` ze??}yg)AGm_R7mLYv5{<;YTS1X)bdJShC!5LvS9eg3)?~K%s8KocxsyXdEDoGwBY~ z@n_td<}dUq^6Q(nN>`f~PPqN&-=1GKE8@?LDj(3HuF*n);*$pCV)^I|Xhkd=e?Y?T zn!PjI+`9qYgRc>`E+o#RcyfIM`lxPw*d0$#+ZT71oPYOQO5J^UCHejC`1-p0yn8!6 zoK_F3-}-}wAt>D&>AP3_4<4$o2SdAT68?^Pp3Tg>p2YtT3u-O2m8x>c-SCOO6S@^W#xl5 zTU1yFgnj4afUlvr-|H>W|KorB-;7?SRz@r`(a<7wLCq#b(rh7|prd{Anu?^dbi{lu zdEWt!{^0!ife1$iz{7J;Wr!g-c2@x|6R)qYfBMs(Xi?5e#0U!s}v4?q9>vpFARq)`aTe{97!o^1(BuPL0I>E6_HoW^c!wbgL(t zzYh1-oO{3sf9g3%8kZC_4pmXDzRzA5X_ku%x{2V=`&s=}B_Z4|0$J2zrEM={ZuZ0c zVkmr#kqnygfs~oYlcD|TgF%4(-#))Vw;Rx8t3Q&9=TX~?x7L}q?cajA2D&-JA~;*x(aQXuxOW43`TM+rqYYE&xxmrUh3W(O3bHl6$&N9{r)v4zN0o2&i*{CD zr_#lS1W>4f=v4V^-7fTVf7GHxOBNW;>Ht~3Gl+rt#ZYapgp6ceaT3Le0itaLZg@@$ z-N$k3r85fsNW!se*{Pt!hc#GIL?l(-ft$!KuP1anNgdT|X-V}o0J=N)FJYBV9GvN? z?v$87a`M9!eaAs^51N4Y5KqSFJiMeqtEc4`>cZ&JxSNU^7Oti3<}UR9~<;P5tE4j~J^R8cKgVF)i5PtH1s+D1{p z0rfoQ5~Wf_-67M?N-?LZ3`>7$xMWOJ6bHTrm&kQ3G@$V?oX%?54hU^tA>fm$mf;dX zZEOhbU0Oy48X_`dWUd$^XZ;wZ+Q{x4vTZR27ki4vu<@d>nADDyHa$U01hkhlOeB+D z0j6UDv^1ve*ATctY5ZwXjSfJSC>-Fret>V#a3E0L4G1R-eW>Y|#waLCjgHdaoF^V$ zl`llCZ;Q(?EF2Tq70aN%563-BB8o^;BqAR)(hAy`iV%^hl5swznxv*cX`$}Kpkg8=|N8e|KL6)0zyAHV-+ntC&fCrUPoIAN%TIs)@Us2+)2ELgoP z(wFD$$B!>-rW0+tqxOC2Z2{3`g+R(^XG%UE_Iv%`?>6g|KC#eHIZ&0dr8czBD{l&; zqy`CR`48(v^}}JmJ1`~CV$SLHdZP_T4cKxJM@Fckxm=M|Z|XAS&dSr5dQ&nzm54XUq-DiY^ZLwIc=?=nv$gVh(-ccm2abL6yH3gNpa+nUk)12BG_E zKW{|BHAYquaRB5fu)T~R}KiXLN+` z5U+GVU6>9qh&395k{@BdXu8kP9}~4=E+n0_n7RyU6fz*WuaSI_^^=l|$IAvZ6253j z7y>@!8OPGuYfCXFbv=Gdx0q|!B#0*W!1${hFRtPMCZ3px$zn(sYv;@r@K$^`I0Clq zH!wVEODh5aVx+W=wB=V6)>M%ZzN!)={y61+(id$?$u()bq0S(kL)^O^vN?s84_(!^ z`g=0HKSoDO%#|PjEwd5@kflvcQ-Q@wq{P2G0ZkbzX04iGD=X7QzSNA3vNeFr7Zx;D zD>_8G0qt$>DRgzgg=#=u#+x)~Bx)%iKBI+&rJn-V6Wnmz1R}w5Q%gTD@5JVCbR)OT*09}_{#*D#mqat98G>EXDCAkvf& zD2hO2<~E?ABS|S)(v&i$p>LG`va;@rz4`TySF2! z9*P)Q$J0S-^%>ytaA5Ro)|>Uy=4tc%uw0yv=iTABTy6Dm_2W`+5P4jl^!W7xNzQC8 zAxzj_ndv*s-k8=i)qaJyzF~r1+Rw^`&OGdo`~8t-K0Q6H{EcaJGJ$y%dmwcnhDoQ< z6j85G!l>7R8C9NvE>kodr8eGrV_Bifq+&pjfBp4W`ZUiYYaaACrz7J}G_-mqfm&o@ z0-!2Y?9yQQT0FrtVh~71I5bX$gIE>tMBSSQU>2%(zFaWiw7x-;Q{n**!+gz1j5kc} z_Imi=7Pw*aM zVjuvI`2?-b#3E@KLeAceLB+fElwP>hk}IR}A0{aIZ^l?#%uTJRg(}SD!+W&_u*+Y~ zi~3W+NuR%6ikQE+qoPX}2lQ<1+;CbMTNbQJsC0;$EgyL43MhGC_of?_(ZQMxs%}6> zleKhHhldJElcRFi%T5_*@~Y3M)7|J2p8&)fz}_~t|+Vqlguw-tSuJ5PTTGH zN5y%rU2}Z=Yy(0H7(zeV|2h3wr-&3fM9cYhT(MiIK3aMEQgE-HAC0-`YR=E^wgH`R zj8RJ~5jw;eltgk2mwqd}@Qsz}qYC))Rxc}XbYlrvPiRS@#csLlChEFZ%j*$*!Be=k zL8kRLB4m-|QU|A=RH~@-a;<`&B4fJ4;>pb@3n@Qg>L$ra{E1x^WIxUgC0DMaNLpA> z^#~T*H2zE@eHT$6E+Vd2=^-e=jNiI2K8T_IQre|@UJRz+D2c!zwY(zVrsCSg+Y$fA zD8(bRMWG!XAxzMd>HRS}x|-oHan9nExRRNJS{!3J@~+(t9N=SiTA6wR26U7QIG296~w&${^Bg_r}WK1Njz z3dIdjJd&%oE!<7yzOY!vt5oav2#B;IiCN!Z_Qi!>@T}M?? zfzyTR1IgA<0_nEo1G)sOpHnhB8FJ_ zp!+(l>U4G|(1c=c_(?+`%Ux#yhW+3PXh4>fCOh-a3C15kT)hA3r=K=@d)RWfdwus_ zVNO`pIK7{a`^CeFjy<0a@8{!^iSvBqU_}E>4D|EFKD6EJhoFD^<=5k3e>xsd$Aga} zry})Hy1|ZrClD>`6*KeWYQ6sW@zY9gzgVreo0pfD=MOLI^>(>ln!h3V{`^W?(hJtA z>#be^k$GN0(8JC&FDcgwZ7yrhUorl?&zPB9Th$Qytxy@`SU){IqxRFMPju;ev)S$T z*rk8zJX_$uW&t#cqn@5VkWx1o-8m#M-bt;a%q01f(lI!}L!`fegjK_ybQRTuM&wC} zPUS$qzP^6^_|ZL>eP=<{eXXf_Dyn-GFiFcyW1u`72nWA736nIa{)brwaw3>0oXqfD zD|<=|74Uy>6sEP1Tqa*D!bT}IAmb0C?CtIC&wu&ze*cD1ZTe^=U=(3QR2K&*%5*L> zz$;JBiCI~x2Ij5Uhx^|50WR%^2w6zGAW#6LuWBA)wxB~aj8XXmfdPMD8fH-P-;Agl zHxPcytn|H>uY@l6qQC$H`HXV_KSd6Yywv#UIM4w(Nso{!6y2;Xnf|DEdbxmV&&#iO$tCC^|j6!zU{L zXs^10lU%9V@6(xCA%{5^A~NH{j+N;#u)n&1#^D}hOutV{+HOEQ6|9Xvsv9~VUIcI| z3hRfVni$x+Zn`b~9i03@Xg$w)0jHv#DR+U2h3aFD|IY%4WCEplgeyfsD**j<(Y_s= zuyS_^r6N1#PK~hpbIsHLFrZD>7sU^kgek~+1oKE zAN>$jzfBM}vf6IWmCUkSkMx~Tv7*gSKra{B2!Q7`=))QDqkc53ynKU{A_!})7Oept z9g>An{ti*(2awe%=$_m#nBN;@y(d4CBHkg0)=X8 zbaYjeIMYEW@eQ*Yqh=RTrCL%69z3??EVU#^l&B;XQYm@#z&91g7<;71OfUFcu@Ip{ zEXs>zv>c~Tux%qnc#OG%vtPbUUDk?L96<)#nPpg(Z7`A1vusBO?aKD(Y!#K0g(3Xl z_e8r*)&Ui7Er5kmv@&O@jphevgvdrrX+mLw>N+Iwpc_%nWNPJO4msLEdcQA9*9h@j z?WCpVs6F0*CROOli+$X!b|xv=a9UY14lm&H48#%_V319WEhTzL$?8KhbaQ+@L$=5iECu2 z0+H&GOsVvAS3qb`iSL4o+NSL-5Qt2COCa6AR20)h1zD|{=pPOnaEso{1~e0uwkH)} zH_A~dHC3vajlrMmubFTaqF7AaS|r+i6on&P_%+(3fD<+w(7WBPzK0-7de0L&3RtnBxD9Ka$etbOL0v)*F7+wb4r-u8z*`JI0I@aSFV)Xyh zVu=elsC{BmWJvX!$jcRyE4oLo8`9JhLVJ#7qFPJFSJLhFiF4=Uho3OMTCa5;>2Y<= zJ8wF7AZ|%1auhFUOADHFO_{D%ktDwEDHV38YT?(Si_GK0sWXct0R#}Clj1)F0?@>e z@P7RGk-kPr?~LoNH5cVZn~k2N)J1bjQ9=q$e@T%skOx(j%PWclP^72@&h|_sD@=UwfLLRfB3c@+fH`V1e8w~X!w0h~ln`v}ooGE+z?Y5cFk@gWFj4g-NJ@~tOdR6B>Ot(m|V4GrQG zd6*%_)yMKd>2U)YhC~PtB+dK`8!iQ!1!th)(v^l*b&UsW)(IH>ngoF9yD_MEuO3^T zs4_QxCWXHX>FMe%lo(@vJ>tqFR)7vDISUpWLMcB`xUFAX$r*w%2SB zvsZw!NXkrOC|(UAcl1-Y{Ao9!t*5c;xjOn?r{E%BdJ?60gi<_0DIOt3V}ZFUJ^zjP zKPM0WyP&B1W)yXX!`=hTLVZ8PR>}M@#LDd`)kY}ABb4HsF;~T>%%ybP1-~=!C!-fs zf~x>&k@z-5;TWZOgc=`EgYyrM((Q=n6WBa`pC2JaRiXMwjOI$e1x0gts_0g~=bFYjp5cuq@E|tDBqEGcpg}K+JES7?oKJcfYQbHln&2-Ym-U&?PgY)C6DBZMl#SO(I1ofh&ezm0 zN$7D%@n)f4v75C%#=Jk5c(yVLNXtn!114zea`#T!+8{nkGpTtYg-(WtBTLZN{tZ5@ zS^bMvh^PYXRfa64Rj69vQ9r|@Z!T*zHa|kRSh$N3_AgpI_(upmV*Q-{2+<5|QR4wY*B=#z;eN!HYo7?klWGr6g-f#QGbyMPCZs(z(PJ0@`YEiKINg7!xU zIr;E#?d@9HgHcjAhw~vb243ZB_3QFhA zsA>noUTxn28da!1Xl67I(m`_u7`OUH`HIzg+MhZM2JOYqLiI7%u0i#RbTOp>0>GhD zmilo@#-Y#9_D2Yt`Lor?04Y>sON39epz<+`CY#oH!zir$2q7l&BZTn;cru})2BG)w za&gpWB*=tDECeaE>&B4a>fag5*%_!z-SI8M9$KO6kjs6YRVX<>EKcVK?L5$s2mkoz z`SkS6ts@hG-iwV6W?*SPYr@HtjqK@sAjc(=xfxwBL4JfVSGvdU#ucMF;(?wJN|#7pDlCl!$?F2rRw7dwu)MU;aW2LBt3q z0%dK`xeXBvJcue%s-ro=7!9Ewq#wKIivi5YrxXH&LrP;gPn32tR96I4T6!=VDu`&I z`luFVz(Xs9J_hNs=&bZ&rQc(u34i_TpNR_7_^-eIO3~@4rs*S*?RK+y!a9oaeB~bm zvl39IK1$p96CeO6ZQX`WR%N}_h0xMtw0c@dQ>V6-3Ek=(%e19w$Q4xK>weyds$|Ze zIsP05{$Ht*BGPICI#~b_W<@xRkkH8{4WLsO9~etaSrF4#cTg+Fx=w#hSS$Y^E%$>i zi;M~Xn?qKJ}A0cdk{z82}jI9LN8W*XVGy5&^ zt*sKetf_t&bU%6*ntQG}j2qrYeq8#$6`GaREtreOT*T)1jQ@73Pf;uUgD~emr!eO= z4geer0Vn6_?HD&C^qk!}eygFCxkdhujOB9X31}K{7fQ7mRDmxFM_`OPI!nGo+0PrH z6pv7fN1!9qmsN(L#%%~pGgMdKF%<*3Y!mBtLZZ59XJyUQtZmy=VX(r|(suL&v}$x$ zELAb2)(#|<(tBW46EMGM=HlURJn6B@)pCVX_7R>pXY7hv3*j20+euzovrLGiJmlPfJn6tMc=Ef++Bg_@W z`Jj~{K!vL43ac6Z(j;gtS|9aA^=N}A#S*xz!=ln`Sc)p4hf78b*D6mgm(dGf0tljC z`4L>P5TQfp>&ym~x&0O2C1H+1f$J3%uGWr>y)uxp8SQo2;{1M)Tj%%e_u}4ax!J6@ z2r)Myff5VYv_2-`s*uK_U4z6n^|ok3?9xVWzjHvza<=V#KN%tME3_^NyNoVX=!W#^ z{e<&kmX8ydbd2NfE0~hUq4kqCg7K>^pzJ zX$wsX)}!}eq%=syqySY(feoosaEWvPm=(49?TCp1272Jchm^*dq!=Zw0s-07n)3&l z5D2903Bu{5{hjM*ZH+@3MEMxhodgcF1ey_+o^riYTAqL|KSEgKL93LIgov$bv6X4u zpe^J|G)Q6L`r){TW@sRoB7m?{)g|CzQi{W5<95pgt}8PYloskc!A~V$LtMp~I99ku z=ZpT(|AdYUJ0g-&bG)tm@UU6y8x`G5f^?KfA*49cj1_%~lla3?Y5Az^l70!7wj}JK zdv&`WAq5QnZSxLjIFSN0nRJay#Nedtf4=^5+8^I`pXpg!z}a#-%ZLvYqKd4R2*(pC zlf?0K))!g)=&>(SDpe$OxzNivbk)#mY2`njrQGLk*97q<&3eg7b#~1uaJi5yrL_0tElQZA(sTiK&xa<^16mev{kNDrzoYQbVQgS{BZ-rPkcO7%ZZRu1}Z7F zm?s!Kh*1O+Dgsl$glEkPzwkvv$m_-qx*AqP_hL}-UOmVUs?0?uD6DVBc>G+~PlyWT zx0Qb3+R*X@KN0=+}@VSJ@I&{W``QwmLItffq5~b!nXlq^9ATv|o0#rj0 z&K1u=B>(t$+&=#sf7)&iP4kldL5P($QlVQs9-?)UUd>lCfl`u!6wF-fz^u_~Ek9i!VHZz^%CC566)&`nXEBGI%u z9fy0Nb-vyZ!u4*$9WfsIQOoXA9eqA2%jb7(F&Mg;q|SEzv^%^#ZS+{TR$yf#gEVc? zgCs2O7uukZHZH3NZ`P1S07B^~sG0v|T4KJXv1Dp#1KCj`0^Hzg0?KVqCsRs0D@j2F zh~j2R2ieB`h?47w11(M4uT;G91hi(5Zo5!7X53AkS+cIV<oYB53{ z^gtdr;EsS^QF`=mH=PKl0^&0wPdXF3?jv740qwp(#S*!4Eke^_+FD zrKuGIXd$8hOkTujBB{0~x~!Iq1$qJ+1sZkIg69kSuMwNTa*E-ADl%~OlVGo|;>zXI zZ`@-Um>UK-i;iDBv62Fmz%gL#DbPqt*=A-1hl@5@bIwm z7D+TRwrHc?gYDfJJmEBig8($JlmN3(eY!=hfQ}(M1~g)%$r6On5;8(ZW{kNfpsAHA zG>Q~+cIKj1$oW{#2ni^ti`D1PZ>#NA{Kxa*ZMWU7mO5SaMSeBsY~rk0I+HzwA9*{g zzuLLNPe7xY|F=8=9mxqa=d5NscPRY==%$~3`U&Fw<;&nfFs;?+{u8rncawwvQ_e|$f)e1P7r z*3i4pufM(h_Vn`1T;BZC7$ZF&-?dqc4SkNW3SUou^_nN>dY&N*0bs_5_(@$Y7cc#N>Dj6cFvgVjU8-pylO2xl>didt zj0p^-f5}2`HY=Tj3w;*>Up{~S%(_V$w36472GH*s?H_g4&^>b9Acq@>wa!$$zP_S4 z7RjcWXj}RT`Z1b@_gWO?&}|m9@&JC7tel#*1gJ6q_o4~{ex+M&Z90ds{-jaZ)~$R9 zPz^zVYC0+Wq^+JdjaU#)Fh{p)gF$Jsq#-h}L$|`fx={ef6SSNNl^e@vGVmjbR-cVC7xB7(HADc(e&BL zR9NuBsj7ha6J3l)rx1!yKyqYWlj}ap~9jSG80Hw7dI0=@k_3#Pk z>T9w;4g(X{EzXzT=V#SJED|g@bINrqFPR7`Z(1*a4&U`yn9%XuzUXl$KQqO0Uji^| zTCI@Q!2v-I0>BB9y{}dCkWJ~r3U0)0lV`4l2j4JwAKbr{aXPa$l0V!c9!~q!LJtbD z&ZZV)MHLkSX+SN`>#A=yrATroC<{Kst!Tnqsiv(0VIi+4ml7p09H=g6V2)@~Jpb~= z`+Ffq-H^+9HGsE$`{)Fz5|Y0f2~d6nSRr<$w4H1CKsg!JO`(K!Z^7S0%{&P8qp3KM zg#)zteT87m36=}J`U660F>Dc5YgWhG=(>?(v|=l;i>uw9> z)>i8ZjjACXP^+-!VX=ai4yfnX3=oh|alFa3L>J1yNhkW~HSYl<+k_b_l1=LU0a;11C69 zd47H-7+7@EH1nvw)x?c9+5G~ z;*^KMl5imjpTTB3m*7B9F-<1s(BU&A(XS=+6cCFBQnC=?hokyNI4u!acF3ve7_GOF z38$q8m{S!{B`EpMCD1Y};McUxB0MMx2HA=^{v7U-cY{h;YQ=DvH);`m4J@nY;VpF& z7Wx|BLZhvGawcZXpwNGBMXZO8w?Q~}A+-i|zfRQ{@@WdCcna4`2^0eE0WEF_0eSef zRtVC>$Jt9!*3ZdSz@I}d>tm!=t=nazS=k_^pyVf@If@1`UCAt(+eD`ClKOFz2Iv3~Rp_`QHqo?GHM;Tl+o=$Q$oJ!VmNUUxI8 zU^#qrvk7%K(9;mvfacP|vV+?jI4nV23tz1STit2~!t59fK>I zU?R7rNRbu)c-pg=#@p>?dp@4k1$u_-ywaPawbUlhBAqI}{x~wM)Zyz^)?r(4uP)E& z5qpJwZJtFxhJ#1tP@3M^tB4Zlyw5eeOl8gLLjL1Enh z-asM00Ec&Y!dJMpj({6nX&NEgrCx|6E^0PWh*PDX%D_||F;&JQNhPxD)WO%VBr+rx zcB=nrVBLWB-%eY_od5Z0O_}g56f}~pFtoT$7_WmCDzyd@Rkv2gqgx}|0Z@k4s6oX6 zH;@sh3Mx!$Zx-wImeHu8s_hcT(*@q*=%zDorD+L*g%TD}2aJ~{HC~ic1v-Z-wZ2V55xGFLLe(KzxiN(<8bjzl zzC%l+r%3dzxU(jpaL<@%frb#+ihL>pXzY4@KLPDrbs$>_D=UbHfrsJ5;Q>|-f6=zk zDq>8I4t;sxtP9BCaHur42M0w`+s*b7*6>yq8wwP|n#$gQULFp5?hn{!wIZR2IH%Ea zsbBSsw#$KV*G4-pVJb?AH9%0D4e0fHMGI@G#-E5HX^ym1qNS^VympkX93_lRIzHy~ zz?wt#2SB&k=Cdg15+&db=*M;gn!(L@!OZ*PnP|`;x=XV8?vAR{aS%)E~I_N4d@kP5ZSp zEiJU;#1wTzOdpY4Lac$L*+7GL@wk23!lV(%kkwG*-1GZ4CXt4u&27umyxL4fK5;Nn z(ei`vD_Tw)w3ePkD==1DOCeG^k|BFJEG~jD4NA>vFCRA{!sAv9+^#6Bn=#NsHh|7R zs!WEEMv>3Z8xO#!_nDB>$}IQ!oU6Aq;TD-WlDp0HY z3ad6>47W>gz5p?$T_%T_O0~8Vd_fOozKMcr0=^xVWYUVc4d~Rpj)AIM5Vh5rF}lX& zkI~SOR4gz@%O-V^av2{35nD`&VGjN0s%e762$E9$Ps6WmK)3V&<0qi62!m^74LT+K zg>aK~rA+I(B9{U+(8B``J@2M504VliPs2gGjlMTlt6jM`qJ`=CX#H}&=;<{f@d09b z1G;chC21oDTDnzrCwdD_^{GZYXM`D~YP%hX!#EESdJe=UG6Oh1r3j*H6jn;aDk7ts z^eGgf5ts_%`~anR1RR(|tXCB24uxxe2<=xjd&;3nQ#wZU#8#zAYtaC0tswF=t>s&v zK!^&}#~h!!13fjZCP)+cOF+%{P86qs8hg;Yp44{n-F24I&ImH;oA^+5RJ6^b3No=9 zf@>YuGU{pr+8<{|k~aD8g#%Kt5;Y5?s-G=XhiVsuAe~g+V!)(Aq55d`0BZFrwr3(J z*+=g&Ee`vWw@Q)MMkXWOlWW<4CJs`i4Xdtm92}o>6ttQnAiI>BE~xJHyz2Fg(3L73 zM20NjwB0uEfKI1Vnu>Ds{U}l+M-2YI?LI$mU!Gr{cRTGj|NGzn{r&X*m%sdNyLtX^ z|MG8}?bFXc|M}CWpI%-*_;t)rT=tn8wolJA;c>C_o0|2cGYa?n-4dhz(ur3G8h1(2 zhCleG7j~>Rt2MD%J}%yK>PD;*qA+qIpDNK zEpV?;qw2}F%sD4p3}o8s!0ro_6xIwZb8(OCKvhtgk^drEu}Otj(AEu&hA2svlwJqW zI?XbZbVa1MBZG>Q80|Jeb!i|VF*-nMjS+bW(&`DgQe_hNN#Bq7HpZ-|I% zC-waEV-)t^73!cq#+>hqx%S>`cTWCC#}oaN_|b9u(Wvuk#Vzd`m);u(Ocbh*IX&<} zTZ_rC^)mvM4l%~PcJD>>*EDcR4`GrnSIZAjcD@ITP2ft=U5J$youl{Zr(&UQ1xt2n zmBT^c5{2m@;gk^?S2aw#y&Y9_saF3|;hRs^w2X-dzl#<=0$eOf8R0P#VSp%E;L(3s znN@`0bc}o3D?PZJ6V1x?;070Fz2EGlFK*{fjLiP9TRiB}$dU^_LZqkjiMuj2t!T4C zZ$Ja|p_5Y~t29X{K6)TJ4Nxd>SyyDWUw7)ND}T5Q!%J*C{iRn#IjFkd^d_UP#Ma`h zw3`m!#VG9l*9bX3(x=f#3a5>E;-gMCXA<^y0(F!^v@~YJ8K9^eAr;4%D?(MFZbNP`D#(_Y zbio+_KD8_>LPzAjsgmakghe-Kn~GXY$7l#f=2^45z9NHXO{p(` zx&)N7g~~c|@>my#hzxYott}8$0JUv4xSnlMi|{tY7?CNB>f~cL{`MfLg&wKWuLkvA z!9g6T4duB51rF(81KOt{@$dT+0hvZQX=i;7#mS1!?F&B~QhF9`$K&z(2DGYbh7pAi z{NKIpUp_oDPIkNfFTei!|Ng)KpMUw6e`VBs`tl?KeYyHxnwv|`Q^=7?VuNJGt z;dIc{>sP`Y&qo#sFt<-n$TCb;++Z(Pq&l>Lw|v*zy_jaPP8ti%k=lrkN>N^IeqO0<)s$ zOuc;teNw3a=R9IU<&1bE$H23La)AS3W&o+xg__7CxrcBhsPAUnjI=#LgAQC$kZffR zO2>$*pryf$N+vb5Rl-b4XPP&GREb!|2{gQ_vm!+$a~oRu>&=-2)uSP4)liv(DF|j{ zG>zN?+N}|#ksA$Emxhek+cDS1d)t1W^!?!c#icPy@ff}u7kY$2kxuYs?ni0~lY>-n zlDhB8bO-Hqz6zK-%0Y3Z>me1YknHT2t#x;W>fRxTbiXOPb_ThEY#t1N9OH+frR$A; z)JN0i#2JJi7ZlAmqL?3{6#pNOL?fqpFvkfB>vushX%yD)j$(dF`9@G=i2$_9BYK~EgzZvtYrunfx zMk&4nZh5~V(WwFI6Z+zwtLP%p)zMWetJUIz|N7>iBHikgp zUo1;0oFG{nokZuwttfh8-HRbS=bqUXwX;XIIHsZEiy~J??nt+r?eTbA={fG)a7jU@ zP>X&Vs1`H4bY+!{tayaOsbd|AREe*TAiNWawW^Re9Oy=okpcjT7I0d&Gy%!rYwSW6TkksQIkmuegP?&06`_-~;Ab)dzC+aY|pF@=G-ik$ufz%SJrL^Cst z?*2!hR>XoR2ZL-y41v(qjmTdC@`bWXOmrII9k@v-lo6ev(l*}Ha2+(QP<_wWgKkWbdm%lC->$lh4=2ftz%{cf**bZ)a* zZ@2m#HpVF_*(d$PrG6-t3lS!hDzuLeOSCMQYvhck>1BR!b*XoJbf=r5>lB&xe1sDw zsebIa`!PeE4v^XxU%6rE&wr&E2&#t%?~haC?*IS*|MW>jK~(q;nO3~2ftQm`?*kF3 z-Wi;9q=2klxMYL$cm*{JB@|(yA;+j{E5eCA{?q;v2!mJ!$ixj=wA=0AKtK6iC{-r} zPExD7hD=RcA|M+M6)O>bM~fg^qZib;fn@0&21&XhG9i+psq(=<21Bu1(Pk?RK|In6 zG@ovUhBzMgfBW0t7;lI$THYV@3ym=Gh#}0l!!aZ)Fq(JVWu<~WCv*VhbG1OaBAJ?4;>7$LDfJSC9N1rs=|uO zL7u=OpDGD*TfN0t&lQZ7+)|xdlVSsHH5>W39ZtqT=-a^+fO?*g5;1re&10n282D3t zE22g?x8v>#cVfDOuRy_=aB8x#TxXb9e2S4%p(P|qkS$DHyAx0$N8;j9>IBwT&}LIQ zhgKjSmV1{ju2BN|!>R+z1RT{GOcyWmR#K`oXjt7H%>YH=2v>^!P)I9oN2&G$FjoE} z%()R0D8)vbP3ah=c!W|sLMgr(b5){kj8gnh3(cziOG7*7--53Tf?_v?QapnqWN4=A z?l?%}cBLi#k3idiID=QoR-!IQ!1M<6Ap0XQ7b9I|rcjE%1Im>_}7c{m=peY8Gl2tg@g)`Lso!&C=~qtB&PM7_?O8|o(r zpqx<^l`bB%NE4dYbsqX=UYpC(sZX7qbwk1|hnRQ&2w^-4n&96As*qlm-csM` zZVV|da@gOl5G`qJ=y(|kF}=qWn$(S( zz;u}Vs3DSm8-N(#*x!(?pvYB+&}NXqoKQhF+A1oixI2TQ)IgYYz^uS-6k;xtq*$4g zulr~fG%Ber3q{n3&Ol~5U^fi}mAHa|+Bw7l08K3nL6G7egxcuU66MebZ#lt0vTi_2 ziRW0W;mU-7=W}0fXeWM0+XYxD(~@i<8M`4k5$hAs7${7MX)t)EDhNL`Vj(IAT#Bcl z(ti0>@o97y+acOUk=m3+xn4AU{ZB6+KJE91<7xl!ep)RT&rjQ@?FNE2k#0B4w`e?*UF*?!uHZ*h z>E#+}gGPov?UsL*{?Bt9sn>j@!Cg(|A#t$ifU zySKO3*VoU4oGg5+l`{O&h`PAh1FjaTkIGdu8bm&H1O^B{0-!R3N<&mt5OhS%k_N4B zl@8Gsfz)d2k}H2Zq!dFf5gKi^YBYzR^owYnvC4u0zfe;c2!l2Yo$92S3!oD*0CCdS zIBs&aVz2=XCk}@GI($oAS`~s8k#;V9y}|*ac8pmQ3i+({S|p)hvDOp>oB4xO*x-0uG^oZkoEV)sY;Jg1+KlD4JL;NI~wr>A6oFa~xDbsK&+C&8qj zZRjdJ7yl4rRGDuDHX0OWr$1>eB0I4GeccsG??S0I!d$7YAwLjh9b8ux$>K?+`_TH8 zavzFZVJe2GVwu9N3u{=lg=Hu_FG1fIOKll&+t1R_g*9aDcRKKno~E zOvSz*09rr^?vFq`31YY9OaKvk z7h$DcR;?%z2utG$UcDbzG4KX-*JQ^bdQwP%P(J_Hic2Ubk%Y9GAtq6#s`}diRaM&< z=^zODSHs2fNo%e6n=JSDl|Lp%s7tNxulz(^HcNmHN*Z6)Kb3Nff+9Rf2|fT2QpiGS?xGFJ?$Ckxz& z3^t_|gE-V|ts6ao0yl#qF@-3ps;V%agaBd2E)k&vp$~eRZ+SXA zuNclm1GmvY78+sF*7M>(MwdUlV<19&_0CHEWU0gcCjYsn`_rI zEFoJi)~j`Sep$Q9{9SMOqk(GRWEx_HGLTf3d|ne%$v6OKeORmJMOu8ZFR9y%S#=@- z(P^U1+T(A({r2?qB%=y|P7Ul}z4OA_tyT*9NKt@5I4$3!Lct+z`M$1w0kKG0@bI9Y z)iXLqL1^?-wA*Qel`N+@eU||M5>-+Odyu!@wrKzzKvN~vW2n;Ts{*Ri)xrUnmZCT; z`ccmXgOoGd^?Ph4g&d%=d^9;6HA0WDax(e2RHfvPBV5d#n{(%#T6E?4T3?Fc>P?UOoPE$Q$D z`PqpJ=*&q3LAWAW5sPz>I@>6D%ezW37bXZz5%Lh2BTZfCRuUvjYE?bJOzB;?US&{P zjgGA+Q0ij8*(OX~Dy{`-0?cv>xaux75@esS;E2-EF{`}>pETZ*g6r)aV<2C3Cj0HU z%%Odh;xRlc6uN=9xpryf^OqRv)LAU^`?LhhSK-nlo^G|{Z0K90;)>R1qb52?dmk+` zGGo+GCk(_%y={$+7{R=VppX;JLcPgu_=5`(u>idyra#y7#J@ zii7ZVF5QJ2{TD|c$6xrrgKv}g7Q5feXY@>Bt{(#g3f0lbhiHqyAUnWV&yU97q6YB1 zI)4kk&QDAfst>eXL0e0g75f<`1ZkyHRQVNY?--@{n_>O4iM?K!J(t;c9cu^2yN7YvBeg#+m@EPXZ^^@7*#%1T4LU*In*X!DzfM##Rm}0 zEa|wY=urz+o#%(`_L*fjOqMb%_PC3K&Yk?yPnGH`gYr|_W4QY0*BvP7yR0ud|a!GMAOx;*N?u(M!;3vZiLV^5UEyx#K}N z8uTSp-ST*Q+MX9fH-jO~atZ;}Q5B`_`guUQ;L_5LC>+u{%o+^6iXjxScB(z<(j>13^gdU_Ty&hTv7@G8?-$a7Xc&1Tt$Ma2zSff4dsxu4g_L_Cb1tjf)|1ecljc{nI9zAHJma zi>N~}sCvcbZ3|T3NLRb*3SE0Y?4+4x1Wl`tvuy40( z&H-8HR@#2z9wKl+6snGqey>>&fx&pFK%h{4q}CXbZ%d1QH++mZAU|ADo?D()xLnAW zL;~$g>Zx9Z`q$5Todp))zw4b;%*mM3zE7ssB994gL!%fzf0$zwD#a+OJtlp1WBzF` zJ#j`v*`yvKZU*&iD1jxuI8ye4hv7KN<>CTbqks#3q57!u06MC4mMxAn|HFr${`2p@uD4I{vHO?5{Iq#mKQ1^M z^^)-Yv8-Fb^L9-&h`5BqM@|MU4BppFqnpi2J6xJ|si8~m@r{v1q|YZ-wFqc)|9Cun ze*KjtJmEu*6Y6+4`6PQd9<=;gvG7`*H>=0Rnx-xer_;;!!}}w*0groDzZh7r@@V*e zr(TOQfN0($ zhz6Hl`?zjaSeF*yaDM;QFaX_}+mQg$b=9U0W5pWNAJvUawxXm0#r39q(irqHxTV zk_;!REEn3a4yyhNxNpWk*LUOphU zT5U9m4W_wnPO2m&+cIxQ3BgtL+j2{d3-0yje#9S#!n+y9 zxmkCacrR}IIRSM?b*v5G7+KU&8Uci_%lkov3DoMzg3xup#XRA<{>raa#_}!AIaa7X zIH6LptxkGnz9OwgLFjg#4_bwP9L)KDub)-Es=BVHwbql{YT2?Sxv#wZn z=ssN!=ju*WlDf?k2edJOQ@!nD%()de2N@F_NcTRE4NZFT_sBX=lu|;IGY}ET%te3b zF%j*XL~;mfbY*@Yg(IgH~NNyq77GR++}#1O|ClZ)1=HZ^?{LXt!@`>1?mLIhC~RGkCBuQ+fU?Hgb~QH+A3ZiL*u zv+hqbE8O%6v^pm-5RiWcw!%S4rEkYARU(6}q%jnN^ym$yTH`@Oc9{bRy)0EpInD5s$jN7eqQpRas=d4Xx`c3guvD+W>`ZiJA>+w)LQuQNMTS*Ss_;1gJCw@l3BNQcV6V**!tF@-YMx zf(a8ufKGXO(l^*5kn{?Q+>~U@RsO~LNM(xR04e^HhC?g-+7m4)Ge}4S1jx3KF0|#( z2q;G;wwjbg8&8MBk(Kstryndio{m5N{PS{6+3|SNgUNacOP1?gFT4Q?aF2nZ%gy;n zkY8Rtto3G&wNGuiM}rVK99~c712;;m)n>iYb}dS{+H9YgbUB-(o+H}1%i2DD;Jnk1 zcG7_ldLM}1ICI$l_W5=9cF^P52c{D&lX4uk8i(b?No3@u1C?b78f>B%LJgxA>~^nj zyU%ZLpFe;8?e+Duwx6|In*C^Uhu?nt{P(~A{pm?RFrLv)E%*?+jyRaEqU#GX2`M2V zivTHJ0*HKwrKlN^3Ay@af!?CY?krY9%Z4qOjcVRpFexxyn!Bk@-UB z^VXkZb=RYje0PliHt`)$oeYv4FmJ*A74EL_gVFkvIBQ&aUClvhQVw-4qb>ulqK=a(bd8w5qN(YQFSd{yz%e%g-C*|J^a`fA>He zbR5$oOMUrDLqtYx=(mDPTA^Aza-BmA*)n^hDYIf~R~=&enB9OL11&+x--e#o--c>B zZUo~8CK4$}tf1xJ={{&HTv~%RtV1}J6*;3-Cl^Bcn4A9Wbin?rrG3Qpq$(s>j4LjGn4502wfwbDK&`|K_YU)uz z{PHKT(xTZPJk(MXt;v=K5v!{3zX)hEJ#FeEz1#97WP~23ijUx|h*|}rpk45(qxh?F zhpek!O1)TVvv;GhT2T~o3K8r&n8UUkx2Lh^m1FE5%*Voa? zaEnVe2nVA{E81+eMXJp$Z*L`?gZ;XA7!-Bi4^`*aDZiywWNL`W(kKX0qDLgPao}M= ziNv}MXyS7`<_1hk63x*1+^`P`-QW)borp9X{Schzm+1{?;3`FVS`mbG)nyZAAZOJ37Vhm zbwpSwYYe%OQw&!r-TPTuvMGfFG?4UoLdhdex<4GAo}RKr)!N4MLJ36!$a#h;(o$AX zI=XW3Cp40wlMQhlb-DnBHH9kzl@HN{NDiYpgBdzaD4lKS<7=Nms@xG*j)01Vy69|} z8W3e!0^z^CIJB0w)C2K^OG|=|*L0^HQBAvM1Zi@p>;nx(jMM*Dh_!5c| zo!NqU1!Ng@K{huDFR(K?zho<8CLmjhAan`SJYpS~KI4yfpEtYRVY_|$?YG~4`svfl z%kz4(^un(z`o7U^&KrUQR>$M)N_HSpRV?z%_ zpxf+qL~e~8%cJ2=Z zyEK7PJOO>6JCK3asojANp}8)nYo<1!^?+1)0y^0cL@D<~m0#02sAgYDOOQ%ur@;hS z+=u`J2j6m)pMo}^IW>>@B8A&kJnW&Y;Dm|NZ-W}s`TrHTyXH68YLNjy#<#Sk8$U`N z=c=k*g;6>^l}#dRW6+$TLYNcy;svk6oSr#;i&h}CE6r*fqsG6sE7{u-Jtfm%j{kLt zwlTha{6tU5+=;g0btN`3fl~YpD2luRy(C9ha=F*b#I%w~d^E9kfFjEhL1j(!q{Q+e zlvn_5tgE<6vaBFy*)ka-Lm>ngzUIsl?%06-N;FMsA@BP|aeBZUAhm+RYA#e=vr9lK z9U_=hKM-rsRv5~3Zio-f<%fRobwwM{=aUw2Syj+2q*{My73jsIyQKApS}HaQt6&xO30#&>apr@Zo!BS3S{hWk@3#0s$={6VA;o%4$ACXsRID1+XHaQ~fOdg(|H;ZA zl9Rw__45``CGrEz71@XYjZD%I-v!Yev{qz>-BG-%CD zq6(NuGnF21+kh@q*NT=S;huO81Ia?&hF;y`^8_MR+&02?s#==MI}|OJtsBs)tLj#z z=M#}Cf~7}P620Pc1xUm!1ep@0$ct_)rrw~xDkkHp)D|cO>Gup9MhmH&X{rDgiTY#f z8bRKG){AkyZ-}T9Y0ICkdTAyI16!CNjZvq?Nl=L(dZH>sMJq|RP~BWtIaf3nszW%H zPY|G!hPU_IinA*R zhlAd;O&0&RTfIcW^<*FUnpO{sd)47`l~HG+i11kec7S|iNy3(%IjlNu-uL20F1;1NY_UBp1k2~vH`53J)-1ReRP0<=9@ zkeMws2wxn{-P8K#K<7}K|EcKHzbFKFM8L65Id&M8rX?@{eB?urR=R1^KPS5QgTg6o z90vhOeRLCH;t?kQ$uNX7wm~>9y^J4_pegRYBEX4EkkSFOVw&&oD8!%%w4$~QB+?Fr z=1+zeXF6GYL#*7jwP@}~vRe4#;9hUqD0~ale^V&MBlP2cLBC35l=jc-(C{)&oa=yQ z_1cW-YSrFJCh43%ovmAOpR}j+I8brL|9K}bP^)Iz{zpdK9-|cBj9Ws~VlMtAGs0K6 zbRT>{&zQyy$3PP!Och$h4wfS3EAtBAR3b>-RPmZecbx#4ek)ZmRWy-9`uIm~Ko_bH z?&CE7jt;*+iw60C)6r;2Ye6MI=rp*6Yu$y`&t6??3yLj98@<3^dgQVJ?I#`RB#WzW zxbT=#&3+ivok3v~-0SmKqZ%q<$32=uN<+-n=s}2ulozWjN_@pNQ_Ejf3nw9|hqF?_ zdN#3wlk-yz&g(eb@alwQDDGlZ!;&g45h~wHIqXYfaA0Y`DaQ=Z851QR=#B*=m)0e9 zYs4QM#K%okk)aoaL8FNgf_W{cq#;f7D1TpI#pBwCdO)he(e0?afcqMAv>`(5v@(_& zBrmU=28xEDR9o}vrD@bE1K>1i7D<_AlpDZxeTMQUwt~b&P?13CKtr-Q0!%K|BI(6r zE9^=$B(+aViom;;_~9rG-J}_pB2?Q06eV`3Im|3aDYB;wN*@x)(F4MA?j8&@7?%ce zHYDK0S#HGZj>ttK0-+`5BA5`Rvl`SaL<{$$P%j<>zz10_w-~Dmssl*_CJ0dJ5P^K^ z0o?^1 z9g@(WNOmL6oI+m#GI79k{=(?2JFipC+=0e6S4tbsAUi-Us@88utJdwkc33^pD${sp z&M`L?K%)&iBwf$>!wg>ek}H!m_o0y zvc>GLO(<`v>7}$B%axvVhO=60B9+sWo1m7u#<#xAXSD8ZxBKa*pQ5%KEv09xEnS`s z@y#1_lldBaHhkR5?=Ll!8IsV9Y%GrF67Y^Eic%kGuVzEJqB~L!8b+ zwKX7GAHG00p1>(hRmsr9ptd)2ELrIx%X(ggJw!f|oS291w*j`>Z9YhdOvFM+TSHv3 z4W}|EQB-wJA#LTMJ^yH4f+p3Zq~=IID56bc+iXd%xo|<%#_YFVZ-~Hl^L#iSQ2FuG z$IWK>wtGDs_Su$Nt)JKH?c#AmYdPzvnM(?bD8jW_D`+vU|2lDwq_mW}Tmk)7Wr(wW z_l1`Emk-bHdkf@Q@3p`0sNE%|WIthlIGqm=n9=67_PF&Dd5=3(Ab5OuJZd6+e^{?q zo9)J3r{6qWY1?^$^IF$=?O`k0sYX&JsN~;H#Eiet&o%nUY@-pOJ@p0b*S9ys{_^L) zJUu;A(bHGC)+-=>Q*HR^EK1dRdh%CKl6rbn-=W)X`*Jf4_!9?6|GEhoT@n5Q28Qs3 zv@$EvDWB#~qSXuy91stME;ytiXtI4)+pp;SGN|f9({F)hVZB*Lc6ANX1=SZL{mm+R z1bm2}ai-GW;@Teq9w$NJls49IRVa>mnx`)gSL+iEUoU{g>54Oc#^}{=FvkxPc2LB8 zJvHh78Z7C`89YAdl=TL*$5`2bu4)UKy9x$Jq5c^7V|nv!prhzV4=3)g3)4vFI#KUV z9PZ^IlS4hJ5zWkAj&KHI&2b;@tziEr0Dmy*O7`mb|1aE&x%kiFUirI0FP9(OF4GS7 zxX&-NM@6AYB&%;sY6N?k9GauMDk7U}Xcj7*6lFfA%=!xLv#ikJo4Ef8Xe+q`YRYYh zd^`EJNNG@521|xQIT(ei+9vR2{e6_c85gnER&>I2r*c=YphvU;ttTM#!-Mn|R~=IK z6HC2`4QT6he>N@ZFzxd#u(Nj|^{^;PdCi`2PjHz^DarLVfEB-qg0kHL)P)69rIN?A z>P9o5$)2gzeluLrRnZco;ux_R{Qy36$+G$`r^*lrM9BaHK9V8Am)=%D`@Jxc34wgM z4pm~n^rkZogaY!3Kw$R2xf0g}AQ6%E(a~ z+Vv)2u?cj=Qm7@foa_lx2upmQxw)pNXdv03<*QZ&b-l!tfPy9EsHROtt;1X38p>Wt zQ9;@v{+FT#7at^HnWP@n2q!JTpN1Hy`U0k;FV^en1kL{tqD^FGNatGWqAYF$WD3=X zZ&NP_6Qb0gLC!T&z|ATMeLGMxa5ZR|ai&H1EyfxKh{B4({bnRqB{Q-zMv)t#6pv7f zjbvkvGyx1jdh|P>HGfFbvt_dZ9T$tfs4nMB8B#9jO6C#kour-dH4E$77fF$wpa==H z*DAoZF1A7hZP9l})jVe)-i9C@dE%HiJc8>#8vN}Bv?E{*`W>V~Te(WqCveTr26O~E z)u~`TJ~e9Sx>_WWoW;;{Z&_x9V|h`pTKD?)_R~*46;DcV z|uB;#l8P13X8rJ%1hs!mf2FrULgo?ZqJbj|bgGqoZxkPqTd zFBMyK%LKJLoJ!+Q{13;K3N$%*XOp4~51%qft72P4c_W;l(l&7o*3?w=H_})$n5&Q2 zKYjY}@OXNCdp+x|amX-qv(dgUwH|r;?U={zUQn#m>(XogK zrJId*on_8%z`$)T*Kr_G1sHJ1ZGZ?{Lg-tnz`S(CJNO@f(DW5a>8EC$wzDwZ4q>< z0Xl7mMmYf?D@(4D(kgHlkH#;l{= z&;o^1gfDu~nNoV5(dslD%jlC}J*h|94zmynediJ!5Sg)`DJ>ZrB^`4rTm(nf$(e(0 zl;AvVH|-(@uOq;PCQ%)O1=0uY zs*MhPLW^y!?g~fqWRtz|&}4eoF$1^Zf-q@+76s+d$Hyg01+r5IUJW?cjw}>9NO6E! z(0L+$I>5A^O40`OnR$m*ICQ>AP4nWKIwO78HAR3EwIzSSm~$&?tZs*E#3HGpP+LkG zP{N{Lt)tVp7mt`^G7?$9r5yv$rHA!Bl(jfyW!yV0ZMUt6bau@bS~@l)XTadL-zB8I z!=KP}o!T5y(9v27G;}?vt}cVtphDZ_;VBu-VZ@(gRisg&?Nme65mhU7|DaGfSgtEK zJOCc_(!tJao3)fJ7OC)U3E8tZpruO&brR)NPlJP6yLfdwtd=@jBzdW%nARN^K~NxMk~&AK#AW(2$mr(7^hm*5z>H!^ge$NhCx;BEld%vW6ruihm(;xR)bY`m3(o>VXp} zx|FJ7llmxKsc9W;!_qj3+w$%Gfie90`ugUCmay7}DA@-tzWHjA zj!M(^+Ds9NiGFRrxD-?x)3`)>JRa%I+!B<{XNyI$$|D?lx7%d{n#tk$`B`BouJsN^ zhuf+#SX1$R$Y(XYq+_NDX~xh=ts`3^pY)_v2u;=-T}bg<^zq;&l@*fawgPQBYs`^y z36xkt@OSE{SLE*EmP1Y)kLS&1{rUCR#fn}&efsp_aNHe^dqP1Z^?0&3pw-KZ_v88C zk4vTqg3e`Bp{HwKKKz8B+Asg{{*-q|C(D1FIG!F3hqGSW zao8V@Z~Oh*@mSu$*m5-V2?5!h5%#L= zN-MJ6Z%86Qw&f!h;R>>2w0vml0*ebU$=1>kUqVk|p+>NJm3AV){GDOq0@kOg|1Hi zL7>=8p%jmxUT`xw2t|SJYDmikLuVhX+)3$dB4bj)Q#tgp{{%F+$Veb!mo)tGflUdN z*jm2hOjHqM9XTjm1UcEK@yJA>Z$&&kJ^P&UwBUQI9*SneK8z2Ioe}fO!Nf9bPMBls z-;Bn4Y{}RUM84O1`{8pk=(*N9txP$nBStG)!gmdWR%;;M83)f!Jv~vvjGuxqfn?fq zr;oyKt(%UXo+|5^!`PoOr^THAbNrI|W<=WrMnFepvK zL5;aGnyyOG6;)Hfkqew3&KP}MO1-jC==`W7t6%N|yV2q~l^etE6|X-E*ez5axW|G! z=N$-BPWn`uL>;IDq(NguXF?Gxo^EHOS6xjuRRH`+P!xGUwpeZMAEGBfxKJY$=?+nT z1x0QiMQ?|(S8mq#Kc~JCI5}ut{4bdXbNq?~3Y7d;A=L*;V){CYXotcbp%jl$ibp8L zzb~%X{f;i7s>T^2njtbu2ZpL-<)3|l$T+7o0+a$YFm=?T%5NbR1_EQTS_F-@Fk4jN zN`UHlMJskYkgr~WFek$jROYx8PM9G;%O4{}1DVQ97PK^ufy}X$j_06CrU*_e28{qM zC9RS{IH2T5s6_)AS1PF4Q~&xK-$2F*X{CcA*J!TU5EaoAnJb8J$p|v{_V&iL?3Z8u z{`|7u?LVJR2md@^JF4Hgj^mx58rH$Z9XIW&1kvE1{M#RoXO?*zZRUS?etKc4b~qgM zVhZiw`Z;TTqj90VVw?8Q8*a7Dt=|~b%bhteXUi*=d5n54)}KFr-tFEv-gck&`?s?n z!gzl;Z#Ek|r(&FpKki?()XcKvPD42#`-D7opPrsD zLBVdfL%IFbJEpN78WnQa+tZ}TlSTOT^_5yky5VKKwFuun2rYdb14*lyKq3$n)(Ay~ z!&Rsein}AEIu&UzAWM6RZL+|YJ9q%!Kp?*%dKa`->_FD;`pDE&KEqMduzNiG;no#@ zVB9p)+D=r^yD=QP2pN$9p(`_Kh+1Wky&dB!QT1Q=VfTk{Q7xr8iTBQ;L6g ze9?bAEYwv*tO^gZ|AjexG5$A#P*0*1-wd3|Xe{-u0nWflk68`lk~fldrNU1|QfL~* zB`mE25o=MIsSBvMTyH+f)D0+=egInK)xR*4wc8@nhNN~1Kp;Fks5Ce_{(YcQp#=04 z)DE)`AqBj%hYzgo=nmF}{(WAF!Or(u;Ume~6-gGBG$*|nJ~SLFtGL*`7d_{0fShC< z=I6q+KoTBVBolHq)L=!+B9&Ds#CE-1uhx3(4*A5 zn>*qYEa-d^i;x7=Q8EOF%I1V`uAwR&;0KWB#jR65 zI8($UsR}fWc0uq*i}W&NnkSJh=88Hp3x-2!^@Ce1ZYa>k!Mz(CMkAcnim_KD-6>KC zP~&@4brS_J)x2&9X=s$!?ZVKAy>ml6?hQ~h$b^S(IbXc{$*c~oYUOY1b{B&}aw|41|*3Mpz)3L2CNU<#>Hy$a3Q z41p=7W=5FVh*G8jd_Ekt4;#mk=9GlVb;I$|32S-6{jLoK6PZ9VccnD_lZ^69Ur@L- zX!g_OU*^ww|L1^3{K?`k9DA#6FJ?coYDk$(^!@+scKf>9QIrMYet&p*eu-E@04<#+ zG!?4AWootpMytpogva$Ll4Zqng!wT7p=1D?g$f3=%hg{O}0f9Yvn6wa^kby zJpKE>|NDmzABaOW3K1k*KWnFAO+!SW^26!sU67(Vl)m;6tx3JU(&y8JxTcIC{?o6x zcQ|krTV`u49Zhz(+tE7wVP^RF@gqeUcop_t3+6aBNI`A5q&p@^Hq}GJlpB62FeFzS zoD5BxgI08&i*~7$#NlXwh*~h9lMOLOsz(@@17rF2wtISB6Q{-M{rP#r)ObAZ&hMNL zM?ICT$C;JUzT)w1xBKmM=IXzCd3o7vwM6%q;)&1lx8HunXI8U%0{Z;$q%GW!%LSSj zEPzjXYxDc->t_OnRSl=@^JeqR_1WuoIp$}d--rha@NKi%lF~tVzFzA`FTMYJV(o!N z6s}jCo_g)_;jn{a4g14!hXxjqNYYAQZq(yGzttM;RQgS_$U7l@STEO%1!QOnWwiUh z|6l)|)i_377gdRv5N736KJ5ZzQxqEiaht&w0aBPLg^6xg6*IL`lxz?tK#XkU0UWYw zRChi`tjd^KdK^C4h*g2e_YrZS&8K2GX*+<<3>gjtVl)cmv?6Yx%A?`ZnA_lmt4r`4+Y#)1B~h_XbBLpFxwV| zrm?vbfu}maUn2m=u=i2nhQ|YyzoWGV{Q01@bliSb?x1iBY1gzfpu(gd?e9 zceGSI=xVE}Q*VR^TC{VnQmd0R?jB_~K@GN7aUNRDdH-?{TBI(Bs<=&>Y#=iodhPlV zxHne4_Fn43wX3v_?!a+c0sCEF>&d;LKEf1JsYiiK&m5_qV^B0WG#g0h0*6hU0Y9jv zUyW$UKm~={VXnV4R9rViW+bjnVU7_#=>WC#cSeS2kT!-+=@{2bzXe~XIkj#_s-$j< z#36JDI0*>QR*aD>gq9Lr=qj_Opw<=iq_ZxTCFju+Fy~b!pq5ry@2BNzecwBvzZc?1 zP*}zwtJut(5}o99>GuM2NTGzDtvDt(ETWbO5PAVc7UI5MYDTj#Qmr*2^(?mc^U1=!mR}gKtgDPz#}cu1KS_nOV*nr_(O z`z8WOrMsQJ5=-e>-)%)$!^4xL?Mu79icZwEeAF)p>C39vK+Nx5ERdvNm)<>y(b?Tv z+>R+}xuFQirUpha=Rv|~u`{X{pKG=v4JrKl+?fy`D8GVY@j7P8=PJ&rYvpbBOLk|F zx9xSD7y{B+cFa~aF%EB^)k z<#b7AfH{BAT`0kBI6eAFx@C7E6Te%@jnj&11wM4G64cTl*%7l4pe-60x`2sf3e*L) zR|)>zR>sVI_;Va1MS4beN#?Q&;n&2Qc#&%-7x9r;mCH0hu~ElV;?ogb zws<>y_2g)46}qm~GV9_3_VX#BGF_~o2Wc?ofJx>b0RzvkXA5Q2EQCG*cQ(v?HsM0n zC;C(g5jdra{z4Ri0gB8BRbe0%?u)ASqTi)HqhUI$)t1iIfs#PAJl;4NSWbqgUjAJ+ zpsUXSy2(z*;R;ecNVcZ`0Nfj^_r}krZpM|nSK!pkl6*e7mnv?N8JM`G${z}?{|?w}#Qrx&|N0&<|D=$?u0h;f@?aGqBT^;P zWg`i+BLce6wld@p(4UU!?BjB?`dRbh4?DD*Hg(Wy&DX5JG$S;8t#2U&H>#jAfm+aI znYl~NA9IwXpm)~c6{$RlT!BcskCsqgH=r%A*8&=m)Cz;5+B)kK;1{Z(XZJ2d^X*^+ z`f?~*o#DT%#@wO;7j^K!V){OvPb|8rNXO#8=jXD1l9ZsVMkzvWvbOv#i&x7~Cfib5 zYU%IAqBxeS^Z=MeF)Ln^2`Q4pBSkLt2)y~wmTuhZ9|X=sXTX;BJ2l< zB%wNj#RwY#iJ%6LtVv4RSgB|Sm@KsJ1HBl2X91*fr3#c-lQfnEx-G^;v2!Odj$OuUw?(NZuJ2YKniq9>QHfm12&H+wGRn!IU@ZwIfSgj`h0sm+Au#p1UDyLli|) zTE>R@j@G+LDpiRX0yKP|Vi%_5jWp=?V~nVsLmYspVi1)cgMyi3+Rq=2E3VFgCTnnc zcqP;|2)E-#`G}Fm1S6r^V%4jWsj~)XG-qxo8_=%ai(ok)HC(N-5OW6tmT3_UO0iA^ zI_sC_==`&YJ2Zy|p*d0z4k3duA3{YbZ3Hfa=_24o0(>19_nhH5Sj5EPkME|A$~WPr z5@r4eBIII+P&iAg+YM+Y>C^j3j{)o1D;*YtKr3)X3tEAEwN>~kO&zd!TiGz9AzCm_c2WD3*Y#xH}m!Lk9JR9kXPlzw~o>+bERPd`PbcChakhp0_EDE=JSV@bLk2!}07n=v!TpQH7rItWau?d4q! z;gEJjp+Pb}Qc#K&88rC_v!ka^tF&O^prLB6;*~T9Dl45McK}(_=j==Bg@gdH+wF2Q zOpiZ3J#}sA9qy!m(fwox~U zYy9E3dwX3k*EoFGBeQtgY*(z%9`)b_!qk3eC2-iUnFla>e*E;|=M|bB7ptY-pn*gB z`MCEZ>wQj;&E|Q#efE`HyW1ITr_+%ZW+tI%y?!EHumVy9=yI0L$MZ=~IBT6n6W$+| z7EqDae)89?C~x0FjY6Tn-I}d>DltaHFq;OES{yRxX(>{~ zY&T7Vo9achTS|g3lLA$~=fG6{HZa>p%iu4N15D(O2JKb1T2Ms%Pnx5ni(^65{u3cB z5emauQmzJ?3pmORn(h`Y2rO3yHfJ6|;G~$|fTnI2vG$PK5mSeZ4vWH3cXZl3F|q=n zr{u6W*zTTywpUZoJD~Lymbw8AI6>jm0VZh76cC3Dk{b`%xbL_RXs9qr&~j=|Np(v0*+m8#M*a)`M4;y~+?ja_r9{JC zSqtdUKk>Cz)6|wCSJ7dPvbvCVhcvj{H7-Mp68NUO^>O!DYXQi{1n1dSkJuq*jjl)Hz_L=;*2!w$u2@>VU2Y*9B4b{a^9bm$x>LcG# zNRKOO+ggfzYZ0QuoNqq@xktq$UZszQ8_+EnLwHLS*2SyEk`**8T9kIFvSC_TO{3B- zS|I{50rZ#umMk$M&eI}<3yozV_-W!j1%1r~4z zM?4|miJt{l=Pa=%E6V3c5dFlNAwz0=~^@ zg`}R7WALVg%j{HkY7DpB$U;9rpW5J7EcLbi64NSgJAyK-28#b=-??{Gk7=I?fAoX( zr;|2_{SdU?SMKYy?u!_7N@4d94b@xv@8G3I3f@pkoh%+XzmfZC`3jQqFaEXcFj9`Ot%+3Iqz(M{2bga|VdO7samQ-s+K0D@xBf z`z>zF#iRxL5d+NCATu+}Z?W4Vsw%>%MRfqg0SyeF3zU#$vVitWOX+miYMm1yK@6B$ISaG;!Qnh-j~BqmF*R~h4qbX4I?)!ESYkW7b6sgx7j zb^{tPL-+$P5!9Bj8W=sUY^hMJw=SjcQBqzlZ~9xonV{7Bl67!$D~?gRZ0(n~T2L}+ zFJk_vSXX$MZ@b;c44CP2bqi##@GBhxv~*B8 zgQA+{@=F>kw3qw;x&d8H(6UMg$qrI9RJApm(h1D)v-F`1$4JYSpO6+>d@gJ?O`meI z6L~t66i%$e^eY`SI5(TkcDo%ogG?oAQHV>n>#qU7)~%q3G6q4i2t=k5EiU>^v;v{$ z3@HdrX$zU@>jA6fnydfeu;-@cPk;WI_#F;Mg2C*lZ@RCxT)Sz!@AmZ!FFnlwSgo`v zOqLK+oiL(dwO(px_oV8?Q)?5yE{|aE_iw~$zkl^Szy*5!w0*WSk>=lx;5-ac(#x-If3p~qRfoYH!fV`aHmQ;2>qBh_{< zbp%JiL2%JYFA{m*>!%mBruy@r|Ge2~s~6KqCZ4k~Z?bp-kc?vx0Rc%7%%qW*eZ^Lz z6d)O9ts6cFO?(kn~!)NDm+g-IHs6|34pkWxe%gcD%8iUBK=a{PoD zKLhxZ^n5Z#J&y*^2|Yw{yV4EthrTXvHNhyX5Tv0kCUl(S3R;0b6yjJ~RC`M8a#6BD zM;A^?6M>3m_ZdhhbK_tGn)3of7MMU}#)xmVG!B!(Cr!2rFhG2IV$rocc%fBu5;Ggn z(RP7XZo%BRx)(7K|I@}~ho-*>Yxv_JExH3uY!%%O2?HHUKthuyNVz7Ne}N>XFy~D> zleBOPQpkiuM)QA7!|A1(?Wg!N>6{*qQcj{`E40#%KS+IM6>T2v8uK`9dIF`{e;C9i z2mG7He>D8_LVeSOq8*kgtujzbau?Z;QiLl~swyTl2^y6Xq?Y-bAt{1huKz(B&=qdG zq)Ms{N(MSPhCUpI2+p`<>i9lhUPEgEiv`3d4l7U=fiUP)eNoZj&3jMmr{p=kE&rtr z=xA;*$o^2|S}Q68g}h?LUM4F=f?yg`+;>D0+Sf(|_=W4^vS9iklf!Mm_>b8y58M?Wi% zh!Bk+hJY23yFNt%>Wu6xd8{~SXp&$)ko0DU?j^WDYWFq@BCC@HQ)byi|H;f!lu8m2 zrJYwpMB^CnGgi@-xyrmL;Y?M%4KKMA>$F|@GHeRq=y@M0))7v+t^~nHWOL+JEP6Q- ziKLSp!WN=tsjgN25&a6CKao>Nm+B+E{oHjEWQ`BqZ22)C6!;8Q|0)_fCB($%+c71r z_yF0P*?xyE)bmrS_+5w zhyLzJ@M{;;jwXu(y2bM8K%rzj_i_Sxz&H+VFnm5{E{%p3W6l)phSOtyWxiCD4{#qT}88l zZah&}dWTZgvK6b*#EX>XGWUc<7f9qH&slz%#hQcUE}Yf>`q1}yIv&r*cU_>)%hi%8 zYJb?Tw`*-`sofa&x0JH#@FUXpoeTHz`T1ECzy<#aE#$A}ZG{4))bpW0Q$t9IDa-N= za~h5MLV%VYV63p^T%jFgeTJzl!}xSutyhEsrVm@?ETcG_k)aA{8z}b(FZn)viRhs` zH)S_~e$BvX=$ayi)UgapK}FtlrsHY~ALeeiqm*eO8_=q6#|A_YSKCyO1)-85Ty_ES z>HT(qR{4uIV~}mNwRDRMzpIOqfgaFSr}<<#4^R3*KQ7GYzy9rSZ?A72)!KSqueY1^ zX1Q4TjamBDK|+2$a+TkTiI|O`idddbdc(%yphfIf&ys7ym=Xj|r^EiRTP$=5V5TJ! zPfyP{$Qh82c&O)ry!L>Li)xWp z6aY>FUS=UJ{WLD*XS^cy&abaZkMDa%!lOQuAh%wv|MaJyy-TcdqH;I0VvwzX&pivt z;IJEVsb+IvLjN@RI+&yXk3bV!MfU?N;2ntP_Aq{yRL{6j<_TFGEk<+(`dx%t+5$p?GeuDYRZ(T7obzgcAwyk5I>}3O z!a<$NEnoVps|Xm3{u`adQk^vki%ozcdoIns%As&ZURU3)AA1nL^Eny>yYJoJ4&hh% z@SIlYDu^Ksyj;SUy(5DW4cwSvi`4FGRSFo!Qvay$fwFe&Ovr9hpp9stFWQ33^_Y7n zIa8kRPA9S)IL|%tH-{g`2#r+ulJ{^*DS!{BWcrBk7_~G+#h7yi zai(N$!@cqWwc3hbp(GlDL3R=}jqV7YuMblz>0OA1G1}4)Nf~kwm`-d-;c$zU3kYLG ze2sYRO-M{^YUYno&c~Kj^tZ%SM1#^ixuahOHLJq&f5BKeMCh~vK!oq|3&tF9MSc#0 z_Etns2(&c{!*|+DM%mm~jJpl!D4>L{AgduDmblg_`Ak=4#>&NWL{u&~of|^7ay#r# znJ9oc<;P*@vb=($@*zrmJS*ZO_aRI-_2Jq0AD0ORsan!C6S%CHjgX{#Nt%3T#12h_gpdFkaGAW zF6Pn-mF3!YI_>v++@_bAnsiY!s{9yfW1Aw{%XS!K87*)$W_oNPlGS3ZIM4v>ox~`r zrL|%(?RQhRrAg>heQZoT-p?-|o)3p3v()i;dVc<}UOz3Dipk-4IGqo~kD?DxKd)BL zkNNnB3;gM*S2OD)9Owi3yidC1_WXD(uWa5Q_Q&I!Zqc<1z=~zD**sy7cyM6)c-njS z+22rkT&`D7-e6*`WG%r-r@qp<#f`&fYAqM*#|O?$`q;@?-&fG0MdLtgBvf(xK!P3? z(XObOINRI=Pu0BKwA#nRZU=|)!YTan^784EzSAIo`W+G4;h%=pUWNpq)6o;6azdyf zWo;|YK)=JQ6;#p?kqnRoh=nLzqcTA&(Ao-GI*7cqG|sfJl*9o3hZ7G$_?behSZJUb za_T6>Be+ARjxl8BeXR{>eTslrv0EJmQ}iV`A%a2n4+6Yu9Sc3fEZ4_cWT{L+wL30t z=k)Q!o`vzS?ih1LZC?YKw9(oZAVosiE)?az8Ju1TgwX&EsK8IuZ8lryB*RHOkZc;L z@m8qs0oiM84ej25Xt*7{X#M~cGdH7-8ROFYvN5C1$Sta7ZHV-yIqtzPVn%GPx~vKz zE-9YI-y7396bES;OQW=2JLE&@CG$s~6u#w2kw>e?ISecixyzJZp?ZHj41D_vKcnHt zp_ut$NRMV2S4?_-OEw*85seH|cl3l;Sy}`dL)}P*pDF>Iq@Cqr6!{R#^}4+N?+2ln z9U-STM0MSS+%kD_H)%LE8$xvc{6Mr8idVtKC5yx>f=|m>vyrm=^^%L?RD>@X3qa|< zh}!5O3mg(j!nb@y&+c8oT%m3QmRMnTP0NM6w*hUw<{%%mjV9~)Xo}R>6|}yr4f0u; zsLSKX%Bqo_exT_1lNQp@<(|yWV>@&U*o7LQXlT+1XS}uOWTsV(<%5NvvDPUpTvAWV zg-)8MW0qPKk;9Oxqc)mD0O-~Shor3d!$AOAl@rXUD_J6{o1$(6YIvz((xXx)nyyB% z5t%X65mTUwi`1fT*?^`Bb+fj%lF|fiso|v$4-ZuUcBjx-wi4BPe&X&hdr#Z(XH=F7dSyT~X2m`kO=|o9wELZS5F%>wq z3)q0B0-J*^+9d^ePKp!)(30<+O$C-6VvZk-ORviZv0JU1cPs9d|6aJ)F0HHgq9GU_ zgMPUMb9Uj^q7dO=g%m?L00E!b6$i3VrbGhXfX)-p-5AOrqnwW|YlvtLpxdkw4N4FG zU8cMT-Dg>m*E!U+;uA<_zv(GsL6sB}A=S^+S~PU1>?Q@!d3)hkN$znKEbTUcGt zJpnBc0Gf{g3}!=p1Xc7%AkipK99t!Su=lQ+SXS+w(#UIvv^gXqBX_|5cmNnO-@SsP zZa^bOnz5vhjP=xWUgz?--|x4YQOj#;?K6b*ASX^~c+rd!HNr(LY(-4BvvPVwtpx`p zTT4Os5Uu`!K%s7d2{sc;gL}9F^Kk98`*wqZ9lTAIVm5-iaJ1w<}KL6=YKR-V|sUpRmXIdzTM#=Y~ zwND?BBxR(@qb?f`=0YR|8Hz3!5LUS4WIi&{&t_)yQiMD@0ZfF+rb<9Irb0WbkwEo$ zlA;g+X9NO4tf(*jM01hwxd7izX-!yll13oP;YS7{2=gw`Y14?>p~A}sv@)H~$$~MR z_}6TZiY4=h2d=i>hOYM!&YDw)hZi<(V-@H>0o{%H6iwo;A~=J-AS=FZBEs`up8>I6 zxuhWSoU@F5M*Mo6>$2*21}hF1lzTXV))wlI0h$-0M4;cyF)l6nqoDQZ;&xiV*;Gdt zvjTtBLtTs8x)zu?=;FzPlUl2f(Lp6t0VW?18pOmH)7-B*-`%t!rn&v`Ps)g8k|eRG zcbon%{G*^}8t6?Z(%f_?qhY1atpmU_ZPIWg<61ceQ=x)i_Ep+_1~()Vd4E4msuTk3(yr*P6I3e=HK;I45ZuD^b=n%ay(!$cfrjq+PVG zp3J#eN{_Ewx6{+T(<%3!RK`VO~56&Tu?hgB&%MgS7cbjX#@In z2MP0d%sIh7OYL z%7?JB3B2p4Cv-#Up1Y*9m~|`7sT{PE!iyWUx;7jTtMHSxxKh0cVzpfBfnIe3^M$@1 zj9y=?MEfaR%_DjShrjyFR@>roPFwukSm_|Ia~|HQYqo3=X9RBt9(r(U7~p~(7T*f{ z$h2lk$pzvwJltI0I9&wJ$MPK?4R{;W)CO#*piW+Zg(f!?kq4*+EIqjiPel;-Z0_C9 z5NZ326dBSk@@fl!6T8twf9dz@%X2X*?+*1Kf4kNx*ov`RcRL25F^UE`F|h%C(Oc5l>Q5fee%-jseFq9>SBMV#pl#tb0rQ~_|>y0_qp z{^%Sa{Tqv^ivzmFlGkuF0Q60p$Hx=5G-V+O+#MnPcj^NnAv#;HTDpTZc#)C~Xif`r z&5yi|$tOb@XRH1Y;eaXwQWUf_NOqDLw0c@(IW-BY*ILll21D;gAgXy<7DT`wh>1gN z4|@HGPsySrUE|BNq7%O4b77<&hiMh0d@}7h%j_QSd)xx+nn30;N;5>m%mk7RXgO(Q zEYX8pVRnZdvm9;R@AoesK13cApKXq@CBh3zHPfTffK()ls9{=Jt~=obHJ%{`RX}_W zzX~S{DhGT8t$uaGv4T#WG0sA_lBMr#l>f0^vLlBfQa4#ysn?PQZ5S?=`X0_9YC}+g z9>nM4Q7cK(l+q&7WVPYv=XNt`M9BcNc716pWCOCOsz@oTjT9wqiHZm(t*9C%=>VFw zOC7FbRAK6-y77K`KmPjb|N6_{{_LH*_v7jK;pM|}t=%Y!SuGs&)bRUywcKo;A5Lpl z=2TyJW|jd4D$yb3mp)30MHP0%_(n_| zB3%|is??&Sk*P4FoPD^>1jYQb+wDlBL5ecrbgC*Hf?5cJ)ExsEh0@^cKrE8b@X=FM zL7<;f2UBY;kWx622k4;`q}IK7FV^PK`Qt|FfeeiV=P*htc84jt%)@OF7-aw9sBHlW zW@riu(IK=G#4be;>L9-@sY9*H^vLRH&6$dB1Sz04gq2LdwI+};P)p-#&tYeoG<2IK z_fsgs90W9p)v;6|IlY2|^F?I4o ziW4{NJ((7@>nj1Er@Qr0zcCO=>XPP7O%M{Fn&Vove+1AjTnf_0&?)`rh1#NBpkYI1 zo3>yHp)ZlslU#(E$56pI;cBVBUFTC>Jk zN}02mw2Yy> zc+k(Jz}FR5F~4}LIYPwCi(CrYbIa*X^H!2>Ox3X`dR%>~!ZxiZ=zBTR<*yzm$ zOO|-h37dXZj@!k|7y1sP?v0}`h`E;2LMn_1kS3c}d^=D`6Br4DR2#%2KH#*B10bUX zf|Qt48lAXDDwq8h8b*|&q1T%DBEl_*7FF;GB2ChSlUsc~Z!RU-CK^mc1Oe#>ZDtqk zmm7%z;>j2XKWwsGXzNz5j1t6eg>Mu3Ye1x8 zm?5e{QeZB8JE1JcwhBU$kYm_CoT{>HR`#Pgy8eQ94 zTpGpQG~VK#xPD5J3j=9dLCXD7jSQ~1p86EPsqq}63J;Jt+z#XeEE3F|-R*;x0|H4^ z8)1&0hCmEb%@|FsN>oDwjICEy$yN-i&t=D^E7~gK(jflRx(E-ffYv=yfK2UrXzrqk zGyO{uOvD%|nk&zmWXf5oq=!e3t|$yArfU|obRUeRGB|f{pD~@s&SIxr5qze!jjGz( zY^4VqlohR55c>XUd$s~5(3#NrMA4;LU`C&qwGh*k%Zz(G>tweAQoQoHwmf?YP=}?o zX~tDXGVtxZHRr)~(_V?uWq$Im=PmS^(;mtS3qq4hzqe2W8RFXM1B7}8?QG>k<@b{Tw4lzr* zr8B@#H z3!IdKN)ODzheJBHsFBhkm%6^fw#P4SM{`w38iG?Df>N453awNAbYeaE+i$;dIe-B4 zIG}p+5fn zK0UpB{_XAg`Q_#1BTBfUolXb3_x0_U*SG&v*Lwz7ub$D2+1>6<{y%chroK3y^d4cB z&6r*;ws?oL>y1u07CZ;mJYIj|4Cg*qOSfIaiBoL7esX`Z&N_0g(a$=k{aO`$BBe+y zSZpxMbBB1s<=roJnw#&*OKZL*}bVwJDVqycoBt$?Xu_Jsji2D9oIRX-`A30;{XGTH$O$p)xWkUIwe z)tLr4O$hI&PoJn2g#fWMQ{nHJ0GcMlM?euaph1!NadQn)f}u2`!F&X0PdyKVu>6sPYMSu;M;N6aL(Sj9LuLv#(noJKO{;v|x+k0PI}35}c#Gd$$<-tUgv=NHWY zOc)+x5g@hNZv}c{x_XjSetJBILuvJjY>=WL)o({z_gjFTN&oNl=L({;)elW*y58`F z!<27C1_7o8I+_V&x!y3JEFN_i2HN}ma%VdQRK=ofb&U!Ueh?-|e}Pg^#V-3@r7P#b z*)c0K$Bz}4>gza+5swqDa|!}%#YCUZ<|>Bhee*zVeq-pu{C2d;gVxY>v@)%R+cDN~ zf4fwxv#z?eMImaoq-8$5TvbU`R9+SubZvP&JudbS`Vy7;@vKca)OuG*z0CBb$rH8o zd}<)%tl%soN>ePe4}}hw%MYoM?TW z7PibJQW`5kgh^6#Gp6m%foPM)Tw62l$FY{54O4?NR#UvFZbE^EndJrOI0cY!0x7s) zki7#|dk1t6&E0Y~;2!iH#!dsx(HwLErNU(bVtg^<>08OZpi-v!uUvp7MsO%sW4JGb z&pfYnjKowWN@%->xNimduXu{;W6T*K0ym0{fdhr=L+330H%d`NDYq1DDng%C3X-uo zTFPJu5jt6bfOaahYC&sK!l(gOQi23i={)aL&>59f$(FUvs^t<&W`DLdNVWvB@O22e!Jjv zh{I|Dv4kOI@SQ2yTCouj+N|hS{Z&Z0>fT(zzzaMX!>USAr&-yvKVT+=GQ$mo{=_0; za)KPQurG+J;)>Rw-D!zMVM>eF<~yTAx$r_;J@rk7UzEe}_OD5!DCRG^{47I$?2D`W24EL3fEd zJ@tVQed><(((`=QE>d^H`S`Sb{`BcnzT-cRb_+^D6-!pC%xpm^fsH_51@a+8kRlDo zZn~)1jL*=usFngwOnR`UZ5BK|J=HWoTdtwhMGw{$5U=i_<2JMgfB`eL;LBHoim4S; zCOSidQU)NkcD)wTZ^h#~G19>BC8jWYbPF-3OTH_xULBb6+`NCjIcV3^AH*Do^W9%hEai7?u;_tNKvb_t2;<7WzCp?MVb+^)aSJ_ z+ClOlyU(t!bEJ;O4rz!bQKd1dkDzitRV6F&T@Y=PI$>6j#ii;zCeZ@C8l`aS#E^P(-3(?~O=gbgn%< z>bopjtNMh1a~BfTprt1v15+r)BShiA1emMRN=9=~Sl@uJQxbPNujILjp|)g6vkL@S z`RZ><8NwHcwkj4RyYoA15*8a|rC)q~i;ksB87Z04YHtks8I8# zR7(|7F2!7q@m4dse+iQj#qmQnpsQ8jd!P7yL6saMdd85dw9JUGnIUh-eHF@uET+u~ zVmD1|`SfC;BvX0?vAXnuL-5rGH!7R}G8|9|qowbI)!qSJ@Kr?NTs)8O32*pED+a%NgjMVqz!H0De0Jim(1L%2w3LU*AvLAw>Yq7)K%s^riHG`WRt zZ%aityxV~8n5m``N%#_PN%x=>sZb&|SooAn2o{G)b0uL|iE*Y#y6fNp_`mc!spFdn z?0T?K#1LJtmcDcF1Y*M{|1K+|RZ1S0hr{9JpcRwG zs=iq4DY=rZbcoi0mTs#6*1Sv+oS6IlK63>EAa2N;4khbaz`UNTq~VYzTlKVv`66KY zI$F&w!eLHPYQRZPfwU-d0-$LissC9l~j?gz3|w z@JT~Z6k-4m_{X=`x9#?cQID9HSGtvo%HvUwz7|=H7t4qiO4}17fSVis^%% zTi02|m5Rd;ZD{2{uc83`{*K$xw~=M%G_6KPSC^CT+_+WKg+?-TG6XpbYZxE{%}paY z(hna#eEj$^gJCjgL5f;|&@{Eu0UWYbTLdav$pB86Aplh>l1++}Nx`~%k2z@RwkVPS z8V#W#utgk#WJ!}{4g~6)rRnA8!M?#xvPq#vg&ANtEJQ zM4*a!NGEsMfTmv6iyu;$%X)8 zS~dr>y-K;PNQD1B{25F=xO2CV?@F2!u^xwP=n5x5CGF7CKN^X1qU7m@tfyoB)%XM9XYnUW!?YV% zL<|mpVfuOxAsLleg;bHTcFl8zNh*^naof?ziJ*;XmAmW)ppMk)d$n%Ya2;8Dj1h}t zto>SH*330cqvMg=sxy)Elhgs!BBj+9&l5vHi0=UxnI)vThQ z3B-WFI%)VVGV-~gM!;?g&>+k6zT9>W#P;=AH^#r zA#?7C(_K^eLoJ2`2Xrs>+(^yB@phGHt|T4rfH0@TFlgx(b9|7ZHl0LUROvW?C#_dtPA8{STKD$$ z_Vn}=CU;YuN)S~E2t63jt-t`WG8VYlh91?%8LCvksYHv);ZNw=D2QOc-_yCCU4%qt z4#;10j))dv4vYq}I#Hvb)mG`MAwg08REM?{x&`8>APyfsd^+n6In%G69rmF) zlMr=NrbfPQdfwj;$G83djfEC5bKJCl%=zQnY^`I@??-OcIM4K?&pTJ-jeeM8fo4=; zW|12zl;edLV(ay4yILW(f#RsWky6e=-}7@JkP=Q-7jm-Vj~*s+a|*CPdOqnk&nEcq zXE`2Dgh!@5&uHsf?NdcGBe8s3ef;?G<>f`C-9_XUBtVs@X(ceD;tnZlQ3{$qD)~N& z^a!Q6!(Bbvxq|y8#kc+hza*8GS&@y$-Glaw!4CNsjk0$ zj#3di%{XiwCMS`$+cJtQb z`9?F729@rLu;ZOpFAHOo6b>nW)!k(ST2(Z-ZbRe&b(0N}4WDd^#@TSh>;`HIJ-+0J z)Zk6ep;|r6Ug~kHp{o-?+|V80IS*|hC757t z&gn^MaIdWvR4-JAG3OT85z;m*l>7)T`$9+1E>;d_zs?mo^{>9^MJIB#(O15_EOF2F z1_`4?qpHw-6A81gz0zDmHxQGMfuu%NVRyoMnajN!&|CmGIY-AyUmw%%k~g`<3DLTP zABCESnlgn9+z60Hm6@e6H=+ylt@xccpq-W=gf?3G#{x&}7|o{dJkgLYeTh=q5szRLgB6^95&++TKZN91%(WtK_~7XsYPO0AEZf+Y+Ngl2gZ= z{2Xv_^4P3aj0m0K+OVL-ew;;bdE->^OO?A6j!v#_Y!I2i%FD%oto}3v&Vu+*3DDA! z3<~RJ(0_8`du%|HW{NP4FqhbJG8V@g&9&j8`O_gnC1b=P2-21Si4p`dl?Js|=$eKQ zY_pSzev?ARK{-cyPTzownhQElRLIg;H>}EIz(^?KKl8mmt8BcnpK(>vP0_a?s>Z1O z0;*jc4kxez$%OcJw5kUBNh{iHZWw}=*281oXdrF*K{U`tK%=fBVimD_^d0XUVkMG6 zj0T0(A)LsQX4fo+Qp-1HB4IXadSI|BoeJO$h@>=}zVr%?iYgE%lfBU7zI?P|(03fU z1dSnAjkrO?AOz1^wgjovBrqTOaxqYZI}O&>e*#*0wbA5-uRem|BGr>F#V|&sSXR-e zLRWb>6_@(yLX<96dRS7sS-MOyefsaoiYa1*X?A6pAjnYMtk+s}QpyAp!;!sjlb(~Bi5Q7b9 z5ScL$2GKJ|RMc#(2r50(q6?y-BC0^>%4~_61zHwOAu=UnB>VWdBKi2?r=#DjMK>{i znczL^YoSFwKS9gPsq=#2aMsU^95{109XLn06rh^uK{LjWr#+IpogaVJT@xkiJl#xb zx!2NAi2R-*Q&VJYQwpK0R%O22^pshaPQ4L+CB?`97>1MwQfY z=9S+*DNR;fG(2=a@IZX3djcS_y^GplOl+u zE%6n&y>2zyUd=0$6b`-Vcbgmu3mhCCJOSMjp*3_o?4vErq~9Io3NXMQZv%P`bMlGX z7+=z#(ki1yl^VBgK-1%-oUQ7_W{v8V{KSF6>4Wph;g{2z7<5Bs|EYye&h0@OA3AfF zY*PIRA0=LNPH#Ym_;IM`FK&>=VrBlHgUOgzI;WmF3RGfMLEm|F>Fz95zIZhpV4x5s z;Xp)TP{k^-fqM}U?dAT1nY&aRyl23e|vGr%1GUX1m8oo4x}pOx}fs%E5udH)rkkU0=`E+bh7 zs#s%087mN$O#V=f>5JJiV@dO&tH%M~U-(2&Hf08c<}fcip@B*xtf8duV1+MXd5!Ya zO;4uCwJh@$8_=p5L`#5Ah3dl=3yS@#kgGE&5=OF4FFv$zjR{avB>E`DBhYOrRcgr~ z?vyx+Ebzjypbiei>e5F#=Qp6?gxQa$IA4b-za7|8>WL;_)3BQOnFFX@9>D;&KuEuW zi%K&Acgd<@JzUJ;WDbEa*Fj^2M*|tO222fH$3Ue%R}iF_C51|@zeOreg1S=Di4BMW zTw?;Ic!a8XfSD@i=DJTTSSIPNfyDERI9BL0Ro51UibVG^hWUy1#e{TK%$#>!t=WbQ z5aBWK(q3s)%VQxmM)1s_o}2;N)Z%6XT6LP9Djqioztu>@LWCWM06vmdeh2_lA@^gX zq-4Vk5kx-dvJJD$c*ReN?3J{LbTPjvW_!gj?v{s2}kluu_7ee>}H=hWA^nOKLB@J?xRfJPh5Tijf z2gh!s8T~B=Vij?3tfwMH0e0b}3MSw{pd7D4ciO)E4(NsFjcUE7EoUAnmE^q}(9u6e zQ~f5~Ew36AX#FXy_*u?A(Q_NnL|B)ju3l+)vjI(ib?U_{icKIVc7bcSxQp8*wFMS% zXrgY^T~Z2Zg08OSs5z?So8vAMQlrQH#DLjs)(j92r}Aq7SRvJ*(gk<9+wY&Y+JFYp z43R-!y0`cskhQ8}D9jeJZaw2t_^u>=(m6>0Go@olg%O&Dgbyk+*$$W2zOPn#9vsa{ z2PRT+V71Cr0_e^o^dcM}D9-r9EaDCgP;D)mF+HRfofIZ7@M?w;RIXub}9wA=Kk^;rv@IH=Gc} z3Xne>cB~>CF^vr@tn_A2y{u-j)LYT%)wj1dEO6;Sjh+(nb}$B+4B~~9Fs!_oL4TgS z=KRoftWPmcN4(ChN8`S zd~^dIo?p-*|AE|lIBz#kdH)6iFdc+T^v0+Htr&DgVRfG|tL5>jO9?4ym2{;ZDzgfZ zrh1FYX^RjZ@JU0Y2oQnz04%60CV+qRHCnCjz%JRZMp5y@ zP|VznQf&%tlP`3c#MINtn^)54)YXF#rg~tLA>f#jKunYJU!&c*J0R7K>92@eP}I$!2;JaY>p)>$MG+lg zTy#bF3UpgxBv;|=EpYXPHVtT;>(RiIrzP*?Ec`Qrx-Zm$i5v)|J|HGWRvm>Il#=d> zZ-qj#N;TgK$iPr~QA{}*@gvUvuiSvP_DdRK8hLl34}GlorK5>S@6gZNMZno2k8wBo zo}(DL@kk>s0qbB!i9pNu+OZ(h0R&=o=>vy;B{fkxGAVy+B(rkrFdyD8q0@Xj>=Kcp zt{&6S6cYzv`v95dvOQY#rwIRZ$+qRo6VSjioD*I^SO_A+*Gef@E%Buw9$;y91G-Rs zz~;=cs&Yhgr~g|Izkgxk(A~s{85i+~^>FSYq6BB^L2&A!tU{rBmj;$s@CXiCC45lS zKM0vsm#iuj!j+q%TMicI>Y*R?3JwUxL{7!85YiC=5lVI9`!HPb0;%pea<)6OLii?4 zGUaZhD-9i}W)PaRhR%O&J=yrj*j7OG?;cqD09~V0c-esFHi))p3c_jX0`o=J4p`#|NbY&hXGuc@ z^%WTbcmF}M1UBgabtJ?DdN}+1DG`m<(5-YGkX^e8f{uKdY2t{0+KB5K^HR@Dl~sbm zb~z+q4n@V5w;`4*JS@W-Cw*fk63-pJ2}pT|w5~VWjg|x5pv*@6pL+#|qtLhx+hbrd z3ylI*y%~+Uo6ru$_UO(aB$P%>S@Xo@eyyxo8{Gu4Vf$LGie zG%!CLtFMxzSn`v}WXokjT`y*4?vky?!k0+Q`H2Z>u;4qFWrjJXPp9L0r48sbl+njv zMg*4_dA@uv_lLvt)8$79>EE0N(&rXsev8Sp2f{OeOJ%c^O29JaU5bjN$}TdYOKIr{ zA+>@K7d-|w8<7G9p)(pz1&uu%4)8hO$vPSmPLs#Ln?e|&LDf9T?4cDXfA0fo17$R` zi@@^`q@nW!wED}lSsbHr{)=Sq7!00z5D1Sv*Cg+=gVb}Jj>72baxxm z8`2?KKQA&}#jZI5#K36HzV2RMK7P=??ECxE%M*iI+f>WtNmHw?(G2MI=806B$;vSv z_D6r5=GlnLsa`rv8AYUo)Emcu3g|^hI}W+H#Lv@7zclNOV+|xUIR1>NcfbEeM4H37 zq`hV@pAfW+1|ABfO0OtC>U>wbnUdBEsamgAYro+G87Yz%vVAw_U;X6by>EF5hJYhq>fV4>GVNuU7%H~UAO7G=zvMWN}Tmc%^w#@OjlG@kCn?2 zW?7rQzpwOu9yphYTC;+)<3sB2Iiw1mnmICxteLykEGauHp(V+%>u^IiAyo7X4;%gV zW6uA(_0P$xON6$u&|TIQ;dt!i#3zjamn^dWpixAf7pfR(ipGeN(9+dusLYC1Pv{oZ zpwDu>)4@cj%k=qSL723vYv&V=X>Wv~=5TzGqM9PFk>XcWFK|X2-*o z!(F5H4d|(36o7(p+*(i?$aSL>T*WP7(KbdYZZOIGA_%zp(BlsU$~w+AJYx04*>Woro)NBY<)_sON0GV}7$W^84 zQ$!I_1^$1{2DDXKqY=9HbcLmD<$Hk9Pl}Zof{yiS=!YU!T1zpD1ENJ1&}W5`%*EBZ z^nt^?L2BYMs#Kvl;nLm?h4~feG~W)p#MGssRHoWE0OZuEzzA0RJhqRaWGhMvEI4j5$W)sp^ICCCun4Jv+v5ly@k_ zBRC{QRU~OLfS}=_Aru4)ICz35{6sPg0fDGOUb?I#M5?E>NE_i)RQUl)@d&se=f3L( zH2OR-sX18I{|F@MQ2EIQ@xNq@0cSwVR_+oVa}WY%vLKSF0+l~b1GUTRp@{kD_JuOT z-i}sphoZruYd4_fHoP>UF#Q}KZloKk+cjG`H)2jc3dca6B4ATODYz4J6}h?3$PenC za*QI76hy;jqo>cn+F!Iz3hY`zMo5sl(H6}ChGHv4fg~^eE>u-WhEt2eFEwWn$%<4d znLeTl0z;9(J=#?kh!)V?D4`5;)f!`B>%Q^{4%yS*YQ9nYsV%VV5)!kBcqVDIltX!;)hvUo33-X)+F1&O^Twu)_ zYk;DrwAX+E2BlQV`C>H!bYwy&okOb)2SQj)sSC4}skDlgtHVK`oiI_vhfJhF)lgGa zc6I+1#B97RVm>ip)@;SakB)9-2J*?0R{hl?kbb(hnN`A!X>CCJ7XoOJI>wRF6?O^~ zRntA9iDykgsJy4shl`08R1VXoI2+qLM>G0>j{+Zc{<;Qlr zW*Cc4a1J}71eS}<)6?^6rQZ+Kn=&?fR{F3%oKI!jSFgobEIqq!IAsXqZuiDa>y;0o z<(jgAiK^52;0x4Yzu)ERAs0~Ll`yn9I*zjNc0BIwizK^SIK&u)5{KzGfn+m*uuzIj z9#GP&Jj$WwQbqNcik4Z4>E#=G0f@dr`>@mogz)(B!^aOFKGY!7sCKlsh)j@?6F_$j zQ3@xLsH$}2Luc%TPD(}6XsCb_M7Wg?TA3CD`HFn16hsn0JF0oJilE`-2%=#81T;WD zfPi1BSfKTvEEbj0eHWL%KX8=`yhlhou}n-dMq(2BM?tZkLc;R>kY-$(%>U9fU(jUj zhF5U-^5q>6D!8ktBEIfeYpSYqY3+Av1?C4*ZY3?PtflymX;q}UcpWSt&FJR-=ZC(6 zW1uQoQfx!W>F#VzGc$JuWL3u?Tc`otz#oT!-DGE-nMd1}7P*r}VNmH19$G%#x@M** z{Y3~BK7Dy5-*nLsi=jDl1IUsURzx$^E67HyW`j~u3j&QU=O~Q;gH|7BmP0T{%Y#y7 zcu=v=kxpHJu!}!(N!Om()OA)jM_iudaM_FW7*=uz(h4=tsI&_w(2ma*rFaCLV@=Rn zdJ;vQ(F&6-)Ysx`G-Qe1cx|faiNb+e<`Oa7eJuH1LvQptb2U5b7nt>{gBlx04-EZ8 zxfPZnRF7&A{XpX!NH{wnok6nOi{-;CC`BiBS40riPP%EHKj)yd2q5k+t) z4G@73lN5dw8ebnntGxp>MpfRkP+Kj1gUe9%sA0V;g=OpcaijDyIw_L>I~L#j{dT+Y zYEF+KP*D>8a>3s1UFiHcF_IdO$t`}tb3yS+PXcI&+Ug*I{BGe#;nc;RVF8Rvenx$JRaXS z>nD2T;YhEgVo)gi>>o*(046vuxZ^s%A2dDr^nuB_kWx}z*}CBbVge#8Xw?}x z99jdW&yOTf<-QE4r68pN%_YUzWI^%JC%??={8%zDHMp7Q?>skS>0(dZn>9MNO9 z{48Ucn#e{c$}^BGa%oN#>yUF<9v%-nE=k+%8k%9K4H_+X$P_=Tl8R~lru$YTFyK_o zskNqFQL+P7l}>5RHhi5pX{la-p+AvSdM1AFk0+(HSA|rdXQ=+TIQi7na^Kplp`?f= zyjlaKi-|dDrKPz;yIk{pa<=ga^j08&XWjS5vg1tZ2Rda`SK+m0187-4>&lC-_IJs> z$=mMq(@#GmKyP**FgP-n$b+9;hGoS*1EwaJ;?IoR#CZ&=gor>DLr*OVQZ$ecL^u6Q zwql^9;&j&Aco5ibw{E7EUNj_C+FHpjeMe=L`us1F)S}@KkpvMgnLd0vmTm4+b4Jcp zZ}|b7Fhc-*4w9t^mwx^ASBp#A)6)|cwaI?iNAp0x?3qKhrSl0!vMmw+Q};$xouL5^ zGomV|mJ-#vz73}uB6^XeE@@i}np!xv+wI7{yuAGO`YS8t=Z`N8csS3`&&SiAl*pV3 zy+5_xZi$RaQOMX|EKmROAO8~v*6Z!t+n$I$ZC_qrUo)X0pQut7ofvv~{-`macyl4p zr@s*JamE~dw+6a+=y%pxn0vnioP?34ygdKp-b0oqEjyXx+wND_=6vMrTd$TZs`LI3 zMNfBktlBTFK z2a<)F!d$7E(71tEydCQYWN9WLrL>BLnG}RciaQDKc(l_pti05tTnDb?vpVzCm{pXcu8(@cZrr=M~@IkKlRB<{)^=MpRKHjM}Gabt*#L)q>8=PuTq3_@Qo^qZox4auLR3?GX< zyuH1#pnrb;Fdm1b(BBKu9DG6Z%>CLNm?WdTI-j()I6!1t`76Tr;tQ=CW2U`0gjaN> zk9XhT3Oe<>emovD23G65Vc*T+F0Dh`sL+EnVk$P^07h=f-v;Z^DIY&Io;#YN2(;-t zSC2kYq`IzBv!wnwGxv`=`}D}SR-751o(45$IiVCopN~GRekAHyoGgf|b7&>M7p`0U zo?sRdNIgoMv5E@{z1HTX)175v1Kl3U5Ogo8?g%6% zi~0!Mn+zl{T`EvSz0fRyEFfs86nR}VJsPDG*ygxXF4wH(dNch5bSk%LOWcF6sPYFz zFN$rZX`(x#bX)m2pzDBikLi^5dKVx<7D-YhrLN%XV`#N^A=3@B48y-X0o@Hdv`L|E zP6f3t{v%_K2(IL{6)160N+Gqf5J`awMeCyNC!pI#Qp&wD1m#6_>Ki3L0Seo=3E|eX zBH7DX)JMxvLpme_GqqA(UGAIn0pa`kp+8@O?P`tn0}fJ;X*Vm zZ=dPvr7QX})8-r{x5J)2?QxPh0z6*2u zFO)mJ6xIlX*bXFcz7L_k|2rT@9}OyZ>;e@Ga(4Bk>8WF+fa zkRXsLrCBD1a;mGF1q!>P(`&(H&eRkte=cQxOz?B1aPQMW_^dO^`xl&gD?k4QpC)T9 zj}LZLqvieaczWM%pAb-KX;g7f$YNB95MDw@c5Xb+@q=30ibdgdTvrQfpC%i5(tKf- zQb0B#idYqHp~r?Az^PS|{URbnEx}4!P&93Kq`b;k8YBzo+-!q}NsmLTjeZ0ej>QFw z7qq5Rmxh&mztmL)=DHSS*lvxI%nhu~NKtyRH1X+mP+v|G!xY}r6 z33j@eBE22^r0TxBthI;bvr0wBx8w1kJ8gZ6yjZWcTy(5$xn8Xq?J)tUAOUY}=VKw; z*IpL~^3?LRt2`wHm>xY(aw*hDL0%wa5Iihb_yB=n_^O%0j7ixVqFB@c5)mc8~@V>JU!k?*a0@5NKmTbbMxc>!FU{a7gvpH`5o5=!SRB5N*$B zUr~+G=5ErqR$fa4IzZf1+M(uh5Fja zy^=zTfHi0#MV4_xMZhEmM`E5}r9;T;%i;zo3gd8t%a~cNH=igD3eW0V6z*3+PYadi z|DdCs7B?SyB=z<~JFy+8enFe*MW{?efasGqp}7pcX9Q}hl>V!w0d>h*iRO+F#@Ba& z)!u<3?q16i__%ateP7OTDa_C;8_;?}Q1x8bLspF|OJpzH9Y+bN6|n#R?EMRW<2aI~ z58IaHOJ-Kp^z6>;e*cfR^UnV_Gu>Tj%aZ&)=NvEylA=?}OLbLupJc*;Kp+qR0vAFQ zrL5jY^B)qmZsfV0dS9jTX)ne_(;$&c(bWqvCRW1nqRabh#$3vTQ&*Up;r-bVmDGE2 zbZMl9;Lg<u}x&B(CCgsknh&zhoL=2)ckUGsM{|rBX}xrog0S z@da$Q+u#h`ky`h(gBhf%SP~V=kakg6V-mU_k~(6vDXegYQ3I*8Qbt-NQz&8e7X-=axFqG~6b^j5V&s*jzchrU zb|g&eD&ZxDYu~1=>c?Zs5BDW?bphs zMxREd4|-C{JldnTZAKRw%h<}bXhaQ!a22A=HEkWQNCE9YAwCp}NRz zd;m?lchq{#9F3R8<<%ZPJvZiFLK9=C zfQ4^Kr67pWom3XjJxbdEwk2kMtm}*s8A#iROr*0UcCG>k1P38k&@-Db!s0 zpH9Dde0co$@#Fpdee$FS(p*wK5P{MR>zSh$IE%Bn3TvshN}3@8=;Bn^6JVAlpalt& z3PFP${1JFU;H>he5czmJ!h}VT)O%Ec)PfaAl`m;rUKW_FhD**DFM9ra9YC+4*U+P? zIm4R#S72&Kq-Q0snxxyhJEyDq|x_WwgkzkjZ zT;ec{8J*A?&*E_TrcVp2dFm_)Lcp=$i8&{!GW_j^F;B+b_JQdI7jqBlK0-vR<~LvH zQT?PjR~scAXL_B-sy~z-7ZiG3Ien!h%~5K;k^Y|bopHW!t)R^YaRXUto@m0joX%`9 z-5+VEd8&>2=8Eu)U`h!QK$9h!&%*hZU>nM9z>#VbdPfIA6XfuL5QdJGEdxicAT#wx z){mhugsP4_lLUY7P2Q@q2z}h?6tkqso-c3rx5e7V_{Uv>4fstl>(D}D{V1eR!W2|t z6-@`k8?{4VMme4KdcB4=1xMctAWGNJp>%G|dt(E7W%K4i4A>r+np<^i&LXKB^tL0? z(!;um5-*9_*vKFJPz@?D00uT_OXG{JmyBtp%QGoBE-DL#3%Xr8fVMK#yc%6Lwk=LW zRp45DWwt9Y8hHu2I$Z><9s?Ncg|tU&qFyK6(;Yyk-4eo2{}CfKcR?0w=xsx?Q9@t9 zk40?rj73E<)e=2%R|_kfSXT(>06HA|t8(*Se$)KN>O2OJ&{7E84oItlL*2C`p&|5u ze6r#s^pZ-0&;v}Y+)!ANKFuR-8n#*WYfz=z5J9FIbe2b^?(V}$YQ)H5gIeB6G!63| z&=k%vw$~J8zzk(DAu<4hiX?T3XkmIn(mkpvEE?wU@K9f!LrRg3`2qAuz%9fupyaM? z$sQsc5IXYV6kzsMOMiu43ipt|jc~pC0=W^^lUhV!rh(`ZeJ(3&=$n_dLE)mom;MmW&}`DIBjrY7 zfCrRH)S}|1ZlzNv6w)LSG)H1X%$ZuVzisdIyo{EnsqsZMV!%8;px=8;A!FhLG@)yh znO0{stXAfG*U?FG+kh}b{NdqINouiZ@cz=Abcjya4D%X@qCfl@uH{D?mf@az<4WD+9!HVcbcI{iY$5+k677ha;$x+sa5Bdp0 z7GkSypb;cwT_7|VG|Z9I7BQBbwY*?0>76V=351x*69sN4A<;^L!&m@v2_H{aGu0yEtfrYJS%r>E?pj!~0rM4)!g3uP`9#}EThe5fx zl~XA)y(UXYbwBDOD5}G3;ApeTd1oblJ!IchTR181w?`RM1nB7t@mtwXDXj+s%4Kp; z3(|)9>lw8ryJ5>VC$CnskM>zYTnaA@Sq?HlSR=YHoJ?^jhc-3vK?@Sw@!HURuG${xH7(paCDB%cK4~QhX@i4FgEoWU^_0pe!&A(ix7RK4t7iD<{=nbcvOmHql9bg`1Kg-rQ2BMBPdKIz-*FyAz`2J z0W?V>{j^m0GyuGlr$}$tG+^L+Ngjl9tL%-wViIU=6(|)SZh0jppO!W)0&+rvvmsLX zJaBr+jP)z>EmX}#>!Q-(WbQ9-v-lu%?}I&!SQZ zsesxU!@JYT8B!`U6b>1hzolma+C=u8wFPt112_c>{mOL4B$QG>j3sKQJ#jJ{b2kpxa}(a=le#w<`* z4uCEo*0`RmfY+pk(A>pA^vBJi$!ojj^^3MvfN%3cgb$EO#*~sQ&MG7cBsFw0MhP;B z&M?bfsHCeXy3EPtD zG=wu8C^#u(`{PhqY=DQn`LWkwGgGRDRD~|5De+4%Sm|UsD@|Z|6JC8ha}HPXEitt1 z0_Ylk4^b9TQwFM@%4Dc9GR^m*$qGsPxPZ)Hc>HS@sq06O#!f(>Z+ z7P^OivA{qeGX`Nl8G@RQkkf?hmJz-Tl_9(9PrHhuuy;O-bRTlk55Uv!3En z%j+c=A3l84%ilH6X#^pYN2Kqx_1)g@9`Em;SOC2?+LVnnQw&zq6}A)0l`Laqz6P4= zG|Y2Q3RDCwkQmO123V3gy}eQ{m*sD$it>2;au4ZTy1>VeA3uEfVC`w}G?(?8lcXTg z?}#;>Gk!&}EyOZoI0;>a5j1{?WDlnRhsK8q5zq!9*tgI_(MCtZi5T)^ga)LNl)iK) zHYjP(^FA&V1Lr0Gb_dXCK8u#Tz&lB6=(7|(5Pb;L7fH!dCF1K3p!tus=$X^g%g}-{0rG)RmbT+f>eWY~(F2j$rkEivhqjCD0%O=T=@4-6 z-dsZD+hxg-sHo_>&E4(23Q<&LDYcz=_D52VyYd75qo6W|rVGMZBJJNxelMW5QQr@- zb_usU4c|{tf$P=Il+?2)?FSBiJjSO_;zvx4VExk~^u2A=>N{Jvw>y13jH^BHo=w!S zN#-WO%}AcZ@fn>c8}9N+XKmE)Qb02%Y?AD;0VvTs`c0cDB{?|ba@B;fcHF9bG^-U^ z{nw0kou+647XnKf^`mg5J+of<5>$Z!<9uVjwfWD)1ijvrW^_wh(%wcip*hNssIv@u zy0+>@JGicnJ!HW($bK~+j}XQ}tg}OlKxWXY18AKmnv=2+V_P7OyinR~JibVE#9>2D zm}2-ZI!e8?t8DY74au?fVJKaE({0DmT4oGA29(L1Gl;r^>otZUW=O_nn-OMGgW?B8 zhyOj$ik{)?3W#BvYup9YI{YP4YCQpsFqzKRiw=`L=PgPp(s9`V^vKj71;N?@^tZr@ z8yZJbWFdYP8bE3S{k{j#DcVcE5Jz-sLj=-aMLR`+PEu~bmS}R;6U5b3&~Uii6FF!u za7z{<`m+iVf`gwt3bRK9C}LSU`il;~&_nnT|~<2WsF2^%y0m0EA%mHM&e!j z=Q=qL3DA5u;_9C>s%BWTHI6K_wNvBr0T9=?8eP2N0#!5;Gni?ird8d6NbTA`pLO z6rc%(mem>V@w7j@>4pl5^xaP1g-0HaC0WY$E`|T>csCCZPj5$!6vg%Kv7=vc=&k#S zHF3AOyT7~L`DhFU`gR=mX0=^OMkU>Chg(Vkf3!=YP`~IUG0hE-B;tO$oJvh?_OR3{ zm!8r^gY*o$6lJ4~pMLr&FMtN-%O6Y#(Owv2=KL?BG8UGc;4DAPHDe$`_n|A^h#8%h zDPiE=Y@kUSb#rrnuLEcZWKudrMFDMPhtW8S@}vgPfx7A3RjDBgy-a_#%o{|N_fj*ifQp=|El!9Fk-XoIQq}AH3jMO_99r`CfVI&r8E)YT znF=%#z2nmHfS*ECWJB zMnkL}K;xfm8qr1wUs*am@m@;gzfOUE99n@L!W=6&m2sx;fTqrvMSm>XMn5G^&G3(( zvk&o>hP}Z_Z~CT#^say=X#ri{ENHUy^Pswaxz$-S{kvtylGA6;sNs)urW;n5d`S;n zQ;I*;piu3OUr+kwRigUU4NB89E#9%1DS0uypJ66uq_8WJayw^yW(bAx02*{2_D-XZ zGM7N*{#aaRkGtmzu)Z{Ema~s^CeVal0^1M`6ArVOrm(i^@VA{uM__2}rj%&Ek-EN) zBi8%zJTm`kGp$KhFBwp@IgALRsTa;;<*Lyz&6#v6dpSb8toHYKaFj4E^hbMW{TFS| zRmu3V28;lcJAP5f5Y?r*S1g5%K6gc4meobcxm2rxPSl*n>~j%4UxeiN>#C9~wbHSy z8fpgWNK%V@J>Kj6HSMu#i6lh^^I~BREW(^2T>L?z?rWyD(lCL$QC)KmWU<3vdH@Y7 zDNUScEb5|-Ub8>20u9NEhKA@v(D?1vE{J4k07>c(Jb$oJq^$I>PuJ*a64Tx&Rhrhq%TP;@I@)#+csk#%3yiuur51EJNbjWZz8uSO{h z5=~gjOXeNnV3uVju;1%R;n!CkLldP<(n@FjM;V6ftuZ}PN;pXpGtqM@q=%JkK*hYS z(MDkaKS{*_Q%<7;a|BGvJD|f)7C@hc1Hu6neTUgcLxk>$Bq%hJR45yQ*anesTB%WC zg^lPva6n5khu#d6u6%lWbe7u>A3pMz$%62B)X&O!Ql~MLmDb{-8;_@#)0@6D%G&L% z-{v@+^CJ1Oe}40~O__mc-rerOKVW#z9U5bciGmWXTzUEH2Z(l*Xwx*z$z}6Y38F}D z^vza1XJp$oNL9N2r(DW{Nq)_!o=Q=sTR4m1b{4boibA>>eDU9Ni>3$Wna!t9pYHGV zKsPM3HJt-2IW}pvIUw37BT0lMQv$^SJ-x(Q>P$nTWlwR6m@!j3SMo)qYwcQfp;(~6f8OK;rksxt1{=%k{9T!+2fro*P>Td^g#3> zurXQo+GolLYD6>0Mm62u!;ORx4TjG*KJZ(Z$-(6v^*|5A?9%+>>4G9nd*QYv7(hJ! zAcOde`)O5|M=9B(ElHX~RJ!{SNhQ3!y{;TU7xC?g<`x<775d4th6tpTM2mSAy**3Y zF2wsqd^?8j;IBL>6KAYtLV%_#Gue3IXh%0ynX~np*({Aia|O_6Grj}w=bNdD+VP5G zZ4gB8zr1K04-}`rJU~W*OkB`&A04$){g*=&S=eg?OwxSN*H~jDGQ$rI3XW53!Tz zC1ZI$x~$5b_-V6csr9cs`6nwhvu)nQ%rW#Z-8qXkQFqN@WVWF#S)#+0DA^Qc-=Z&V zE#czNqD;I9G*P2|6t1&pXo5>|^#Qc^z9KZEwZWMQE1?^fzbzVpw07^4%zBLyx`ZpS z-jC8ffz~g7Tt2I0DJEVYv5B10uprjjk63}1-e>?P8|{kJsrvFju;j?0s&cMrx9V* z!H58y5P=1MEY`|cD?R*#n9UZ7N&#r6Pe7Z7jX!9|Zze5pUb#og+IT06OOX;=(3tu& z5b}=>l~jB)T*{CNLOXrlr-Xgiq>hOeJqsJ({w(-`di_;m07+`T1Je)EuSRDHP3~H# zB59)mWgbKjW{9GbH|V3;YLg}o$vE(ccKKM=>RtS=P39_WhsXG>i=#zpJ4JQU9 z#(z(ia0ZW^0*`7$*O;M8c{qX73yHe=lLKhwr3Vl|g=NlQp-mj}P_-5}A{JvRECSgG zfMiswdG&;!q!1ud`Zu8Dhtwti{_yd78VrnhZlH?2yz0b2G zI^8=V5%YH%V}=VAO(X^sS~NV#PB0NY14>j$P#F%`89&GCh689(SogcwYxPE4Tz>vORVve3q)WhHjB=LgZDM3?gd$C;H3=7gI>$4=|Xh( z(NsV~H416|4M0zFArQ5(fv^a(N4`Q6(V)*L21H<}SwoD3aMCo*AfIy!j1Se^p{Qa8v~p~VbQ=#6oXRwEK-!e{L-x@UsQ3qJ^5oLW*TE5d|DAV6Pal7x8t z@JI^Gj~_mAiv*v(%DlvsZ>`k2l}OU-VZYhwEci}`S$f%};I9UOZg+)(W4^>BE#RX7H7!DhR8@L7_FylaW7mlr)@4RpM$pHA6rH#ae0|UP#qMtPWqOI|Jfhp*&h~+Z6?=DD-EAAo#l#7FHcN;vXC8l#yP&Jj_ z3&gxLyn+Kx1lH~ONY3MI^ zjJ5|j8&Wz%zP-`Y&D-sRKK#DZ-ov5x9)!c4sB~s=!>b|K6>G`MLq$UR_w8l>`SiA@ z{JRZZPLY{@twM-}(5}%PyQOg2jwO~7qRkaay&O7r`*8oi&AJpU1C5$O<@`uQfAvri z*O!}tdMQqAnHTQ7$_42FLQPK|mN3Fxt%#A7j#ER_e>e%i>O;v0`d}2&K>2ME5da&3+Fn&4SY7 zEYNT$C<36*J5yU#LjfVF8j-lE?*mV7ZbNr*QbVj66I9wzQr~*o>*%2=zpoJ841G+E zLO7ZeJd>;y(bua-?#+U-^Br6w(?iWLpwAn7dTZZr9P&n>4~vLq!XnoCu}6f1va^_d z>Y9e2PlZmj4?*;!a|Q$mlhlWOyOk1<{us zX+R6jk#zQRdve$q`QsZ=Zcs9g2CK9ipO@HbydY1148$;?vZ&W7-Up#?UeskD1A9VZzn)fKa_;|%r@G% z4y!*DfbOdU`e@miEES^4Y$43R?~*%%UgxB^p;u<;=eHj0oM{PCF@P}Up^%D1Eg|-F zP%i$YrUmkbD8A&}yh(zFPy>1I2OnmHNureW2=@Zcry_c!eISxrV6{b!y3EF-A*zu7 z%U}Kyd8u`w$xZ)QWrI0w4goPKA)q}%L=Om^T!nBz^gx6kB3rE6PM9w*pLL_8-*8thHaxm#yS;zYd(=1FSsjmib}ZJW|9ARXy9aLVXh1f}++Hd3 zVgLH7mw4dS$msN06ZlrY(BsFST@kwOpl7lDd+}t$8h_&uNo|J!sz^;p7XHY7ZV$=M zy&TrKxiCy3xcJT8pZ@fxPoF*wue25rsPK#*uB@A(XW0p9f5Ih}c?0NV42TA0M$d$f zeo_;Sk)YMlAT>aM#fT6fLz3Fm1DsTDVc`3|sTlx)xAav`lC>&Jl2C;P^uSHj0yMBp zy8PxV@&np@I773|Yl?5xq3*W0H>}kDRD+@kFYQj{r zD(lU>fS%NpcJ8A_^GN_vNHq8Uc_eel zajQVSQMRyA>-89uXi&F2@n|Pyo z>TY{~|9E(%%kEA-2^mf;WQ%4C_d*b}%Xl~;!22yvS(KPn8p*gN*vP~-KiJu(^_{LbQFgf8jRA-!m4*W#FH;a-vT|#h8eDv|9b>2 zF!ofo7KR91L=tW#!fLMRJU_t8jWOyBqRMK;_xG~62YP+k{||1i9f}v!awmI2X=pZh z4B?Z^s`)9)9FFTZ;p{L9k*rd{X1nqP^g3D%e`91Uwuq5x%$OHo((Ydb1vJXd*(f7L z%Z84IjH#h}vG|H@j^ubcgN(%_3Fuvt)W?+H6bP5^fjZFTq~kPC=w&X!Onxo>y>$+36rvU&hN}0Gf|f`r zOQ5#poHoMQTww-{H6R?6#8mI>bp#MPOptU_C1wFmQtrna{8^aLLw^{Uz zAq6orQ!i^CMN<$ss~={NnWS+IG8T#x0(8UcBD`0(CD=?)KA9J^0ufcm-1 z#qL?;)ZHX;G1uvI#@!VqRwk6f9<7K0VFLJ|agCPHFxS%~It$XXXrDsU-h&0l-*={V zfU!e;0fQ80jtC$xni=3QAv4&a4?fZ&eD&|zMJ$p%kbxOJDT1=#5N#5kI#L$xpCm$% z)ZQ2hN)LumjR*5U>4d;A1d>Wdhq*C`h=Ar0B?*e}a!2nXDMYk|E;#Fm;#j>7P!gSi z`lwc&!p861ppt?y+VLqux%_gB&Gv4;-+%bF#c;bL5TY zD{$1vrC5drjiK8iqE0$+F$9L~E+*6Z@)zXDr;nRYxWfM6Um(N~3i3Rr+3BQTqNh8W z42kMw8&1_-5C$m5f7M(?9+j(|lQKn6mYz}ahx&*qpIt~3KE=7}ZnOrWZ#2aBR~G1Br45x}+My0Q8MLL0 zn{8LY)Xt-*lwJ>P;^CQ51eW-(03~L!4~ETAI(w+#J3Zi%yp*PjE1H6m z1+GSiM~d9v%uDg3<^S&CDN7HYO^8sb_AH)zw2@@tHOxa12H$p(UQbh2FIe<(X=LiiiS+zgbpm;_Bs%yGD*_V#99J;8N;pNQzS{D$p#T=n$Z2+`h7e zSR#@^V=eGb(pf~?5<`#AwT0iKNhWdzbNOJYCrIf5(Gt_5IxquhHry?;fG47M04;x% zeB8LV^t=sA85{twhDO`h9Y9w~FY`r2cx;5}BuKQ-SPgx>lGF=i7c&mZMfNXXknT%S z%h<Y0^ex8I5J6l%S7BXJi1J z5Smm6KnJ=1B%FaHhDHi4L^ELz#6m;{q&Pr9gvCj;&`b7+SQJ7>43pLmpdrZOOFPHm zN;K=3IU#&#GRSvVXHNtIKjx>~CsM`4Fq&~az9YFZX3 z{WIuRV$3~W9;M5RU@`?2Ftt%L44>G|Fq3alm8v?9oG+sn)4EK4K=x6CcN{Q9E)Ypv zx5bT$sx9;n5h=%=^v&Vnm08q|p56F&-YG>}NDlz2KvlmZ{WnOhLc^J%Btc}>Bm?{5 z8O(B3)GaE@mzOu?(<`PMu9wcBgNG^Z@9%St`RW%dx3Ww)_bq&;2*4;v7@(FA^JwAX z@ArFDMairYmIu(t6Dnx|izrtlTf`trDHag0kPyB*s2|0xXl%1efoKGrt65S|o*`Es z4bV@nWbe_Ehg=1ErV*DRlF33DAp-c^u2AdkZcB9@K0MMQbSzD6t8QLiUdVxMyB%Jw z+`gJVLN^ZgZ95#n$3O_lok(;i(8{Evi=^$1pWI1y_bLrYN9V|oLX;~@N4gP{USId_ zhkPI*MK;4-WBX;tn{Mi?hsHVK{+oQ>qjPR0$4;`N(8}9~1lFOT8Xp38!r<*@`|;yP zw}TF#Q%#W03LPX$=z`uu34}<-(0zCz5I&o0#_UrmvFs!aVgD793g8o^8zNAkXEo2c z5g7OxkH{ws0mwMxM1QpPI^`-~gNaoIZp%sNbwYEKt_SV?Xnfk+Cde=Cd-Sz9ByrKV zRE=bPfLLoiSLl_?B@UAB1Lu@{^Q9k*v_rK9)w<*WT4P~)0Il6x(uN8W)#X8iLfBS_ zVyh)V83#Da2-#u8B>>ElBw*+g67^7n*#wlipp?=+~=5~`jkRa6*?Qw|NHw#B*z zKU)6p6`c<>%og{a{%W8^-sZ9hkEd5|Hw+WA(7&j)#0!* zMU31b!qJ+izJiQ6rVP||AXhA3tNW;y-5TXl5lTlMI_(Td9f_B-Xy3m?8}&{NJDFg~>G6K*5^M6Y^9pTi6?hluKZ};!8_+df zh%{{9o;`Bc6UU1PJz(L!M(6V`Wxo9Yde}O292vG|z&N-PRbA{teU?gHpjR82Ch05# zXIT5!^_<5b-IvnL1Bt7cq02&mO1&JKOa_#l*Bbl|+^r+fyaZ-9YKkSlX)$7Ri!3w` zOQVz|HDal6U+W-us)Z6jPm};?kb|ml0Gvj3kOf8x1)1pja>H+tq4ARoBy|lbf?N=U zzJciupj~4wlEMfkkpU^IN>thB;Adb_P&yJ7j(#_#WNa9X7kY*;D`_T^NEtk{Jm|BW zNj8uTI>AultZ0ZZ z!w&(5RFrC>Wv0QYsSaAx z*AgSYH0TKatp4H2Z67BLW@#IyWaUNDoHLH18`h3=W9Axr=V zr~!ttj6ER;Vd4ga$b_RL`wopm$n2JNyix%)h~h-UcOgPJB!>^8^Lnf`NYhqobGvgm zwhvKaFtCwtnU07e84gD3nI84I5G8;l!k#mMJnk~!u;6m}ufkww9|BeII~_oG(Av>b ztCgyq16oyO8+L>-N-9|*PiScW3ELcHPoa@aC@4kGW8tTp;Q+cN4OnuPSd;1b*x9Jx zH`eUDq#eEqE;lnnI*T&>-;=73TrHFXX!Z}18H|b>XoDnYgBwTGNNEaPI24yAaY-+t{#-f}sUQ@t7@eNou zwcKJrT<(i#(hI~ti$D^BQJ~k+3=clLguw?U#VO-JX^ypTFidjvtUFfoHOefN>?+|8 za{wJwJwZ=jgNyp9KyNfkHJ{{-0W>0iiiXs>)N=7xL_+w4$dGQy#-VFx^3wU;4xq_W zX0O$KRLj1c(qkU-sY^h7Ao90yELlm7gTr<0Af_tIZd}iFP{Ht$C{#hproC8VLM1g( zW3X_6iPRa)^sHrAhvhg`Od~3dN~%BNlC- zI7tPGdRwmrvJVT0xxq$o!_YJuI(9NbFT*G)lmXF3YKTHoLCh-@GX&`AC8Ek%8{km8 z$pJJP?0p!5u}x0QK*NM=j1})FMNni29W+zK;#v%=6r`ic!|_0a*y^@~QAW~x6w@}$ z1!%8KI`3TM9HWvwgQeyM_~))v{>*jRG*Xu=dl$W7kUm@Dzb?-hjdryfJ-q~V+CYOe zfgaC9Csc`z#(5iyxP&{|L^%<+?_UO}>`rxP>m&G7B=_m~WSzZK* zp>x@~7);V+ycBGOFpIWIF|SI=G!$kbrD0-Uc)LhBdpWtUegoz9D4G1w98ucv{{H^y z>FMLgkDoq$`st^iARZnba?FPegE1qbsd&=>(XWO33Fw2LhDHpuWJ5=fZPjfpmI@#X zGfCYw&M-XzF!j|BYllgcFos1Z69N}BdJ^VJp>>ff3av)y>4KWfIQlCKdXC%52vK8V zyeNN+I&W#1Mb9DQ5!?KK04+yT)28&{{&oNOcn=MKyVXQZS1?EI^%EmF39X?s=C}Z5 z>7@Pm>Ss%FHPmc3`C&laY$Kpg4e4-q1ZnsA0iWR*T1UpTiLHv+vdhO|4RI@km?;}^R}EJ{FhUXPZ2fu^n0+RnST(?K(wC#%>@ zXb+DQHY63nrT!$f$Qdk>{G{`ltKl70-vNWEeF)S?-{%0j9Xii1w=h9cv*hVwprJp$ zG0bwhP^|*yfJb%}#NQSxhbc?M*UXHc?sgBdGjeT~Xd)rr!J5n^dH;zCntLa7>)~jo zTF=}ZNra}0+)Zg@NN6praZ5y$SK6d1jw6Q9LglfBAk4@^G#^@kEQ7G141!*2ki13_ zh_=5*$9J7Byi{ZTE`o0t%z~$|DO6~~RCnB%M#Fw5{S!YH@qr%kklufYHfkYUSWCij zljPijxLF#s52;)blgqQ&ILFE=-EP8UDsFEAvHREe$(rRJEcz{)>wbjL&i6M!S|p|i zp<7E`fpHbT1YhwZgj$%q^Rq|;5wXalu^-vL;a6y)Ieo{O5DN8kP_3F_Lg=xM!=5erAlZ78Cn*Qq{gZnB3(SL>ygJG{Hzb2s_VZoOkg{9{mBG7j}yV3zI zj~~v&3KT=fWpl-z91hcpH+<*)YKpncxBdvBeuEW4s@4o%AgwfMZK>?CH|54uZR*u& z@CINIx#KT0H0=YDai)2RK5ZzqZ#`8o&u9@r6=lOgKhfM5F)d`?_-d4e5PjWyT+7e+ z?KOw!v6i>T*^D495cD#3MPa7A4r+`44gqM@MolqOTPPbM@I^7&r|1v~Yu*DT0OC=k zMgaYAUiL4K504QL(&i^6F>i+lJO>WVHEf6zEA;L89++ng#^%fZ`F{8TcdUwrXodqU zI5tQ)#SfO2EYZu%vKQ9%oae9UxfaaCjhdqDnHYBaw$+(YL!b11`!g;ZHN%2WN2F>| z4h;c9z)3;zBABN)=H3mn*6aTG^z=z$o89f5gqeDGo_%B5hS=TB;dF#wP6(nWMChKN zqqd2hSQ|k)G=JW+bM*fQYsq2Df`hQQw(S%|MHi=gwN(+bEmx}%-wGM(gvv!2G}NL z=MbF`F0-{2*+UbCPL%yX=pOJ(Lxn+4_gI(7xUj$J>_=+B>7-R}e|TYH|Lf@+n-B8sWIPV9Z`LcbPsi>3{lj*9UmH|X0j-s?Hk;jc zbMNVtfp9#%Js(f%Vt;l3a#XFCEh0>g7*8`}Lw*R6f}#gA@S3QlI5s>uN$G(J?l<== zRvy=~+(~qqic`1w8V%19tjT! zjdD50a7Q4QW>2b2xFZtXox*s(u&9NXc$IbzIym?(kk*K8SVF^}XbozI0UktWe}quq z4>-MTx*s9bo4&1q{~BV>F5w>JvRLbPW@v|M2Y*#UNGDdO`#m|D1`~#fls|9ER_$iH z5g$zs+mInuvxQ&cgq@F1KMh}=5TdGxB}i(N&2H2>|625VeiyjXo@=d7OAS9ln9!bZ zQm8vkEd)&aduY1)=-ssjm%1#&jk)CB^FLagR}YG&(=|&YSv^AY262Ys1DO7MzVC4I z(nBaG6AoLc5u82t3x1rdR5d;_9rMf3uXNo$+~DdeQ$vd?Lg&jm)QEe7 zdQPN2AR;NL19LopPAdB+LTIZLSgQ!LuVVDK)k>?~S5!9k&s!CxjS`vz>A#IkxwsHf zCpCFO6Jw=%qL0QYtC~@(U7dI5u}8b50c27Y2Nd138NEQy?@|0-7_7;!VO{<@Js6_@ zQ)7tE^e^g52xknPKH)eNTG}-1^-t-9`lF8aRvwQ{#wFOBNya^nKN2DihZ35EaDL1V zeicaOI~+hWOuVyPGkAt z?rzew?H7-(+x%rS`n+gu)D#rasOvG+Kels^@Jq7K61u_=YkGFWyH+DmV#!q~e&0>K z&Y3(|E4P=Nr4p^w8BrTGqTwX$+c}&78dFJ)03p%m=jW%D1L#RzMzUM^7y27D#iG7V zj4`->-Rl6FRnSKpX~`O2rEp@&lG(QY7o%-%E(Zl&mE}5n=$1xJ(bu|Y?C1}m3w?9V z;F;-s7DDFXL`#OgZb{}?v38{i;iQ}BF9hT#G^h`tpFi(Ee*9UfciSw)yWMu{`)LeE zo*Qc2i6Or@fJP=9N=X<3L;w^gm_>F`wS8VSQ8P>kLC8FV z7(gIMbocm>$r+i<%z)I-pFa~GhUcJ>L;#SQjEPne=qCgSga9NV89KQ_sQAMC;^mIl&}a?6Z>;LrD=@oS2$N)vEm_#hxVtEZ_@+lgsMfN{btG&!m2-< z^&cHT-|cSXuUa_z18Bq%iw!5WAp=1*#p{#zLafN3>R8lVk`l#{`XsiX+lUB1_h-Dpnc*CSq0=Li?Lk(kcMW>q21Dh~y zp6)9UMard+U-A(y&Jv^{U?;>;Xn-xCBu$XbNId+hqbXufSkIpHYUipO!5_mZotElA4w&TC%Z}X$eL&;|B4)5IrK0T&U8<-eJI-a zD`-;P4(syg(UOgdqC!Jqsx9=I{=UBF)T*or?1zmWCW;`#kklGPqQ%#1{tk!Z!^0CE zn@{~nLWG6KKCHK<(zA!dt2)@J(FtOC5rjd}ArRBJ{TVj2y)T3QI1&QW&c7E zfu6|S?_Ug(&>ukCme$TlVgNv4j$#SX+{=J62_{73C4B$z`0#ja4+JQw!a_965K9VW z*!y81Q;Zfj`e+GTNc?b!F#Bz``rJ#e(AaEFIz889=ufimXf~=&AMNxl4LYT5Df8U1 zPJS7VdSq+6+uqZAtysMj4hdQkj@pWz@d=SODk^Jprx$qWRiLD5^icF}`@s4`E6NW4 zAeD^t$K(jaUj011_rOY0Vbag)oKhHwHh@q%H6*z$J9+foF}td=c^g1t^O_(3Es&dS+_v z26q^N=jc-qdDkw-uWa=-{ooF|nPk9ZmvCLA2a{b(yh^TR<|MQvCJ~() zCR>VA1ky=^Ay(;40EGfT%Kw8A6sI zsGI{LW=b?=QK)C9rcfyh;zF#+U#my;z6zt0{2@VC_)lt)&>XjeJ4%r^y#w0p%uy%VBp9ZrjVHa3^Ig{iuS|wO6o%K1M>>=5_@1$ zqdKs9XeGiVPZT<3P_t-g48EPRNKGi1b18nb{Pp<3`oHUVNo%OlJEB0JHfp`m(z8n_ z$zkuP_%q9pT@;6B$IEU=Pse#G7W3{_w+Sp#o~4`HkQ;|Zk3!uL%hLw6cv761A)`_A zhj{|}Zv~pDQPgDd^b<{~cGkACft@OQ8eD<(h8!8^h`@wH=*3dR;h=ppkb-swt>rV( zg11xbJ4Q3U6&@1!gC{y|zr1U`+4^k9za%c$9{EbpF`=6i_sk$1s^Cuu&w%?XeZZ*t zvW@7c^)I9Je+4ed+smw*G|Keyq5E8+nG=e+OeI$-F-Ln%#|Y&=71|FK`h!h;hHbYw z`J!2eM6Kiua4uYq_J>9+`!M>w&(hmTS97C#r`d;GNy>&Vb_V0P=y(6AOE}1&p$(VQ zK^s1%E5F;$sR9e0WhPaSBH!9MauU@&I1iFkHqQt)>r+!3(gKAjA!JmV(Na6UMySc5 zUIw=VA)+uFS>;?oZ~7oNmX%MfX={3frjULLbALgHpv9`)Y|#v z8ff$@SfH1j)=Tun!fEX)W7EH~L7e64a9)1UHZPavNEEE=9I>V+TaTu*3xhSz61a{| z+)moFZ1lR@?c42!Mdab(K|bU!eljOWRL=w*H@ofecp#O5j05a;J3FQzZNtb7lxaH8 zv;=!aq9F(apWppZjP1V$tZLNI{%hz{L*M!d;+_+tboN;Q%{6Nxx22xtB&3lc2mu*c zP1uzwnN?fAwzs>#SC^q=zuz-61Q~0RH=-8wbdR2YV#jKv+?YXeyKQ^o8!X!=9K!1T zM0-S74rVm2XHKG+O<1`gdbFfr-6zC0GTuM#{_{Wo^WXpPzd;{wPLGd|5Sy)Z?)T4! z!ybFMWg^Sw?t!{cI#c5F^D_#zJ8ikQn}^+24~bI(?FsSvisl2Y`26xKy9IPIE*J`! zOrf`T$CsC1(Zk$}8EE+Fr=KZg|Dt_DTK;g{zrMa;DV3rugtuGmI&xc}%BzuI5j!6B zA_X(sE&>hYqKb5Q`%YwF1$BtB;$ro9w#qizSZH^WV@p%8?-~R32sEZqI>yLaS#TG0a`~Hm6g1r zYZn@Ygz2e5743OXG$9HT61A!Zr4IYLXfwBInCYT=n* zz;}J3bBXWR6zAc6^70Aj+Z*+iRvg9frdI-cnr42M7!0FlNjn@_I3CnD%PetT^zzTkyAVZroxSQ=nI+mh8&v(Tnv&_;G3G=QAKRU2B%Y zT010TpE_&F3(@WqjXv)e+J7?Yd%9~qT2cc+^=+fTZHosH;u2yoOgwcX<`Pfr|F8WK z!fSC|17T$Q`+GsxVQaQc+(L5=UF-JcZ_5soKFBnro^e#kgJYSjjN$~&-F83U2ZJVb z#yMo?aQ4TlX-*KUl%YZs`P&q=h!GALG|%B0A*PUfs(d<R=AW=nAN%pL^7xf^h}{*%y(K)C&i@-1vnCnhW7QnGjP_{_~C#w zT2lBQJ&KGC?z(43X@Mp^C`{ci#2`B4RdJ#zsqc|i=s*An7Jl}`eW!<}5|No9stU;h zsBv+kfe@5T<%OVq*5E>fo(9+%g*~u5_6Kk%D5d;v(dy&Y2$A+lDoE0IM2etsD$3+M zJOSZyMT&6I;S4rFgfVvY*p;BMj2XXCBU)<25Ga$JH{_U_=qkDm@jGZHd6#d-dzcm~ zy61$BTZR)1UU%M}FIVIomgTy;8ot!dBl^@v4_Om^KRckTvv7iLU%a-{26u9l+k9Za zye6*IH+(IBeu@riZca%|gm-1fR}&qsg!__5kQO49xkHlnsi#K44h z51=Oz4rHZ0sEUtxw24v&`4AWDP($8Ldw~Y}WuBV!b&mkzkm%g*HY(Tu$bvFj z`*dnQydi_5Rd&?|#cND{2ReEG z0s%h_%tdv5gGX^{7H>h&O8gd=`Sj@%!j=zL2nRhy0~KTR%q0+L)D+3pr^4x@MVJ1W zs?@7b4Wb7W69Oi1`=9c3|Fc1AExiUDg)S?SW(zRWGIf?6oiGD9O;j3N z#N=?+Ke-p8P<5JBp#?p7%oYYOE~Mc-~+f@pcNZ6_lp%Ug~LH+MT3 zpoi2bVXIdd-)^}`R$hFq9gVBCsVv@Tl2UbUE7Myo)L%aiDaBQ;5V(cgRsp73#-oXL zBcjWYfNOms#luIVJ890I<|WWzOA=#MPrwwq-c$=XYPyx0TnW!$xRnM?ObD%9+3=06M>>(c=HcW!aJ8!n;D4CV0a` zrp!iw8U>1`6jxb~oHAiUWIu+~ALd60zaPep#U(hlHWijnKnLy71tU*D4~;Gt0kl3$ zR=)O$XnxUqn7>vMq8YF3Cs_HmU;|)9*nz z3H@-ecP++@K%gW=Og_jRQMs02r&>j$!Mm~V`2=*(w7DOL9bP>jhss}iT2U;1hl_4p?SdDSqK^*0%mf}3R)|-Z<8LYcA8(QYhs1I-TJcD_=sKgKCn&SQ z8ovkJltSr|N%<^&6_wav&zhb!Am5wO;mdk1DXTXx2)$D1s?OWt1Dms0>YuK;BfX~o z47{X~x3Yv_?N-Elk3MOwMuE>4nAg&AOf%cO0~$|5$JT11`R<0htkY(rW=YtP|}`rj$2Pts1VQ&mY}CWHwx+;%%X z&zq>1UCGc{ktx7W60)H|@j*|6S#$|@rGkF1GZx~RdT{})H`Yo|P^aVm_1Rl) z#_n;qeYE##o6U}wkV*CJMyZFxeyewr;OZN)>p5su>h1IA&)JXrx#ku$88ax5M%Da(c@lHPKr=(M~r~hg&~W=A9KBLj6|R%V!y> zh7peJnbq#x%Wh6L+KgF`T87s6^zrBa^}qfXVrIe{q0&1fSFlVCdYPV{;cU{3Nwnwm z(a<0?A@-!QPH#+V7lKv=Nre-lXTF2f^r#ahC^bs~zTPs_wVE;*l+rNSvNh!XD2Tw_ zFz+eHzy!sgf!=D=9FgbND0^&bN53Q7=stw+f|ykBMsdic8$0IhTYOb+g9F=F872zf zPOsq*QViD8fcAfeUK;bH4@id8zD>RbX_h4h{i$_m)yOf2x`|-0Ft+pr^sSO~w`heD z$P>`W=!AXo4(RGzDhQJbGPC)^s>qC1rB7RXE?~9i;QfF_-trD;S`_8T@mpmxR`p*AR5j`kiYx8Ey0+=}$&IsGe)a@(-T^J&^b^o`EC|Y|yswA1 z-R=QrBdvb|+5#xNs2}O~5bOOF+vWn?72wH(x2RBnr%l|)KE+>$mu|%oqdL_5jy>O< zz86BZVBTpe(1y|ayjrPYC{G6hc(^_rvl~YVp;~gK(C{N1^cnyDP%YB~&hMeVOT*3q zJDamP49GaMzhpEyd*WR{!{o?i{~W&IwB20$1oR)nQPvyxl13kar!-16U&%WuOY(8A zx)~!1Fo}tSkVK*xr2qjlf$r^NIbmQ0EMecH*{3>eMJ)7(UiKmO=qbzgG|Pu*BN7|v zmIR6;Vr3#`3qhSyMb#^ND7Q(6L=v{PEzQ9!I%0*rjxock&K0~bPih4GN4NJC>elLw z%_7@DD2FUy`niL#&nvIG#``CT(8aXKnS~0vBxj&tg%%D`!pS>Fb5sdvr)rk7_wr-W zQ%q!BL?lOfs}e{Z+)XH^LhETvErw{}ZVDZ)sSE7=K451=fCMzyXv zZULY3Y2(q=0#ueSVvrm2hQ@-JVMd!YAmM}vC#d2eLWh_kGJq@zf%Xyu5=|IBG-2`* z#w5bCh<}!sg3wVFL}37*XwX<)1()cn@LQrUH*`Ym?4#cus7(>Qe!Yd+k3f^I_>ihb z9NVoZw|v)}7H{a}SNT0EDPkcA;e`l#`WsQjCHf97k--&bV(16g8vMR=uPrpwM4|vr zp|LK)T<1WTo_;8vMtcWZW?1yOa-;?HK-OSeo28}s&d+aR|9-DG8>9i9s-wUv2u@M~ z{NqvfM9ktN5Fo77f)gh=%X}YEbvatL0gY=k))ali5^YpRTk1UeRJ1gz%Sg-2^at=? zU)w=&1X{wN)8azfmJqu5lIzfOinibx_#}6H;XX)|8_@SN_7#CH5Un|%?BPTPK16g9 zGh4{IFT$Uc-)(Mw{q@(U4-e!di=I~2`HnQ5m>G3Cf4kfH6(xF>qB)z&YenhsA18I` ziX-EeJ-Ay`bUZZ2n#jO;d3iaV^oeh5Ak%icqvZH`a=qR7?Yz>C9=2-RJH5oFJ+C4G z9TDVb4BY}gn7+NyS^1lkH>+GM0w)^VW?NW5UYB+xo=;LWKxLnvK0H17W$r3VOj6?s zzzWSZND6x9S*!{4d}ve^9Ri%?LlkaI0g9Xch|)op+_YEQD{J__F>imGqiFp zAekYl3;^y}AyITHq&M3x_sd9+$XU`gHU^vN)s26l+ER1)k!1Hgj@sHFut7RbWscTj z?;iw1E##Td1<84mQ8aGYKB7o{QxVb5g_I`t=26Zl8^r1BYh}7S>zUsl6qCPQ2wZ5} z>cg~|GP@r3!mieL_*yC`gFTLbvZ<ofdS17@4iNh`O;PjN68+sGrd`T3N!pABGRXZhAnq#8pdfBy8V%u z=pk?8gHHH7QXLJVl;gdH zs*|Pzf25{oMkr2ou`!^{6p1*WXmV9l85?sdw(`+)ZO zNmR`(uOiN(Tih?inBjfRORUNFzBjZ3?M%Z`FFKc8C%;n|v5`ZFOnzi+Y{qj%OntlU znJ$DroEnZVA?OP_9k=WYn&|JIfYxr`EOOcM!rGV`Wd>i8Z@VdAiNlW2=|FQ7rNFeL zStj5YU6>d-M2k5~T_W0={;p70Z9sd@!rIz-^lNa zOUiPyH8G5w*_kL|$$Uqoqtod`3HPu2`+E&lW)-4L8!oyx(vmW&xxp=dJD3)0gF#;C z`KRHXWgX;fx;b+fW6w-aqET3MqDy4RT!N^&>*kO(Ov>tR6?*hW2BE*KeF}Z+VI6(T zEKBTDSJAK3U0KmHXz1qE{=n`6KV(AD@x*OjP|MV^x!vsY>Q6d$YmbV4y;74o|LySn z{QU6nkeAHH8=-LqBxfMkp}j+22q!4RdS;LCzbM8|=qmKviXQ6?b)MhPt82Ecp)c#; zHbeu=@SzipKmaEp<@S<_d@B zt`>TJNHn1OX#wa81EAvj;r{Voe)-o=pFYtMsS!vu0g~h+QgVwXk^* zI2m-H!1u&pw(6qh6fnt^(s3{`lCT78zVHs{%`FRAdk3`O z?8ifE+Z4p`p?1QsZc@dxXXczV3&K6Zk@ONL&F3!EFD_9VN;C4fXYTiLN{}a@AD@0= zAd{Mc$VdpC=-(f%t=CE`uY%@o)MbeN%b$S0z0*{a4U*i)PeAJjLhp9?q+gnx8D0+g z#lcd(RL#P;3^9X6#;O&Kbx~qYd-H}wU33$h<}D=SJD@qJ`G(r*`R+TaMHc7Ll9Xx+ zv>)s@Ew9_nqhy8}i7zEu9hGl^UMvWG*5JPbRJ~Hos`$0_U28Y>#x>|QTxP>4Z#c{R z8RuR`elkh*Si@0qQGZm=49uj=a<3ut&sT7K0oT5QqYj`wHE3IzD9~{24xn|e=gkV; zFo^xl4xnYm>Gr_t?#X4q==2E(f~B@aGXnxRVYYDP0D9x&%h%Vv4xkacqv^0kzkL(| zVdVgNBC~>(`Fu4mWnZH9Ec%Q^*QgG0I(ms3P&7SDmO>?M^{Th#W;0bik_F%?AwV&E z%<>-fm`^ha`Rw~~%RcWU%U8XE1E;meN+zy5EaCF)7TUXLha_Ntm;AP6SJWoyPuE8! zAC##fN(}V$65eo+*=PDyrYw}5K@Om?&Pf`i2p&B!n~KZO3lH{;O6h2tnhg ziH0mv>GVc8u58{+-8Dpb{I_G*^oomC3v_o^nU z=xDsOxq&&1#2uSMifFIkhyl$93`@4{wQ!fOfg7FJ#PXhh?!?aHQJyHZeIr05B%0Jp zB0P&r4xoG6zSjYCWO~hwUifX$OZMoR_6*MG@6g-1rhhV>tSx3;o74ex6jl*y`cH4i z96Jv=;Uhu|rQj#e&1V)ln1Q57>-LKtF( z2os)71rb43&MQ*j4?PpwF9~VqbCSL<_})NQ2kl0?^1*JA-6#*2(-6 zeo*|L3Htp5sMHX>LTCmrT~F~b2{1{ar0X+v{kMRBdZnM$*VOT!unpnm+t$! z+lQOCZJu=2l%YM;^XYBx_5F^d+uQBt?h#|QcW?grMEAnm9n}P<(_RLtQI8nzR%Bk& zqX}x%8*Kp8>^G+mPapr~mw#n=A_U?iU3*SofiIxX*vl9Fj*^*t(BcE9=;DB)WxWlE zQ-uH!@ZnUHNl8(Aua`lOptkLtpbm?Blo)MTbc#;7QK;yUJz})23UU%Opc4tRh3=s& zzhZ_y(l( zB?hxIn}r@q%vw7=fWG_{9F-kOK}R0`3$J<3f(BVfo=rjKPp<1Q~oZmxzmxiqaYb`tuoWXC$vu4YTleRG#Xxg!`w;9IEk<`E2 zS8%N3@o@x`ZHlj=s=z4(t)A6m|D>hp;L*=ztTd56>f|oWUA_m5t>5+Ec}aku%i@jhQYXe#w1`O3?r1c(8a zTA(>avokYS%!Y zhi*iTrp8cN15+U-57)>P(rzZt;p~mj5`#ojWaXk`ead2}Ks&va9wYnWZA?SeYlfx2 z^#mwY%djU(a)v1B(GmvCIMKPpGUMMCWeN<_InyTgQOM#dU}bq)XZ3#KZc4|Q#;o6h`}VP41=~MF^3vdd02jP%tw)|{LBv& zMZpqjM(Ea^-XJ8EKIM)YHqrEN3?mF+62@JX-6$G?Tb z!C+*-{r&xJr|;n=3bNKTRmrKm<>_#u>K*q1dINjfG zrO1cZwv(b?^LRDlw%4z)(_5bPu%-6Ys_WtA_Ha5O>EmQIi_XDOap#Zo{X8}1Ya~jk zPajTX^zPBt(&Meuks(z1H~Q_$4<9}f9XMlWL6Eni)-w{t{~{_Q2z^$=QmhA@ptmOo z9cz;WdKw2Kd>Nj7#=G*l0?c?+`4wm!Bb+6A`8LeTDoXa1=bGUloJ;fq>NC5#9dA%F zR0eCz*MVwz!K?`6rS`r2>r#Jv&kzs)MTo&29IU<(^}gjt1+$0 zggclVj)D|d#xyhqQz)z5z_v*$N??)-pD+pW*xmhOZjHsan9@4pLR>5VPfXDH4-x=GJ#14nNaZW-Yf3U9+$|;Z;w3#DjO7wnD8zSaF_+-~R5AfoD9zcHq zZs3Nt_$@J+QzSohL)%m_`w&92dGg?t09`^@NzS23Dp?2vXku+T`3kJ(qbymd%@%fT zSbzPoa9dL?GR`9*hUiEy1%k*d!N!h?vn!Hvxgc3|8B{jZn0IIa!D<_NdV)3fntYc* zb{j2z7W!-l0bSlnG+N&R(<3YF^EB2Paiqt!^yGrh#mx+vT@Llr?l6}|CWM}*q1J5- zN74tllJ}_Ar7S*UvRM;Uqe;j+-3n95qylle)$t6jJb*4eDh8W#yShoS5+h7fWOB2r z2pHAK@<22d9XMoxmWBZ_epUrFj_xE>>$Av6Y|>U<#0*rQae@4xpX#gG)%!F~Z?r+N zg!EXV?_iK<8mwP5H5scjoaumYFewCKp&B9Wc^0Jsw0ij-B{X4@0Afo{(Bcc6P3<*6 z_vnR_H)yQi4Pq^=0bS;$an2gNNz zRsV{7(B}$G5s3mgg~nQ-r7S8vWSM7NQ?yGn z#D*#`t1wZ3Oq*4y8BKV0-atv_PtX#Eyd;HxA=Cj^;R11tX_W9@hFBi-)dWq#XsnLe z;&AMr$=lMLni;0xw$Zdh`vegKiAF<0Kx+7*gBcyn=pNxDiJ}4elN9CjB0dm-pv=fI zbe%p2(4<8YL{I3vzX}d{QiDavwl*7ZhX3ea{`W-fZcw$y3?=>odC-wr?cA zyuA1q4kFRLg^g8c0=c;AuRUiwvb;iGTgf)v9S(Pe!Yk(aQbV;q_Io zilzx+BIP&O(qghFZ9)OGLmiJkfk)lJC0bz!K<$F!U|-QoAlaxDlt8bf&o$GqjP@KE zI-s!znK0>s96jePK!=0AkU=W@Ya}&TwPFn>xrszrTf+CDuJDz-QK)N?H=Nj3kmu2< zhr@oq&#^dB_>o^KSwn^01Vg=A?FP6+b!?^!wM;O52Q-7!c0&6ATC)pl7&YZyR%6X~VsA&LGidng zU{}{qQfsHZus}_LT8c8Qc|+5c=|!mjw3WvcbZhyjw1szdgMe=kuDt`g#V^KJWcj;A z4#=*8Iu|5VUipP4<+Lj#uHyBHX;~j(T1Lrt_!A+{CM}X_s{Gl;YQK=7Q5GdEoi?Mt z;NmqD=6X$OmW|Bc4zWZU@OQD|v14dWE+BvoT6{h9^@n;~ZQBx#Wix|3RQb<+M+;1R(i-SQD$Glc{8+$EWlqPpwIy5nf+k@NZgzxqFha{Z+=Ee>s+B(2@|L z(^-jnW<7(*^bkiK*!pXRFj1JEC2IAIuy(^%GKnHqbO(5i86^emCydS@(TFQs2eFLM zC9H5WDHl2$RyOyIHN%~DPD~x{==SmrROwrKBgQe+(}=lHrG0CJ@`gn zQ0Uuk>|cU4J5x%qCNo22=}ii;M3Q>VeXc?{fJScA6unH3HJjoGym|e19WD( z&^w@adK?T7w5*U4hjLvD-IU?w{_f}7+)sivd)7eSOrbHUXv~Z%1On)p@=3J!hiq<^ z=w+J1Yb{3u%Eu6AB*f(6gpR?N@f^@=2u)HPiZw;!lil+6_ITJoet7)!>C=9{-`s6qPsgXHkJ?qd>C_K}crqBh z?pBlM%gYO?5EP9UKR!O)-so)=6#jN|-0z=Hdhq%7^u~^K^YHLUb}wRY{)Y9<>*4d^ z_}PQNcHM4$?w~k2b?WVhdYmi?3n8=3d2wnHBiZYU^y+=9)$;!Cc866rM`}GDSwdhi zfR@c~>SYF{Y?5y>4{9HXdD3%x`=>ws>8GE5M!TwPz#PKp9Q_TXpbOCpyLbV@^%Y!- zFjE_uq=t?_vRg#_9;FHpt&pmvPl?tEFZ{!Cd;(g#Fhd)3@AT?MsV}k6GyNKhhGYr0 zevwOwB?~yKu#j5xA(le`YEejP^vuGf7N?LlCs(2YQ5xi|o@#T#K=gS3NGW5*gTW+h zzySC_2fu241oC=(+36#sNq0wc**U|^!UDO@CQ)Xi2IB+tJ4+jG44Ca!<7Kb_hfQNTD& zDdXp7wnVL@PpVXxx3|xqKO@MjrR;-12(Z>}z0BVeR_nF4CtQL0tnKLLI;%fnCZTO| zZ3mczK_#x6q+_ei=0R2PGYZJk2;MfTDN;>BwFWJqAKld;D1}w) z?}D`C601d=sqa4u`Zl?`-PWM-7~eCxxocL06>G+elMu;Kk6ck7)4t-VY<2Js_;N1E z=oK6vE%c9r^Bq8I7Ow834%I1A)D}f6bwWaVC>%N_gqiBmo+cE=O@q+W-v<3|j16EO z(I?(V{nkk;K3dWf?}P(E(4wHDCrk>}T&Cwc^xYOuUhta$=%lIp*H0)jWBO=8W2Hmm zde9_Gc90}_6cKniV&AHVZs4N;wQu+LkEmyd;bTK4Zd5@?lWA%0^%u-+7X>x$fa1_f zprW$X@LJFiegu$=aEJo&2o#dVd$@D(5{q@p>nS8EhjM~GG8&LD1*%=J-!B^-%-4OF zCoJid&;aM^(e&6?WyZ9`1+t0p$~?$T^aIqn+`h$Hxru_@Mp}ntk`gn>q)UvJ{TmSF zDYwz-Zc%3@dO@ijsuuhqsj@7I8P0RxLH0Wx&>X}th~g`}vV_Y14la@DaiPw%TcIU% z*~2e{xkO7I(09iY*}W}`PB=^A1}x(gTA5csqLV!_DL8{(Lpjg;Nax0$WP$E`yfEWT zqaD5Qr2$KYjR4EyreIt|U=kV`GPBf+>R$L#>2olK8})6tw%j%NwuJvI^=ha*y<&*3 z_}IT<`OdpFA58Owh=nd90$>&`gdbQXke+h#O6mmWsH9$IHjboa@Yv8ZL=5!N&}*0p zB+4erS?4I3V5Fz*HlvrQgqcio1wE&ydxQ^q8uY0>T`d_DAB6715QQ$%soHE5k>f1@9eczC#fe9{3iGOu|O-#_ukbf^4VI8jdI9p2JSkXt>s z2@S`0B_z2Z{l9Zr-g;X@3$Y?}QYDOx3KBP4_13fc8aTnzvzEH8!*se!rO~rPHCz57Jy303;U^1-&m)hdD};P}^-|k{D8_ z$D$SD3E?lo$g7m@!p&Tm)kS|Rg;YNWUBVr$q9PAs3hbt31ooudGoWf74L%JRRH$hE zOD^rjx zw$cMrr_bhyud(ybC!hlwt5H+_CD4d;7DCNRnr^(XUGM}n6Pa~r0}-*JvvK)hPe8x1 z&0@pLqI`Sf7pooGk8~53B|WhgcG1a9G}7ItQdFEuY41%d?CS~WYH%6QvN>1$^-_!@ zq@lN`E2Tj_veA>UEk2cj#z;bdo&eg36htf0cP-p*xpmQzG(Ak{g@@Ka#kg1Qfhxj5 z+lcTBCD6+g2E|{Z_=pt^p|j*c4^gWT*yvkifvV zk}1&vvr_PtnE+^YNknKXr9l7rZ!5)+WJcl=S({rXyVLMS6pB#jjQYh+THr@N0j=in zQ~=Yd0tCI#_ZOU`64JlP7*6F4v4rb%1=9Rc4oWQqgCztQOV`oB6;PIQs1m`N%nUOl zdkstUIxmr&$y9VLZ~5CSdx&Lr#Ar`)0hr14vVXbo324*mj#GPzVUDx40PxqCcpU`Z z1t)zC%>-!?0h#2D^1>vVDY_e>tBB;{i;XkozcH>Y{rC0+be`(LAGNLUi)e8$l;8O+ zNsx)6mKel-{}N7^XbA1D*Ww6WS>hFmx-@}kI6)tEs@$n+0a0`W5*8|T26Pf8wGTnB zq0c_k44gU&^hm~~s zo?csEl7%US-9>=&*nj-MptdPwyweZ;-rU^p?mm6`aQ~1;Ah*x^*AE{)91n8Z!|}7v zn(c>rLRqc_-y5)e@skB{hbmnC;o$>&T}q)6Z#S>_ww`^?Ona-7@y(qMbIE8MPKV?3 z;ixB<{XLS~?dH+TE=hW)GyZ-&y&{&nxK?VM!KGV+BkV^PUOhw@Bl3;y=AMAEG!ET0 zX$nHw@2?3$yWdFF65w+zlH9!hYT(1e!@vB?zdSvC*zffNjFxPU=P)g==nQCxSV20! zgveChvssEsvmi#a5dMsCicmUdpdDxpKx&#uEt3~*518E(p(;gl>qJYD%4J6q5#ba^ zs3#eXlmZf^lo(LLiH2T+`i4lBgdlup9RY`e2+`IT8iY>>O1=gH8!8M@Q$qG|t(T0q>tT=>p4PjEj@pZh3K7-j# zqun72E^bm6h}<775t-Q2!w*p1=`@mk+HJ%}ZKP-*cry9?`Gs0MK72|lsB*zlbI{BD z5plKsm+TBX^vlb#ELzpfaSPr5K=&FtJ#3PggpXQ}q(OtiPe332z!^8AZHj}Yi@}`^ z1XQ9^D3KAQ5YD;q+J48G#2=m5El|QLYS5W_Qr%?{@7%O90FXcT1T<@pK9kc5);4~! zLhrTm{ibNQLr?q-&<*f^G|=pgy4tVS(T|r!+o}`<;J5D$WYK3yYLXrcD%4*~(NKER z&)dS2JoG=GfIb5nvCvo-LNgLsG&n`Hslke@Dj{Py98Fl>h*(Ui6@?~5K>Tjg@XiL} zTDS-i-k{?Vl$FL&=>V!HE(m3O=$?RVf6Y|w?4Kt+$e^aG63Nm20v~j)&6P@DLhjyN zztBsjVQFN-K%Zg{Nd=mnBtll2>|(hwXP#vP0iXK|eUR>Ovz0dA@E~_k?_|U}6#v`- zoXTCnkc3sKOAEaOYB3}1`F&k_Sc%ZnLfa&nG!l*DoxwLe0j;hz#BH7oXGm14d89UV zEv@6sG_%5PeVNHyfgNg78l51>}V5;p>kZYE)Z|%!*t-PL*`aL1HD4D?$2I-MFEQA|J4!qyL zz=>DH4+Ch+2t<3LqCF6KU=*!`(62(W7aI2*zfn_}MlIxno*&w>bHJbV%aR5??d{4LBo%E;Xn8F9(a2+{ zN|%VviNSVz_w@9L3uG2T0(m{icz1g|>PcsM-XEpp(-fLGpOeWW>=b%s7CO0bVV&9C z>d|I0!XS&&R2=`w~BcwuzVUPDJswR@S zrwZbhUSmib$Iv@H;fp1@w^xEcZanxE9MUhHsK}a|HW8(S+gqCJ>FJ5GXqF^QLrL;C ze+pJBnGo-zWTG<#g$6SXeH1#;5Fq>@(VkyAXP{-=r&@q$me! zm1pgsuj~?pY~X>Oz#l*Z#{H6n+W<-gp+WKAL9!Rn8T2%zBn%NCK=zdArXAr532rAj z{|xe*VgC@c3}kWLmzXtIkG@3U7GPf0E7Sv+AxP@Wx(a0P^R9F|eD|-Dk$3Z`P(tcU zi&@Ir2IoHunvGmR80})f>S-99A|ay>-Aw1>8fW>28E4Q&YpU1Mb$!zkMTQiI@m_7- zwi`V_@b`ymkZ-pRi6a02|MW>jK~%*>JHrvH9Y2A4r;%6b$4lfbshqT^TjP*Eb+uX% z!R?7j-%^eZq2noc7IF=FS1@f@-G}o>k6}rr+*LLTL#Th+b$aK|C<;GT4YZSolnEFv z7WDXPnq{ZU%TiwUBvk`*)I1Pt_@cl!<45bi4r}9LtsSl%M?bthC*x%-i*hx$$t83# z&9YYG|Hsqb2hDJf+VmLCz<4tDv zmKeR35yAwCs=L~;UE_eB{zh1pw6SBhpU5+uk~v68J#j%eZW?+5vi%*99W@)MqAQa~ zO?;K*e1CPyCt&I%sfX*OX>t${AW~(v1+;PQUK3he%M8`=?vc$RcRRW%V#~*0<+g&T zX%|zvx^+x#HRx{I3r-Mv8W2TX`QNm0(Txqr=T7>RX$<9G+~L^EmKPGrau!YwQo8Eg zwa*+^A3#gYGNVF8Y_Us`uw5I_I7HicL4Yfov#L!YJ!)1PGL+LUX&Eo+$Yp<+sZuGW zKh>W>3H~CjBk5@6atx3;w}^0FeyOK%{P5fI^7hn;cm(shm!qZ&lE+@$ebCH&Il? zVk%3g=eO*-m12ctMwrAlK*(;j%Hpkv^($Rm{-f>b>FMF&!P(pTI}Hg`wIIycdKRr3 z>ta03j6Mqq!VIvjQBx%EB|rn=S`H1I!5$>jRuGI)-G%vcpa|&aC=t_Tb(1T9 z8jpgrx)T0m5;i&kS5ZGEv59WOVmxIS`eYH=s89!S8_rdpShu@?<>k31M$P~*C3TMzkbG{{@Us^uA z-Eidq+72OaamEY)@w7L)xjo`CqW}2{j-c$~(-i*sBROumm8A!|{pvIbgr!~SN|8@ugp$iq>g-7_G-X37jg>}eT?E)GA$5|goZ z3H-vGnR4ujf5Hh9j$~o}jb6bK`QFY%znHfKLiFYKI#a>4%Z68b`WT*&WKjW!gMXkS)OUk&@uchmOG zxVH3k#nS$@c3#6;x!3B+S2)r4cG|EX(WjVp&P<1FMj%rbY-W-_|M`D>+uXkL41oZ2 zd@_<53(-SJG*%@V;eNh?89-Ao1d>7cAavwGU(KE_Am6BU;V3N5QjZ1BC$8d5<3Stm?N%@1 z0A>=L_OHKERye!eLk^Bryv&nVv-2@c6Y+nC{*8Z|?xdeCWczYB9(BeIA_lO^fAfMG z*givi+hb&^MohNoK}heWbT6R1(1*ibd#%`f)R$vSa;wKIB4z0+cF)6#4XF=XZeF;cL7;Pa4OLI5{i4N#FXXy|@l0axTg4@uu3gJ<|{W!@2 z*i-5nCa8o&i_ZKLYfE{;Su`Q;rvyhU7eEzsAp%A8VTj}{R1y^l0ebl&K&lMjL_X0} zKj9{aO_u4K<=gKQ)o5GXcQ3^qW;L3juh$xywGR8{3@4x`iKZ-cW(_i-x6|a2sYrTc z363?}MkBF@4ZM!$dc$;w%b!wG1Y@)Azj}Lmz)un(jbx`opNdI3|B2$dnJ$Q6cGL%SP|`mD_N!ZP9CfZ||hx_72I@?e5`!JHwB|wGN@W{We(Z zu%6!!^);v)oMqT;6KW9u{tuwpbEE(1@#D+O3*`@u|E&kmi55Mb6f}iVO(yI8Gld@C zKY-4ZdJVi^?|KjrrAcE?k`ls6gWFi8_Jk%{PqoDtxY>eGVb`a>ue zqZR5ZG+L|rZ~#qcF#+0Mxq1K%T1In{7rIySEzkfkPzWG2N1aY}Fd8PDM3*i9KAhzY z(AlVUnI1B6$Wrof*7Am5SwLtilBAhHS3#kO?Pe4%CMZ2U&=x(RdxB1^ED&*f9YD8- zw));rnCuGa0n-9CZqz9AW%QDt@Se6M z-YzZ6hMtA{~%i3IlG@36m-_TG2XxEPe<{tG*g9%Oc3ws3}<7W*P!CER|U1e0!E~ z^i;IQ?+j&6UkWs}Y>`D$qo!bO4l%PoSms(D_@32V%vp87JMx67S4Ar<%%VCi>`=8} zQ;}#v(Yu@1SN%R4?T3SLhx`2e8E1QZ+8z%3)0;k!gTLA7_E@ zwTHMRixPhH`T4I_b@RGc#@+6ozQV6Oub!Ou83Re8TejPKZv$+GZKNW8aWgS|p3Qs? zprs#^v@*8?Xx)ZM%;NqH*Ylp(bm=#1OVXw2#ORrXm)Ex()e<61509vW}a2>C3?|Z$duPp}b=k);$ z7m{6Z{wbQSI8}VGClg2|HS~4{lJSh8Z!`Ear2YUJlWgbY0Q!lEjCp22U&>N{u(afl zg&%Hz-McN?lPE~TDrz^@LF!_OoB^>$wVUg_V%70DQsUE{DBt0vuA?Qo!C0Lg&cxPXXn*X&nxrZ*(X-r%yv&dvoO2GeoJC8%0@r4_vVnd8T2+JV%!xFi^R~L1cGD$f42Q!=4q>q- zX94MPA49eMR?ySm45kS^0e!!FV1bnG!Tz$OC*BDMf?$jmO|1PDM3Y3t^bS5q)oC(e z_0mHmf4&%UTOeA^HlS$DtHVB(kUb5zEYRM9Vgut!p<4XLk6GNF^u5ll|7#+Tj4T!{ z$Z9W3EI&C*f=^u-w364r%Q`Taan`UNGSBZLONedQK&aast)Q~apN^KbG6`Txj~TO% zhAzYm%1v~R++(zxoNU^pWNQ1eBJ)yc5teIoD6`LVy^P`iYAdk>rxhg>F(Lw2VxFt? zm=JB%ve0xER4uo%(6azZk}-%P;O}hm-Rm|yHUPY4{&Jr!7u_V3`y~5BK zLs!Osis`ZNHHBW15N8gT9LWI89magHjR}!e2u#a3OsbEqMjK!27~$Y1Ph&0+srua+gR)EYXq| zsD#M8BRSx_zy%pEz&LH|RLf;GG z*PS7$x$gCF*zfna-_wVOmzU=|y^;3x@bGZ-fz;u^WQZ7>B0Z#GWzA7xlI!rQS3Fz4 zKIh2M52g5)i4t_IfKj$V7p%d91aG%&nC`Ne)>XB^HZZ%w;9f?Z#c25)Q0WDhY!>WF{^C|U7SkoWiEsb z7}4vD+Cox;cj!b3qahs73xpp5@bvUV`@9$sIu+IXwQukJ)@FU?@bHj#VFx~_9H$6W zsRsuKa|uF9M5bqgidOcBg)V-O)PN~5c@s9SmuxtN2m~a7eDJ{iSHj}s)3vvh9^FVZ z8{|jaTzF*V)Yx3xGnf}%Ls!RAG6PvCj!Vi-n@catdx51aWLnFh?0aM&ccJJ zNk%PzV1tD*(Bf;rYB91Vb5w`1vKnftFD7w~eMi&j{!Xdna-upJx5-t6NPBe_Sv22?8j6% z|4;d)?;{)Rw2zoH3ziLCu-R#c?cG=VJP?{qKbD7{gw9Ubm!7cfEX_?)MI*p=fd;2{ z8tsh&0(4NO=E`T-5`Er2ShZ$Px^;=NX9kK*iB;}9;V{~TdA$by3GrJA`Qc&W|4Rbxcg|l1QCaYgxy6?QZpnEX`}p?c*|Nsf7WPXmm0}5)BaOiIr-B zmQeCdiF?Nk(2@eWfU+dt{FB|Mo_AK7Ihck~2)y0saV=HT9gQU7v^^;Y`dK|i@f6rv z?@Bm(8r&_z{utz5lonE;#%XN}#gzWmReqIMozXoUqWh1JOne@=GwMHR{`d zRVgm!1uE1g0rO*U+-qfIPv7tJ0V}Qd@74dKUWYca(sEJ(- z-l~Hb1flW|NUm0v$7vujeN|9Ny(P2kGelc(Nv_EBso~h{iH3ncmn=j{!Xy#)_N<}T z)0f+a85g~zX++3#IfMogwdXSM%LePDrvbey> z#O3~N2Wrry_O#SlAw{d-Z6~Q9bOe@&0TGBoEYwps6#!$NtK z_Rf0CGp>#f9YB-!aM(lXtncudEKHJ&IryY%1L$8bL^tK-4bicU!J?-STo<%?*KkCC z%A%IUWq=;sXC8B1^g1}VSkuEkL8r`c5cBzkz4xHuU`yWo6o>$U*+v*TfY$vT^P&6` zC%XOk^zl!B`V$!sha;mea#N&*&(9~ZWQjF?k6wm$qRtTX7yP0zomNe~kRhaD;Zz;r zkgDFas}MrNSIZCbX#4A5|LS&V0@M_w6r#}?ZOQe{d>g5Lg+J|VCP^STF2`ME+ zsumE9Nfj+3=EeRB;h?9)3UJ^#ycE94xB~Cr&(3jsdbq!RdC^FrL8=!9Q@?;TRFL+B zn1#Je52q+8GU;g1-Mt1kCz!-Q<=@?nep`~E3@4Hh`jH%4n&JdM``qYuw=S3%4eN=Z zB;ofmd9e?^fB?pssaC>ZXc|n$+}v<~je9;kJpA6?0iAkPjX>zC@3#Ym(V4N3=y%hv z9U!WtvoTVZztL6E6i4{_@(i&=^R8h=N-lp`pj$$=NglSEu}^xI6Cd+?$=a)yYVLYH zy}f8XTA){(aA<*1c;E<;SwKqovymlOt2?j-JpPAxakT1?`d8-pDt0rkmetZoJW3IJmd4%dswO&;JPF ztOALCRjsbga=xM0ux8S={58BUz0l@$NP9&7lIFlVOoR*3>R3#|^pMlXsQNSf!H^=p z3*;GWA^n(&Ewn!IuSRd1RT<57!#4U@(M71a4CR_yLX^}nBetYxS=Mo0jO-ZP zY#so=A9vwICY*xBg*J)?YeD3r1j2;~jC2sD1qYuoxFHN54s*r9j~D3+yc(O$q*8)# zfoS-Ir5Q-IQ5K#BYcIK$Xj-m8pKC@B(J{m-(<2bkCLr5{-yEHhLPz&|)5s_Zg4Pq= zhHC5Xz?>FM4RbUBXXT0uWIikXmBBJqasm2AF_x-{KumlDucpggUhlso)Z43OxAeh_&= z5Fa3lJZtpx^E1L(g;}ou`q#hW47=Tq)I8}-2o0yQlQ#&bMHY6ZJ&PG(P*OAbXhtB> zo&YgB2wlo&dZ>O{AP9{NgmVayL`jIN;7#ZixK8|*`+_?^ysv7;)XVMcC8;%GRThx? zuBtH=B8@D%jp(2?JAmdE22p59>Qs)Hp5!4%)RHQIa{;3H|Vuv4!xYZg&f54(iTTm{x z?k%b77dZXAUjjZ*24hkYy?oI4>ax~@BeQ$#uFs;b)H8OiI(<_5Yk?EDM6u^$uxxxm zzAsm&_Z_NJ8cyW zYHD<%84-nAyqg(r>aj0qnSnnCo}8qaKpS_hNyj9_JQBUDmVZL~3Fuar*2QW7N#wI% zKLM>Bt)F7>8?y8Sv~D*wFgvra!q|Fgnf?iAIyl1t%_?BHJ8ku%W<%r13<-&o)G{Wy z!h|3!dKhb$LhHym%t{>L8|*cd@gQ`n*>i$uUh0Qa%s%y%yCxLKfiGESp;8GKR67(gKy`@}_ESf> zY)tjTo0-F{N0QpD7%+zh>Dy#naRStYD4BG9-2Qza->9LiCD1b~5u~6NSw}B(Hp@GD zdfR4t2#Z6skZAZIGEDXmu>DTkhb$l57&G&@p(F|6>T9s*?5rz-kR+xi+JQ8pEFADd z`vzN2t7>8~NJ`5?M+4fTL?#+Z0?-j4qzJ-_lA8I@52Cg{?UAwqq9Mo&-K#B>Oi-z? zXOf_loWodFi1$I$G-`^OJ;9pJFP7B{%!Fr2ebquFEPHx+5cwd{NG95c4a0a0Drq9) zXgG(%{^{w7-NmoJ{`&j^{U~R9+rPYgMiphrb99y@2WB}w9Q4GQUo{AHaA|!xZDd8X z_rBq=Bu2L3a6G;8H&NU?cUF*S$JbCE0m_178T@mT zeF$ZySpX$6RJEa=iomb)T{_8wJtc*?}iAJPgIlXo3`+uK4efs(5pGjr3 zQERacI3X~~VMX6VWuKu}+smA#BjfrulOW(z;j-%GMa>S96dFmY9D#5^vgeS!5E+o{ zRdfMP&n&u%OSBMyK1+b)jG4T}ECIqG{Gt=)iSICjUgr0X+vCIi-OI}}mDMox2%$GG zG`?@`v_A;5OKSWX;`t^-QF_Yt6VP0m0s1GPSuy;X$HpX*%BXX`>Hbp(CFt->(m1Uy zgL!&C=^1nePoU#O!9&<0xUKjG4JN+bo(5=7Ku>Om|ITrttBm;4&F>uD{Vz@JzfA*0 zGe0{Nin&%q$pC20)4CIrNjQ~L>Fc{Z0S&EPlkZzeL6lsY=MT?%x-&k8muBW>svyTe z6KVx>m`(5HIN9^thaR?5?ll;X`VfEup;;G)*aQ)?Z}vb~?{{LoQ{{Df2(2fZww6|xl;z0zj7x|T8zDoya-3MFS$EH z2l7h(_%2UM*q5Du0{ZV2Sss@7I)_{2%ECtD@)yd12WrMAQ4`IXh|-0Y8OLoOC2ag* zA6dkA0p>6rZZ{9yG&-7cn@KSSSXQWL5y8N0b*wPRCusrq@03675$Ti`BIw%*h11lV z>@F&MK^k2mpsYZTQ;FI5JtBV|TB5Xc`7Wi=J}EHm#-mvjwqk{5hmjQmBq=3gkIFS2 zeh|r)It6@+ae5dMP@Ajo!U-mkvmhtVrLxpHUwvi{-E4Hh)mxm}!0HUyCRYqF-n|GHl#I_z+{g z%nT7TnjKS1h*p+nZRr_ndKs=1pHyyu>@!-t1GR3H%{vRZ!hmohADwBp%^gdd&Lcqh zk;$D*agx31GQv5FQUao33B;PjWgttVriiwpL-=!Mnuw@5vZ&F0x#Aj$nD-l@6}+$< zgimAB{um2QV`~#{!`-~}i^mkBSsNP3F#RZbfOQB%cZg0>T0r*-rVCD-v`>%9ej(1v z!;Jnu6}pdt_oKmCCP05B%?QE(8nNDo!;$DnNRP(7KAUN$U<``z(ZPQ@2v}Gr%Tegm zRvaPB&_Kgxc*dEKEYX=H#KJF25`_o{x}u<>g@`5faF9I!I$>l$Pe%zTx@Q7QjcDA? z$QfGl0xfx3;`?ZF>u7Qd$;LH59Ta{6&RT;MN-}haAW^3a#Vi_x?!yp82jKv$2xn#t zeb=Y~k!O0|@AnT6kN@!>|MAPe{LAz6=Z_yh`sW1MqC})_nrQ*NB`dH>rv$skDGx7; z%4b^oNkbY;ht%+BJj-B!_fg8c+3obJfD-mBl=|K2tB(lZeSCbp_Ycw{ zm9iGlP)gpju>Mu7r7rp5#354`=u84iwgA!B*H?NrsX!G|cdKIvKY#vAb)KG{c7B-; zNmTHspME+FuZ#mxMG+AoT*3tkJsp&Wgh80nJ_Si79L(qdV`5JLoe2}OArgj@)QD-f z>VDBe7lo+w)p~h>lAK{p{yX7zyTu#T1$2`PADZzJ%p}#UXY!t}SH!EtI1K*f{4k?u z^a0#zv(eYRMb{qE--M8?(v?4oB%rp|X|_GdgUUx&^pfU;;SNhPM0d{>dJO5V7>c0& ztIS3Z2#pUwvfIg_-tQl7((eHDsCkU&44u?7pqbBM&7Ot-t0w{SISMc#h`u?lm0Tu; zAoRTCj&6pFt*9Tvf}c9Eap}#__Unl2Y9Kf~|5g zPxymLs}h?G%4I%bmW4b1DTV*JWPcZm>2kx71{aMnB#C2a@?z05v(000F<$TJG>9hr z8$+#e1=eg{~JSxsZGjfq7S2*q_&$s_@2hc++yoc7L zMq{mDA<%|s)8Q~JPWKR+8vy}2^A~hH+v#JJu<_Gv9r0a&qcGuYH}_s3iH6-wiZLKu zP|+fSf!XRQZDRwlIFkyRQE?KwpK>*hv#{OYTKSZ-3Gqq7HOaFOn=mU8tL~cuJRmY4u>K zGP>F^dsu{2+#sG%g?3q1flQ&Xu0)@4sbrSwYEE#LS*Yyq5Nn74A%9I1&^#==N>#Ia zW=m=SA7c)FYfWhg;ILt!g<*O;>4C@4Bmro5rG^zWso}#R3Zi5d1<+&!Wb9J|1SmI> zLBv|bh-7m0dC_TQ4JA3l%J5yq^z#veLebwMbIi;rwB##MwQ$u%H+9A=8d!Yf7kvpI zf>J{CoSs=>BN{o%2YovbO$ai6nI8~1sIPUFhaZu`WpQ+p$Oef4e*60Rf(+$biCm7h zw+6lS0>i{_j&k{K?J98#c#Mc+zhe`0|E)$4U7jLc?#N*!&=c`GTd?bKfeZxZ?w#gur~zVnZOYxc-ByHW zJ|;94ED=TPt1xXLkh|K6QmmE*8?(4P5bl~61l(~_zgZ3G^U_Fejc)Qhwt^JRS8W7s4e=B@_>8V06)bSr489upM+YcxJ!)$?wLgrD8K{=0e<|Ga8`R6M*g5KfOU<2NFL?k0XDCj^94s(_} z#vwE*OhU;5fe2d@Xi_1PR2*l?N2YC;rk-}+7x7(yw)P5+`%f=>ef!U~p*o`_fyKo+ z8wRFRU(q2N{57RUx2aP_yq)w|M4mCpi#Q-E=kOOvIlAms-4#YKv^~4%Op!tnf$KG4 zhR&9vqSXsw21{B~yw)>?uC?g&J36$G4WYj>b_JGZ4<*`K(+NX>BoPLoBa^U4KJtf1 z5;Ro?T5s%!#h0*_ac`qrB_u#ik(5`C=t z&!NmHG|q5BQ^phlLib5A43xqU#SbdA*Vg0Uuk<1ogeJ_qx>EQ(Q5J z4lD%6qYgd2-$jxAzs(F8DKM&(MwsRCqPxZM&R={ZV(+6DJJ+5<$%I%FJByha%e)9& zqOjLPO^F6X$sP@9fxv<-7XgHxywrOM?wP?5&`DNaE;P&@?g;HtUSIcVcBeM;Lgc_G z11fKDf+hr+yHvK_7|EI>OHZPi$0|ya%Jz?y6`iDnh(xSH1Rzpk=$-(P44{KS+q@S_ zr0hv_4QCFZ-^HxBLeIZMCWeKxlwWGAip+%Hj~0p_XXv#BGJ~7>~_=-u!Tiw7z-7`ge{`?mWc?|+s;-eU?a?7^jv!2RPSy3VF z_8TVB!$H5UiGf(L+3a@P2g*h@EXq0@_sl}*p@?YMY__*IdN|jU@!RX+g_(+dN(2C0 z#2{R)aq9L+#2EZvBZVSt4|dA)Z+#RFL5NK4`MgcD{6kfhKND6yay4tkDr3q1|6FtvkU^IK#>yaRV=1KrxF z-yPl_9&WCB1xMeoy%=;Q^<9ubv4q7VAd1pm?$IhVE|k>0g5&LG`*8p8<`>`$!_cO- zx92HJnW+MZ^2XN-qirfPhQ2}7=8cjG`e@O5-cOFL=$j@JG%K|!bk9;`e&nCsPVP1S zaWJ&Q#TX{-OTkWNCSXUj$BfvyneAnTh$PndC*?Ix2he9;!EtIo|Lb*ms28b4|JG>tM3=%9Y3Ob4`91zt^;)y%hoc{l zUE9VUb-6ya<9{1;lMmRsyrcb|Y!l-TL+k@o->g#Vu@q*aNh;>=2dPSLmF*oTkuX8{ zZ=swHKn#D_TX^c>U?LDLNFF{t7chv!PXUVgON6!;Dzb`sCl}`Lpa3$jOoX^5vb% z(NCZ^WaE;Az6j_-?ljJV)Cd!n9xG_k9+3x$A_R3s*09|}MoOZk2>*285JwQ_(Dwj8=#BH3VUG6?O z^l3gcYR*iU#%9!S{Q6fw!@#5zE*FcuE=irgtitH+hdzr+oe^trriNy&K{P~|i5ByH zEX68&p)V_d>A&KW$lRqPIWNah`RqJ^Lx=`?f*3?;D_U8aK+BROkUr9Q8-{uK5SA5( zq$ruCh7)FllT`3AqEZtD&?yU|Xpm^3ghNDm5rw1{mYf-)E_r*HeFkN~J7_A5#xfeK zLzop7`l#flsfDF65e9uUL^z;mHLEquQv0Y|h`yLy4CkJ(CPg8Vce~Y##p!GR_8@Y3 zrAGT;>FAF}@E}bK`DuQ;v4^=L&cgUdn0W&aR;sh!P#{Gdj|VOb1Lu;AW(mr7ZWRZi zC7vBucO>SQv(B=RKcr^yr|MiDGx)}oBAl(egzJZ~$5P2;sxzT}I z`(y)g43quMM31`%Jplcf!D3ad-KLO+b9})Dy@v>_i4{LZ6VhZ5m;~|i^1@WCM)U^= z2?6~7^MC%&$B!TL{t#p$PtxnFKXf#r4dtn9N~y31oJtBY!;FdY8PN+AEnNe!qz9%_ zogg$!h3c>~27D28c%y!o_=+c>8#Tp@-$mCN4Ur}TLFtaZnMIZ)$yEaF0XE!{)%aqk zu2IXl7b$TSWLb^40p{o=j#OKMB%{%n_x*0sC@8p1Nn2DgIo5NLe9 zKg9VxK(&|6Hr;^kqrWw1-D|+u^BhY(G-J3r1nMH9uE<2;7l&I_KY!%~t&xDdOAa6( zy3xaOR*;g$aA&s=+eTGyVrLv&G~qzoKD(IG+JR3)5FUeGDtIY zp!|_-d+b`5bE#+^d)BhO{;bW?x2ZP z(BIQYjYo!36jqo*MBoAT5xEIbjetz5vP>H=&$n%YO%D7s8gM@*ZM}lSk%rJ@578%q zS@d^;v-TGq47B*~5il#eEfNK$11%0Gp(s(6J1Cj>BCsAvcp$$t}7X!~nH4f+T&M6;5OAzW8I znj^0emaT=G4&sJ{gg4gq*r5LsZCQqX50tTy4W8qy)rI+k3iBn|HaBowqG1kzOfwRU zYArxC8O@hVHeto!YKA3(VF)YKE@hxE2zy9TE5N<1UBF;u5x7J;9Tc;5dh6lF42Y5% zX2gn)FBZa&d^mHc;v}63Gj`k>+@G`X5WaDjmYXz{W#~r1sA!&t(qmCR9fnC5v_b&X zKr6rfV?L#)w=L08a4K{mi8f$3qi)TftD)gJZyeAH1Gthr0gf*DLYuuCLeoU_H9oQ1KD-`|_q%%> z1S8>ZH(U0`^sxKRwmY9*=&En}-R*X}cnGbpamZzY+sy4o&nWJ;w@(ibTt9vI@Grmo z{L4>2eRz7@;%K)why9*;dbm)puil>YPQbZ^mtZL=tENn9M7Wd;X8c6ggaJu~Xb!4> zTiocQB^>4uRpZ^=ZPkh>$w#V#r$ndxNB%szx-$xq$#~2_&cK9EYI-vRFshJD5+SfM zX(N>|QTP#tCNFeSBS7e^l1a2U0GcACWk3YLEDFMj@|M3t-w2>ZrfoifQ#-OD)nB65 z*@L7;4cdanG8)TBEkaZX7$7Oa<_pO?69Xfi)oK>%FU}!4VL0B_i1voZGE7Hzj4Iux z5>F@@{m*pWChZ`u0xaDs-fX?o7$?ND9v&XxK0ZDkK&Alx`-3Hl3UNFh^hf%ohQ-7> zr0?~W@h-y+{-_Z`AmJ=|zu=C>tGlPeZ_3Nw5(zyv7Y3;%H3TL}fLYy-{APUM%Q ziz88u(CVj93mqYj;4dHO@kt5EFe#2jDnsX6(rG7a{ z5iuB~dUV(4&!5$49`*F&hYufe=nS1nBk1!6;h+aV7c+E-AW^3`gx|MAF#!rm3L2|J zB>S-DlbG6@9ezRi(Qm(>fl*Q}I0N!!iHDZLcjW(8VDGs#J==hVwbXRzSY?C8 z)NnfwWLpwMx=*CqiYrN@^Z2_o`utgGy30VXHn)uH&LRZyI>jm5?H&FIcgu*z1w%(q z!QNv_NpY?=4GnGO?9u?=V?mSK@9h9O=xaKu^*1Bh+(B&&Cc0XR7LLoIkx8GrTgj+P zWp$^|gnd~VcS|G{B90ogBs@v30$)*$Q!Q*K-L>3qa3ifobh>1;xuuq_Dbfk0Bj&)d zg+yg1{_nJCR#=y(8H8q+ezse>W1s6w8Z?)E z5xs4i97MFqMWJu@m~|P<01*}>1emS7GD*zq6hzxf61sEiyLbZ3FIjsjr2p-BcdI8& zHg^wLwSV1Xn#*d_cMoT3t=EUx(?uuKPzVXMv&9Ij`Ub9eI2`m1Umq8S<#TY65*FR9 z2SeS(X{ke5pwX?V)Si9l_D4C(#28Aj+Ym?tOP40fcEC53D45QV&`PIPqI9k^k{Tpx zd1axCq0y-)qpdlio~=1YpAO@_dcr=sMES-H*dJs15Nvk&($JWz1hjvf-Z{era1N&< zCT{QU6@6n@x;=XGp^9342DdE2ZQELY2=!eZJ#r_3YzrWpu)IQF&7gD_s&x(J$Gg_t zr#t=3{np=CLe*%Yl?#}mu(cI!&Nxz-egtUsFVQzU6Z%$=&1l+Iy_xFAI3)?X6^Wpv z355+O89rwdZyEFpr5 zMgaNHi53wtNHu3d;@*f8dUPvH1B)KsfdXbFf>K`LT7#@()PD&E`%{+C*DL5#mo@_g zX8bYg8ElF3`ZeVBH8+t%7$WkaLkKr-+pW5iRK+AEB2H_$X>0h6G00iCA)3h<a6g zTEK=re1+}XQc7iGN~T0TT`Qgc`~B-YCty`J^v zsGF|55#`OVVmKTKk*BPeSH$l91hig{2wo5SmzS6O?Phns*$dB)`f)HB$!f)LczAf& za>w^}v)k#gDaUQGcI&4+XbYB9{W{D}-*tudrv2{M=g)ur>tFx;>tBy2W)(fWf^Sm4 zSA=&u5|ZSxy~~*5qBh8BdNB1)HB_DpQF9c!efF9+*F2Lb2<-+|cA~L?Xa==}&Y&x| zLux_BgpDhEM6>Qw-G_&#{Y!h(g({9Sil%GSbb1O?`8E4R53r8W?BuOb9M6ZvNv`Ox zEPaS$kQ!k)kq7jwq|G5DH3I6+fhJ69ne2A3$IUAu@yrK){a}H1MxsQn&ht`wiqX zTsjSkljIduz*8d}873BpfM^lcjK^daYVC~jmzU4nL?s$Me(rMfc52VW$wEy(w1XbC zR+RiQAYw7{?r_{=0`@T1!61<=R1-;<&Y?^;M{2j5`@`}0^G`qj^2;yMKD>%OsQ@}e z0N)zKRILYVUteEwX*kTl&(F{JKePvthGc}%3@0D`A{=e-$)2XR%6D&oy3>D}W|fI8G6kbRVMaEI;8A7+>avgOP+(gs{&QI+aZ{oP^|pAPg!Ao}{n9 zq&xm-c)QnX{;aL|T{=$70nJ-u!ML_fzKpg84U<(lxz>K5vt`{f(R~)dnjJ%!7#?Of zmZv#yvlBX9i8Dioxdh8sZY3_l?dg8Yw4+aO74zDMj-hD3koxwPDS#18o%F4R+qR!k z1|u|LiT=j8w$#}DmAT`Li(NC9POVhW&zw4g<2&&Qrfy18a^R1l0RSUh~6-0*XvB4h*hlo)?PJ0}LV&t|Xv#nR4AkDzTO8`;nnsTTX*r1Bz(W6l--E zYdb|>#~y2XRx!K7`mJ!S{gLleL$B$%7Bv>4whGd>xW?r`TZK>z1j0lKi~r99=+zPj zTr^;M+gON9C?mybqNxMu+$1xC-?C5Agk>4$arR+QtB)D;@2{6%4N9y7Xck4RdOdJ2 z8XL;;5%3AaudpBqaoV=852aAkV4I1kv_oPy?Euj|gW;2@eNZ#m$dg@(TyhXUnCRt_PY200LzuIqMN}aQgV+#S2@4zte|`tkB4(ZYMYMkZI#kiA z2$KT+jn=5)aR#my!JZ@37*&JWqAsS-JMB5i|UJ?zcqAr9%_-hBy z{(_J)iEanby5(?A)HFTTF(P?_MD+|BUSyqw$)aQHFm9GY65$^Z< z>WS7o9q#(|KbaX<5UF)U(W@it?Xe5f>`nfRA#`HLv-=1GSOO^HDJ}9pPXlK3g zIKYAR1PRfS1kC3|u?Tb6lR#6U8e+BQH^&v|4xqDR|M};iKYjXy0H{9g;hG8v6b(?4 zD3dVlNkItI;WE*~;q>_U2(4LqzyI~uUzvo}0^2RqCVZx1G{7fHUP>Sd=AZubr&vfX zI8GA6Bn(mLqtNIqPKcR&50Xm%41HyL^g0QbQGiYW(K8D$jUq0@d3*jSxMzu!a~|$C zX%@X&U7a=fx#7OZPGhkH`8we9glTy^T%*Pw^2Gya_&6*5NGAB{ujCEV#e~wcK=$yn z4Sa5MTBOH651_xd{WC3nL78vyK!-kk*52$o(2-{$h3AlcpbKoCLrnqVn(_y~8fo22 ziUyStqN0RBnvtTOAWn1`TrspK}^cRkp|N$!z54#&}j-PiUO#NP%^qu zWp8Tz2n#XM!r$xw`n%yf&2K*%Y5%^JLeIMU8&Rcz<`N#2N!4O8qVu=z{)nxWUcvF> zaBYQ=KZ~kWqM^SFzNBz$tV_|9wf<(KX_hY2hWmhG%R|(MEz($KwC+5+E`Bo@-QEi8 zi-7qaU*q%NmXAn6P|+FTEp-U>SEZUU%i=}akL7beP)vtJh_-9c)7o%sz=jfQaUCc4 zyN%1s_i{}Mv~L)OrGibB?kh|;G>sicKvOhC6>1YQ1DhW>RR~<6AnaM z*aC}8&=LkT?tnFBqqK&P6GRY`s!%vYD@*u@5c(-sl6@a5*LCGxrueO(v8(}_dMu_d z#|4%wGonG)U|RlAXp1u=@I5yh0kUI>G#Xg>#^A*8h47Be51O&&=cFlNLx%o+JZr(&nP^D zv{08OKv7w_vp;LU2q!_0yrPKT$>!^6}4 z!*+*iY$tWY-{a}-7WF%+aD#A5rsJK>=EH{%hr?n2y8rio|M#DN61dUW?luTe5QdRM zXYVpVcJ8+A233}zpC zuP^X#H}_P}-$vT+_0C!99?e0TQhn!I8)-9vCUz^Ut#h>m&r~w)9MqIkREf~^e&{eO zdJe1lL-Z8^aUkf7B+Z%{<(c0QC{Bf!pqGRWT6}>%sY$}9OP<(h z?Oc3`?vj+FzXmaPWoqeHC=*pK$xy+dl_=)K1Jg2rTFRUdg<(Z#hx<`wh>p$>L873K zh6aiD$oiGD&WDEwriCZr5ld8N_68WHsvW5#?QzyxHI#h{vTcRbP!uhWOQzyZb#yQW z{o&I3tfNvrYB!Xb5SKR7H0w#@~GR}?fq`~fRt*|nfDvx+Jcwu z_MPn?HW=1QS?%(y>%r(*H;*VuEPpP?N`|vlunpq7+*!q25>_QH%S6MJ!Nf9f60Tla z!8N947rM`0x>@M6_ZJxlx(ekl5fBSQ^hhlVs?|`|5Cu;2_O?;hM{?=2SbST?H$FKA zr07A_#kexVwd$|Ok1yfJz#a5GjaPpg(HsmLz%U7M361EYm6Kq&e)s|OwZPIw{a)ZE zy9%ua%9y4%tM$Q9!Kl@!95{kUX)7^w#%+O_p;6xfc*ce$who|&q80X5^?+YVGoq`V z(9w`1e}v{})sRG2vq?o%c}9%OwpyfXlSxz`kdKl*h9S|mG8IkU-a456I~Ebi(7JOo z%u~-M358)Q?d`7S{Xk5c8UmC7pr?CFdbC6*H_E8>uMmD;mQ4_}gb$q?R4R1LaE_rO zqc(~8kR75Wz|mien3Y_O?hrBGEDfDw$yP2zT9Rw9I)CICiMSNDmDzT*a!ogsYAaM2 zBIw9QM*x^7j18toD^wa3G$M$lvNoydcNBhXaHvyv(bk_+Gimms+S8qi!wv_hc?jyT5~4Ipb{P0^AUAf-uM3FkeJ-olg;G**XR zGBklN#b)7PYWb2tV@9`vdsL$^M`-)Y@vMOarH;-C=0-+;ix|lQKe-4)lq5Gx zhy7vy`g&~Nd)VxDyVw1mI{^CiE#FXynK!qG7s=_lsJADmbMn_aUiZ(3!{PD% z{?n&VAD*5*eE9g&Pe1YZnbYg2+!s)|43S3&t3m{t52jvwFBHtoLvH&@N5dlIvH(>zXBa%Th6cIf$ zl!lo=vIMi}`&bh$GtOd}YbGB7TiQ$=2E}B_D4EpDEi^U}G`T8!fD&-;-;@JzqRm?I zsxeAfsHlXdbRo>3u?D2v``rWcq-Ti-m%Js9zAvJF+{j*izQ>@~0R}v#4yu@Hr8w7Pr2fZ${0Gec z`mg^&4F13V>%TIGLxAmeix~RSM2N*mLROF}2v~hf3MZIFL2=F|^{J}KP{AHaEyOCq z;zNTRF$3yIEkXkXRDk-G1*mH}%ITul;OlbzUVy*Sa=NtYgEu*^Zn9D@!dxZrz3SU~ zGgKRfqTTx%tt!u5W|@@(=q_WM*wf2Q1Io6*S})J|L-sd+kWaE5(kxIV%3KL+PlW{Y z)Y|>&_kwEn2glHmZOpd*QoS^<`o63Ue}IIA=TOo)toD1fbx3r{>;cDyH8JR6ZXY>` zu0md%yV~<1Giyhqkm$suv#4_0Ha*{`WZdWzOs$EsQ<}vIU!jX=7*kQDmbcE<@}ZFq zSK`XqGIzAXK|~n!UxqQ~Ww=uPSK!B&@JB%Psog7jfJ?ur%uVg*NfED%<#mM2p`?0|^av={TOM+E=-?Nv#Q*@=r&7n^KM7 zS9iifMqygfv}eV!cT7ym4N?k3zUaL~v@J1yl-dbEPrp7OL?G{=Y|(BrF}1KA?zn$F zi5tln^mOF~Z5P*}PX&EOFiS1a)Qy_S*kqIhBq8a3(F_9M0HT%_pby@o=ZVPULE3IN zdI0C7ZyYr}gWHU4(&P5#(Ye*5Y1quyD8t&B;=;py<^dw6{-;&i*+>gV0Lm)~r5KmYvczyJHc{_p?& zzlY;9g|a7s>GD-i_9)!c{`t>;{q@&h|MK~-5BCr3s4b=&$e(}t33}`IK|DO{UiP2$ z^z`l9hLw{)M}23UmOz-&Wv;;l;lFyu`c=!OlH%}jW8?t~oDBAP`W-bn#WnB#`_F&* z%m4g&e|XiP)i@+;`>{%WFJ{ssGw>B1;$Q1 zi)4@U2)6U~hPm|Z@!`YE%iibnxQX;oh?~x@zwj$Kq(QD%H-U4@yT%a>l0-X)CM@Hf zE`%mT%qcDEL=m(dO!#)#zZ?j)iN2vC&gXmV-zUmLEY>YNBYU8lVUrhk0(?`=uGs_xJaI z{p;ud`mg^&?0NtB(}$n_{onsRsTrr_0+dBwl<1Y*$5)a7QTQl<=$(P+j41S+&}%YF ze(JmAmwOO`a&Hi3IK|Hn)>$XW{_R}Syu>fzjPgGaw)zbZ+Un?W1lqPi{wO4*P1wnJ zCR|zXu1E7FQ9jy$Aes-M84IMcaljkXlWVWw(AafGLYM&ORECv)Opm9IAQ@-q@}B&O z`wbHdS+swUyl4nQT7-}>tB-l^^h&YYV_WZj5Y8I>4q81g#&z1i0>gbb6*08QB&zXV zdn#ctguAY5fX_5)3c87q@)8B%F!jX_5Pm?c&$7%u!&(x~>zhU21x!QVeNJiN{P@az z2xbMrH-}VO51Qs}^trId$sd-$Z(yCJnyRTDMA4{Yj1odo3h?qLKr_ffgEUT?877^0 z0lwROvVz~6J%13y&C;{(`iAgZIGnA?Nj!?p_k3*u@P~N^^pD1RxfeNTvNt7OBa_jc zGC6=&nj(>BNNdoh=K_sz+PFU%!;qq5%Z#l z`Lp<0O9{uRnm+dG7K6TJ32J z87+ZEAN*ycU`9bv;Buu{Pza4iHmRWn-HD()G7Y7nzo#lD;o1Roh_8li6K*wkG-e_8 zVgP`E6JydNp$nF3CkW2h~Yr4 zZ^TsRe5&cgCGrvDJD5~N?{!cKiS?*bkWZFykfqO=XR>xwQc{-~U4Q61>(fU{jQ4nj zd^et>fu^(I-EOB7w>PJnG@Z=GDyQshz$6gC+a_KYRbe=0=WW zX~IF$d5H)~nORj`+dVta_wBR)|3~fYOm|gxRaT~?xbV(>j~%!XbfRZ!~B2fy0GrVGb?wSU}6axWIv1dJa`M4IqYBHifXKcR=qC z^V#isz0o7$L{cOB)J8?Vi`DOdRvNHNwkgv+P-?NTbEIA5G(pzGlzbDU*hdRs!Omwk z#E-DNk#x(QMsi58?<|C`4rc*$8Zkk77T7FQi#`XOWhOqULVTtVwKMk9lB8z| zgRD830yQr{pOe-c!`DS36>HSYGsP`V#9I2SLE!cpg%xldnvX77!?PA?dBl}%a`+OT zUZX-UDMiV;)mXzJCRM6AR^5pl^A1eQ$O6meYMrcEsg+R^K)6G#TE3AEL*>?XiL7y(xe(ud@LPHA0aq@7MW zq-ZAr9CSOW`2{5&&i5OoouXF$T3oO3Eg{~rM#Jeo0-h09i2lX8f zpxI@-QWw1nu8mIGQmC&1IxJSi^d6Jp@tW0dU}mSCI8g7GYgn-l0_9~`F#~{l;q;>g z*DOORgxy0d6+0N<>*<=|LQTxyrt{P5bsls0Zi7PrzFx*lh9!ZdV zxf-QK5BR=j5g$N9M0vnrU#^Kuq0PlP^!@)#T?EPn$G`Z>MOx(vM)zo+fLhN5boCnVs@Fcz;u6#F{(a%3F(hAF*I=*du)ye&|FR` zQ$~{UgwZjeeO0?f5K7zQo8w~W%J#l6<8r&q188pEo3(yYT>R<)+NsfDIt_=D;|2PO zqy#QKfG((;SWnPt85ASE=|KE;(yUV*3e5rQNw-cGB;OMv!O{_Md@|PjPf^eS zQoq_!gaTHi%-IW(H(;x0?S68+kIwaSwmLI01-zdDww&^WD2qQ9b_g_$9+}y0w3nMS zI-_ZY!^Fvwy*n=YkwI=zGLOnpi;xk0(;z~(`4SLcE0O8|S~ocT911z&BW}aR$+{I` z#Kv1hbm?EgG6EGva}}|OyI%O@GX4$EUj^T+LBKWoV8X~Ww$x6SzGZNcNk>uTrQUwS#Q^~X2v=N`_IqM zyZ!F}{I`F5`}Qrh_^aRR<@4P_r^9f3QnR?7(_20_0n{R=@$r#1!DOycS=`rrzi20iUX+%F zg3}m|nD)nqm*SyDxF#qhS|syJfI+G=+}Qd6n#qdMte=4PjJMmOxQiQI&dDwnoON0g z^i(Zr!U3Gw8ht)=W=&%dU<6K1&RJ??w!_y5wEozFxq#jvwQtZCurNf8)J;e~;FFQF zuqh+yTDKN3&Z!*Zq%O7dedI|E&~S%JW(_#F(YC96V3v-Vpwzm+gi|aA@92yPA3Hj0 zn6@=ibIdfS&L%opU=IFd)^J;B0j3i0Edxy{lhvjLa{>&>#MjtJwU(>aW?=xJOCQ3= z@_|WC^Rw*1R9#WTT_Mua7Oncq0rVtaf2>k3&)Q`V`hJvHej=sHwsMJ?6;~mG)-)>x zK^#)8h4eC{$$Y+e^X3gqWHbYZd_7ojOc>^eks<)dvfyW;`}pxAb07u*0`!s>b=nSW z^z)<;o~zqv(I`+gfc6nK4nUAHja$q22nbacsA`8idXjX_yaZHd6`5<1d|-k!WlWI1 zj9kTmdLd^%1LEvAgRkfh_cRuuo*?z@!}b8$g^`-3XCmgkt9lJM@=X(IIjvoL0PSD2 zhbf^z9TJ`19Y?BqS1BE%-Fg?m+}KwVT+^4d9tOMB3}Jzs$B+ohV5*_!D1 z=`7b3B;`(Nde8-E`4-@d$Shaq8$>W6JDuSBrf|ytG`_h5=-&w3KiTcT^lSB7JJtm@ zuC$&1>#B_+f7;={A3zt{Q%oPPbpVZdear8r{JKbe0Br}P6MzjzyJ?|#bzBKu*QpU?rqTunWrzckzb`XO;NvZc7|76^Yg$gyNG$)?4MJd`M+B2^O9POnQ0z~<48cYM) zS&B`Ya5@x+E=>!W?sj@;y^kR~hSd?vECZoI8aRMvSAxJ~qVH+y31}9AdVlEg0NUYN zt=G#ml;|Hot7lXo6<;HVL%BLahCSX61<6$h(CSkD)Ol9S8r?Z%T2!&o9zX*E&ZU5g zqPZTs(p?Bd_9zBCrk(x_d#d{D9ze6fl*#T;QlrPqJ^*M^d`J!;OIrMFyF~@1uLLXB zS_Va=$xk9K*plsQ^-;^%W{qp`un)B-L!1`Jmey&?behm=(h55Nm=c*uM?_^Q zCKS(|lzpGhILf>wj&BH9QH}l}t>?@c!~ryyum>7RKwywn#6|$j;&;7Br<1WBe63m( zZcA(1o;cVJxgZfG9t~QMu$%H1227Y2b z@1tW!?G40uG7jAXXu=G6#wya7@!|>S=owXQXDG8jz#P&i z3&Q=MSpzYuD48fNlzQ)I$6C&&ON=;aPHQerVM>t%5Miyf9gs~9L?^Wor-o_dodx~U zJ_k!l_hpQloy2k!P!30F_9{UJFt&Vdu_R6zmrYWd}#)t zsXEQ-t{ZTXQ-F*;goAI)7+lv7>-CC;1B-z$8VA#@aq|H@>IqBgG-9b8ZVYUF1|4F4 zF_KnCqsD6(8&pL$ZiC~IEhzSILGrA*<(MWb!YMivxL(EB5gI9peNE)-2kn*u zILzTDf)*eUvk0{Q30TV(`g{U68ilo!l>2flb&edxxV3`lpjZpkoErVwjU!(#-8jb= zN=VZoWN41FNLbAL0AyJd8SPvloZ9>}Uh4pQNZto=-#!NY?~Sry`O{GleQm!DA?+Jx z0-uk8nh8$oE%RciUwZ(JA)9t;yUFaM4!$pes{jy2n?1kqy#yF3RIk4hED#HI3d`FK z6CfraZqcH-NL{2Jh$o;YlPNdO5G)7K?c@?vT+%U5mEj50big;@i{U1otg*r?7H6@R z&`p|D(?=X?bR0m!^40uOEEp*e(7aP+i=-zJ)3nkeRJ4nqmU4CVL{K;J++d4uEQ{ zwxW{=gs@oDE@UZ$=}awPAdg}g6yR8f%}7YfAQg(q3L;DOEQ#I{I z%L{)>jAd0P5-mMxK?$qF_ADENKGLO_df5T$I5zrIbxFq6MTpo3x7yi|$73IzE5gg; zNR_t+B%EM6l>-&jCy0eew?A1WIZM@g6{Q?TA{@I0-tfpE2pXUD>RWl*@kgLKQskXA z(!D;?Vd&Has_iu}RP|XV$a*^hj2da*D~r{9(`+-GO_=XC8hx!kL3pGmHBsxd5J(=ny(VN{itgCnU!xVinj%S~_ zG|4_aJ&}ftdgu1`_WSR@|L*O(|MCC)KeQ!!SADeI>dWbRa(T5}%ohN9Hqisx%jNR< z`T246OixZH)5UbQ-ENoLr|C_@#*bF-^>zHsKAtY5-n+%^Y%yE!w)7yKOuML_`yZ)1 z8;>8J9zT3|z$_!B9*7O?Xs^ixz}c#Uk@uV#!x_g_3=Mn;*J)%5yxo?CNvxrNj_+i zC9MwADKe&AO6>JZNwEgUsQD(6Z)W^kmXSu%G@R7FrO%|)tKwKl0GxCdgl(x?-dP%| zx=USxWok|h>MPW#%#b|xsEz@`Vfv61+72X!bUXIbF#|eUaO@m24bN|NscEJN#BjjD zLw9X8)$YczMkRbhR?tkvJiK3{7Dvze{vw>PgMqEyC>GZ{<(k-Iz2VE+BWkthT+EOF}rA&%Wbt#d$$q?2uVR@%XWEMa>&Y^7~ z?R4sWb$sRN{4?-%9pauho9Q|C!_9^X&x>|CITi+G$QTFyCj^2%PB@q0{CE*ZROGu1 z^9E^D%1TLB6YC=AEvuV2fQB<|Ze!>*IrD$mkZ*nhI%5Ms8xrZkAAwUf5YKy_LUwndyeq^u|9`4>K zuMj(NEw0ZYg5eb~+&}FwpMt0{VZ~HGhQ%pb0ZJi`Df{3Kr%lg;a4pm;pwo4-Z2#L< zI91m7**@H^A|E4VT8CgQT5H1DeujAnk(8`eYNUD|SSQECkYauARKxL8Yne{7-v~b0 zA-@dlhSJW7+^6uHc>2jc$J!u-Bfe+$~PzCBDMc!E> z-TQhNvM;YIq*#Z47PZX?hBG*oscnjH4rvx8VPw{qLv77;EuW7bTw!R|vv7aLph#V}sZ~_AG&K{SK>y?g`*)Hy}Fw(1~m#d|(j=kRL>_@7VWs6ISBk`yjK`_2u z+=4&-;a@hZ^~aAN*PA6RordSQDzEmsv}xC5(%jDGIEH(V%O{F(F2rqa5$GuXwqK=J^3wRE?iIef`tycQQR8V>t zk+}1==Lr!Bxsld7b2};*3wf?|y)>U}`J7OY9arVWErLEcgCtAOQ{=7(;W(RdJ)HrScPeJ5Ukw=-(MLjAl2hjc?hkFy#AVC3V=m2^bcVx!~ z0>GgHLZ*wM185VbGmX`XZb_FPKu_8OvTp>XA>Rx%sCwJDzIp=Gh3yN7qr5`Q#&P>P zgQ0f4R(prd9782>-v7Y$?wnVM;6H<*dI|4Bb?KKqnFG zA>w$?c3Oy&38?s^y7B-z7U+pM!zu8A&MAuJE~rHhpfFx9b=s*LOmF8enAXi>LyR(i zw$offV=BlReFzn67{rbT(4;0nZ8n*JJ}K0xjAbLphod-AV5m`f0L|)<=pwE{00q&foqz15a|h7uNOc2H04j2@90$;{U?ZgAw&N-m zop~xPe%lX$(q!O#HV2z==2kX2#n~d`4WZhr2B>>oat5t>ktbDeL^P766!>!MTx*x0 z-;;C~;Nm%R1)MsQ2>-9H`YH_BcZV3Y%+M1GeLJ?$Z&8N;r?k_qSla0rbhcmW{sbNQ zPr~w*1Kxymjc|RH0gWM6s05m^Hdm&N)XgC_6v5SZQ7P5M(%SjgfBiEuE&>opBEMa& zoA@CivdBZE*_3n^1W9Rpm$pWHsNJHI1jxmEuB z;isQ}`th*eynXjQ``6|3<3{gmZrD|XA)Jpn0sA^8cB6{h*o+?|oW_e%C$s5dKAk>2 z=!wPW=jZiWPw>rWItQm}Xr@(q6&l}W%@h^2XQywb^Dq2nJekku(5uyII%%GsA5gi! zzlVvD-DZo2+rw5z;gcJfvzd;N;>cBRh~C6^b(tctyxHs?A0MBdo-jpqh|z$3{LqSg zolMs8W}+z4bOr5xrj2Uv7o#1WK0a+9UHb!eemeW6p>4NwJppYQA3!5WTL>0pd;l#X zj?#c7v1WtL05(>_UJ%CGQO0*(wZ*NV2x)uva zGYp!5<9Z>0B>^1E)Y+s>B+RL6F--U64Wb7XT7d(Z)|C#SQ-xJJOwx21)TM?w$%km~ z_@!49Ocyu?Ahuh*3YmXmvEjv=Z}igC&0Q-x=2CfO_z`JZ7xg%bVhRnfgDF?zJ<-7N zW*Ju-wZ!G-?;ET)+gJ~Hw#VEk-jk#+eb^dE%K#ebk~!@byjrjIDcYa^ta}90BbB(w zVyZ6?oG9qQrTx?`45Hw)vzYN zZGXNl@P0aNHk;Mqh6Rj1#3Cv#!#; zPp>WVgob~f8R|HR4*aZc9NLeR0lfn4FrUKlRx&N%4A~d^@`mUvzK|V6@V^2^RX-o9 z{k!2-=*HDz+>;rCyCpXJM`T~wva=^?d_NM@9SEI@9mHK#NP$|iV}!J0Ck2M=e_I#t zH-lquw+H%1yx3!tW^(=$^&xZy#@WHqx*ji^a^x9>_0`eq&;Sk$25ZTc_~v#NEbeOD z7fV^IflNzDP}Wk#1J0^%(Mf*Oklc&=Xx_$ zsuNKz!*)aKxM~kxYei61U1CE5bQLM;L0G16Fd4_MMzQa>(sk7NprUO;;7I!b*EBM& z$V70&hYt1HLIN@PnF^KqQKhy(sRce8(b8fKS{Ec3Fj+fu)T(^zz(v-=YGz+hxeD3# zjx$3&QrBDeTk>I=Zz92EQm6{nA_eX?)1amkQNxL4bF%0{qu{FBU ztDLESzuRusjgFyj(5zGDUaH1UIIc8iD%{Y4OZY3#DGQodlonel{|qT3fQRs(o}M4q ztH-D1DxRmi*Kb+fPnsz+>+^D{{VMKm_Y=MPW5RB1+)SAr)w=0~UFF^FZT$R|^k^ns zL>1UsZ#IvQj~_oi{QUm?@_7Y6j`_k9UnF{i(~gV0i4%Er$5GdIvmvi%t;?Gk^&?|g z`1tr9sl$GUGP~C0dc~fQK4-9Sb)$!&x7eKNR|zL{0|P`4Fq=`XL5fEl>GS(H_xK_Y z*J}oDI+@}$cJ%38+tLqx$`z1h5PW3~w zWk$t}Qd+8!4c(j@qFq4=GTmlvvu;ZkrC1UjpanWbnYB%4Ety%TToI&rOA)=DMJ9l? z9H`EcS^)GpA@1|{6AK1*EaoBr({8u8kY*w3>QW3)REwDaHC>~&ljtzRvzAI|6l) zJHf~z;8GLGA#Lv--Gzj^6wt}~iiC-HK{nm5=QEJU^Qs>5umj;s%)RBSzDzCV+*u z|BvVl&^Lo`(50)ODUo4eRO7OBlqz&Jgb-zWB}x8=AN1wuj$?}wAyB@?p;e)4@$q!I zR3tqa>qbn8oRlh(?)hWrhH$B_A3sK@o}d)8I9d=PGxE-j4i9S${3B2364=dDA61SI z=U>4wgsko>q1(J)3g_F!wz3o{%-XKBWG!$0OTKFy&H<%Do#Og_K3{v@j-0jGVdI}} z$O+1`NN23o_rXgr1*cj@osBu|3~CFfxU{{$4BXg0O7X?$bkQf#ucGDj>@d#5xcUib z9Cb}j?RPT2952|R7FT3ATgpBQm#LpDRnG!vNV!Og!Enur;pwmc1ayCzfFH~_xL_+9 z4~F0stGzgeI0ClQBr>fDKufc<=4&J0X4~I61bP_DA8$tKaV)fzZxPRb9(yU#8mwvw z(9xRI4l%V=sXlqr^U?9U=QYQ6&U{MKwQQU|k9w5Bjz#NtM>zDNMR*&# z_>(7~L6q0W4f3R9>-cFQBG?6Hc2L_tD-h`VU|9Z~1*Omwr4MNwCbY8= zF8kZLp5#ry(LV^X@f+y@-rL*T>2#{_jcb#6gR6n7NmrPnEuK$}cMCbh3b-@zn>q28SkX z;HZ(`z5O1WA3uKF?3Osv=mF``W~)bcDfY$U2QgSZ(`j0~%JG=(!_NL@yBOci8XYWA z7nQ=K<&=a!n&Re*>3lw=f2eCb8LiiAU4E0vR&H*%VXJU4->h{e^8Eb#@ci`rypkz; zax#t|jiLJ@iQcpNPA|Vc0|W|n3dcqtL;L|VMV?wx(V^uhpy?<2Xy^&(hy-HMu>n^( zG0OZYkcBp1GU;KYg$|guF6bzFF0u@%0qv|ylLnNTi9rawg&=qooB_+HeFRJxDU-}p zF>KtZ70s_X2I^))P*LR) zkhL`nID2}hE`UGO4>^uTU33<@iN^bXn8fgzc0s4{7u5SjaHzfOe}zu=EKc1oJuj-V z3@`bsb-Xir$C`&Q<1ePHn_X7Y#hZjQ2TEFX zd4h7hX|{x(&$toXaXW~j6WGs$ELT9CQ2ej|`mg`%|N6g}is3943%>~40ss|Y596ru z3@9SCR-IBp6{f=g2toJ0Of+HO02)x5!Vv1r7!n&Xpq({eY8QY|Cgon>>{o+ZeL23i zKVKV%nXcT`&B!m`VDX^41Mw1t5vAo@i5{tP6?EXyJcsk+>y6g#@gOl#k-^XS~|?j;Z~g*wI1 zuqZ?WZr~?}?-(wp7~&84Gc5noeBQ^gr(4uLX1Z=veOA*#rG5LST|p_?V;b{`Xhyu^ z7p=7R0%45f9n)D?5-E1-27JvVpu-ryH zz6wl2fK&&y+8;5D<%a~r zXcNemuxXmzcK?_E{IB(Xyyqf1&>k6_Oqw@$chf~PWfq)GHmlX+^Yi4U(dqJLPs^9< zm8O)~9O@0j>O^%D2IKNkjeF1b>;m&|{m8 z9^q_eQ^s_?UVr@f`0?qHk-}`ejUy`63s1^QKusLj=w1sq?Hq>q$B+&;3hD#s#q4gq z-q3r<&}vF?KgL&Mjg0%jGaMW-!x}&sI!qQqLLf?$%=9R5Rx1#yM_u4SbT%AQvC;q> zfDs&XsfB?pTP$mF76J}Pm0BPPGo=u4Hkow_)BI!t#Y~HEQ-DU&9Mb^jNqwLUU-1<$ zA151KUg8ItOaYQ6I?$~-Q1St?t|hZ3;AD8hOaTbnPfiCle@Mn4j9fbgGp+0DW5{@4 zrNenSYj}+cqBQQ;A?AK|&zy8#JgI;P0=u0)B%p_NL_%(_H+ASG-MWJ4uA=6DXrj}w zS>n?N&|Y=u5KSGk*2i(xDDU+VB3bo6|Hky##1F3C5*rrl!>usf3WJGmxm-RxJoxcv z;tG%9Lr2rgOaB$XRO{a1zu`3KM}kYodk}V{Vs;7H~`?KRHH6 z{wv_5x(o2N{rTGX^Z~RMGo@Pys_WY8WlSHwMu-a1{sFY^|M4S)AgUbArgst2S~hc; zMRbLsn138j2!u?5i#tFVP!TW<6JZm^QJ2YK;1wMFLtVr){^%Xh+s)$cjg0QEdjk5a zW1t^~aGmt^h#j7$g3;L1l$W(xZ54Ip%DU43>%wyo#8IJ6A9Te!z858ZX(jCl$4?Z4nTMO+ysIw>0p(##srXZ=?{J3=Z4OxS)O zSSr+o=${Y#Q=%S@V^_C7(d=xwT5I%r@9G2SYmv@1&Q;#!>T#14jTkTtA} zH6xC~u&iOANK4*t-~c*dZ^JQ&SWMjL3A-pO2hfo4#R;^+M;e$m)9~W{Oi>+ny2F&U zrWX?yJgKgb6nK8ox-eXeNVqPK$J4>;d}8a{$$%I#n4|H!R$m;__9<^$(z@ z&3w0K8?xW-)|AfX&E4&r#qI27zlq=d!&^d2M}9hVIP9j=dCZfT)pZxQA+^cZqfo9P zyQg4K?8Sy>(#V+&SnuB4-eZtbt^$~(Sg}}W3-H6Du#E#~w}!0#2{d|iafknL2%^U` zcia7c{r$(s?QV3_%$o($>&x!tZcf#{iHUlifFRHQBTN^=(81!1EbKw%6>6w@L@Whym@=~?%kW|bh6bW&MVZp_^4NdqJH&-DGtSSsXi{4 z-|cpXfBgI&Ai#bY5uH3X>RYN~!eQnKSHBk2#{-bR0gt2nS4io!i|)r)A3#f>HAA0i zT&e?TmC}RJu?`_zu!oDa82En^j5w!lZv)A+grOnRHNi6?scsQcgQz}eb< zW}%Z0GMie7mpL6Hg*vBYa9L7>77n{zq!%fk^4;E!&tyAdL)l72YgA`rQWePJm5G2x z#6^r(@JX0_{h=3`J##B_5nz~hTMc3imzD=omxhhUq9|MqC}^4ggQiBrR!o3Vsa-%aah>D?XI`x@ehAAZ1VRTVH{3zcet zt)>0iIH1+FKx;&tl(c=CyLd4TMvZm1<4EoC+loM(tVfovGMQdjfH!ROErj- zm~h+{lq>g$&wmGW84p+7GW&R;=vrVZtxIZ|N53{O zKC;u|1JFbzY(CKH&3Ij#;wLRK(s zYfg=z3qQml3$6Bu6U^w8pfjzZQWk0GIvTYF3&a)S`h(NDjKOyKcZ8xym&_4jwm`Ee z2M|rbr{990q%=n|1-_#s6Uk_joItqHfpE0V6n?cJsC}T&#O08^G_D@dnLVL-){rGr z9@KOnI40`>J89abm!n$1528eVY~!g(mwN9{hl>?FK)@drKu}j`D>VVkH)@&WLl~(7 zYC4T4WW5dkBRnA}-cI?aII&FSI-t}uZVGE@mt#DY?03`o?EANG-+uS*{&u04x$10^ z>2~9r1uon1))O5>P(GUIYKe+e7ys&OpZkM;e24vw;%_{fG)$;tRo!fNdp11l%@$hk zSkRI8esq{DH|u6R!#d1nHk(gxZ|LfqMsw3)67MQ*#A&9Zaf2~E=C{-9nAhvQo|7F< zX$8Ad!%nh>+OCro^E!V?S7-JDf)3e;Nfh7{0D?-jj1576oSEV|Pq?u?a#cxIAoS?ZKK+z$= z(LflPHQ@`&2vcFDg;fA_5lG2aEQuP)v~Gg2)Ck3KBt^tTjF(^mkktXzU1eR`S1~Bc z`62WK7lF*y1P(-DaoGGiYfz)kO4>tMXrO?OSKNa8`+F7;lp;)))aTJ#U1{f$wV(x{ zotntnQ_MvmnH}07+u_u(yiwDoxCbN<sX40AFfZD9P zqGSRtC8@*;fh0^LIamPZ@xSkBZK;+n&7_&n7K{1qVzHP`{Z{VAMX2*{2+9(FzV2j9 z&r=uRJfjU8o6g2(Sjwgm2#oXRelsjzr;=?^(-bi$;oF-xZ$5nZ0O#GicMlH_@U!dW z;%WStkBr4Y%`{=q0#cV+J`5=9H2JpUE{*UPwtIy-ePc1D(HrVF8PEe0=DdI+9DjxN z4dEMf={gX2#3cmL!5Dd1Jy;Rs%88CKkL(pFV=g;&8n)Wm1_w+>)%+b8X#R&Ih=qv0 zaK^ELESbsy{4a(AaN=Lz z0m&i>jYgrdWX@@dgp$zuCg8U8QMdgUfU6@3qT^ESN!P2ZpMV}}*e}x&buBMjzSbYh z_wB!MAPdqOibiaiF`~#On&Zs0JOM3QpPxXhG|n7_kXP!91YMR~IuH;fV}Tatcaf{K zh=Jo$62g3d9Rr#oGb`wlV^Ii|V!)Ctpl!K>;!k`fN<=H4>L80~vYuayHWVZJOOZK47?1SCfrR67 zqaA6dH4>>mn$tG`j_=lt(i%nA{I<0CNfA&d>GCGRKi&T|Y)vNOLdIQsAo_}InJ8+s zwI8F}se3Zfij`8Q0KSWo18RB*G_X*osCBbaP}4Pr_%CCqmOh5sa(Z2y$VAhyid`;e z8HYUFY-|d85(jgL?e;qc2vdxa168{51RN6_ocVM%zg^6lDQ1}KNHNq;(VI2n)#~~7 z_WtqlV>4S2flNhM*lad8I+w*4W-cGPsZsOUBA%;0Z190tV^6p}taY@CQ9K&Y^kY@G z5GZW7>#+`|Z>E!(UXrore;pGOHEjHunws%+ci3)L+x2$EjSi16xQ+uQ~<{*4Tt0193x9R zw!5vG64!;K14o)}4MmZ0a75N6GSQBdfp?Uja9Y@Y!ZNiaD53##Qp|u(KWjc7R6q~Oe34~QW_)ltin4}iN4_5~#I|l)C z$dV?=B5WC8%f#W`-CdCgxYS0lnav5d2$=Q()Kx$eZ4ii=1H^1)k^q*;PeNRj0@+4q zfoXPl$*c)GmK2<7)Pfn()tbGPesvk< zsP_!u=i$_iBjCHe*=ncu-*Bm+{=WvO6zUW=NPk{MB!KUFW%SF!^n#9Q91`As` z!@BPrYJX~hr*){*cCJNjr}nJ{mSG-K`$8}#C+K60b#TsR!BuV#3BPd3 zd{qp!Ysk-9zLpuXQ}|q!%xqPfuSwKXXzZBc^@*WzK7I!6ch>K%SjYe5pKjleKmc4d zlxK16C~{R4>P6Tw(jgDCfgSv2Ucq71&3M`JP=jAa-@fL-VYD*RA{7z$tahM%m^jt_ zRnz5UbffJtv#JW?UJgRORToj$D4D`9Q;!0=tY6z6fbfFSl7>q?ainBaBAMiXnzn#p zj!WybCgcxSX^-!TK8+O6p|sFBc4I0!dlm@P zrAgzhb;HK7b_B?hB5?KqI>Is{+3Eu|4;?_0(pT<$2vTUoY5|~n0u;ea{wJXYOxq~# zCE~=@=O*~3-ribh2`=ah{uG##$R^iC!7K;d&;}lU#)isfr5~3$>Rizt+|s?LXx->u zWfdu;w@FyoSyCDt>@J4*X{UplKP2~*6y}j9NP-2TtJg~2U85bRt z&Xve&&D$b`i_C1&u*09v=goAo+m!h6gsg~fudK5e9d@hL^WELuX1`;LvfXai+YJtk zr+T6%s)+055KqM2jNd1w5PKA&n_8oil1TvE^AJ1QFJ(P+C_yE9YGI(_0cgYns3gp{E^PrYoy8VKj5RWJJD`+o_KDR2d?fR_ zhHpDa0!ND_fn~rnOkvjYfFd{$7N}t@rwAYh%~kC4L6{gxIEw&9CP*y?4IpY*WgCyQ zzW^&*80cC2)>LgX1v(XZfm`TPd1sSp3um*WnKdV?qfbm2E(INHiJH?d?ZYycYYmkq zzi$dxJxsJ^8z4NMpP9QPa0EFWG!p~dVnQ)il|@X~QL*faUEipP&{d)N5wR+X&+Mhu z78zuh%hmn;J(Ci&`xbd>LEbW;)^a45Ooh7tYkAn2?JK&7dI6RJo#CtnjF@H5RQfx9 zbuhdR7-BgXv8k!1%?|3=s4*mutwO1;BU}Y>LRuX_Bf{Oi)V_~*vWMWPa{wJ~SW5rY zaVVTFS8AZ^R7Q)>O3eqS4de=5BI_Cn;==77K&ur#fYv(f9NM}r#i<)d$cr%L)MCl( z0J=uq_Mv(`zIAEcftgJV*%?B| zni1I(vxy=5bqCb=Jb(JQ*3Q?)kUy9BU&~zEE-u?tH{moMXe(1ejUj(ZlwR&Ydn(vL z+D|(s2J0OF7geE7F=XdVQv;pmSe-Qa7drO)0rUy__D_$42a$>*v?tU}niP%?pxF-V zuX_N^Uzzw4C0kx0C$I=8lqSk@;N`4A)|@aPm=Cy+OmtLgbc$LNGUEHR1kE< zy6Gz)KvPPpPK%wnWfJB%MGOR6=nE&x0d)CcdaE3TsV(iqqLi8$uX4%MpbA?6$qDB1 zdL*kBs-IXV6tN4D7V^4_jirs8@yGK_6)orwYxtVrK$xg1Mp8?*p4 zqgiS?#bVYhmrF`F{)&1$p|6uo{aByCRMW7JiHB{eLbYV5h?H4kHjdchWf$ziqKhnv zOI%-iWrmJ7Xp`Qmyxs5C%az_@Jey-!K1V6^G!DTxn=KbYoNq9_V1aEOUBn;P=I-(F zi9WcyyZ`y;pMU)E$B6i^b^yH}O&4=|>1p+}S+Uu>*|Fuj8NGY==FR=B4p!ns!)MBy z&1O28(A{Lz^!9)Tch>7QS#HZde590S;v^POgrM6f)#moVq#e%FAE+qc#X0QQ@a~sS ztHMXncJ(`fl@BC7z<05Q{6gve|%otglCLfI&skTjABik%4cntv84 z&Iqz zY1~!_5fxI2)eDLd6hh2q0<<*R8ZBP~0mOd(`Td{&{Ac3RVi2D39E3yO!Uw2BJFT3fCS$UyC~aYKsI60ZjZ*kq@9n>+v7% z(d9D|f*L0GH-aaAGXrC~M!4tN2x7on>4-VYzvMsnb5fUvb|F+IbY?9bKr`zjAnUCZ zByL0#e(3|~Ay~eyrC7MK-XRS6&y-iF3*qTSOX%25w+GM~Mxji4z|WR?;nxSmZm)n+dq-Ns!wWM+uk7z*}2gF#3c>+5}*6Jt}*A94s>as zMYY7QeI`B&bs22G_R93N1Ik5Js8bBt;c6_@izuB_8R-}t9LKMH06m0jJI<(^VGBbI z`#hYpUzSiq=*NLqlc5N~j)j{z>&1q>S%fcRs=Ii|GD{ve48ApLzKtUOk3A`tHJJuM zAo>VfGIi>JZgr0sTG;j1e70|Ei8PqP7IO;hPiB+o*fB<4P)E}`NW}}$uhAH?gFh4j z2*X*5Sd@^hu5cAOYZ-$fQyOSD2BPVBX~oy%LtR?3Ki1N17v~P<8>S@?*3xEXDe`EV z<1GG|fN4la{a;$-EU4)rqv1xkYKO0PLFma=Jcg+&t37KAzFGpG?CtHXjW`R9 z0ALVt^i@2*9*KXlzDD6{I4dlpsJH#ZekZmSdCT~`_0sS71;F~kVb*ShbL)B?90q65#v7<3fXJaIaepw9pIfUB(YjtZ3^+P$q>S0Kp zy+EhP+0M9p5}mfB;$%4Oeltu?7Mu12U^NR?BEh zmU^p0XA_pm189+ZSs0J>j1^2Nwo5eVp#$iws{{DqPmv*YmJNdmm_~>rQa^+rT2+Kir{+to5-@QdepbC2 zN1F@-aGZvbIDp>A5gr^Bv_ugIB+>F~TFBx15@3*iz-m}NbG_t2kL$`BHApR9cEhEU z(_|!?c4VKstAoRk#82hlGxoEXovFCsD?t9E&3K?tyYx!b?KprM3S%P=B+dMBH zA3i>9wyVYb?(MsKwq!e8TkGe@nfE4*_N4kvtnu{y`}aTp_%qdhy#wgUNQZ{Ei#gr- z@c7~F+xwe6y>xRsU&M1U?PU;`2(1`5#}9PjAOIjX8$DnSbFo-x!fBe_W<#eOV&2|u z)%or*fB=26Rd2|Sti}(45euv3(`vK6zrAZ_Q^pSCn0-C{}rM&~v zbgMvPZQH)4zx7iFO&E37v{PzH74>P*$w{QTYd2~!?3hT&nm~&b`K0-WB1bzT#ppmV zI=-J$sC3A}C*_9(440Dj{RDm8A?3pSqZ=?vE4g(k_EOEd*=Ugv46`4(CL`7z#MKx&VD6yd#%M#dkZ%Xphb-I zQZ@Ry4ZmaW`2c$81ADjba-=`~jyj8L?brBh-@woT^k9Dm`|=ux>WJh)IT6Qk+ z^IDrV($0lO2E}57(rGnW&n=0ny7T?h$LFvL*cJ3K@7>$}%kSf%TR&Y;USLm{Q8;x5%WfR^Q#1J2W~eD5_SVfv;{?G)H0aph+U2_C|%X6 zu25RK_Y{mkq!O-ER3q)e-5%D2^e{Ocq`-w3vh(V2MPJ~5)l1q8lxXC7Tr3vTY5d&8 zh|5h~ujhYvUHi7orU(Ks+~xzR?DP&<2mr^W&~?~X82|X=Pv8IH2d?gEqsP<6@om%X zcIzk9h)FDrE6=xtLAMlf}WrldJ-R7?}q=9sT^%hkyL-AH@6DJAh_BVd}WMyPeIN$B*xS_`|!g z9zq{AdJXqVoio-`Pul$9@D!4$V| zJ-`T>cvS*6?U-B*m<|gk$QB)O;Q@5`ua0a9Qq>#>&@d5;(JTTiIgm-j%pp*OH9{hd zoJAIy$h0+H+69pu6CJq5enogoI;4WU>oNfcIS5M4w2XyqM3+hRp>JKUInV&UIy7pB zwiu`teSy$R;Oqe(z%KGuQ8p|Cb6n&a6Y#MN5HrU_7%1+UAoV@kAZvq?8$iF*9IGc% z>}6{mAdDTWq@pdmCp)lw(k4Jn*9O5^`LnP?4^G0!+VuuUBv&0I-jIxwBMVXTkzb0nFq8 z>P_0E5>m962N#lKnu_cI?lEcT1G#ts4&}Lz$Xf=S`u6cVz9sDaf~MGtYJJ|{6MYG= zRVc;738;&Jhxp_HG`Hp1Oiv8pn77!bB@_E)AkR<3+e8Q2q{p>Gz(WA5xW*8uu8W)9 zM6V~7m}MDTK9zY*|gitGzb4bMtkqx;JwqI+RQ}_RuV8|c(rckFCl7~x?-vLc_ zG}edqY~Nxjh0hvXL){(!MD7gER`GH_*QG-q8rP23ko-_BL-N-iKogaPI>ojA58>rr z`gQRozGeS>VFOE)2I@W^qS+Y~>J*wfT4zYpt82$G=dlik>|{kR!|F=ghcAsZJ7i}x zo&Twjm!hn^FT}MSGz2%Gw$|s=81A?;3tuo~Upts{pcLUm%@n1Z6q>pV!i$?AQ*nC$ z9iI}|lXL5E*#SY8`)IXjYl*f}6Wr%&HBGs2-Wu8RvQC00HkEC zn{;KWz%+FsQ}dN&L8En#vQ{+uMu63^ll)qxBiuojp4B~t;))oiI&W?j&uyGTM3_Yo z2PfmR0~V38a6DlVY{X1xVvH2pgp4Ozv;MX?aQ2h%4cIEFBzrA0h~iT4PyA0EtJH+y z(>;q(R3pl-19q$^&u~j`IKy&hj*z!`Jz73e`QVM>Szs_zP$`}u9dPzScv$<^UKh1j zFZ(&{iTR;b4xr^Z{?F&r+uM0F9dEa*&2~kD*fZSdJei2^Rwt%6D-}n~_Q~ZaIgTbl z9#S2QH@kf^(RZTn-+f1ZGM*yLu1Th(FW)A|7~8K`&#ER$S&aHhVbC}6BpPb$_BT6i z{uhhIY;hM~QPm~WS}2a8f=k#j2YG<~hmRk2I~_98b}aZ@gY3^g|BMRNO{Y_eVwxH~ zK0f~EfBsEoXkFV6fFfJ|Y`9Xr-(ern=d0wi_KpPsaQ03QyUe@Alip{C2r|j*!wL+uQ9nw!XesaNodVd?k){h6OreQBRRE4V*P<`4ioCJ=0NvMl2;DAAlfx|d6yak{WWVxWwhOI%3 z_^}x3*aRu*EPP7>X8|=XmrDyE>{8du9K%HC)hUw_cFZR$yMd^%*mo8pnI=*UnAwrB zK&=i9L8ZDSZSch5TY(?RR_>aa9l0rzOR>;#brXJ{x(l&olM|P`%pv9VH8h5i)djQ zN0LsLV_k93GZvaZM`Ko83OQ!4 zXiIgsiX~q@(AEJ8g*x?NC_X`d2&7mYd4n|77k(Kic2u0Lee2`$T88Y@{Fm!8hH4zP zUx*7aWarxc90GTkLY>+iZu|Lqhx_6DJT@fXIsZ>Ll1N1pn&8fXyLO>Y+cH$|0LIrI zK-bq%jgEZlJhSgfgHvqK&b0^7Lml+>155U6Ykf|QVSmo^-9df(FCRcNosnA0^5*+q zs{OC<(g8H3kqY?WQ)4*V2n#1(LHLuvKD@VtIB`Y?(8mdvBBSI3&elvj1Dp*F-2p7) ztO-&FwCS2ib))dxHzCxe<_rbs&<&$+;bkDBCdKF&&dx@05EDx)kix8Nf;=v^Ao2hj zub2^wChv|*3k^H3lpr}x- zt47T~g?a{i)TLvKpwqr;Qn-e1!MXMTnr@`4&1A1a3T=*zA1?|8Gig)3b3A<@9fH@R ztz;Ps0LRSuw~n!+wc0Xngrrn}jR60SSn}meW>8LrR(A@c8J58gXiS^dbeyw&G$dNxxJljcT4un zlQ9cmZPytG(vD5CuuM}*OG%mW9RrpJl)A{0rx-W0`Fgea`QyW%{`9BGSTCsE?#r<< zTCP{`iH_&pNcEF}txf)+E{O3oUhb?@SxK(98&cK1*9$CIsS`yyD8<@Dv>u~iyF`7H zhSbNe;*1ZCUSUD)+H+!Kx7$qg7oYM|R*GM@!^ z*M#N29&Vc5$4gQE_V>U1%O8HwZwyWRkhqRgwsB#`G;&z4mpHQ7l_L-NptoQkH~IMS z<77I0^X3gbL-y(Uc{0*ZKGJ#aG*Z_K$Ns|vTRq|zZPB$TKpx_`zqsHO2XVjG!-;si z-mc-{82z(5Z0KM2RhUFf`*~XQfB*mg?}vwn4 zCw`^?MUrme(z9?alSYRTMLH0LC-Wha76$$>05O_CC#$_tsm1ULK$wYuEVifxXt>A7 z!oc<|VmmF17c{r!Wo2d3=8(3ERb{yiZF}3Yk@LD)Fb&@UADP4m;BfUhj zhGpvXWj_-z4dl~#0LMMx18c*40O1faC^8dde>zRGtJR8#V$$nG%b))ANB9JcX9HgX zHi$rq0W*CGmnKY(`Wmt&|QROBM3_J@>?A~jrUTkj4|HT978j@{M(;e7y+IQ-BFfO!n7PWlcheQ3Z z=&HnO`YLpq(@9?g*Eu%SkRgAr^^?#k)M;HqcDx?wgZ?+sbNI@BYwdR&Ae)wJqOGh zQQZH^lP|F#W3d(c|FV~3$O#lIXzY>X4jS=|<=pO_hY#J1mX`mFbI?b~#dH3vY#44! z2QqZ3?q-_q;H(Ak;*IT$%8(tem?7+d#V|f3KZI;Try-O0k~@I!aYT~rr0Mz(pFw3Y zz20wT&76VWZM9xUi`Bmgi;=39Sg0XmZwU`l%V6Jo$S%s&Tbfq8YO|o@e`jF)NW+wrU~ilC!tEc7i!J28aB~^>niC< zfKgfWj!;+$vwRaW?HgD}6ti&TMj$y5K9o1iH>4I>6QHJFhD`-^m`;cjTfDZ*8O&LvwQRA_U*e{Jlw2T)6t9)2O)jp zZhb z!XYiM!Wg%YvdS<0CZGOk!-H98wb|(5H?~7=Io^(SC`$xGGb_ns9d?Uurp$q~NNL+L z{y#L$G`?+3yRol_c#*-4|M-vpQ0Fj3BipWrlK5W$1yM0C!YZC*2adRor(y5{l<5&C2@(VKt6XxT%8?SXlJv_0riaebz{ za}NoWGJ*J@)~%@Kla}y|p#r&4c+}+&3}EfI!BwBfl&Ebp>2y5({`>FWy?ZyGYCDSC zkB^TZK0N3cnxUEMoYy{3$^hX2fLT0=xy-b(8ao(zaGTT|r!gk_b+Z(%1u!3};qlj9 zX|Y%kfe}t+T|(t_uK}$tt#8NeVY!@e--cqL1Fq2*j!~By$XKjSYXX=aPxK*8ANC3q z3++fTj^SE?nE-!)ImL37g>aL}svFzilS~22IGaSxM;bYe6{l z1Y~TMwC?R1DHA5;xlI@N)e7T-8mDp)sBH`!v)L;lxxY7EuINS1%k`QXdY{C+8bnS6Ui)`!u= z!}Id_-~RPqiL{QlNTx6Zk}$~v(?(hbObc(`yrJ~r;ekmYURT8(VMkq#VH*UNN7D5w z(BsonA3#%|1-=zkwu@w@y_S>N2Xz#xwNMbNBwR34&e%77RY>J3;!Yo> zmCP7dS8KiZWCdRhibhS_Y#*0YQQNr|)NA#AdKGGo z+UFrtL+z^NFR?R>m+GypnXa$*%W$1P!}HA9eqaW<&Y!jwLQM?C)vj{C-?!GSiF$>v zY^wrslxclX8c*!jcKWr{_|*=ehvZ*&_i_x|`9wf;70X8Kq)$yS#=eYMV43f1fPpS^ zD4UUZDv2UAwGG(qH~fX^QR4%(Uf2!!Q=h-34Csgfb849y=GUo-Y)djRSbT5x+h)RwVyXuW16~QGE`a8) zDeO*M@;&ozW__N1eOG{b+wjh`5I}{8nA$~Sv9RlTE#7f4xlp|QU#stSy(X<%YC}8do{JD zPJ}PPB|ZS!Td2!$q1i;InZF>ae$%Y$Kl!uYZ#TQu;bu3TjNiPyo6o1(`D}H@M{k6H zw$l&<;ZX1F2Kr&3KlKFkYN=;tfBgCVySF-;+(&iGXKn1MYZqU6!3U~l?jcq+_2{|Y zX5LJ9@fHreCuIn73zYDci$Q#bV5R~HvoCU^47JENul8-}pcYUqarHqX<;!rjTK)B} zf7KkoGAqO=ifX?Um~uKE%@)%c6XRkr+pJgr$G`k(_5ApcfBYQ>n0e@s9plyL2mRCo zqnkzi#^7#OK2XG;cocZISlnT78;A5N4p4ZbABn|h#8qS5vLSrMm6WMmbWjclf1aP8KYn~9U9DHM z`5ez_n);ccj-wpJ$oew|fPFiRCvxqw1L&lqT?x^IC-QLs{iNx-mGt@<9{|h}WdRkm z+j1i~W&I$!g;h+~MK$djotmg=6F~1vsT7AS)GEMYq_iSwr!@hr2!SMh4jqxAM@Lg2 zjhh2u4yidt2p+9LV5crJpA>#d0tf@96+wq@!t%g&&Jvci9cPmn5S<1;iIl8W(qP99 zSx{GMfn*wH8iabGPEo5HE#2n`!}90r?YI{_5%e3Q16>P1*Sa-27HZVYiZ0^|YJs*2 zRoz##GtMRl;3^K&hwjFQhlhXpmp?(f2?->bUbxHwSp+abgp<`Lpgm7WXR{fzJ@*dm zGi$-&4uTP;GHC1rEC8$_#!O-XQs57S#-lMeEQoIj$9T8|OoD~_I{4NOpzRH}DF#so z&|AVrHv&gRADu``c>d|*x&vq;{6;^9OpFn$j$sz;HXcFSy_!f(pqot711Lq7JmPeR z9=_n*!FL674(AS_adN%Ui_2d309s||aIO8<0`=mm3DTN&QF5GxK95fwKvNn-yAr74 z=SzS~N6S?o4jn)b4Z%?S4`HY)Uh1NAsC}+=YkrN6{S+ILAL3)F{Ciow!*))PriSE) z`X>%)uEKdc!??)*#D(pxaNQX+_B&nS>`?!V^g!F0()6=-Sadux3+>dUuGE}lniJ32 z9PNu!8SLZLeuOZq{6_F{vtLH`GO62DcQI2BDYrlfKoK;h&T^j)c^yFO_9`5ofY!Sp zW02SzQYr=6$9T8*PW*4Td8FH&-x+s=`K|>C+13Nz2z&V_mN7;CIKRZ>6)7xx}swgCW?yzF@hZynXwYi+Zzv5O%{x=wY&Jy=#@xY2A~vDjl<6+Ux7#o~*R`8#VOVNGI{^j@ea`>f~1eB7td` zAYrH(|Gf^Hx$o=Q`NM3ir>zA&o2~}~XU!C02pmI=u5#Vf;f{xP>27;i$D2L={`bE> zJUujxen670Mn-K^^`%{9^%v;euPp$$OC`(+;fxXE7{AQYv~sbSwNF47E%c(=QYYhV znlwsf!9@Vtf@Z3G09o1*Yt5bzXK7V4P*KVNx`DJETq_AtSn_m!a?o`)nYP9dM7dy& zG((K6VGf{_fkOqRFBT%gOfEOF@NL0n86ya3R&5EB<&&O1Yynusx&gTjP{g-v#i`7( zmZa05(aC~ZGE2jl_{lMmS)-Qe6oEdckCf>M4_WJY1^SXkU%r-vPZrbyW=44zeg4ZF z3>T`!seHK%&sJwV*!#2ex56YBYV4%5+&mZnckg|Tz(_#NLaxT%pc=-cg@DT)DYrpG(%fTn{>cmK#k&ievtcX;C{tFw2*viUUa#oGR@jb_5oy0mBv&R0^l5 zsyAM%&(F4;N-zlpJTF&jMu$ z3>-j*JwaAteB&ej0`Wc<=~8V3+FcEu{+k}EYp7|+ztHN-QO8&sgcy#8L4OK$>hn;$ zF63u+sIfzKeml6%|Lfa(zTZBHx+3U-0DVD%zA5phex*zuKPEaxNLffm+Kmv>juzSE z)I@Ewk5@Z@9zwd(!H`=+@WW)q7A#Q^@~*0vcNB&7qm-815?_KqsiTP{WF6+k476(!Mrrs-9jM zQqq*PdK&55H(xvtUR)(NQmy;{U`>;#2ls!cbkmBs%?*81iRG{(9JcSgSs2 zj`^7hSyS_tJzlki#EP>B!Ix^Ldx#U^k&zL~P=-|u!Cw*7j1h%57EI!CfxUsJ)Vg_g~EU5IM}( zh!2l-i`6uxv*X!}E+&oEGwIa_^as5bC1yaT5&k72CX*@YyqQ{kzR*L>_<%g>bdzrx zt_%)$WCCfwsqYuMiTGBsUTvGX9ya{(#~&XbpC?n@VrVQjkD+z4xGXI~SDCi|b*3KU zo>d#I3FBzz^Z;5Xr{+hfln5zR=kip5E|;|Z zv$dlLTx28ApKNa*)-{rjx#SF5fo?5ljR5??E24;Sg0P1_|NQfx{#2fThEqhtf5hMe zXh(%+{`igAlp)P3o}QlO@x~`)d=d=}wp)D#9$`4PfMxjp^ptwxq>&)bxA%8^n>amy zo+xcj0;2$@HMgUQii6V!&~S*;`T*MD%3{soXRQjF+4Kt+ajANuOBxFhefU`O zoV9Mds1$IsFL|`iG~EZ#>Oj^8x(u&*yb(~vS^rJcK(bKh;1<;~rhR|B9Ortbzy|Az zp!vs~+W!|^MKrYV%SR~X02XZzn6suwL29f9Ou zh<=Qnt+8UB_h)DzhWsCb?bNM!xkW?vukD9xVf%IMrmyb*>iq5N;JW@#WJ65&a_hra zjnVIoKH>FzAI!bAIv|^zns~W~f3*YXA^!CNah?3NuzkGsh^E`{4frl%NMckNFk&?J zY#9Uj1azn~w{qQ*j`eH)*so){=-4I|>i?>*xCa;NGV~6(3s_9xVaa>}hQ{$)4B3HS z&z1I>&KYvP&$r@$eT*Mpa|22(`QnwH!FY6C(=I+V%`DAsCF2Yb-Y7F@~giCB*f=l}6Ye3J@ zOv-bPT+5r?W^|*+RNv|37q*UZ@d1Je&x^h9RXufF;`8`$GnvkxpI7tSyVYj<{{6?h z`}=qAzJGjvTE!Qf-+lLnN}rz}sg!NZf$i30%GJoWemb6R^g}$Fi`s5GnQchrZxA>G z;qbO&XeD79fpVp{2L}KF;FlC51_w`Y33{{HJU)Iz`0E`&AI9o)dg<-kH`~qXPk;Pj zyIOwu`2OdQKXb7%<1h0P+y+A*D%UCyUZ?WUC_c4w_ZCj9CD!rQ zCjTVeu6-0*bES^aH)>APJU%}E{qKKYuea0rES473ZaZbB(h{QmtpY5Qx)$IkpgV&I zN^wEa1s?o(1&0ox;dti95p0Bj+)iWdKXvWCBFbTI&>}Kxbh3SP1YA+6t~Wo|1VGm? zOp%y+77(mBVt)8IN{qQpC z>Rzt;^CS&>2)`~eO$QG7Sqt~kDV1p=@f>{hwMZ>buq8M<*6^y#5)n3}@87@w!ymp^ zs8!Rx3FdG@!cm&RNj9d?qa=zH0fb4NbrFaXJ#&q<)oR5QdUtmR{o%t0XatZaOKO90 zn>b!szvJ6S=Ky-MT`^<1=qwy*ePl#+P)Be_g4jZfu&fWDSzl%JlHwTAi--kI(0*^& zF3C*m-g)`JPOs!TL0+M5LMoC4@f$4#tzbd;uaoYtaR6;MC?%~i)ULj~>H7Y735M(g z8>}mW=1yau>(UqcA1+1x18A~gq1?HEkJ4278c2WA{;{IU|D-(}eOTa=NaOW>p+*XH z&>t^*p7N)PIC?I_e5RXhAfbuf6?ocB~Gd z0UAEXj05QY1f;30txobm6tJl*)G2U=6la`GqW=k@kpi~gsReWduEpnR_2C`{HfRDs zSfGOr-&!V;2CW!7L&oxqtD~qEqGQlELPi|gziaGB*q(g*+Y9cXd;XJJQs!PnEi)`% zER!OWNM@!6MTL41Ddu$m_TcylXvZg@)wKPWKY(@?ylm&Rw7wnIo}52`zQn7JCv|n8 zW1&;}Nu>I)-gO3R)XogG^je31v!MB?De13k6N#JW8K;KNpO`PI=_wLQ})59OWdv}P<$>Ya|ho{HYcIECK-DsV(kAr5W zZZ@BL?IhLOSc4z#Z|~h|Z3WxoX0qxKW~ep>)RbMkd^zr?ssXVb-a+R)A)fBbQ|Udi0em@QrS z5;wZl1^z91jr%-S_4sWoCVf}&``BZzcnSZ z&^AsV()sY+nZ9JiTZ;X0H1hfj>*{eoaXAtlCIb5Yc>(7!EQdjQR#7wQy_s6LpV3#Gb_ zKps=11Y54Sut9)ze}u68w6ADpT_+!o7G_PKMIJy`2D|M|Be+(6!zmCqz#~FTi^i{a z0Nnw?XZbJSI_Y6hZ@-73xy_J*WJ~toXtf&JE zUxH%cbieRvoHo$u5Tc4>eAejue}SnpNPb6s$QqYJp-$1UpXx*P4&mii{POta{c(>C z)k|p>)iV8YG%=p&=iJRnShzDZWP_t=DvKcc>NS3~1Lz^QuC+6Smz&*3M?SOM;Y=8{ zSl$x2s7T4iB!&N;Q_2CfRK!GBvu9|P=`~)#u|3W~CpV{>F2Gd3f6VDjeCcQX32lvS z_1favrs=wwpkL_`0~6?=%9S@@y30+g9gBWG@i1Y2*4`(KR(-_cAiEl7h#gx5rQbYo zYnx|L8;R8C7jgG3zLoCse&Z`0KwBnDQ>D+j4B>tmmy#!S)`unxi}^091u~mRnbtx# z^>`U++@&@m+vE@wCZy z!q;zS`3w97)ypw&n$>E3GZ}9;`_*Rq?)yKix7&$+U}wi>on6axrelStr^nUmd3SSo zcmGa5g%?k{;l^a_S2IsH7}49K$(814u8IxYw*Beu|$>__!BaQ)pUK~LC324>~ zMJu*~G_86`MI4-lu>$puTdm{F5=c=}np_h`O`pXJ0yf@BP4r=IR9@T&#_=nJX(0tn zB%QFN8XrRjty)ETQFjIw1F7o|Bmm<=sRl7FD5srJF;d+y6aP!Tt;MNoIF$z!b<9$o zkq6MwE&?ej<-n2F)pF!#MP_#DB@5robiiqbCFp3qfLgMz^)kowS?59e2~0Ru7lo@< z^r(Tl|NE#dpG75bjGUHv>=}6azZHgH{xFfubd1Z^UWJ&N^YhO?|M8DMcoGP&OWPr6 z7kmIs5Rz(Q*=||W+5#{U8nTZtTGRp)N$A;Zwp>2@9Psw`mdWbj;Q{{Jw{HJ~ z{O5jJsPj{?M2cgOxXK<=4;lDj?STWqAz&)(Xd)s_+C(3&`f{A_ zh3lc#pZ2h6#zQ?*l|ldrvVFjnOnX9-2hbWBnJsrWz><$NA04oLr=NjZ5wl6q)y`VL zG)#t45nX_~0S37_nl7FoMyVg#2Xeadql*l6PD6FwqaGf=`piMSX~F|(bt7rCOw>rGiA;xH!EqM$ z(1fe&m_36l51>a^-hhFfNyi|DjMuQtkR)~@z1i-L0%nE^jbhxHD@$q)={R1mq2r-= zUJPNT)L4ku2RiyR0y7xY8$Ql0AY4};>_7|E`eWo83#MV(?Q<63kKt^JWtv4pKrH2x zh!RC={9Bso#ot#wfW92HosMo4WhoaO5qR9^N2-|AwHP29@f^*G4()q zbV*Th_65{h^#=?sR9Xew6{u@BUDs7(i2qwh)h>5M2}_1O_TgGtGDi`yaMqjUteI@K zdY$DD@4jP?9s6os?^;NW_M`oA^o^mf)a7{jC4&jJbB~XYtIh7ufBy5s!_#;&y}iGC z|M7t;xSLbm!_(7Yx1G$U^SREN!MK_FwbVKYCC=hk;2WPr-}u=^ZNq$Ey7f9<@O>u~ zV*zcK>M#hKnrG5Q8f$^OyE}A)BO~+`)N-}@%U{0kJD{nKom(>*egECt)$_v--@W6O z78j{Tfqr{_e%|N}{99aqdw0KBEV#I>t4E=uQ8+lQ&et%FI<2AT5I+lCK##TXaG`?< zZNh`1KeKtrn2_RFPt6~*N63o0NA>7M(;{M}0aFJ*agMJJY~KjH->&u8bug*G=ZUy_ zfA{ujwSM^c`0?>!z1A5t!W!$b51`}x9sg9JhJr4_f>XKGI(&>&A;%dF9Y8PUi`B{p z&@I}dd6Co*!4qz)(0l+NV9?7AG=eQy#=&N!7O3eS%3R%!gDgZXf{Dy_nwfljh0ZM1 z8OW2up(wfdTPFZr$AWHG@}Z-!@C|cJxSjnwB6~t7`hGpQM)8!DB=9$AOFZ#aG0MegdZ}*7+FfqB-Ac(-ngXv&~ z-tD%Ua^nYS;UHt$TKIq>6ASZ{vU~2W$M*h?Zy!G3o6eee0(ulrKzDbhHHP?%exXi5 zoD~Y0@^1mA&?1nk185>j&ps2Mu$QYPaYYfcsO$9&*FZRID45C0OdIMBP6_qEqQDm* zu+2X31sN_EjC}F{nhT0OCfCL59zfT=)omH_*)nx$p$GcmTB!9^6-m?4q#!vE0D^2E zaP^iIt;DpzCO0bcq2)^_pw3D|)=DE}+?JJZyX!NM7ECZ?cGU(=r%WG1?W+Abk-72! z`s8{UcB6&kVJ#JR zR_*!8a<`yEq3dz93LJ|3PE0|QC3l`kE40Q76J2GU5sG_q=iCAG5YpfmV#v;G*&o8S z_AT$;GfGbm`5%W41-ku7ERD2wlx4~TJ`c*GLX7s4@wAM~Xs<)_pkw=06cHv2Scv<= zfjRRYg{Wogdu;1 z@LKi$)^S-kv_gmRetXy+m?d`8@#Izy)6ORiG0(-moi!6KZvv0mfiNQg*=$eP3$@yg zb7ObVffS>_vf5*J*pFbcL>%i3O4}GN5$iJJaO*){W*O?8zHW#vu}^j5X0qFC+0wB6 zpEc9XT1N?bHG}SCI?S5HCdakxaWFmu)A54deH^D>&-=s^ zM%dI>J$x?N=-feP3KVVDOZEUCAD*ZO-LN4ilm0@;PrMq@qtn~j{HH(e zHmjTcZZwhCbe|++&aWqa!xjvCWlp3_J7wlqaSuhZy0@20S%gvhpr<8FlG1D~f0<-C8w|PI&w@t&__(Tr^FxF%J z;t_YHDK>t7|M>K@WCU;T*n4XdWuTi;LrPtYD@9bXi3g$assPJ47{();1wcVmZ}lP2 zjVJnxeDqk^@(m*neB-D(&0~#FAvJA4Voi~I`r7m;@`6}F>%MJiX(;U>LmSqQQiM3T)>#xq5v6v3xbV%S<%Bnz=zF7NN}(IV7IZM;_h9lsu~ z>VL*2Q!3*(z9_HQ%!WfFJF!q;vs4&6RE}OC;~*9KHJd4IpvF4 zSz3sj9cv!bse2Z!$~kA^h%jx^%<8VBuc(`gK;9Xtt6X3D^^WJmP2&$~d#mMuqpNA!_B&>zTsW>iH0MxofP{j z?xEvZh=0VD?XA}{wM`mWs162x6X>|lmVz5 zE?vp(q3toPzhMH_;iPmQOzws7+1YtfWz|TPC>2r6BA;oZdV;DTice%-M#tc1<61kf zRqqfkw~yqD!c`Bm{XDhY(y={`5!|zTFZVfpdze2)T#-OF>WTj)>6HxnsT%@itERF* zofXlRSjDM{v#@S$u%=%Cx`lcXt_5V)M5mTYV6b*nQmaF#+w@mtfDJ-KsZi+CjV_47 zqoPrBEMOE?`-u@(Xa}D7vN-@@l9DOek|uicgLt{Lk89;$3%^#q-x{v#h7s$%+2}B4 zr^Qxhujh{0W^*GL&t_A-w0Xx0m@QYlnqz;{Os5g$R<42!Iu?#xO_F}3pCT1UMoi@#8w|!nN*~7zec(>Qk1Y#0D0Xo+EpfM0HoEZ5B#d3+Nqte}O z8}(6@9EZD)H(VEqn7(vZi_1_VRHc^{as}wZ(YvR|v~HvG?(OR7@$u>DVYl7j%XHez zrqjnq_E$%IVVHGJ4E1_uIW?J1Cu}kI`_1iQ7B30Wu~x_{rB(dHy)`t8I;fp-0}Wr@ zq=2jiIw*V>R%sl0hXZ0n(~Ge^w)khgjeYSALo%Js7o)KrrGH+o|MC9AKYse~xLl8J zn%UxhyBmLedR}jC-n{$6eDUVzhsU3Prf~V)ckd<|#t9a}=s^d`yWL`OtJt6+lhKTh z*ZjLvD_6q@aaJ6+(JqQ7u&}DgJMT z+b9&x5OH(NKO2!Q6o2JVKq;khN0nBfkf$3q3q-0Fm)sUyqmuYLfvW(r9yroR-cif) zH3wM6pd(4mN7!(-4?6j5sV!JHtP0Q!CBp^{fq>8Nyq*N1dUOWkHDMXx<)|gCVo*eS zmZ@ln!(}7Ph~G&;1k4eVZc+O{HdDZ@)=t*7hd{|%%mTnnqp$*GZO27mNHO^(e=)2G zYWi9`sB{SMf*rXY6=aR^Q( zeAC3kd_MQdGLrC7@%x~$j|wu}{tzGrh-5gf7e)9ACn{Ynr3kZ2KsFnC%tz8LR^u?!a#K~9KnwQ z4Jh}Z7$znbco`m@KIvqUHM>ltW$5vs-M`o6kOulKivT|7mj+VMR3F?rXwxk9(?ztQY2xLa>=n9XYFO(bE_$_ zN@>9K(4FTj^99tFzXaFXd98Yf;O_0C6kiPA0IbNMnNB+<7+J=VR78xjWej@~;)0o= zWJBG6nZl&z7)2O@fv;dDFm0GqqZC|#+K!R6I9o#=^yH1I-~ zUO8X*rS#a4ArEV`Hjm(vj2ohmw6{#PL3wkk>ufS#=%2GF#TVmRl}mc#5`2cM-xQ*= z&!7}vj4L&mL5N~K>bfVybbPeM0vCPL=-s}$ytOF2(Qn6%ZklGI(@}V=k)?e+o|`o@ zt`=C7k9ATEaoFnhO>wUwV2M>OCFU>cfZl0sx0o;Hv-xB^VZz$1H_LeGA^WcVP7dw2 zEWt-N`UGt>(N{sWC1YY^(~muvdcs<5&<>41D#d4Q+uERV?X-}TcF@xJvMu#*?{DW! zUE9rSx7ps^-9A2i*sNE(?PheN*I7(;?yj~!JiO)sG{9&f)UhP;a5kmYyUFB6^=k6e zkt=+6vrpXHirarrof&fMTD~81VpAT)8b%X3BiCC{^Z_Q(F&Z-*H=Etz!^fwe-aq{P zAMYQROTF)4I$v$}PtT9*?cw_${`mIY_s{D!gY@ou{p{q=|M|w;lGuhC|uu+cJul4_I7%=n7{k}9Z|PkZ&s`4IL9Ou^a06UkInBGLA+t? zagh$(6TNag{|tpC|ES68bJ{kB2odjh$_SS}3DqbLffFDCUz1%G<+lOz~K#H8DJGs7xiH~B@=KLh^VRq>2`+?;J}Yt zP+5&w%zRf}(@ZPgXoa9^*LB+3H-|I~oG{O#Q)HEFud_~T$aK3dBK1AgOqZq%2#sSF zqFN9L zzlW$xJA``xI*aDLdS5TQQ zsH?huf5$fu#&hTZx=xL_n%V$+6{z}lVgXULuUS&90wS~!Im!V1j1`dJ?N=}hVbpZn zB18OB4s_OA)56dJbg@u=HADx{jPcm1L))=F@#q;fF8mp zJ@|!@?%-G(Ok%N$3Z`ymE&|Zp$#Q|kx{BKg_dN>>XBvn0Id1v4iy{6HUaLQUEj#L+ zb120NoAG2apUw4BX`Nh;<2cuq#Ix4B-4+?<1RU7zwwn#rBBSRe zSu)8TF22chJZp4on&OC#nBytfkzQ(y05t!y8qg6W&~B|9hoO7&xseW>_ByAaEt~af zK5NGEoNedf{_gJa@!@~{umAVvfS-rOVtzZH(Nr3whTq&gJU*4f*ua+$)3NjLS&23n zxU}7@7xSi>j2mq^N}c}ak^^W>BJG3#Uv{Hk%;{sO$ot2t3_1C!=gQTQ>T^bBz1@HK z`1to9f8Op6lV*N<_h!Dh=WjN@Yo?3CWcv2q50A?g3yNF)xaIigpMG9%HsAl@U&c4h zc0Yc8-ab67o|ddP_J`4Q+)Q=EJzGqtb5*EF)ZsFLLL=_(@4x&09Ye$7WVv378R3MN zG&zod^yof*ig^ZVP3+`@P%o)}qKF_-%ouf_lwqnOTp$|^=?f4MhOtYGto}koS4xhE zA%zyEYmS8p{yLjLvPN?1q7W?TWD}T8%hrku^Z3M#1%T z1gOG9tp#f1g%v2Qi&4~CB*&$nfm;1?JC?j$KB3Ca!A0&RhLvtyE|>4#y(8E{uUjJ# zNQ$Im0L2_)A`>wplPr;GYjEJhfuA&0m`271y)&{5DNMwC-Rs_TeS3e$uL~xL!;O|G zgh_n>T`ot)R`*{+Mdb$YO0Zp!Srf+D186%*)G1Xdq;O=mSzv>;S+}BODsW|xw(=st zSU>)Bton>vdjQSK%~hfr|6U5a>Us@VT{2${*+m_=_C88+ADtD#r(i?$b{s%QE-X+( zxFinCEe&Cy9{QJoFe$O>YzMXmY8vElz0}4EaX@_rrMQP&&(xsaK^2?pL9TvH*nX)j zRt`?DtrsO*Fl+~u;vTSnwu)4I8Aui?klC?UM{5eOqt$O2SS;TEGb#mQrqo%uPvX1+o(nI3xoUtl;Vp~)Oskz zUyN%_eO}eI)+a2K+m)fQ;2%=P%Ph@j+}zrIj?QfY&Km9Dp1@26L_wU#Q0tR6V5 z#G>%L{m(<%Ow<*DFRrUHrAtF_#P_RCWTlo#$&#&T{)t>sNk!_a*Rt@7K>nR_iXE+h zPg56?2?V>;X!MzqYqLqau0B%o7ls|X97U~%7m9upaO*BdQM(kQI8!ViQz?oLV?BAi z+iy3!W};sZ^F1O86|(Y3iJtECbF%(px75s<+uPf_`@6+ru{-QOe*EzFAOF5xueRIG zVZY-K1I=VSn>Mrgw9&0xziqeQZCTX9WTLv+9k6oiO{Ry@WVgRruGddb%ctdPI)6KAW`~=}YPa9e&Euw-EoQR?VKraek^k`F z!|L&Aq(PtSjm?MV=4Ofto7VkkyxJT-KCeGKJn1&VSU38fJC4&SdPsG*oiFBk)9PwD zolSrE;fHr`-@^a+@R5`TDn5xKKz%X*ee}8gGYAgRG0`aof)owa=`n~_jepy}m~JQ3 zL9D5$*dZUgviMW?`62SXQoVKN=nxgg9~T|Wuo7Rj_FtGeF0SN5dJ)+|wXnchP^z|_ zL+Uz>t6OQ!H&Q+c!!kaPGi?Dt7Hs2aFN;XAZ}|kJFhMP8VVS7h=wPS_ep)cX%n^lq zYQge8npC)jlg_%xK*d?7wFMyS0cS(?sM`TWmP~o0R_PR71^E#;o4p+Aj~a7O zoG$@`LbO2O3!%jMnOUB;E`${H;OAkYQ!CZ_a_epy}5I8zFZfM2^|+I+uu17YrH z&=kRM8hv{PBh+gn02S36&2`nk<2MB6A(j%%y#!Z%0NtVvDh>4UN_Y(@Xabov5%nl? zeN0KbZ+Dxx6w4=M6^g$Kj?=Ou~eGjGhTLJyb7ERx^tyldo z{rz+Q2%&Bs9!LVt%#b2F&DSFU+(H0rDYCFa;M9IK$ttGL!FRVlhUVw2=nL_!*|`?i z)_b_o#@kx@@xa!C$BQ)9#2Em(%bf+Kg*x>?M>(%*+81NtU>z*!JA zU-8N9CCKV(T+Rf24+|0Z|H7|gn7PBPmP~JxY``)jrSA@!Na$+6(Tto9&81cHlZjmYODqq89KYV;emXru)uh8t;LXNv<#*b1(I?erskB z_<)T)n-&x|J3Vndrm~yS?r<}o-R%x6vYO3azl*ruZP{w+XA(m%swxwUEHnLR?|9Sb z?GS?M3us4#Cm|Ch*4a@F{GWgR$8x#E|3CimkCd^yLw>he?{+$a;KKK|Yk!#h$AA93 zkDoLQeGNy_p8+mju2$2S(hHZz6E>3fx6|$F`42zb&uO#Fmmk*ij}T5`Lh&6o*75~y ztAv`aJ*@ecz~a`4y5skQ^F+3v?W|D80m*`k@wseQB2 zuY_$jdT$0x3;K-ylqdVqYtFS17R+E}G~ONd+x2F9vm+MH4o~dl)fNu{21OGg5gyQ0Dg(X` zo*-g=HqlvCgt?%~rJ^+Q5%DdM&$x9OP}OZ#x0oOb=dANDpfY<>wJze8X#&u8t(#A4 zOjxo`6P6@Z7z7wrFAU&Y*nDUYmIY?B8BA6V&}oO#kS#Vz%{1T4n0|VC;uhw+1~y5t z;6@S2s8fU(>aLMe_|E36UQh48<5$A@_!$DXpxt59Fx1Vc{t-e-RDAj)gi6NOjc=Gb z4~mE=V$3utSx9Gr_FL_b5N4bMotb|MIsbz&TM(bIpFt}lEjwdE-$`oedM}T>su+*; z?wZkLv0&L27iRUNbH7Do+b>1+4XR5(A5w+BkT=pAn_iEfN1^LH?ivNZ!;9_>{z<%@ zb+4A`3%E4-9fL#QDk#(`E>wR3XPfXze0jabQ0-^?5aRlJ&&v<>=hZm9zRnJ7-A1CT zP^UPNspz5h)-vBRzOJ9#9GYn!yScAku5mP-|EZ9d;%i-auZy8(=e@}eXUcTuTb=J@ zreVfHNL1HaHk%@YQks)gcuCo+a<^ZTeJK_~l3 zq0jj)9rpoy54Rkqh_lEEFEwIsx5O+bXv}1*d(3+RlH%(kzn(=fh8m2TuuJ<>8{oBKqhPKy>t1$gJK(`%eOsUUl z^Q2kK#{13chwtxh=gncW#a~Y|uW zO%B^;GFmia`r>vz+3%k8Aqif^xX>~x*d26NdjIj^=bwL$ugOowO~b%!^?vZ~=r|t} zcQh&pg#@$^$4SxZsHF6l1$sBno9QHs1oY5#(2OJgDC2AkXhJP%Ut)M0sVh>@`eeLt zL>`gWC^cPkIs~B90(5DI<1`ztvI-dK*l}7*TA-Hf&?aJ-bZiIVpL*lc^FyYFg-tLC z;Hqi!Z6`UvOi=PwshOm;Jg9|1$394A$CR_C@f@N~O-Q;0^Aah1XAO+NsqJT4tJg*5 zo34o(XPMxW!qBycm)J@FjgCscDE)Vq)HOP5)O3wYWB_sEQ6QWkK79DV9KPRI2Xj>$ z^;xOD%HqQv0Veczt5Aeyf+BTT>chzK`1bY|`uX`e!*!+KB+%2HsACPl^vrgDe@}$x z0kox18TL#Ab16omY#)oT!|g*t_=(}b^!4r->W22@es4ShvmPWRujzWV0RhV}KO-!l3= z`MS_bROlW+Gc2U^v4o-z)!z{z;`AKLY=?gqXGhs^g(6Pv45@IX6zVdh*^a?W+^+FL z6FviV?WXg(=og*EC;jQ@4$1pbmwrW^>oif_?v8lLnb@iI?bq|e3(fq^;rh0mm&cBK z)v3*rj3@JW38WyoKnnNqPj>*VO@0M45oVp_g%rysQs1{?{iL6DcDN%pWHymD6W$p2 z@wx}l!}70#*RnquSbz?7tm~~yO%M4q8dn#_=>arD3}R*>C&2frp>H2ppe6vZKpOW* zErTc`Q~(iT`xdL5EcPvICI~kQENnRNYL02^_EFop1f3g6T~PvNmU075Itq`#6kbWD zZJK1-J2o7OO^|vyXxa-k=|-+BCoB6Zs~d~9Sre* z$IBS%H^)gIuhq}P^`0Mh&sUx@ZVukG>mAU+BZjtIuJ7L5y?JxT%(Gsunu&JrUe?qH z&?s_gb4^guVWc}Wp$W<53(Xa=*K8#w+bcF!AuNIIVc+1xWW0KMe*f`N^Ur8ual`D8SkHSC)aT&*@u zqiIc(>Rvlfypme1^2i=0)BpG1|M681pbw+*Vm6;n*oJJr|L*qwcD7xv)QH&VUVZ>= zugs~_p?DiYv8Y32{u%r9Sxz_8r{~qf_~Bu>Tu-LW?c#nk zp+65gl|d}_RNKw!uvteqVP;R$bY`Jg(BV4^w3~?@mS@D8(M>ZMvEP;aVRyHffB$x| zm~Re#(poL_sK>M%_a(;s@%ib)2fcY*0*DH&T#?&;AGF zqODm$ztnsU0JAyA1eT2^KRf22$MwFdb6GW=*93 z&UW}ls(0`;_(QZE8!Am8W=XC}bHG_iFvPEcwbg1xbkYA1WVz(O`|i8#w!8zn0|tVw z1IPoaAS}URaZ6|+kh>u~M0hrvEtg9Kh*fAfn!Hu1=Ph;A@GX7ml?WAe*za3oIjh{q)03B;@ z>>dxGRSrtqkIPP@&O$reNgYlvz>-H)AEUy~!`gplFz8;3_JktP?w=oeGI&x=&0GP0&L~3pSY5)s{h)a=RjB z9LX{nSN|jyskfA3xod02bTN~dDv^CPJobVbXdC_c1$?U zXuP;>-n@BpH(#(t*Iwulr$ySfXvfV4iD@Cs$xb{Ti#bK6>xClh>NNe)CE*K0DIq$c z%F+I?-feg54Ji{d=H9(~7e@vYBsHzY(`^&Id4rr@<%vJ*^;)l=hVL`VoBez~{pqJ4 zp+7#n|KW!p=JVNMv!qd@Jrlm(UC7l#DgT83-Qe7fCja&0(~5my{pumdaO?ktkUv%o z*cx5L?ouc2quuSS`R?6fKBaBijjXr&V3-{q=_DQj_BrLi=SL?vt;p%oTbI_H8i)OM zHe0MU$a}hXJe`fk)7578?|=C#6JFEI*fAr<7zyJ>-|!o=L!OPB$!>diUM;ylXh`VN z%^GVl4x9LP^S*((Ump}#jXWDoZ^kp7M6>83_~whlZo{^F(M z2b!*r|I6D+)B*;sp;L&E=jZ2#hll6YTJKhjkJ}ZR$RcM+y*n>HqmAz*>PIYN<|GX8 zFMCXq(dP-6ltM(LAQ}hOfzUYir#TXiL6ZFm?X|#BcuQv-cGHPY@ZyA9wtrCzFVwxgAtIyK*^VVZVfidx9pAT%8M z&0-z&E%Y%YbBVms*TO4L?~VcRIo;wuzcK4_CIAP^m9K(=dr5bEpm`bYxXK(MqXaZ4vjoc`UlD*y7WTwDDT2t$I*5 zh0%q^6Wpll;!d9MwV>zMSb8-xU1f3KJejS&0^Ba6Zry94w*OTS8+86*jT`+L%WSp9 z^{W36NxJUy8uegh3RtVwSzx;EtD26*b-@Wg)(Pg+DcgfuEa5nJkqN`4FZ%;hV2DpN z)>%-~z=~&UyaYp*JN_hw_?O@k->{!mRCSGp4xl|=eT=T05N*>Q)~V5_YfkOY5Ni1v zL%Ov;hUrV{x(w(28330fv)u6j8n|Gn|5 z_B}}Ujjmyx6uWoHPy`2r%(2(30xV`g*V)8S+iKafiWlI#*5_L5qPEka&!QAxfL7r; zKRvNZuR=e5oQ+gP&gN=}Y&E8Z12E3s(wq(~VA@)wzjBPO^g zWnKkCrd(smd@khkbrTSyORf47T>(!m0LYwhTR+Y7RXK#0OV7f_hhPCqf*1O;P+x}2 z?Swn8Q|T{&-;k?kG3dX;!KHDy%8ED`grd%I;qLYGf8yzbl^gBq*}m%{*Jg%^LQlOg zS40(I2TB=5GSf$}dZ~n4`j{T#0$^6TnKt9ue0saMyIp`Ly0F-`w3b(+QiT_4*k{<+JLiPPHl~ zPA0mt2?TOGE%?0uVweiU&&Z)kh?vG=E2I-F&WEnOAP znd~8~2^|r$v-Fdo-_{%bR^a09eoUWDXAe)Szy8(--G zo7MAryPP&Rx3|qG-jWeeD;%GuOZ#*(-Ygc2H}M0Q@D5x3>Lu|TzhF6n)`tke@t;SK z8pFu3$K2@<{hs!`tPk*X)8NK>vf`9ptA(WRn+h7Fuo%NBIbnoXt$F?_fhV!{1N^8e zT2`4gok)S?n+DLSVnq2-B~!yqt~r3LQSucBIBPzL7N|yFILS#m(;6XCWJqfP>^KVn zh^RbLN74vw$v|fj!lqqHHe`ilLRhTB2XW>im`@6m+Fc6AgaN<90a6aw!VoM;YU9Z? zEw`$+By7`ZolOfdHFEgz7zZ%nAZ!_oJU>4pKoK-W8270?Rb<~X zBk%`-veMryuJyj%f_y8u-W@bzmQdj6a&9C4n6@@OzCm6LBE$wsfhuYv#F1mZIi_&~ zvA86~*V%4s4L63?`Dicf&7R0@9y{Ia#Z63Wy|Z?%_Bx#v3- zFZvNgs1*4wR8%3eUN<_-3}}tc=`G-hfi7fztBrtS;YEMy6nR6%Jy@oXV@1QL1&}w) zRDCfm!?8dI7VE=C`Y6Rc3>Cd#pLD3S4>h9&%_$TU6lTuNx#8>?be5?JiVF29*iKEK zg#`>8?F3JP(n6iWikHB`SE;-n2s5S5)QCo$pzyE#5yI5G5SFLModu?^wR0`%8iA`L zZ5qA2jF1g>2JV54neG*_j@M4FR@cQF*@*0HQQG8QV@_Sv#8_>J9P4m${km^bJ32x#9U46J6D{_B& z0UST1&PuCYqNIh_#gJKQFVwKiB`(DS%2&YkVp;7!;T#vQTnZ`;+P&ZL#6@Ruoi~^& z|Mo$hM`QK}a4##YQ&3c>Q(V%AHHPf`*74hE*LCCT0QHh)A77&6)}hdevluoYT<^O* zd-cOyzbH0)^Y#w@Xn)x4HshO7Gu02V=R^S%W3DQm9^!xB8Q@b3W|cYhr!zyjb_8To zM|A}^lQP{+#?#GiyI$(io##<8agb^=}{6oBeKIerZa70ZV=fWaLJ#;FwQm z)5+m(K7DgPrDsQa#)S4uM(48X!|)0R+Ro zhn)3B7sbg=L7^?{Ubh>yk*aTW931AF@ov3r7SsRs=Re&yqe(n;9FU~Dh9Oi;l+e;< z3E(r?^>*|8xO{keBp9|nO5OCUa}pP z%qHMx+=i0GGVRNoQ>TgA&N00?H1U;EvgX7bQar~(!r2ZV+FH;k($&z!87bpP5lqtT z9M#eGr-`h~eG6d~GeOeU0%jV}mIs|u(@u?~?N0~TNg1aGJ{Ib<-Z~8f1?~h0Qo}Me zWTN%Z@sLbl+CAf}VVdsM1RpCpHv}3^_GAZr3w^vGb5^C#>|4OGWa68jN9KM+KSKcX z(|?w%5UB!@4J4K*g7#QD3+=2Asj-X}_cc;;=5zfTo8SIHDOFGkTy=iYkV(eG@A#F_ zjir}SJpp|)^dp4rwWlGDo6i++q(L|oO*=A4i6x@0tx-~NE_edku*!7~wH2L#s)zsq zLH@q>A_J`pq`~-6-gi0!8Jt{m@ocy81oVvFkycpvdZ_(B*C$_!7y9Qs;`!w(5NiO% z(&-b>jxLXQZmQM5EBB}U_;icvcJ)Id!a)y%2Q9YP*@vW;f&JfByS_tk&CR zI-gAE_ix_KZx{3V?R-9;%=CHWZbzT(=#$;y1_DWZXc&t5ob|>=?`GZU$>Z(%aI;|} zHBlJ(W~2da8$w^h)QPlS{|s^19CquQo9*r0{14x~9pCH-GK97~0Us-OAJF8Ok^nkwEDz`lU zyYs_>yIl#UWs#Vv211$v`Z-cXIR;AouBS!G2aq&T!xmB|42QWk7@Q`eT&QWo0%wu- zK}wqFW_9Xb)&tS{QcH*&Q3L{6>MVpgPTgwwjBjQWmQSdr7zHDlq;(cxhp5PG7A4;m z)kP+1xR#toOe8FjOlPGQF{6K4P?xK#VJ*}VD6CUZnnlniu#>cjs6j9@31FIQ7_D}{ zAVB!^)?#0Xy2dYrJtPIs&(FE3A=~laA6ocySRa(dup;c!b^ynZey`(A9X?!!X$z)F zDOxUIs(eL=}fcQL2^g9HMaJlxOg74Dyij4^^GaZD= z8DLHE+TI;V2_aHAWL*S8R)9tXtq3jg30hQYnNytSht-p!ArBKFUsS9<92cE+%!FwFdkd!jM<8^eJ2-^T}3!DF#<$11REJ))w!*2BG5wParD6b1>AOD(W>K zPRAR>Ok^B_nx?2j7*Tma7!b@i(T8P>S}Re@bOh?6Fm^uMHwy=(fQ5mxpNC7-`<}G; zqN)>T#|RABcR%z|+o@61J`2S}fGP^N@)@G$UjnoWb&A@~kj$6hT0ap_H!kt*s~0Qz>JeR|0&`0?F|{un%NFpD1=)3$eTqTw*?G z1&{Vqz}eRV2G61tpUwh_WF}FooWSOKD5X7=VmH>Ts3nWuZ8Np21RWEwZJEZzbeAnD^S$F85Fn9;CxY0>jJ)Kc>Tqrp!$ojJqBo8{yIOT zY_(od!E82fW(}K<&6W-P&1}Bd9d=q!k7HS_p9ma#?L5*6V?5HKwej&UJc^gt!>|6> zcU2Bcj62d~JlgMc=h|-d)9ajp8I&iG?EkYc=cdKP+%SUkDD)!}lepzXiN z^0$xA88(c{SnnLy%T?ao-+uS@4P!alZq;E$BL<7=3EdsBH(P+Wf~x$K|FQ729hqdd>AX)q@9|mInDxTRo_-E(Mqe2R7u)dDm4vcE>Qb# zPSWtR#Hu_|y&QHD4;>ZD& zrIC>zLS1g!D~SAq72&0_`p@eo{*Y2FEo=wWeQUlECXe>2sz71t&vo*rC0k|@izqLD zGM2QnK?zZtVA`pDt6`?(0%n4e@1Yd;P>KVc?3MTu-Sen>W5~6TIrGQ#QY22{R`*eg zPl55esHR7oDt z|MW>jK~&tjv@l|@+YkTsTNyB;T*II85dC+=#GDaDYRJjT74^_OHui|}I>j!oeFaC| zmal=@em!c}*85t1VyAY)fWyF*OdzZC*Lw>N<&h1b+%fRVJ_I_xaeM}>7))gCCMF}< zjIhxTpU5GKAiQ8gptJ1O`B8g{K;>YF*kuF%4UZz8@N=&pIUBAGVrN z4*SJy{^re_+qoVh+sDu4>0Be ztPciYNVmM-p$GeeW6sv-Gu?!eIYl#{etdkGPG>*<^zr?N$NA#TVbpAQRPLt;WlnyT z+x?`O-HsVc=qLfN^iqp>$Hn90^Yd!? z{Ipcu#QY5OkIuYx_Jq%^NsW$T4uN>dmG(p$km#|fJqkzutxI97FY+sZJgj?lj@WJJ zf{+trQ1|z8071>FFdD?odcR}*kI`ir!yJ%Vr?s%N06O^z3!FtXUnu$3EPQ8;thY8* z)0RhI1PxfOvn~QQ2|*w)WX?J0W#2*1mbYtmd#AoCCsXllnS~9JR`$`o7d~9q+F^K} zt7#n5o=>eVm7H$%G^O|z9MjnymqsiO@bbF-{+GZ#_A;_j7vd6|CwQe-a4_iMYRtOv zCb8mqJW$w&{j6JOddPnVTgoTVkLTL5={g;7=fo3m%(g*O8|mZd*noYau}~F`t>~HU z`11?mqIxTb&o_9equdWerRQ+op9}jZE9%R4IJHaAXU7XT4*M8t(KRjoCD8ZB{b0W7 z>=}rwpMdUk>nAZJf32O*fU6)iT4vlbtL4{jr_<*U0Vj^pYqgt}K$ZWUC2q*vQI4$1jI974y)t7FLiwe`N1pBMU**}6OFU^2%!_-muC^en>b7o7PVKW(tqjH|6Mk`E`Hd(np@ zE)@F$oVWk=>;1OyTW{|x`9Hcjl&f1;k}jshuG(@SAWEy$^4Cnp+rxIV+pz1O>eYW! zOl-EB$+$@w#I4U{GB)oNRJTW_#|N``t*38Zq`>@$o{NxWfJnoOt7e#dTY z%w4W&CcDjcHf^}ysWtoEcyyrlhMgtT<9=)IX8e1lOJs&*z%U}QNa5LF3*xTKBG9^VxF#<@(H##_<%}3)YL4lt> zecs=Un@KZU%=D60edf*IUOyM9w?^yv^4a}te%mY-)7#sr()sjmKEGYe{_x$qH+Q#h zZ}0UC`)n~KoVKIQa;*R=-BBF2=MD_TYunNw_nY;KZS!KWnCmUBdQXT>jP{2&Z{ALu zDL$j9dz=Cwo_?>5baV`Nf3am7)lZB(#STF;_&k zj!#ggj^FXy0W&;f#^5shvbH7V0bE+Oa6& zv0^gmbwpV-I2fvXS+~~|cW+JFkTy z``JYul;R%xqwFqyLFFv01+1tl17;@7A*EV#gm_dc)&N?FlNNrMl@+x7PY(!yA{{6N zar2{fSYrv!GRQwGR7xvFXi|MWy=nq*&m^-0iVAfZhU^USYlJ%mg>?q!i;7wgS*p~T z0IeqN^YOAUPkkVJ7T5Nhwfcyf&tlL{p}r1Uua0m_U#ni*zZ^yFVidI=N^uXRxQ9}F zF^XCbrT9yMAxzmC<3afC37q)Ps~q4ZHg%5Kl5cj)3B*{>@9egF3iVrb&7_`a&`YEB zbXB8WeV+ky4#o+OVl5C4D3?o&`x~j^C;o%>LBMXm9mkIrY6?Plq_e^?(-#ZpW{N{p z%KdP;**vdS%k_HA-EqBMtv1W$Gg=tg>FHzrWWw$3?cHKAU)+|<(Xnb$-O}}bAN}a` z9KzQMh{YfLo!&t)I?S7!#e6zzCUhxgXg^}nk?KQrM5HHHDyX=HuPnp-y7UFe|IvtU zncv>OfB!)rPN*9v`|Uc)TeBnmPNjlH2Xj-AEFI`)-Hdj6TAWy6m?k8LZT#F`)66DK za~Ly58_961BEa?sZdx*{;pR@V8^^n_b!e=&OY5B|@eQrAXfcv@kVISvaL6)tn2MpL zB7KsI6>M(wu;lo5!MNVyik{NmZS?fD)Y?CpT*n3`te&qz;RQ=*%4WCcn|?X6OcvrI)HO`>|*t&e=emr@I6ah^;EwZYIYOs6#` zY1LN2{8|8XXrtr(PC9)J66&oRi>G=ej=&>Ye+93t5&U~i{tCUPDZ@5tquDS!5E(PXvEO&qy z0!Cq-LzbplV0!zN-vRwvVCcD`=kvKeGz}kuEdE2&B1&lv{xiFK6NCV5^qz>))oKL| zJP;7*dbqKJ1!%OGM&S4sK}Co`!+}OVo=!daE}%ZkiYTgk_;>tPpb3MkKfcz(IGQQM z{2zDq_Hr1w&W6UFkN|1ZgoT~LF|$p@MPf*`h z_tQ&&R-szB2Q-{5%{L7>AYT zPu&J$PI1tjKF%8Hz;zk6*~c)yZozpJ(Sq~-xh;*Ol8#O)rY!R^EZIjX?!iTt0X2OVp>zhN_>0lE=B)X^O!o=tSAPY^*Ff!q1F_?k z8rpJ9(^TCG_IiP%38M~<>=b7!Cifl|pb!e#Rz>v^yyh6tz5)yzF(}P!P2hv+4r<*R zL;N9pZTVM(JJ6G(y9?;Nr$v1)bHCYJZ4Ls^D0;Qc%)5=P3X)zlTSgr1T8n)Mg!||e zISZPxzUnxg>Q`2pX7;>#o=&E?L#5Pj=UI4D8q5C4KHltUBQHUQJ?n9Ir-Q#mj^EiWsWl+Wv>{Q1m5mq~i#yk0Co+ zGn_-e|6lI;q0)GQ_A02xSjp(*Wy7SRD-r9}yshFfS3gziZ4rCPuu6u@_WkYsoBKDn z`*`U=qfp$!`yGVATd z%#Vy0^lG)jD}2-GL%h#=7Qd8VwHQ5O>L%66joi4hS>^~UP(aLaBsmhgHHF`aokpG~KeSu-V+kfd+Jf}XfE@dDgN z!*v-o{{`TV8%uAHLT~kU656M4n*a3vJBYWr+)7gf_H`f`E+ z!UAF%Uv(eTeGSdhD?Dbi+5Ii1pGF708YSMKJZjia$008CS*PRh_oQ{E2gHRaDfTQJ z_VvkxnDO$9&2G0`E(wGWAD{L#jeDq$&h<9yI46w_e|Wg#3Rkel$dXsopVaOu7*Ciw zuZW%u0a6st-ye}F)G6>J4xrh{D{vGt^y1CUa=lWAN7coCydH$sz_brAYoJTBAS@qQ z?&E4KKz^c62o$9RfIFx4T!3RFT@!Q)X&lXzdQG_0S;I7Z2(BX*Cqx)o2z`$s;yl%j zluy8^0S8ynbrH?+L1Z$`2h`|nI))60SH1`?%IYv>0@#8T?WZLzV|B8ma9j~#j~LFt zObhO9Afv%F0W1b;rV$!~X;SJkC%h1yoJ1WDA$1fmO^r!MJu)7GT@@E4l7AL;=~+oL zJ4Jo1^e1>i@*(JCCT-~V@85s_{r7R2tl_4Iy#}TfF(!G&%i}^8f>H~>LB<3?7uvO8 z4UUhS89@N^?(QA}UB?v;Ktt3r;il#dQeP4OOgN6zZxOMK8O`SUK;q`GVU*cd5fVA9 zAm;pblus{;1d&5ZV02Oflk^23W=U!U#1*D+CWDhSXrdG!knD80bT3Eie*6=67B5;9r>PlP+D zov(?j{nQJ#7($|gwUyE^rBU8(Wy(Ft3>NRZW3706{HrEv)INAN12q%6uhmDb@`AiB z7+*G3O1sYTwNYsCNk0RfY=Onnt0Zdev-UyVmZ4^)Zm;133Iia@3w4Si|IbHT_-_?b z!*nQ;(mFUcBTn?QIHzg9IiCcIrBdgOQd2LrR9#C)v4f$~+QKF9d|O*HJ!I$FdS7mZ zaf#2r$ph#<>{Xqbpqm&8QfOu_?q1xw%rqZZ*cYTZz)XN5FhQC{UY5hEg@tx84Xo0~ z5dRWftNSH&)p#vCL-2&6E{%#99a7QtBZAdrZ84{1M-}uoUV8`4KyUOr6*A>9vVb`4 zv^qV8}$L6ai&z450Inrvz;^02h+9WEUjC5>)0oo>~qYuNZKHBK{ znjGhqdNDLM_lNy>qW5B}3KZm+6a!Qiou>L^2TNF`L-Zz!>2yAy0X;G#j8@N2xCDg) z)<9^!G;bGbxUXv6AsIkhXfgtH2q`q2gAUl)1K)i7`0>Y|e%{^en$e7|9FH3{yfkfm zx=T+HG-a?}sS0X^FuRTTuYpr(Oc)l>Uz5rd(Eu&K`1!30uA0bGl=R4%nCe2K={ z0W@i3(X~yBnJ0rrG24QyF5%XSMu~<-q7{h_0pOw~`PP_x!HUW}= zfW!htNMf9+7)k6Pd4GTZ@bHL?wcrEjySqD07lAx%K>$FT_@}{fq<)Lg8<6xNH2a+m z6RvhNXAYnX0ZwM~0o1xf{o^Ve)zGAh$cRZok(hKqk|i}AdVO3QZ}um&jt9`Hn%PBJ z-MA^{I+)|v%LmZRh!9_L0PP>-_=YfW0A0In)XljZ>Q0?LgI&~B=3#czu{dGC>3@Bm zy4!0->I3LLC^2CN(v8}~tI$!rwp~L|b9?A_Vwq{muX{&oHK+35H= z2tw^p2xr^ux# zlN`d*IYNZ;@~XpVf-pxnZ!BNxC@pPqXinHxjE`?4f3p^D*7~NlKFD3icedf&+%DED zZcyXNxMfq({~P{^dkHsDRA0M8eN$UUu=*bN^6qwhe}DJs{_bD@`t7$*51$^$-Qb0# zS+Q7E21K3jxxOo2@=y)MpXYSv7@R`hr9S zbX2?N4+#o2aA@xqk(wHs3y0f%vt^`gp6}P_;|>-hsZ_b_!-t5?8aK|H2=_CP#{rEM zH%Olz?mqwiaC5sP$d}DC`=4dJRXhasg=h5k`pkkE;7=$}kMY#(5T}BKQcGz6q>AYT zR9~S*CUlMwiic3Mg8G;OT}>i+)Fn4Q!dX$E87PG?FY8j!Yq-?TqGeF5@^=Kr=XR?L zIs+Wn@(_NZVFstEKpRP$uvlhIB(Rrf${@u^nMx3@mpKqvi$T)D$h2mYaEfm70kmP8 zzyvA4KC}h0h!~i8KF6$l7g@y!8_gOj5KDR??f_j8X!hHr@DZ>&u-OsPl(WD_KoS6c zqXN!mny7X_8XtL1t&GZ&Nsr8qF!FK^W(}Ho+LzJun0zWibFsqv#DBAS^{FxK4ah#d&UsO_Sq~1eL2g{QMo~H(UvM%b|Jj>Sv){1nv2hH%~e>`)I zfJx~vZI4|Mk{2$&f&;=#myVG9Dj=Gx>Q9BEJMshGtk=0tF z*)`axW4O94Q!vXEdi;Vg*^t@FAIVhItwjYzGChO&dR2MU3o*8nrL*Y!ok!1F&kp=q z^op$Y<8bi-bPs<)tchu(+j~s`V~dofpRE!pS$19M&Z>JLW|qr~Q*%I?#XtXN#{4Xe z)gucJ5O=^dfGH4b)G>PekHU|(-$QguH0%%njSu2xQh@KaHIhk6S0(MV^`->X+Q9rq zgdwsga3o(4cf0zRBBY!_&|*1YR2ny%8ULBU0;Z;LX*g|wuGzmB8PZ=2`~B;^yS1xd z_f*Tg8<=u$+HBHM_yh4#HOQu@Z6Z2G=(Mzo9ihWEs+OCmXUC;eoHXA@c;R}Yg+*0z zt@z(w)J+tee$M9Fz(1Rm1V}G6G9jqXwLoH!PDWqo^Ui z8lno|SKEB;;p5oUki6oyQ?V6ZyMX%D&v&P|5J(`mEBxpPt| zt<5p3lVz3b_C6kY-o5A$=)Hb= zaq;QX{ilZqM##&{D?GjFT+bgNk1jSD^u8NB#1y_F&Kkc|0(t^E+M^&;8Y*op7sR9I zoT1|spnau*F@i9IC{Ei}V(X|koahXC+)T~Fv9HLsy&sTrbiKR;tOYCprX0hHpcch~ za1@F85V)Wy+Fa*52PV_C02!m@OGp4MXOjtGQDa1#$K52wlP%+80%EZVTR4}x}IgiM?MbYJa9=s055 zOYKlZMxR`UWv%>iKXr3+i$LY0^7!}&jk?Wx5tN&tP5ic(?0`BNmn3W#Q>_ETYK zjSK3{(vhBmdw~?x2-DycRV)EB(bJ`< zQD8Ops2^M(lIrr{%^7*N2)0 zPjFwiOcWU{KS33)=&4NQr;_2Yp|J+BRIf$npeHXMb8u;m*0fvIFyCmb2~M=nEL!n^ zES!942*lH1xH8xInL^bH8KL zX4Og2YrtAlq=4iHkoDKn_d5qkp@tU2Cx)541J*!1?sv;LfTFbPWe)T0hU-iX(>1)m z5-|&wZ-0#>c#X&*~glfAjS`A(wExrwL>2t7JnU(2RaT=YE)Hhiv7v((+fCl zr^k0Zm%@wDcH@_{az%)Xg?2|l9A3cz7W+7cqZ_p%;7`vyOY3H}`t9@Q`}_OVweIcJ z#k<2-=11tpe-dbon#BhSWO4WEC!oQ0vw77E42TSV)B&KQJuVgmb;WLRt*=*u*XQS( z01KVpiD6$~zCB?8EjToezj+;Fm~vTLtdL(`$GVAvUquqo2|WLVXPT!4La^QUu%YXr$2QyzcaT=yI{9vfrMb)t(#iv4p^jUK75d zW=k4rtyg|+X-LZSX(S#oNPDcYx4YKakl}%}xY}I5{`s#@_YV(xkkGH-h!{~HdWqQT zdm*E>8hsw7RmOsu@)TD!LLvat-A+G}7%dRTQrFAZ*X`r;>*M3ov!L%7>xY%7uC_`$ zhPG`Q8Jq2kI9_mQ2vWo<%*nK1&#=RkzqlH*%G$V^F@_E$agQpedhbjeKwBoY;#@A9 zuK6mQ))eLgTEP4Xj;d2(^-=0Up0IJ?b$}U!fZCY>5rq9tO&LvjK;ss^=}~Ifj(ZuH z6fp>NDI!aCs8NOMGES$) zNlv?@k|t5J*%YQtB*&=q2xk^0?WjOzTp86-^N4$dL z7;m&s3`PNuz(gIH$iT7i9KJ7}(0a!!I1GJKyWij3enOgn;SjTnKn>gVGC`X3Kjjr1 zHF(3cYkfXwPF#ew_6m;HAUi)oPL77csy5Z|d#~WAkvKLZ`=|NMUD@`O^if>KcRP@4Q*jRdw^ zogXo@*b!l$DC9IwBJdcma3o49()BXM$mfX&UE~%xAD7DiY?#LXeeG~5Y`=EL$NI%i zHJEhucn&U)=Q8^}^y25HWf~Hty*T%mgnzkw)@TcdiCk^{ijddkmzL`$n@g5v|b=pFzYN}AvK?6%0J2q0iIv= zKqApY@3vHqAE#$d)BGMQio1jU{R+?KN%RmpLesQJ=V7? zU5LXVZ5AyiY8P+HHg-4hqkLk^Y&)H2FkCP693RZkNqH^8=FB4H6OOiJ4i!AHQPwrc z)uf3?q2W*wt}oEki>$w5?w4!tueG~iv+?-&^!WVrvY};cJksm+@@k>OX!SUM!K4Ye zi{_F+s^4IEb-a)cV$xv&Pfpd*8P8VP~+ zPGo~@%HYHTBUllEisYCeZ5D@<6ub~;>beTh&Snboj20suNe)-omlOcMY_TT2(vDKM*IWRYD%jAU%qVx$STXDu4Cl20Tbv#zF* zaoRpezoP&$o2F(_jf1I{IX&aRwB@IK6M%r9o}L)Sj+|`lBw z!yMYpgAo2;K|m5QN-3(PtabPIdc`eTwgwyqS)er`+8ie7e?R=QYkhP89k)5(cL0r% zMhzpuX-E8k7*K7@16(tP4fvksHr2sf4#u#l(E6|g=zA`p%o@kv%8tXPF3x6U8}q-} zJD}P6>1%LO=N_9b9t`e%&}?hi#(K1896;MwO)F{)^?|mEDpTpv{`}4AOvivRjmoG7 ztIWtz7WL$lo)9wuy;+MXsxR=Sg*wiUabySBl+$UAM%U|ER4w~WP7=L%s%}M(Pf7dt z7}am}eop)qJ-@vMf3qX1LFiHYBzksw@to$LZ~uCI`@b4_9$51m_17Y+!ofcodrmSAQz$5 zM{wYq9$~g9jL7oqt4<0If~>26ww_Jr+6dVipSY*srr0d<9HyluVcd zOplBtX6^ig@Z;k@)o!&_PxQ-o06W!S(!GA{;iKZY6byUMSzqCjzBK+Gu=62RyVyuO zTa?y02hca`JFYZTU%%SNjf##I=|sI;ViUjN#xn8w^XE^WKCR=K$NlED-oGVkoQq+- z0w?ZAQY8nE+CP>_vV;UE(#!L9yT|y!K&rFZ>43aJ^^!3EL;GwCap;>k2yRlkF=#ed z@yY|Pw)l$ERGn_DR*Sp42VH7WT~L2yV@cd@Z}eskqgC6cFzv?l_^~63cDio2V>rhT zLDrnp=*ifKVRy5@om~?)DYWXlT)f0NOH=f-ggy*h1g+-^H(wtgzkU1m{Q5!^y75$H zmt4Pghr4yuGd#b@gbUereYN=?|N8v<@4v&{Z+)Pnfa5v>OHOO8Xb}^VD;Q-H@Lm0E zNvDKO+A0-wr`EguX1!ztJUu1A~n!DkGTh)Yhuxn|xdV zn*H(d@$T*p8s^K(^Zorjgr9@UUI)2{hl9y8({A}lGzi=A<7S7F0d}49d0dylqz(}KxM{f@)gQ9gc3S(Vm z;1LWoe6pl)Ec|}7_}f2Tdv(zccMgd?6;W|Dyyc31_5m~vC?hmoD=T#b)WX@UY-RrZ zs9_tmIu}6eO>C#GNoi=ct=eJdE42rny1t3EK5FhVfZmYEcv5nT8gq{AQAKJ$R`kYy z&)qPn#sYRX)jDzhR)v#(vmGXw=iA_%);Pk`NDCvv>9h)S9#4T0(x_q$qSs&T5t0dd zeydFrhV74--+`WmOWPqaiSuauWa*prJrgpdNu0D;78m4@tAKnx99ood?~P2T}<8m z#kkZp@}6j(ze#`8IJCjkg7}M?C~m;1iO9DOpsDfA%{{9CDq0q}RnyN6D#Fd{Gb;qO z*zR?}q+i^7(90;6tZBm%S5fO#51{v*CoT;)ivkXs_J4Vf?}7|h4Fwi2;<#F@sEfZW zveR32#oTg-dA+2@64YTQdUA&rB6_DpV67+NRAs6I;WG%_#o?e1ZNXOWK4_o&0;I8M zdBrCjI#jyS-spT{v5zNwxm?Q2^Gp2J`SG9vgbh7~4H}ikU!(dmBj6542>99o4QHj_ z-_s4KDiGInYDh3TdW-YT>v$R*K2oo{?Uz5lJ<-Zf&#cpUiXf;VluVL|3!K^w`ub{j zx4ilv|N0$pP1(KbRzE_B#sQN9Xx9pX_*ba(EZh`MEi4Bye*ye(Dsa2EebqY?h+S2S zAJ?SL&{UQV(t9vzkgbjs|NQgom&b1^;(wqH4;P1mP!vL~MH4c@a zQU(%(Ekk7>X{sKAl8jSe3+^&y9Z5{vDvULNn6t@uiVKQt1lqzbvhk_~hjH#AEf>Qx zv%sam@|i`RO2L7^vbSesQL%u9ZIdFKsz_^@g4A+^23Z5zmJR$iN`A***|tsmW@X_R z(5|ETnHrX9nLsTap~hLY+}gm*EE;8jX}g&6u|ueCKqjLPf)PfX<`hSuZbBc*u9DPR-q0g15j z>j3(ng-Z{h>jOg-3^P)Xx|*7Q0*F}>j{usKU`!Ja>6=E*$KK($e>`q|^~0U(c{qUP z8nx6%p3Qqx3OK4)y`kz|2hhE$S?uRQ4c@2~xd5?;l-6(nZ9Dotu?X8&*ISHkAwTsC z>^fuw)1#qV=~>jVUA-{y8g-012F}Bwe`_$+7sw(8o{15PKvOi)tE|^~&mEy^K%g#K%C!gbIB;fY6ubS3%&#+?Uya&BFJw9vc;PTzzXO^vV@Nrm?i?^`jU+&g-~90V8go0g^12BZ z_E&nGggj1T_~}Su^UAE-tkz8U=FX;!8qa&+1*KXxO(f3#E$bzF=I4AxdE|u@0SFcOQ1M%3DQ-_z#DJ)P+tK$1{j-BfLJ$|d5c#pd_Sux*rjHzf##?CyMKN9%&Gt6nS70ZS=OuG4Scu05nF|~$j{GuHV3>C<3?W-A=GU>Jd9A+0oGCK4IeM8Z!El| zGR49>ajRgtZHOmT10v!=**+}JDvV+#=fme~7JW6j1{*Roi!Su*^^1P00a;^7&zv_h*&)*)OUSC=(Qy#*k z`eskO5u2L-U;p#pH>>5%txoG`L)wA=9e;=iT+`^t>*ay(N*PD;1?R|AEZW$MA$@#v zvTOI}hXKa0{{Q^{{vXB>edGZ{jG8j~&4g8qsyH5v7lIG`sKsE}G7vtrih3Uahuxm} zq|p%#%lKfx6LS@Z#bg=V%XlUidxk=i5A_TweW77L+&oBP)ec7Csknss+Jqy&36T%>^1r#f9S{T%P0C(BYvmeqh1`Ziuk4A2ch zMS>C8ome&>W(t5%Ijg$s~g9XxuhX*gVe%KirNwUbGh)rbhV)#A_0b8IHCOrio z8p!1UtZgHnU-+kB5uYft1z-TISN^EAeN>b18gBGnanJ)pg0wfPU23B834>L9z0$Xw z35E#Yv|!XCVR@#p}Wf7t@~0GfSK9zcgghzFPjtWL}oVp}ZrwF6WfEv0r^ z)9LE*_kyV0R!%ciXWx&Wo!w^ZcD`QFAUc3He{rpE%)pME1h~0|!v#AyLbd6Dr^t3j z*z!*4pvnYUWoJh?AvRU194n?em$=GFzT*MO0YSH`tvSE~DSsyFcsq8{h_f-TFl~eZ z;%6zYr}0f2`r6Xa|e*E*Wymf1Osht{0MbA!8zK5QjkFt-Y z_V0Q4sSltl7;voVLFj3;NeFZyO50_FfNPFyS@Mr~)YZG5fO91DOnqt&SQp;s^anwE|lIdN(GupvODX~p|wjod&(&{7aMqU$|8kfj07 zIe_lL1|ez%!K)avW?fs5v?SvvK?Zvkn3CA;8&0TGZO1}qQa7Wh2UOIk0 z3T}`odiAaHRpvc*-iPn+mviFp;iKaJKs&CEQ=3iZn@F)s<9Sc~?`i*vYR5NMtUFBT z-FCtM@$1_=E(qa4s|vF%Bw1*H<07xu)@A;)3g)-aM#-;w396u>oIC0ktEGl(Tvq z=or2x`mh-({?DuA{%R3k=2Z^~ z>a_lLeS3d<`#=Bv8R58awM&=n)Hu27=pXl5>E2#lrl=8~hUA9fF&ZXdJQ{W8zTz6Z zec60{dIapmhzdpTLl{{3{wpreV6%Dk>2p1UHUVH7q9a`m^CH-iG(Tz|t`>UtI?&7` zyV4W=zWFB`?WxkmwLY;1n%BfMv~%t^7)bgj&Z&XNysx%Fw2<^E^aR0g21l?W@IXZj zj%fo9Fm1_MIG!m|v8v-D{Q`R&ahw8Mc3`y#KB%#oX@Tm_sOrF4V8rhMft0C=z(sHf zh5#U7LXbK<3y@73STQ*nxl^lWwh&SQP)-eo4e3OZYvYH3fhCqw+c>tTib2YuYut7hQapzU>+xK-b%;{e}IDand@HEA3JfmCv~PK?l$+{`Qa8 z1RX%fWU=ny31}MR`l@}#gXLOx<_Imu6vX~=72gkwYY=b@H3jfZ{3IB~>F|>Ie)R10 z4xq30T5uu+$ASfaoO#$MSDQ_!154J_^3cvEr-u{+RT93lq=xA_Wy~CK;8&Y@Ju$y0IV>+g?W6j1%vm`3iitPzX8YHhr4twrML*v4 zdbQPy=h!Xnbw(=>zB=gIvA9~YR^8m(g$k=dJE<8Sc;(WgyK$BXEg10vJ1$_i>-BHH z{l+~!Ja*rdN`;&J624!-;TjE(oxT@X!;x;SA~v$NPXJLVRyO#i1%-EvRCE^9k7I}5 zW(b*}0GU_~TNRFUgSO2CA@~Lu?<}wzzv&{b{wX<9%pwS2VG}8kDHwUINSPxH2kw;i zG=0bt>I@WRbfe0p;d(_*1BvbrP$OV zMf3sBFmPPzR7d$i16|@tBSae0HsI)=40_m(!RKDX7{!T%Lsa71=?^ICA@hj(8f(gs_T!#r1X+Nc49Om?Vk4Bg$ntPpWTug(!m1Fe0!-v_4b2Kbk(`)XipsCF18bR5blT3e6xS>!5G*7A=l}elfB*a6FE9Fe zSlWIRzX8)-NdVLZT{!4s*@`|&_6JDZOd-r&6&z?(khl87!zaIXSb3qFQM1_9(P z^WPiu{rFG8e)ti>*VpIs4xncS+ew@n=Q(sC>X>JAjSiq|NU0S#il-Wxh4w^3X!*l? zoq=ivBLroyn6O+GR?FqBP9Qo5(8C;2Z1DuNRxS7$=W&pIOdcTkn~^8N??bO6{3C?X zINR{m-1!~Q(QK{d{B5V&KGkLunxOU(7=t=BAVBD1rN2FxD`gDPL?Dszl^`xVDA^z8gS7}mEj`t`jO zm)Tja02@K%zLuXF`96GH1?Ito%+bSsoh(y=EeW+Z=tyykYOAT;sYpZ)G>N|qn670N#XY(Et?qC;)LIBQLtUg{}4tl&}y-` zFJb^d!!h4NBxJ{{XK`hLmKp4uFlPkV$a}AW1H{6Al!c%0?NQSJ@@@HeDLQ5p4##F^}3qb2o1?1GN`d@Dk zU+U4{>)V@~#d5*UmSSP|9L z{8M^_(25%yUy;!!>-K`}VH}dODIx71o1Msdr$8%Tt%xnA#?T9@mys5LbxB*<0GAr( z;H%{WRy5NtEJGUQ4bEn2;smPXEbKQy)@b>AnQs|RP7{^ zX~1!spwznNCy_;&g@9uLfL}&jW(^Af%bRl|of7HGgllJ{4Cx3kN0?)AcUbiSX)rFMR_{Ex=p7mub4V}Okc7cORA4yuGBKn%=B`Mtp4h%h|- z{1qaCaq1#)EG&9D4imKqnhHi5bToV8sQv8-LH^Zj&>9dI#E`YC_%{MD6S>7g2jylu za?@r~Oxi5WU@-b~Ans>pKouHwjDEf5u{i8#Vz)R9d%q5A@FJ!o(Jt~5oQ_8Qag1L4 zt$0%F#?3kmNDgSMfV1XTnGsUvQuJ(&45k>wEWSH{SzxeHgU6ORyQYXGoOL?2JcWg) zXvKlXnxLm!(M$vy>uj83zv6NiKid9f@;}`HbR9zwUY!%}p6nzDwo2x+vU?AN3R@yC z^ng+miIEWlEfdH5q_GC=KVdLh`TW7YtQ|5uRqu>8JX0o-9220@Q-snCT5%sEv8jqV zAvFWbOu>ae1^C}I$a@TE`iwm^G@Y2;C;nh|)Yr9(D3atcaxhHM9yn`3Nh~acyAmEu zJ#V$&#zpiZjDsu01?V2VUXsiiZ@dT~-Y&5kATJgKl%$<#< z_HHzD6SU$9KFV`%93Cy-1=gB^6~9RwqmGjbiW+quzN5Nw(JnDsj$-nAU82xYNy5MV z#eKY=;D`fe38?H)FIEiY_>1#Ah~4YrkHTP7pxX_?sS&+8@?8+N;45`dP zPY}!2xYQ@zlu$rqM5}-)kSkr(6h{0Jcoga94|PT=32HC1{ON!$81WZ8QAf*OmII6_ z4O-6+4Rm^9uDU#+-T zj-ytt2;9kYZFto?Rj=1Nb-vb-?dvPd7$Tt-74c8P!OB{D7T`MwjiqSL3vh67CRCFc zKCMTc0kBeLMpw-EXULDXM0l05gDT)45>{)W$M zH4Ktj|DqV}2uc5nRAbP((Z&%QDFPbS(Rv}Ee1lAj<-aVDjd-@flT}g{Frl#?K@VA- zCRh$6k&wwi%MUWij2P6>KG!qHOv`{uCoCz2V~m(hdI+FpVmO)OSM5|SXajn*g(h1$ zW;W?~mpW+{QK=9-dSW^WN-G~oG?0qvj#8L*K|?{nH`9vMuQY?kzB#}G=9_?HW~Mcp zM5d`|m}6uZhO>#rE$Hzo6Y9-_Lej{rL|$on6M>*lc8~V9u75N8PKGn3g%4EHP;NI*^plHfT7f~*EGOX|6%~X3aWg?GTsT!HY_A_D~3<@@ft+|4b;u+)n@ymTkPXGZx=oLl(&D6k%5h1 zJH67s9+yT^+u^UQ#p(9^Zu~qQF+xAEch&baa5`By-$2<;jgC_FYj9d^)+^ti2&@mX5Rq)-*sLx@yDRRWSV>+)Ug^=x&!0bYlaB$d zX64|(ui!9xui&uc6xN+;xn2oJ6_q;pa*+vtwa8h-fU`5NoC*uWJD__Y9s)ShMNRDy zWmq2~RtvMF(sW$zon`<{WB^Q;Lc5e|nl{sPrXcy}pxQA;b|w+2;|X3{^|)X;9uIQy zua_Q7%7?Yxet1=deoRkts8pxOT(?OQHvL7^63In4Lu(ikw9t(yn_|B1N06mKqAMHBv5K>%Yif8fuxatRDsW!|3!rWp zb82dS5B8hEfV7!LbR#}M_k01-Ma%Ufg?4O}1JZ2HJBr*FmZ$lwVlm)st|y=s1hQYO zZUI!VLn}eEHc|u!SQ0JxC_HRmq|V?M^fw!pF@Z8uiej%jN3n=?Oas zAPEfQ1Z6{&i4^@jbZ4 zEW;m3V!OK5nShH@;9UGSdj*Hy{2V{N%+4u%4es_n#8>OZCXtp^r_@*Yp3}DWJC*G5 z^~^~hwHBr|I_8j5rlw%OJ+x=_o^)jbhEsKFATwne9rg*#D~!TO^z7I9STQSpB7QrV zdQbUYV2KnM5l*{)yO@`+c4|l$o4*jf_-hOmo;yDdY_b}49@w8h@J|gFx)(h-QS>43 z=EfkKsV_4jqAYaoIK8KYSvS5`Ouzvql9Mu1;em)}#Nxtp5RSiC8E5+b(sw{(cI4fd zWuA$@MOW1*XxstG$+jI~s?reF8iowL?*$!bn>*~D836A6rZ;Sq$4-kYi3M7IKn{;u z3KNs06h^jLhDj7<43c|%!q&&S0I2iW6joMV1!he^)D!iU#UoW$0Fnu%hz&=yKTczr zJ#4{it<8j!rJ&LjRryMvk68H+f0(yhN-O}XVLF-Aj|D0insKRfQkrq2S3qy*c0V7@ zoieqfl_O^TQG4jf9$`4gi8PwX_`Vt$9bE#ZUt+66xw;K^#e4LX{yb`~uQspGTp_7Y zoCVW9+Cfn@F3T|2dJ_8f_U3lIT*b>+qMGrTPzErKm$8=4E4B{OU%~Lmp7FY$l^*rN*ZvGvLA4^LS||h zVFeDO8aV6Ju)K*;79eRtqJgRlYEgx?gdnMMD>$}bT2dw23OHI42ZNP%sp0z8qL>PP zW!V8P1x+nL)E>1xEZN3<4nKf?`RRk{Z@EDm{y)b3oz5zAiXsI%UC8>L;MD;>SE1EFHjaxR%0| zUR~m>F7ZhN%cs^HP89t>5Mjoa;RVy=k3xKyVb}VB5@_=y9GL1{Ei7t47aao1I8Q)U z=EQ1!%>nY#F&So>d_}#U8WHNj?3jqc$Z1^VA6n?epCkslX_;xH!5@lrz={xL zu+~WTwEZMN}fOoARakOZotK}*l6T`}KyWc*)JT0%6pFTar!B#Vn20?d6+(GSts!OO^ zonk8=b!zPr?}Pv?wJZX}PbFE)kR|I&EvcUsox(OpAQ)OeQA8low80MfDB%Br1uznE zvasWhR31AA&;~N35xkIe@+B1R0M?wHA|*$t>vNq8m~0Y~X#}7;aXhMuNS^Bgtq_k# zF(8)l9UW+$M9Zfv>Ho0C2!TcmC_7+q6>h4p;usf=>Z8h6y22;3G06FMp$-&MIEcej zTKn7E8)WraN?au)^6Nb#TpuB5z${nGJDo$XSNfnvZ{(m6`9qlh(TT=tcY{E$df`8E z?N0~LahuwpQY)%QMN7&C^^=e7mp|c1fMK>!mNtiDF+;R}K7=}Nw+s#l)YMI@RUAd& zgBtKZTSPgGKx9xvz%D#Woi!gsEsuVl1Q`H_-7N9IJeC*Cfkrpt zp*6TC^25lD8%VRjmgz6L0C~4+G^AP;_0OL_W8v%9uP-kz4-XG_cXv-uPhY-#`NU=E z;Q>Y9V`zkLZ|@KTwty*&cs#2+V!==E9%;YukAg1R@ja3a-M78kFkb26=+mJ$;l%pk z&Th>}L;KR!e~O2w4jzXMqpXN}|B$0OWPWm;8@5Hzg? z*XyktHm(ucj33rvFbefeV53n3u#iStX~(3+EMLKXUQcH*e)J@YcLp(%YNU0*2O>HB@x^}|(JetHYTG<5CP@Q!U#z-L1<7Xp~ z()OfCCM0nTBomEQV3k?LGx1K{S+wE_TJZ#}c!GC?b{0;!p2fRf!BP9~V#gsrwGiV| z2)dP$WumgDA!Tnw*4v;cl8ogORt#p_&T5elT(8Ej$XLWB#QF%3kV7M$#NzIv#V|rh zHdODGUr`sz3Y)K5rah5H;AU(WcYt^VP0Kf3$1MOtFxK!(fX$I9XQ%d!Y2-$)zC9rC zKEhG@A`9Of8+R7kSyb5jlG0o*+U>QU-tRPExU&mk-QlMS3|k;Y#y6ta0YY+a1#-1%B#lD&9%)YpyS`#yvrYS$PcOG>C=vfDluu&`nE+3^5eIz_cmaaz8X zn(oEf1M%BbHAs4?onAb>dR>aCwW-I7kMfI$_V0P<`K@tQnO^*E|Eboc^}TdG`6yi4 z{^!)I*M>)6I_us+hZmbTL5uq=ZI0nlu6q)h;bv&ftY7Logydyyu&I`ZMgdbg){0c7 zVilrP=Jjm}4DQxkqSmYb`~Ui1y1?z?#Z%WhvOx^`nrpx@yr4AuQKP}8P}dEY8bfSj zNJc)`JX2Br*IEikKLVqu$FsP;9;AnJ{Ps}gKg!Of==rVu-uh;F-Ezc@hlWmQRXaVK z6_>`J@z`LR?b(5!1JZz&mVQ)og7#H_280_$$yFTqYK)r!Eo!-J`!0qH7KcHzc-?NE z;=LSPKsTGMX2+f>6te>w%dQCHAEVIaE33wJ8I$%I=K#7uD_x=_I!e?Ij@+C>HG`v^ z8o~1#Ege=;%BG83M`i*k*LY$hT1`*xF^NzQu&Z{1sqh=#`PY0Ij5(zT-GhUGWvmCS z6(&APmv97zquJ}e6hh2!7GY>Bn(1t1R*tjDH^>Sarw6fKYMAcrPk>g%_~?k*k&*?E zkB{afKxzT@ay0DS-5o_VFM+VLa?6lK1{(PmV{{o>>j1h>PfxeEx6og|enl99*l>!v z6(KO_Mn-^A)JdT!!YSjB)FGucIMSyA&xvOkGVlV+T&GOrCzlA*k0a6;oZ9-Qf zL&G9WksT2R21l>pAdJJf`GtQ1=relo_V(uK`HP14?qw0r^G2ZtKZqg6dapaA{6N~{ z&?#U@)NB$cHDbV_Xu#l3pw#0EI@WbfGz6wv-v>r_qmE%O@vj^~vm;ur^fb5yMnC{a zTJqlY>GMn-LDHbH!s>8hpew(oi=|$|ZeXxceR%4bHsQ4DrT{p{W(85rqGw0nbDBeq z0W@{mNl#wrmN^9Ym*rFowdKiELAu`p@T}<4nldm*r^xuNXh2)OGJ*KzvNlq&BTxz5 zEX?&|?dwW=UQAKruYNn13-4Z97zgMB5A5JVsl3k7CAF`K9m+cGd1Aga>NtMyh^Amp zlUlN-_FJu)&UPCW)%KifO;Ka3=*dTW&LHhngV1zK%N(O;pG{_?j?r)b%i`~ix1M|t zJ-?UY?>vB>sz=&3YS3nqrPZL>Cwa%Si7n0`BjGd!VVVvL@^JFl(#4X0YOFqhX8MwP zI)%vrtch>Iah`^~PqFF@=vn9@?;E&dTpZj-KWVURHp!Wm|(Zp*kFGGyCv`Sj`j{`M}GuGi~D+amL?%_Mw%!d+NR*Qy<` zmQm|y$thCTSuo;MBcOKxeU7h+k=a?CWAhw4AjQtHGi?o{$Dc(Cn7Bw6Tv}iHJym+T z71&9!vnXIeS(BznyWOdQL5D-5Q^G?z(>Z}5h!Yu^#{mB z6gf>e8}5W83};hO(EjmA1|XL4j7$-~v#5@WTuoaAWC4T)TClIM*H`QH>iOj>-C7Qyy$*P^lZ|1l!?(6RfE@oC0RtVn2Qc|fjQExxF@a); zn?7h{Jl#GJ+J(&lR}Llv!?h;Duw0LTfaM*bvucH*zQ6)Tgx~fZOl)@IDHl)YlkcHTA(WPC~`4}JjwTjoMDc(Fl93dVG zX`yDo5FUX>@`cI%-00cw9XM9`YJY$B3ff{;`?SeY(;9yPgIxbqk47*4iC{yua9o$S z+owmLz^pqHPOHGQc2o3ZeA+fe%1;75EB*uv=q!5ea86x*1bXpYisdR^!Eru%6@E`c zSa(PdtF1xSs|i~uQg$}%kdis=V2S{U>*%9&>VUe`!e^v7%q+NEk!me&X(UOyCn z=X89fdkE(mGe3REfK-&L-EhILt=F^E4j@j*s~@z(?x zGjaD4VnWgmsl_lfqxa}h9*zc_Xk^4JIVJvje23qRc1rxC@po0>wBKmjvjUrnomT9X zp5^QZ;LK{iiEh1m_G81uEN0~yUZgSRTL|L{$R$R-U6&r zEe!f)HeGWhpI1IuyO-CO<$B4Ariq zDYPY_&BVK9Y@Zm+hd|PI9BBa>rdH-57ywP279$G{Ck5;dRE`0|g!ze-9AU(t6|2@9 zHe$p^O5;%Kqj|T3Lv>A`pP$LzlxLaIb!*rWL~2nAD77veyMu-gjSA4zE%A)&`3pZg z)O#$D+g*HerW-3S4(>^%(Y-MaDT#qEdKdsE>KLeCM49LbjF4g|0e34T7=^i#3vJw6ZrA7~bM|Rx)0Q(hYf=Zu*%cO-<8e{Kq783XA z#vynQAsP_Em4fzSn=n6#5FA67#zb$QWrKItlTenV=U> zj25yQNTYP_uX%wmoCTGxu-FtQie_PJCtw*1gIZre*6U3Q z7D-(2N8u&tjRzIY!CF5LT38db;tBr#186Ijltf@d<2?z~Yg94ebC; zVOmB;2wpET`<*JvR-okvH0}hWMov)FsIy^%EfZPQE;yzkaF<{(FaRv$p%UBQCL@*j z@(ux#mBp}wj8#a1KjCaBgTpcqwq}BqJERzOM>{IA?7|%be1JMM9B0k9BdHM>IZa&!*^Qy%h8Lo8$a`S zuT>6c+N=KB_lLaO!iuaHEG#T9&_f%sm}@<^K(ily(8h!o5gk7duD!Htxw_h|m+P13 zm+eNc;JCTD#iowGi|`19CZnxX(K_oj5CmUP+41sK0iV*AiEK@cC~5G`=#PWf;p+6w z_!~8c)1~L&QoryGXgBQX_%B7zj(r*D_;N^=w63#^xF~-c(q-QgRWzqUrE_3}>PT;^ z$B0);y$axl*kS z8J7;Avy}Zn6lzDR?Svi_-EFoyxuaA^H*ElGGvK|e6^)2UAxUC@nW5Ft3IdiN%&O=F zVcNtjYN=^y4!a}MhoYf@9YcgEqGFaaVv(B4qlqc>5pkyBICVi0VuAZ&!JB?0v7 z>+93glkX9p^%fT$iJ}OB5#%A#AT(l_f`bYcUS3{cLZAYNA_zb5i)9GMfPiTqcH0OB z?ZPtlLg_3hB}D}SKp1M&qimzCGKT}d%2XG?OfY;4P`hRLG!8VixVyV^t=&+r(YJ5k z?(gr(!lyA&r%lkJDG-K_I!v-Y!X}Hnvy>uCsha{|gqi2bWDYn`KL&Vg)G>1C{=$V| zx~T(M*kX)D^QtYqj){uy9r%;x4=trhkZMc>BoQ$GOf=;{V|^Ir!$?P!U{VmbvprP# zq|XJ@S@-vcOGdP!U{et0CkU!hfpki!ra|&SNX=ksx#5CdGA^icT&zKCw1Z)SI3Y4% zagVPTh6RkqnqsmUNWvKDmS$^w%Qse_st>#UQ)p^|qfCKo*D@uf;%OdL7}_RUKA>fJ zIH;Y&eEeZ%2EB-)Xcj%bFx7G+K*(9S^pCp0!a#i!X!$|0Wsb8DRq~y%Ur_0BecnPZ z8izdvE}FzKC~DMs=-K(vxcC(u6_-|WifBU_sivai)EsTB4QF|5l}OF83|eqfw;FkQ z(a$$SB-1wQ`W!b)4ULW$ZY&BvUuAd#)o=Sk=Go9AbMbGCy%zEitT>~T6&fMk7Y;iKZW-)hbDrSbGIwKnzm9`xGW>R|)x=gB2m1T0WU0z+83)L^^sW>T+F)Ui>}u;(t$^=fqHDs;^7q@1bYsQeVg; zW=UV9oZWgG(T7zUu6MC_nr+f~I~qZO*DV)r`CTp7%k}E%>E&g+d476*dU@tT?^CVa z72!z6I39X!P6Y@$-5ulsju=rMR3_kLkxHZP{688PT+p?PxYAi91vC-D!L*pQ^kfrAljTLx4R?ViWEp;r|#3tCaRsJQ@yQCX+&@9#<3k0I$( zQPbX}p@k9n5OvS?`1p7`{I(uUgc*2PhKalfp<}bV>{;v}?<{`d060z!OF~59fe*v~ z*hm8VCPsV)NTZI6Op~U4Xb_`GO-+4?jj9oePmOVbB=w~_)DFI%BBvcFqWZ25rKpEh znWYFOHc>?8+qZ8BAZa@kLF3CG25@Eb5sQLov+}4qAC6xK&>sy(H7VWq8ZT5~d!rV< zzS2h#UUg$56vL7tI(ZK67Y_y?+NlZ~%&Ei_8br(U^G! z2g?pAOd6Ie1H)+%ANtnyuwq(qBl~3}K(=y{uHDze>C!2xqn@t)f)p^3@sBXFlP;1N z*{Ly9aDi>qdFYrq!a4OFMO9R$oFj}3`huS5SF`bZ@to;y7FD-nrfa{4bNp7kC;q<@ zf7=1Hb!(bntznw6iOHRxw@tL2H+cv!&L9wAmt!rrEU5`ZNU@y8qoAEX8ubRI(Z>hS z=;}F~w~#JC?*O{WB(x(NCj3Z%IyUMUI~{+ZLm~uAHLLY9yc0OSNt;14auT!lXOY&_ z*cW0HiK-V5U(n0+I~|Qpwz;G*f!AUO1`V-V>k_ruaI2t=_-d&=H1d?{qNR}9Ns7Z$ zX?+6PI6krgs31uSw!`r^0_NEM-JO079AP3P^+1JBoCpB2@F7rfkxb74nMMsjrBOc& zAMV1n_zNQcYw&Ru8F#Mne*3mC9Xu7)%lCEAo9oFB!bi3L_Z>j9o-pf&185XId6izr z0kqD|7V!?~)lLV{JLY`5 zsm*o(5X3+Qb$yRxQ<%^`G`CNSg&(~GmvH4&4cpG|KpYS#RMA75lX_!g6>|uNlvRf; zFh5f(I%`ZhAhT&1m~e_#@@=7}S(K=pN?YDUf-EwXCUw1_y;D-F4!b5=)#t@T3ymav zXd08%&vpR106su~PSoPO*`Nzxk_FhQ@(>7P3K?jRD0J=4J4^(Sgi~p!sCcxHMIM6G zMAnF`WfE20sR3=|yr@jz_<_}vz)8(kj5uTgdsV_S$Pyt%1W7xED7k+MNL^Gw>)ogbgy4-I_m^py_tD@GJA(=$UF`*iNC_9O+!|m{7^-!%>`D*6~ z+Ojq=%R5c^iPQFs!kHK;CwlR8qMU&&T<^B8FYI!mBToKps}1exmIO2{srf8I(Dv@s z1VyIL#8kd=OeY7z3#l>Hog!oV4pjR+J9)hrq3WJv2dVb&F?w}8qv~h+J>Xcr5y|XD zVz^(@%aj=5w6!VTjDKQqUOor&2)%gDX}5Fmqub$9``7E+|JBHIacH=6g3iO-5zw`I zHA3{RfERZ_Hnu%_e!(0{y?2Deo~aJF&<0w+$R_N<7tVzySY6d;CY)oo);3-meHx=G zH0l_=0f)AJS8$?L7q|kw+89JFnqSjXIPBw_v;)#(4IZ4%p2j)t&;zaZso5=Q3Q{ zJ|ESd=b-vJ-Of|VzcSAE;G^P%}W8kXGfu z;6ifQHH&NCyb0Hfo7dfT_o`P*c}jC3F zt;3=6dzg+2bG!y7QlP(%9dM4{o=hFj=h%4@XBz4Gt^1jCOpV$ziJtw+uju*eeBRw~ zPK1ecU4y*H0>WHtTjl^+@c5ZViwj*J+1IR=>-9aHmuKzwo}XVg``zYMuL5|DLs)%J z;A$fS%!9McH`fk7s0M6eY^NUBLUYzo{UGyp|}B-Zd-po#nmM1%)< z88c1QKpf%)bo#AVA|Me;LdeTI

Aej>UnFehOqGfTW3pRVBm9utgxKd6H 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 u;U1RPbIn@$-`YP$NI!e|> defaultCats{ { "kitteh", QObject::tr("Background Cat (from MultiMC)") }, { "typescript", QObject::tr("You should have used Typescript") }, + { "miside-screenshot", QObject::tr("MiSide screenshot") }, { "rory", QObject::tr("Rory ID 11 (drawn by Ashtaka)") }, { "rory-flat", QObject::tr("Rory ID 11 (flat edition, drawn by Ashtaka)") }, { "teawie", QObject::tr("Teawie (drawn by SympathyTea)") } }; From a6b46da3c8606b894bf32a2a417c939c11efd54e Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 14:17:43 +0300 Subject: [PATCH 176/177] feat: change launcher logo --- program_info/freesmlauncher.ico | Bin 372526 -> 248894 bytes .../org.freesmTeam.freesmlauncher.svg | 77 +++++------------- 2 files changed, 21 insertions(+), 56 deletions(-) diff --git a/program_info/freesmlauncher.ico b/program_info/freesmlauncher.ico index 2f0fa67ff6be7681f76aa8ccbdfedabcef766b72..872f6a5c42408da052589d7b3f70acd84eb1f1d5 100644 GIT binary patch literal 248894 zcmeI534j#Uwf9RxEq(C zahFw5T!I=ES!ADu0R|Xg7^Y_i=-HRvmzlZme{OY6*EHQd-95e3a!U_Y-M6}``p*6J zx#!$-&y}R(@L#PY;oozm-{p6geum@ULFhfHoBTcSR;jhI%x~hRb*`uZ2 zL&ivbAboKx{p}2?_s}sv!TWzbi!pYvrKM#BwcoIj#Of(vH5;!VgM1IMLVOVR$H7-I zunJTe1B)a+h!yfZbm+^F5=blL7)F)%VqjHawiSGqKwgDpLwZ7Z|5(wr34H-gBnLY744==(^(^g4#3pLM>^0DD z=vC00qj?_}3`zqB4kuR6!|?-3eI#T+d%f^CDjJFJhzbJcj56C6p?oG(i&iIR`JO!*O z+|szun~+Q3JMMwKguS$7%NEJ&^&0#yD88Q2YoPC7^m8u-qwp1hHwnz1i2Yy)FEV1hGc(|@L`rlN1KjYOvfB20^NROhQdptNB2zdjN z5=Iq{)4-~l*?)oCf$$ZdK(;LDSrV~{8qh-x^hMl4Kg2Ik3}F9Z!@DDnp&vNt+oeg&3nzy}=R1FB}Qw zDV47?z^cOR5%Bs7q&NId-LU7p3TCy~TFv=P>KKM!jf3wfd-Mg6=OLA;WHQpVGsvpK zY$Z5-0rEfOD<)QnTN1H}8puQq(AcOlKKcwE05J@|0Y5Z8nv}7ZNGx{tz6MxTn6-dY z8lU|QF-xqHO-mv+Q3L6y0U8(WMf1|I|LtX0(EeP=bO^;Tv_VpClSaFThFB$L+aP-( zGa%(N3_>cy`Z$v($i!m<^%$|k!?tyHFBphdi&nA^^jj^ieSfJXn z9dZx!>{-Mtu_~A~CrhdN))cR+^mj?8B0lhR@O2wxGlb6>O*U^`xt>N@RhXr@v|Avz zfz{K=mQ_ot{)XbZ#;*Z+UYeYP0lc0BojMsDt%bxLQ{NT-;`yw`SyheCn z4R=wpMSEwD<$j|+myA9EtPO!If;47=yF~7(GgcL58^P)#$Pn1FCt~03H#S@&6JMxH zH9(A#fDP%Q>sX7_>DhaqRtJRb5H3wzcatdcF-BYQsBB%cxGWf*%Z7`O?t z3F42H2Q8mxFjk3K+BQRO2CF~Cp4+lktCjD~(Q?i6EiW26PU?j?hF<9F_Qt+X_Sl{n zgBc0tzJ_Stw;RuIg8^ApbS(LdzXq?Pu;)Hwil-nEePd&=jJcyy-zz3^-_b=wM;(uN zhCyiiA3${D+ZC+xoa73#O<S|RRgqk8ecyR z`t+iq6S^TjZ~)ph*`&5u+P9I;F$=3+pI_lry|;tYMRvD$fYZ&o5wnVDtHqk{X=qKR zv;X@b`n&KS4Z}K3*`t36?jDC!7>U1lzKa=H_4`|x)7`F9)vPMV6=3vn$S*moPA~Tr z<1^-iB*Wjh7r4wCc(rVk^0Cq}Cxh4P(Wdhu8K3VR4_nDT*9@$BykT{!!l|-v1E&R$ z8|)76$(&iYS8A$pNe;0_Pg)2bH1rDTf`Qi}?uc@cjX|D3zJ}T-*t?S5?)7**qq7?D zCn-F}vUh>gm5^-ojk`ObV=F8TlD|ddSxhCcyswLXue@H<=wE>)irr01E>FF1Yjjps z{-jtqRi9G@UKhY`d|tED4c`;|PtdbsOKuGW=abTWm{F&In_D0Sdf_LX&uL^<$)5zq z)chrKTm)wS>~wig!JhLfnC&{R5u61fhJN)(jSh#Y$9QOMQkqNJd+-Q~H=?x@N3@Y)+5V)Z~+FcEnPc(3YijNl7mL z(>0_|dqLiXm@a-d*}p4BVl_g{Zzxx(d~E}-@1j54i!te&Tw>K^Rqwd(+7f^LI)JFO2`%%7Z9>+V1 ze7rROTiB%;VpL&QkE|wX4tXdqT6j%%>@DE5C-zd4%_}uK(yL>MPm1B~Esw{XkJoQQ z#Qg6Jb4tAGjnxds{HBX#%J=j(a*dx4-xKc-+Yw)!>aG7}S4%(p=`Xo1#ad3sqiu|U zi1AVlFiM>2kyV}hlj7kW8UqV;5XUNXc8k}ic^dK%gV&0DKe z+KAX|BfdjVdX>g#;5Ut@z3ctlI_TK>_|B)1f7tHvV}5M%`o#Sx&VDHINqHJZkWQsJ zF)JaaS$9HDze9Rr)nNXlSbs-oJ&%=$b?RmJf>+9^=x`xcv1>7kG#1kvoRaj*zKZ(1 zG{1DOp4zV2o>ecb8fc6rRz^e5+Y4qV*qn~zvFABsy5cKV=9u;wI*Rfh&4JXLt?ldW z`|5#J6Zn%txs3F>9yaV8u*%m3AUigZjpu5h@tC2be}?wD5F+}#8uB4U`VG+ot2&GM zjl@~9-lsnCLU4Kp*ROHf+`?DeBLlX1XbW{ggXVs&c`SyJNZTaceDSt9&NF|F@Gyq?vJe5Xy$$m?VEyJE7`_sZ*j z(r4({5Ae4)_1cI^+t&p5zK0gS<<2XFCE9mUw1oO@ccj77puNydHFk7 zQBg6M{rgK;Sy>qui^akYA3n?)8XB0(V}|hm06tyR%eZbcok0D_c=4!z^m_J{jQwC`k>Dxm`$H= zT((6=p`SaMO?!AQdvEaywsl)UyAD6M%AwYo0Oq{8_H+s z>p7%TYwSV2I$-h)DQnV9vQ<|_W;NI^=Cgw( z%W$t_Wi{2zW?{y$ZVZgsP?>tAj|dPM&opINcQstI9b8uXzBr z>`ky`uNFGCi`){UB*R8s%kFDuRMw;6c#QU5ysV~zSrPLa?DyMTzDPD{D4U_Li_ix? zllsB54a-?TeP5D`Ayo>8G4B;y_D@q`%Z?ScYy!;o0;5AlOXL-GTT8HEUfx zPByCwv*qRGJQj*#Dk8-lnlzT*nIfhv?#{70NPTCoZos}=PHp;$W zVii8%p4e|l9;51h@oY8-w(P*McQMQjfSxhWxU9^m9LMm`>?hcl|M{Nn+_|Sij8Rv) z4EOm|=~abQWnWoY$r>9Q+s9_jHiw-0yLI-6u?(Ft7;E_k*sDFsX3ffhUd@?xDmdMl z8dihcW=(tqw(MU_VaxWqM2-i%^ZrM~O;Wk~YD$L696gGx@L8kEiw%er5 z?XkPDa+k51u@egyMipQq8JzeQwKMb&Da#Wo4UmESqxcz3i>`mLVQ+ zds2M63Wu@m)6FU|OL2=wj#^nmlg+Tal1`Sk+4I8(m)FzF_Y$jM$bS(Lws;X;Qqs?I$ zW+}d29w$wU9t~yq2>QQ$s1FP-Nrpq3)5B=6Pt5N} zfmjN%Wk=r*TXv#ubS#f$xD2rjcTZ<4K3Rp>`l7Viq|sQ{0;>wMhmRa(^^MKU=G2!h zE5|Z)m`|$aC!NQwV09|#)ht=B-jO*@JL=i22^g2f4BA z$d4!9&j^*+7ut`;OzSGHNq=z_F`G0R(^_Ly(XqT=TwAZnez82~n__n} zVv|N^Ru6?Q`5S=YNvp0>`qO?|hgo{qQr*^moHC zt5sGNW|e+%y5i?MyN?EJQiaJ#`)3em*nRM%89l(~TiRi?W1pCw3;Eh$%ih8IUY>qi zR`Kr+AAckKyKk^foAWeblZIndc~9%CD*fWBYV?cknd=v~+oYY(`HsX;y54^a_G%A| z*Zdefe4=Gmm1oPE@DTE~-HJKx>9J*r(?M5Gz+AOCJpUN6kV*fp!eVE8J+P|i*b2lx z)z&wr)%T=Pn=~5tpMcdL56YQ!GFVux@Sul1&(}8m2G)n?YfFB=m>9(xdF*QB34Hyn z#Vj{Z&JoxdBU&lf6RWb0wXmbss+5n(YTPD`#_DRY3QlKIeBl;7Fxuf6DaLr*w4~dz z#3|*&rm@o1-){(vmCE@6wZdX&&!IO~JLp)9$);j_M+Y`(G*-934@{h%28k_=91}u&v5rcbJ>5sU6=8=qj3Di^PZkr?Vw}p z6W6f`CjmWCfC$6roYxffy%qES-YE^X;BTlb^)Wy^G z^?L5W@ei;8SKW+Q-UV!HAa|fq_*8!nqq3^-T2tGA+}N6p-HpavqGfgH0~4p$KpOSR zUp&u^Ts3UWU!Gv!e7~9J4^+2rBOM!=Rk=T0$*LNBiMD$^ey$O$5~tTeZ1J>ty`DP| zYXm&_#9M58;qHvh15d|qg3(zeUdez%`!$Q$@Lh@1+aON8@)yr@XMxpM-u=wbI+cD4 z%)n|TlIEI-RVThHaZ362J@K@8J)Vm>_3YBAbJ(&^SEoH!Svqv7`W|Lrwc>CUt8Pkp zzE7?E9(ceiarzJ>!F6oXH1?7NpEK#y(Xds&UM=U*R<~`V9h-sG@`@v@s?o0%mQwv3 zw5|H{yZ{DNJE_A3$BW?;3f%)+eoZY{Bt>SrNNpVcFK@jf%Lde@wVtPuI{{wnt1}k7%h!|98+-9SuUS~7B-i-gEJB>Vp-1-O zeP&|y?=LSkyiO&q&BE&8sz$SLO5c+>eJ|d2ugCK#X6gBVeQbEYl9^bow3=#+l{j6d zNA?nV<~J7o+wgG^W@5GCNR65FDsifd9EORo8Ty&GmwjdUI0*BwdWcmVt~L{^#ObQg zHf_Y$*;5{6%Mr7*XZJqC+pOlWSBX`MUD9Np{8apg5U1Z7kxlh?qWHqgZhC02HHP0e)OT$`9#Rv{iz7}CsoS*?k7XiGQXPdWf7xBOb z@&ohv=H_9QI5m83U}E+92VZ2{ar ziQA)fu2lGOw0KS8)bM${MITtOYJglX#Hr!)cn_F3gWWpg6;tFzGnKt+F1_jot3Gvq z(TK;y>Yr!6Vv4+If>lHMm8ehd1)D8K!D@Qusl^-55byarckX3-_UvPol}DJv z;baXB4XmP~!tna_P-^f~8S`egy-nXv={M9h8*V}>3NH0j=+H5v<`0!yv=~xr7N}QS?7Gegw`H_FHg6&1Ro)0J6 zr2E0!QRa5LBVif!eV@cp6A&dJXi)@*q9VX)%fb)mbEYwu}YkpVouzR59x1C9NDDR z)isRzt*P7;TlUD2BRcCB6RS;T@B!0zBu-5+*ZjKsDKA8!F7iU`-MgP1Jz52u)RRg? zkGZzr@7I|vYbsXj!K!I;xNOpJ4i~aXcVn#`vPtcB2c!OJrZ&ZvEiW(ExSll?tHh}( za-&hcB`vdBT54g9jZG29Nz=_O{Z_bKE{%`NmZJ~cY?eMSacYX3qdC)_W$QQPYc7}f z{{06LTU4tVMniuSv~A0pidEv&6uG=7-1RhD`$Mi~SS>C-z-?0MZ|Y$qTeh*W5%I=a z8kemwlV05eR!y-+#<)A4V&ARZno(AF?%cy|((>}di2HNt0nuZgk>aH4>gt#_Y*|yW zN}QTv?WwVMJjuRYvn6A!QY-`6q)koDn(gl%17?Ib$d;wJsp{(L498MbLa*A)Vy_aX zrdZQ)ZAAl@L}oC~p@UsSZW z-6o~}p&7Sy+Omhrj(}6suu7b+Gy|*j9pC@xo0PE{v`PJDMD&>Ntk|+gj~-2#|4C-m z6geTN??9X`GYhM)z4v+2{lGL%YPD7|k0-V{-^Vm+gTFzxY;$vSO6Is9DzloU|4ZMK zIDO9ytY+oRV$Z#?B5CWyDS61uW|JoR(?WBFXk0d#w(Oy@YBRC=J~(~D9IVb{kH50C z%eE?wlO8%$&c{j3tuu0SND?+wxeSLkL{bEz)Z=v5L;&i?#Sk0Nq zXs(SsFD`nneZ?lFJY>QqO%Jc}+p^_ozowbHN~{v64?$>M8$-t~Wr0B{fI#u-u`GMe+9 z>O5p!Z_Vbo0>x598<#a%%#sJJPD2~M4Py9w-oz@&i*J5{cnG-*1`AWp5y&9n3 z&T#8!9V)9blV8aRR*BQ85S!ALjl3U-e(=Ljz0C>>cXQoZUS65;JY?FVLz_>etfQrj z%a&T|&BUq=tP-c!Kn$NFn0|w39oB2_c@Ar3>`6&(Y;Cr3<2)7Fvef@MYDEl0nW_9r zjbN2Hy$WLJ9Kl)ObTH)lKQCY(J^2x9+FHt3i#g}P=$%}ezEoN1W<`7KZ2v*i%(1Bh ztHkLrNEO6zeqdsh{J&#w`a65=vG-Z&o9mc+X&&=@Sit;+m5liXuXH2M)N} z*;E)+?}_1^MRvCDfFb+EvD?G?XoSptRgYoSp{Rr8ia;M*jqx^zldj#da9k;B6FLV1NXel z*1x!lHFsi@w)b~q2I>#3s-ZSw8J=QEX;NF9MZ9$?_~aBD{J$J{4L4&U7_*Pni?P5vnM%r zX(9~k$d-M(q|DJ{$mChw!Ra$vV^y(9AG-Gyw&A5OnSJrL)b)2`VVQI+bh&rUe%5-l znX$|*JDv-Ojn=}?iL(ie{*iQ(qYrCnQg#@^y43FE88>K&P8mHbB3=gqn0N%qdXCG7A!8)A!P2xTc0+)c_X+r(do72rI z^>;7BIO+8JUS(Te{)#!!zf8N|s4J{0pQV2B%0fPONA!zjV9CE*QQ_wO-AwV8jQeW9 zmbD?ia0G<+fzc1{15VR6*M=A!f^pK@?|hzp`OK%R?t>JLlPWx=X;1xP?k{%xLbQxI zUQ&NI-Wc9wFqO({D7Ngr%*>ZPf|#Yg5DBsSBhID$Cf)iZd;f1s*^zfQ zq-UHoO`P)B3&mfI`8zEY4UGAWwU&9LUmS{OXlU?bK8#Z{{@rBryFD}GvL*0Op9hf! zPMj@aT_%b%+?gs?6`OPvY|aKOv<6u`f$npc`^Ref{ibtTCDK^@(zmsn1cr z829G3?9Rii&F;~)hHdq>F?+d>)#S>I5~tQ5oa`uM@3zF|uqo|dZ+mXb(j51al+AHp zj9B0kAe`0ylV%gY7S~x2&MEyfVDb$3m}ZhM zcoig~&8m!(Qf};59(|AJ#^!m*j66=-6@8iLXK9@0W6b5*RLWYbh}jg6&8ivQnwTC{ zbE+JdV+^OzgnlN4(a?PYw(OTB1^SVyZEoSqlTDnUDF62@64J$eHAyB|`Y_iEUr z3FpSv8v}ZK-oW^*=gZy9k2t8-24_UyaT|tiDPGr6>0@;}+^h;dpU%cd_>+xJSUV^dfIiWa*zd9@4V{;Y19pWoAUQZ-tg`G=XZ>3QZY^{ z#|LV%Z?D8bVeTyHT7PjBpC{1j^mBi%^RS;a>_I=5{6*x`O@Tcc3#)Wa8I9oxKT}j* zsSgksm-V4vJoNy^RZA<5WtEuCef4W;?F(O=+VH`aMerN7X|jFlO$Vmyd8vPldwDQU z+x%T6##|5wm;oIciCu~nE;d=LaH9Qh^ov&_kMU1;6$R~7MW-tJl?zr#MGIF;{$&Mc z;qSguu&QC58tFFx%r>sFK#z89d^8esU3tI4q_M(rGP}8;p!tFwJ8crymQ~OUy9b{V ziDzm4+1P&~c-0xN3acBm$0~7tK#bu;>jx937v<;Mr5!u!!}1yWrot=sq+gdnS|Q1a z%@Nm0Z9Qt7Rf-iZGI^|U7(LsD_r3+E7ZRt1g$7$(iLy$c^DQrs>`S*ozvfD=W#o6t?FClJM=bipTC}}&!Yc8)-<*CX zKN$T6Y!2SO-63t?-VA9aYT!3ZXRK1J@NQ$r3fsWud(fZ1 zqdqU`Q(`rpn`;^D*X7%|pBVGadqQpjtHpxX4D+fpR!O&7j5{ZNAGo{~oc@UTr2cNI z`n<8Q4@ME=B7+|nL9!4Z*j?%GX0p$#uo-D@U!E^H_&6;2oeE9?tAB-v_=$A! zs$*7lJSV*rjNXT_QXYRqf+7o-ur;!*9{S86B3B)@Ua9h^1ERW)f?}L;IUX%2DWe`>= zR#-#pR~-hM&p^(}&zIxviB+>~9{7t%nim(4J$n&YeHS8pPhIUV7=%^Qtr}Rr$_FOD zhCP}E=|+6++EtsDI9@IN4!A$qCV4;1ms(fsf(=Wt#d+j=qWQ785Ro$`QDzOqYKG^e z7lX}dVDxl3hF6YhFq1wF{k`xnKO%V-ZDCOy3e&u`*TLrn-+jk;oPA!N&2+jnlvDL!BPW;^-KG9as@ zTMwpY{VMA3z6;4}ZT(L>qr|G%;;R8Uk0Ool9>!$z2jloNh)XaVfmwsHn&dg@ zE#NaBGOnPYiRWq1Qw(o>6s7lUIiDiW%SQPqXg&bVYZv|EaD9J+vP!y@Vuh2iPWk~b zO8wolv2WL<>21-*znfQ{AB%ai+ez2{3i1?0^o!NZ8kp5Cu3ts{U5c~spPTCqFlwH7 zhD`iA_?LepH7_aQ@x{(1`REtt4gs$;PgeAciCF`)O1d?H^{XhJ;Y;Yz;gJ6#T^jEi z6q#t}M!6@&C^jtKg#IwC3qU^OZR9V$9zt_?%)J(+!C56X|Q?zh7EE& z!;T$|x|#p27yc4?PVce;i3EHij-s#|<^)`f;}0O_i!U|-tE5{atY1az!+Zo8j`=U# zzborfF$R+eSE>9Au_}-AV2o$Uwjbd&#TT!Km}fl?ldwvDCe@sDnyA^+m{0Lo;h0R_mZ!UqGzz@5(p1xE|fO(PgOo40_@%8PDp*{2lkA z9Xx+A*3P0ecm_epmTfd7v&Lt&89Mb-$d%PU*pDyHwMifEsTaQ8WWb_jtM}{lP9-H$c|9HPFh$BP6p1$XCql zjIT=>SR>$6uzC|@6T}$)C*!f&21fTn9^Kf{ z+@R`n z%V(@lR*BJ75b_(HEHmnYE*17@m}V;8Qq_PL{bHJbM{9dv-xD#5!@=yQ5be+9(HE;e z@c2DsYLHQ(M^#Nx9L87!#4BeOaZu%3y_kq#-z~~v)4e%L> zzHW@IQk)j42HY6u0jFHhFGl}3_jGW2D`Ydor#WV|&no$LABUW8UDF0e(bwICaTpRY zP8z8hiudEF0jzT;)xN!jSe0BK7E=HCOmI34vK^wGHF>njsxtoa1Q`8;b*-}-_K0JE zKK((Azr@iD#i?=B0I}*>!gG#Gt)K28eS0ogoetRp$^1Nb?Xh|YTt16FZje#x?+U+B z9IZ~A+LaohdG1`$KW6h8`HpF9b{?b*k~v#eJFHfL$CtrqKkFKo7=P(XV-ufEN)3>n zl?BXF&bB3a7l760A(a_nHuJ1DfYJ9L*@!PXf%GTE8Cf^lggu&+7AG#!)f!OzPvBE( z`EWO_@zD#%FGG%`mD$X(O7mYnMjYT3h^Oz#8704w=<9a1X^GFLs0KX9+vbISC0~^5 z!|lkknAZoJ{BpB6m^Ayh>rUrb7dum;g&*O|eWX~?k>w&)U#o+ZNNOHz{lFO<1gP2WOP#k&<6mFdF8sEZ#Cw4LFzQN==_oP8sAg#yD-u;_cnxH>TWeG(Ni< zl6V|ca#$rs4?rju@V_xW+C9i%+^}`hY#VVjb~IYid0J z*$9b$jzHH~^?=E3klB#mTE7d-^QQ4pvPVU{ZcKkyagwoXz`X>vED3Zi&Fyh5$vXq{ zdM4ua7m#{LY_U*@v1$XGlpF9`$Sdx0r2@->)L=VD&~)xuYrkgoYWd{Ez6bcOSVY%rSg0{ z--pn-OSjS5?n5AtLB5AjOq4vAHax41U^5r;G~`M!`V;GVzdXMiHmG&APsAA|^{*x_ zX7(B&pD~xE+h~pe*0V&u)FpX8K_58_tUd%;fw?~=jjJqn>jqafxcmX~6y$1*x14ER zZ||nqpga$@hy&DBlVa-4BH{0^+CpFBo1LR7W+CNmC_g1ic@xTyi&DN0<7e zLznM(gO24MUfw<8=W#Y|5zFWCVktX#f<=9{eESX$(4o9V{50o0#YZm)g-b@@76Ik2@qfJJqGr4ak}2T+wOwL_=1 zw*ghT{KuhENoxNSS%TNcVQ^EvAl_6C=LJip_CHauTz&iC0|d*}w+}u*upCF~EpS)7 z8#tP$E^U8+V0p)4rH0zegMS?P#6TNqFYowx?GM;qj)RVy{8)HfKA6|BRCz$9ykqUq zx$>V#DG$B9@&HPCuK6M<*@qgqEh4?@6hQf7`OC{;1&dcXT`~10*l$+r)dhyIB}$45f{gy)1@ zKlA~!L(B1`>P;>V-aq641COUF?^r`}?F8!|mz$@)eBkz~&(mRW3*25^?g^HL9UoIa zfO32F=hZb7wtQXi26MyQU-dH~w;eji5@;WE9Q+dn{x~7!!3Su+eTUBnDVs}|2S9E0IJ)E nl*=_RH{$hq4XD0-==B-hKz;ep>(ig$9M$EIDew5a{QCb3j>xFk literal 372526 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

ol&v!0pbHjkGtsBcQlsT;+OpWK_) z{js~=4ZB`tY*(=Te=_Qy#HBZc*ovEZhU@D54##lUGP2>G+3}O>q-j-TEi}SMZhRWp zwa-i%9FX(i#kA`iv2%if8)ya zhiBIQ1IC{ieRvg)O;!}*nlcH7n42P$@2*f|`3+`jFSv!r6u>dC$vFPi7RR`L;Z^DN zidVkZOM(s(mV86LC2^3rjB#Szq#j0whhD?OTn}?nqFuZ9e;vm_{)kaH^?UQ};Qzz< z!dtPdY{GJ#99!q~N_OZIhI?rJ8pjA$;&;Ze7*f`n>ji$v^*N*aF5hnm`n4@$+WQ8F zWBB{z8}`9`zxu-nrd+{0Hsd4YjC4bb7BJWGq<;I~Q++j6S1aM@lgB zJ#3%W_tB~^k_Iqw5MRhHxLz=`S7KEBSo7R6Qtn+odj^gyOMzX6-mrdoOmn%Kqo2Wi zkG{BznKCXk$#NeZcDcE3Cwt$U)CJ7<=!?9P`TnESg%)Ka`}+;(56kq~&fhj=gT3!< zm3wnaADH{#u&i6oe9xwTNXmSuu(7|z-G`51`sF9)@6lG9=_m3d<(A*H8SvqO#gJaQ z10J({D<4-i!on@s2ekytlV;!BCiKxZ%kTa1Q$hysU1+fuA@Obe{OTdt^7#Xp5Puco z(q6RK^wo7uaR+M#G4zu&+VDZP{CpU@G-|BbkMKckMngFJTjn~laMk}qd$S4;^Ll{H z_h{1^<7YknEM_j)%)d+=*)P!|Key3Ez&q_ hz~1A>IL2Q2ikDaZOI}`vHntD)j)Wm$$v5QN{|~PZ9Vq|+ diff --git a/program_info/org.freesmTeam.freesmlauncher.svg b/program_info/org.freesmTeam.freesmlauncher.svg index 949cabdf3..9885f1962 100644 --- a/program_info/org.freesmTeam.freesmlauncher.svg +++ b/program_info/org.freesmTeam.freesmlauncher.svg @@ -1,57 +1,22 @@ - - - - Freesm Launcher Logo - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - Freesm Launcher Logo - 19/10/2022 - - - Freesm Launcher - - - - - NotWindstone, s0me1newithhand7s - - - https://github.com/FreesmTeam/FreesmLauncher - - - Freesm Launcher - - - - - - - - - - - - - - - + + + + + + + + \ No newline at end of file From 40073049e8ee8a6320e995a6708941a863467412 Mon Sep 17 00:00:00 2001 From: windstone-aristotle-yellow Date: Mon, 30 Dec 2024 14:38:01 +0300 Subject: [PATCH 177/177] feat: fix launcher logos --- program_info/freesmlauncher.ico | Bin 248894 -> 11013 bytes .../org.freesmTeam.freesmlauncher.svg | 35 +++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/program_info/freesmlauncher.ico b/program_info/freesmlauncher.ico index 872f6a5c42408da052589d7b3f70acd84eb1f1d5..573e943fcc83325ebfd6aba242693d6c66f9ba6c 100644 GIT binary patch literal 11013 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 diff --git a/program_info/org.freesmTeam.freesmlauncher.svg b/program_info/org.freesmTeam.freesmlauncher.svg index 9885f1962..245cc9703 100644 --- a/program_info/org.freesmTeam.freesmlauncher.svg +++ b/program_info/org.freesmTeam.freesmlauncher.svg @@ -1,22 +1,23 @@ - - - - - - - - - - - - + + Prism Launcher Logo + + + + + + + + + + + - - - + + + - + - + \ No newline at end of file

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