From b127127d897c5861deb841233528501977703538 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 00:34:25 +0200 Subject: [PATCH 1/9] Add native Minecraft launcher, profiles, and virtual worlds --- README.md | 1 + docs/native-launcher.md | 160 ++++++ .../java/com/osiris/autoplug/client/Main.java | 35 +- .../autoplug/client/browser/SavedServer.java | 10 + .../client/browser/ServerAddress.java | 44 ++ .../client/browser/ServerBrowserService.java | 73 +++ .../autoplug/client/browser/ServerStatus.java | 12 + .../client/browser/VanillaServersReader.java | 96 ++++ .../client/configs/GeneralConfig.java | 1 + .../autoplug/client/console/Commands.java | 16 +- .../client/launcher/AccountStore.java | 80 +++ .../client/launcher/JavaRuntimeManager.java | 195 +++++++ .../client/launcher/LaunchRequest.java | 44 ++ .../client/launcher/LauncherFiles.java | 96 ++++ .../client/launcher/LoaderInstaller.java | 280 +++++++++ .../launcher/MicrosoftAccountService.java | 156 +++++ .../client/launcher/MinecraftAccount.java | 46 ++ .../client/launcher/MinecraftLauncher.java | 424 ++++++++++++++ .../client/launcher/PreparedLaunch.java | 40 ++ .../client/profiles/ArtifactCache.java | 59 ++ .../client/profiles/CollectionEntry.java | 8 + .../autoplug/client/profiles/JsonFiles.java | 31 + .../client/profiles/LauncherCommands.java | 136 +++++ .../client/profiles/LauncherEntry.java | 28 + .../client/profiles/LauncherServices.java | 223 ++++++++ .../autoplug/client/profiles/Profile.java | 23 + .../client/profiles/ProfileCollection.java | 48 ++ .../client/profiles/ProfileLease.java | 35 ++ .../client/profiles/ProfileStore.java | 102 ++++ .../autoplug/client/profiles/ProfileType.java | 8 + .../client/profiles/ProfileUpdates.java | 213 +++++++ .../tasks/updater/mods/CurseForgeAPI.java | 50 +- .../updater/mods/InstalledModLoader.java | 10 +- .../tasks/updater/mods/ModrinthAPI.java | 121 ++++ .../tasks/updater/plugins/ResourceFinder.java | 10 + .../tasks/updater/search/SearchResult.java | 5 + .../autoplug/client/ui/DashboardPanel.java | 533 ++++++++++++++++++ .../autoplug/client/ui/LauncherActions.java | 66 +++ .../osiris/autoplug/client/ui/MainWindow.java | 202 +++---- .../client/ui/ServerConsolePanel.java | 160 +++--- .../autoplug/client/utils/MineStat.java | 95 ++-- .../client/worlds/ClientLauncher.java | 8 + .../autoplug/client/worlds/ManagedServer.java | 47 ++ .../worlds/MinecraftServerInstaller.java | 198 +++++++ .../client/worlds/ServerInstaller.java | 9 + .../client/worlds/ServerInstallerWorker.java | 15 + .../autoplug/client/worlds/ServerLaunch.java | 17 + .../autoplug/client/worlds/ShareResult.java | 10 + .../client/worlds/SharingService.java | 12 + .../client/worlds/UpnpSharingService.java | 272 +++++++++ .../autoplug/client/worlds/VirtualWorld.java | 20 + .../autoplug/client/worlds/WorldService.java | 186 ++++++ .../autoplug/client/worlds/WorldSession.java | 108 ++++ .../autoplug/client/worlds/WorldStore.java | 109 ++++ .../client/browser/MineStatJsonTest.java | 67 +++ .../client/browser/ServerBrowserTest.java | 84 +++ .../launcher/JavaRuntimeManagerTest.java | 42 ++ .../launcher/MicrosoftAccountServiceTest.java | 110 ++++ .../launcher/MinecraftLauncherTest.java | 180 ++++++ .../client/launcher/OfflineClientFixture.java | 9 + .../client/profiles/LauncherCommandsTest.java | 63 +++ .../client/profiles/ProfileStoreTest.java | 60 ++ .../client/profiles/ProfileUpdatesTest.java | 96 ++++ .../profiles/ProviderCompatibilityTest.java | 32 ++ .../mods/ModrinthArtifactIdentityTest.java | 108 ++++ .../client/ui/DashboardPanelTest.java | 164 ++++++ .../worlds/MinecraftServerInstallerTest.java | 61 ++ .../client/worlds/UpnpSharingServiceTest.java | 109 ++++ .../client/worlds/WorldFixtureProcess.java | 51 ++ .../client/worlds/WorldServiceTest.java | 180 ++++++ .../client/worlds/WorldStoreTest.java | 31 + src/test/resources/launcher/1.16.5.json | 1 + src/test/resources/launcher/1.17.1.json | 1 + src/test/resources/launcher/1.20.1.json | 1 + src/test/resources/launcher/1.21.1.json | 1 + .../resources/launcher/fabric-1.21.1.json | 1 + .../resources/launcher/neoforge-1.21.1.json | 1 + src/test/resources/launcher/quilt-1.20.1.json | 69 +++ 78 files changed, 6209 insertions(+), 299 deletions(-) create mode 100644 docs/native-launcher.md create mode 100644 src/main/java/com/osiris/autoplug/client/browser/SavedServer.java create mode 100644 src/main/java/com/osiris/autoplug/client/browser/ServerAddress.java create mode 100644 src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java create mode 100644 src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java create mode 100644 src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/AccountStore.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/JavaRuntimeManager.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/MicrosoftAccountService.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/MinecraftAccount.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ArtifactCache.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/CollectionEntry.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/JsonFiles.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/LauncherEntry.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/Profile.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ProfileCollection.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ProfileLease.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ProfileType.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java create mode 100644 src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java create mode 100644 src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ClientLauncher.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/MinecraftServerInstaller.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ServerInstaller.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ServerInstallerWorker.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/ShareResult.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/SharingService.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/UpnpSharingService.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/VirtualWorld.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/WorldService.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/WorldSession.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java create mode 100644 src/test/java/com/osiris/autoplug/client/browser/MineStatJsonTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/browser/ServerBrowserTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/JavaRuntimeManagerTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/MicrosoftAccountServiceTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/OfflineClientFixture.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/ProfileStoreTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/ProfileUpdatesTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/ProviderCompatibilityTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthArtifactIdentityTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/MinecraftServerInstallerTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/UpnpSharingServiceTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/WorldStoreTest.java create mode 100644 src/test/resources/launcher/1.16.5.json create mode 100644 src/test/resources/launcher/1.17.1.json create mode 100644 src/test/resources/launcher/1.20.1.json create mode 100644 src/test/resources/launcher/1.21.1.json create mode 100644 src/test/resources/launcher/fabric-1.21.1.json create mode 100644 src/test/resources/launcher/neoforge-1.21.1.json create mode 100644 src/test/resources/launcher/quilt-1.20.1.json diff --git a/README.md b/README.md index 3f8bad59..ba75593f 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ support. - Automated, modularized backup creation - Fast, asynchronous, multithreaded task execution - Have synchronized (shared) folders +- Native Minecraft client profiles, server browser and local virtual worlds — see the [launcher guide](./docs/native-launcher.md). - Web-Panel for starting, stopping restarting the server and viewing the last updating results summaries Premium [AutoPlug-Web](https://autoplug.one) features: diff --git a/docs/native-launcher.md b/docs/native-launcher.md new file mode 100644 index 00000000..41cf1081 --- /dev/null +++ b/docs/native-launcher.md @@ -0,0 +1,160 @@ +# Native Minecraft launcher, profiles and virtual worlds + +AutoPlug's desktop dashboard includes **Server Browser**, **Virtual Worlds**, **Profiles**, **Server Manager** and **Settings**. The launcher downloads Minecraft metadata, libraries, assets and loader components directly; it does not embed another launcher. The existing server wrapper and updater commands remain available. + +AutoPlug targets Java 9 or later. Minecraft runs in a separate JVM selected from its version metadata. Settings supports Java 8, 17 and 21 executable overrides and additional `major=path` entries. If no matching runtime is configured or already installed, AutoPlug uses its Adoptium provider to download one. Runtime availability depends on the operating system and architecture. + +## Desktop workflow + +Enable the existing system-tray option in AutoPlug's general configuration and click the tray icon to open the dashboard. Closing the window hides it; it does not stop AutoPlug or its running worlds. When the operating system has no system tray, the dashboard opens as a normal window. + +1. In **Profiles**, create a client profile with type `MODS`, a Minecraft version and a loader. A vanilla client also uses the `MODS` type, with loader `VANILLA` and an empty collection. +2. Add mod or plugin JARs to the profile's collection directory, available through **Open folder**, or use `.profiles add` below. Provider identities in `collection.json` allow version-aware update checks; `.profiles add --modrinth` records a Modrinth project ID or slug. +3. In **Settings**, select an offline player name or sign in with Microsoft. Configure runtime overrides only if automatic selection is unsuitable. +4. Use **Launch client**, or select a server in **Server Browser** and choose a compatible client profile. The browser shows Minecraft version, MOTD, player count and latency through AutoPlug's existing status ping. A server's reported version is not proof that every installed mod will be compatible; review the selected loader and collection. + +The browser imports favorites from the standard Minecraft `servers.dat` when the dashboard starts. Importing reads the vanilla file and keeps AutoPlug favorites separately; it does not rewrite the vanilla file. Favorites can also be added through the dashboard or CLI. + +## Profiles and migration + +| Type | Purpose | Collection folder | +| --- | --- | --- | +| `MODS` | Native Minecraft client, vanilla or modded | `mods/` | +| `PLUGINS` | Dedicated server with plugins | `plugins/` | +| `MODS_SERVER` | Dedicated server with mods, or vanilla server | `mods/` | + +Client loaders are `VANILLA`, `FABRIC`, `QUILT`, `FORGE` and `NEOFORGE`. Virtual-world server installation supports vanilla, Fabric, Quilt, Forge and NeoForge, and plugin servers such as Paper, Spigot and Purpur through AutoPlug's existing server updater. Bukkit selects the Spigot build path. Proxy software such as Velocity or BungeeCord cannot host a virtual world. Versions must exist in the selected provider's metadata; Spigot installation additionally runs BuildTools and requires its build prerequisites, including Git. + +Mark reusable packs as **templates**, then clone them before playing. A clone has its own configuration and collection metadata. Changing its game version or loader marks migration as pending. AutoPlug checks the target version, including downgrades, and shows a summary before applying changes. A pending migration cannot be launched. + +**Check** finds compatible releases without downloading or installing them. **Update** applies the reviewed plan. Downloads are staged and verified before installed JARs are replaced. During a confirmed migration, artifacts without a compatible release or sufficiently precise provider identity become `name.jar.disabled`; they are retained for recovery. A provider/network error is reported separately and blocks application rather than being interpreted as incompatibility. Configuration files are preserved. + +Modrinth and CurseForge identities support target-version checks. A generic GitHub, Spigot or custom update URL may not describe game/loader compatibility, so it cannot by itself establish compatibility during migration. The existing provider integrations still handle ordinary updates where applicable. + +Profiles in use are locked against concurrent update, clone or delete operations. Deleting a profile moves it into recoverable trash; profiles referenced by saved worlds must be detached or their worlds removed first. + +## Commands + +Commands can be entered in AutoPlug's interactive console. They can also be passed directly to the executable JAR: + +```text +java -jar AutoPlug-Client.jar .profiles list +``` + +The examples below show the command portion. Replace `PROFILE_ID`, `CLONE_ID`, `SERVER_PROFILE_ID`, `CLIENT_PROFILE_ID`, `WORLD_ID` and `REGISTERED_CLIENT_ID` with actual values. Creation commands print generated IDs. Quote names and file paths containing spaces. + +```text +.profiles list +.profiles list --type mods-server +.profiles create "Fabric base" 1.20.1 FABRIC --type mods --template +.profiles create "Local server" 1.20.1 PAPER --type plugins +.profiles add PROFILE_ID "path/to/example.jar" --modrinth PROJECT_ID_OR_SLUG +.profiles template PROFILE_ID +.profiles template PROFILE_ID --off +.profiles clone PROFILE_ID 1.20.4 --name "Updated pack" --loader FABRIC +.check mods --profile CLONE_ID +.update mods --profile CLONE_ID --yes +.check plugins --profile SERVER_PROFILE_ID +.update plugins --profile SERVER_PROFILE_ID +.profiles delete PROFILE_ID --yes +``` + +Use `mods` for both `MODS` and `MODS_SERVER`, and `plugins` for `PLUGINS`. A CLI update prints a fresh plan. Migration requires `--yes`, which explicitly authorizes the reported replacements and disabling of unresolved artifacts. Clone also accepts `--yes` to apply its migration immediately; omit it when you want to review first. The examples use `--profile` to select the isolated collection explicitly. + +```text +.mc account offline LocalPlayer +.mc launch CLIENT_PROFILE_ID +.mc launch CLIENT_PROFILE_ID --server example.org:25565 +.mc launch CLIENT_PROFILE_ID --server example.org --port 25566 +.mc servers add "My server" example.org:25565 +.mc servers import +.mc servers list +``` + +Server listing imports vanilla favorites and pings each saved server. Direct `.mc launch` selects the supplied profile; the dashboard provides the profile selection and clone/migration workflow. + +## Microsoft accounts + +Microsoft sign-in requires a **registered public application client ID** configured in Settings. The application must support the device authorization flow for personal Microsoft accounts and be permitted to access the Minecraft services it calls. AutoPlug does not ship a borrowed launcher ID or require a client secret. A missing or unapproved application registration cannot be repaired by entering an account password into AutoPlug. + +Choose **Sign in with Microsoft**, then complete the displayed device-code instructions on Microsoft's verification page. AutoPlug exchanges the resulting authorization through Xbox services, checks Minecraft Java Edition entitlement and retrieves the Minecraft profile. Account policy, entitlement and application-registration failures are reported to the user. + +**Remember Microsoft account on this computer** is optional and off by default. When enabled, account and refresh tokens are stored in the launcher's local `accounts.json` with owner-restricted permissions where the filesystem supports them. This is local credential storage, not an encrypted credential vault. Leave it unchecked for an in-memory session. + +```text +.mc account microsoft REGISTERED_CLIENT_ID +.mc account microsoft REGISTERED_CLIENT_ID --remember +``` + +Use the first command in a running AutoPlug console to keep sign-in within that session. A standalone command exits after sign-in, so a later independent JAR invocation needs either a new sign-in or the explicit `--remember` option. Offline names provide a local test identity; they do not authenticate to Microsoft-backed multiplayer servers. + +## Virtual worlds and sharing + +In **Virtual Worlds**, create a world with a server profile and a playable client profile. They must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available. + +Read and accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for the world before launching it. AutoPlug does not silently accept it during profile creation or server installation. The CLI flag below records that explicit choice: + +```text +.mc worlds create "Local world" SERVER_PROFILE_ID CLIENT_PROFILE_ID +.mc worlds launch WORLD_ID --accept-eula +.mc worlds list +.mc worlds share WORLD_ID +.mc worlds stop WORLD_ID +``` + +`--accept-eula` is also supported by `worlds create`. After acceptance is recorded, subsequent launches need no flag. `worlds launch WORLD_ID --share` additionally requests sharing, subject to the settings and account requirements below. + +Launching starts a background dedicated server bound to `127.0.0.1`, waits for Minecraft status readiness, then connects the native client to it. The preferred port from Settings is used when available; an occupied port causes selection of another free loopback port. Closing the client sends the server a graceful `stop`; startup failures and application shutdown also clean up owned processes. + +Sharing requires all of the following: + +- A Microsoft-authenticated world session. Offline worlds use local authentication and remain loopback-only; sign in and relaunch before sharing. +- **Use UPnP when I explicitly share a world** enabled in Settings. This permission is off by default and does not itself start sharing. Turning it off releases existing owned mappings. +- An explicit **Share** action or `--share` launch flag, plus a compatible gateway with a public IPv4 address. + +For sharing, AutoPlug opens a LAN TCP forwarding endpoint to the loopback server and requests a leased UPnP mapping. It reports the external address for friends to use. The Minecraft server itself remains bound to loopback. Closing the world removes the owned forwarding endpoint and mapping; AutoPlug does not overwrite or delete another application's mapping. + +If automatic sharing is unavailable, the local world continues and the result explains the failure. A TCP tunnel can target the displayed `127.0.0.1:port`. Manual router forwarding alone cannot reach a loopback-bound server; it also needs an appropriate LAN forwarding endpoint. AutoPlug does not silently alter firewall rules, and a successful mapping is not proof that every upstream firewall permits the connection. + +Running sessions belong to the AutoPlug process that launched them. Use its dashboard or interactive console for `share` and `stop`; a second standalone JAR invocation cannot control the first process's in-memory sessions. A standalone world launch keeps AutoPlug running until the session ends. Closing only the dashboard window leaves the session running in the tray. + +## Storage and isolation + +The default data root is `~/.autoplug`, where `~` means the operating-system user's home directory. To isolate a test installation, set `-Dautoplug.home=PATH` **before** `-jar` and use the same value for every command. + +| Location under the data root | Contents | +| --- | --- | +| `profiles//` | Profile identity, collection metadata, configuration and mod/plugin collection | +| `worlds//world.json` | World identity, profile references and recorded EULA choice | +| `worlds//server/` | Dedicated server files, world saves and `autoplug-server.log` | +| `cache/` | Shared game downloads, libraries, assets, installer artifacts, content-addressed JARs and runtimes | +| `servers.json` | AutoPlug server favorites | +| `settings.json` | Launcher preferences and account selection | +| `accounts.json` | Credentials only when account persistence is explicitly requested | +| `trash/`, `worlds/.trash/` | Recoverable removed profiles/worlds | + +Artifacts use hard links when possible, with symbolic-link or copy fallback. AutoPlug replaces an artifact link when updating instead of overwriting shared bytes. Treat cached JARs and their linked copies as immutable; do not edit their contents in place. Mutable settings and world saves are copied into independent directories. The legacy server's working directory and global updater configuration are not repointed to implement profile operations. + +## Verification and optional live smoke checks + +The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. + +From a checkout with Maven and a suitable JDK, run: + +```text +mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,MinecraftLauncherTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test +mvn -DskipTests package +``` + +The dependency-inclusive executable is `target/AutoPlug-Client.jar`. A live download/client smoke check is optional and contacts the official game/runtime providers; it may download substantial assets and opens a Minecraft window: + +```text +java -Dautoplug.home=./launcher-smoke -jar target/AutoPlug-Client.jar .profiles create "Vanilla smoke" 1.20.1 VANILLA --type mods +java -Dautoplug.home=./launcher-smoke -jar target/AutoPlug-Client.jar .mc launch CLIENT_PROFILE_ID +``` + +Replace `CLIENT_PROFILE_ID` with the ID from the first command. Check that the selected runtime starts and the client reaches its title screen, then close it. To test Fabric, Quilt, Forge or NeoForge, create a separate profile with that loader and a version the provider supports. A successful metadata download or fixture test alone does not establish that the actual game started. + +For a world smoke check, create a matching server profile and world in the same isolated data root. Review the EULA, explicitly accept it if appropriate, launch without `--share`, confirm the client joins its local world and verify that closing the client stops the server. Router sharing should be tested separately only by an operator who explicitly enables it. + +Maintainer live validation still includes a registered Microsoft application, real device-code sign-in, entitlement verification, token refresh and a join to an authenticated server. Those outcomes depend on external account/application authorization and are not claimed by fixture-based tests. A real network sharing check also needs a suitable gateway and another client outside the LAN. diff --git a/src/main/java/com/osiris/autoplug/client/Main.java b/src/main/java/com/osiris/autoplug/client/Main.java index 4ea6f1fb..776d9d95 100644 --- a/src/main/java/com/osiris/autoplug/client/Main.java +++ b/src/main/java/com/osiris/autoplug/client/Main.java @@ -39,6 +39,8 @@ import com.osiris.autoplug.client.network.online.ConMain; import com.osiris.autoplug.client.tasks.SSHManager; import com.osiris.autoplug.client.ui.MainWindow; +import com.osiris.autoplug.client.profiles.LauncherEntry; +import com.osiris.autoplug.client.profiles.LauncherServices; import com.osiris.autoplug.client.utils.GD; import static com.osiris.autoplug.client.utils.GD.WORKING_DIR; import com.osiris.autoplug.client.utils.UpdateCheckerThread; @@ -57,6 +59,18 @@ public class Main { //public static NonBlockingPipedInputStream PIPED_IN; public static ConMain CON; public static SSHManager sshManager; + public static LauncherServices LAUNCHER; + + /** One service instance for console commands, startup UI, and later tray enablement. */ + public static synchronized LauncherServices getLauncher() throws Exception { + if (LAUNCHER == null) { + LAUNCHER = new LauncherServices(java.nio.file.Paths.get(System.getProperty("autoplug.home", System.getProperty("user.home") + "/.autoplug")), AL::info); + Runtime.getRuntime().addShutdownHook(new Thread(LAUNCHER::close, "launcher-cleanup")); + } + MainWindow.setLauncherActions(LAUNCHER); + MainWindow.setBrowserService(LAUNCHER.getServers()); + return LAUNCHER; + } public static UpdateCheckerThread UPDATE_CHECKER_THREAD = null; @@ -68,6 +82,13 @@ public class Main { */ public static void main(String[] _args) { + LauncherEntry launcherEntry = new LauncherEntry(); + if (launcherEntry.isLauncherCommand(_args)) { + int result = launcherEntry.run(_args); + if (result != 0) System.exit(result); + return; + } + List args = new ArrayList<>(); if (_args != null) Collections.addAll(args, _args); @@ -268,6 +289,7 @@ public static void main(String[] _args) { try { if (generalConfig.autoplug_system_tray.asBoolean()) { now = System.currentTimeMillis(); + getLauncher(); new MainWindow(generalConfig); AL.info("Started system-tray GUI, took " + (System.currentTimeMillis() - now) + "ms"); } @@ -312,16 +334,15 @@ public static void main(String[] _args) { Server.start(); // Execute arguments as commands if existing - String argsString = ""; + StringBuilder argumentCommand = new StringBuilder(); for (String arg : args) { - argsString += arg + " "; - } - if (argsString.contains(".")) { - String[] commands = argsString.split("\\."); // Split by dots - for (String c : commands) { - Commands.execute("." + c); + // Only command tokens begin a new command; version numbers, hosts and paths contain dots too. + if (arg.matches("\\.[A-Za-z].*") && argumentCommand.length() > 0) { + Commands.execute(argumentCommand.toString().trim()); argumentCommand.setLength(0); } + if (argumentCommand.length() > 0 || arg.startsWith(".")) argumentCommand.append(arg).append(' '); } + if (argumentCommand.length() > 0) Commands.execute(argumentCommand.toString().trim()); // We have to keep this main Thread running. // If we don't, the NonBlockingPipedInputStream stops working diff --git a/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java b/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java new file mode 100644 index 00000000..f2fcd814 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java @@ -0,0 +1,10 @@ +package com.osiris.autoplug.client.browser; + +public final class SavedServer { + public final String name, address; + public SavedServer(String name, String address) { + this.address = ServerAddress.parse(address).toString(); + this.name = name == null || name.trim().isEmpty() ? this.address : name.trim(); + } + @Override public String toString() { return name + " (" + address + ")"; } +} diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerAddress.java b/src/main/java/com/osiris/autoplug/client/browser/ServerAddress.java new file mode 100644 index 00000000..bfd9c9d9 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerAddress.java @@ -0,0 +1,44 @@ +package com.osiris.autoplug.client.browser; + +import java.net.IDN; +import java.util.Locale; + +/** Parses Minecraft addresses without resolving DNS or contacting a server. */ +public final class ServerAddress { + public final String host; + public final int port; + private ServerAddress(String host, int port) { this.host = host; this.port = port; } + + public static ServerAddress parse(String value) { + if (value == null || value.trim().isEmpty()) throw new IllegalArgumentException("Enter a server address."); + String text = value.trim(), host = text; + int port = 25565; + if (text.startsWith("[")) { + int end = text.indexOf(']'); + if (end < 2) throw new IllegalArgumentException("Invalid IPv6 address."); + host = text.substring(1, end); + if (end + 1 < text.length()) { + if (text.charAt(end + 1) != ':') throw new IllegalArgumentException("Invalid server address."); + port = parsePort(text.substring(end + 2)); + } + if (!host.contains(":")) throw new IllegalArgumentException("Brackets are only used for IPv6 addresses."); + } else if (text.indexOf(':') == text.lastIndexOf(':') && text.contains(":")) { + host = text.substring(0, text.indexOf(':')); + port = parsePort(text.substring(text.indexOf(':') + 1)); + } + if (host.isEmpty() || host.length() > 253 || host.chars().anyMatch(c -> Character.isWhitespace(c) || c == '/' || c == '\\' || c == '?' || c == '#' || c == '@')) + throw new IllegalArgumentException("Use a hostname or IP address, optionally followed by :port."); + if (host.contains(":")) { + if (!host.matches("[0-9a-fA-F:.%a-zA-Z_-]+")) throw new IllegalArgumentException("Invalid IPv6 address."); + } else host = IDN.toASCII(host, IDN.USE_STD3_ASCII_RULES); + return new ServerAddress(host.toLowerCase(Locale.ROOT), port); + } + private static int parsePort(String value) { + try { + int port = Integer.parseInt(value); + if (port < 1 || port > 65535) throw new NumberFormatException(); + return port; + } catch (NumberFormatException e) { throw new IllegalArgumentException("The port must be between 1 and 65535."); } + } + @Override public String toString() { return (host.contains(":") ? "[" + host + "]" : host) + (port == 25565 ? "" : ":" + port); } +} diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java b/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java new file mode 100644 index 00000000..be23fb05 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java @@ -0,0 +1,73 @@ +package com.osiris.autoplug.client.browser; + +import com.google.gson.*; +import com.osiris.autoplug.client.utils.MineStat; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.*; + +/** Local favorites plus an adapter to AutoPlug's existing status ping. */ +public final class ServerBrowserService { + private final Path storage, vanilla; + public ServerBrowserService(Path storage, Path vanilla) { this.storage = storage; this.vanilla = vanilla; } + public static ServerBrowserService defaults() { + Path home = Paths.get(System.getProperty("user.home")); + String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); + Path minecraft; + if (os.contains("win") && System.getenv("APPDATA") != null) minecraft = Paths.get(System.getenv("APPDATA"), ".minecraft"); + else if (os.contains("mac")) minecraft = home.resolve("Library/Application Support/minecraft"); + else minecraft = home.resolve(".minecraft"); + return new ServerBrowserService(home.resolve(".autoplug/servers.json"), minecraft.resolve("servers.dat")); + } + public Path vanillaFile() { return vanilla; } + public synchronized List list() throws IOException { + List result = new ArrayList<>(); + if (!Files.exists(storage)) return result; + if (Files.size(storage) > 4 * 1024 * 1024) throw new IOException("The server favorites file is too large."); + try (Reader reader = Files.newBufferedReader(storage, StandardCharsets.UTF_8)) { + JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); + for (JsonElement value : array) { + JsonObject entry = value.getAsJsonObject(); + result.add(new SavedServer(entry.get("name").getAsString(), entry.get("address").getAsString())); + } + } catch (RuntimeException e) { throw new IOException("Could not read server favorites. The original file was preserved.", e); } + return result; + } + public synchronized void add(String name, String address) throws IOException { + SavedServer added = new SavedServer(name, address); + List servers = list(); + servers.removeIf(server -> server.address.equalsIgnoreCase(added.address)); + servers.add(added); save(servers); + } + public synchronized void remove(String address) throws IOException { + List servers = list(); servers.removeIf(s -> s.address.equalsIgnoreCase(address)); save(servers); + } + public synchronized int importVanilla() throws IOException { + List servers = list(); + Set existing = new HashSet<>(); + for (SavedServer server : servers) existing.add(server.address.toLowerCase(Locale.ROOT)); + int added = 0; + for (SavedServer server : new VanillaServersReader().read(vanilla)) { + if (existing.add(server.address.toLowerCase(Locale.ROOT))) { servers.add(server); added++; } + } + if (added > 0) save(servers); + return added; + } + private void save(List servers) throws IOException { + Path parent = storage.toAbsolutePath().getParent(); Files.createDirectories(parent); + Path temp = Files.createTempFile(parent, "servers-", ".json.tmp"); + try { + try (Writer writer = Files.newBufferedWriter(temp, StandardCharsets.UTF_8)) { new GsonBuilder().setPrettyPrinting().create().toJson(servers, writer); } + try { Files.move(temp, storage, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(temp, storage, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temp); } + } + public ServerStatus ping(SavedServer server) { + ServerAddress address = ServerAddress.parse(server.address); + MineStat ping = new MineStat(address.host, address.port, 3, MineStat.Request.JSON); + boolean online = ping.pingResult == MineStat.Retval.SUCCESS && ping.isServerUp(); + return new ServerStatus(online, ping.getStrippedMotd(), ping.getVersion(), ping.getCurrentPlayers(), ping.getMaximumPlayers(), + ping.getProtocol(), ping.getLatency(), ping.pingResult.name()); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java b/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java new file mode 100644 index 00000000..633608b9 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java @@ -0,0 +1,12 @@ +package com.osiris.autoplug.client.browser; + +public final class ServerStatus { + public final boolean online; + public final String motd, version, message; + public final int players, capacity, protocol; + public final long latency; + public ServerStatus(boolean online, String motd, String version, int players, int capacity, int protocol, long latency, String message) { + this.online = online; this.motd = motd; this.version = version; this.players = players; + this.capacity = capacity; this.protocol = protocol; this.latency = latency; this.message = message; + } +} diff --git a/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java b/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java new file mode 100644 index 00000000..091431b5 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java @@ -0,0 +1,96 @@ +package com.osiris.autoplug.client.browser; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.zip.GZIPInputStream; + +/** Small read-only NBT decoder. Vanilla's file and unknown tags are never rewritten. */ +public final class VanillaServersReader { + private static final int MAX_BYTES = 16 * 1024 * 1024, MAX_ITEMS = 10000, MAX_DEPTH = 32; + + public List read(Path file) throws IOException { + if (!Files.exists(file)) return Collections.emptyList(); + if (Files.size(file) > MAX_BYTES) throw new IOException("servers.dat exceeds the 16 MiB import limit."); + try (BufferedInputStream raw = new BufferedInputStream(Files.newInputStream(file))) { + raw.mark(2); + int first = raw.read(), second = raw.read(); + raw.reset(); + InputStream decoded = first == 0x1f && second == 0x8b ? new GZIPInputStream(raw) : raw; + try (DataInputStream input = new DataInputStream(new LimitedStream(decoded))) { + if (input.readUnsignedByte() != 10) throw new IOException("servers.dat must contain an NBT compound."); + input.readUTF(); + Object root = readValue(input, 10, 0, new int[]{100000}); + List result = new ArrayList<>(); + Object servers = ((Map) root).get("servers"); + if (!(servers instanceof List)) return result; + for (Object value : (List) servers) { + if (!(value instanceof Map)) continue; + Map entry = (Map) value; + if (!(entry.get("ip") instanceof String)) continue; + try { + result.add(new SavedServer(entry.get("name") instanceof String ? (String) entry.get("name") : "", (String) entry.get("ip"))); + } catch (IllegalArgumentException ignored) { /* An invalid favorite must not hide valid entries. */ } + } + return result; + } + } + } + + private Object readValue(DataInputStream input, int type, int depth, int[] budget) throws IOException { + if (depth > MAX_DEPTH) throw new IOException("NBT nesting is too deep."); + if (--budget[0] < 0) throw new IOException("NBT contains too many values."); + switch (type) { + case 1: return input.readByte(); + case 2: return input.readShort(); + case 3: return input.readInt(); + case 4: return input.readLong(); + case 5: return input.readFloat(); + case 6: return input.readDouble(); + case 7: skip(input, length(input, MAX_BYTES)); return null; + case 8: return input.readUTF(); + case 9: + int childType = input.readUnsignedByte(), count = length(input, MAX_ITEMS); + if (childType > 12 || (childType == 0 && count != 0)) throw new IOException("Invalid NBT list type."); + List values = new ArrayList<>(count); + for (int i = 0; i < count; i++) values.add(readValue(input, childType, depth + 1, budget)); + return values; + case 10: + Map compound = new LinkedHashMap<>(); + for (int i = 0; i <= MAX_ITEMS; i++) { + int child = input.readUnsignedByte(); + if (child == 0) return compound; + if (i == MAX_ITEMS) throw new IOException("Too many NBT compound entries."); + String name = input.readUTF(); + compound.put(name, readValue(input, child, depth + 1, budget)); + } + throw new IOException("Invalid NBT compound."); + case 11: skip(input, length(input, MAX_BYTES / 4) * 4); return null; + case 12: skip(input, length(input, MAX_BYTES / 8) * 8); return null; + default: throw new IOException("Unknown NBT tag type: " + type); + } + } + private int length(DataInputStream in, int limit) throws IOException { + int size = in.readInt(); + if (size < 0 || size > limit) throw new IOException("Invalid NBT collection length."); + return size; + } + private void skip(DataInputStream in, int bytes) throws IOException { + byte[] buffer = new byte[Math.min(bytes, 8192)]; + while (bytes > 0) { int n = Math.min(bytes, buffer.length); in.readFully(buffer, 0, n); bytes -= n; } + } + private static final class LimitedStream extends FilterInputStream { + private long remaining = MAX_BYTES; + LimitedStream(InputStream in) { super(in); } + @Override public int read() throws IOException { + if (remaining <= 0) throw new IOException("Decoded NBT exceeds the import limit."); + int value = in.read(); if (value >= 0) remaining--; return value; + } + @Override public int read(byte[] b, int off, int len) throws IOException { + if (len == 0) return 0; + if (remaining <= 0) throw new IOException("Decoded NBT exceeds the import limit."); + int n = in.read(b, off, (int) Math.min(len, remaining)); if (n > 0) remaining -= n; return n; + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java b/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java index b8f3d60d..de83c804 100644 --- a/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java +++ b/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java @@ -67,6 +67,7 @@ public GeneralConfig(boolean save) throws IOException, DuplicateKeyException, Ya try { if (this.autoplug_system_tray.asBoolean()) { boolean firstStart = MainWindow.GET == null; + com.osiris.autoplug.client.Main.getLauncher(); new MainWindow(this); if (firstStart) AL.info("Started system-tray GUI."); } else { diff --git a/src/main/java/com/osiris/autoplug/client/console/Commands.java b/src/main/java/com/osiris/autoplug/client/console/Commands.java index 5e37ec10..81118e4f 100644 --- a/src/main/java/com/osiris/autoplug/client/console/Commands.java +++ b/src/main/java/com/osiris/autoplug/client/console/Commands.java @@ -76,6 +76,15 @@ public final class Commands { */ public static boolean execute(@NotNull String command) { + if (command != null && (command.trim().startsWith(".profiles") || command.trim().startsWith(".mc ") + || (command.trim().startsWith(".check ") || command.trim().startsWith(".update ")) && command.contains("--profile"))) { + try { + com.osiris.autoplug.client.profiles.LauncherCommands launcher = new com.osiris.autoplug.client.profiles.LauncherCommands(Main.getLauncher(), AL::info); + launcher.execute(launcher.tokenize(command)); + } catch (Exception e) { AL.warn("Launcher command failed: " + e.getMessage()); } + return true; + } + String first = ""; @@ -97,6 +106,9 @@ public static boolean execute(@NotNull String command) { if (command.equals(".help") || command.equals(".h")) { AL.info(""); AL.info(".help | Prints out this (Shortcut: .h)"); + AL.info(".profiles list/create/clone/delete/template/add | Manage isolated client/server collections"); + AL.info(".check|.update mods|plugins --profile | Review/apply profile updates; migration requires confirmation"); + AL.info(".mc launch [--server host:port] | .mc servers list/import/add | .mc worlds list/create/launch/share/stop"); AL.info(".ping | Responds with 'Pong!' as a way to test if AutoPlug is running."); AL.info(".run tasks | Runs the 'before server startup tasks' without starting the server (.rt)"); AL.info(".con info | Shows details about AutoPlugs network connections (.ci)"); @@ -292,12 +304,12 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO new TaskServerUpdater("ServerUpdater", myManager.manager).start(); new UtilsTasks().printResultsWhenDone(myManager.manager); return true; - } else if (command.equals(".check plugins") || command.equals(".cp")) { + } else if (command.equals(".check plugins") || command.equals(".cp") || command.equals(".update plugins")) { MyBThreadManager myManager = new UtilsTasks().createManagerAndPrinter(); new TaskPluginsUpdater("PluginsUpdater", myManager.manager).start(); new UtilsTasks().printResultsWhenDone(myManager.manager); return true; - } else if (command.equals(".check mods") || command.equals(".cm")) { + } else if (command.equals(".check mods") || command.equals(".cm") || command.equals(".update mods")) { MyBThreadManager myManager = new UtilsTasks().createManagerAndPrinter(); new TaskModsUpdater("ModsUpdater", myManager.manager).start(); new UtilsTasks().printResultsWhenDone(myManager.manager); diff --git a/src/main/java/com/osiris/autoplug/client/launcher/AccountStore.java b/src/main/java/com/osiris/autoplug/client/launcher/AccountStore.java new file mode 100644 index 00000000..535cfa5b --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/AccountStore.java @@ -0,0 +1,80 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.AclEntry; +import java.nio.file.attribute.AclEntryPermission; +import java.nio.file.attribute.AclEntryType; +import java.nio.file.attribute.AclFileAttributeView; +import java.nio.file.attribute.PosixFilePermission; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; + +/** Optional local account persistence. Call save only when the user chooses to remember an account. */ +public final class AccountStore { + private final Path file; + public AccountStore(Path file) { this.file = file.toAbsolutePath().normalize(); } + public synchronized List list() throws IOException { + if (!Files.exists(file)) return new ArrayList<>(); + List result = new ArrayList<>(); + try { + JsonArray accounts = LauncherFiles.readJson(file).getAsJsonArray("accounts"); + for (JsonElement value : accounts) { + JsonObject a = value.getAsJsonObject(); + result.add(new MinecraftAccount(a.get("username").getAsString(), a.get("uuid").getAsString(), + a.get("accessToken").getAsString(), a.get("refreshToken").getAsString(), + a.get("clientId").getAsString(), a.get("xuid").getAsString(), a.get("offline").getAsBoolean(), + Instant.parse(a.get("expiresAt").getAsString()))); + } + } catch (RuntimeException e) { throw new IOException("Account settings could not be read. Sign in again or restore the settings file.", e); } + return result; + } + public synchronized void save(MinecraftAccount account) throws IOException { + List accounts = list(); + accounts.removeIf(existing -> existing.uuid.equals(account.uuid) && existing.offline == account.offline); + accounts.add(account); + write(accounts); + } + public synchronized void remove(String uuid) throws IOException { + List accounts = list(); + accounts.removeIf(account -> account.uuid.equals(uuid.replace("-", ""))); + write(accounts); + } + private void write(List accounts) throws IOException { + Files.createDirectories(file.getParent()); + JsonArray array = new JsonArray(); + for (MinecraftAccount account : accounts) { + JsonObject value = new JsonObject(); + value.addProperty("username", account.username); value.addProperty("uuid", account.uuid); + value.addProperty("accessToken", account.accessToken); value.addProperty("refreshToken", account.refreshToken); + value.addProperty("clientId", account.clientId); value.addProperty("xuid", account.xuid); + value.addProperty("offline", account.offline); value.addProperty("expiresAt", account.expiresAt.toString()); + array.add(value); + } + JsonObject root = new JsonObject(); root.add("accounts", array); + Path temporary = Files.createTempFile(file.getParent(), ".accounts-", ".tmp"); + try { + restrict(temporary); + Files.write(temporary, root.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + LauncherFiles.move(temporary, file); + } finally { Files.deleteIfExists(temporary); } + } + static void restrict(Path path) throws IOException { + if (Files.getFileStore(path).supportsFileAttributeView("posix")) + Files.setPosixFilePermissions(path, EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE)); + else { + AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class); + if (view == null) throw new IOException("This filesystem cannot protect account credentials. Choose a local account/profile folder with owner-only file permissions."); + view.setAcl(Collections.singletonList(AclEntry.newBuilder().setType(AclEntryType.ALLOW) + .setPrincipal(Files.getOwner(path)).setPermissions(EnumSet.allOf(AclEntryPermission.class)).build())); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/JavaRuntimeManager.java b/src/main/java/com/osiris/autoplug/client/launcher/JavaRuntimeManager.java new file mode 100644 index 00000000..0241934f --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/JavaRuntimeManager.java @@ -0,0 +1,195 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.osiris.autoplug.client.tasks.updater.java.AdoptV3API; +import com.osiris.autoplug.client.utils.UtilsCrypto; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; +import java.util.stream.Stream; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** Version-scoped extension of AutoPlug's Adoptium JRE manager, without changing server settings. */ +public class JavaRuntimeManager { + private final Path runtimeRoot; + private final Map overrides = new HashMap<>(); + + public JavaRuntimeManager(Path runtimeRoot) { this.runtimeRoot = runtimeRoot.toAbsolutePath().normalize(); } + public Path getRuntimeRoot() { return runtimeRoot; } + + /** Configure an existing Java executable. The version is checked when resolved. */ + public synchronized void setRuntime(int major, Path executable) { + if (executable == null) overrides.remove(major); + else overrides.put(major, executable.toAbsolutePath().normalize()); + } + + public synchronized Path resolve(int requiredMajor, Consumer progress) throws Exception { + if (requiredMajor < 8) throw new IOException("Unsupported Java runtime version: " + requiredMajor); + Consumer log = progress == null ? value -> { } : progress; + Path custom = overrides.get(requiredMajor); + if (custom != null) { + if (!Files.isRegularFile(custom) || majorVersion(custom) != requiredMajor) + throw new IOException("Configured runtime is not Java " + requiredMajor + ": " + custom); + return custom; + } + Path current = Paths.get(System.getProperty("java.home"), "bin", executableName()); + if (Files.isRegularFile(current) && majorVersion(current) == requiredMajor) return current; + Path destination = runtimeRoot.resolve("java-" + requiredMajor); + Path cached = findJava(destination, requiredMajor); + if (cached != null) return cached; + // Read the existing server runtime, but never replace it or modify its global configuration. + Path legacy = findJava(Paths.get(System.getProperty("user.dir"), "autoplug", "system", "jre"), requiredMajor); + if (legacy != null) return legacy; + log.accept("Installing Java " + requiredMajor + " using AutoPlug's Adoptium provider"); + AdoptV3API api = new AdoptV3API(); + AdoptV3API.OperatingSystemArchitectureType arch = architecture(); + AdoptV3API.OperatingSystemType os = operatingSystem(); + AtomicReference release = new AtomicReference<>(); + boolean lts = true; + for (boolean onlyLts : new boolean[]{true, false}) { + api.getReleases(arch, false, AdoptV3API.ImageType.JDK, true, onlyLts, os, 50, + AdoptV3API.VendorProjectType.JDK, AdoptV3API.ReleaseType.GENERAL_AVAILABILITY, page -> { + for (JsonElement element : page.getAsJsonArray("versions")) { + JsonObject candidate = element.getAsJsonObject(); + if (candidate.get("major").getAsInt() == requiredMajor) { release.set(candidate); return false; } + } + return true; + }); + if (release.get() != null) { lts = onlyLts; break; } + } + if (release.get() == null) throw new IOException("Adoptium has no supported Java " + requiredMajor + " build for this computer."); + JsonArray details = api.getVersionInformation(release.get().get("semver").getAsString(), arch, false, + AdoptV3API.ImageType.JDK, true, lts, os, 20, AdoptV3API.VendorProjectType.JDK, + AdoptV3API.ReleaseType.GENERAL_AVAILABILITY); + if (details.size() == 0) throw new IOException("No Java " + requiredMajor + " package was returned."); + JsonObject binary = details.get(0).getAsJsonObject().getAsJsonArray("binaries").get(0).getAsJsonObject(); + JsonObject pack = binary.getAsJsonObject("package"); + String checksum = pack.get("checksum").getAsString(); + String name = pack.get("name").getAsString(); + Path archive = LauncherFiles.child(runtimeRoot.resolve("downloads"), name); + if (Files.exists(archive) && !checksum.equalsIgnoreCase(UtilsCrypto.fastSHA256(archive.toFile()))) Files.delete(archive); + LauncherFiles.download(pack.get("link").getAsString(), archive, null, pack.get("size").getAsLong(), log); + if (!checksum.equalsIgnoreCase(UtilsCrypto.fastSHA256(archive.toFile()))) { + Files.deleteIfExists(archive); + throw new IOException("Java runtime checksum mismatch."); + } + Files.createDirectories(runtimeRoot); + Path staging = Files.createTempDirectory(runtimeRoot, ".java-" + requiredMajor + "-"); + try { + extract(archive, staging); + Path executable = findJava(staging, requiredMajor); + if (executable == null) throw new IOException("Downloaded archive does not contain Java " + requiredMajor + "."); + Path relative = staging.relativize(executable); + if (Files.exists(destination)) deleteTree(destination); + LauncherFiles.move(staging, destination); + return destination.resolve(relative); + } finally { if (Files.exists(staging)) deleteTree(staging); } + } + + static int majorVersion(Path java) throws IOException { + Path home = java.getParent().getParent(); + Path release = home.resolve("release"); + if (Files.isRegularFile(release)) { + Properties values = new Properties(); + try (InputStream in = Files.newInputStream(release)) { values.load(in); } + return parseMajor(values.getProperty("JAVA_VERSION", "")); + } + // Some Java 8 distributions place the executable in jre/bin and release in the JDK root. + if (home.getFileName().toString().equals("jre") && Files.isRegularFile(home.getParent().resolve("release"))) + return majorVersion(home.getParent().resolve("bin").resolve(executableName())); + return -1; + } + static int parseMajor(String version) { + String value = version.replace("\"", ""); + if (value.startsWith("1.")) value = value.substring(2); + java.util.regex.Matcher match = java.util.regex.Pattern.compile("^(\\d+)").matcher(value); + return match.find() ? Integer.parseInt(match.group(1)) : -1; + } + private static Path findJava(Path root, int major) throws IOException { + if (!Files.isDirectory(root)) return null; + try (Stream paths = Files.walk(root, 6)) { + for (Path candidate : (Iterable) paths.filter(p -> p.getFileName().toString().equals(executableName()))::iterator) + if (Files.isRegularFile(candidate) && majorVersion(candidate) == major) return candidate; + } + return null; + } + static String executableName() { return System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("win") ? "java.exe" : "java"; } + private static AdoptV3API.OperatingSystemType operatingSystem() throws IOException { + String name = System.getProperty("os.name").toLowerCase(Locale.ROOT); + if (name.contains("win")) return AdoptV3API.OperatingSystemType.WINDOWS; + if (name.contains("mac")) return AdoptV3API.OperatingSystemType.MAC; + if (name.contains("linux")) return AdoptV3API.OperatingSystemType.LINUX; + throw new IOException("Automatic Java installation is unavailable on " + name + "; configure an existing runtime."); + } + private static AdoptV3API.OperatingSystemArchitectureType architecture() throws IOException { + String arch = System.getProperty("os.arch").toLowerCase(Locale.ROOT); + if (arch.equals("amd64") || arch.equals("x86_64")) return AdoptV3API.OperatingSystemArchitectureType.X64; + if (arch.equals("aarch64") || arch.equals("arm64")) return AdoptV3API.OperatingSystemArchitectureType.AARCH64; + if (arch.equals("x86") || arch.equals("i386")) return AdoptV3API.OperatingSystemArchitectureType.X86; + for (AdoptV3API.OperatingSystemArchitectureType value : AdoptV3API.OperatingSystemArchitectureType.values()) + if (value.name().equalsIgnoreCase(arch)) return value; + throw new IOException("Unsupported Java architecture " + arch + "; configure an existing runtime."); + } + static void extract(Path archive, Path target) throws IOException { + Files.createDirectories(target); + if (archive.getFileName().toString().endsWith(".zip")) { + try (ZipInputStream zip = new ZipInputStream(Files.newInputStream(archive))) { + ZipEntry entry; + while ((entry = zip.getNextEntry()) != null) { + Path destination = LauncherFiles.child(target, entry.getName()); + if (entry.isDirectory()) Files.createDirectories(destination); + else { Files.createDirectories(destination.getParent()); Files.copy(zip, destination, StandardCopyOption.REPLACE_EXISTING); } + } + } + } else { + List links = new ArrayList<>(); + try (TarArchiveInputStream tar = new TarArchiveInputStream(new GZIPInputStream(Files.newInputStream(archive)))) { + TarArchiveEntry entry; + while ((entry = tar.getNextTarEntry()) != null) { + Path destination = LauncherFiles.child(target, entry.getName()); + if (entry.isDirectory()) Files.createDirectories(destination); + else if (entry.isSymbolicLink() || entry.isLink()) { + Path linkTarget = entry.isLink() ? LauncherFiles.child(target, entry.getLinkName()) + : destination.getParent().resolve(entry.getLinkName()).normalize(); + if (!linkTarget.startsWith(target.toAbsolutePath().normalize())) throw new IOException("Unsafe runtime archive link."); + links.add(new Path[]{destination, linkTarget}); + } else if (entry.isFile()) { + Files.createDirectories(destination.getParent()); + Files.copy(tar, destination, StandardCopyOption.REPLACE_EXISTING); + if ((entry.getMode() & 0111) != 0) destination.toFile().setExecutable(true, false); + } + } + } + for (Path[] link : links) { + Files.createDirectories(link[0].getParent()); + Files.createSymbolicLink(link[0], link[0].getParent().relativize(link[1])); + } + } + } + private static void deleteTree(Path root) throws IOException { + try (Stream stream = Files.walk(root)) { + Path[] paths = stream.sorted(Comparator.reverseOrder()).toArray(Path[]::new); + for (Path path : paths) Files.deleteIfExists(path); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java new file mode 100644 index 00000000..df1c5a27 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java @@ -0,0 +1,44 @@ +package com.osiris.autoplug.client.launcher; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Locale; +import java.util.Objects; + +/** Profile-scoped inputs; no launcher operation changes user.dir or the global server. */ +public final class LaunchRequest { + public final Path gameDir; + public final String version; + public final String loader; + public final String loaderVersion; + public final MinecraftAccount account; + public final String serverHost; + public final int serverPort; + + public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, + MinecraftAccount account, String serverHost, int serverPort) { + this.gameDir = Objects.requireNonNull(gameDir, "gameDir").toAbsolutePath().normalize(); + this.version = safeVersion(version); + this.loader = loader == null ? "VANILLA" : loader.toUpperCase(Locale.ROOT); + if (!Arrays.asList("VANILLA", "FABRIC", "QUILT", "FORGE", "NEOFORGE").contains(this.loader)) + throw new IllegalArgumentException("Unsupported client loader: " + loader); + this.loaderVersion = loaderVersion == null || loaderVersion.trim().isEmpty() ? null : safeVersion(loaderVersion); + this.account = Objects.requireNonNull(account, "account"); + this.serverHost = serverHost == null || serverHost.trim().isEmpty() ? null : serverHost.trim(); + if (this.serverHost != null && (serverPort < 1 || serverPort > 65535)) + throw new IllegalArgumentException("Server port must be between 1 and 65535."); + if (this.serverHost != null && (this.serverHost.contains("\n") || this.serverHost.contains("\r"))) + throw new IllegalArgumentException("Invalid server address."); + this.serverPort = serverPort; + } + + static String safeVersion(String value) { + if (value == null || value.isEmpty() || value.equals(".") || value.contains("..") + || !value.matches("[A-Za-z0-9._+ -]+")) + throw new IllegalArgumentException("Invalid Minecraft or loader version: " + value); + return value; + } + public Path getGameDir() { return gameDir; } + public String getVersion() { return version; } + public String getLoader() { return loader; } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java new file mode 100644 index 00000000..1cec1892 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java @@ -0,0 +1,96 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.osiris.autoplug.client.utils.UtilsCrypto; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +/** Shared, verified cache downloads using the application's existing HTTP and hash libraries. */ +final class LauncherFiles { + static final OkHttpClient HTTP = new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS).followRedirects(true).build(); + private static final Object[] DOWNLOAD_LOCKS = new Object[64]; + static { for (int i = 0; i < DOWNLOAD_LOCKS.length; i++) DOWNLOAD_LOCKS[i] = new Object(); } + + private LauncherFiles() { } + static JsonObject json(String url) throws IOException { + try { return JsonParser.parseString(text(url)).getAsJsonObject(); } + catch (RuntimeException e) { throw new IOException("Invalid JSON metadata from " + url, e); } + } + static String text(String url) throws IOException { + try (Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { + if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + url); + if (response.body().contentLength() > 32 * 1024 * 1024) throw new IOException("Metadata too large: " + url); + return response.body().string(); + } + } + static Path child(Path root, String relative) throws IOException { + Path absolute = root.toAbsolutePath().normalize(); + Path result = absolute.resolve(relative).normalize(); + if (!result.startsWith(absolute) || result.equals(absolute)) throw new IOException("Invalid cache path: " + relative); + return result; + } + static void move(Path source, Path target) throws IOException { + try { Files.move(source, target, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); } + } + static void writeJson(Path path, JsonObject json) throws IOException { + Files.createDirectories(path.getParent()); + Path temporary = Files.createTempFile(path.getParent(), ".metadata-", ".tmp"); + try { Files.write(temporary, json.toString().getBytes(StandardCharsets.UTF_8)); move(temporary, path); } + finally { Files.deleteIfExists(temporary); } + } + static JsonObject readJson(Path path) throws IOException { + try { return JsonParser.parseString(new String(Files.readAllBytes(path), StandardCharsets.UTF_8)).getAsJsonObject(); } + catch (RuntimeException e) { throw new IOException("Invalid cached metadata: " + path, e); } + } + static boolean valid(Path path, String sha1, long size) { + try { return Files.isRegularFile(path) && (size < 0 || Files.size(path) == size) + && (sha1 == null || sha1.equalsIgnoreCase(UtilsCrypto.fastSHA1(path.toFile()))); } + catch (Exception e) { return false; } + } + static Path download(String url, Path destination, String sha1, long size, Consumer progress) throws IOException { + synchronized (DOWNLOAD_LOCKS[(destination.toAbsolutePath().normalize().hashCode() & 0x7fffffff) % DOWNLOAD_LOCKS.length]) { + return downloadLocked(url, destination, sha1, size, progress); + } + } + private static Path downloadLocked(String url, Path destination, String sha1, long size, Consumer progress) throws IOException { + if (valid(destination, sha1, size)) return destination; + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); + Files.createDirectories(destination.getParent()); + Path temporary = Files.createTempFile(destination.getParent(), ".download-", ".part"); + progress.accept("Downloading " + destination.getFileName()); + try { + try (Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { + if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + url); + try (InputStream in = response.body().byteStream(); OutputStream out = Files.newOutputStream(temporary)) { + byte[] buffer = new byte[65536]; + int count; + long total = 0; + while ((count = in.read(buffer)) != -1) { + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); + total += count; + if (size >= 0 && total > size) throw new IOException("Unexpected download size: " + destination.getFileName()); + out.write(buffer, 0, count); + } + } + } + if (!valid(temporary, sha1, size)) throw new IOException("Checksum or length mismatch: " + destination.getFileName()); + move(temporary, destination); + return destination; + } finally { Files.deleteIfExists(temporary); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java b/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java new file mode 100644 index 00000000..cc98becc --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java @@ -0,0 +1,280 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** Adapters for official loader metadata and standalone installers, with no linked launcher code. */ +final class LoaderInstaller { + private final Path cache; + LoaderInstaller(Path cache) { this.cache = cache; } + + JsonObject clientProfile(LaunchRequest request, JsonObject vanilla, Path client, Path java, Consumer log) throws Exception { + if (request.loader.equals("VANILLA")) return null; + if (request.loader.equals("FABRIC") || request.loader.equals("QUILT")) { + String base = metaBase(request.loader); + String version = request.loaderVersion == null ? latestMetaLoader(base, request.version) : request.loaderVersion; + Path file = cache.resolve("loader-metadata").resolve(request.loader.toLowerCase() + "-" + MinecraftLauncher.safeId(request.version) + "-" + MinecraftLauncher.safeId(version) + ".json"); + JsonObject profile = cachedJson(base + "/loader/" + encode(request.version) + "/" + encode(version) + "/profile/json", file); + if (!request.version.equals(MinecraftLauncher.string(profile, "inheritsFrom", ""))) + throw new IOException("Loader metadata is for a different Minecraft version."); + return profile; + } + Installer installer = forgeInstaller(request.version, request.loader, request.loaderVersion, log); + Path home = cache.resolve("loader-installations").resolve(installer.id); + Path marker = home.resolve("autoplug-installed.json"); + if (Files.isRegularFile(marker)) { importLibraries(home.resolve("libraries")); return LauncherFiles.readJson(marker); } + Files.createDirectories(home); + Path baseVersion = home.resolve("versions").resolve(request.version); + MinecraftLauncher.linkOrCopy(client, baseVersion.resolve(request.version + ".jar")); + LauncherFiles.writeJson(baseVersion.resolve(request.version + ".json"), vanilla); + Path launcherProfiles = home.resolve("launcher_profiles.json"); + if (!Files.exists(launcherProfiles)) { + JsonObject profiles = new JsonObject(); profiles.add("profiles", new JsonObject()); + LauncherFiles.writeJson(launcherProfiles, profiles); + } + log.accept("Installing " + request.loader + " " + installer.version + " and its client processors"); + run(java, Arrays.asList("-jar", installer.jar.toString(), "--installClient", home.toString()), home, log); + JsonObject profile = installedClientProfile(home, request.version); + importLibraries(home.resolve("libraries")); + // Some old installers publish a version jar alongside their version JSON. + Path versionDir = home.resolve("versions").resolve(profile.get("id").getAsString()); + if (Files.isDirectory(versionDir)) { + try (Stream paths = Files.list(versionDir)) { + for (Path path : paths.filter(Files::isRegularFile).collect(Collectors.toList())) + MinecraftLauncher.linkOrCopy(path, cache.resolve("versions").resolve(versionDir.getFileName()).resolve(path.getFileName())); + } + } + LauncherFiles.writeJson(marker, profile); + return profile; + } + + PreparedLaunch server(String gameVersion, String loader, String loaderVersion, Path directory, + Path java, int major, Consumer log) throws Exception { + Files.createDirectories(directory); + if (loader.equals("QUILT")) { + String version = loaderVersion == null || loaderVersion.isEmpty() ? latestMetaLoader(metaBase(loader), gameVersion) : LaunchRequest.safeVersion(loaderVersion); + Path installerMetadata = cache.resolve("loader-metadata").resolve("quilt-installer.json"); + JsonObject info; + if (Files.isRegularFile(installerMetadata)) info = LauncherFiles.readJson(installerMetadata); + else { + JsonArray installers = JsonParser.parseString(LauncherFiles.text(metaBase(loader) + "/installer")).getAsJsonArray(); + if (installers.size() == 0) throw new IOException("Quilt did not return an installer."); + info = installers.get(0).getAsJsonObject(); LauncherFiles.writeJson(installerMetadata, info); + } + Path jar = cache.resolve("installers").resolve("quilt-" + LaunchRequest.safeVersion(info.get("version").getAsString()) + ".jar"); + String sha = info.has("hashes") ? MinecraftLauncher.string(info.getAsJsonObject("hashes"), "sha1", null) : null; + LauncherFiles.download(info.get("url").getAsString(), jar, sha, info.has("file_size") ? info.get("file_size").getAsLong() : -1, log); + Path marker = directory.resolve(".autoplug-quilt-version"); + String key = gameVersion + ":" + version; + if (!Files.isRegularFile(marker) || !new String(Files.readAllBytes(marker), StandardCharsets.UTF_8).equals(key)) { + run(java, Arrays.asList("-jar", jar.toString(), "install", "server", gameVersion, version, + "--install-dir=" + directory, "--download-server"), directory, log); + Files.write(marker, key.getBytes(StandardCharsets.UTF_8)); + } + Path launchJar = directory.resolve("quilt-server-launch.jar"); + if (!Files.isRegularFile(launchJar)) throw new IOException("Quilt installer did not produce quilt-server-launch.jar."); + return new PreparedLaunch(java, directory, Arrays.asList("-Xmx2G", "-jar", launchJar.toString(), "nogui"), gameVersion + "-quilt-" + version, major); + } + if (!loader.equals("FORGE") && !loader.equals("NEOFORGE")) throw new IOException("Unsupported dedicated loader: " + loader); + Installer installer = forgeInstaller(gameVersion, loader, loaderVersion, log); + Path marker = directory.resolve(".autoplug-forge-version"); + if (!Files.isRegularFile(marker) || !new String(Files.readAllBytes(marker), StandardCharsets.UTF_8).equals(installer.id)) { + log.accept("Installing " + loader + " dedicated server"); + run(java, Arrays.asList("-jar", installer.jar.toString(), "--installServer", directory.toString()), directory, log); + Files.write(marker, installer.id.getBytes(StandardCharsets.UTF_8)); + } + Path libraries = directory.resolve("libraries"); + String argsName = MinecraftLauncher.osName().equals("windows") ? "win_args.txt" : "unix_args.txt"; + List argsFiles = new ArrayList<>(); + if (Files.isDirectory(libraries)) try (Stream paths = Files.walk(libraries)) { + argsFiles = paths.filter(p -> p.getFileName().toString().equals(argsName)) + .filter(p -> p.toString().contains(installer.version)).collect(Collectors.toList()); + } + if (argsFiles.size() == 1) { + List arguments = new ArrayList<>(); arguments.add("-Xmx2G"); + Path custom = directory.resolve("user_jvm_args.txt"); + if (Files.isRegularFile(custom)) arguments.add("@" + custom); + arguments.add("@" + argsFiles.get(0)); arguments.add("nogui"); + return new PreparedLaunch(java, directory, arguments, installer.id, major); + } + try (Stream paths = Files.list(directory)) { + for (Path candidate : paths.filter(p -> p.getFileName().toString().endsWith(".jar")).sorted().collect(Collectors.toList())) { + String name = candidate.getFileName().toString(); + if ((!name.startsWith("forge-") && !name.startsWith("neoforge-")) || name.contains("installer")) continue; + try (JarFile jar = new JarFile(candidate.toFile())) { + if (jar.getManifest() != null && jar.getManifest().getMainAttributes().getValue("Main-Class") != null) + return new PreparedLaunch(java, directory, Arrays.asList("-Xmx2G", "-jar", candidate.toString(), "nogui"), installer.id, major); + } + } + } + throw new IOException("Official " + loader + " installer did not produce an unambiguous server launch command. See autoplug-loader-install.log."); + } + + private Installer forgeInstaller(String game, String loader, String desired, Consumer log) throws Exception { + String version = desired == null || desired.trim().isEmpty() ? null : LaunchRequest.safeVersion(desired); + String base, coordinate; + if (loader.equals("FORGE")) { + if (version == null) { + JsonObject promotions = freshJson("https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json", cache.resolve("forge-promotions.json")).getAsJsonObject("promos"); + version = MinecraftLauncher.string(promotions, game + "-recommended", MinecraftLauncher.string(promotions, game + "-latest", null)); + if (version == null) throw new IOException("Forge does not publish a loader for Minecraft " + game + "."); + } + if (!version.startsWith(game + "-")) version = game + "-" + version; + base = "https://maven.minecraftforge.net/"; + coordinate = "net.minecraftforge:forge:" + version + ":installer"; + } else { + base = "https://maven.neoforged.net/releases/"; + boolean legacy = game.equals("1.20.1"); + String artifact = legacy ? "forge" : "neoforge"; + if (version == null) { + String prefix = legacy ? game + "-" : neoPrefix(game); + version = latestMavenVersion(base + "net/neoforged/" + artifact + "/maven-metadata.xml", prefix); + if (version == null) throw new IOException("NeoForge does not publish a loader for Minecraft " + game + "."); + } + if (legacy && !version.startsWith(game + "-")) version = game + "-" + version; + coordinate = "net.neoforged:" + artifact + ":" + version + ":installer"; + } + String relative = MinecraftLauncher.mavenPath(coordinate); + Path jar = LauncherFiles.child(cache.resolve("installers"), relative); + String hash = null; + Path checksumFile = jar.resolveSibling(jar.getFileName() + ".sha1"); + if (Files.isRegularFile(checksumFile)) hash = new String(Files.readAllBytes(checksumFile), StandardCharsets.US_ASCII).trim(); + else { + hash = LauncherFiles.text(base + relative + ".sha1").trim().split("\\s+")[0]; + if (!hash.matches("[a-fA-F0-9]{40}")) throw new IOException("Invalid official installer checksum."); + Files.createDirectories(checksumFile.getParent()); Files.write(checksumFile, hash.getBytes(StandardCharsets.US_ASCII)); + } + LauncherFiles.download(base + relative, jar, hash, -1, log); + validateInstallerGame(jar, game); + return new Installer(loader.toLowerCase() + "-" + version, version, jar); + } + static String neoPrefix(String game) throws IOException { + String[] parts = game.split("\\."); + if (parts.length >= 2 && parts[0].equals("1")) return parts[1] + "." + (parts.length > 2 ? parts[2] : "0") + "."; + if (parts.length >= 2 && parts[0].matches("\\d+") && parts[1].matches("\\d+")) return parts[0] + "." + parts[1] + "."; + throw new IOException("Choose an explicit NeoForge loader version for " + game + "."); + } + private String latestMavenVersion(String url, String prefix) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + Path cached = cache.resolve("neoforge-" + prefix.replace('.', '-') + "versions.xml"); + String xml; + try { xml = LauncherFiles.text(url); Files.createDirectories(cache); Files.write(cached, xml.getBytes(StandardCharsets.UTF_8)); } + catch (IOException e) { if (!Files.exists(cached)) throw e; xml = new String(Files.readAllBytes(cached), StandardCharsets.UTF_8); } + org.w3c.dom.NodeList nodes = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))).getElementsByTagName("version"); + String latest = null; + for (int i = 0; i < nodes.getLength(); i++) { + String value = nodes.item(i).getTextContent(); + if (value.startsWith(prefix) && (latest == null || compareVersions(value, latest) > 0)) latest = value; + } + return latest; + } + static int compareVersions(String first, String second) { + String[] a = first.split("[.\\-+]"); String[] b = second.split("[.\\-+]"); + for (int i = 0; i < Math.max(a.length, b.length); i++) { + String left = i < a.length ? a[i] : ""; String right = i < b.length ? b[i] : ""; + int result; + if (left.matches("\\d+") && right.matches("\\d+")) result = new java.math.BigInteger(left).compareTo(new java.math.BigInteger(right)); + else if (left.isEmpty() || right.isEmpty()) result = left.isEmpty() ? 1 : -1; + else result = left.compareTo(right); + if (result != 0) return result; + } + return 0; + } + private static void validateInstallerGame(Path jar, String game) throws IOException { + try (ZipFile zip = new ZipFile(jar.toFile())) { + ZipEntry entry = zip.getEntry("install_profile.json"); + if (entry == null) throw new IOException("Official installer has no install profile."); + JsonObject profile; + try (InputStream in = zip.getInputStream(entry)) { profile = JsonParser.parseReader(new java.io.InputStreamReader(in, StandardCharsets.UTF_8)).getAsJsonObject(); } + String actual = MinecraftLauncher.string(profile, "minecraft", ""); + if (actual.isEmpty() && profile.has("versionInfo")) actual = MinecraftLauncher.string(profile.getAsJsonObject("versionInfo"), "inheritsFrom", ""); + if (!actual.isEmpty() && !actual.equals(game)) throw new IOException("Requested loader is for Minecraft " + actual + ", not " + game + "."); + } + } + private static JsonObject installedClientProfile(Path home, String game) throws IOException { + List candidates = new ArrayList<>(); + try (Stream paths = Files.walk(home.resolve("versions"), 2)) { + for (Path file : paths.filter(p -> p.getFileName().toString().endsWith(".json")).collect(Collectors.toList())) { + JsonObject metadata = LauncherFiles.readJson(file); + if (game.equals(MinecraftLauncher.string(metadata, "inheritsFrom", "")) && !game.equals(MinecraftLauncher.string(metadata, "id", ""))) candidates.add(metadata); + } + } + if (candidates.size() != 1) throw new IOException("Official installer did not produce a unique client profile. See autoplug-loader-install.log."); + return candidates.get(0); + } + private void importLibraries(Path source) throws IOException { + if (!Files.isDirectory(source)) return; + try (Stream paths = Files.walk(source)) { + for (Path file : paths.filter(Files::isRegularFile).collect(Collectors.toList())) + MinecraftLauncher.linkOrCopy(file, LauncherFiles.child(cache.resolve("libraries"), source.relativize(file).toString())); + } + } + private String latestMetaLoader(String base, String game) throws IOException { + Path file = cache.resolve("loader-metadata").resolve((base.contains("quilt") ? "quilt" : "fabric") + "-latest-" + MinecraftLauncher.safeId(game) + ".json"); + JsonArray versions; + try { + versions = JsonParser.parseString(LauncherFiles.text(base + "/loader/" + encode(game))).getAsJsonArray(); + JsonObject saved = new JsonObject(); saved.add("versions", versions); LauncherFiles.writeJson(file, saved); + } catch (IOException e) { + if (!Files.exists(file)) throw e; + versions = LauncherFiles.readJson(file).getAsJsonArray("versions"); + } + for (JsonElement element : versions) { + JsonObject loader = element.getAsJsonObject().getAsJsonObject("loader"); + if (!loader.has("stable") || loader.get("stable").getAsBoolean()) return loader.get("version").getAsString(); + } + throw new IOException("No stable loader is available for Minecraft " + game + ". Choose a specific loader version."); + } + private JsonObject cachedJson(String url, Path file) throws IOException { + if (Files.isRegularFile(file)) return LauncherFiles.readJson(file); + JsonObject json = LauncherFiles.json(url); LauncherFiles.writeJson(file, json); return json; + } + private JsonObject freshJson(String url, Path file) throws IOException { + try { JsonObject json = LauncherFiles.json(url); LauncherFiles.writeJson(file, json); return json; } + catch (IOException e) { if (Files.exists(file)) return LauncherFiles.readJson(file); throw e; } + } + static void run(Path java, List arguments, Path directory, Consumer log) throws IOException, InterruptedException { + Files.createDirectories(directory); + List command = new ArrayList<>(); command.add(java.toString()); command.add("-Djava.awt.headless=true"); command.addAll(arguments); + Path output = directory.resolve("autoplug-loader-install.log"); + Process process = new ProcessBuilder(command).directory(directory.toFile()).redirectErrorStream(true).redirectOutput(output.toFile()).start(); + try { + if (!process.waitFor(20, TimeUnit.MINUTES)) throw new IOException("Loader installation timed out. See " + output); + if (process.exitValue() != 0) throw new IOException("Loader installer exited with " + process.exitValue() + ". See " + output); + log.accept("Official loader installer completed"); + } finally { + if (process.isAlive()) { process.descendants().forEach(ProcessHandle::destroy); process.destroyForcibly(); } + } + } + private static String metaBase(String loader) { return loader.equals("QUILT") ? "https://meta.quiltmc.org/v3/versions" : "https://meta.fabricmc.net/v2/versions"; } + private static String encode(String value) throws IOException { return URLEncoder.encode(value, "UTF-8").replace("+", "%20"); } + private static final class Installer { + final String id, version; final Path jar; + Installer(String id, String version, Path jar) { this.id = id; this.version = version; this.jar = jar; } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MicrosoftAccountService.java b/src/main/java/com/osiris/autoplug/client/launcher/MicrosoftAccountService.java new file mode 100644 index 00000000..99070667 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/MicrosoftAccountService.java @@ -0,0 +1,156 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import okhttp3.FormBody; +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import java.io.IOException; +import java.time.Instant; +import java.util.Objects; + +/** Microsoft device authorization and the Xbox-to-Minecraft token exchange. No application ID is borrowed. */ +public class MicrosoftAccountService { + private static final String AUTHORITY = "https://login.microsoftonline.com/consumers/oauth2/v2.0/"; + private static final String SCOPES = "XboxLive.signin offline_access"; + private static final MediaType JSON = MediaType.parse("application/json"); + interface Transport { JsonObject execute(Request request, boolean allowError) throws IOException; } + private final Transport transport; + public MicrosoftAccountService() { this(MicrosoftAccountService::execute); } + MicrosoftAccountService(Transport transport) { this.transport = transport; } + + public static final class DeviceLogin { + public final String userCode; + public final String verificationUri; + public final String message; + public final Instant expiresAt; + private final String clientId; + private final String deviceCode; + private final int intervalSeconds; + DeviceLogin(String clientId, JsonObject json) { + this.clientId = clientId; + userCode = json.get("user_code").getAsString(); + verificationUri = json.get("verification_uri").getAsString(); + message = json.has("message") ? json.get("message").getAsString() : "Open " + verificationUri + " and enter " + userCode; + deviceCode = json.get("device_code").getAsString(); + intervalSeconds = json.has("interval") ? Math.min(60, Math.max(1, json.get("interval").getAsInt())) : 5; + expiresAt = Instant.now().plusSeconds(json.get("expires_in").getAsLong()); + } + } + + public DeviceLogin beginLogin(String clientId) throws IOException { + if (clientId == null || !clientId.matches("[A-Za-z0-9-]{8,128}")) + throw new IllegalArgumentException("Configure AutoPlug's registered Microsoft public application client ID first."); + JsonObject response = post(AUTHORITY + "devicecode", new FormBody.Builder() + .add("client_id", clientId).add("scope", SCOPES).build(), false); + return new DeviceLogin(clientId, response); + } + + /** Run on a worker thread. Interrupting the worker cancels polling. */ + public MinecraftAccount completeLogin(DeviceLogin login) throws IOException, InterruptedException { + Objects.requireNonNull(login, "login"); + int interval = login.intervalSeconds; + while (Instant.now().isBefore(login.expiresAt)) { + Thread.sleep(interval * 1000L); + JsonObject result = post(AUTHORITY + "token", new FormBody.Builder() + .add("client_id", login.clientId) + .add("grant_type", "urn:ietf:params:oauth:grant-type:device_code") + .add("device_code", login.deviceCode).build(), true); + if (!result.has("error")) return exchange(login.clientId, result); + String error = result.get("error").getAsString(); + if (error.equals("authorization_pending")) continue; + if (error.equals("slow_down")) { interval = Math.min(60, interval + 5); continue; } + throw authError(error); + } + throw new IOException("Microsoft sign-in expired. Start sign-in again."); + } + + public MinecraftAccount refresh(MinecraftAccount account) throws IOException { + if (account.offline) return account; + if (account.refreshToken.isEmpty()) throw new IOException("Microsoft sign-in is required again."); + JsonObject result = post(AUTHORITY + "token", new FormBody.Builder() + .add("client_id", account.clientId).add("scope", SCOPES) + .add("grant_type", "refresh_token").add("refresh_token", account.refreshToken).build(), false); + if (!result.has("refresh_token")) result.addProperty("refresh_token", account.refreshToken); + return exchange(account.clientId, result); + } + + private MinecraftAccount exchange(String clientId, JsonObject microsoft) throws IOException { + JsonObject properties = new JsonObject(); + properties.addProperty("AuthMethod", "RPS"); + properties.addProperty("SiteName", "user.auth.xboxlive.com"); + properties.addProperty("RpsTicket", "d=" + microsoft.get("access_token").getAsString()); + JsonObject userRequest = new JsonObject(); + userRequest.add("Properties", properties); + userRequest.addProperty("RelyingParty", "http://auth.xboxlive.com"); + userRequest.addProperty("TokenType", "JWT"); + JsonObject xbox = postJson("https://user.auth.xboxlive.com/user/authenticate", userRequest); + + JsonArray tokens = new JsonArray(); + tokens.add(xbox.get("Token").getAsString()); + JsonObject xstsProperties = new JsonObject(); + xstsProperties.addProperty("SandboxId", "RETAIL"); + xstsProperties.add("UserTokens", tokens); + JsonObject xstsRequest = new JsonObject(); + xstsRequest.add("Properties", xstsProperties); + xstsRequest.addProperty("RelyingParty", "rp://api.minecraftservices.com/"); + xstsRequest.addProperty("TokenType", "JWT"); + JsonObject xsts = postJson("https://xsts.auth.xboxlive.com/xsts/authorize", xstsRequest); + JsonObject claims = xsts.getAsJsonObject("DisplayClaims").getAsJsonArray("xui").get(0).getAsJsonObject(); + String userHash = claims.get("uhs").getAsString(); + String xuid = claims.has("xid") ? claims.get("xid").getAsString() : ""; + JsonObject minecraftRequest = new JsonObject(); + minecraftRequest.addProperty("identityToken", "XBL3.0 x=" + userHash + ";" + xsts.get("Token").getAsString()); + JsonObject minecraft = postJson("https://api.minecraftservices.com/authentication/login_with_xbox", minecraftRequest); + String token = minecraft.get("access_token").getAsString(); + JsonObject entitlements = getAuthorized("https://api.minecraftservices.com/entitlements/mcstore", token); + if (!entitlements.has("items") || entitlements.getAsJsonArray("items").size() == 0) + throw new IOException("This Microsoft account has no Minecraft Java Edition entitlement."); + JsonObject profile = getAuthorized("https://api.minecraftservices.com/minecraft/profile", token); + return new MinecraftAccount(profile.get("name").getAsString(), profile.get("id").getAsString(), token, + microsoft.has("refresh_token") ? microsoft.get("refresh_token").getAsString() : "", clientId, xuid, false, + Instant.now().plusSeconds(minecraft.get("expires_in").getAsLong())); + } + + private JsonObject postJson(String url, JsonObject body) throws IOException { + return post(url, RequestBody.create(JSON, body.toString()), false); + } + private JsonObject post(String url, RequestBody body, boolean allowError) throws IOException { + return transport.execute(new Request.Builder().url(url).header("Accept", "application/json") + .header("x-xbl-contract-version", "1").post(body).build(), allowError); + } + private JsonObject getAuthorized(String url, String token) throws IOException { + return transport.execute(new Request.Builder().url(url).header("Authorization", "Bearer " + token).build(), false); + } + private static JsonObject execute(Request request, boolean allowError) throws IOException { + try (Response response = LauncherFiles.HTTP.newCall(request).execute()) { + if (response.body() == null) throw new IOException("Empty authentication response."); + JsonObject result; + try { result = JsonParser.parseString(response.body().string()).getAsJsonObject(); } + catch (RuntimeException e) { throw new IOException("Invalid authentication response (HTTP " + response.code() + ")."); } + if (!response.isSuccessful() && !(allowError && result.has("error"))) { + if (result.has("XErr")) { + long xboxError = result.get("XErr").getAsLong(); + if (xboxError == 2148916233L) throw new IOException("Create an Xbox profile for this Microsoft account before signing in."); + if (xboxError == 2148916238L) throw new IOException("This child account needs an Xbox family organizer's permission."); + } + if (response.code() == 403 && request.url().host().equals("api.minecraftservices.com")) + throw new IOException("Minecraft services rejected access. Check that AutoPlug's Microsoft app registration is approved and the account is eligible."); + if (result.has("error") && result.get("error").isJsonPrimitive()) throw authError(result.get("error").getAsString()); + throw new IOException("Authentication failed (HTTP " + response.code() + "). Check account ownership and Microsoft app registration."); + } + return result; + } + } + private static IOException authError(String code) { + if (code.equals("authorization_declined") || code.equals("access_denied")) return new IOException("Microsoft sign-in was cancelled."); + if (code.equals("expired_token")) return new IOException("Microsoft sign-in expired. Try again."); + if (code.equals("invalid_grant")) return new IOException("Microsoft sign-in is required again."); + // Do not surface remote token-bearing response bodies in logs or dialogs. + return new IOException("Microsoft authentication failed. Check the registered client ID and try signing in again."); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftAccount.java b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftAccount.java new file mode 100644 index 00000000..8d877c7f --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftAccount.java @@ -0,0 +1,46 @@ +package com.osiris.autoplug.client.launcher; + +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.UUID; + +/** A launch identity. Credentials are deliberately excluded from diagnostic output. */ +public final class MinecraftAccount { + public final String username; + public final String uuid; + public final String accessToken; + public final String refreshToken; + public final String clientId; + public final String xuid; + public final boolean offline; + public final Instant expiresAt; + + public MinecraftAccount(String username, String uuid, String accessToken, String refreshToken, + String clientId, String xuid, boolean offline, Instant expiresAt) { + if (username == null || !username.matches("[A-Za-z0-9_]{1,16}")) + throw new IllegalArgumentException("Minecraft names must contain 1-16 letters, digits or underscores."); + if (uuid == null || !uuid.replace("-", "").matches("[a-fA-F0-9]{32}")) + throw new IllegalArgumentException("Invalid Minecraft account UUID."); + if (!offline && (accessToken == null || accessToken.isEmpty())) + throw new IllegalArgumentException("A Microsoft account requires a Minecraft access token."); + this.username = username; + this.uuid = uuid.replace("-", ""); + this.accessToken = accessToken == null ? "0" : accessToken; + this.refreshToken = refreshToken == null ? "" : refreshToken; + this.clientId = clientId == null ? "" : clientId; + this.xuid = xuid == null ? "" : xuid; + this.offline = offline; + this.expiresAt = expiresAt == null ? Instant.EPOCH : expiresAt; + } + + public static MinecraftAccount offline(String username) { + UUID id = UUID.nameUUIDFromBytes(("OfflinePlayer:" + username).getBytes(StandardCharsets.UTF_8)); + return new MinecraftAccount(username, id.toString(), "0", "", "", "", true, Instant.MAX); + } + + public boolean needsRefresh() { return !offline && expiresAt.isBefore(Instant.now().plusSeconds(60)); } + public String getUsername() { return username; } + public String getUuid() { return uuid; } + public boolean isOffline() { return offline; } + @Override public String toString() { return username + (offline ? " (offline)" : " (Microsoft)"); } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java new file mode 100644 index 00000000..1d7bf205 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java @@ -0,0 +1,424 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.osiris.autoplug.client.utils.UtilsString; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** Native, profile-isolated Minecraft launcher implemented from the publishers' metadata formats. */ +public class MinecraftLauncher { + static final String MANIFEST_URL = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json"; + private final Path cacheRoot; + private final JavaRuntimeManager runtimes; + private final String manifestUrl; + private final LoaderInstaller loaders; + + public MinecraftLauncher(Path cacheRoot, JavaRuntimeManager runtimes) { this(cacheRoot, runtimes, MANIFEST_URL); } + MinecraftLauncher(Path cacheRoot, JavaRuntimeManager runtimes, String manifestUrl) { + this.cacheRoot = cacheRoot.toAbsolutePath().normalize(); + this.runtimes = Objects.requireNonNull(runtimes, "runtimes"); + this.manifestUrl = manifestUrl; + this.loaders = new LoaderInstaller(this.cacheRoot); + } + + public synchronized PreparedLaunch prepare(LaunchRequest request, Consumer progress) throws Exception { + Consumer log = progress == null ? value -> { } : progress; + if (request.account.needsRefresh()) throw new IOException("Microsoft session expired. Refresh the account before launching."); + Files.createDirectories(request.gameDir); + JsonObject vanilla = version(request.version, log); + int major = requiredJava(vanilla); + Path java = runtimes.resolve(major, log); + Path client = downloadClient(vanilla, request.version, log); + JsonObject loader = loaders.clientProfile(request, vanilla, client, java, log); + JsonObject metadata = loader == null ? vanilla : merge(vanilla, loader); + String id = metadata.get("id").getAsString(); + Path natives = LauncherFiles.child(request.gameDir.resolve(".autoplug").resolve("natives"), safeId(id) + "-" + osName() + "-" + System.getProperty("os.arch")); + Files.createDirectories(natives); + List classpath = libraries(metadata, natives, log); + classpath.add(clientJarForProfile(client, metadata, cacheRoot)); + Path assets = cacheRoot.resolve("assets"); + String assetId = assets(metadata, assets, request.gameDir, log); + Path logging = null; + if (metadata.has("logging") && metadata.getAsJsonObject("logging").has("client")) { + JsonObject descriptor = metadata.getAsJsonObject("logging").getAsJsonObject("client").getAsJsonObject("file"); + logging = LauncherFiles.child(cacheRoot.resolve("logging"), descriptor.get("id").getAsString()); + download(descriptor, logging, log); + } + List args = buildArguments(metadata, request, classpath, natives, assets, assetId, logging); + log.accept("Minecraft " + id + " is ready (Java " + major + ")"); + return new PreparedLaunch(java, request.gameDir, args, id, major); + } + + /** Minecraft's output is written inside this profile and is never mixed with another world's console. */ + public Process launch(PreparedLaunch prepared) throws IOException { + Path logs = prepared.gameDir.resolve("logs"); + Files.createDirectories(logs); + // Loader classpaths can exceed Windows' command-line limit. Java 9+ accepts a private + // argument file; preserve the inspectable PreparedLaunch contract and remove it on exit. + List command = prepared.command(); + Path argumentsFile = null; + if (prepared.javaMajor >= 9) { + Path state = prepared.gameDir.resolve(".autoplug"); Files.createDirectories(state); + argumentsFile = Files.createTempFile(state, "launch-", ".args"); + try { + AccountStore.restrict(argumentsFile); + List lines = new ArrayList<>(); + for (String argument : prepared.arguments) lines.add(quoteArgumentFile(argument)); + java.nio.charset.Charset encoding = java.nio.charset.Charset.forName(System.getProperty("native.encoding", java.nio.charset.Charset.defaultCharset().name())); + Files.write(argumentsFile, lines, encoding); + command = java.util.Arrays.asList(prepared.executable.toString(), "@" + argumentsFile); + } catch (IOException | RuntimeException e) { Files.deleteIfExists(argumentsFile); throw e; } + } + final Path cleanup = argumentsFile; + try { + Process process = new ProcessBuilder(command).directory(prepared.gameDir.toFile()).redirectErrorStream(true) + .redirectOutput(ProcessBuilder.Redirect.appendTo(logs.resolve("autoplug-launcher.log").toFile())).start(); + if (cleanup != null) { + cleanup.toFile().deleteOnExit(); + // A non-daemon session thread also makes one-shot CLI launches wait for their + // client and guarantees cleanup before normal JVM shutdown. A daemon future can + // be lost when the launching CLI exits immediately after the game does. + Thread cleanupThread = new Thread(() -> { + try { process.waitFor(); } + catch (InterruptedException e) { Thread.currentThread().interrupt(); } + finally { try { Files.deleteIfExists(cleanup); } catch (IOException ignored) { /* deleteOnExit remains registered */ } } + }, "Minecraft session cleanup"); + cleanupThread.setDaemon(false); + cleanupThread.start(); + } + return process; + } catch (IOException e) { if (cleanup != null) Files.deleteIfExists(cleanup); throw e; } + } + + static String quoteArgumentFile(String argument) { + return "\"" + argument.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t") + "\""; + } + + /** Resolves metadata only, without downloading Minecraft assets or installing Java. */ + public int requiredJavaMajor(String gameVersion, Consumer progress) throws IOException { + return requiredJava(version(LaunchRequest.safeVersion(gameVersion), progress == null ? value -> { } : progress)); + } + + public JsonObject getVersionMetadata(String gameVersion, Consumer progress) throws IOException { + return version(LaunchRequest.safeVersion(gameVersion), progress == null ? value -> { } : progress).deepCopy(); + } + + /** Installs dedicated Quilt/Forge/NeoForge servers without starting them or accepting their EULA. */ + public synchronized PreparedLaunch prepareServer(String gameVersion, String loader, String loaderVersion, + Path worldDirectory, Consumer progress) throws Exception { + String version = LaunchRequest.safeVersion(gameVersion); + Consumer log = progress == null ? value -> { } : progress; + JsonObject metadata = version(version, log); + int major = requiredJava(metadata); + Path java = runtimes.resolve(major, log); + return loaders.server(version, loader.toUpperCase(Locale.ROOT), loaderVersion, worldDirectory.toAbsolutePath().normalize(), java, major, log); + } + + JsonObject version(String requested, Consumer progress) throws IOException { + Path versions = cacheRoot.resolve("versions"); + Path destination = LauncherFiles.child(versions, safeId(requested) + "/" + safeId(requested) + ".json"); + JsonObject manifest; + Path cachedManifest = cacheRoot.resolve("version_manifest_v2.json"); + try { + manifest = LauncherFiles.json(manifestUrl); + LauncherFiles.writeJson(cachedManifest, manifest); + } catch (IOException e) { + if (Files.exists(cachedManifest)) manifest = LauncherFiles.readJson(cachedManifest); + else if (Files.exists(destination)) return LauncherFiles.readJson(destination); + else throw e; + } + for (JsonElement value : manifest.getAsJsonArray("versions")) { + JsonObject entry = value.getAsJsonObject(); + if (!entry.get("id").getAsString().equals(requested)) continue; + LauncherFiles.download(entry.get("url").getAsString(), destination, string(entry, "sha1", null), -1, progress); + JsonObject result = LauncherFiles.readJson(destination); + if (!result.get("id").getAsString().equals(requested)) throw new IOException("Minecraft metadata version mismatch."); + return result; + } + throw new IOException("Minecraft version not found: " + requested); + } + static int requiredJava(JsonObject metadata) { + return metadata.has("javaVersion") ? metadata.getAsJsonObject("javaVersion").get("majorVersion").getAsInt() : 8; + } + private Path downloadClient(JsonObject metadata, String id, Consumer progress) throws IOException { + if (!metadata.has("downloads") || !metadata.getAsJsonObject("downloads").has("client")) + throw new IOException("This Minecraft version does not publish a client download."); + Path jar = LauncherFiles.child(cacheRoot.resolve("versions"), safeId(id) + "/" + safeId(id) + ".jar"); + return download(metadata.getAsJsonObject("downloads").getAsJsonObject("client"), jar, progress); + } + static Path download(JsonObject descriptor, Path path, Consumer progress) throws IOException { + return LauncherFiles.download(descriptor.get("url").getAsString(), path, string(descriptor, "sha1", null), + descriptor.has("size") ? descriptor.get("size").getAsLong() : -1, progress); + } + static Path clientJarForProfile(Path vanillaJar, JsonObject metadata, Path cache) throws IOException { + if (!metadata.has("inheritsFrom")) return vanillaJar; + // The effective version jar name must match ${version_name}. Forge/NeoForge's + // module bootstrap ignore list uses that name to exclude the unpatched vanilla jar. + String id = safeId(metadata.get("id").getAsString()); + Path jar = LauncherFiles.child(cache.resolve("versions"), id + "/" + id + ".jar"); + linkOrCopy(vanillaJar, jar); + return jar; + } + List libraries(JsonObject metadata, Path natives, Consumer progress) throws IOException { + List classpath = new ArrayList<>(); + if (!metadata.has("libraries")) return classpath; + for (JsonElement entry : metadata.getAsJsonArray("libraries")) { + JsonObject library = entry.getAsJsonObject(); + if (!allowed(library, Collections.emptyMap())) continue; + JsonObject downloads = library.has("downloads") ? library.getAsJsonObject("downloads") : new JsonObject(); + if (downloads.has("artifact")) { + JsonObject artifact = downloads.getAsJsonObject("artifact"); + classpath.add(download(artifact, LauncherFiles.child(cacheRoot.resolve("libraries"), artifact.get("path").getAsString()), progress)); + } else if (!library.has("natives") || !downloads.has("classifiers")) { + String relative = mavenPath(library.get("name").getAsString()); + String base = string(library, "url", "https://libraries.minecraft.net/"); + Path artifact = LauncherFiles.child(cacheRoot.resolve("libraries"), relative); + if (base.isEmpty()) { + if (!Files.isRegularFile(artifact)) throw new IOException("Loader installer did not generate required library " + relative); + classpath.add(artifact); + } else classpath.add(LauncherFiles.download(base + (base.endsWith("/") ? "" : "/") + relative, artifact, + string(library, "sha1", null), library.has("size") ? library.get("size").getAsLong() : -1, progress)); + } + if (library.has("natives") && library.getAsJsonObject("natives").has(osName())) { + String classifier = library.getAsJsonObject("natives").get(osName()).getAsString() + .replace("${arch}", System.getProperty("os.arch").contains("64") ? "64" : "32"); + if (!downloads.has("classifiers") || !downloads.getAsJsonObject("classifiers").has(classifier)) + throw new IOException("Native library missing for " + osName() + ": " + library.get("name").getAsString()); + JsonObject nativeArtifact = downloads.getAsJsonObject("classifiers").getAsJsonObject(classifier); + Path jar = download(nativeArtifact, LauncherFiles.child(cacheRoot.resolve("libraries"), nativeArtifact.get("path").getAsString()), progress); + List exclusions = new ArrayList<>(); exclusions.add("META-INF/"); + if (library.has("extract") && library.getAsJsonObject("extract").has("exclude")) + for (JsonElement exclude : library.getAsJsonObject("extract").getAsJsonArray("exclude")) exclusions.add(exclude.getAsString()); + extractNatives(jar, natives, exclusions); + } + } + return classpath; + } + private String assets(JsonObject metadata, Path assets, Path gameDir, Consumer progress) throws IOException { + if (!metadata.has("assetIndex")) return string(metadata, "assets", "legacy"); + JsonObject descriptor = metadata.getAsJsonObject("assetIndex"); + String id = descriptor.get("id").getAsString(); + Path index = LauncherFiles.child(assets.resolve("indexes"), safeId(id) + ".json"); + download(descriptor, index, progress); + JsonObject data = LauncherFiles.readJson(index); + boolean virtual = data.has("virtual") && data.get("virtual").getAsBoolean(); + boolean resources = data.has("map_to_resources") && data.get("map_to_resources").getAsBoolean(); + int total = data.getAsJsonObject("objects").size(); + java.util.concurrent.ExecutorService executor = java.util.concurrent.Executors.newFixedThreadPool(8, task -> { + Thread thread = new Thread(task, "Minecraft asset download"); thread.setDaemon(true); return thread; + }); + java.util.concurrent.CompletionService completion = new java.util.concurrent.ExecutorCompletionService<>(executor); + List> downloads = new ArrayList<>(); + try { + for (Map.Entry entry : data.getAsJsonObject("objects").entrySet()) { + downloads.add(completion.submit(() -> { + JsonObject object = entry.getValue().getAsJsonObject(); + String hash = object.get("hash").getAsString(); + if (!hash.matches("[0-9a-fA-F]{40}")) throw new IOException("Invalid asset hash."); + String relative = hash.substring(0, 2) + "/" + hash; + Path artifact = LauncherFiles.download("https://resources.download.minecraft.net/" + relative, + LauncherFiles.child(assets.resolve("objects"), relative), hash, object.get("size").getAsLong(), ignored -> { }); + if (virtual) linkOrCopy(artifact, LauncherFiles.child(assets.resolve("virtual").resolve(safeId(id)), entry.getKey())); + if (resources) linkOrCopy(artifact, LauncherFiles.child(gameDir.resolve("resources"), entry.getKey())); + return null; + })); + } + for (int done = 1; done <= total; done++) { + completion.take().get(); + if (done % 100 == 0 || done == total) progress.accept("Minecraft assets: " + done + "/" + total); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new java.io.InterruptedIOException("Minecraft preparation cancelled."); + } catch (java.util.concurrent.ExecutionException e) { + if (e.getCause() instanceof IOException) throw (IOException) e.getCause(); + throw new IOException("Minecraft asset preparation failed.", e.getCause()); + } finally { + for (java.util.concurrent.Future task : downloads) if (!task.isDone()) task.cancel(true); + executor.shutdownNow(); + } + return id; + } + static void linkOrCopy(Path source, Path target) throws IOException { + if (Files.exists(target) && (Files.isSameFile(source, target) || (Files.size(target) == Files.size(source) + && com.osiris.autoplug.client.utils.UtilsCrypto.fastSHA1(source.toFile()).equals(com.osiris.autoplug.client.utils.UtilsCrypto.fastSHA1(target.toFile()))))) return; + Files.createDirectories(target.getParent()); + Files.deleteIfExists(target); + try { Files.createLink(target, source); } + catch (IOException | UnsupportedOperationException e) { Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); } + } + static void extractNatives(Path jar, Path target, List exclusions) throws IOException { + try (java.util.zip.ZipFile zip = new java.util.zip.ZipFile(jar.toFile())) { + java.util.Enumeration entries = zip.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String name = entry.getName(); + if (entry.isDirectory() || exclusions.stream().anyMatch(name::startsWith)) continue; + Path output = LauncherFiles.child(target, name); + if (sameNative(output, entry)) continue; + Files.createDirectories(output.getParent()); + try (java.io.InputStream input = zip.getInputStream(entry)) { Files.copy(input, output, StandardCopyOption.REPLACE_EXISTING); } + } + } + } + private static boolean sameNative(Path output, ZipEntry entry) throws IOException { + if (!Files.isRegularFile(output) || Files.size(output) != entry.getSize()) return false; + java.util.zip.CRC32 crc = new java.util.zip.CRC32(); + try (java.io.InputStream input = Files.newInputStream(output)) { + byte[] buffer = new byte[65536]; int size; + while ((size = input.read(buffer)) != -1) crc.update(buffer, 0, size); + } + return crc.getValue() == entry.getCrc(); + } + static List buildArguments(JsonObject metadata, LaunchRequest request, List classpath, + Path natives, Path assets, String assetId, Path logging) throws Exception { + Map values = new HashMap<>(); + String id = metadata.get("id").getAsString(); + values.put("auth_player_name", request.account.username); values.put("version_name", id); + values.put("game_directory", request.gameDir.toString()); values.put("assets_root", assets.toString()); + values.put("assets_index_name", assetId); values.put("auth_uuid", request.account.uuid); + values.put("auth_access_token", request.account.accessToken); values.put("auth_session", request.account.accessToken); + values.put("auth_xuid", request.account.xuid); values.put("clientid", request.account.clientId); + values.put("user_type", request.account.offline ? "legacy" : "msa"); values.put("user_properties", "{}"); + values.put("profile_properties", "{}"); values.put("version_type", string(metadata, "type", "release")); + values.put("natives_directory", natives.toString()); values.put("launcher_name", "AutoPlug"); + values.put("launcher_version", "10.2.0"); values.put("classpath_separator", File.pathSeparator); + values.put("library_directory", assets.getParent().resolve("libraries").toString()); + values.put("game_assets", assets.resolve("virtual").resolve(assetId).toString()); + List classpathStrings = new ArrayList<>(); for (Path path : classpath) classpathStrings.add(path.toString()); + values.put("classpath", String.join(File.pathSeparator, classpathStrings)); + boolean quickPlay = request.serverHost != null && metadata.has("arguments") + && metadata.getAsJsonObject("arguments").toString().contains("${quickPlayMultiplayer}"); + Map features = new HashMap<>(); + features.put("is_quick_play_multiplayer", quickPlay); + features.put("has_quick_plays_support", quickPlay); + if (quickPlay) { + String host = request.serverHost.contains(":") && !request.serverHost.startsWith("[") ? "[" + request.serverHost + "]" : request.serverHost; + values.put("quickPlayMultiplayer", host + ":" + request.serverPort); + values.put("quickPlayPath", request.gameDir.resolve("logs").resolve("quick-play.json").toString()); + } + List args = new ArrayList<>(); + args.add("-Xmx2G"); + if (metadata.has("arguments") && metadata.getAsJsonObject("arguments").has("jvm")) + expand(metadata.getAsJsonObject("arguments").getAsJsonArray("jvm"), values, features, args); + else { + if (osName().equals("osx")) args.add("-XstartOnFirstThread"); + args.add("-Djava.library.path=" + natives); args.add("-cp"); args.add(values.get("classpath")); + } + if (logging != null) { + String argument = metadata.getAsJsonObject("logging").getAsJsonObject("client").get("argument").getAsString(); + args.add(argument.replace("${path}", logging.toString())); + } + args.add(metadata.get("mainClass").getAsString()); + if (metadata.has("arguments") && metadata.getAsJsonObject("arguments").has("game")) + expand(metadata.getAsJsonObject("arguments").getAsJsonArray("game"), values, features, args); + else if (metadata.has("minecraftArguments")) { + for (String argument : new UtilsString().splitBySpacesAndQuotes(metadata.get("minecraftArguments").getAsString())) + args.add(substitute(argument, values)); + } else throw new IOException("Minecraft metadata has no game launch arguments."); + if (request.serverHost != null && !quickPlay) { + args.add("--server"); args.add(request.serverHost); args.add("--port"); args.add(Integer.toString(request.serverPort)); + } + return args; + } + private static void expand(JsonArray array, Map values, Map features, List output) throws IOException { + for (JsonElement item : array) { + if (item.isJsonPrimitive()) output.add(substitute(item.getAsString(), values)); + else { + JsonObject argument = item.getAsJsonObject(); + if (!allowed(argument, features)) continue; + JsonElement value = argument.get("value"); + if (value.isJsonArray()) for (JsonElement element : value.getAsJsonArray()) output.add(substitute(element.getAsString(), values)); + else output.add(substitute(value.getAsString(), values)); + } + } + } + static String substitute(String argument, Map values) throws IOException { + Matcher matcher = Pattern.compile("\\$\\{([^}]+)}").matcher(argument); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + String value = values.get(matcher.group(1)); + if (value == null) throw new IOException("Unsupported Minecraft launch parameter: " + matcher.group(1)); + matcher.appendReplacement(result, Matcher.quoteReplacement(value)); + } + matcher.appendTail(result); + return result.toString(); + } + static boolean allowed(JsonObject object, Map features) { + if (!object.has("rules")) return true; + boolean allow = false; + for (JsonElement value : object.getAsJsonArray("rules")) { + JsonObject rule = value.getAsJsonObject(); + if (rule.has("os")) { + JsonObject os = rule.getAsJsonObject("os"); + if (os.has("name") && !os.get("name").getAsString().equals(osName())) continue; + if (os.has("arch") && !System.getProperty("os.arch").matches(os.get("arch").getAsString())) continue; + if (os.has("version") && !Pattern.compile(os.get("version").getAsString()).matcher(System.getProperty("os.version")).find()) continue; + } + boolean matches = true; + if (rule.has("features")) for (Map.Entry feature : rule.getAsJsonObject("features").entrySet()) + if (features.getOrDefault(feature.getKey(), false) != feature.getValue().getAsBoolean()) { matches = false; break; } + if (matches) allow = rule.get("action").getAsString().equals("allow"); + } + return allow; + } + static JsonObject merge(JsonObject parent, JsonObject child) { + JsonObject merged = parent.deepCopy(); + for (Map.Entry field : child.entrySet()) { + if (field.getKey().equals("libraries")) { + Map libraries = new LinkedHashMap<>(); + for (JsonElement value : parent.getAsJsonArray("libraries")) libraries.put(libraryKey(value), value); + for (JsonElement value : field.getValue().getAsJsonArray()) libraries.put(libraryKey(value), value); + JsonArray array = new JsonArray(); libraries.values().forEach(array::add); merged.add("libraries", array); + } else if (field.getKey().equals("arguments")) { + JsonObject args = parent.has("arguments") ? parent.getAsJsonObject("arguments").deepCopy() : new JsonObject(); + for (Map.Entry arg : field.getValue().getAsJsonObject().entrySet()) { + JsonArray array = args.has(arg.getKey()) ? args.getAsJsonArray(arg.getKey()) : new JsonArray(); + for (JsonElement value : arg.getValue().getAsJsonArray()) array.add(value); + args.add(arg.getKey(), array); + } + merged.add("arguments", args); + } else merged.add(field.getKey(), field.getValue().deepCopy()); + } + return merged; + } + private static String libraryKey(JsonElement value) { + String[] parts = value.getAsJsonObject().get("name").getAsString().split(":"); + return parts[0] + ":" + parts[1] + (parts.length > 3 ? ":" + parts[3] : ""); + } + static String mavenPath(String coordinate) throws IOException { + String[] extension = coordinate.split("@", 2); + String[] parts = extension[0].split(":"); + if (parts.length < 3 || parts.length > 4) throw new IOException("Invalid Maven artifact: " + coordinate); + for (String part : parts) if (part.isEmpty() || part.contains("/") || part.contains("\\") || part.contains("..")) + throw new IOException("Invalid Maven artifact: " + coordinate); + String suffix = extension.length == 2 ? extension[1] : "jar"; + if (!suffix.matches("[A-Za-z0-9]+")) throw new IOException("Invalid artifact extension."); + return parts[0].replace('.', '/') + "/" + parts[1] + "/" + parts[2] + "/" + parts[1] + "-" + parts[2] + + (parts.length == 4 ? "-" + parts[3] : "") + "." + suffix; + } + static String osName() { + String value = System.getProperty("os.name").toLowerCase(Locale.ROOT); + return value.contains("win") ? "windows" : value.contains("mac") ? "osx" : "linux"; + } + static String safeId(String id) { return LaunchRequest.safeVersion(id); } + static String string(JsonObject object, String key, String fallback) { return object.has(key) && !object.get(key).isJsonNull() ? object.get(key).getAsString() : fallback; } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java b/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java new file mode 100644 index 00000000..19ecabcd --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java @@ -0,0 +1,40 @@ +package com.osiris.autoplug.client.launcher; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Fully resolved command; argument boundaries are retained, including paths with spaces. */ +public final class PreparedLaunch { + public final Path executable; + public final Path gameDir; + public final List arguments; + public final String version; + public final int javaMajor; + + public PreparedLaunch(Path executable, Path gameDir, List arguments, String version, int javaMajor) { + this.executable = executable.toAbsolutePath().normalize(); + this.gameDir = gameDir.toAbsolutePath().normalize(); + this.arguments = Collections.unmodifiableList(new ArrayList<>(arguments)); + this.version = version; + this.javaMajor = javaMajor; + } + public List command() { + List result = new ArrayList<>(); + result.add(executable.toString()); + result.addAll(arguments); + return result; + } + public List redactedCommand() { + List result = command(); + for (int i = 0; i + 1 < result.size(); i++) { + if (result.get(i).equals("--accessToken") || result.get(i).equals("--session")) result.set(++i, ""); + } + return result; + } + public Path getExecutable() { return executable; } + public Path getGameDir() { return gameDir; } + public List getArguments() { return arguments; } + @Override public String toString() { return redactedCommand().toString(); } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ArtifactCache.java b/src/main/java/com/osiris/autoplug/client/profiles/ArtifactCache.java new file mode 100644 index 00000000..ac5398dc --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ArtifactCache.java @@ -0,0 +1,59 @@ +package com.osiris.autoplug.client.profiles; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** Content-addressed, immutable JAR cache. Replacements never write through existing links. */ +public class ArtifactCache { + private final Path root; + public ArtifactCache(Path root) throws IOException { this.root = root.toAbsolutePath().normalize(); Files.createDirectories(this.root); } + public Path getRoot() { return root; } + public Path store(Path source) throws IOException { + String hash = digest(source); + Path target = root.resolve("jars").resolve(hash.substring(0, 2)).resolve(hash + ".jar"); + Files.createDirectories(target.getParent()); + if (!Files.exists(target)) { + Path tmp = Files.createTempFile(target.getParent(), "artifact-", ".tmp"); + try { + Files.copy(source, tmp, StandardCopyOption.REPLACE_EXISTING); + if (!hash.equals(digest(tmp))) throw new IOException("Artifact changed while being cached"); + try { Files.move(tmp, target, StandardCopyOption.ATOMIC_MOVE); } + catch (FileAlreadyExistsException e) { /* Another process cached identical bytes. */ } + catch (AtomicMoveNotSupportedException e) { Files.move(tmp, target, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(tmp); } + } else if (!hash.equals(digest(target))) throw new IOException("Cached artifact failed integrity check: " + target); + return target; + } + public void link(Path cached, Path destination) throws IOException { + if (!cached.toAbsolutePath().normalize().startsWith(root) || Files.isSymbolicLink(cached)) + throw new IOException("Artifact is outside the cache"); + Files.createDirectories(destination.getParent()); + Path temp = Files.createTempFile(destination.getParent(), ".link-", ".tmp"); + Files.delete(temp); + try { + try { Files.createLink(temp, cached); } + catch (IOException | UnsupportedOperationException e) { + // Symlinks need privileges on some Windows installations; copies are the portable fallback. + try { Files.createSymbolicLink(temp, cached); } + catch (IOException | UnsupportedOperationException denied) { Files.copy(cached, temp); } + } + try { Files.move(temp, destination, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(temp, destination, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temp); } + } + public String digest(Path file) throws IOException { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + try (InputStream in = Files.newInputStream(file)) { + byte[] buf = new byte[65536]; int n; + while ((n = in.read(buf)) != -1) md.update(buf, 0, n); + } + StringBuilder out = new StringBuilder(); + for (byte b : md.digest()) out.append(String.format("%02x", b & 255)); + return out.toString(); + } catch (NoSuchAlgorithmException e) { throw new IllegalStateException(e); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/CollectionEntry.java b/src/main/java/com/osiris/autoplug/client/profiles/CollectionEntry.java new file mode 100644 index 00000000..1d406d47 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/CollectionEntry.java @@ -0,0 +1,8 @@ +package com.osiris.autoplug.client.profiles; + +/** Provider identity belongs to the collection, not a global updater configuration. */ +public class CollectionEntry { + public String file, name, version, author, modrinthId, curseforgeId, githubRepo, githubAsset, customCheckUrl, customDownloadUrl; + public int spigotId, bukkitId; + public boolean excluded; +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/JsonFiles.java b/src/main/java/com/osiris/autoplug/client/profiles/JsonFiles.java new file mode 100644 index 00000000..191b040d --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/JsonFiles.java @@ -0,0 +1,31 @@ +package com.osiris.autoplug.client.profiles; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; + +/** Atomic metadata replacement prevents a crash from truncating the previous configuration. */ +public class JsonFiles { + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + public T read(Path path, Class type) throws IOException { + if (Files.size(path) > 8 * 1024 * 1024) throw new IOException("Metadata exceeds 8 MiB: " + path); + try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { + T result = gson.fromJson(reader, type); + if (result == null) throw new IOException("Empty metadata: " + path); + return result; + } catch (com.google.gson.JsonParseException e) { throw new IOException("Invalid metadata: " + path, e); } + } + public void write(Path path, Object value) throws IOException { + Files.createDirectories(path.getParent()); + Path tmp = Files.createTempFile(path.getParent(), ".metadata-", ".tmp"); + try { + try (Writer writer = Files.newBufferedWriter(tmp, StandardCharsets.UTF_8)) { gson.toJson(value, writer); } + try { Files.move(tmp, path, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(tmp, path, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(tmp); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java new file mode 100644 index 00000000..623db4c6 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java @@ -0,0 +1,136 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.browser.SavedServer; +import com.osiris.autoplug.client.browser.ServerAddress; +import com.osiris.autoplug.client.ui.LauncherActions; +import java.io.IOException; +import java.nio.file.*; +import java.util.*; +import java.util.function.Consumer; + +/** CLI and GUI call the same application services; arguments containing dots remain intact. */ +public class LauncherCommands { + private final LauncherServices services; + private final Consumer output; + public LauncherCommands(LauncherServices services, Consumer output) { this.services = services; this.output = output; } + public boolean handles(List args) { + if (args.isEmpty()) return false; + return args.get(0).equals(".profiles") || args.get(0).equals(".mc") + || (args.get(0).equals(".check") || args.get(0).equals(".update")) && args.contains("--profile"); + } + public void execute(List args) throws Exception { + if (!handles(args)) throw new IOException("Not a profile or Minecraft launcher command"); + if (args.get(0).equals(".profiles")) profiles(args); + else if (args.get(0).equals(".mc")) minecraft(args); + else { + String id = option(args, "--profile", null); require(id, "--profile is required"); + String collection = at(args, 1, "mods or plugins is required"); + Profile profile = services.getProfiles().get(id); + if (!collection.equals(profile.type.collectionDirectory())) throw new IOException("Collection type does not match the selected profile"); + if (args.get(0).equals(".check")) output.accept(services.checkProfile(id)); + else { + output.accept(services.checkProfile(id)); + if (profile.migrationPending && !args.contains("--yes")) throw new IOException("Review .check " + collection + " --profile " + id + " then repeat .update with --yes to confirm migration"); + output.accept(services.updateProfile(id)); + } + } + } + private void profiles(List args) throws Exception { + String verb = at(args, 1, help()); + switch (verb) { + case "list": + String type = option(args, "--type", null); + for (LauncherActions.ProfileInfo p : services.profiles()) if (type == null || normalizeType(type).equals(p.type)) + output.accept(p.id + " | " + p.name + " | " + p.type + " | " + p.gameVersion + " | " + p.loader + (p.template ? " | template" : "") + (p.launchable ? "" : " | migration pending")); + break; + case "create": + LauncherActions.ProfileInfo created = services.createProfile(at(args, 2, "Name required"), at(args, 3, "Game version required"), at(args, 4, "Loader required"), normalizeType(option(args, "--type", "mods")), args.contains("--template")); + output.accept("Created " + created.id + " in " + created.directory); break; + case "clone": + String id = at(args, 2, "Source id required"), version = at(args, 3, "Target game version required"); + Profile source = services.getProfiles().get(id); + LauncherActions.ProfileInfo cloned = services.cloneProfile(id, option(args, "--name", source.name + " " + version), version, option(args, "--loader", source.loader)); + output.accept("Cloned " + cloned.id + "\n" + cloned.migrationSummary); + if (!cloned.launchable && args.contains("--yes")) output.accept(services.updateProfile(cloned.id)); + else if (!cloned.launchable) output.accept("Review this plan and use .update " + source.type.collectionDirectory() + " --profile " + cloned.id + " --yes to finish migration."); + break; + case "delete": + if (!args.contains("--yes")) throw new IOException("Repeat with --yes to move this profile into recoverable trash"); + services.deleteProfile(at(args, 2, "Profile id required")); output.accept("Profile moved to trash."); break; + case "template": services.setTemplate(at(args, 2, "Profile id required"), !args.contains("--off")); output.accept("Template updated."); break; + case "add": + services.addArtifact(at(args, 2, "Profile id required"), Paths.get(at(args, 3, "JAR path required")), option(args, "--modrinth", null)); + output.accept("Artifact added to profile collection."); break; + default: throw new IOException(help()); + } + } + private void minecraft(List args) throws Exception { + String verb = at(args, 1, help()); + switch (verb) { + case "launch": + String host = option(args, "--server", null); int port = Integer.parseInt(option(args, "--port", "25565")); + if (host != null) { ServerAddress address = ServerAddress.parse(host); host = address.host; if (!args.contains("--port")) port = address.port; } + services.launchProfile(at(args, 2, "Client profile id required"), host, port); break; + case "servers": + String action = at(args, 2, "Use .mc servers list, import, or add "); + if (action.equals("list")) { + services.getServers().importVanilla(); + for (SavedServer s : services.getServers().list()) { + com.osiris.autoplug.client.browser.ServerStatus ping = services.getServers().ping(s); + output.accept(s.name + " | " + s.address + " | " + (ping.online ? ping.version + " | " + ping.players + "/" + ping.capacity + " | " + ping.latency + " ms | " + ping.motd : ping.message)); + } + } + else if (action.equals("import")) output.accept("Imported " + services.getServers().importVanilla() + " servers."); + else if (action.equals("add")) services.getServers().add(at(args, 3, "Name required"), at(args, 4, "Address required")); + else throw new IOException("Unknown server action"); break; + case "worlds": worlds(args); break; + case "account": + if (at(args, 2, "Use offline or microsoft ").equals("offline")) services.useOfflineAccount(at(args, 3, "Offline name required")); + else if (args.get(2).equals("microsoft")) { + LauncherActions.SettingsInfo settings = services.settings(); settings.microsoftClientId = at(args, 3, "Registered Microsoft application client ID required"); + settings.rememberAccount = args.contains("--remember"); services.saveSettings(settings); services.signInMicrosoft(output); + } else throw new IOException("Unknown account action"); + break; + default: throw new IOException(help()); + } + } + private void worlds(List args) throws Exception { + String action = at(args, 2, "Use .mc worlds list/create/launch/share/stop"); + switch (action) { + case "list": for (LauncherActions.WorldInfo w : services.worlds()) output.accept(w.id + " | " + w.name + " | " + (w.running ? "running" : "stopped")); break; + case "create": + LauncherActions.WorldInfo w = services.createWorld(at(args, 3, "Name required"), at(args, 4, "Server profile id required"), at(args, 5, "Client profile id required")); + if (args.contains("--accept-eula")) services.setWorldEulaAccepted(w.id, true); + output.accept("Created world " + w.id + (args.contains("--accept-eula") ? "" : "; EULA acceptance required before launch (https://aka.ms/MinecraftEULA).")); break; + case "launch": + String id = at(args, 3, "World id required"); if (args.contains("--accept-eula")) services.setWorldEulaAccepted(id, true); + services.launchWorld(id, args.contains("--share")); break; + case "share": output.accept(services.shareWorld(at(args, 3, "World id required"))); break; + case "stop": services.getWorldService().stopWorld(at(args, 3, "World id required")); break; + default: throw new IOException("Unknown world action"); + } + } + public String help() { + return ".profiles list/create/clone/delete/template/add; .check|.update mods|plugins --profile ; " + + ".mc launch [--server host[:port]]; .mc servers list/import/add; " + + ".mc worlds list/create/launch/share/stop; .mc account offline|microsoft"; + } + private String normalizeType(String value) { return value.toUpperCase(Locale.ROOT).replace('-', '_'); } + private String option(List args, String option, String fallback) throws IOException { + int index = args.indexOf(option); return index < 0 ? fallback : at(args, index + 1, option + " requires a value"); + } + private String at(List args, int index, String message) throws IOException { if (index >= args.size() || args.get(index).startsWith("--")) throw new IOException(message); return args.get(index); } + private void require(String value, String message) throws IOException { if (value == null || value.isEmpty()) throw new IOException(message); } + /** Quoting for interactive console input; argv passed to main needs no re-tokenization. */ + public List tokenize(String input) throws IOException { + List result = new ArrayList<>(); StringBuilder token = new StringBuilder(); char quote = 0; boolean started = false; + for (int i = 0; i < input.length(); i++) { + char c = input.charAt(i); + if (quote != 0) { if (c == quote) quote = 0; else token.append(c); started = true; } + else if (c == '"' || c == '\'') { quote = c; started = true; } + else if (Character.isWhitespace(c)) { if (started) { result.add(token.toString()); token.setLength(0); started = false; } } + else { token.append(c); started = true; } + } + if (quote != 0) throw new IOException("Unclosed quote"); if (started) result.add(token.toString()); return result; + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherEntry.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherEntry.java new file mode 100644 index 00000000..c64f9737 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherEntry.java @@ -0,0 +1,28 @@ +package com.osiris.autoplug.client.profiles; + +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +/** Standalone commands do not initialize the legacy server or network services. */ +public class LauncherEntry { + public boolean isLauncherCommand(String[] args) { + if (args == null || args.length == 0) return false; + List list = Arrays.asList(args); + return args[0].equals(".profiles") || args[0].equals(".mc") || (args[0].equals(".check") || args[0].equals(".update")) && list.contains("--profile"); + } + public int run(String[] args) { + java.nio.file.Path root = Paths.get(System.getProperty("autoplug.home", System.getProperty("user.home") + "/.autoplug")); + try { + java.nio.file.Files.createDirectories(root.resolve("logs")); + com.osiris.jlib.logger.AL.start("AP", false, root.resolve("logs/launcher.log").toFile(), true, false); + } catch (Exception e) { System.err.println("Could not initialize launcher logging: " + e.getMessage()); return 1; } + try (LauncherServices services = new LauncherServices(root, System.out::println)) { + Thread hook = new Thread(services::close, "launcher-cleanup"); Runtime.getRuntime().addShutdownHook(hook); + try { + new LauncherCommands(services, System.out::println).execute(Arrays.asList(args)); services.waitForSessions(); return 0; + } finally { Runtime.getRuntime().removeShutdownHook(hook); } + } catch (Exception e) { System.err.println("AutoPlug: " + e.getMessage()); return 1; } + finally { com.osiris.jlib.logger.AL.stop(); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java new file mode 100644 index 00000000..3a2404e8 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java @@ -0,0 +1,223 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.browser.ServerBrowserService; +import com.osiris.autoplug.client.launcher.*; +import com.osiris.autoplug.client.ui.LauncherActions; +import com.osiris.autoplug.client.worlds.*; +import java.io.IOException; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; +import java.util.zip.ZipFile; + +/** Application boundary shared by the dashboard and CLI. */ +public class LauncherServices implements LauncherActions, AutoCloseable { + public class State { + public SettingsInfo settings = new SettingsInfo(); + public String offlineName = "Player", selectedAccount = ""; + } + private final Path root; + private final Consumer progress; + private final ProfileStore profiles; + private final ProfileUpdates updates; + private final WorldStore worlds; + private final WorldService worldService; + private final ServerBrowserService servers; + private final JavaRuntimeManager runtimes; + private final MinecraftLauncher launcher; + private final AccountStore accounts; + private final MicrosoftAccountService microsoft = new MicrosoftAccountService(); + private final Map clients = new ConcurrentHashMap<>(); + private final Map plans = new ConcurrentHashMap<>(); + private final JsonFiles json = new JsonFiles(); + private State state; + private volatile MinecraftAccount account; + // World preparation and its client callback run on the requesting worker. Keep + // its identity stable if a settings worker switches accounts during installation. + private final ThreadLocal worldAccount = new ThreadLocal<>(); + + public LauncherServices(Path root, Consumer progress) throws Exception { + this.root = root.toAbsolutePath().normalize(); this.progress = progress == null ? ignored -> { } : progress; + Files.createDirectories(this.root); + profiles = new ProfileStore(this.root.resolve("profiles")); updates = new ProfileUpdates(profiles); + worlds = new WorldStore(this.root.resolve("worlds")); + runtimes = new JavaRuntimeManager(this.root.resolve("cache/runtimes")); + launcher = new MinecraftLauncher(this.root.resolve("cache"), runtimes); + accounts = new AccountStore(this.root.resolve("accounts.json")); + state = Files.exists(this.root.resolve("settings.json")) ? json.read(this.root.resolve("settings.json"), State.class) : new State(); + if (state.settings == null) state.settings = new SettingsInfo(); + if (state.settings.javaPaths == null) state.settings.javaPaths = new LinkedHashMap<>(); + account = MinecraftAccount.offline(state.offlineName == null ? "Player" : state.offlineName); + if (state.settings.rememberAccount) for (MinecraftAccount saved : accounts.list()) if (saved.uuid.equals(state.selectedAccount)) account = saved; + if (!state.settings.rememberAccount) forgetStoredAccounts(); + applyRuntimeSettings(state.settings); + servers = new ServerBrowserService(this.root.resolve("servers.json"), ServerBrowserService.defaults().vanillaFile()); + MinecraftServerInstaller installer = new MinecraftServerInstaller(profiles.getCache(), + version -> runtimes.resolve(launcher.requiredJavaMajor(version, this.progress), this.progress), this.progress, + (profile, directory) -> { + PreparedLaunch prepared = launcher.prepareServer(profile.gameVersion, profile.loader, profile.loaderVersion, directory, this.progress); + return new ServerLaunch(prepared.command(), prepared.gameDir); + }); + worldService = new WorldService(profiles, worlds, installer, (profile, host, port) -> launchClient(profile.id, host, port)); + worldService.setPreferredPort(state.settings.port); + worldService.setSharingEnabled(state.settings.upnp); + } + public Path getRoot() { return root; } + public ProfileStore getProfiles() { return profiles; } + public WorldService getWorldService() { return worldService; } + public ServerBrowserService getServers() { return servers; } + @Override public List profiles() throws Exception { + List result = new ArrayList<>(); for (Profile p : profiles.list()) result.add(info(p)); return result; + } + @Override public ProfileInfo createProfile(String name, String version, String loader, String type, boolean template) throws Exception { + Profile p = profiles.create(name, version, loader, ProfileType.valueOf(type.toUpperCase(Locale.ROOT).replace('-', '_'))); + p.template = template; profiles.save(p); return info(p); + } + @Override public ProfileInfo cloneProfile(String sourceId, String name, String targetVersion, String loader) throws Exception { + requireIdle(sourceId); + Profile p = profiles.cloneProfile(sourceId, name, targetVersion, loader); + if (p.migrationPending) { p.migrationSummary = checkProfile(p.id); profiles.save(p); } + return info(p); + } + @Override public void deleteProfile(String id) throws Exception { + requireIdle(id); + for (VirtualWorld w : worlds.list()) if (id.equals(w.serverProfileId) || id.equals(w.clientProfileId)) + throw new IOException("Profile is referenced by world '" + w.name + "'. Change or remove that world first."); + profiles.delete(id); plans.remove(id); + } + @Override public String checkProfile(String id) throws Exception { + requireIdle(id); ProfileUpdates.Plan plan = updates.check(id); plans.put(id, plan); return plan.summary(); + } + @Override public String updateProfile(String id) throws Exception { + requireIdle(id); ProfileUpdates.Plan plan = plans.remove(id); + if (plan == null) throw new IOException("Check this profile and review its update plan before applying"); + return updates.apply(plan, true); + } + @Override public void setTemplate(String id, boolean template) throws Exception { + Profile p = profiles.get(id); + try (ProfileLease ignored = new ProfileLease(p.getDirectory())) { p.template = template; profiles.save(p); } + } + public void addArtifact(String id, Path source, String modrinthId) throws Exception { + requireIdle(id); Profile p = profiles.get(id); + if (!source.getFileName().toString().endsWith(".jar")) throw new IOException("Select a JAR artifact"); + try (ZipFile ignored = new ZipFile(source.toFile()); ProfileLease lease = new ProfileLease(p.getDirectory())) { + Path destination = new ProfileCollection().resolve(p, source.getFileName().toString()); + if (Files.exists(destination)) throw new IOException("That artifact filename already exists in this profile"); + profiles.getCache().link(profiles.getCache().store(source), destination); + ProfileCollection collection = new ProfileCollection().scan(p); + for (CollectionEntry entry : collection.entries) if (entry.file.equals(source.getFileName().toString()) && modrinthId != null) entry.modrinthId = modrinthId; + collection.save(p); plans.remove(id); + } + } + @Override public void addArtifact(String id, String source, String modrinthId) throws Exception { + addArtifact(id, Paths.get(source), modrinthId == null || modrinthId.trim().isEmpty() ? null : modrinthId.trim()); + } + @Override public List worlds() throws Exception { + List result = new ArrayList<>(); for (VirtualWorld w : worlds.list()) result.add(info(w)); return result; + } + @Override public WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { + Profile server = profiles.get(serverProfileId), client = profiles.get(clientProfileId); + if (server.type.isClient() || !client.type.isClient()) throw new IOException("Choose a server profile and a client profile"); + if (!server.gameVersion.equals(client.gameVersion)) throw new IOException("World server and client must use the same game version"); + if (client.template) throw new IOException("Clone the client template before attaching it to a world"); + if (server.type == ProfileType.MODS_SERVER && !server.loader.equals(client.loader)) throw new IOException("Modded world and client loaders must match"); + if (server.type == ProfileType.MODS_SERVER && server.loaderVersion != null && client.loaderVersion != null && !server.loaderVersion.equals(client.loaderVersion)) + throw new IOException("Pinned world and client loader versions must match"); + return info(worlds.create(name, serverProfileId, clientProfileId)); + } + @Override public void setWorldEulaAccepted(String id, boolean accepted) throws Exception { worlds.setEulaAccepted(id, accepted); } + @Override public void launchWorld(String id, boolean share) throws Exception { + MinecraftAccount current = currentAccount(); + worldAccount.set(current); + try { + WorldSession session = worldService.launch(id, share, !current.offline); + progress.accept("World ready on localhost:" + session.getPort()); + if (share) progress.accept(session.getShareResult().getMessage()); + } finally { worldAccount.remove(); } + } + @Override public String shareWorld(String id) { + ShareResult result = worldService.shareWorld(id); return result.isShared() ? result.address + "\n" + result.message : result.message; + } + @Override public void launchProfile(String id, String host, int port) throws Exception { launchClient(id, host, port); } + private Process launchClient(String id, String host, int port) throws Exception { + Profile profile = profiles.get(id); + if (!profile.type.isClient()) throw new IOException("Choose a MODS client profile"); + if (profile.template) throw new IOException("Clone the template before launching it"); + if (profile.migrationPending) throw new IOException("Review and apply profile migration before launching"); + ProfileLease lease = new ProfileLease(profile.getDirectory()); + try { + MinecraftAccount current = worldAccount.get(); + if (current == null) current = currentAccount(); + else if (current.needsRefresh()) current = microsoft.refresh(current); + PreparedLaunch prepared = launcher.prepare(new LaunchRequest(profile.getDirectory(), profile.gameVersion, profile.loader, profile.loaderVersion, current, host, port), progress); + Process process = launcher.launch(prepared); clients.put(id, process); + process.onExit().thenRun(() -> { clients.remove(id, process); try { lease.close(); } catch (IOException e) { progress.accept("Could not release profile lock: " + e.getMessage()); } }); + return process; + } catch (Exception e) { lease.close(); throw e; } + } + private synchronized MinecraftAccount currentAccount() throws Exception { + if (account.needsRefresh()) { + account = microsoft.refresh(account); + if (state.settings.rememberAccount) accounts.save(account); + } + return account; + } + @Override public synchronized SettingsInfo settings() { + SettingsInfo copy = new SettingsInfo(); + copy.java8 = state.settings.java8; copy.java17 = state.settings.java17; copy.java21 = state.settings.java21; + copy.javaPaths = new LinkedHashMap<>(state.settings.javaPaths); copy.defaultProfile = state.settings.defaultProfile; + copy.port = state.settings.port; copy.upnp = state.settings.upnp; copy.microsoftClientId = state.settings.microsoftClientId; + copy.rememberAccount = state.settings.rememberAccount; copy.account = account.username + (account.offline ? " (offline)" : " (Microsoft)"); return copy; + } + @Override public synchronized void saveSettings(SettingsInfo settings) throws Exception { + if (settings.port < 1 || settings.port > 65535) throw new IOException("Port must be between 1 and 65535"); + if (settings.defaultProfile != null && !settings.defaultProfile.isEmpty()) profiles.get(settings.defaultProfile); + for (Integer major : state.settings.javaPaths.keySet()) runtimes.setRuntime(major, null); + applyRuntimeSettings(settings); + worldService.setPreferredPort(settings.port); + worldService.setSharingEnabled(settings.upnp); + if (!settings.rememberAccount) forgetStoredAccounts(); + state.settings = settings; saveState(); + } + private void applyRuntimeSettings(SettingsInfo settings) { + if (settings.javaPaths == null) settings.javaPaths = new LinkedHashMap<>(); + Map values = new LinkedHashMap<>(settings.javaPaths); + values.put(8, settings.java8); values.put(17, settings.java17); values.put(21, settings.java21); + for (Map.Entry value : values.entrySet()) { + if (value.getKey() < 8) throw new IllegalArgumentException("Java major must be at least 8"); + String path = value.getValue(); runtimes.setRuntime(value.getKey(), path == null || path.trim().isEmpty() ? null : Paths.get(path)); + } + } + @Override public void signInMicrosoft(Consumer instructions) throws Exception { + String clientId; synchronized (this) { clientId = state.settings.microsoftClientId; } + MicrosoftAccountService.DeviceLogin device = microsoft.beginLogin(clientId); instructions.accept(device.message); + MinecraftAccount signedIn = microsoft.completeLogin(device); + synchronized (this) { + account = signedIn; state.selectedAccount = account.uuid; + if (state.settings.rememberAccount) accounts.save(account); + saveState(); + } + instructions.accept("Signed in as " + signedIn.username); + } + @Override public synchronized void useOfflineAccount(String name) throws Exception { + account = MinecraftAccount.offline(name); state.offlineName = name; state.selectedAccount = ""; saveState(); + } + private void saveState() throws IOException { json.write(root.resolve("settings.json"), state); } + private void forgetStoredAccounts() throws IOException { for (MinecraftAccount saved : accounts.list()) accounts.remove(saved.uuid); } + private void requireIdle(String id) throws IOException { + if (clients.containsKey(id) || worldService.isProfileInUse(id)) throw new IOException("Stop the running client/world before changing this profile"); + } + private ProfileInfo info(Profile p) { return new ProfileInfo(p.id, p.name, p.gameVersion, p.loader, p.type.name(), p.getDirectory().toString(), p.template, p.migrationSummary == null ? "" : p.migrationSummary, !p.migrationPending); } + private WorldInfo info(VirtualWorld w) throws IOException { + boolean running = worldService.activeSessions().stream().anyMatch(s -> s.getWorld().id.equals(w.id)); + return new WorldInfo(w.id, w.name, w.serverProfileId, w.clientProfileId, worlds.getDirectory(w.id).toString(), w.thumbnail, running); + } + public void waitForSessions() throws InterruptedException { + while (!clients.isEmpty() || !worldService.activeSessions().isEmpty()) Thread.sleep(250); + } + @Override public void close() { + worldService.close(); + for (Process process : clients.values()) if (process.isAlive()) process.destroy(); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/Profile.java b/src/main/java/com/osiris/autoplug/client/profiles/Profile.java new file mode 100644 index 00000000..a840c299 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/Profile.java @@ -0,0 +1,23 @@ +package com.osiris.autoplug.client.profiles; + +import java.nio.file.Path; + +/** Persisted profile identity; its directory is always derived by the store. */ +public class Profile { + public String id, name, gameVersion, loader, loaderVersion; + public ProfileType type; + public boolean template; + public boolean migrationPending; + public String migrationSummary = ""; + private transient Path directory; + + public String getId() { return id; } + public String getName() { return name; } + public String getGameVersion() { return gameVersion; } + public String getLoader() { return loader; } + public String getLoaderVersion() { return loaderVersion; } + public ProfileType getType() { return type; } + public boolean isTemplate() { return template; } + public Path getDirectory() { return directory; } + void setDirectory(Path directory) { this.directory = directory; } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileCollection.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileCollection.java new file mode 100644 index 00000000..79a4b627 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileCollection.java @@ -0,0 +1,48 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.tasks.updater.mods.MinecraftMod; +import com.osiris.autoplug.client.tasks.updater.plugins.MinecraftPlugin; +import com.osiris.autoplug.client.utils.UtilsMinecraft; +import java.io.IOException; +import java.nio.file.*; +import java.util.*; + +public class ProfileCollection { + public List entries = new ArrayList<>(); + public ProfileCollection scan(Profile profile) throws IOException { + Path dir = profile.getDirectory().resolve(profile.type.collectionDirectory()); + Files.createDirectories(dir); + Path metadata = profile.getDirectory().resolve("collection.json"); + ProfileCollection result = Files.exists(metadata) ? new JsonFiles().read(metadata, ProfileCollection.class) : new ProfileCollection(); + Map found = new LinkedHashMap<>(); + if (profile.type == ProfileType.PLUGINS) { + for (MinecraftPlugin p : new UtilsMinecraft().getPlugins(dir.toFile())) { + CollectionEntry entry = new CollectionEntry(); entry.file = Paths.get(p.installationPath).getFileName().toString(); + entry.name = p.getName(); entry.version = p.getVersion(); entry.author = p.getAuthor(); + entry.modrinthId = p.modrinthId; entry.spigotId = p.spigotId; entry.bukkitId = p.bukkitId; found.put(entry.file, entry); + } + } else for (MinecraftMod m : new UtilsMinecraft().getMods(dir.toFile())) { + CollectionEntry entry = new CollectionEntry(); entry.file = Paths.get(m.installationPath).getFileName().toString(); + entry.name = m.getName(); entry.version = m.getVersion(); entry.author = m.getAuthor(); + entry.modrinthId = m.modrinthId; entry.curseforgeId = m.curseforgeId; found.put(entry.file, entry); + } + // Include unreadable/unknown jars so migrations never silently leave them active. + try (DirectoryStream jars = Files.newDirectoryStream(dir, "*.jar")) { + for (Path jar : jars) if (!found.containsKey(jar.getFileName().toString())) { + CollectionEntry entry = new CollectionEntry(); entry.file = jar.getFileName().toString(); entry.name = entry.file; found.put(entry.file, entry); + } + } + for (CollectionEntry configured : result.entries) { + resolve(profile, configured.file); // Reject persisted paths outside the selected collection. + if (found.containsKey(configured.file)) found.put(configured.file, configured); + } + result.entries = new ArrayList<>(found.values()); return result; + } + public Path resolve(Profile profile, String file) throws IOException { + if (file == null || file.contains("/") || file.contains("\\") || !file.endsWith(".jar") || file.equals(".jar")) throw new IOException("Invalid collection artifact filename"); + Path directory = profile.getDirectory().resolve(profile.type.collectionDirectory()); + if (Files.isSymbolicLink(directory)) throw new IOException("Collection directory must not be a link"); + return directory.resolve(file); + } + public void save(Profile profile) throws IOException { new JsonFiles().write(profile.getDirectory().resolve("collection.json"), this); } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileLease.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileLease.java new file mode 100644 index 00000000..0b81dea6 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileLease.java @@ -0,0 +1,35 @@ +package com.osiris.autoplug.client.profiles; + +import java.io.IOException; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.channels.OverlappingFileLockException; +import java.nio.file.Path; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; + +/** An OS lock, shared by update/launch/delete operations across AutoPlug processes. */ +public class ProfileLease implements AutoCloseable { + private final FileChannel channel; + private final FileLock lock; + public ProfileLease(Path directory) throws IOException { + Path normalized = directory.toAbsolutePath().normalize(); + if (!Files.isDirectory(normalized)) throw new IOException("Profile directory does not exist: " + normalized); + // Windows cannot rename a directory containing an open lock file. A sibling + // lock keeps delete/restore atomic without releasing protection before rename. + Path locks = normalized.getParent().resolve(".autoplug-locks"); + Files.createDirectories(locks); + channel = FileChannel.open(locks.resolve(normalized.getFileName() + ".lock"), StandardOpenOption.CREATE, StandardOpenOption.WRITE); + FileLock acquired = null; + try { + acquired = channel.tryLock(); + if (acquired == null) throw new IOException("Profile is in use: " + directory.getFileName()); + if (!Files.isDirectory(normalized)) throw new IOException("Profile directory no longer exists: " + normalized); + } catch (IOException | OverlappingFileLockException e) { + channel.close(); + throw new IOException("Profile is in use: " + directory.getFileName(), e); + } + lock = acquired; + } + @Override public void close() throws IOException { try { if (lock.isValid()) lock.release(); } finally { channel.close(); } } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java new file mode 100644 index 00000000..a19181eb --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java @@ -0,0 +1,102 @@ +package com.osiris.autoplug.client.profiles; + +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; + +/** Independent profile metadata/configuration, with shared immutable artifact storage. */ +public class ProfileStore { + private final Path root; + private final JsonFiles json = new JsonFiles(); + private final ArtifactCache cache; + public ProfileStore(Path root) throws IOException { + this(root, new ArtifactCache(root.toAbsolutePath().normalize().getParent().resolve("cache"))); + } + public ProfileStore(Path root, ArtifactCache cache) throws IOException { + this.root = root.toAbsolutePath().normalize(); this.cache = cache; Files.createDirectories(this.root); + } + public Path getRoot() { return root; } + public ArtifactCache getCache() { return cache; } + public List list() throws IOException { + List result = new ArrayList<>(); + try (DirectoryStream dirs = Files.newDirectoryStream(root)) { + for (Path dir : dirs) if (Files.isRegularFile(dir.resolve("profile.json")) && !Files.isSymbolicLink(dir)) + result.add(get(dir.getFileName().toString())); + } + result.sort(Comparator.comparing(p -> p.name.toLowerCase(Locale.ROOT))); + return result; + } + public Profile get(String id) throws IOException { + Path dir = directory(id); + Profile profile = json.read(dir.resolve("profile.json"), Profile.class); + if (!id.equals(profile.id)) throw new IOException("Profile identity does not match its directory"); + validate(profile); profile.setDirectory(dir); return profile; + } + public Profile create(String name, String version, String loader, ProfileType type) throws IOException { + Profile p = new Profile(); p.id = UUID.randomUUID().toString(); p.name = name; + p.gameVersion = version; p.loader = loader.toUpperCase(Locale.ROOT); p.type = type; + validate(p); p.setDirectory(directory(p.id)); + Files.createDirectory(p.getDirectory()); + Files.createDirectories(p.getDirectory().resolve(type.collectionDirectory())); + save(p); return p; + } + public void save(Profile p) throws IOException { + validate(p); p.setDirectory(directory(p.id)); json.write(p.getDirectory().resolve("profile.json"), p); + } + public Profile cloneProfile(String sourceId, String targetVersion) throws IOException { + Profile source = get(sourceId); + return cloneProfile(sourceId, source.name + " " + targetVersion, targetVersion, source.loader); + } + public Profile cloneProfile(String sourceId, String name, String version, String loader) throws IOException { + Profile source = get(sourceId); + try (ProfileLease ignored = new ProfileLease(source.getDirectory())) { + Profile target = create(name, version, loader, source.type); + target.loaderVersion = Objects.equals(source.loader, target.loader) && Objects.equals(source.gameVersion, version) ? source.loaderVersion : null; + target.migrationPending = !Objects.equals(source.gameVersion, version) || !Objects.equals(source.loader, target.loader); + Set skip = new HashSet<>(Arrays.asList("profile.json", ".profile.lock", ".updates", ".autoplug", "logs", "crash-reports", "saves", "world", "versions", "libraries", "assets", "natives", "launcher_profiles.json", "accounts.json", "usercache.json")); + Files.walkFileTree(source.getDirectory(), new SimpleFileVisitor() { + @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + Path relative = source.getDirectory().relativize(dir); + if (!relative.toString().isEmpty() && skip.contains(relative.getName(0).toString())) return FileVisitResult.SKIP_SUBTREE; + Files.createDirectories(target.getDirectory().resolve(relative)); return FileVisitResult.CONTINUE; + } + @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Path relative = source.getDirectory().relativize(file); + if (skip.contains(relative.getName(0).toString())) return FileVisitResult.CONTINUE; + Path dest = target.getDirectory().resolve(relative); + if (file.getFileName().toString().endsWith(".jar")) cache.link(cache.store(file), dest); + else { + if (Files.isSymbolicLink(file)) throw new IOException("Refusing to clone linked configuration: " + relative); + Files.copy(file, dest, StandardCopyOption.REPLACE_EXISTING); + } + return FileVisitResult.CONTINUE; + } + }); + save(target); return target; + } + } + /** Move to a recoverable trash directory instead of recursively deleting user configuration. */ + public void delete(String id) throws IOException { + Profile p = get(id); + try (ProfileLease ignored = new ProfileLease(p.getDirectory())) { + Path trash = root.getParent().resolve("trash"); Files.createDirectories(trash); + Files.move(p.getDirectory(), trash.resolve(id + "-" + System.currentTimeMillis())); + } + } + private Path directory(String id) throws IOException { + if (id == null || !id.matches("[a-zA-Z0-9_-]{1,100}")) throw new IOException("Invalid profile id"); + Path path = root.resolve(id).normalize(); + if (!path.getParent().equals(root) || Files.isSymbolicLink(path)) throw new IOException("Invalid profile directory"); + return path; + } + private void validate(Profile p) throws IOException { + if (p.name == null || p.name.trim().isEmpty() || p.name.length() > 120 || p.type == null) + throw new IOException("Profile requires a name and type"); + if (p.gameVersion == null || !p.gameVersion.matches("[A-Za-z0-9_.-]{1,80}")) throw new IOException("Invalid game version"); + if (p.loader == null || !Arrays.asList("VANILLA", "FABRIC", "QUILT", "FORGE", "NEOFORGE", "PAPER", "SPIGOT", "PURPUR", "BUKKIT", "VELOCITY", "BUNGEE").contains(p.loader)) + throw new IOException("Unsupported loader: " + p.loader); + if (p.type == ProfileType.MODS && Arrays.asList("PAPER", "SPIGOT", "PURPUR", "BUKKIT", "VELOCITY", "BUNGEE").contains(p.loader)) + throw new IOException("Server plugin loaders require a plugins profile"); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileType.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileType.java new file mode 100644 index 00000000..265e9467 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileType.java @@ -0,0 +1,8 @@ +package com.osiris.autoplug.client.profiles; + +public enum ProfileType { + MODS, PLUGINS, MODS_SERVER; + + public String collectionDirectory() { return this == PLUGINS ? "plugins" : "mods"; } + public boolean isClient() { return this == MODS; } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java new file mode 100644 index 00000000..7d20e765 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java @@ -0,0 +1,213 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.tasks.updater.TaskDownload; +import com.osiris.autoplug.client.tasks.updater.mods.InstalledModLoader; +import com.osiris.autoplug.client.tasks.updater.mods.MinecraftMod; +import com.osiris.autoplug.client.tasks.updater.plugins.MinecraftPlugin; +import com.osiris.autoplug.client.tasks.updater.plugins.ResourceFinder; +import com.osiris.autoplug.client.tasks.updater.search.SearchResult; +import com.osiris.betterthread.BThreadManager; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.*; +import java.security.MessageDigest; +import java.util.*; +import java.util.zip.ZipFile; + +/** Shared updater engine adapter. Every writable path is scoped to the selected profile/cache. */ +public class ProfileUpdates { + public interface Resolver { SearchResult resolve(Profile profile, CollectionEntry entry, Path installed) throws Exception; } + public interface Downloader { void download(SearchResult result, Path destination) throws Exception; } + public enum Status { CURRENT, REPLACE, INCOMPATIBLE, UNVERIFIED, EXCLUDED, ERROR } + public class Change { + public CollectionEntry entry; + public SearchResult release; + public Status status; + public String reason, originalDigest; + } + public class Plan { + public Profile profile; + public ProfileCollection collection; + private String collectionFingerprint; + public List changes = new ArrayList<>(); + public boolean hasErrors() { return changes.stream().anyMatch(c -> c.status == Status.ERROR); } + public String summary() { + StringBuilder out = new StringBuilder(profile.name + " — " + profile.gameVersion + " / " + profile.loader + "\n"); + for (Change c : changes) out.append(c.entry.file).append(": ").append(c.status).append(" — ").append(c.reason).append('\n'); + if (changes.isEmpty()) out.append("Collection is empty.\n"); + if (profile.migrationPending) out.append("Migration: incompatible or unverified JARs will become .jar.disabled after confirmation. Configuration files are preserved.\n"); + if (hasErrors()) out.append("A provider lookup failed. No changes can be applied until it succeeds.\n"); + return out.toString(); + } + } + private final ProfileStore profiles; + private final Resolver resolver; + private final Downloader downloader; + public ProfileUpdates(ProfileStore profiles) { + this.profiles = profiles; this.resolver = this::findRelease; + this.downloader = (release, file) -> { + if (release.downloadUrl == null || !release.downloadUrl.startsWith("https://")) throw new IOException("A secure download URL is required"); + new TaskDownload("Profile artifact", new BThreadManager(), release.downloadUrl, file.toFile(), true).runAtStart(); + }; + } + public ProfileUpdates(ProfileStore profiles, Resolver resolver, Downloader downloader) { + this.profiles = profiles; this.resolver = resolver; this.downloader = downloader; + } + public Plan check(String id) throws Exception { + Profile profile = profiles.get(id); + try (ProfileLease ignored = new ProfileLease(profile.getDirectory())) { return plan(profile); } + } + private Plan plan(Profile profile) throws Exception { + Plan plan = new Plan(); plan.profile = profile; plan.collection = new ProfileCollection().scan(profile); + plan.collectionFingerprint = fingerprint(plan.collection); + for (CollectionEntry entry : plan.collection.entries) { + Change change = new Change(); change.entry = entry; plan.changes.add(change); + Path file = plan.collection.resolve(profile, entry.file); + change.originalDigest = profiles.getCache().digest(file); + if (entry.excluded) { + change.status = profile.migrationPending ? Status.UNVERIFIED : Status.EXCLUDED; + change.reason = "Excluded from provider updates"; continue; + } + try { + change.release = resolver.resolve(profile, entry, file); + if (change.release == null) { change.status = Status.UNVERIFIED; change.reason = "No version-aware provider identity configured"; } + else if (change.release.type == SearchResult.Type.API_ERROR) { + change.status = Status.ERROR; change.reason = change.release.exception == null ? "Provider request failed" : change.release.exception.getMessage(); + } else if (change.release.type == SearchResult.Type.RESOURCE_NOT_FOUND) { + change.status = Status.INCOMPATIBLE; change.reason = "No release for this game version and loader"; + } else if (change.release.type == SearchResult.Type.UP_TO_DATE) { + change.status = Status.CURRENT; change.reason = "Matches compatible release " + change.release.latestVersion; + } else if (change.release.type == SearchResult.Type.UPDATE_AVAILABLE && !change.release.isPremium) { + change.status = Status.REPLACE; change.reason = "Install compatible release " + change.release.latestVersion; + } else { change.status = Status.UNVERIFIED; change.reason = "Provider cannot supply an installable compatible artifact"; } + } catch (Exception e) { change.status = Status.ERROR; change.reason = e.getMessage(); } + } + return plan; + } + /** The caller must display the returned check plan and obtain confirmation before invoking. */ + public String update(String id, boolean allowDisable) throws Exception { return apply(check(id), allowDisable); } + public String apply(Plan plan, boolean allowDisable) throws Exception { + Profile current = profiles.get(plan.profile.id); + try (ProfileLease ignored = new ProfileLease(current.getDirectory())) { + if (!Objects.equals(current.gameVersion, plan.profile.gameVersion) || !Objects.equals(current.loader, plan.profile.loader) + || !Objects.equals(current.loaderVersion, plan.profile.loaderVersion) || current.type != plan.profile.type + || current.migrationPending != plan.profile.migrationPending) throw new IOException("Profile changed; check again"); + if (!Objects.equals(plan.collectionFingerprint, fingerprint(new ProfileCollection().scan(current)))) throw new IOException("Collection or provider settings changed; check again"); + if (plan.hasErrors()) throw new IOException("Provider lookup failed. Nothing was changed.\n" + plan.summary()); + if (current.migrationPending && !allowDisable && plan.changes.stream().anyMatch(c -> c.status == Status.INCOMPATIBLE || c.status == Status.UNVERIFIED)) + throw new IOException("Confirmation required before disabling incompatible or unverified JARs.\n" + plan.summary()); + Map replacements = new LinkedHashMap<>(); + Path staging = current.getDirectory().resolve(".updates").resolve(UUID.randomUUID().toString()); + Files.createDirectories(staging); + // Stage and verify every download before changing any installed JAR. + for (Change c : plan.changes) { + Path file = plan.collection.resolve(current, c.entry.file); + if (!Objects.equals(c.originalDigest, profiles.getCache().digest(file))) throw new IOException("Collection changed; check again: " + c.entry.file); + if (c.status == Status.REPLACE) { + Path temp = staging.resolve(c.entry.file); + downloader.download(c.release, temp); verify(c.release, temp); + replacements.put(c, profiles.getCache().store(temp)); + } + if (current.migrationPending && (c.status == Status.INCOMPATIBLE || c.status == Status.UNVERIFIED) + && Files.exists(file.resolveSibling(file.getFileName() + ".disabled"))) + throw new IOException("A disabled backup already exists; rename it before migration: " + file); + } + Map originals = new LinkedHashMap<>(); List disabled = new ArrayList<>(); + Path collectionFile = current.getDirectory().resolve("collection.json"), profileFile = current.getDirectory().resolve("profile.json"); + byte[] oldCollection = Files.exists(collectionFile) ? Files.readAllBytes(collectionFile) : null; + byte[] oldProfile = Files.readAllBytes(profileFile); + // Downloads may take time; recheck external edits immediately before the transaction. + if (!Objects.equals(plan.collectionFingerprint, fingerprint(new ProfileCollection().scan(current)))) throw new IOException("Collection changed during download; check again"); + for (Change c : plan.changes) if (!Objects.equals(c.originalDigest, profiles.getCache().digest(plan.collection.resolve(current, c.entry.file)))) throw new IOException("Artifact changed during download; check again: " + c.entry.file); + try { + for (Change c : plan.changes) { + Path file = plan.collection.resolve(current, c.entry.file); + if (replacements.containsKey(c)) { + originals.put(file, profiles.getCache().store(file)); + profiles.getCache().link(replacements.get(c), file); + c.entry.version = c.release.latestVersion; + } else if (current.migrationPending && (c.status == Status.INCOMPATIBLE || c.status == Status.UNVERIFIED)) { + Path dest = file.resolveSibling(file.getFileName() + ".disabled"); + Files.move(file, dest); disabled.add(dest); + } else profiles.getCache().link(profiles.getCache().store(file), file); + } + for (Change c : plan.changes) if (c.release != null && c.release.modrinthProjectId != null) + c.entry.modrinthId = c.release.modrinthProjectId; + plan.collection.save(current); + current.migrationPending = false; current.migrationSummary = plan.summary(); profiles.save(current); + } catch (Exception e) { + for (Map.Entry original : originals.entrySet()) try { profiles.getCache().link(original.getValue(), original.getKey()); } catch (Exception rollback) { e.addSuppressed(rollback); } + for (Path file : disabled) try { Files.move(file, file.resolveSibling(file.getFileName().toString().replaceFirst("\\.disabled$", ""))); } catch (Exception rollback) { e.addSuppressed(rollback); } + try { if (oldCollection == null) Files.deleteIfExists(collectionFile); else restoreMetadata(collectionFile, oldCollection); } catch (Exception rollback) { e.addSuppressed(rollback); } + try { restoreMetadata(profileFile, oldProfile); } catch (Exception rollback) { e.addSuppressed(rollback); } + throw e; + } + for (Path temp : replacements.keySet().stream().map(c -> staging.resolve(c.entry.file)).toArray(Path[]::new)) Files.deleteIfExists(temp); + Files.deleteIfExists(staging); + return "Applied updates.\n" + plan.summary(); + } + } + private String fingerprint(ProfileCollection collection) { + List entries = new ArrayList<>(collection.entries); entries.sort(Comparator.comparing(e -> e.file)); + return new com.google.gson.Gson().toJson(entries); + } + private void restoreMetadata(Path path, byte[] content) throws IOException { + Path temporary = Files.createTempFile(path.getParent(), ".rollback-", ".tmp"); + try { + Files.write(temporary, content); + try { Files.move(temporary, path, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, path, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temporary); } + } + private SearchResult findRelease(Profile profile, CollectionEntry entry, Path file) throws Exception { + ResourceFinder finder = new ResourceFinder(); + SearchResult modrinth = null; + if (entry.modrinthId != null && !entry.modrinthId.isEmpty()) { + modrinth = finder.findCompatibleModrinthArtifact(compatibleLoaders(profile), entry.modrinthId, profile.gameVersion, file); + if (modrinth.type != SearchResult.Type.RESOURCE_NOT_FOUND) return modrinth; + } + // Embedded mod ids and plugin names are not necessarily provider project ids. + // An exact hash lookup avoids guessing identities for generic collections. + String identified = finder.findModrinthProject(file); + if (identified != null && !identified.equals(entry.modrinthId)) { + modrinth = finder.findCompatibleModrinthArtifact(compatibleLoaders(profile), identified, profile.gameVersion, file); + if (modrinth.type != SearchResult.Type.RESOURCE_NOT_FOUND) return modrinth; + } + if (profile.type != ProfileType.PLUGINS && entry.curseforgeId != null) { + MinecraftMod mod = new MinecraftMod(file.toString(), entry.name, entry.version, entry.author, null, entry.curseforgeId, entry.customDownloadUrl); + return finder.findModByCurseforgeId(new InstalledModLoader(profile.loader), mod, profile.gameVersion, false); + } + if (modrinth != null) return modrinth; + // Generic Spigot/GitHub/custom releases lack target-game compatibility metadata. + // They remain available for ordinary updates, but a migration must get an explicit compatible identity. + if (profile.migrationPending) return null; + MinecraftPlugin plugin = new MinecraftPlugin(file.toString(), entry.name, entry.version, entry.author, entry.spigotId, entry.bukkitId, entry.customDownloadUrl); + plugin.githubRepoName = entry.githubRepo; plugin.githubAssetName = entry.githubAsset; plugin.customCheckURL = entry.customCheckUrl; + if (entry.customCheckUrl != null) return finder.findByCustomCheckURL(plugin); + if (entry.githubRepo != null) return finder.findByGithubUrl(plugin); + if (entry.spigotId > 0) return finder.findPluginBySpigotId(plugin); + if (entry.bukkitId > 0) return finder.findPluginByBukkitId(plugin); + return null; + } + private List compatibleLoaders(Profile profile) { + switch (profile.loader) { + case "PURPUR": return Arrays.asList("purpur", "paper", "spigot", "bukkit"); + case "PAPER": return Arrays.asList("paper", "spigot", "bukkit"); + case "SPIGOT": return Arrays.asList("spigot", "bukkit"); + case "QUILT": return Arrays.asList("quilt", "fabric"); + default: return List.of(profile.loader.toLowerCase(Locale.ROOT)); + } + } + private void verify(SearchResult result, Path path) throws Exception { + if (!Files.isRegularFile(path) || Files.size(path) == 0) throw new IOException("Downloaded artifact is empty"); + if (result.fileSize >= 0 && Files.size(path) != result.fileSize) throw new IOException("Downloaded artifact size mismatch"); + String expected = result.sha512 != null ? result.sha512 : result.sha1; + if (expected != null) { + MessageDigest digest = MessageDigest.getInstance(result.sha512 != null ? "SHA-512" : "SHA-1"); + try (InputStream in = Files.newInputStream(path)) { byte[] buf = new byte[65536]; int n; while ((n = in.read(buf)) != -1) digest.update(buf, 0, n); } + StringBuilder actual = new StringBuilder(); for (byte b : digest.digest()) actual.append(String.format("%02x", b & 255)); + if (!expected.equalsIgnoreCase(actual.toString())) throw new IOException("Downloaded artifact checksum mismatch"); + } + try (ZipFile jar = new ZipFile(path.toFile())) { if (!jar.entries().hasMoreElements()) throw new IOException("Downloaded JAR is empty"); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/CurseForgeAPI.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/CurseForgeAPI.java index 6506b96c..177a7c3c 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/CurseForgeAPI.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/CurseForgeAPI.java @@ -96,7 +96,10 @@ public SearchResult searchUpdate(InstalledModLoader modLoader, MinecraftMod mod, } // If the release has no fabric or forge tag, then we expect only forge support. - if (modLoader.isFabric || modLoader.isQuilt) { // FABRIC or QUILT + if (modLoader.isNeoForge) { + for (JsonElement el : tempRelease.get("gameVersions").getAsJsonArray()) + if ("neoforge".equalsIgnoreCase(el.getAsString())) isModLoaderCompatible = true; + } else if (modLoader.isFabric || modLoader.isQuilt) { // FABRIC or QUILT for (JsonElement el : tempRelease.get("gameVersions").getAsJsonArray()) { // check if game versions contain fabric if (StringUtils.containsIgnoreCase(el.getAsString(), "fabric")) { isModLoaderCompatible = true; @@ -113,7 +116,7 @@ public SearchResult searchUpdate(InstalledModLoader modLoader, MinecraftMod mod, isModLoaderCompatible = true; // since no fabric/forge tag == forge is supported, // we only need to check if it has no fabric tag for (JsonElement el : tempRelease.get("gameVersions").getAsJsonArray()) { - if (StringUtils.containsIgnoreCase(el.getAsString(), "fabric")) { + if (StringUtils.containsIgnoreCase(el.getAsString(), "fabric") || StringUtils.containsIgnoreCase(el.getAsString(), "neoforge")) { isModLoaderCompatible = false; break; } @@ -125,21 +128,12 @@ public SearchResult searchUpdate(InstalledModLoader modLoader, MinecraftMod mod, break; } } - if (release == null) - throw new Exception("Failed to find a single release of this mod for mc version " + mcVersion); - try { - latest = release.get("fileName").getAsString().replaceAll("[^0-9.]", ""); // Before passing over remove everything except numbers and dots - } catch (Exception e) { - throw new Exception("Failed to determine latest mod version!", e); - } - if (new File(mod.installationPath).lastModified() < fileDateToMs(release.get("fileDate").getAsString())) - resultType = SearchResult.Type.UPDATE_AVAILABLE; - downloadUrl = release.get("downloadUrl").getAsString(); - try { - String fileName = release.get("fileName").getAsString(); - type = fileName.substring(fileName.lastIndexOf(".")); - } catch (Exception e) { + if (release == null) { + SearchResult missing = new SearchResult(null, SearchResult.Type.RESOURCE_NOT_FOUND, null, null, ".jar", null, null, false); + missing.mod = mod; + return missing; } + return compatibleArtifactResult(release, mod); } catch (Exception e) { exception = e; resultType = SearchResult.Type.API_ERROR; @@ -150,6 +144,30 @@ public SearchResult searchUpdate(InstalledModLoader modLoader, MinecraftMod mod, return result; } + /** A copied file's timestamp says nothing about its version; compare publisher hashes. */ + public SearchResult compatibleArtifactResult(JsonObject release, MinecraftMod mod) throws Exception { + String filename = release.get("fileName").getAsString(); + if (!release.has("downloadUrl") || release.get("downloadUrl").isJsonNull()) + throw new IOException("The publisher does not permit direct downloads for this release"); + SearchResult result = new SearchResult(null, SearchResult.Type.UPDATE_AVAILABLE, filename.replaceAll("[^0-9.]", ""), + release.get("downloadUrl").getAsString(), ".jar", null, null, false); + result.mod = mod; result.fileName = filename; + result.fileSize = release.has("fileLength") ? release.get("fileLength").getAsLong() : -1; + if (release.has("hashes")) for (JsonElement value : release.getAsJsonArray("hashes")) { + JsonObject hash = value.getAsJsonObject(); + if (hash.get("algo").getAsInt() == 1) result.sha1 = hash.get("value").getAsString(); + } + if (result.sha1 != null && Files.isRegularFile(Paths.get(mod.installationPath))) { + java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); + try (java.io.InputStream in = Files.newInputStream(Paths.get(mod.installationPath))) { + byte[] buffer = new byte[65536]; int n; while ((n = in.read(buffer)) != -1) digest.update(buffer, 0, n); + } + StringBuilder actual = new StringBuilder(); for (byte b : digest.digest()) actual.append(String.format("%02x", b & 255)); + if (result.sha1.equalsIgnoreCase(actual.toString())) result.type = SearchResult.Type.UP_TO_DATE; + } + return result; + } + private long fileDateToMs(String fileDate) { return Instant.parse(fileDate).toEpochMilli(); } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/InstalledModLoader.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/InstalledModLoader.java index 8f02dcfb..d58cb529 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/InstalledModLoader.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/InstalledModLoader.java @@ -13,7 +13,15 @@ import java.io.File; public class InstalledModLoader { - public boolean isForge, isFabric, isQuilt; + public boolean isForge, isFabric, isQuilt, isNeoForge; + + /** Explicit profile context; does not inspect or change the process working directory. */ + public InstalledModLoader(String loader) { + isForge = "FORGE".equalsIgnoreCase(loader); + isFabric = "FABRIC".equalsIgnoreCase(loader); + isQuilt = "QUILT".equalsIgnoreCase(loader); + isNeoForge = "NEOFORGE".equalsIgnoreCase(loader); + } public InstalledModLoader() { try { diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java index d45039d8..846d93cc 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java @@ -12,16 +12,137 @@ import com.osiris.autoplug.client.tasks.updater.plugins.MinecraftPlugin; import com.osiris.autoplug.client.tasks.updater.search.SearchResult; import com.osiris.autoplug.client.utils.UtilsURL; +import com.osiris.autoplug.client.utils.UtilsCrypto; import com.osiris.jlib.json.Json; import com.osiris.jlib.logger.AL; import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Instant; import java.util.List; public class ModrinthAPI { private final String baseUrl = "https://api.modrinth.com/v2"; + @FunctionalInterface interface ConnectionFactory { HttpURLConnection open(URL url) throws IOException; } + private final ConnectionFactory connections; + + public ModrinthAPI() { this(url -> (HttpURLConnection) url.openConnection()); } + ModrinthAPI(ConnectionFactory connections) { this.connections = java.util.Objects.requireNonNull(connections); } + + /** + * Resolve the exact installed bytes through Modrinth's version-file endpoint. + * A 404 means the artifact is unknown; a provider failure is not a missing identity. + * This lookup does not modify the artifact or any collection metadata. + */ + public String findProjectForArtifact(Path installed) throws IOException { + if (installed == null || !Files.isRegularFile(installed)) throw new IOException("Installed artifact is not a regular file: " + installed); + String sha1 = UtilsCrypto.fastSHA1(installed.toFile()); + if (sha1 == null || !sha1.matches("[a-fA-F0-9]{40}")) throw new IOException("Could not hash installed artifact: " + installed); + sha1 = sha1.toLowerCase(java.util.Locale.ROOT); + HttpURLConnection connection = openConnection("/version_file/" + sha1 + "?algorithm=sha1"); + try { + int status = connection.getResponseCode(); + if (status == 404) return null; + if (status != 200) throw new IOException("Modrinth artifact lookup returned HTTP " + status); + try (Reader reader = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)) { + JsonObject version = com.google.gson.JsonParser.parseReader(reader).getAsJsonObject(); + com.google.gson.JsonElement project = version.get("project_id"); + if (project == null || !project.isJsonPrimitive() || !project.getAsJsonPrimitive().isString() + || !project.getAsString().matches("[A-Za-z0-9]{1,128}")) + throw new IOException("Modrinth artifact response has no valid project_id"); + return project.getAsString(); + } catch (com.google.gson.JsonParseException | IllegalStateException e) { + throw new IOException("Invalid Modrinth artifact response", e); + } + } finally { connection.disconnect(); } + } + + private HttpURLConnection openConnection(String path) throws IOException { + HttpURLConnection connection = connections.open(new URL(baseUrl + path)); + connection.setConnectTimeout(15000); + connection.setReadTimeout(20000); + connection.setRequestProperty("User-Agent", "AutoPlug-Client/10.2 (https://github.com/Osiris-Team/AutoPlug-Client)"); + connection.setRequestProperty("Accept", "application/json"); + return connection; + } + + /** + * Exact target-version lookup for both upgrades and downgrades. Unlike the legacy + * timestamp comparison, this compares artifact hashes and never treats a failed + * request as proof that a compatible release does not exist. + */ + public SearchResult searchCompatible(List loaders, String id, String version, java.nio.file.Path installed) { + SearchResult result = new SearchResult(null, SearchResult.Type.API_ERROR, null, null, ".jar", null, null, false); + try { + if (id == null || !id.matches("[A-Za-z0-9_-]+")) throw new IllegalArgumentException("A Modrinth project id or slug is required"); + String query = "loaders=" + java.net.URLEncoder.encode(new com.google.gson.Gson().toJson(loaders), "UTF-8") + + "&game_versions=" + java.net.URLEncoder.encode(new com.google.gson.Gson().toJson(List.of(version)), "UTF-8"); + HttpURLConnection connection = openConnection("/project/" + id + "/version?" + query); + try { + if (connection.getResponseCode() == 404) { + result.type = SearchResult.Type.RESOURCE_NOT_FOUND; + return result; + } + if (connection.getResponseCode() != 200) throw new java.io.IOException("Modrinth returned HTTP " + connection.getResponseCode()); + try (java.io.Reader reader = new java.io.InputStreamReader(connection.getInputStream(), java.nio.charset.StandardCharsets.UTF_8)) { + SearchResult found = compatibleResult(com.google.gson.JsonParser.parseReader(reader).getAsJsonArray(), loaders, version, installed); + if (found.type == SearchResult.Type.UP_TO_DATE || found.type == SearchResult.Type.UPDATE_AVAILABLE) + found.modrinthProjectId = id; + return found; + } + } finally { connection.disconnect(); } + } catch (Exception e) { result.exception = e; return result; } + } + + /** Parse provider fixtures independently of network access. */ + public SearchResult compatibleResult(com.google.gson.JsonArray releases, List loaders, String version, java.nio.file.Path installed) throws Exception { + SearchResult result = new SearchResult(null, SearchResult.Type.RESOURCE_NOT_FOUND, null, null, ".jar", null, null, false); + JsonObject selected = null; + for (com.google.gson.JsonElement element : releases) { + JsonObject release = element.getAsJsonObject(); + boolean versionMatch = false, loaderMatch = false; + for (com.google.gson.JsonElement v : release.getAsJsonArray("game_versions")) if (version.equals(v.getAsString())) versionMatch = true; + for (com.google.gson.JsonElement l : release.getAsJsonArray("loaders")) if (loaders.contains(l.getAsString())) loaderMatch = true; + if (versionMatch && loaderMatch && (selected == null || Instant.parse(release.get("date_published").getAsString()).isAfter(Instant.parse(selected.get("date_published").getAsString())))) selected = release; + } + if (selected == null) return result; + JsonObject file = null; + for (com.google.gson.JsonElement element : selected.getAsJsonArray("files")) { + JsonObject candidate = element.getAsJsonObject(); + if (!candidate.get("filename").getAsString().endsWith(".jar")) continue; + if (file == null || candidate.has("primary") && candidate.get("primary").getAsBoolean()) file = candidate; + if (candidate.has("primary") && candidate.get("primary").getAsBoolean()) break; + } + if (file == null) throw new java.io.IOException("Compatible release has no JAR artifact"); + result.latestVersion = selected.get("version_number").getAsString(); + result.downloadUrl = file.get("url").getAsString(); result.fileName = file.get("filename").getAsString(); + result.fileSize = file.has("size") ? file.get("size").getAsLong() : -1; + JsonObject hashes = file.getAsJsonObject("hashes"); + if (hashes != null) { + result.sha512 = hashes.has("sha512") ? hashes.get("sha512").getAsString() : null; + result.sha1 = hashes.has("sha1") ? hashes.get("sha1").getAsString() : null; + } + result.type = SearchResult.Type.UPDATE_AVAILABLE; + String expected = result.sha512 != null ? result.sha512 : result.sha1; + if (expected != null && java.nio.file.Files.isRegularFile(installed)) { + java.security.MessageDigest digest = java.security.MessageDigest.getInstance(result.sha512 != null ? "SHA-512" : "SHA-1"); + try (java.io.InputStream in = java.nio.file.Files.newInputStream(installed)) { + byte[] buffer = new byte[65536]; int count; + while ((count = in.read(buffer)) != -1) digest.update(buffer, 0, count); + } + StringBuilder actual = new StringBuilder(); for (byte b : digest.digest()) actual.append(String.format("%02x", b & 255)); + if (expected.equalsIgnoreCase(actual.toString())) result.type = SearchResult.Type.UP_TO_DATE; + } + return result; + } private boolean isInt(String s) { try { diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java index 7d0bf079..b7bfe0c4 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java @@ -26,6 +26,16 @@ public class ResourceFinder { + /** Exact artifact identity; callers persist it only after an approved update is applied. */ + public String findModrinthProject(java.nio.file.Path installed) throws java.io.IOException { + return new ModrinthAPI().findProjectForArtifact(installed); + } + + /** Exact loader/game-version path used by isolated client and server profiles. */ + public SearchResult findCompatibleModrinthArtifact(List loaders, String project, String gameVersion, java.nio.file.Path installed) { + return new ModrinthAPI().searchCompatible(loaders, project, gameVersion, installed); + } + /** * If the spigot/bukkit id is not given this type of search * based on the plugins' name and author will be executed.
diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/search/SearchResult.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/search/SearchResult.java index 9c6c9d26..373e151b 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/search/SearchResult.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/search/SearchResult.java @@ -38,6 +38,11 @@ public static boolean isMatchFound(SearchResult sr) { public Type type; public Exception exception; public String fileName; + /** Optional provider integrity metadata used by isolated profile migrations. */ + public String sha512, sha1; + public long fileSize = -1; + /** Resolved provider identity, available to persist after successful application. */ + public String modrinthProjectId; /** * @param type All codes:
diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java new file mode 100644 index 00000000..2816b573 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -0,0 +1,533 @@ +package com.osiris.autoplug.client.ui; + +import com.osiris.autoplug.client.browser.*; +import com.osiris.autoplug.client.ui.LauncherActions.*; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.table.DefaultTableModel; +import java.awt.*; +import java.awt.datatransfer.StringSelection; +import java.io.File; +import java.util.List; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +/** Five-view Swing dashboard. Network, launcher and disk operations never run on the EDT. */ +public final class DashboardPanel extends JPanel implements AutoCloseable { + private final LauncherActions actions; + private final ServerBrowserService browser; + private final ExecutorService workers = Executors.newFixedThreadPool(4, runnable -> { + Thread thread = new Thread(runnable, "AutoPlug-Dashboard"); thread.setDaemon(true); return thread; + }); + private final AtomicBoolean closed = new AtomicBoolean(); + private final AtomicInteger running = new AtomicInteger(); + private final CardLayout cards = new CardLayout(); + private final JPanel pages = new JPanel(cards); + private final JLabel status = new JLabel("Ready"); + private final DefaultTableModel serverModel = model("Name", "Address", "Status", "MOTD", "Players", "Version", "Latency"); + private final JTable serverTable = table(serverModel); + private final DefaultTableModel profileModel = model("Name", "Minecraft", "Loader", "Type", "Template", "Ready"); + private final JTable profileTable = table(profileModel); + private final JPanel worldCards = new JPanel(); + private final Map serverStatuses = new HashMap<>(); + private List servers = Collections.emptyList(); + private List profiles = Collections.emptyList(); + private List worlds = Collections.emptyList(); + private int pingGeneration; + private final JComboBox typeFilter = new JComboBox<>(new String[]{"All profiles", "MODS", "PLUGINS", "MODS_SERVER"}); + private List visibleProfiles = Collections.emptyList(); + private final JTextArea profileDetails = textArea(3); + private final JTextField java8 = new JTextField(), java17 = new JTextField(), java21 = new JTextField(); + private final JTextField extraJava = new JTextField(), clientId = new JTextField(), offlineName = new JTextField(); + private final JComboBox defaultProfile = new JComboBox<>(); + private final JSpinner port = new JSpinner(new SpinnerNumberModel(25565, 1, 65535, 1)); + private final JCheckBox upnp = new JCheckBox("Use UPnP when I explicitly share a world"); + private final JCheckBox rememberAccount = new JCheckBox("Remember Microsoft account on this computer"); + private final JLabel account = new JLabel("Loading account…"); + private ServerConsolePanel console; + private SettingsInfo loadedSettings; + private JDialog signInDialog; + + public DashboardPanel(LauncherActions actions, ServerBrowserService browser) { this(actions, browser, true); } + + /** The legacy controls can be omitted for a standalone preview without initializing a server. */ + public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boolean includeLegacyControls) { + super(new BorderLayout(0, 0)); + this.actions = Objects.requireNonNull(actions); this.browser = Objects.requireNonNull(browser); + setPreferredSize(new Dimension(1100, 720)); + JPanel navigation = new JPanel(); navigation.setLayout(new BoxLayout(navigation, BoxLayout.Y_AXIS)); + navigation.setBorder(new EmptyBorder(24, 16, 20, 16)); navigation.setPreferredSize(new Dimension(195, 600)); + JLabel brand = new JLabel("AutoPlug"); brand.setFont(brand.getFont().deriveFont(Font.BOLD, 25f)); + navigation.add(brand); navigation.add(Box.createVerticalStrut(5)); + JLabel subtitle = new JLabel("PLAY · MANAGE · SHARE"); subtitle.setFont(subtitle.getFont().deriveFont(10f)); + navigation.add(subtitle); navigation.add(Box.createVerticalStrut(30)); + ButtonGroup group = new ButtonGroup(); + String[] names = {"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}; + JPanel[] views = {serverPage(), worldsPage(), profilesPage(), managerPage(includeLegacyControls), settingsPage()}; + for (int i = 0; i < names.length; i++) { + String name = names[i]; pages.add(views[i], name); + JToggleButton button = new JToggleButton(name); button.setHorizontalAlignment(SwingConstants.LEFT); + button.setPreferredSize(new Dimension(170, 43)); + button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 43)); button.setAlignmentX(Component.LEFT_ALIGNMENT); + button.addActionListener(e -> { cards.show(pages, name); if (name.equals("Virtual Worlds")) refreshWorlds(); }); + group.add(button); navigation.add(button); navigation.add(Box.createVerticalStrut(8)); + if (i == 0) button.setSelected(true); + } + navigation.add(Box.createVerticalGlue()); + JLabel footer = new JLabel("Your worlds. Your profiles."); footer.setFont(footer.getFont().deriveFont(11f)); navigation.add(footer); + add(navigation, BorderLayout.WEST); add(pages, BorderLayout.CENTER); + status.setBorder(new EmptyBorder(8, 16, 8, 16)); add(status, BorderLayout.SOUTH); + refreshProfiles(); refreshWorlds(); refreshSettings(); + run("Importing Minecraft favorites", () -> { browser.importVanilla(); return browser.list(); }, this::showServers); + } + + private JPanel serverPage() { + JPanel page = page("Server Browser", "Your Minecraft favorites, with live status and matching local profiles."); + JPanel content = content(); + content.add(toolbar(button("Add server", this::addServer), button("Import Minecraft", () -> run("Importing favorites", () -> { + int count = browser.importVanilla(); return count; + }, count -> { status.setText("Imported " + count + " new favorites from " + browser.vanillaFile()); refreshServers(); })), + button("Refresh status", this::refreshServers), button("Join selected", this::joinSelected), + button("Remove", this::removeServer)), BorderLayout.NORTH); + serverTable.getColumnModel().getColumn(3).setPreferredWidth(220); + content.add(tableScroll(serverTable), BorderLayout.CENTER); + JLabel note = new JLabel("Server pings show version and players. Mods and loaders come from your local profiles."); + note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note, BorderLayout.SOUTH); + page.add(content, BorderLayout.CENTER); return page; + } + + private void addServer() { + JTextField name = new JTextField(), address = new JTextField(); + if (!form("Add a Minecraft server", fields("Name", name, "Address", address))) return; + try { + SavedServer server = new SavedServer(name.getText(), address.getText()); + run("Saving favorite", () -> { browser.add(server.name, server.address); return browser.list(); }, this::showServers); + } catch (IllegalArgumentException e) { error(e); } + } + private void removeServer() { + SavedServer selected = selectedServer(); if (selected == null) return; + if (!confirm("Remove favorite", "Remove “" + selected.name + "” from AutoPlug favorites?\nMinecraft's servers.dat remains unchanged.")) return; + run("Removing favorite", () -> { browser.remove(selected.address); return browser.list(); }, this::showServers); + } + private void refreshServers() { run("Loading favorites", browser::list, this::showServers); } + private void showServers(List result) { + int generation = ++pingGeneration; + servers = result; serverModel.setRowCount(0); + for (SavedServer server : servers) serverModel.addRow(new Object[]{server.name, server.address, "Checking…", "", "", "", ""}); + for (SavedServer server : servers) run("Checking " + server.name, () -> browser.ping(server), ping -> { + if (generation != pingGeneration) return; + serverStatuses.put(server.address, ping); + for (int i = 0; i < servers.size(); i++) if (servers.get(i).address.equals(server.address)) { + serverModel.setValueAt(ping.online ? "Online" : "Unavailable", i, 2); + serverModel.setValueAt(ping.online && ping.motd != null ? ping.motd.replace('\n', ' ') : ping.message, i, 3); + serverModel.setValueAt(ping.online ? ping.players + " / " + ping.capacity : "—", i, 4); + serverModel.setValueAt(ping.online ? ping.version : "—", i, 5); + serverModel.setValueAt(ping.online ? ping.latency + " ms" : "—", i, 6); + } + }); + } + private SavedServer selectedServer() { + int row = serverTable.getSelectedRow(); + if (row < 0) { status.setText("Select a server first."); return null; } + return servers.get(serverTable.convertRowIndexToModel(row)); + } + private void joinSelected() { + SavedServer server = selectedServer(); if (server == null) return; + ServerStatus ping = serverStatuses.get(server.address); + List clients = clientProfiles(); + if (clients.isEmpty()) { information("Create a client profile", "Create a MODS profile in Profiles before joining a server."); return; } + ProfileInfo base = preferredBase(clients); + String targetVersion = ping != null && ping.online ? gameVersionFromStatus(ping.version) : ""; + if (ping != null && ping.online) { + ProfileInfo match = matchingClientProfile(clients, targetVersion, base.loader); + if (match != null) { launchOnServer(server, match); return; } + JComboBox baseChoice = new JComboBox<>(clients.toArray(new ProfileInfo[0])); baseChoice.setSelectedItem(base); + JTextField target = new JTextField(targetVersion); + JPanel details = fields("Server version", new JLabel(ping.version), "Base profile / loader", baseChoice, "Target Minecraft version", target); + Object[] options = {"Clone and join", "Choose existing", "Cancel"}; + int option = JOptionPane.showOptionDialog(this, details, "No matching " + base.loader + " profile", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); + if (option == 0) { + ProfileInfo selectedBase = (ProfileInfo) baseChoice.getSelectedItem(); String version = target.getText().trim(); + if (selectedBase == null || version.isEmpty()) return; + String name = selectedBase.name + " " + version; + run("Preparing a matching profile", () -> actions.cloneProfile(selectedBase.id, name, version, selectedBase.loader), cloned -> finishJoinMigration(server, cloned)); + return; + } + if (option != 1) return; + } + JComboBox choice = new JComboBox<>(clients.toArray(new ProfileInfo[0])); choice.setSelectedItem(base); + if (!form("Join " + server.name, fields("Local client profile", choice))) return; + ProfileInfo selected = (ProfileInfo) choice.getSelectedItem(); + if (!ready(selected)) return; + if (ping != null && ping.online && !versionMatches(ping.version, selected.gameVersion) + && !confirm("Version differs", "The server reports " + ping.version + " but this profile uses " + selected.gameVersion + ".\nAttempt to connect with this profile?")) return; + launchOnServer(server, selected); + } + private ProfileInfo preferredBase(List clients) { + if (loadedSettings != null) for (ProfileInfo profile : clients) if (profile.id.equals(loadedSettings.defaultProfile)) return profile; + for (ProfileInfo profile : clients) if (profile.template) return profile; + return clients.get(0); + } + private void finishJoinMigration(SavedServer server, ProfileInfo cloned) { + refreshProfiles(); + if (cloned.launchable) { launchOnServer(server, cloned); return; } + run("Planning compatible assets", () -> actions.checkProfile(cloned.id), plan -> { + if (!confirmText("Review migration before joining", plan + "\n\nApply this migration, then join “" + server.name + "”?\nCancel keeps the new profile pending for later review.")) return; + run("Applying profile migration", () -> actions.updateProfile(cloned.id), summary -> { + information("Migration summary", summary); + run("Verifying migrated profile", actions::profiles, updated -> { + profiles = updated; showProfiles(); refreshDefaultProfiles(); + for (ProfileInfo profile : updated) if (profile.id.equals(cloned.id)) { launchOnServer(server, profile); return; } + information("Profile unavailable", "The migrated profile could not be found."); + }); + }); + }); + } + private void launchOnServer(SavedServer server, ProfileInfo profile) { + if (!ready(profile)) return; + ServerAddress address = ServerAddress.parse(server.address); + run("Launching " + profile.name, () -> { actions.launchProfile(profile.id, address.host, address.port); return null; }, ignored -> status.setText("Launch requested for " + server.name)); + } + static String gameVersionFromStatus(String version) { + if (version == null) return ""; + java.util.regex.Matcher match = java.util.regex.Pattern.compile("(? profiles, String version, String loader) { + if (version == null || version.isEmpty() || loader == null) return null; + for (ProfileInfo profile : profiles) if ("MODS".equalsIgnoreCase(profile.type) && profile.gameVersion.equals(version) + && profile.loader.equalsIgnoreCase(loader) && profile.launchable && !profile.template) return profile; + return null; + } + static boolean versionMatches(String serverVersion, String profileVersion) { + if (serverVersion == null || profileVersion == null || profileVersion.isEmpty()) return false; + return java.util.regex.Pattern.compile("(? showProfiles()); + content.add(toolbar(typeFilter, button("Create", this::createProfile), button("Clone / migrate", () -> cloneProfile(selectedProfile(), null)), + button("Check", () -> checkOrUpdate(false)), button("Update", () -> checkOrUpdate(true)), button("Refresh", this::refreshProfiles)), BorderLayout.NORTH); + content.add(tableScroll(profileTable), BorderLayout.CENTER); + JPanel bottom = new JPanel(new BorderLayout(0, 8)); + bottom.setBorder(new EmptyBorder(12, 0, 0, 0)); bottom.add(new JScrollPane(profileDetails), BorderLayout.CENTER); + bottom.add(toolbar(button("Launch client", () -> { + ProfileInfo profile = selectedProfile(); if (!ready(profile)) return; + if (!"MODS".equalsIgnoreCase(profile.type)) { information("Client profiles", "Choose a MODS profile to launch the Minecraft client."); return; } + run("Launching client", () -> { actions.launchProfile(profile.id, null, 25565); return null; }, ignored -> {}); + }), button("Toggle template", () -> { + ProfileInfo profile = selectedProfile(); if (profile == null) return; + run("Saving template", () -> { actions.setTemplate(profile.id, !profile.template); return null; }, ignored -> refreshProfiles()); + }), button("Add JAR", this::addArtifact), button("Open folder", () -> { + ProfileInfo profile = selectedProfile(); if (profile != null) openFolder(profile.directory); + }), button("Delete", () -> { + ProfileInfo profile = selectedProfile(); if (profile == null) return; + if (!confirm("Delete profile", "Move “" + profile.name + "” and its isolated profile directory to AutoPlug's trash?")) return; + run("Deleting profile", () -> { actions.deleteProfile(profile.id); return null; }, ignored -> refreshProfiles()); + })), BorderLayout.SOUTH); + content.add(bottom, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); + profileTable.getSelectionModel().addListSelectionListener(e -> { + int row = profileTable.getSelectedRow(); + if (row >= 0 && row < visibleProfiles.size()) { + ProfileInfo profile = visibleProfiles.get(profileTable.convertRowIndexToModel(row)); + profileDetails.setText(profile.directory + "\n" + (profile.launchable ? "Ready to launch" : "Needs migration review") + + (profile.migrationSummary == null || profile.migrationSummary.isEmpty() ? "" : "\n" + profile.migrationSummary)); + } + }); return page; + } + private void createProfile() { + JTextField name = new JTextField(), version = new JTextField("1.21.1"); + JComboBox loader = loaders("VANILLA"), type = new JComboBox<>(new String[]{"MODS", "PLUGINS", "MODS_SERVER"}); + JCheckBox template = new JCheckBox("Use as a reusable template"); + if (!form("Create profile", fields("Name", name, "Minecraft version", version, "Loader", loader, "Asset type", type, "Template", template))) return; + if (!required(name, version)) return; + String profileName = name.getText().trim(), gameVersion = version.getText().trim(), loaderName = String.valueOf(loader.getSelectedItem()), typeName = String.valueOf(type.getSelectedItem()); + boolean isTemplate = template.isSelected(); + run("Creating profile", () -> actions.createProfile(profileName, gameVersion, loaderName, typeName, isTemplate), this::profileCreated); + } + private void cloneProfile(ProfileInfo source, String suggestedVersion) { + if (source == null) return; + JComboBox base = new JComboBox<>(profiles.toArray(new ProfileInfo[0])); base.setSelectedItem(source); + JTextField name = new JTextField(source.name + " copy"), version = new JTextField(suggestedVersion == null ? source.gameVersion : suggestedVersion); + JComboBox loader = loaders(source.loader); + if (!form("Clone and migrate profile", fields("Base profile", base, "New name", name, "Target version", version, "Target loader", loader))) return; + if (!required(name, version)) return; + ProfileInfo chosen = (ProfileInfo) base.getSelectedItem(); if (chosen == null) return; + if (!confirm("Confirm profile migration", "Clone “" + chosen.name + "” for " + version.getText().trim() + " / " + loader.getSelectedItem() + "?\nAutoPlug will check upgrades and downgrades. Applying the migration may disable incompatible assets.\nReview and apply the migration before launching.")) return; + String profileName = name.getText().trim(), gameVersion = version.getText().trim(), loaderName = String.valueOf(loader.getSelectedItem()); + run("Cloning and checking assets", () -> actions.cloneProfile(chosen.id, profileName, gameVersion, loaderName), this::profileCreated); + } + private void profileCreated(ProfileInfo profile) { + refreshProfiles(); + if (profile != null) information("Profile created: " + profile.name, + (profile.migrationSummary == null || profile.migrationSummary.trim().isEmpty() ? "Created isolated profile at:\n" + profile.directory : profile.migrationSummary) + + (profile.launchable ? "" : "\n\nReview and apply updates to finish migration. This profile cannot launch until its migration is resolved.")); + } + private void checkOrUpdate(boolean update) { + ProfileInfo profile = selectedProfile(); if (profile == null) return; + if (update) { + run("Checking profile before update", () -> actions.checkProfile(profile.id), summary -> { + if (!confirmText("Apply profile update", summary + "\n\nApply these changes? Incompatible assets may be disabled.")) return; + run("Updating profile", () -> actions.updateProfile(profile.id), result -> { information("Update summary", result); refreshProfiles(); }); + }); + } else run("Checking profile", () -> actions.checkProfile(profile.id), summary -> information("Compatibility and updates", summary)); + } + private void addArtifact() { + ProfileInfo profile = selectedProfile(); if (profile == null) return; + JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("Add a JAR to " + profile.name); + chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("Minecraft mod or plugin (*.jar)", "jar")); + chooser.setAcceptAllFileFilterUsed(false); chooser.setMultiSelectionEnabled(false); + if (chooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return; + File file = chooser.getSelectedFile(); + JTextField modrinth = new JTextField(); + if (!form("Add " + file.getName(), fields("Destination profile", new JLabel(profile.name), "Modrinth project ID / slug (optional)", modrinth))) return; + importArtifact(profile, file.getAbsolutePath(), modrinth.getText().trim()); + } + void importArtifact(ProfileInfo profile, String jarPath, String modrinthId) { + run("Adding mod or plugin", () -> { actions.addArtifact(profile.id, jarPath, modrinthId.isEmpty() ? null : modrinthId); return null; }, ignored -> { + refreshProfiles(); status.setText("Added " + new File(jarPath).getName() + " to " + profile.name + ". Use Check to review compatibility and updates."); + }); + } + private void refreshProfiles() { run("Loading profiles", actions::profiles, result -> { profiles = result; showProfiles(); refreshDefaultProfiles(); }); } + private void showProfiles() { + String filter = String.valueOf(typeFilter.getSelectedItem()); + visibleProfiles = new ArrayList<>(); profileModel.setRowCount(0); profileDetails.setText(""); + for (ProfileInfo profile : profiles) if (filter.equals("All profiles") || profile.type.replace('-', '_').equalsIgnoreCase(filter)) { + visibleProfiles.add(profile); profileModel.addRow(new Object[]{profile.name, profile.gameVersion, profile.loader, profile.type, profile.template ? "Yes" : "", profile.launchable ? "Ready" : "Review needed"}); + } + } + private ProfileInfo selectedProfile() { + int row = profileTable.getSelectedRow(); if (row < 0) { status.setText("Select a profile first."); return null; } + return visibleProfiles.get(profileTable.convertRowIndexToModel(row)); + } + private boolean ready(ProfileInfo profile) { + if (profile == null) return false; + if (!profile.launchable) { information("Migration needs review", profile.migrationSummary + "\nResolve the listed issues before launching this profile."); return false; } + if (profile.template) { information("Template profile", "Clone this template into a working profile before launching it."); return false; } + return true; + } + private List clientProfiles() { + List result = new ArrayList<>(); for (ProfileInfo p : profiles) if ("MODS".equalsIgnoreCase(p.type)) result.add(p); return result; + } + + private JPanel worldsPage() { + JPanel page = page("Virtual Worlds", "Singleplayer worlds powered by their own local dedicated server."); + JPanel content = content(); content.add(toolbar(button("Create world", this::createWorld), button("Refresh", this::refreshWorlds)), BorderLayout.NORTH); + worldCards.setLayout(new BoxLayout(worldCards, BoxLayout.Y_AXIS)); + JScrollPane scroll = new JScrollPane(worldCards); scroll.setBorder(null); scroll.getVerticalScrollBar().setUnitIncrement(16); + content.add(scroll, BorderLayout.CENTER); + JLabel note = new JLabel("Local play stays on your PC. Sharing is optional and always requires confirmation."); + note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; + } + private void createWorld() { + List serverProfiles = new ArrayList<>(); + for (ProfileInfo p : profiles) if (!"MODS".equalsIgnoreCase(p.type) && p.launchable) serverProfiles.add(p); + List clientProfiles = clientProfiles(); clientProfiles.removeIf(p -> !p.launchable || p.template); + if (serverProfiles.isEmpty() || clientProfiles.isEmpty()) { information("World profiles", "Create a server profile (PLUGINS or MODS_SERVER) and a matching client MODS profile first."); return; } + JTextField name = new JTextField(); JComboBox server = new JComboBox<>(serverProfiles.toArray(new ProfileInfo[0])); + JComboBox client = new JComboBox<>(clientProfiles.toArray(new ProfileInfo[0])); + JCheckBox eula = new JCheckBox("I accept the Minecraft EULA"); + if (!form("Create virtual world", fields("World name", name, "Server profile", server, "Client profile", client, "Minecraft EULA", toolbar(eula, button("Read EULA", this::openEula))))) return; + if (!required(name)) return; + ProfileInfo serverProfile = (ProfileInfo) server.getSelectedItem(), clientProfile = (ProfileInfo) client.getSelectedItem(); + if (serverProfile == null || clientProfile == null) return; + boolean accepted = eula.isSelected(); + String worldName = name.getText().trim(); + run("Creating isolated world", () -> { + WorldInfo world = actions.createWorld(worldName, serverProfile.id, clientProfile.id); + if (accepted) actions.setWorldEulaAccepted(world.id, true); return world; + }, world -> refreshWorlds()); + } + private void refreshWorlds() { run("Loading worlds", actions::worlds, result -> { worlds = result; showWorlds(); }); } + private void showWorlds() { + worldCards.removeAll(); + if (worlds.isEmpty()) { + JPanel empty = new JPanel(new BorderLayout()); empty.setBorder(new EmptyBorder(60, 24, 60, 24)); + JLabel title = new JLabel("A world of your own", SwingConstants.CENTER); title.setFont(title.getFont().deriveFont(Font.BOLD, 22f)); + empty.add(title, BorderLayout.NORTH); empty.add(new JLabel("Create a world from a server pack and a matching client profile.", SwingConstants.CENTER), BorderLayout.CENTER); + worldCards.add(empty); + } + for (WorldInfo world : worlds) { + JPanel card = new JPanel(new BorderLayout(18, 8)); card.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(UIManager.getColor("Separator.foreground")), new EmptyBorder(16, 16, 16, 16))); + card.setMaximumSize(new Dimension(Integer.MAX_VALUE, 160)); + JLabel image = new JLabel("WORLD", SwingConstants.CENTER); image.setOpaque(true); image.setBackground(new Color(0x284C40)); image.setForeground(Color.WHITE); image.setPreferredSize(new Dimension(105, 95)); + if (world.thumbnail != null && !world.thumbnail.isEmpty()) run("Loading world thumbnail", () -> { + File file = new File(world.thumbnail); if (!file.isFile() || file.length() > 8 * 1024 * 1024) return null; + java.awt.image.BufferedImage bitmap = javax.imageio.ImageIO.read(file); + if (bitmap == null) return null; return new ImageIcon(bitmap.getScaledInstance(105, 95, Image.SCALE_SMOOTH)); + }, icon -> { if (icon != null) { image.setText(""); image.setIcon(icon); } }); + card.add(image, BorderLayout.WEST); + JPanel details = new JPanel(new BorderLayout(0, 6)); JLabel name = new JLabel(world.name + (world.running ? " • Running" : "")); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); + details.add(name, BorderLayout.NORTH); JTextArea description = textArea(2); + description.setText("Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId) + "\n" + world.directory); + details.add(description, BorderLayout.CENTER); + details.add(toolbar(button("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), + button("Share", () -> { + if (!confirm("Share this world", "Share “" + world.name + "” beyond this PC?\nThis may open a router port using UPnP and expose the server to the internet.\nOnly share the join address with people you trust.")) return; + run("Preparing world sharing", () -> { + if (!world.running) actions.launchWorld(world.id, true); + return actions.shareWorld(world.id); + }, address -> { showShare(address); refreshWorlds(); }); + }), button("Open folder", () -> openFolder(world.directory)), button("Minecraft EULA", () -> { + JCheckBox accept = new JCheckBox("I accept the Minecraft EULA"); + if (!form("Minecraft EULA", fields("Read the terms", button("Open Minecraft EULA", this::openEula), "Your agreement", accept)) || !accept.isSelected()) return; + run("Saving EULA acceptance", () -> { actions.setWorldEulaAccepted(world.id, true); return null; }, ignored -> {}); + })), BorderLayout.SOUTH); + card.add(details, BorderLayout.CENTER); worldCards.add(card); worldCards.add(Box.createVerticalStrut(12)); + } + worldCards.add(Box.createVerticalGlue()); worldCards.revalidate(); worldCards.repaint(); + } + private String profileName(String id) { for (ProfileInfo profile : profiles) if (profile.id.equals(id)) return profile.name; return id; } + private void showShare(String text) { + JTextArea area = textArea(6); area.setText(text); JPanel panel = new JPanel(new BorderLayout(0, 8)); panel.add(new JScrollPane(area)); + panel.add(button("Copy details", () -> Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null)), BorderLayout.SOUTH); + JOptionPane.showMessageDialog(this, panel, "World sharing", JOptionPane.INFORMATION_MESSAGE); + } + + private JPanel managerPage(boolean includeLegacyControls) { + JPanel page = page("Server Manager", "The existing AutoPlug server, console, update tasks and backups."); + JPanel content = content(); + content.add(toolbar(commandButton("Start", ".start"), commandButton("Stop", ".stop"), commandButton("Restart", ".restart"), + commandButton("Run tasks", ".run tasks"), commandButton("Back up", ".backup")), BorderLayout.NORTH); + if (includeLegacyControls) { + JTabbedPane tabs = new JTabbedPane(); console = new ServerConsolePanel(tabs); tabs.addTab("Console & task output", console); + try { tabs.addTab("Plugins, mods & server settings", new ServerPanel(tabs)); } + catch (Exception e) { JTextArea problem = textArea(5); problem.setText("Existing server panels could not load: " + e.getMessage()); tabs.addTab("Server settings", new JScrollPane(problem)); } + JPanel maintenance = new JPanel(); maintenance.setLayout(new BoxLayout(maintenance, BoxLayout.Y_AXIS)); maintenance.setBorder(new EmptyBorder(20, 20, 20, 20)); + maintenance.add(new JLabel("Run the same update tasks available in the AutoPlug console.")); maintenance.add(Box.createVerticalStrut(16)); + maintenance.add(toolbar(commandButton("Check server", ".check server"), commandButton("Check plugins", ".check plugins"), commandButton("Check mods", ".check mods"), commandButton("Check Java", ".check java"))); + maintenance.add(Box.createVerticalStrut(24)); maintenance.add(new JLabel("Backups use your existing backup settings and require the server to be stopped.")); + maintenance.add(toolbar(commandButton("Create backup", ".backup"), button("Open configuration", () -> openFolder(new File(System.getProperty("user.dir"), "autoplug").getAbsolutePath())))); + maintenance.add(Box.createVerticalGlue()); tabs.addTab("Tasks & backups", maintenance); content.add(tabs, BorderLayout.CENTER); + } else content.add(new JLabel("Server controls are available in the running AutoPlug application.", SwingConstants.CENTER), BorderLayout.CENTER); + page.add(content, BorderLayout.CENTER); return page; + } + private JButton commandButton(String label, String command) { + return button(label, () -> { + if ((command.equals(".stop") || command.equals(".restart")) && !confirm(label + " server", label + " the existing AutoPlug server?")) return; + run(label, () -> { ServerConsolePanel.executeCommand(command); return null; }, ignored -> {}); + }); + } + + private JPanel settingsPage() { + JPanel page = page("Settings", "Runtime choices, default profiles, local networking and Minecraft accounts."); + JPanel content = new JPanel(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); + JLabel runtime = section("Java runtimes"); content.add(runtime); + content.add(fields("Java 8 executable", java8, "Java 17 executable", java17, "Java 21 executable", java21, + "Other runtimes (major=path; …)", extraJava)); + content.add(Box.createVerticalStrut(16)); content.add(section("Defaults and networking")); + content.add(fields("Default client profile", defaultProfile, "Preferred server port", port, "Sharing", upnp)); + content.add(toolbar(button("Save settings", this::saveSettings), button("Reload", this::refreshSettings))); + content.add(Box.createVerticalStrut(24)); content.add(section("Minecraft account")); + content.add(fields("Current account", account, "Microsoft app client ID", clientId, "Account storage", rememberAccount, "Offline player name", offlineName)); + content.add(toolbar(button("Sign in with Microsoft", () -> { + if (!confirm("Microsoft sign-in", "Start Microsoft device sign-in?\nYou will authorize the displayed app in your browser. AutoPlug never asks for your Microsoft password.")) return; + if (clientId.getText().trim().isEmpty()) { information("Microsoft client ID", "Enter and save the public client ID of your Microsoft application before signing in."); return; } + SettingsInfo settings; + try { settings = settingsFromForm(); } catch (IllegalArgumentException e) { error(e); return; } + run("Waiting for Microsoft sign-in", () -> { + actions.saveSettings(settings); + actions.signInMicrosoft(instructions -> SwingUtilities.invokeLater(() -> { if (!closed.get()) showSignIn(instructions); })); return null; + }, ignored -> { if (signInDialog != null) signInDialog.dispose(); refreshSettings(); }); + }), button("Use offline name", () -> { + String name = offlineName.getText().trim(); + if (!name.matches("[A-Za-z0-9_]{1,16}")) { information("Offline player name", "Use 1–16 letters, numbers or underscores."); return; } + run("Switching to offline account", () -> { actions.useOfflineAccount(name); return null; }, ignored -> refreshSettings()); + }))); + JTextArea note = textArea(3); note.setText("Offline mode is for local/offline-enabled play. Online servers usually require a licensed Microsoft account.\nUPnP is used only after you explicitly choose Share; unsupported routers need manual forwarding or a tunnel."); + note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note); content.add(Box.createVerticalGlue()); + JScrollPane scroll = new JScrollPane(content); scroll.setBorder(null); scroll.getVerticalScrollBar().setUnitIncrement(16); page.add(scroll, BorderLayout.CENTER); return page; + } + private void refreshSettings() { run("Loading settings", actions::settings, this::showSettings); } + private void showSettings(SettingsInfo settings) { + loadedSettings = settings; java8.setText(settings.javaPaths.getOrDefault(8, settings.java8)); java17.setText(settings.javaPaths.getOrDefault(17, settings.java17)); java21.setText(settings.javaPaths.getOrDefault(21, settings.java21)); + StringJoiner extra = new StringJoiner("; "); settings.javaPaths.forEach((major, path) -> { if (major != 8 && major != 17 && major != 21) extra.add(major + "=" + path); }); extraJava.setText(extra.toString()); + clientId.setText(settings.microsoftClientId); account.setText(settings.account); port.setValue(Math.max(1, Math.min(65535, settings.port))); upnp.setSelected(settings.upnp); rememberAccount.setSelected(settings.rememberAccount); refreshDefaultProfiles(); + } + private void refreshDefaultProfiles() { + String selected = loadedSettings == null ? "" : loadedSettings.defaultProfile; + defaultProfile.removeAllItems(); defaultProfile.addItem(null); + for (ProfileInfo p : clientProfiles()) { defaultProfile.addItem(p); if (p.id.equals(selected)) defaultProfile.setSelectedItem(p); } + } + private SettingsInfo settingsFromForm() { + SettingsInfo settings = new SettingsInfo(); settings.java8 = java8.getText().trim(); settings.java17 = java17.getText().trim(); settings.java21 = java21.getText().trim(); + if (!settings.java8.isEmpty()) settings.javaPaths.put(8, settings.java8); if (!settings.java17.isEmpty()) settings.javaPaths.put(17, settings.java17); if (!settings.java21.isEmpty()) settings.javaPaths.put(21, settings.java21); + for (String entry : extraJava.getText().split(";")) { + if (entry.trim().isEmpty()) continue; String[] pair = entry.trim().split("=", 2); + try { int major = Integer.parseInt(pair[0].trim()); if (major < 1 || pair.length != 2 || pair[1].trim().isEmpty()) throw new IllegalArgumentException(); settings.javaPaths.put(major, pair[1].trim()); } + catch (RuntimeException e) { throw new IllegalArgumentException("Other runtimes must use major=path, separated by semicolons."); } + } + ProfileInfo profile = (ProfileInfo) defaultProfile.getSelectedItem(); settings.defaultProfile = profile == null ? "" : profile.id; + settings.port = (Integer) port.getValue(); settings.upnp = upnp.isSelected(); settings.rememberAccount = rememberAccount.isSelected(); settings.microsoftClientId = clientId.getText().trim(); settings.account = account.getText(); return settings; + } + private void saveSettings() { + try { SettingsInfo settings = settingsFromForm(); run("Saving settings", () -> { actions.saveSettings(settings); return settings; }, this::showSettings); } + catch (IllegalArgumentException e) { error(e); } + } + private void showSignIn(String instructions) { + if (signInDialog != null) signInDialog.dispose(); + signInDialog = new JDialog(SwingUtilities.getWindowAncestor(this), "Authorize Microsoft sign-in", Dialog.ModalityType.MODELESS); + JTextArea text = textArea(8); text.setText(instructions); text.setBorder(new EmptyBorder(20, 20, 20, 20)); + signInDialog.add(new JScrollPane(text)); signInDialog.setSize(560, 300); signInDialog.setLocationRelativeTo(this); signInDialog.setVisible(true); + } + + private void run(String description, Callable work, Consumer success) { + if (closed.get()) return; running.incrementAndGet(); status.setText(description + "…"); + try { workers.submit(() -> { + try { + T result = work.call(); SwingUtilities.invokeLater(() -> { if (!closed.get()) success.accept(result); }); + } catch (Exception e) { SwingUtilities.invokeLater(() -> { if (!closed.get()) { status.setText(description + " failed: " + message(e)); error(e); } }); } + finally { running.decrementAndGet(); SwingUtilities.invokeLater(() -> { if (!closed.get()) { int remaining = running.get(); if (remaining > 0) status.setText(remaining + " background operation(s) running…"); else if (status.getText().endsWith("…")) status.setText("Ready"); } }); } + }); } catch (RejectedExecutionException ignored) { running.decrementAndGet(); } + } + private void openFolder(String directory) { run("Opening folder", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Opening folders is unavailable on this system."); Desktop.getDesktop().open(new File(directory)); return null; }, ignored -> {}); } + private void openEula() { run("Opening Minecraft EULA", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Open https://aka.ms/MinecraftEULA in your browser."); Desktop.getDesktop().browse(java.net.URI.create("https://aka.ms/MinecraftEULA")); return null; }, ignored -> {}); } + private void error(Exception e) { information("Could not complete action", message(e)); } + private static String message(Exception e) { return e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage(); } + private void information(String title, String message) { JTextArea text = textArea(9); text.setText(message); text.setCaretPosition(0); JScrollPane scroll = new JScrollPane(text); scroll.setPreferredSize(new Dimension(590, 260)); JOptionPane.showMessageDialog(this, scroll, title, JOptionPane.INFORMATION_MESSAGE); } + private boolean confirm(String title, String message) { return JOptionPane.showConfirmDialog(this, message, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION; } + private boolean confirmText(String title, String message) { JTextArea text = textArea(12); text.setText(message); JScrollPane scroll = new JScrollPane(text); scroll.setPreferredSize(new Dimension(650, 350)); return JOptionPane.showConfirmDialog(this, scroll, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION; } + private boolean form(String title, JPanel fields) { fields.setPreferredSize(new Dimension(530, Math.max(160, fields.getPreferredSize().height))); return JOptionPane.showConfirmDialog(this, fields, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION; } + private boolean required(JTextField... fields) { for (JTextField field : fields) if (field.getText().trim().isEmpty()) { information("Missing details", "Complete all required fields before continuing."); return false; } return true; } + private static JComboBox loaders(String selected) { JComboBox result = new JComboBox<>(new String[]{"VANILLA", "FABRIC", "QUILT", "FORGE", "NEOFORGE", "PAPER", "SPIGOT", "PURPUR"}); result.setSelectedItem(selected); return result; } + private static JLabel section(String title) { JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 16f)); label.setBorder(new EmptyBorder(0, 0, 10, 0)); label.setAlignmentX(Component.LEFT_ALIGNMENT); return label; } + private static JPanel page(String title, String description) { + JPanel page = new JPanel(new BorderLayout(0, 22)); page.setBorder(new EmptyBorder(26, 22, 16, 22)); + JPanel heading = new JPanel(new BorderLayout(0, 7)); JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 27f)); + heading.add(label, BorderLayout.NORTH); JLabel subtitle = new JLabel(description); subtitle.setFont(subtitle.getFont().deriveFont(12f)); heading.add(subtitle, BorderLayout.SOUTH); page.add(heading, BorderLayout.NORTH); return page; + } + private static JPanel content() { return new JPanel(new BorderLayout(0, 12)); } + private static JPanel toolbar(JComponent... components) { JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 6, 3)); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } + private static JButton button(String text, Runnable action) { JButton button = new JButton(text); button.addActionListener(e -> action.run()); return button; } + private static JTextArea textArea(int rows) { JTextArea area = new JTextArea(rows, 30); area.setEditable(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setFont(UIManager.getFont("Label.font")); return area; } + private static DefaultTableModel model(String... columns) { return new DefaultTableModel(columns, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; } + private static JTable table(DefaultTableModel model) { + JTable table = new JTable(model); table.setRowHeight(35); table.setFillsViewportHeight(true); + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setAutoCreateRowSorter(true); table.getTableHeader().setReorderingAllowed(false); + javax.swing.table.DefaultTableCellRenderer text = new javax.swing.table.DefaultTableCellRenderer(); + text.putClientProperty("html.disable", Boolean.TRUE); table.setDefaultRenderer(Object.class, text); + return table; + } + private static JScrollPane tableScroll(JTable table) { JScrollPane scroll = new JScrollPane(table); scroll.setColumnHeaderView(table.getTableHeader()); return scroll; } + private static JPanel fields(Object... fields) { + JPanel panel = new JPanel(new GridBagLayout()); panel.setAlignmentX(Component.LEFT_ALIGNMENT); + for (int i = 0; i < fields.length; i += 2) { + GridBagConstraints label = new GridBagConstraints(); label.gridx = 0; label.gridy = i / 2; label.anchor = GridBagConstraints.WEST; label.insets = new Insets(5, 0, 5, 14); + panel.add(new JLabel(String.valueOf(fields[i])), label); + GridBagConstraints value = new GridBagConstraints(); value.gridx = 1; value.gridy = i / 2; value.weightx = 1; value.fill = GridBagConstraints.HORIZONTAL; value.insets = new Insets(5, 0, 5, 0); + panel.add((Component) fields[i + 1], value); + } + panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, panel.getPreferredSize().height + 16)); return panel; + } + @Override public void close() { + if (!closed.compareAndSet(false, true)) return; workers.shutdownNow(); + if (console != null) console.close(); if (signInDialog != null) signInDialog.dispose(); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java new file mode 100644 index 00000000..792d10f8 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java @@ -0,0 +1,66 @@ +package com.osiris.autoplug.client.ui; + +import java.util.Collections; +import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; + +/** Application services used by the dashboard. Calls run outside Swing's event thread. */ +public interface LauncherActions { + default List profiles() throws Exception { return Collections.emptyList(); } + default ProfileInfo createProfile(String name, String version, String loader, String type, boolean template) throws Exception { throw unavailable(); } + default ProfileInfo cloneProfile(String sourceId, String name, String targetVersion, String loader) throws Exception { throw unavailable(); } + default void deleteProfile(String id) throws Exception { throw unavailable(); } + default String checkProfile(String id) throws Exception { throw unavailable(); } + default String updateProfile(String id) throws Exception { throw unavailable(); } + default void setTemplate(String id, boolean template) throws Exception { throw unavailable(); } + default void addArtifact(String profileId, String jarPath, String modrinthId) throws Exception { throw unavailable(); } + default List worlds() throws Exception { return Collections.emptyList(); } + default WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { throw unavailable(); } + default void setWorldEulaAccepted(String id, boolean accepted) throws Exception { throw unavailable(); } + default void launchWorld(String id, boolean share) throws Exception { throw unavailable(); } + default String shareWorld(String id) throws Exception { throw unavailable(); } + default void launchProfile(String profileId, String host, int port) throws Exception { throw unavailable(); } + default SettingsInfo settings() throws Exception { return new SettingsInfo(); } + default void saveSettings(SettingsInfo settings) throws Exception { throw unavailable(); } + /** Deliver device sign-in instructions before waiting for the account provider. Never log tokens. */ + default void signInMicrosoft(Consumer instructions) throws Exception { throw unavailable(); } + default void useOfflineAccount(String name) throws Exception { throw unavailable(); } + + static UnsupportedOperationException unavailable() { + return new UnsupportedOperationException("The launcher service is not available yet."); + } + + final class ProfileInfo { + public final String id, name, gameVersion, loader, type, directory, migrationSummary; + public final boolean template, launchable; + public ProfileInfo(String id, String name, String gameVersion, String loader, String type, String directory, boolean template) { + this(id, name, gameVersion, loader, type, directory, template, "", true); + } + public ProfileInfo(String id, String name, String gameVersion, String loader, String type, String directory, boolean template, String migrationSummary, boolean launchable) { + this.id = id; this.name = name; this.gameVersion = gameVersion; this.loader = loader; + this.type = type; this.directory = directory; this.template = template; + this.migrationSummary = migrationSummary; this.launchable = launchable; + } + @Override public String toString() { return name + " · " + gameVersion + " / " + loader; } + } + + final class WorldInfo { + public final String id, name, serverProfileId, clientProfileId, directory, thumbnail; + public final boolean running; + public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running) { + this.id = id; this.name = name; this.serverProfileId = serverProfileId; this.clientProfileId = clientProfileId; this.directory = directory; + this.thumbnail = thumbnail; this.running = running; + } + @Override public String toString() { return name; } + } + + final class SettingsInfo { + public String java8 = "", java17 = "", java21 = "", defaultProfile = "", account = "Offline", microsoftClientId = ""; + public Map javaPaths = new LinkedHashMap<>(); + public int port = 25565; + public boolean upnp = true; + public boolean rememberAccount = false; + } +} diff --git a/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java b/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java index 60c29f6b..1d746f90 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java +++ b/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java @@ -1,175 +1,101 @@ -/* - * Copyright (c) 2022-2023 Osiris-Team. - * All rights reserved. - * - * This software is copyrighted work, licensed under the terms - * of the MIT-License. Consult the "LICENSE" file for details. - */ - +/* Copyright (c) 2022-2026 Osiris-Team. Licensed under the MIT License. */ package com.osiris.autoplug.client.ui; import com.formdev.flatlaf.FlatDarculaLaf; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.FlatLightLaf; +import com.osiris.autoplug.client.browser.ServerBrowserService; import com.osiris.autoplug.client.configs.GeneralConfig; -import com.osiris.autoplug.client.ui.utils.MyMouseListener; import com.osiris.autoplug.client.utils.GD; -import com.osiris.betterlayout.BLayout; import com.osiris.betterlayout.utils.UIDebugWindow; import com.osiris.jlib.logger.AL; - +import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; import java.io.File; import java.io.InputStream; -import java.nio.file.Files; +import java.util.Objects; +/** One dashboard shared by the tray and the desktop window. Closing the window hides it. */ public class MainWindow extends JFrame { - /** - * There should always be only one instance of {@link MainWindow}. - */ - public static MainWindow GET = null; + public static volatile MainWindow GET; public static final Object lockUI = new Object(); + private static volatile LauncherActions launcherActions = new LauncherActions() {}; + private static volatile ServerBrowserService browserService = ServerBrowserService.defaults(); public TrayIcon trayIcon; + private DashboardPanel dashboard; - public MainWindow(GeneralConfig generalConfig) throws Exception { - synchronized (lockUI){ - if (GET != null) { - GET.close(); // There should only be one, thus stop old - } - GET = this; - } - initTheme(generalConfig); - start(); - this.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - } - - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_F12) - new UIDebugWindow(GET); - } - - @Override - public void keyReleased(KeyEvent e) { - } - }); + public static void setLauncherActions(LauncherActions actions) { + launcherActions = Objects.requireNonNull(actions); + SwingUtilities.invokeLater(() -> { if (GET != null) GET.installDashboard(); }); } + public static void setBrowserService(ServerBrowserService browser) { browserService = Objects.requireNonNull(browser); } - public void initTheme() { - initTheme(null); + public MainWindow(GeneralConfig generalConfig) throws Exception { + Runnable initialize = () -> { + synchronized (lockUI) { if (GET != null) GET.close(); GET = this; } + initTheme(generalConfig); + try { start(); } catch (Exception e) { AL.warn("Could not initialize the dashboard", e); } + }; + if (SwingUtilities.isEventDispatchThread()) initialize.run(); else SwingUtilities.invokeAndWait(initialize); } + public void initTheme() { initTheme(null); } public void initTheme(GeneralConfig generalConfig) { + if (!SwingUtilities.isEventDispatchThread()) { + final GeneralConfig configuration = generalConfig; + SwingUtilities.invokeLater(() -> initTheme(configuration)); return; + } try { if (generalConfig == null) generalConfig = new GeneralConfig(); - if (generalConfig.autoplug_system_tray_theme.asString().equals("light")) { - if (!FlatLightLaf.setup()) throw new Exception("Returned false!"); - } else if (generalConfig.autoplug_system_tray_theme.asString().equals("dark")) { - if (!FlatDarkLaf.setup()) throw new Exception("Returned false!"); - } else if (generalConfig.autoplug_system_tray_theme.asString().equals("darcula")) { - if (!FlatDarculaLaf.setup()) throw new Exception("Returned false!"); - } else { - AL.warn("The selected theme '" + generalConfig.autoplug_system_tray_theme.asString() + "' is not a valid option! Using default."); - if (!FlatLightLaf.setup()) throw new Exception("Returned false!"); - } - } catch (Exception e) { - AL.warn("Failed to init GUI theme!", e); - } + String theme = generalConfig.autoplug_system_tray_theme.asString(); + if ("dark".equals(theme)) FlatDarkLaf.setup(); + else if ("darcula".equals(theme)) FlatDarculaLaf.setup(); + else FlatLightLaf.setup(); + if (isDisplayable()) SwingUtilities.invokeLater(() -> SwingUtilities.updateComponentTreeUI(this)); + } catch (Exception e) { AL.warn("Failed to initialize the dashboard theme", e); } } public void close() { - if (SystemTray.isSupported()) - SystemTray.getSystemTray().remove(trayIcon); - this.dispose(); - GET = null; + if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(this::close); return; } + if (dashboard != null) dashboard.close(); + if (trayIcon != null && SystemTray.isSupported()) SystemTray.getSystemTray().remove(trayIcon); + trayIcon = null; dispose(); if (GET == this) GET = null; } public void start() throws Exception { + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); setName("AutoPlug-Dashboard"); setTitle("AutoPlug — Minecraft Dashboard"); + setMinimumSize(new Dimension(950, 620)); + installDashboard(); pack(); setLocationRelativeTo(null); + getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0), "ui-debug"); + getRootPane().getActionMap().put("ui-debug", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { new UIDebugWindow(MainWindow.this); } }); + Image image = loadIcon(); if (image != null) setIconImage(image); if (SystemTray.isSupported()) { - SystemTray tray = SystemTray.getSystemTray(); - File icon = new File(GD.WORKING_DIR + "/autoplug/system/icon.png"); - if (!icon.exists()) { - icon.getParentFile().mkdirs(); - icon.createNewFile(); - InputStream link = (getClass().getResourceAsStream("/autoplug-icon.png")); - Files.copy(link, icon.toPath()); - } - Image image = Toolkit.getDefaultToolkit().getImage(icon.getAbsolutePath()); - trayIcon = new TrayIcon(image, "AutoPlug", null); - trayIcon.addMouseListener(new MyMouseListener().onClick(event -> { - this.setVisible(true); - })); - trayIcon.setImageAutoSize(true); - try { - tray.add(trayIcon); - } catch (AWTException e) { - AL.warn("Failed to create system tray GUI: Exception occurred.", e); - } - - TrayIcon finalTrayIcon = trayIcon; - /* // TODO causes dead lock and the jvm doesnt close: - // TODO find alternative to remove the icon. - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - AL.info("removing"); - tray.remove(finalTrayIcon); - AL.info("aaa"); - } catch (Exception e) { - e.printStackTrace(); - } - })); - - */ - - this.setIconImage(image); - initUI(); - } else throw new Exception("Failed to create system tray GUI: Not supported on your system."); + if (image == null) image = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB); + PopupMenu menu = new PopupMenu(); MenuItem open = new MenuItem("Open AutoPlug Dashboard"); + open.addActionListener(e -> openDashboard()); menu.add(open); + trayIcon = new TrayIcon(image, "AutoPlug", menu); trayIcon.setImageAutoSize(true); + trayIcon.addActionListener(e -> openDashboard()); + trayIcon.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent e) { if (e.getButton() == java.awt.event.MouseEvent.BUTTON1) openDashboard(); } }); + try { SystemTray.getSystemTray().add(trayIcon); } + catch (AWTException e) { trayIcon = null; AL.warn("Tray unavailable; opening the desktop dashboard", e); } + } + setVisible(trayIcon == null); } - private void initUI() throws Exception { - // TODO dont stop full autoplug when this window is closed - this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - this.setName("AutoPlug-Tray"); - this.setTitle("AutoPlug-Tray"); - this.setUndecorated(true); - int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width, screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; - int width = (int) (screenWidth / 1.5), height = screenHeight / 2; - this.setShape(new RoundRectangle2D.Double(0, 0, width, height, 20, 20)); - this.setLocation((screenWidth / 2) - (width / 2), (screenHeight / 2) - (height / 2)); // Position frame in mid of screen - this.setSize(width, height); - this.setVisible(false); - - BLayout thisLy = new BLayout(this); - this.setContentPane(thisLy); - thisLy.access(() -> { - // Add stuff to main window - JLabel titleAutoPlug = new JLabel(), titleTray = new JLabel(); - titleAutoPlug.setText("AutoPlug"); - titleAutoPlug.putClientProperty("FlatLaf.style", "font: 200% $semibold.font"); - thisLy.addH(titleAutoPlug); - - titleTray.setText(" | Tray"); - titleTray.putClientProperty("FlatLaf.style", "font: 200% $light.font"); - thisLy.addH(titleTray).delPadding().paddingTop(); - - JTabbedPane mainTab = new JTabbedPane(); - thisLy.addV(mainTab).height(80).widthFull(); - mainTab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - - // Tab panels/layouts - try { - mainTab.addTab("Server", new ServerPanel(mainTab)); - mainTab.addTab("Client", new ClientPanel(mainTab)); - //tabbedPane.addChangeListener(e -> selectedTabChanged()); - } catch (Exception e) { - AL.warn(e); - } - }); + private void installDashboard() { + if (dashboard != null) dashboard.close(); + dashboard = new DashboardPanel(launcherActions, browserService); setContentPane(dashboard); revalidate(); repaint(); + } + private void openDashboard() { SwingUtilities.invokeLater(() -> { setVisible(true); setState(Frame.NORMAL); toFront(); requestFocus(); }); } + private Image loadIcon() { + File custom = new File(GD.WORKING_DIR, "autoplug/system/icon.png"); + try { if (custom.isFile() && custom.length() > 0) { Image image = ImageIO.read(custom); if (image != null) return image; } } + catch (Exception e) { AL.warn("Could not read the custom tray icon", e); } + try (InputStream stream = getClass().getResourceAsStream("/autoplug-icon.png")) { return stream == null ? null : ImageIO.read(stream); } + catch (Exception e) { AL.warn("Could not read the dashboard icon", e); return null; } } } diff --git a/src/main/java/com/osiris/autoplug/client/ui/ServerConsolePanel.java b/src/main/java/com/osiris/autoplug/client/ui/ServerConsolePanel.java index f75ba633..ef034811 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/ServerConsolePanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/ServerConsolePanel.java @@ -1,112 +1,78 @@ -/* - * Copyright (c) 2022-2024 Osiris-Team. - * All rights reserved. - * - * This software is copyrighted work, licensed under the terms - * of the MIT-License. Consult the "LICENSE" file for details. - */ - +/* Copyright (c) 2022-2026 Osiris-Team. Licensed under the MIT License. */ package com.osiris.autoplug.client.ui; +import com.osiris.autoplug.client.Server; import com.osiris.autoplug.client.console.Commands; import com.osiris.autoplug.client.ui.utils.HintTextField; -import com.osiris.autoplug.client.ui.utils.MyMouseListener; -import com.osiris.betterlayout.BLayout; +import com.osiris.autoplug.client.utils.io.AsyncInputStream; +import com.osiris.jlib.events.MessageEvent; import com.osiris.jlib.logger.AL; +import com.osiris.jlib.logger.Message; import com.osiris.jlib.logger.MessageFormatter; - import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.util.ArrayList; - -public class ServerConsolePanel extends BLayout { - - public JLabel labelConsole = new JLabel("Console"); - public BLayout txtConsole; - public HintTextField txtSendCommand = new HintTextField("Send command..."); - private final JButton execute; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +/** Bounded console for AutoPlug task messages and the current dedicated server output. */ +public class ServerConsolePanel extends JPanel implements AutoCloseable { + public final JLabel labelConsole = new JLabel("Console"); + public final JTextArea txtConsole = new JTextArea(); + public final HintTextField txtSendCommand = new HintTextField("Send command…"); + private final ConcurrentLinkedQueue pending = new ConcurrentLinkedQueue<>(); + private final AtomicInteger queued = new AtomicInteger(); + private final MessageEvent logListener = message -> append(MessageFormatter.formatForFile(message)); + private final Consumer serverListener = this::append; + private final ExecutorService commandExecutor = Executors.newSingleThreadExecutor(r -> { Thread t = new Thread(r, "AutoPlug-ConsoleCommands"); t.setDaemon(true); return t; }); + private final Timer timer; + private AsyncInputStream observed; + private volatile boolean closed; public ServerConsolePanel(Container parent) { - super(parent); - - execute = new JButton("Execute"); - BLayout jPanel = new BLayout(this, 100, 30); -// jPanel.setLayout(new FlowLayout()); - jPanel.addH(txtSendCommand); - jPanel.addH(execute); - - //TODO this.addV(getBtnMinecraftLaunch()); - - txtConsole = new BLayout(this, 100, 80); - txtConsole.defaultCompStyles.delPadding(); - txtConsole.makeScrollable(); - //TODO txtConsole.getScrollPane().getVerticalScrollBar().setUnitIncrement(16); - - this.addV(txtSendCommand); - this.addV(jPanel); - - AL.actionsOnMessageEvent.add(msg -> { - txtConsole.access(() -> { - for (JLabel jLabel : toLabel(MessageFormatter.formatForFile(msg))) { - txtConsole.addV(jLabel); - } - //txtConsole.setText(txtConsole.getText() + + "\n"); - }); - txtConsole.scrollToEndV(); - }); - txtSendCommand.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if (e.getKeyChar() == KeyEvent.VK_ENTER) { - txtConsole.access(() -> { - txtConsole.addV(new JLabel(txtSendCommand.getText())); - }); - txtConsole.scrollToEndV(); - AL.info("Received System-Tray command: '" + txtSendCommand.getText() + "'"); - Commands.execute(txtSendCommand.getText()); - txtSendCommand.setText(""); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - execute.addActionListener(e -> { - txtConsole.access(() -> { - txtConsole.addV(new JLabel(txtSendCommand.getText())); - }); - txtConsole.scrollToEndV(); - AL.info("Received System-Tray command: '" + txtSendCommand.getText() + "'"); - Commands.execute(txtSendCommand.getText()); - txtSendCommand.setText(""); - }); + super(new BorderLayout(0, 8)); setBorder(new EmptyBorder(12, 12, 12, 12)); + txtConsole.setEditable(false); txtConsole.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + add(new JScrollPane(txtConsole), BorderLayout.CENTER); + JPanel command = new JPanel(new BorderLayout(8, 0)); command.add(txtSendCommand, BorderLayout.CENTER); + JButton execute = new JButton("Send"); execute.addActionListener(e -> submit()); txtSendCommand.addActionListener(e -> submit()); + command.add(execute, BorderLayout.EAST); add(command, BorderLayout.SOUTH); + AL.actionsOnMessageEvent.add(logListener); + timer = new Timer(150, e -> drain()); timer.start(); } - - private JButton getBtnMinecraftLaunch() { - JButton btn = new JButton("Launch Minecraft"); - btn.addMouseListener(new MyMouseListener().onClick(event -> { - - })); - return btn; + public static void executeCommand(String command) throws Exception { + if (command == null || command.trim().isEmpty()) return; + if (!Commands.execute(command)) Server.submitCommand(command); } - - private java.util.List toLabel(String ansi) { - // TODO convert ansi colors to awt - String[] lines = ansi.split("\n"); - java.util.List list = new ArrayList<>(); - for (String line : lines) { - list.add(new JLabel(line)); + private void submit() { + String command = txtSendCommand.getText(); if (command.trim().isEmpty() || closed) return; + txtSendCommand.setText(""); append("> " + command); + commandExecutor.submit(() -> { try { executeCommand(command); } catch (Exception e) { append("Command failed: " + e.getMessage()); } }); + } + private void append(String text) { + if (closed || text == null) return; + if (queued.incrementAndGet() > 1000) { queued.decrementAndGet(); return; } + if (text.length() > 16384) text = text.substring(0, 16384) + " [line truncated]"; + pending.add(text.replaceAll("\\u001B\\[[;\\d]*[ -/]*[@-~]", "")); + } + private void drain() { + if (closed) return; + AsyncInputStream current = Server.ASYNC_SERVER_IN; + if (observed != current) { + if (observed != null) observed.listeners.remove(serverListener); + observed = current; if (observed != null) observed.listeners.add(serverListener); } - return list; + StringBuilder batch = new StringBuilder(); String line; + while ((line = pending.poll()) != null) { queued.decrementAndGet(); batch.append(line).append('\n'); } + if (batch.length() == 0) return; + txtConsole.append(batch.toString()); + int excess = txtConsole.getDocument().getLength() - 250000; + if (excess > 0) try { txtConsole.getDocument().remove(0, excess); } catch (javax.swing.text.BadLocationException ignored) {} + txtConsole.setCaretPosition(txtConsole.getDocument().getLength()); + } + @Override public void close() { + closed = true; timer.stop(); AL.actionsOnMessageEvent.remove(logListener); + if (observed != null) observed.listeners.remove(serverListener); observed = null; + pending.clear(); queued.set(0); commandExecutor.shutdownNow(); } } diff --git a/src/main/java/com/osiris/autoplug/client/utils/MineStat.java b/src/main/java/com/osiris/autoplug/client/utils/MineStat.java index 8e23edf9..1097e16f 100644 --- a/src/main/java/com/osiris/autoplug/client/utils/MineStat.java +++ b/src/main/java/com/osiris/autoplug/client/utils/MineStat.java @@ -55,6 +55,7 @@ public class MineStat { * Minecraft version the server is running */ private String version; + private int protocol = -1; /** * Current number of players on the server */ @@ -178,26 +179,30 @@ public String stripMotdFormatting(String motd) { } public String stripMotdFormatting(JsonObject motd) { - StringBuilder strippedMotd = new StringBuilder(); - - if (motd.isJsonPrimitive()) { - return motd.getAsString(); - } + return stripMotdFormatting((JsonElement) motd); + } - JsonObject motdObj = motd.getAsJsonObject(); - if (motdObj.has("text")) { - strippedMotd.append(motdObj.get("text").getAsString()); - } + public String stripMotdFormatting(JsonElement motd) { + return stripMotdFormatting(motd, 0); + } - if (motdObj.has("extra") && motdObj.get("extra").isJsonArray()) { - for (JsonElement extraElem : motdObj.get("extra").getAsJsonArray()) { - strippedMotd.append(stripMotdFormatting(extraElem.getAsJsonObject())); - } + private String stripMotdFormatting(JsonElement motd, int depth) { + if (motd == null || motd.isJsonNull() || depth > 32) return ""; + if (motd.isJsonPrimitive()) return stripMotdFormatting(motd.getAsString()); + StringBuilder text = new StringBuilder(); + if (motd.isJsonArray()) { + for (JsonElement child : motd.getAsJsonArray()) text.append(stripMotdFormatting(child, depth + 1)); + } else if (motd.isJsonObject()) { + JsonObject object = motd.getAsJsonObject(); + if (object.has("text")) text.append(stripMotdFormatting(object.get("text"), depth + 1)); + if (object.has("translate")) text.append(stripMotdFormatting(object.get("translate"), depth + 1)); + if (object.has("extra")) text.append(stripMotdFormatting(object.get("extra"), depth + 1)); } - - return strippedMotd.toString(); + return text.toString(); } + public int getProtocol() { return protocol; } + public String getVersion() { return version; } @@ -519,50 +524,52 @@ public boolean isDataValid() { * 'description': {'text': 'A Minecraft Server'}} */ public Retval jsonRequest(String address, int port, int timeout) { - try { - String[] serverData = null; - byte[] rawServerData = null; - Socket clientSocket = new Socket(); + serverUp = false; + protocol = -1; + try (Socket clientSocket = new Socket()) { long startTime = System.currentTimeMillis(); - clientSocket.connect(new InetSocketAddress(getAddress(), getPort()), getTimeout()); - setLatency(System.currentTimeMillis() - startTime); + clientSocket.connect(new InetSocketAddress(address, port), timeout); + clientSocket.setSoTimeout(timeout); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream payload = new DataOutputStream(baos); DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream()); DataInputStream dis = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream())); payload.writeByte(0x00); // handshake packet sendVarInt(payload, 0x00); // protocol version - sendVarInt(payload, address.length()); // packed remote address length as varint - payload.writeBytes(address); // remote address as string + byte[] hostBytes = address.getBytes(StandardCharsets.UTF_8); + sendVarInt(payload, hostBytes.length); // packed remote address length as varint + payload.write(hostBytes); // remote address as UTF-8 string payload.writeShort(port); // remote port as short sendVarInt(payload, 0x01); // state packet sendVarInt(dos, baos.size()); // payload size as varint dos.write(baos.toByteArray()); // send payload dos.writeByte(0x01); // size dos.writeByte(0x00); // ping packet - int totalLength = recvVarInt(dis); // total response size - int packetID = recvVarInt(dis); // packet ID - int jsonLength = recvVarInt(dis); // JSON response size - byte[] rawData = new byte[jsonLength]; // storage for JSON data - - dis.readFully(rawData); // fill byte array with JSON data - - // Close sockets - if (!clientSocket.isClosed()) { - clientSocket.close(); - } + dos.flush(); + int totalLength = readStatusVarInt(dis); + if (totalLength < 3 || totalLength > 1024 * 1024) return Retval.UNKNOWN; + byte[] packet = new byte[totalLength]; + dis.readFully(packet); + DataInputStream response = new DataInputStream(new ByteArrayInputStream(packet)); + if (readStatusVarInt(response) != 0) return Retval.UNKNOWN; + int jsonLength = readStatusVarInt(response); + if (jsonLength < 1 || jsonLength != response.available()) return Retval.UNKNOWN; + byte[] rawData = new byte[jsonLength]; + response.readFully(rawData); + setLatency(System.currentTimeMillis() - startTime); // Populate object from JSON data - JsonObject jobj = new Gson().fromJson(new String(rawData), JsonObject.class); + JsonObject jobj = new Gson().fromJson(new String(rawData, StandardCharsets.UTF_8), JsonObject.class); setMotd(jobj.get("description").toString()); - setStrippedMotd(stripMotdFormatting(jobj.get("description").getAsJsonObject())); + setStrippedMotd(stripMotdFormatting(jobj.get("description"))); setVersion(jobj.get("version").getAsJsonObject().get("name").getAsString()); + protocol = jobj.get("version").getAsJsonObject().get("protocol").getAsInt(); setCurrentPlayers(jobj.get("players").getAsJsonObject().get("online").getAsInt()); setMaximumPlayers(jobj.get("players").getAsJsonObject().get("max").getAsInt()); - serverUp = true; setRequestType("SLP 1.7 (JSON)"); if (!isDataValid()) return Retval.UNKNOWN; + serverUp = true; } catch (ConnectException ce) { return Retval.CONNFAIL; } catch (SocketException se) { @@ -579,6 +586,18 @@ public Retval jsonRequest(String address, int port, int timeout) { return Retval.SUCCESS; } + /** Unlike the legacy helper, preserve socket timeouts for an accurate ping result. */ + private int readStatusVarInt(DataInputStream input) throws IOException { + int result = 0; + for (int index = 0; index < 5; index++) { + int value = input.readUnsignedByte(); + if (index == 4 && (value & 0xf0) != 0) throw new IOException("Status packet varint exceeds 32 bits."); + result |= (value & 0x7f) << (index * 7); + if ((value & 0x80) == 0) return result; + } + throw new IOException("Status packet varint is too long."); + } + public enum Retval { SUCCESS(0), CONNFAIL(-1), TIMEOUT(-2), UNKNOWN(-3); @@ -606,4 +625,4 @@ public int getRequest() { return request; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ClientLauncher.java b/src/main/java/com/osiris/autoplug/client/worlds/ClientLauncher.java new file mode 100644 index 00000000..b0d90f83 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ClientLauncher.java @@ -0,0 +1,8 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.Profile; + +@FunctionalInterface +public interface ClientLauncher { + Process launch(Profile profile, String host, int port) throws Exception; +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java b/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java new file mode 100644 index 00000000..154f41e2 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java @@ -0,0 +1,47 @@ +package com.osiris.autoplug.client.worlds; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.List; +import java.util.stream.Collectors; + +/** Owns exactly one server process and performs bounded, graceful shutdown. */ +public final class ManagedServer implements AutoCloseable { + private final Process process; + private final long stopTimeoutMillis; + private final AtomicBoolean closed = new AtomicBoolean(); + public ManagedServer(Process process, long stopTimeoutMillis) { + this.process = process; + this.stopTimeoutMillis = stopTimeoutMillis; + } + public Process process() { return process; } + public boolean isAlive() { return process.isAlive(); } + + @Override public void close() { + if (!closed.compareAndSet(false, true)) return; + List descendants = process.descendants().collect(Collectors.toList()); + try { + if (process.isAlive()) { + process.getOutputStream().write("stop\n".getBytes(StandardCharsets.UTF_8)); + process.getOutputStream().flush(); + if (process.waitFor(stopTimeoutMillis, TimeUnit.MILLISECONDS)) return; + } + } catch (IOException ignored) { + // A broken stdin must not leave an owned server running. + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + if (process.isAlive()) { + descendants.forEach(ProcessHandle::destroy); + process.destroy(); + try { process.waitFor(1000, TimeUnit.MILLISECONDS); } + catch (InterruptedException e) { Thread.currentThread().interrupt(); } + descendants.forEach(ProcessHandle::destroyForcibly); + if (process.isAlive()) process.destroyForcibly(); + } + descendants.stream().filter(ProcessHandle::isAlive).forEach(ProcessHandle::destroyForcibly); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/MinecraftServerInstaller.java b/src/main/java/com/osiris/autoplug/client/worlds/MinecraftServerInstaller.java new file mode 100644 index 00000000..29a91b45 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/MinecraftServerInstaller.java @@ -0,0 +1,198 @@ +package com.osiris.autoplug.client.worlds; + +import com.google.gson.*; +import com.osiris.autoplug.client.profiles.ArtifactCache; +import com.osiris.autoplug.client.profiles.Profile; +import com.osiris.autoplug.client.profiles.ProfileLease; +import io.github.projectunified.mcserverupdater.UpdateBuilder; +import io.github.projectunified.mcserverupdater.UpdateStatus; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.regex.Pattern; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +/** Reuses the bundled server updaters, with isolated install work and shared immutable JARs. */ +public final class MinecraftServerInstaller implements ServerInstaller { + @FunctionalInterface public interface JavaRuntime { Path resolve(String gameVersion) throws Exception; } + @FunctionalInterface public interface ArtifactProvider { Path acquire(Profile profile, Path workspace, Path javaExecutable) throws Exception; } + private final ArtifactCache cache; + private final JavaRuntime runtimes; + private final Consumer progress; + private final ServerInstaller moddedInstaller; + private final ArtifactProvider provider; + + public MinecraftServerInstaller(ArtifactCache cache, JavaRuntime runtimes) { + this(cache, runtimes, ignored -> { }, null); + } + public MinecraftServerInstaller(ArtifactCache cache, JavaRuntime runtimes, Consumer progress, ServerInstaller moddedInstaller) { + this.cache = Objects.requireNonNull(cache); this.runtimes = Objects.requireNonNull(runtimes); + this.progress = Objects.requireNonNull(progress); this.moddedInstaller = moddedInstaller; + this.provider = this::acquire; + } + public MinecraftServerInstaller(ArtifactCache cache, JavaRuntime runtimes, ArtifactProvider provider) { + this.cache = Objects.requireNonNull(cache); this.runtimes = Objects.requireNonNull(runtimes); + this.provider = Objects.requireNonNull(provider); this.progress = ignored -> { }; this.moddedInstaller = null; + } + + @Override public ServerLaunch prepare(Profile profile, Path worldDirectory) throws Exception { + Files.createDirectories(worldDirectory); + try (ProfileLease ignored = new ProfileLease(profile.getDirectory())) { copyProfile(profile, worldDirectory); } + String software = profile.getLoader().toLowerCase(Locale.ROOT); + if (Arrays.asList("forge", "neoforge", "quilt").contains(software)) { + if (moddedInstaller == null) throw new IOException("No native server installer configured for " + software); + return moddedInstaller.prepare(profile, worldDirectory); + } + if (Arrays.asList("velocity", "bungee", "bungeecord").contains(software)) + throw new IOException("Proxy profiles cannot host a Minecraft world; select Paper, Spigot or a modded server"); + Path java = runtimes.resolve(profile.getGameVersion()); + String key = safe(software) + "-" + safe(profile.getGameVersion()) + "-" + safe(profile.getLoaderVersion() == null ? "default" : profile.getLoaderVersion()); + Path work = cache.getRoot().resolve("server-installers").resolve(key); + Files.createDirectories(work); + try (ProfileLease ignored = new ProfileLease(work)) { + Path jar = work.resolve("server.jar"); + if (!Files.isRegularFile(jar) || Files.size(jar) == 0) { + Path acquired = provider.acquire(profile, work, java); + if (acquired == null || !Files.isRegularFile(acquired)) throw new IOException("Server installer produced no JAR"); + try (JarFile ignoredJar = new JarFile(acquired.toFile())) { /* Reject error pages and incomplete downloads. */ } + cache.link(cache.store(acquired), jar); + } + cache.link(cache.store(jar), worldDirectory.resolve("server.jar")); + } + return new ServerLaunch(Arrays.asList(java.toString(), "-Xms512M", "-Xmx2G", "-jar", "server.jar", "nogui"), worldDirectory); + } + + private void copyProfile(Profile profile, Path worldDirectory) throws IOException { + Set roots = new HashSet<>(Arrays.asList("mods", "plugins", "config", "defaultconfigs", "server.properties", + "bukkit.yml", "spigot.yml", "paper.yml", "permissions.yml", "whitelist.json", "ops.json", "banned-players.json", + "banned-ips.json", "server-icon.png")); + Set jars = new TreeSet<>(); + Path source = profile.getDirectory(); + Files.walkFileTree(source, new SimpleFileVisitor() { + @Override public FileVisitResult preVisitDirectory(Path directory, BasicFileAttributes attrs) throws IOException { + Path relative = source.relativize(directory); + if (!relative.toString().isEmpty() && !roots.contains(relative.getName(0).toString())) return FileVisitResult.SKIP_SUBTREE; + Path target = worldDirectory.resolve(relative); + if (Files.isSymbolicLink(target)) throw new IOException("Linked world configuration directory: " + relative); + Files.createDirectories(target); + return FileVisitResult.CONTINUE; + } + @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Path relative = source.relativize(file); + if (!roots.contains(relative.getName(0).toString())) return FileVisitResult.CONTINUE; + Path target = worldDirectory.resolve(relative); + if (file.getFileName().toString().endsWith(".jar")) { + cache.link(cache.store(file), target); + jars.add(relative.toString().replace('\\', '/')); + } else { + if (Files.isSymbolicLink(file) || Files.isSymbolicLink(target)) throw new IOException("Linked profile configuration: " + relative); + // World-specific settings survive profile refreshes. + if (!Files.exists(target)) Files.copy(file, target); + } + return FileVisitResult.CONTINUE; + } + }); + Path manifest = worldDirectory.resolve(".autoplug-profile-jars"); + if (Files.isSymbolicLink(manifest)) throw new IOException("Invalid world artifact manifest"); + if (Files.exists(manifest)) { + for (String old : Files.readAllLines(manifest, StandardCharsets.UTF_8)) { + Path path = worldDirectory.resolve(old).normalize(); + if (!jars.contains(old) && path.startsWith(worldDirectory) && old.endsWith(".jar") + && (old.startsWith("mods/") || old.startsWith("plugins/"))) Files.deleteIfExists(path); + } + } + Files.write(manifest, jars, StandardCharsets.UTF_8); + } + + private Path acquire(Profile profile, Path work, Path java) throws Exception { + String software = profile.getLoader().toLowerCase(Locale.ROOT); + if (software.equals("bukkit")) software = "spigot"; + Path output = work.resolve("download.jar"); + if (software.equals("vanilla")) { + JsonObject manifest = json("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json").getAsJsonObject(); + String metadata = null; + for (JsonElement item : manifest.getAsJsonArray("versions")) { + JsonObject version = item.getAsJsonObject(); + if (profile.getGameVersion().equals(version.get("id").getAsString())) metadata = version.get("url").getAsString(); + } + if (metadata == null) throw new IOException("Unknown Minecraft version " + profile.getGameVersion()); + JsonObject details = json(metadata).getAsJsonObject(); + if (!details.getAsJsonObject("downloads").has("server")) throw new IOException("This version has no dedicated server download"); + JsonObject server = details.getAsJsonObject("downloads").getAsJsonObject("server"); + download(server.get("url").getAsString(), output); + String expected = server.get("sha1").getAsString(); + if (!expected.equalsIgnoreCase(sha1(output))) { Files.deleteIfExists(output); throw new IOException("Server download checksum mismatch"); } + } else if (software.equals("fabric") && profile.getLoaderVersion() != null && !profile.getLoaderVersion().isEmpty()) { + JsonArray installers = json("https://meta.fabricmc.net/v2/versions/installer").getAsJsonArray(); + String installer = null; + for (JsonElement entry : installers) if (entry.getAsJsonObject().get("stable").getAsBoolean()) { + installer = entry.getAsJsonObject().get("version").getAsString(); break; + } + if (installer == null) throw new IOException("No stable Fabric installer available"); + download("https://meta.fabricmc.net/v2/versions/loader/" + safe(profile.getGameVersion()) + "/" + + safe(profile.getLoaderVersion()) + "/" + safe(installer) + "/server/jar", output); + } else { + if (!UpdateBuilder.getUpdaterNames().contains(software)) throw new IOException("Unsupported world server software: " + software); + if (software.equals("spigot")) { + // The existing Spigot updater accepts the Java path via a system property. Isolate that + // property in a worker JVM instead of changing it for concurrent AutoPlug operations. + String currentJava = Paths.get(System.getProperty("java.home"), "bin", isWindows() ? "java.exe" : "java").toString(); + String classpath = Arrays.stream(System.getProperty("java.class.path").split(Pattern.quote(File.pathSeparator))) + .map(p -> Paths.get(p).toAbsolutePath().toString()).collect(Collectors.joining(File.pathSeparator)); + Process worker = new ProcessBuilder(currentJava, "-DMCServerUpdater.javaExecutable=" + java, + "-cp", classpath, ServerInstallerWorker.class.getName(), software, profile.getGameVersion(), + work.toString(), output.toString()).directory(work.toFile()).redirectErrorStream(true) + .redirectOutput(work.resolve("build.log").toFile()).start(); + try { + if (!worker.waitFor(15, TimeUnit.MINUTES)) throw new IOException("Spigot build timed out; see " + work.resolve("build.log")); + if (worker.exitValue() != 0) throw new IOException("Spigot build failed; see " + work.resolve("build.log")); + } finally { if (worker.isAlive()) { worker.descendants().forEach(ProcessHandle::destroyForcibly); worker.destroyForcibly(); } } + } else { + UpdateStatus status = UpdateBuilder.updateProject(software).version(profile.getGameVersion()) + .workingDirectory(work.toFile()).outputFile(output.toFile()).debugConsumer(progress::accept).execute(); + if (!status.isSuccessStatus()) throw new IOException("Server installation failed: " + status.getMessage(), status.getThrowable()); + } + } + return output; + } + + private static String safe(String value) { + if (value == null || !value.matches("[A-Za-z0-9_.+-]{1,100}")) throw new IllegalArgumentException("Invalid server version or loader"); + return value; + } + private static boolean isWindows() { return System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("win"); } + private static JsonElement json(String url) throws IOException { + try (InputStream input = connection(url).getInputStream(); Reader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) { + return JsonParser.parseReader(reader); + } + } + private static HttpURLConnection connection(String url) throws IOException { + URL parsed = new URL(url); + if (!"https".equals(parsed.getProtocol())) throw new IOException("Server download must use HTTPS"); + HttpURLConnection connection = (HttpURLConnection) parsed.openConnection(); + connection.setConnectTimeout(15000); connection.setReadTimeout(30000); + connection.setRequestProperty("User-Agent", "AutoPlug-Client"); + return connection; + } + private static void download(String url, Path output) throws IOException { + Path temporary = Files.createTempFile(output.getParent(), "server-", ".part"); + try { + try (InputStream input = connection(url).getInputStream()) { Files.copy(input, temporary, StandardCopyOption.REPLACE_EXISTING); } + Files.move(temporary, output, StandardCopyOption.REPLACE_EXISTING); + } finally { Files.deleteIfExists(temporary); } + } + private static String sha1(Path file) throws Exception { + java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); + try (InputStream in = Files.newInputStream(file)) { byte[] bytes = new byte[65536]; int n; while ((n = in.read(bytes)) != -1) digest.update(bytes, 0, n); } + StringBuilder result = new StringBuilder(); for (byte b : digest.digest()) result.append(String.format("%02x", b & 255)); + return result.toString(); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ServerInstaller.java b/src/main/java/com/osiris/autoplug/client/worlds/ServerInstaller.java new file mode 100644 index 00000000..5b4ecd0b --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ServerInstaller.java @@ -0,0 +1,9 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.Profile; +import java.nio.file.Path; + +@FunctionalInterface +public interface ServerInstaller { + ServerLaunch prepare(Profile profile, Path worldDirectory) throws Exception; +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ServerInstallerWorker.java b/src/main/java/com/osiris/autoplug/client/worlds/ServerInstallerWorker.java new file mode 100644 index 00000000..66039d42 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ServerInstallerWorker.java @@ -0,0 +1,15 @@ +package com.osiris.autoplug.client.worlds; + +import io.github.projectunified.mcserverupdater.UpdateBuilder; +import io.github.projectunified.mcserverupdater.UpdateStatus; + +/** Isolated worker for existing updaters which need their own JVM system properties. */ +public final class ServerInstallerWorker { + private ServerInstallerWorker() { } + public static void main(String[] args) throws Exception { + if (args.length != 4) throw new IllegalArgumentException("Expected software, version, work directory, output file"); + UpdateStatus status = UpdateBuilder.updateProject(args[0]).version(args[1]).workingDirectory(args[2]) + .outputFile(args[3]).debugConsumer(System.out::println).execute(); + if (!status.isSuccessStatus()) throw new IllegalStateException(status.getMessage(), status.getThrowable()); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java b/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java new file mode 100644 index 00000000..875ee633 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java @@ -0,0 +1,17 @@ +package com.osiris.autoplug.client.worlds; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** An argument vector, never a shell command. */ +public final class ServerLaunch { + public final List command; + public final Path directory; + public ServerLaunch(List command, Path directory) { + if (command == null || command.isEmpty()) throw new IllegalArgumentException("Server command is empty"); + this.command = Collections.unmodifiableList(new ArrayList<>(command)); + this.directory = directory.toAbsolutePath().normalize(); + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ShareResult.java b/src/main/java/com/osiris/autoplug/client/worlds/ShareResult.java new file mode 100644 index 00000000..fb10b841 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/ShareResult.java @@ -0,0 +1,10 @@ +package com.osiris.autoplug.client.worlds; + +public final class ShareResult { + public final String address; + public final String message; + public ShareResult(String address, String message) { this.address = address; this.message = message; } + public boolean isShared() { return address != null; } + public String getAddress() { return address; } + public String getMessage() { return message; } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/SharingService.java b/src/main/java/com/osiris/autoplug/client/worlds/SharingService.java new file mode 100644 index 00000000..eebc6886 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/SharingService.java @@ -0,0 +1,12 @@ +package com.osiris.autoplug.client.worlds; + +/** Sharing is acquired only on an explicit request and owned by its world session. */ +@FunctionalInterface +public interface SharingService { + Lease open(int loopbackPort) throws Exception; + interface Lease extends AutoCloseable { + String address(); + default boolean isActive() { return true; } + @Override void close() throws Exception; + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/UpnpSharingService.java b/src/main/java/com/osiris/autoplug/client/worlds/UpnpSharingService.java new file mode 100644 index 00000000..5ee2b6ca --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/UpnpSharingService.java @@ -0,0 +1,272 @@ +package com.osiris.autoplug.client.worlds; + +import org.w3c.dom.*; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Optional IGD sharing. The Minecraft process itself always stays on loopback. */ +public final class UpnpSharingService implements SharingService { + public interface Gateway { + InetAddress localAddress(); + String externalAddress() throws Exception; + void addMapping(int externalPort, int internalPort, String description, int leaseSeconds) throws Exception; + void removeMapping(int externalPort, int internalPort, String description) throws Exception; + } + @FunctionalInterface public interface Discovery { Gateway discover() throws Exception; } + private final Discovery discovery; + public UpnpSharingService() { this(new IgdDiscovery()); } + public UpnpSharingService(Discovery discovery) { this.discovery = Objects.requireNonNull(discovery); } + + @Override public Lease open(int loopbackPort) throws Exception { + Gateway gateway = discovery.discover(); + if (gateway == null) throw new IOException("No UPnP internet gateway found"); + String externalAddress = gateway.externalAddress(); + InetAddress address = InetAddress.getByName(externalAddress); + byte[] bytes = address.getAddress(); + if (!(address instanceof Inet4Address) || address.isAnyLocalAddress() || address.isLoopbackAddress() + || address.isSiteLocalAddress() || address.isLinkLocalAddress() + || ((bytes[0] & 255) == 100 && (bytes[1] & 255) >= 64 && (bytes[1] & 255) <= 127)) + throw new IOException("The router has no public IPv4 address (double NAT or carrier-grade NAT)"); + Forwarder forwarder = new Forwarder(gateway.localAddress(), loopbackPort); + String description = "AutoPlug-" + UUID.randomUUID().toString().substring(0, 12); + int externalPort = forwarder.port(); + try { + gateway.addMapping(externalPort, forwarder.port(), description, 3600); + forwarder.start(); + return new MappingLease(gateway, forwarder, externalAddress + ":" + externalPort, externalPort, description); + } catch (Exception e) { + forwarder.close(); + // A lost response can mean AddPortMapping succeeded. Ownership is checked before deletion. + try { gateway.removeMapping(externalPort, forwarder.port(), description); } catch (Exception cleanup) { e.addSuppressed(cleanup); } + throw e; + } + } + + private static final class MappingLease implements Lease { + private final Gateway gateway; + private final Forwarder forwarder; + private final String address; + private final int externalPort; + private final String description; + private final ScheduledExecutorService renewer = Executors.newSingleThreadScheduledExecutor(daemon("world-UPnP-renew")); + private final AtomicBoolean closed = new AtomicBoolean(); + MappingLease(Gateway gateway, Forwarder forwarder, String address, int externalPort, String description) { + this.gateway = gateway; this.forwarder = forwarder; this.address = address; + this.externalPort = externalPort; this.description = description; + renewer.scheduleWithFixedDelay(() -> { + synchronized (this) { + if (closed.get()) return; + try { gateway.addMapping(externalPort, forwarder.port(), description, 3600); } + catch (Exception e) { try { close(); } catch (Exception ignored) { } } + } + }, 1800, 1800, TimeUnit.SECONDS); + } + public String address() { return address; } + public boolean isActive() { return !closed.get(); } + public synchronized void close() throws Exception { + if (!closed.compareAndSet(false, true)) return; + renewer.shutdownNow(); + forwarder.close(); + gateway.removeMapping(externalPort, forwarder.port(), description); + } + } + + /** Bounded connection count; no public listener is opened until an explicit share request. */ + static final class Forwarder implements AutoCloseable { + private final ServerSocket listener; + private final int port; + private final int targetPort; + private final ExecutorService workers = Executors.newCachedThreadPool(daemon("world-share")); + private final Set sockets = ConcurrentHashMap.newKeySet(); + private final Semaphore connections = new Semaphore(32); + Forwarder(InetAddress address, int targetPort) throws IOException { + listener = new ServerSocket(0, 16, address); + port = listener.getLocalPort(); + this.targetPort = targetPort; + } + int port() { return port; } + void start() { + workers.execute(() -> { + while (!listener.isClosed()) { + try { + Socket incoming = listener.accept(); + if (!connections.tryAcquire()) { incoming.close(); continue; } + sockets.add(incoming); + workers.execute(() -> forward(incoming)); + } catch (IOException | RejectedExecutionException e) { close(); return; } + } + }); + } + private void forward(Socket incoming) { + Socket target = new Socket(); + sockets.add(target); + try { + target.connect(new InetSocketAddress("127.0.0.1", targetPort), 3000); + incoming.setSoTimeout(120000); target.setSoTimeout(120000); + Future outward = workers.submit(() -> copy(incoming, target)); + copy(target, incoming); + outward.cancel(true); + } catch (IOException | RejectedExecutionException ignored) { + } finally { + closeSocket(incoming); closeSocket(target); + sockets.remove(incoming); sockets.remove(target); connections.release(); + } + } + private static void copy(Socket from, Socket to) { + try { + byte[] buffer = new byte[16384]; int count; + InputStream input = from.getInputStream(); OutputStream output = to.getOutputStream(); + while ((count = input.read(buffer)) != -1) { output.write(buffer, 0, count); output.flush(); } + to.shutdownOutput(); + } catch (IOException ignored) { closeSocket(from); closeSocket(to); } + } + public void close() { + try { listener.close(); } catch (IOException ignored) { } + for (Socket socket : sockets) closeSocket(socket); + workers.shutdownNow(); + } + private static void closeSocket(Socket socket) { try { socket.close(); } catch (IOException ignored) { } } + } + + private static ThreadFactory daemon(String name) { + return runnable -> { Thread thread = new Thread(runnable, name); thread.setDaemon(true); return thread; }; + } + + static final class IgdDiscovery implements Discovery { + public Gateway discover() throws Exception { + String request = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 2\r\nST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n\r\n"; + byte[] data = request.getBytes(StandardCharsets.US_ASCII); + try (DatagramSocket socket = new DatagramSocket()) { + socket.setSoTimeout(2000); + socket.send(new DatagramPacket(data, data.length, InetAddress.getByName("239.255.255.250"), 1900)); + long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(3); + while (System.nanoTime() < end) { + DatagramPacket reply = new DatagramPacket(new byte[8192], 8192); + try { socket.receive(reply); } catch (SocketTimeoutException e) { break; } + InetAddress router = reply.getAddress(); + if (!router.isSiteLocalAddress()) continue; + String response = new String(reply.getData(), 0, reply.getLength(), StandardCharsets.US_ASCII); + for (String line : response.split("\r?\n")) { + if (!line.toLowerCase(Locale.ROOT).startsWith("location:")) continue; + try { + URL location = checkedUrl(new URL(line.substring(9).trim()), router); + Document description = xml(http(location, null, null)); + NodeList services = description.getElementsByTagNameNS("*", "service"); + for (int i = 0; i < services.getLength(); i++) { + Element service = (Element) services.item(i); + String type = value(service, "serviceType"); + if (type != null && (type.matches("urn:schemas-upnp-org:service:WANIPConnection:[12]") + || type.equals("urn:schemas-upnp-org:service:WANPPPConnection:1"))) { + URL control = checkedUrl(new URL(location, value(service, "controlURL")), router); + try (DatagramSocket route = new DatagramSocket()) { + route.connect(router, 1900); + return new SoapGateway(control, type, route.getLocalAddress()); + } + } + } + } catch (IOException ignored) { /* Try another advertised gateway. */ } + } + } + } + throw new IOException("No supported UPnP gateway responded"); + } + } + + static final class SoapGateway implements Gateway { + private final URL control; + private final String type; + private final InetAddress local; + SoapGateway(URL control, String type, InetAddress local) { this.control = control; this.type = type; this.local = local; } + public InetAddress localAddress() { return local; } + public String externalAddress() throws Exception { return value(call("GetExternalIPAddress", ""), "NewExternalIPAddress"); } + public void addMapping(int external, int internal, String description, int lease) throws Exception { + String keys = element("NewRemoteHost", "") + element("NewExternalPort", external) + element("NewProtocol", "TCP"); + try { + Element existing = call("GetSpecificPortMappingEntry", keys); + if (!Integer.toString(internal).equals(value(existing, "NewInternalPort")) + || !local.getHostAddress().equals(value(existing, "NewInternalClient")) + || !description.equals(value(existing, "NewPortMappingDescription"))) + throw new IOException("The requested external port already belongs to another mapping"); + } catch (SoapFault e) { if (!"714".equals(e.code)) throw e; } + call("AddPortMapping", keys + element("NewInternalPort", internal) + + element("NewInternalClient", local.getHostAddress()) + element("NewEnabled", 1) + + element("NewPortMappingDescription", description) + element("NewLeaseDuration", lease)); + } + public void removeMapping(int external, int internal, String description) throws Exception { + String keys = element("NewRemoteHost", "") + element("NewExternalPort", external) + element("NewProtocol", "TCP"); + try { + Element existing = call("GetSpecificPortMappingEntry", keys); + if (Integer.toString(internal).equals(value(existing, "NewInternalPort")) + && local.getHostAddress().equals(value(existing, "NewInternalClient")) + && description.equals(value(existing, "NewPortMappingDescription"))) call("DeletePortMapping", keys); + } catch (SoapFault e) { if (!"714".equals(e.code)) throw e; } + } + private Element call(String action, String fields) throws Exception { + String envelope = "" + fields + ""; + Element root = xml(http(control, type + "#" + action, envelope.getBytes(StandardCharsets.UTF_8))).getDocumentElement(); + String error = value(root, "errorCode"); + if (error != null) throw new SoapFault(error, value(root, "errorDescription")); + return root; + } + } + + static final class SoapFault extends IOException { + final String code; + SoapFault(String code, String message) { super("UPnP " + code + ": " + message); this.code = code; } + } + private static URL checkedUrl(URL url, InetAddress router) throws IOException { + if (!"http".equals(url.getProtocol()) || url.getUserInfo() != null + || !InetAddress.getByName(url.getHost()).equals(router)) throw new IOException("Invalid gateway endpoint"); + // Pin the discovered LAN IP rather than resolving an advertised hostname again. + return new URL("http", router.getHostAddress(), url.getPort(), url.getFile()); + } + static Document xml(byte[] bytes) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + return factory.newDocumentBuilder().parse(new ByteArrayInputStream(bytes)); + } + private static String value(Element root, String name) { + NodeList values = root.getElementsByTagNameNS("*", name); + return values.getLength() == 0 ? null : values.item(0).getTextContent().trim(); + } + private static String element(String name, Object value) { + String text = String.valueOf(value).replace("&", "&").replace("<", "<").replace(">", ">"); + return "<" + name + ">" + text + ""; + } + private static byte[] http(URL url, String action, byte[] body) throws IOException { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(2000); connection.setReadTimeout(3000); connection.setInstanceFollowRedirects(false); + try { + if (body != null) { + connection.setRequestMethod("POST"); connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "text/xml; charset=\"utf-8\""); + connection.setRequestProperty("SOAPAction", "\"" + action + "\""); + try (OutputStream output = connection.getOutputStream()) { output.write(body); } + } + int code = connection.getResponseCode(); + InputStream input = code >= 400 ? connection.getErrorStream() : connection.getInputStream(); + if (input == null || (code != 200 && code != 500)) throw new IOException("Gateway HTTP status " + code); + try (InputStream in = input; ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buffer = new byte[8192]; int count; + while ((count = in.read(buffer)) != -1) { + if (out.size() + count > 1024 * 1024) throw new IOException("Gateway response too large"); + out.write(buffer, 0, count); + } + return out.toByteArray(); + } + } finally { connection.disconnect(); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/VirtualWorld.java b/src/main/java/com/osiris/autoplug/client/worlds/VirtualWorld.java new file mode 100644 index 00000000..40cd0897 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/VirtualWorld.java @@ -0,0 +1,20 @@ +package com.osiris.autoplug.client.worlds; + +/** A world owns its saves independently of the profiles used to run it. */ +public final class VirtualWorld { + public String id; + public String name; + public String serverProfileId; + public String clientProfileId; + public String thumbnail; + public long createdAt; + public boolean eulaAccepted; + + public String getId() { return id; } + public String getName() { return name; } + public String getServerProfileId() { return serverProfileId; } + public String getClientProfileId() { return clientProfileId; } + public String getThumbnail() { return thumbnail; } + public boolean isEulaAccepted() { return eulaAccepted; } + @Override public String toString() { return name; } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java b/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java new file mode 100644 index 00000000..3c906750 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java @@ -0,0 +1,186 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.Profile; +import com.osiris.autoplug.client.profiles.ProfileStore; +import com.osiris.autoplug.client.profiles.ProfileType; +import com.osiris.autoplug.client.profiles.ProfileLease; +import com.osiris.autoplug.client.utils.MineStat; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.BindException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** Local world orchestration independent of AutoPlug's legacy singleton server. */ +public final class WorldService implements AutoCloseable { + @FunctionalInterface public interface Probe { boolean isReady(String host, int port) throws Exception; } + @FunctionalInterface public interface ProcessFactory { Process start(ServerLaunch launch) throws IOException; } + + private final ProfileStore profiles; + private final WorldStore worlds; + private final ServerInstaller installer; + private final ClientLauncher launcher; + private final SharingService sharing; + private final Probe probe; + private final ProcessFactory processes; + private final Duration readyTimeout; + private final Map sessions = new ConcurrentHashMap<>(); + private final Thread shutdownHook; + private boolean closed; + private int preferredPort = 25565; + private boolean sharingEnabled = true; + + public WorldService(ProfileStore profiles, WorldStore worlds, ServerInstaller installer, ClientLauncher launcher) { + this(profiles, worlds, installer, launcher, new UpnpSharingService(), + (host, port) -> new MineStat(host, port, 1, MineStat.Request.JSON).isServerUp(), + launch -> new ProcessBuilder(launch.command).directory(launch.directory.toFile()) + .redirectErrorStream(true).redirectOutput(ProcessBuilder.Redirect.appendTo( + launch.directory.resolve("autoplug-server.log").toFile())).start(), Duration.ofMinutes(3)); + } + + public WorldService(ProfileStore profiles, WorldStore worlds, ServerInstaller installer, ClientLauncher launcher, + SharingService sharing, Probe probe, ProcessFactory processes, Duration readyTimeout) { + this.profiles = Objects.requireNonNull(profiles); + this.worlds = Objects.requireNonNull(worlds); + this.installer = Objects.requireNonNull(installer); + this.launcher = Objects.requireNonNull(launcher); + this.sharing = Objects.requireNonNull(sharing); + this.probe = Objects.requireNonNull(probe); + this.processes = Objects.requireNonNull(processes); + this.readyTimeout = Objects.requireNonNull(readyTimeout); + if (readyTimeout.isNegative() || readyTimeout.isZero()) throw new IllegalArgumentException("Readiness timeout must be positive"); + shutdownHook = new Thread(this::close, "AutoPlug-world-cleanup"); + Runtime.getRuntime().addShutdownHook(shutdownHook); + } + + public synchronized WorldSession launch(String worldId, boolean share) throws Exception { + return launch(worldId, share, true); + } + + public synchronized WorldSession launch(String worldId, boolean share, boolean authenticatedAccount) throws Exception { + if (closed) throw new IllegalStateException("World service is closed"); + WorldSession existing = sessions.get(worldId); + if (existing != null && !existing.isClosed()) { + if (share) existing.share(); + return existing; + } + VirtualWorld world = worlds.get(worldId); + if (!world.eulaAccepted) throw new IllegalStateException("Accept the Minecraft EULA for this world before launching: https://aka.ms/MinecraftEULA"); + Profile serverProfile = profiles.get(world.serverProfileId); + Profile clientProfile = profiles.get(world.clientProfileId); + validateProfiles(serverProfile, clientProfile); + // The same client profile cannot be mutated or launched twice at the same time. + for (WorldSession session : sessions.values()) { + if (!session.isClosed() && world.clientProfileId.equals(session.getWorld().clientProfileId)) + throw new IllegalStateException("This client profile is already running another world"); + } + Path directory = worlds.getDirectory(world.id); + Files.createDirectories(directory); + ProfileLease worldLease = new ProfileLease(directory); + try { return startWorld(world, serverProfile, clientProfile, directory, worldLease, share, authenticatedAccount); } + catch (Exception e) { try { worldLease.close(); } catch (IOException cleanup) { e.addSuppressed(cleanup); } throw e; } + } + + private WorldSession startWorld(VirtualWorld world, Profile serverProfile, Profile clientProfile, Path directory, + ProfileLease worldLease, boolean share, boolean authenticatedAccount) throws Exception { + int port = availablePort(preferredPort); + ServerLaunch launch = installer.prepare(serverProfile, directory); + if (!directory.toAbsolutePath().normalize().equals(launch.directory)) throw new IOException("Installer returned a different world directory"); + configureLocalServer(directory, port, authenticatedAccount); + ManagedServer server = new ManagedServer(processes.start(launch), 15000); + Process client = null; + try { + long deadline = System.nanoTime() + readyTimeout.toNanos(); + boolean ready = false; + while (System.nanoTime() < deadline) { + if (!server.isAlive()) throw new IOException("Server exited before becoming ready; see " + directory.resolve("autoplug-server.log")); + if (probe.isReady("127.0.0.1", port)) { ready = true; break; } + Thread.sleep(200); + } + if (!ready) throw new IOException("Server readiness timed out; see " + directory.resolve("autoplug-server.log")); + client = launcher.launch(clientProfile, "127.0.0.1", port); + if (client == null) throw new IOException("Client launcher did not return its process"); + Process ownedClient = client; + WorldSession session = new WorldSession(world, server, client, port, sharing, worldLease, authenticatedAccount, sharingEnabled, + () -> sessions.computeIfPresent(world.id, (id, value) -> value.client() == ownedClient ? null : value)); + sessions.put(world.id, session); + session.monitor(); + if (share) session.share(); + return session; + } catch (Exception e) { + if (client != null) client.destroyForcibly(); + server.close(); + throw e; + } + } + + private static void validateProfiles(Profile server, Profile client) { + if (server.getType() == ProfileType.MODS) throw new IllegalArgumentException("A world requires a plugins or mods-server profile"); + if (server.migrationPending || client.migrationPending) throw new IllegalArgumentException("Review the profile migration summary before launching"); + if (client.getType() != ProfileType.MODS || client.isTemplate()) throw new IllegalArgumentException("Select a playable client profile, not a template"); + if (!Objects.equals(server.getGameVersion(), client.getGameVersion())) throw new IllegalArgumentException("Server and client game versions must match"); + if (server.getType() == ProfileType.MODS_SERVER && !Objects.equals(server.getLoader(), client.getLoader())) + throw new IllegalArgumentException("Server and client mod loaders must match"); + } + + private static void configureLocalServer(Path directory, int port, boolean authenticatedAccount) throws IOException { + Path file = directory.resolve("server.properties"); + Properties properties = new Properties(); + if (Files.isSymbolicLink(file)) throw new IOException("server.properties must be owned by this world"); + if (Files.exists(file)) try (InputStream in = Files.newInputStream(file)) { properties.load(in); } + properties.setProperty("server-ip", "127.0.0.1"); + properties.setProperty("server-port", Integer.toString(port)); + properties.setProperty("enable-rcon", "false"); + properties.setProperty("enable-query", "false"); + properties.setProperty("online-mode", Boolean.toString(authenticatedAccount)); + // Level paths must remain in this world's own directory. + properties.setProperty("level-name", "world"); + try (OutputStream out = Files.newOutputStream(file)) { properties.store(out, "AutoPlug local virtual world"); } + Path eula = directory.resolve("eula.txt"); + if (Files.isSymbolicLink(eula)) throw new IOException("eula.txt must be owned by this world"); + Files.write(eula, "eula=true\n".getBytes(StandardCharsets.UTF_8)); + } + + public ShareResult shareWorld(String worldId) { + WorldSession session = sessions.get(worldId); + return session == null ? new ShareResult(null, "Launch this world before sharing it.") : session.share(); + } + /** Applies to subsequent launches; running worlds keep their chosen port. */ + public synchronized void setPreferredPort(int port) { + if (port < 1 || port > 65535) throw new IllegalArgumentException("Preferred port must be between 1 and 65535"); + preferredPort = port; + } + /** Disabling UPnP also releases any mappings owned by already-running worlds. */ + public synchronized void setSharingEnabled(boolean enabled) { + sharingEnabled = enabled; + for (WorldSession session : sessions.values()) session.setSharingEnabled(enabled); + } + private static int availablePort(int preferred) throws IOException { + InetAddress loopback = InetAddress.getByName("127.0.0.1"); + try (ServerSocket socket = new ServerSocket(preferred, 1, loopback)) { return socket.getLocalPort(); } + catch (BindException busy) { + try (ServerSocket socket = new ServerSocket(0, 1, loopback)) { return socket.getLocalPort(); } + } + } + public void stopWorld(String worldId) { WorldSession session = sessions.get(worldId); if (session != null) session.close(); } + public Collection activeSessions() { return Collections.unmodifiableList(new ArrayList<>(sessions.values())); } + public boolean isProfileInUse(String profileId) { + return sessions.values().stream().anyMatch(s -> !s.isClosed() && (profileId.equals(s.getWorld().clientProfileId) || profileId.equals(s.getWorld().serverProfileId))); + } + @Override public synchronized void close() { + if (closed) return; + closed = true; + for (WorldSession session : new ArrayList<>(sessions.values())) session.close(); + if (Thread.currentThread() != shutdownHook) { + try { Runtime.getRuntime().removeShutdownHook(shutdownHook); } + catch (IllegalStateException ignored) { /* JVM is already shutting down. */ } + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/WorldSession.java b/src/main/java/com/osiris/autoplug/client/worlds/WorldSession.java new file mode 100644 index 00000000..c0361e8a --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/WorldSession.java @@ -0,0 +1,108 @@ +package com.osiris.autoplug.client.worlds; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** All resources opened for a world have one idempotent owner. */ +public final class WorldSession implements AutoCloseable { + private final VirtualWorld world; + private final ManagedServer server; + private final Process client; + private final int port; + private final SharingService sharing; + private final AutoCloseable worldLease; + private final boolean authenticatedAccount; + private boolean sharingEnabled; + private final Runnable onClose; + private final AtomicBoolean closed = new AtomicBoolean(); + private SharingService.Lease shareLease; + private ShareResult shareResult = new ShareResult(null, "Local world; sharing is off."); + + WorldSession(VirtualWorld world, ManagedServer server, Process client, int port, + SharingService sharing, AutoCloseable worldLease, boolean authenticatedAccount, boolean sharingEnabled, Runnable onClose) { + this.world = world; + this.server = server; + this.client = client; + this.port = port; + this.sharing = sharing; + this.worldLease = worldLease; + this.authenticatedAccount = authenticatedAccount; + this.sharingEnabled = sharingEnabled; + this.onClose = onClose; + } + + void monitor() { + client.onExit().thenRun(this::close); + server.process().onExit().thenRun(this::close); + } + + public VirtualWorld getWorld() { return world; } + public Process client() { return client; } + public ManagedServer server() { return server; } + public int getPort() { return port; } + public boolean isClosed() { return closed.get(); } + public synchronized ShareResult getShareResult() { + if (shareLease != null && !shareLease.isActive()) + return new ShareResult(null, "Sharing expired or the gateway stopped responding. Share again to retry."); + return shareResult; + } + + public synchronized ShareResult share() { + if (closed.get()) return new ShareResult(null, "This world is no longer running."); + if (!sharingEnabled) { + shareResult = new ShareResult(null, "UPnP sharing is disabled in Settings. Enable it and choose Share again, or use a TCP tunnel to 127.0.0.1:" + port + "."); + return shareResult; + } + if (!authenticatedAccount) { + shareResult = new ShareResult(null, "Offline worlds stay local. Sign in with a licensed Microsoft account and relaunch this world before sharing."); + return shareResult; + } + if (shareLease != null && shareLease.isActive()) return shareResult; + shareLease = null; + try { + shareLease = sharing.open(port); + shareResult = new ShareResult(shareLease.address(), "Sharing is active until this world closes."); + } catch (Exception e) { + shareResult = new ShareResult(null, "Automatic sharing unavailable: " + e.getMessage() + + ". The world remains local. Use a TCP tunnel to 127.0.0.1:" + port + + " or configure a LAN forwarding endpoint before manual port forwarding."); + } + return shareResult; + } + + synchronized void setSharingEnabled(boolean enabled) { + sharingEnabled = enabled; + if (!enabled && shareLease != null) { + try { shareLease.close(); } + catch (Exception e) { shareResult = new ShareResult(null, "Sharing disabled; gateway cleanup failed: " + e.getMessage()); shareLease = null; return; } + shareLease = null; + shareResult = new ShareResult(null, "UPnP sharing was disabled in Settings. The world remains local."); + } + } + + @Override public void close() { + if (!closed.compareAndSet(false, true)) return; + synchronized (this) { + if (shareLease != null) { + try { shareLease.close(); } + catch (Exception e) { shareResult = new ShareResult(null, "Sharing cleanup failed: " + e.getMessage()); } + shareLease = null; + } + } + try { + if (client.isAlive()) { + client.destroy(); + if (!client.waitFor(2000, TimeUnit.MILLISECONDS)) client.destroyForcibly(); + } + } catch (InterruptedException e) { + client.destroyForcibly(); + Thread.currentThread().interrupt(); + } finally { + try { server.close(); } + finally { + try { worldLease.close(); } catch (Exception ignored) { } + onClose.run(); + } + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java b/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java new file mode 100644 index 00000000..999f9c3f --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java @@ -0,0 +1,109 @@ +package com.osiris.autoplug.client.worlds; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.io.IOException; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** Persistent metadata; never places a world save inside a reusable profile. */ +public final class WorldStore { + private final Path root; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + public WorldStore(Path root) throws IOException { + this.root = root.toAbsolutePath().normalize(); + Files.createDirectories(this.root); + } + + public synchronized VirtualWorld create(String name, String serverProfileId, String clientProfileId) throws IOException { + return create(name, serverProfileId, clientProfileId, false); + } + + public synchronized VirtualWorld create(String name, String serverProfileId, String clientProfileId, + boolean eulaAccepted) throws IOException { + if (name == null || name.trim().isEmpty()) throw new IllegalArgumentException("World name is required"); + if (serverProfileId == null || clientProfileId == null) throw new IllegalArgumentException("Both profiles are required"); + VirtualWorld world = new VirtualWorld(); + world.id = UUID.randomUUID().toString(); + world.name = name.trim(); + world.serverProfileId = serverProfileId; + world.clientProfileId = clientProfileId; + world.createdAt = System.currentTimeMillis(); + world.eulaAccepted = eulaAccepted; + Files.createDirectories(getDirectory(world.id)); + save(world); + return world; + } + + public synchronized List list() throws IOException { + List worlds = new ArrayList<>(); + try (Stream paths = Files.list(root)) { + for (Path path : paths.filter(p -> Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)).collect(Collectors.toList())) { + if (Files.isRegularFile(path.resolve("world.json"), LinkOption.NOFOLLOW_LINKS)) + worlds.add(get(path.getFileName().toString())); + } + } + worlds.sort(Comparator.comparingLong(w -> w.createdAt)); + return worlds; + } + + public synchronized VirtualWorld get(String id) throws IOException { + Path file = metadataDirectory(id).resolve("world.json"); + try (Reader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { + VirtualWorld world = gson.fromJson(reader, VirtualWorld.class); + if (world == null || !id.equals(world.id) || world.serverProfileId == null || world.clientProfileId == null) + throw new IOException("Invalid world metadata: " + file); + Path icon = getDirectory(id).resolve("world/icon.png"); + if (!Files.isRegularFile(icon, LinkOption.NOFOLLOW_LINKS)) icon = getDirectory(id).resolve("server-icon.png"); + world.thumbnail = Files.isRegularFile(icon, LinkOption.NOFOLLOW_LINKS) ? icon.toString() : null; + return world; + } catch (com.google.gson.JsonParseException e) { + throw new IOException("Invalid world metadata: " + file, e); + } + } + + public synchronized void setEulaAccepted(String id, boolean accepted) throws IOException { + VirtualWorld world = get(id); + world.eulaAccepted = accepted; + save(world); + } + + public synchronized void save(VirtualWorld world) throws IOException { + Path directory = metadataDirectory(world.id); + Files.createDirectories(directory); + Path temporary = Files.createTempFile(directory, "world-", ".tmp"); + try { + Files.write(temporary, gson.toJson(world).getBytes(StandardCharsets.UTF_8)); + try { Files.move(temporary, directory.resolve("world.json"), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, directory.resolve("world.json"), StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temporary); } + } + + /** Call only after closing any session using this world. */ + public synchronized void delete(String id) throws IOException { + Path directory = metadataDirectory(id); + if (!Files.exists(directory, LinkOption.NOFOLLOW_LINKS)) return; + Path trash = root.resolve(".trash"); + Files.createDirectories(trash); + Files.move(directory, trash.resolve(id + "-" + System.currentTimeMillis())); + } + + public Path getDirectory(String id) throws IOException { + Path directory = metadataDirectory(id).resolve("server"); + if (Files.isSymbolicLink(directory)) throw new IOException("World directory must not be a symbolic link"); + return directory; + } + + private Path metadataDirectory(String id) throws IOException { + if (id == null || !id.matches("[a-zA-Z0-9_-]{1,80}")) throw new IllegalArgumentException("Invalid world id"); + Path directory = root.resolve(id).normalize(); + if (!directory.startsWith(root) || Files.isSymbolicLink(directory)) throw new IOException("Unsafe world directory"); + return directory; + } +} diff --git a/src/test/java/com/osiris/autoplug/client/browser/MineStatJsonTest.java b/src/test/java/com/osiris/autoplug/client/browser/MineStatJsonTest.java new file mode 100644 index 00000000..e3a25768 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/browser/MineStatJsonTest.java @@ -0,0 +1,67 @@ +package com.osiris.autoplug.client.browser; + +import com.osiris.autoplug.client.utils.MineStat; +import org.junit.jupiter.api.Test; +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.concurrent.*; +import static org.junit.jupiter.api.Assertions.*; + +class MineStatJsonTest { + @Test void readsStringAndNestedArrayMotdsWithUnicodeAndProtocol() throws Exception { + for (String description : new String[]{"\"§aWelcome 世界\"", "{\"text\":\"§aWelcome \",\"extra\":[\"世界\",{\"text\":\"\"}]}"}) { + String json = "{\"description\":" + description + ",\"version\":{\"name\":\"Paper 1.21.1\",\"protocol\":767},\"players\":{\"online\":3,\"max\":20}}"; + MineStat ping = fixture(output -> response(output, json)); + assertEquals(MineStat.Retval.SUCCESS, ping.pingResult); assertTrue(ping.isServerUp()); + assertEquals("Welcome 世界", ping.getStrippedMotd()); assertEquals("Paper 1.21.1", ping.getVersion()); + assertEquals(767, ping.getProtocol()); assertEquals(3, ping.getCurrentPlayers()); assertEquals(20, ping.getMaximumPlayers()); + } + } + + @Test void rejectsOversizedOrInvalidJsonPacketsWithoutAllocation() throws Exception { + MineStat oversized = fixture(output -> { varInt(output, Integer.MAX_VALUE); output.flush(); }); + assertEquals(MineStat.Retval.UNKNOWN, oversized.pingResult); assertFalse(oversized.isServerUp()); + MineStat malformed = fixture(output -> response(output, "{\"description\":\"hi\",\"players\":null}")); + assertEquals(MineStat.Retval.UNKNOWN, malformed.pingResult); assertFalse(malformed.isServerUp()); + MineStat wrongPacket = fixture(output -> { output.write(new byte[]{3, 1, 1, 'x'}); output.flush(); }); + assertEquals(MineStat.Retval.UNKNOWN, wrongPacket.pingResult); + } + + @Test void slowServerCannotBlockTheBrowserIndefinitely() throws Exception { + assertTimeoutPreemptively(Duration.ofSeconds(4), () -> { + MineStat ping = fixture(output -> { try { Thread.sleep(1400); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); + assertEquals(MineStat.Retval.TIMEOUT, ping.pingResult); assertFalse(ping.isServerUp()); + }); + } + + private MineStat fixture(Reply reply) throws Exception { + ExecutorService executor = Executors.newSingleThreadExecutor(); + try (ServerSocket server = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) { + server.setSoTimeout(3000); + Future future = executor.submit(() -> { + try (Socket socket = server.accept()) { + socket.setSoTimeout(3000); + DataInputStream input = new DataInputStream(socket.getInputStream()); + int length = readVarInt(input); assertTrue(length > 3 && length < 512); + byte[] handshake = new byte[length]; input.readFully(handshake); + assertEquals(1, input.readUnsignedByte()); assertEquals(0, input.readUnsignedByte()); + reply.send(new DataOutputStream(socket.getOutputStream())); + } catch (IOException e) { throw new UncheckedIOException(e); } + }); + MineStat result = new MineStat(server.getInetAddress().getHostAddress(), server.getLocalPort(), 1, MineStat.Request.JSON); + future.get(4, TimeUnit.SECONDS); return result; + } finally { executor.shutdownNow(); } + } + private void response(DataOutputStream output, String json) throws IOException { + byte[] payload = json.getBytes(StandardCharsets.UTF_8); ByteArrayOutputStream packet = new ByteArrayOutputStream(); + DataOutputStream data = new DataOutputStream(packet); data.writeByte(0); varInt(data, payload.length); data.write(payload); + varInt(output, packet.size()); + // Deliberately fragmented packet exercises readFully instead of relying on one socket read. + for (byte value : packet.toByteArray()) { output.write(value); output.flush(); } + } + private static int readVarInt(DataInputStream input) throws IOException { int result = 0; for (int shift = 0; shift < 35; shift += 7) { int value = input.readUnsignedByte(); result |= (value & 127) << shift; if ((value & 128) == 0) return result; } throw new IOException("Invalid varint"); } + private static void varInt(DataOutputStream output, int value) throws IOException { do { int next = value & 127; value >>>= 7; output.writeByte(value == 0 ? next : next | 128); } while (value != 0); } + @FunctionalInterface private interface Reply { void send(DataOutputStream output) throws IOException; } +} diff --git a/src/test/java/com/osiris/autoplug/client/browser/ServerBrowserTest.java b/src/test/java/com/osiris/autoplug/client/browser/ServerBrowserTest.java new file mode 100644 index 00000000..1efd8a75 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/browser/ServerBrowserTest.java @@ -0,0 +1,84 @@ +package com.osiris.autoplug.client.browser; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.List; +import java.util.zip.GZIPOutputStream; +import static org.junit.jupiter.api.Assertions.*; + +class ServerBrowserTest { + @TempDir Path directory; + + @Test void parsesDefaultExplicitAndIpv6AddressesWithoutDns() { + assertEquals("example.com", ServerAddress.parse(" EXAMPLE.com:25565 ").toString()); + ServerAddress ipv6 = ServerAddress.parse("[2001:db8::1]:25566"); + assertEquals("2001:db8::1", ipv6.host); assertEquals(25566, ipv6.port); + assertEquals("[::1]", ServerAddress.parse("::1").toString()); + assertThrows(IllegalArgumentException.class, () -> ServerAddress.parse("https://example.com")); + assertThrows(IllegalArgumentException.class, () -> ServerAddress.parse("example.com:65536")); + assertThrows(IllegalArgumentException.class, () -> ServerAddress.parse("example.com:0")); + assertThrows(IllegalArgumentException.class, () -> ServerAddress.parse("a b:1")); + } + + @Test void importsRawAndCompressedNbtWithoutChangingVanillaFile() throws Exception { + byte[] raw = favorites(); + Path vanilla = directory.resolve("servers.dat"); Files.write(vanilla, raw); + List read = new VanillaServersReader().read(vanilla); + assertEquals(2, read.size()); assertEquals("Friends 世界", read.get(0).name); + assertEquals("example.com", read.get(0).address); assertEquals("[::1]:25566", read.get(1).address); + ServerBrowserService service = new ServerBrowserService(directory.resolve("autoplug/servers.json"), vanilla); + assertEquals(2, service.importVanilla()); assertEquals(0, service.importVanilla()); + assertArrayEquals(raw, Files.readAllBytes(vanilla)); + service.add("Renamed favorite", "EXAMPLE.com:25565"); + List saved = new ServerBrowserService(directory.resolve("autoplug/servers.json"), vanilla).list(); + assertEquals(2, saved.size()); assertEquals("Renamed favorite", saved.get(1).name); + service.remove("example.com"); assertEquals(1, service.list().size()); + Path compressed = directory.resolve("compressed.dat"); + try (OutputStream output = new GZIPOutputStream(Files.newOutputStream(compressed))) { output.write(raw); } + assertEquals(2, new VanillaServersReader().read(compressed).size()); + } + + @Test void corruptFavoritesArePreservedInsteadOfOverwritten() throws Exception { + Path storage = directory.resolve("servers.json"); byte[] malformed = "{broken".getBytes(StandardCharsets.UTF_8); Files.write(storage, malformed); + ServerBrowserService service = new ServerBrowserService(storage, directory.resolve("missing.dat")); + assertThrows(IOException.class, () -> service.add("new", "example.com")); + assertArrayEquals(malformed, Files.readAllBytes(storage)); + assertTrue(new VanillaServersReader().read(directory.resolve("missing.dat")).isEmpty()); + } + + @Test void rejectsHostileNbtLengthsDepthAndTruncation() throws Exception { + Path file = directory.resolve("invalid.dat"); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(file))) { + out.writeByte(10); out.writeUTF(""); out.writeByte(9); out.writeUTF("servers"); out.writeByte(10); out.writeInt(Integer.MAX_VALUE); + } + assertThrows(IOException.class, () -> new VanillaServersReader().read(file)); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(file))) { + for (int i = 0; i < 40; i++) { out.writeByte(10); out.writeUTF("nested"); } + } + assertThrows(IOException.class, () -> new VanillaServersReader().read(file)); + Files.write(file, new byte[]{10, 0, 0, 8, 0}); + assertThrows(IOException.class, () -> new VanillaServersReader().read(file)); + } + + private byte[] favorites() throws IOException { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(bytes)) { + out.writeByte(10); out.writeUTF(""); + // Exercise unrelated array/list/scalar types commonly added by mods. + out.writeByte(7); out.writeUTF("unknownBytes"); out.writeInt(2); out.write(new byte[]{1, 2}); + out.writeByte(11); out.writeUTF("unknownInts"); out.writeInt(1); out.writeInt(42); + out.writeByte(12); out.writeUTF("unknownLongs"); out.writeInt(1); out.writeLong(42); + out.writeByte(9); out.writeUTF("servers"); out.writeByte(10); out.writeInt(3); + string(out, "name", "Friends 世界"); string(out, "ip", "EXAMPLE.com:25565"); + out.writeByte(1); out.writeUTF("acceptTextures"); out.writeByte(1); out.writeByte(0); + string(out, "name", "Local IPv6"); string(out, "ip", "[::1]:25566"); out.writeByte(0); + string(out, "name", "Malformed favorite"); string(out, "ip", "https://invalid.example"); out.writeByte(0); + out.writeByte(0); + } + return bytes.toByteArray(); + } + private void string(DataOutputStream out, String key, String value) throws IOException { out.writeByte(8); out.writeUTF(key); out.writeUTF(value); } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/JavaRuntimeManagerTest.java b/src/test/java/com/osiris/autoplug/client/launcher/JavaRuntimeManagerTest.java new file mode 100644 index 00000000..b64b2abf --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/JavaRuntimeManagerTest.java @@ -0,0 +1,42 @@ +package com.osiris.autoplug.client.launcher; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import static org.junit.jupiter.api.Assertions.*; + +class JavaRuntimeManagerTest { + @TempDir Path temporary; + @Test void javaVersionParsingDoesNotConfuseJava8AndModernVersions() { + assertEquals(8, JavaRuntimeManager.parseMajor("\"1.8.0_462\"")); + assertEquals(21, JavaRuntimeManager.parseMajor("\"21.0.12.1\"")); + assertEquals(25, JavaRuntimeManager.parseMajor("25-ea")); + } + @Test void explicitRuntimeMustMatchRequestedMajorWithoutMutatingOtherInstalls() throws Exception { + Path home = temporary.resolve("jdk-17"); Files.createDirectories(home.resolve("bin")); + Path java = home.resolve("bin").resolve(JavaRuntimeManager.executableName()); Files.write(java, new byte[]{0}); + Files.write(home.resolve("release"), "JAVA_VERSION=\"17.0.16\"".getBytes(StandardCharsets.UTF_8)); + JavaRuntimeManager manager = new JavaRuntimeManager(temporary.resolve("managed")); + manager.setRuntime(17, java); assertEquals(java, manager.resolve(17, ignored -> { })); + manager.setRuntime(21, java); assertThrows(IOException.class, () -> manager.resolve(21, ignored -> { })); + assertTrue(Files.exists(home.resolve("release"))); assertFalse(Files.exists(temporary.resolve("managed"))); + } + @Test void extractionRejectsArchiveTraversal() throws Exception { + Path archive = temporary.resolve("runtime.zip"); + try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(archive))) { zip.putNextEntry(new ZipEntry("../outside")); zip.write(1); } + assertThrows(IOException.class, () -> JavaRuntimeManager.extract(archive, temporary.resolve("runtime"))); + assertFalse(Files.exists(temporary.resolve("outside"))); + } + @Test void neoForgeSelectionUsesCorrectGameVersionPrefixAndNumericOrder() throws Exception { + assertEquals("21.1.", LoaderInstaller.neoPrefix("1.21.1")); + assertEquals("20.2.", LoaderInstaller.neoPrefix("1.20.2")); + assertEquals("26.3.", LoaderInstaller.neoPrefix("26.3")); + assertTrue(LoaderInstaller.compareVersions("21.1.100", "21.1.99") > 0); + assertTrue(LoaderInstaller.compareVersions("21.1.100", "21.1.100-beta") > 0); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/MicrosoftAccountServiceTest.java b/src/test/java/com/osiris/autoplug/client/launcher/MicrosoftAccountServiceTest.java new file mode 100644 index 00000000..39500bb6 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/MicrosoftAccountServiceTest.java @@ -0,0 +1,110 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import okhttp3.FormBody; +import okhttp3.Request; +import okio.Buffer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class MicrosoftAccountServiceTest { + @TempDir Path temporary; + private static final String CLIENT_ID = "00000000-0000-0000-0000-000000000001"; + private static final String UUID = "00000000000000000000000000000001"; + + @Test void deviceLoginExchangesAllTokensAndChecksOwnership() throws Exception { + Exchange transport = new Exchange(); + MicrosoftAccountService service = new MicrosoftAccountService(transport); + MicrosoftAccountService.DeviceLogin login = service.beginLogin(CLIENT_ID); + assertEquals("ABCD-EFGH", login.userCode); + assertEquals("https://www.microsoft.com/link", login.verificationUri); + MinecraftAccount account = service.completeLogin(login); + assertEquals("LicensedPlayer", account.username); + assertEquals("minecraft-token", account.accessToken); + assertEquals("rotated-refresh", account.refreshToken); + assertEquals("12345", account.xuid); + assertFalse(account.needsRefresh()); + assertEquals(Arrays.asList("/consumers/oauth2/v2.0/devicecode", "/consumers/oauth2/v2.0/token", "/user/authenticate", "/xsts/authorize", "/authentication/login_with_xbox", "/entitlements/mcstore", "/minecraft/profile"), transport.paths); + } + + @Test void refreshUsesRegisteredClientAndRotatesRefreshToken() throws Exception { + Exchange transport = new Exchange(); + MinecraftAccount expired = new MinecraftAccount("LicensedPlayer", UUID, "expired", "old-refresh", CLIENT_ID, "12345", false, Instant.EPOCH); + assertTrue(expired.needsRefresh()); + MinecraftAccount account = new MicrosoftAccountService(transport).refresh(expired); + assertEquals("rotated-refresh", account.refreshToken); + assertEquals("minecraft-token", account.accessToken); + assertFalse(transport.paths.contains("/consumers/oauth2/v2.0/devicecode")); + } + + @Test void unlicensedAccountNeverBecomesLaunchIdentity() { + Exchange transport = new Exchange(); transport.licensed = false; + MinecraftAccount expired = new MinecraftAccount("LicensedPlayer", UUID, "expired", "old-refresh", CLIENT_ID, "12345", false, Instant.EPOCH); + IOException error = assertThrows(IOException.class, () -> new MicrosoftAccountService(transport).refresh(expired)); + assertTrue(error.getMessage().contains("entitlement")); + assertFalse(transport.paths.contains("/minecraft/profile")); + } + + @Test void accountPersistenceAndDiagnosticOutputDoNotExposeTokens() throws Exception { + MinecraftAccount account = new MinecraftAccount("LicensedPlayer", UUID, "secret-minecraft", "secret-refresh", CLIENT_ID, "12345", false, Instant.now().plusSeconds(3600)); + AccountStore store = new AccountStore(temporary.resolve("accounts.json")); + store.save(account); store.save(account); + assertEquals(1, store.list().size()); assertEquals("secret-refresh", store.list().get(0).refreshToken); + PreparedLaunch command = new PreparedLaunch(temporary.resolve("java"), temporary, + Arrays.asList("Main", "--accessToken", account.accessToken), "1.21.1", 21); + assertFalse(command.toString().contains("secret")); assertFalse(account.toString().contains("secret")); + assertTrue(command.command().contains("secret-minecraft")); + store.remove(UUID); assertTrue(store.list().isEmpty()); + } + + @Test void offlineAccountsHaveDeterministicDistinctIdentities() { + MinecraftAccount one = MinecraftAccount.offline("PlayerOne"); + assertEquals(one.uuid, MinecraftAccount.offline("PlayerOne").uuid); + assertNotEquals(one.uuid, MinecraftAccount.offline("PlayerTwo").uuid); + assertFalse(one.needsRefresh()); assertTrue(one.offline); + assertThrows(IllegalArgumentException.class, () -> MinecraftAccount.offline("bad player")); + } + + private static final class Exchange implements MicrosoftAccountService.Transport { + final List paths = new ArrayList<>(); boolean licensed = true; + @Override public JsonObject execute(Request request, boolean allowError) throws IOException { + String path = request.url().encodedPath(); paths.add(path); + if (path.endsWith("/devicecode")) { + FormBody form = (FormBody) request.body(); assertEquals(CLIENT_ID, form.value(0)); + return json("{\"user_code\":\"ABCD-EFGH\",\"device_code\":\"device-secret\",\"verification_uri\":\"https://www.microsoft.com/link\",\"expires_in\":120,\"interval\":1}"); + } + if (path.endsWith("/token")) { + FormBody form = (FormBody) request.body(); assertEquals(CLIENT_ID, form.value(0)); + return json("{\"access_token\":\"microsoft-token\",\"refresh_token\":\"rotated-refresh\"}"); + } + if (path.equals("/user/authenticate")) { + assertTrue(body(request).contains("d=microsoft-token")); + return json("{\"Token\":\"xbox-token\",\"DisplayClaims\":{\"xui\":[{\"uhs\":\"user-hash\"}]}}"); + } + if (path.equals("/xsts/authorize")) { + assertTrue(body(request).contains("xbox-token")); assertTrue(body(request).contains("rp://api.minecraftservices.com/")); + return json("{\"Token\":\"xsts-token\",\"DisplayClaims\":{\"xui\":[{\"uhs\":\"user-hash\",\"xid\":\"12345\"}]}}"); + } + if (path.equals("/authentication/login_with_xbox")) { + assertEquals("XBL3.0 x=user-hash;xsts-token", JsonParser.parseString(body(request)).getAsJsonObject().get("identityToken").getAsString()); + return json("{\"access_token\":\"minecraft-token\",\"expires_in\":86400}"); + } + assertEquals("Bearer minecraft-token", request.header("Authorization")); + if (path.equals("/entitlements/mcstore")) return json(licensed ? "{\"items\":[{\"name\":\"game_minecraft\"}]}" : "{\"items\":[]}"); + if (path.equals("/minecraft/profile")) return json("{\"id\":\"" + UUID + "\",\"name\":\"LicensedPlayer\"}"); + throw new AssertionError("Unexpected endpoint " + path); + } + private static String body(Request request) throws IOException { Buffer buffer = new Buffer(); request.body().writeTo(buffer); return buffer.readUtf8(); } + private static JsonObject json(String value) { return JsonParser.parseString(value).getAsJsonObject(); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java b/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java new file mode 100644 index 00000000..d61a97e4 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java @@ -0,0 +1,180 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static org.junit.jupiter.api.Assertions.*; + +class MinecraftLauncherTest { + @TempDir Path temporary; + + // Unmodified publisher metadata retrieved 2026-10-04 from Mojang's version_manifest_v2, + // meta.fabricmc.net/v2/versions/loader/1.21.1/0.16.10/profile/json and + // meta.quiltmc.org/v3/versions/loader/1.20.1/0.26.4/profile/json. Tests never need the network. + static JsonObject fixture(String name) { + InputStream stream = MinecraftLauncherTest.class.getResourceAsStream("/launcher/" + name + ".json"); + assertNotNull(stream, name); + try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { + return JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { throw new AssertionError(e); } + } + + @Test void manifestRuntimeRequirementsIncludeJava16() { + assertEquals(8, MinecraftLauncher.requiredJava(fixture("1.16.5"))); + assertEquals(16, MinecraftLauncher.requiredJava(fixture("1.17.1"))); + assertEquals(17, MinecraftLauncher.requiredJava(fixture("1.20.1"))); + assertEquals(21, MinecraftLauncher.requiredJava(fixture("1.21.1"))); + } + + @Test void officialLoaderProfilesPreserveVanillaArgumentsAndOverrideMainClass() throws Exception { + for (String loader : Arrays.asList("fabric-1.21.1", "quilt-1.20.1")) { + String version = loader.contains("1.21.1") ? "1.21.1" : "1.20.1"; + JsonObject merged = MinecraftLauncher.merge(fixture(version), fixture(loader)); + assertEquals(fixture(loader).get("mainClass"), merged.get("mainClass")); + List args = args(merged, new LaunchRequest(temporary.resolve("game with spaces"), version, "VANILLA", null, MinecraftAccount.offline("Player"), "localhost", 25570)); + assertTrue(args.contains("--username")); + assertEquals(1, Collections.frequency(args, "-cp")); + assertTrue(args.contains(temporary.resolve("game with spaces").toString())); + assertTrue(args.contains("localhost:25570")); + assertFalse(args.stream().anyMatch(a -> a.contains("${"))); + } + } + + @Test void directJoinUsesManifestQuickPlayAndLegacyServerFlags() throws Exception { + LaunchRequest old = new LaunchRequest(temporary, "1.16.5", "VANILLA", null, MinecraftAccount.offline("Player"), "example.test", 25570); + List legacy = args(fixture("1.16.5"), old); + assertEquals("example.test", legacy.get(legacy.indexOf("--server") + 1)); + assertEquals("25570", legacy.get(legacy.indexOf("--port") + 1)); + LaunchRequest modern = new LaunchRequest(temporary, "1.21.1", "VANILLA", null, MinecraftAccount.offline("Player"), "::1", 25570); + List quick = args(fixture("1.21.1"), modern); + assertEquals("[::1]:25570", quick.get(quick.indexOf("--quickPlayMultiplayer") + 1)); + assertFalse(quick.contains("--demo")); + assertFalse(quick.contains("--quickPlayRealms")); + } + + @Test void conditionalArgumentsUseLastMatchingRule() { + JsonObject rules = JsonParser.parseString("{\"rules\":[{\"action\":\"allow\"},{\"action\":\"disallow\",\"os\":{\"name\":\"" + MinecraftLauncher.osName() + "\"}}]}").getAsJsonObject(); + assertFalse(MinecraftLauncher.allowed(rules, Collections.emptyMap())); + JsonObject feature = JsonParser.parseString("{\"rules\":[{\"action\":\"allow\",\"features\":{\"is_demo_user\":true}}]}").getAsJsonObject(); + assertFalse(MinecraftLauncher.allowed(feature, Collections.emptyMap())); + assertTrue(MinecraftLauncher.allowed(feature, Collections.singletonMap("is_demo_user", true))); + } + + @Test void mavenCoordinatesAndCachePathsRejectTraversal() throws Exception { + assertEquals("net/fabricmc/intermediary/1.21.1/intermediary-1.21.1.jar", MinecraftLauncher.mavenPath("net.fabricmc:intermediary:1.21.1")); + assertEquals("g/a/1/a-1-natives.jar", MinecraftLauncher.mavenPath("g:a:1:natives")); + assertThrows(IOException.class, () -> MinecraftLauncher.mavenPath("g:a:../../outside")); + assertThrows(IOException.class, () -> LauncherFiles.child(temporary, "../outside")); + Path zip = temporary.resolve("native.jar"); + try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(zip))) { out.putNextEntry(new ZipEntry("../escape.dll")); out.write(1); } + assertThrows(IOException.class, () -> MinecraftLauncher.extractNatives(zip, temporary.resolve("natives"), Collections.emptyList())); + assertFalse(Files.exists(temporary.resolve("escape.dll"))); + } + + @Test void unknownPlaceholdersFailInsteadOfLaunchingBrokenCommand() { + assertThrows(IOException.class, () -> MinecraftLauncher.substitute("${unknown}", Collections.emptyMap())); + } + + @Test void unchangedNativesAreNotOverwrittenWhileAnotherProcessMayHaveThemLoaded() throws Exception { + Path jar = temporary.resolve("native.jar"); + try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(jar))) { zip.putNextEntry(new ZipEntry("native.dll")); zip.write(new byte[]{1, 2, 3}); } + Path directory = temporary.resolve("profile-natives"); + MinecraftLauncher.extractNatives(jar, directory, Collections.emptyList()); + Path dll = directory.resolve("native.dll"); + java.nio.file.attribute.FileTime before = java.nio.file.attribute.FileTime.fromMillis(123456000); + Files.setLastModifiedTime(dll, before); + MinecraftLauncher.extractNatives(jar, directory, Collections.emptyList()); + assertEquals(before, Files.getLastModifiedTime(dll)); + Files.write(dll, new byte[]{9, 9, 9}); + MinecraftLauncher.extractNatives(jar, directory, Collections.emptyList()); + assertArrayEquals(new byte[]{1, 2, 3}, Files.readAllBytes(dll)); + } + + @Test void inheritedClientJarMatchesNeoForgeModuleIgnoreList() throws Exception { + // This fixture was produced by the official NeoForge 21.1.172 installer. Keeping the + // vanilla jar's original filename causes duplicate packages in its module layers. + JsonObject metadata = MinecraftLauncher.merge(fixture("1.21.1"), fixture("neoforge-1.21.1")); + Path vanilla = temporary.resolve("1.21.1.jar"); Files.write(vanilla, new byte[]{1, 2, 3}); + Path effective = MinecraftLauncher.clientJarForProfile(vanilla, metadata, temporary.resolve("cache")); + assertEquals("neoforge-21.1.172.jar", effective.getFileName().toString()); + assertArrayEquals(Files.readAllBytes(vanilla), Files.readAllBytes(effective)); + LaunchRequest request = new LaunchRequest(temporary.resolve("profile"), "1.21.1", "NEOFORGE", "21.1.172", MinecraftAccount.offline("Player"), null, 0); + List args = MinecraftLauncher.buildArguments(metadata, request, Collections.singletonList(effective), temporary.resolve("natives"), temporary.resolve("assets"), "17", null); + assertTrue(args.contains("-DignoreList=client-extra," + effective.getFileName())); + } + + @Test void offlineLaunchPreparesDownloadsVerifiesAndReusesCacheWithoutNetwork() throws Exception { + byte[] jar = clientJar(); + byte[] assets = "{\"objects\":{}}".getBytes(StandardCharsets.UTF_8); + HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + String base = "http://127.0.0.1:" + server.getAddress().getPort(); + JsonObject metadata = JsonParser.parseString("{\"id\":\"fixture\",\"mainClass\":\"com.osiris.autoplug.client.launcher.OfflineClientFixture\",\"libraries\":[],\"javaVersion\":{\"majorVersion\":21},\"arguments\":{\"jvm\":[\"-cp\",\"${classpath}\"],\"game\":[\"--username\",\"${auth_player_name}\",\"--gameDir\",\"${game_directory}\",\"--accessToken\",\"${auth_access_token}\"]}}").getAsJsonObject(); + JsonObject downloads = new JsonObject(); downloads.add("client", descriptor(base + "/client.jar", jar)); metadata.add("downloads", downloads); + JsonObject assetIndex = descriptor(base + "/assets.json", assets); assetIndex.addProperty("id", "fixture"); metadata.add("assetIndex", assetIndex); + byte[] manifestBody = metadata.toString().getBytes(StandardCharsets.UTF_8); + JsonObject entry = descriptor(base + "/fixture.json", manifestBody); entry.addProperty("id", "fixture"); + JsonObject manifest = new JsonObject(); JsonArray versions = new JsonArray(); versions.add(entry); manifest.add("versions", versions); + serve(server, "/manifest", manifest.toString().getBytes(StandardCharsets.UTF_8)); + serve(server, "/fixture.json", manifestBody); serve(server, "/client.jar", jar); serve(server, "/assets.json", assets); + server.start(); + Path java = Paths.get(System.getProperty("java.home"), "bin", JavaRuntimeManager.executableName()); + JavaRuntimeManager runtime = new JavaRuntimeManager(temporary.resolve("runtimes")) { + @Override public Path resolve(int major, java.util.function.Consumer log) { return java; } + }; + MinecraftLauncher launcher = new MinecraftLauncher(temporary.resolve("cache"), runtime, base + "/manifest"); + LaunchRequest request = new LaunchRequest(temporary.resolve("isolated profile"), "fixture", "VANILLA", null, MinecraftAccount.offline("OfflinePlayer"), null, 0); + PreparedLaunch prepared; + try { prepared = launcher.prepare(request, ignored -> { }); } + finally { server.stop(0); } + Process process = launcher.launch(prepared); + assertTrue(process.waitFor(20, TimeUnit.SECONDS)); assertEquals(0, process.exitValue()); + assertEquals(request.gameDir.toString(), new String(Files.readAllBytes(request.gameDir.resolve("fixture-working-directory.txt")), StandardCharsets.UTF_8)); + assertEquals(prepared.command(), launcher.prepare(request, ignored -> { }).command()); + assertFalse(Files.exists(temporary.resolve("fixture-working-directory.txt"))); + } + + private List args(JsonObject metadata, LaunchRequest request) throws Exception { + return MinecraftLauncher.buildArguments(metadata, request, Collections.singletonList(temporary.resolve("client with spaces.jar")), + temporary.resolve("natives"), temporary.resolve("assets"), "17", null); + } + private static JsonObject descriptor(String url, byte[] content) { + JsonObject result = new JsonObject(); result.addProperty("url", url); result.addProperty("size", content.length); + result.addProperty("sha1", com.osiris.autoplug.client.utils.UtilsCrypto.calculateSHA1Hash(content)); return result; + } + private static void serve(HttpServer server, String path, byte[] bytes) { + server.createContext(path, exchange -> { exchange.sendResponseHeaders(200, bytes.length); try (java.io.OutputStream out = exchange.getResponseBody()) { out.write(bytes); } }); + } + private static byte[] clientJar() throws IOException { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + String name = "com/osiris/autoplug/client/launcher/OfflineClientFixture.class"; + try (JarOutputStream jar = new JarOutputStream(bytes); InputStream in = MinecraftLauncherTest.class.getResourceAsStream("/" + name)) { + assertNotNull(in); jar.putNextEntry(new JarEntry(name)); byte[] buffer = new byte[4096]; int count; + while ((count = in.read(buffer)) != -1) jar.write(buffer, 0, count); + } + return bytes.toByteArray(); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/OfflineClientFixture.java b/src/test/java/com/osiris/autoplug/client/launcher/OfflineClientFixture.java new file mode 100644 index 00000000..cd75b1cf --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/OfflineClientFixture.java @@ -0,0 +1,9 @@ +package com.osiris.autoplug.client.launcher; + +/** Harmless isolated child JVM used to verify the complete offline launch path. */ +public class OfflineClientFixture { + public static void main(String[] args) throws Exception { + java.nio.file.Path directory = java.nio.file.Paths.get(System.getProperty("user.dir")); + java.nio.file.Files.write(directory.resolve("fixture-working-directory.txt"), directory.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java new file mode 100644 index 00000000..bd9a917f --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java @@ -0,0 +1,63 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.ui.LauncherActions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import java.util.*; +import static org.junit.jupiter.api.Assertions.*; + +class LauncherCommandsTest { + @TempDir Path temp; + @Test void consoleTokenizerPreservesVersionsAddressesAndWindowsPaths() throws Exception { + LauncherCommands commands = new LauncherCommands(null, ignored -> { }); + assertEquals(Arrays.asList(".profiles", "create", "My Pack", "1.21.1", "FABRIC"), commands.tokenize(".profiles create \"My Pack\" 1.21.1 FABRIC")); + assertEquals(Arrays.asList(".profiles", "add", "pack", "C:\\Game Files\\mod.jar"), commands.tokenize(".profiles add pack \"C:\\Game Files\\mod.jar\"")); + assertEquals("127.0.0.1:25570", commands.tokenize(".mc launch pack --server 127.0.0.1:25570").get(4)); + assertThrows(java.io.IOException.class, () -> commands.tokenize(".profiles create \"unterminated")); + } + @Test void commandsPersistProfilesAndSettingsAcrossInvocationsWithoutGlobalConfig() throws Exception { + List output = new ArrayList<>(); String id; + try (LauncherServices services = new LauncherServices(temp, output::add)) { + LauncherCommands commands = new LauncherCommands(services, output::add); + commands.execute(commands.tokenize(".profiles create \"My Pack\" 1.21.1 FABRIC --template")); + id = services.profiles().get(0).id; + commands.execute(commands.tokenize(".mc account offline FixtureUser")); + LauncherActions.SettingsInfo settings = services.settings(); settings.defaultProfile = id; settings.port = 25570; settings.upnp = false; services.saveSettings(settings); + assertThrows(java.io.IOException.class, () -> services.launchProfile(id, null, 25565)); + assertFalse(Files.exists(temp.resolve("autoplug"))); // No legacy server initialization. + assertFalse(Files.exists(temp.resolve("accounts.json"))); // Offline setting creates no credential store. + } + try (LauncherServices services = new LauncherServices(temp, output::add)) { + assertEquals("FixtureUser (offline)", services.settings().account); + assertEquals(25570, services.settings().port); assertFalse(services.settings().upnp); + assertEquals(id, services.settings().defaultProfile); + assertTrue(services.profiles().get(0).template); + LauncherCommands commands = new LauncherCommands(services, output::add); + commands.execute(commands.tokenize(".profiles clone " + id + " 1.20.1 --name Downgrade --yes")); + assertEquals(2, services.profiles().size()); + assertTrue(services.profiles().stream().anyMatch(p -> p.name.equals("Downgrade") && p.launchable)); + } + } + @Test void updateNeedsReviewedPlanAndWorldProfileCompatibilityIsCheckedEarly() throws Exception { + try (LauncherServices services = new LauncherServices(temp, ignored -> { })) { + LauncherActions.ProfileInfo client = services.createProfile("Client", "1.21.1", "FABRIC", "MODS", false); + LauncherActions.ProfileInfo server = services.createProfile("Server", "1.21.1", "FORGE", "MODS_SERVER", false); + assertThrows(java.io.IOException.class, () -> services.updateProfile(client.id)); + assertThrows(java.io.IOException.class, () -> services.createWorld("Invalid", server.id, client.id)); + assertTrue(services.worlds().isEmpty()); + services.checkProfile(client.id); services.updateProfile(client.id); + } + } + @Test void disablingRememberClearsAccountsEvenAfterSwitchingOffline() throws Exception { + try (LauncherServices services = new LauncherServices(temp, ignored -> { })) { + LauncherActions.SettingsInfo settings = services.settings(); settings.rememberAccount = true; services.saveSettings(settings); + com.osiris.autoplug.client.launcher.AccountStore store = new com.osiris.autoplug.client.launcher.AccountStore(temp.resolve("accounts.json")); + store.save(new com.osiris.autoplug.client.launcher.MinecraftAccount("FixtureOne", "123456781234123412341234567890ab", "test-access", "test-refresh", "test-client", "", false, java.time.Instant.now().plusSeconds(3600))); + store.save(new com.osiris.autoplug.client.launcher.MinecraftAccount("FixtureTwo", "abcdefab1234123412341234567890ab", "test-access", "test-refresh", "test-client", "", false, java.time.Instant.now().plusSeconds(3600))); + services.useOfflineAccount("Offline"); + settings = services.settings(); settings.rememberAccount = false; services.saveSettings(settings); + assertTrue(store.list().isEmpty()); + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/ProfileStoreTest.java b/src/test/java/com/osiris/autoplug/client/profiles/ProfileStoreTest.java new file mode 100644 index 00000000..6ad0fdd2 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/ProfileStoreTest.java @@ -0,0 +1,60 @@ +package com.osiris.autoplug.client.profiles; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import java.nio.charset.StandardCharsets; +import static org.junit.jupiter.api.Assertions.*; + +class ProfileStoreTest { + @TempDir Path temp; + @Test void cloneSharesJarsButIsolatesMutableConfiguration() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); + Profile source = store.create("Original", "1.20.1", "FABRIC", ProfileType.MODS); + Files.write(source.getDirectory().resolve("mods/test.jar"), new byte[]{1, 2, 3}); + Files.createDirectories(source.getDirectory().resolve("config")); + Files.write(source.getDirectory().resolve("config/a.txt"), "before".getBytes(StandardCharsets.UTF_8)); + Profile target = store.cloneProfile(source.id, "1.21.1"); + assertTrue(target.migrationPending); + Path targetJar = target.getDirectory().resolve("mods/test.jar"); + Path cached = store.getCache().store(source.getDirectory().resolve("mods/test.jar")); + assertTrue(Files.isSameFile(cached, targetJar)); + Files.write(target.getDirectory().resolve("config/a.txt"), "after".getBytes(StandardCharsets.UTF_8)); + assertEquals("before", new String(Files.readAllBytes(source.getDirectory().resolve("config/a.txt")), StandardCharsets.UTF_8)); + Path replacement = temp.resolve("replacement.jar"); Files.write(replacement, new byte[]{4, 5, 6}); + store.getCache().link(store.getCache().store(replacement), targetJar); + assertArrayEquals(new byte[]{1, 2, 3}, Files.readAllBytes(cached)); + assertArrayEquals(new byte[]{1, 2, 3}, Files.readAllBytes(source.getDirectory().resolve("mods/test.jar"))); + assertNotEquals(source.id, store.get(target.id).id); + } + @Test void lockPreventsMutatingAnActiveProfileAndDeleteIsRecoverable() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); + Profile p = store.create("Server", "1.21.1", "PAPER", ProfileType.PLUGINS); + try (ProfileLease lease = new ProfileLease(p.getDirectory())) { + assertThrows(java.io.IOException.class, () -> store.delete(p.id)); + assertThrows(java.io.IOException.class, () -> store.cloneProfile(p.id, "1.20.1")); + } + store.delete(p.id); + assertTrue(store.list().isEmpty()); + try (java.util.stream.Stream files = Files.list(temp.resolve("trash"))) { assertEquals(1, files.count()); } + } + @Test void rejectsTraversalAndMismatchedMetadata() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); + assertThrows(java.io.IOException.class, () -> store.get("../outside")); + Profile p = store.create("Client", "1.21.1", "VANILLA", ProfileType.MODS); + assertThrows(java.io.IOException.class, () -> new ProfileCollection().resolve(p, "../../outside.jar")); + p.id = "other"; + new JsonFiles().write(store.getRoot().resolve(p.getDirectory().getFileName()).resolve("profile.json"), p); + assertThrows(java.io.IOException.class, () -> store.get(p.getDirectory().getFileName().toString())); + } + @Test void cloningNeverCopiesTransientCredentialsOrNativeRuntimeFiles() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = store.create("Client", "1.21.1", "VANILLA", ProfileType.MODS); + Files.createDirectories(p.getDirectory().resolve(".autoplug/natives")); + Files.write(p.getDirectory().resolve(".autoplug/launch-private.args"), "test-token".getBytes(StandardCharsets.UTF_8)); + Files.write(p.getDirectory().resolve(".autoplug/natives/test.dll"), new byte[]{1}); + Files.write(p.getDirectory().resolve("accounts.json"), "test-secret".getBytes(StandardCharsets.UTF_8)); + Profile copy = store.cloneProfile(p.id, p.gameVersion); + assertFalse(Files.exists(copy.getDirectory().resolve(".autoplug"))); + assertFalse(Files.exists(copy.getDirectory().resolve("accounts.json"))); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/ProfileUpdatesTest.java b/src/test/java/com/osiris/autoplug/client/profiles/ProfileUpdatesTest.java new file mode 100644 index 00000000..085c7bcc --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/ProfileUpdatesTest.java @@ -0,0 +1,96 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.tasks.updater.search.SearchResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.IOException; +import java.nio.file.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.zip.*; +import static org.junit.jupiter.api.Assertions.*; + +class ProfileUpdatesTest { + @TempDir Path temp; + private void jar(Path path, String version) throws IOException { + try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(path))) { + out.putNextEntry(new ZipEntry("fabric.mod.json")); + out.write(("{\"id\":\"example\",\"name\":\"Example\",\"version\":\"" + version + "\",\"authors\":[\"Test\"]}").getBytes(java.nio.charset.StandardCharsets.UTF_8)); + out.closeEntry(); + } + } + private Profile profile(ProfileStore store) throws Exception { + Profile p = store.create("Test", "1.20.1", "FABRIC", ProfileType.MODS); + jar(p.getDirectory().resolve("mods/example.jar"), "2.0"); return p; + } + private SearchResult release(SearchResult.Type type) { return new SearchResult(null, type, "1.0", "https://example.invalid/mod.jar", ".jar", null, null, false); } + @Test void checkNeverDownloadsAndDowngradeReplacesOnlyTheSelectedProfile() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); + Profile clone = store.cloneProfile(p.id, "1.19.4"); AtomicInteger downloads = new AtomicInteger(); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.UPDATE_AVAILABLE), (r, dest) -> { downloads.incrementAndGet(); jar(dest, "1.0"); }); + byte[] original = Files.readAllBytes(p.getDirectory().resolve("mods/example.jar")); + ProfileUpdates.Plan plan = updates.check(clone.id); + assertEquals(0, downloads.get()); assertEquals(ProfileUpdates.Status.REPLACE, plan.changes.get(0).status); + updates.apply(plan, true); + assertEquals(1, downloads.get()); assertFalse(store.get(clone.id).migrationPending); + assertArrayEquals(original, Files.readAllBytes(p.getDirectory().resolve("mods/example.jar"))); + assertFalse(java.util.Arrays.equals(original, Files.readAllBytes(clone.getDirectory().resolve("mods/example.jar")))); + } + @Test void providerFailureDoesNotDisableOrChangeInstalledJars() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); p.migrationPending = true; store.save(p); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.API_ERROR), (r, dest) -> fail("No download expected")); + assertThrows(IOException.class, () -> updates.update(p.id, true)); + assertTrue(Files.exists(p.getDirectory().resolve("mods/example.jar"))); + assertFalse(Files.exists(p.getDirectory().resolve("mods/example.jar.disabled"))); + assertTrue(store.get(p.id).migrationPending); + } + @Test void unverifiedMigrationNeedsConfirmationAndDisablesWithBackup() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); p.migrationPending = true; store.save(p); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> null, (r, dest) -> fail("No download expected")); + assertThrows(IOException.class, () -> updates.update(p.id, false)); + updates.update(p.id, true); + assertFalse(Files.exists(p.getDirectory().resolve("mods/example.jar"))); + assertTrue(Files.exists(p.getDirectory().resolve("mods/example.jar.disabled"))); + assertFalse(store.get(p.id).migrationPending); + } + @Test void corruptDownloadLeavesOriginalIntact() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); + byte[] original = Files.readAllBytes(p.getDirectory().resolve("mods/example.jar")); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> { SearchResult r = release(SearchResult.Type.UPDATE_AVAILABLE); r.sha1 = "0000000000000000000000000000000000000000"; return r; }, (r, dest) -> jar(dest, "bad")); + assertThrows(IOException.class, () -> updates.update(p.id, true)); + assertArrayEquals(original, Files.readAllBytes(p.getDirectory().resolve("mods/example.jar"))); + } + @Test void stalePlanCannotOverwriteNewerLocalFiles() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.UPDATE_AVAILABLE), (r, dest) -> fail("No download expected")); + ProfileUpdates.Plan plan = updates.check(p.id); jar(p.getDirectory().resolve("mods/example.jar"), "changed"); + assertThrows(IOException.class, () -> updates.apply(plan, true)); + } + @Test void jarAddedAfterReviewCannotEscapeMigration() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); p.migrationPending = true; store.save(p); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.UP_TO_DATE), (r, dest) -> fail("No download expected")); + ProfileUpdates.Plan plan = updates.check(p.id); jar(p.getDirectory().resolve("mods/unreviewed.jar"), "1.0"); + assertThrows(IOException.class, () -> updates.apply(plan, true)); + assertTrue(store.get(p.id).migrationPending); + } + @Test void providerIdentityChangedAfterReviewRequiresNewPlan() throws Exception { + ProfileStore store = new ProfileStore(temp.resolve("profiles")); Profile p = profile(store); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.UPDATE_AVAILABLE), (r, dest) -> fail("No download expected")); + ProfileUpdates.Plan plan = updates.check(p.id); + ProfileCollection collection = new ProfileCollection().scan(p); collection.entries.get(0).modrinthId = "different"; collection.save(p); + assertThrows(IOException.class, () -> updates.apply(plan, true)); + } + @Test void failedMetadataCommitRestoresBothJarAndMetadata() throws Exception { + java.util.concurrent.atomic.AtomicBoolean failSave = new java.util.concurrent.atomic.AtomicBoolean(); + ProfileStore store = new ProfileStore(temp.resolve("profiles")) { + @Override public void save(Profile p) throws IOException { if (failSave.get()) throw new IOException("Simulated disk failure"); super.save(p); } + }; + Profile p = profile(store); ProfileCollection collection = new ProfileCollection().scan(p); collection.save(p); + byte[] originalJar = Files.readAllBytes(p.getDirectory().resolve("mods/example.jar")); + byte[] originalMetadata = Files.readAllBytes(p.getDirectory().resolve("collection.json")); + ProfileUpdates updates = new ProfileUpdates(store, (pr, entry, file) -> release(SearchResult.Type.UPDATE_AVAILABLE), (r, dest) -> jar(dest, "1.0")); + ProfileUpdates.Plan plan = updates.check(p.id); failSave.set(true); + assertThrows(IOException.class, () -> updates.apply(plan, true)); + assertArrayEquals(originalJar, Files.readAllBytes(p.getDirectory().resolve("mods/example.jar"))); + assertArrayEquals(originalMetadata, Files.readAllBytes(p.getDirectory().resolve("collection.json"))); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/ProviderCompatibilityTest.java b/src/test/java/com/osiris/autoplug/client/profiles/ProviderCompatibilityTest.java new file mode 100644 index 00000000..d558eead --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/ProviderCompatibilityTest.java @@ -0,0 +1,32 @@ +package com.osiris.autoplug.client.profiles; + +import com.google.gson.*; +import com.osiris.autoplug.client.tasks.updater.mods.*; +import com.osiris.autoplug.client.tasks.updater.search.SearchResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import static org.junit.jupiter.api.Assertions.*; + +class ProviderCompatibilityTest { + @TempDir Path temp; + @Test void curseForgeDowngradeUsesArtifactHashNotCopiedTimestamp() throws Exception { + Path jar = temp.resolve("mod.jar"); Files.write(jar, "abc".getBytes(java.nio.charset.StandardCharsets.UTF_8)); + Files.setLastModifiedTime(jar, java.nio.file.attribute.FileTime.fromMillis(System.currentTimeMillis() + 86400000)); + MinecraftMod mod = new MinecraftMod(jar.toString(), "Mod", "2", "Author", null, "123", null); + JsonObject release = JsonParser.parseString("{\"fileName\":\"mod-1.jar\",\"downloadUrl\":\"https://example.invalid/mod.jar\",\"fileLength\":3,\"fileDate\":\"2020-01-01T00:00:00Z\",\"hashes\":[{\"algo\":1,\"value\":\"0000000000000000000000000000000000000000\"}]}").getAsJsonObject(); + SearchResult result = new CurseForgeAPI().compatibleArtifactResult(release, mod); + assertEquals(SearchResult.Type.UPDATE_AVAILABLE, result.type); + release.getAsJsonArray("hashes").get(0).getAsJsonObject().addProperty("value", "a9993e364706816aba3e25717850c26c9cd0d89d"); + assertEquals(SearchResult.Type.UP_TO_DATE, new CurseForgeAPI().compatibleArtifactResult(release, mod).type); + } + @Test void exactModrinthSelectionRejectsWrongLoaderAndPreservesPrimaryChecksum() throws Exception { + JsonArray releases = JsonParser.parseString("[" + + "{\"version_number\":\"wrong\",\"date_published\":\"2025-01-01T00:00:00Z\",\"game_versions\":[\"1.20.1\"],\"loaders\":[\"neoforge\"],\"files\":[]}," + + "{\"version_number\":\"older-compatible\",\"date_published\":\"2024-01-01T00:00:00Z\",\"game_versions\":[\"1.20.1\"],\"loaders\":[\"fabric\"],\"files\":[{\"filename\":\"sources.jar\",\"primary\":false,\"url\":\"https://example.invalid/sources\",\"hashes\":{}},{\"filename\":\"main.jar\",\"primary\":true,\"url\":\"https://example.invalid/main\",\"size\":3,\"hashes\":{\"sha1\":\"a9993e364706816aba3e25717850c26c9cd0d89d\"}}]}]").getAsJsonArray(); + Path installed = temp.resolve("mod.jar"); Files.write(installed, "abc".getBytes(java.nio.charset.StandardCharsets.UTF_8)); + SearchResult found = new ModrinthAPI().compatibleResult(releases, java.util.List.of("fabric"), "1.20.1", installed); + assertEquals("older-compatible", found.latestVersion); assertEquals("main.jar", found.fileName); assertEquals(SearchResult.Type.UP_TO_DATE, found.type); + assertEquals(SearchResult.Type.RESOURCE_NOT_FOUND, new ModrinthAPI().compatibleResult(releases, java.util.List.of("fabric"), "1.21.1", installed).type); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthArtifactIdentityTest.java b/src/test/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthArtifactIdentityTest.java new file mode 100644 index 00000000..13be1b6d --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthArtifactIdentityTest.java @@ -0,0 +1,108 @@ +package com.osiris.autoplug.client.tasks.updater.mods; + +import com.osiris.autoplug.client.tasks.updater.search.SearchResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.*; + +class ModrinthArtifactIdentityTest { + private static final String SHA1_ABC = "a9993e364706816aba3e25717850c26c9cd0d89d"; + @TempDir Path directory; + + @Test void resolvesTopLevelProjectFromExactBytesWithoutChangingInstalledFile() throws Exception { + Path installed = artifact(); + byte[] before = Files.readAllBytes(installed); + AtomicReference request = new AtomicReference<>(); + ModrinthAPI api = new ModrinthAPI(url -> { + FixtureConnection connection = new FixtureConnection(url, 200, + "{\"id\":\"Version1\",\"project_id\":\"AABBCCDD\",\"dependencies\":[{\"project_id\":\"Other123\"}],\"files\":[{\"hashes\":{\"sha1\":\"" + SHA1_ABC + "\"}}]}"); + request.set(connection); return connection; + }); + assertEquals("AABBCCDD", api.findProjectForArtifact(installed)); + assertEquals("https://api.modrinth.com/v2/version_file/" + SHA1_ABC + "?algorithm=sha1", request.get().getURL().toString()); + assertEquals("GET", request.get().getRequestMethod()); + assertEquals(15000, request.get().getConnectTimeout()); + assertEquals(20000, request.get().getReadTimeout()); + assertTrue(request.get().getRequestProperty("User-Agent").contains("AutoPlug-Client")); + assertTrue(request.get().disconnected); + assertArrayEquals(before, Files.readAllBytes(installed)); + } + + @Test void unknownHashReturnsNullButProviderErrorsRemainErrors() throws Exception { + Path installed = artifact(); + FixtureConnection absent = new FixtureConnection(new URL("https://example.invalid"), 404, ""); + assertNull(new ModrinthAPI(url -> absent).findProjectForArtifact(installed)); + assertTrue(absent.disconnected); + FixtureConnection failed = new FixtureConnection(new URL("https://example.invalid"), 503, "unavailable"); + IOException exception = assertThrows(IOException.class, () -> new ModrinthAPI(url -> failed).findProjectForArtifact(installed)); + assertTrue(exception.getMessage().contains("503")); + assertTrue(failed.disconnected); + assertThrows(SocketTimeoutException.class, () -> new ModrinthAPI(url -> { throw new SocketTimeoutException("Fixture timeout"); }).findProjectForArtifact(installed)); + } + + @Test void malformedSuccessfulResponsesDoNotLookLikeUnknownArtifacts() throws Exception { + Path installed = artifact(); + for (String body : List.of("not-json", "[]", "{}", "{\"project_id\":null}", "{\"project_id\":12}", "{\"project_id\":\"../escape\"}")) { + ModrinthAPI api = new ModrinthAPI(url -> new FixtureConnection(url, 200, body)); + assertThrows(IOException.class, () -> api.findProjectForArtifact(installed), body); + } + } + + @Test void absentLocalArtifactFailsBeforeAnyNetworkRequest() { + ModrinthAPI api = new ModrinthAPI(url -> { throw new AssertionError("Missing files must not trigger a lookup"); }); + assertThrows(IOException.class, () -> api.findProjectForArtifact(directory.resolve("missing.jar"))); + } + + @Test void compatibleResultsCarryIdentityForCurrentAndReplacementButNotMissingRelease() throws Exception { + Path installed = artifact(); + String response = "[{\"project_id\":\"AABBCCDD\",\"version_number\":\"1.0\",\"date_published\":\"2024-01-01T00:00:00Z\"," + + "\"game_versions\":[\"1.20.1\"],\"loaders\":[\"paper\"],\"files\":[{\"filename\":\"plugin.jar\",\"primary\":true," + + "\"url\":\"https://cdn.modrinth.com/data/AABBCCDD/plugin.jar\",\"size\":3,\"hashes\":{\"sha1\":\"" + SHA1_ABC + "\"}}]}]"; + ModrinthAPI api = new ModrinthAPI(url -> new FixtureConnection(url, 200, response)); + SearchResult current = api.searchCompatible(List.of("paper"), "AABBCCDD", "1.20.1", installed); + assertEquals(SearchResult.Type.UP_TO_DATE, current.type); + assertEquals("AABBCCDD", current.modrinthProjectId); + Files.write(installed, "different".getBytes(StandardCharsets.UTF_8)); + SearchResult replacement = api.searchCompatible(List.of("paper"), "AABBCCDD", "1.20.1", installed); + assertEquals(SearchResult.Type.UPDATE_AVAILABLE, replacement.type); + assertEquals("AABBCCDD", replacement.modrinthProjectId); + SearchResult missing = api.searchCompatible(List.of("paper"), "AABBCCDD", "1.21.1", installed); + assertEquals(SearchResult.Type.RESOURCE_NOT_FOUND, missing.type); + assertNull(missing.modrinthProjectId); + SearchResult failed = new ModrinthAPI(url -> new FixtureConnection(url, 500, "")).searchCompatible(List.of("paper"), "AABBCCDD", "1.20.1", installed); + assertEquals(SearchResult.Type.API_ERROR, failed.type); + assertNull(failed.modrinthProjectId); + } + + private Path artifact() throws IOException { + Path file = directory.resolve("a-name-unrelated-to-its-project.jar"); + Files.write(file, "abc".getBytes(StandardCharsets.UTF_8)); return file; + } + + private static final class FixtureConnection extends HttpURLConnection { + private final int status; + private final byte[] body; + boolean disconnected; + FixtureConnection(URL url, int status, String body) { + super(url); this.status = status; this.body = body.getBytes(StandardCharsets.UTF_8); + } + @Override public int getResponseCode() { return status; } + @Override public InputStream getInputStream() { return new ByteArrayInputStream(body); } + @Override public void disconnect() { disconnected = true; } + @Override public boolean usingProxy() { return false; } + @Override public void connect() { } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java new file mode 100644 index 00000000..1e77946f --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -0,0 +1,164 @@ +package com.osiris.autoplug.client.ui; + +import com.formdev.flatlaf.FlatLightLaf; +import com.osiris.autoplug.client.browser.ServerBrowserService; +import com.osiris.autoplug.client.ui.LauncherActions.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.nio.file.*; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import static org.junit.jupiter.api.Assertions.*; + +class DashboardPanelTest { + @TempDir Path directory; + + @Test void versionSelectionDoesNotConfuseVersionPrefixes() { + assertTrue(DashboardPanel.versionMatches("Paper 1.21.1", "1.21.1")); + assertFalse(DashboardPanel.versionMatches("Paper 1.21.11", "1.21.1")); + assertFalse(DashboardPanel.versionMatches("1.21", "1.2")); + assertFalse(DashboardPanel.versionMatches(null, "1.21")); + assertEquals("1.21.1", DashboardPanel.gameVersionFromStatus("Paper 1.21.1")); + assertEquals("", DashboardPanel.gameVersionFromStatus("1.8 - 1.21.1")); + assertEquals("1.21.5-pre2", DashboardPanel.gameVersionFromStatus("Paper 1.21.5-pre2")); + assertEquals("25w34a", DashboardPanel.gameVersionFromStatus("25w34a")); + assertFalse(DashboardPanel.versionMatches("1.21.5-pre2", "1.21.5")); + } + + @Test void automaticJoinRequiresClientTypeExactVersionLoaderAndReadyWorkingProfile() { + ProfileInfo otherLoader = new ProfileInfo("wrong", "Forge", "1.21.1", "FORGE", "MODS", "", false); + ProfileInfo template = new ProfileInfo("template", "Base", "1.21.1", "FABRIC", "MODS", "", true); + ProfileInfo pending = new ProfileInfo("pending", "Pending", "1.21.1", "FABRIC", "MODS", "", false, "Review", false); + ProfileInfo server = new ProfileInfo("server", "Server", "1.21.1", "FABRIC", "MODS_SERVER", "", false); + ProfileInfo ready = new ProfileInfo("ready", "Client", "1.21.1", "FABRIC", "MODS", "", false); + List candidates = Arrays.asList(otherLoader, template, pending, server, ready); + assertSame(ready, DashboardPanel.matchingClientProfile(candidates, "1.21.1", "fabric")); + assertNull(DashboardPanel.matchingClientProfile(candidates, "1.21", "FABRIC")); + assertNull(DashboardPanel.matchingClientProfile(candidates, "", "FABRIC")); + } + + @Test void loadsServicesOffEventThreadAndBuildsAllFiveViews() throws Exception { + AtomicBoolean onEventThread = new AtomicBoolean(); CountDownLatch calls = new CountDownLatch(3); + LauncherActions actions = fixtures(onEventThread, calls); + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + assertTrue(calls.await(4, TimeUnit.SECONDS)); assertFalse(onEventThread.get()); + SwingUtilities.invokeAndWait(() -> { + for (String view : new String[]{"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}) + assertNotNull(findButton(panel.get(), view), "Missing navigation: " + view); + assertNotNull(findButton(panel.get(), "Create world")); + assertNotNull(findButton(panel.get(), "Sign in with Microsoft")); + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void consoleReceivesBackgroundLogsAndReleasesListenerOnClose() throws Exception { + java.util.List> before = + new java.util.ArrayList<>(com.osiris.jlib.logger.AL.actionsOnMessageEvent); + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new ServerConsolePanel(new JPanel()))); + try { + java.util.List> added = + new java.util.ArrayList<>(com.osiris.jlib.logger.AL.actionsOnMessageEvent); added.removeAll(before); + assertEquals(1, added.size()); + added.get(0).executeOnEvent(new com.osiris.jlib.logger.Message(com.osiris.jlib.logger.Message.Type.INFO, "Background task finished")); + AtomicReference output = new AtomicReference<>(""); long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(3); + while (!output.get().contains("Background task finished") && System.nanoTime() < deadline) { + Thread.sleep(30); SwingUtilities.invokeAndWait(() -> output.set(panel.get().txtConsole.getText())); + } + assertTrue(output.get().contains("Background task finished")); + SwingUtilities.invokeAndWait(() -> panel.get().close()); + assertFalse(com.osiris.jlib.logger.AL.actionsOnMessageEvent.contains(added.get(0))); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void jarImportKeepsSelectedProfileAndOptionalProjectAndRunsOffEventThread() throws Exception { + CountDownLatch imported = new CountDownLatch(1); AtomicBoolean onEventThread = new AtomicBoolean(); + AtomicReference> request = new AtomicReference<>(); + LauncherActions actions = new LauncherActions() { + @Override public void addArtifact(String id, String path, String project) { + onEventThread.set(SwingUtilities.isEventDispatchThread()); request.set(Arrays.asList(id, path, project)); imported.countDown(); + } + }; + AtomicReference panel = new AtomicReference<>(); + ProfileInfo selected = new ProfileInfo("selected-profile", "My pack", "1.21.1", "FABRIC", "MODS", directory.toString(), false); + String jar = directory.resolve("a mod with spaces.jar").toString(); + SwingUtilities.invokeAndWait(() -> { + panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false)); + panel.get().importArtifact(selected, jar, "sodium"); + }); + try { + assertTrue(imported.await(4, TimeUnit.SECONDS)); assertFalse(onEventThread.get()); + assertEquals(Arrays.asList("selected-profile", jar, "sodium"), request.get()); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + /** Offscreen fixture preview; does not initialize AutoPlug, sign in, or contact public servers. */ + public static void main(String[] args) throws Exception { + Path output = Paths.get(args.length == 0 ? "target/dashboard-preview" : args[0]); Files.createDirectories(output); + int width = args.length > 1 ? Integer.parseInt(args[1]) : 1200; + int height = args.length > 2 ? Integer.parseInt(args[2]) : 820; + Path data = Files.createTempDirectory("autoplug-dashboard-preview-"); + AtomicReference panel = new AtomicReference<>(); CountDownLatch calls = new CountDownLatch(3); + SwingUtilities.invokeAndWait(() -> { + FlatLightLaf.setup(); + com.osiris.autoplug.client.utils.GD.TARGET = com.osiris.autoplug.client.Target.MINECRAFT_SERVER; + panel.set(new DashboardPanel(fixtures(new AtomicBoolean(), calls), new ServerBrowserService(data.resolve("servers.json"), data.resolve("servers.dat")), true)); + }); + calls.await(4, TimeUnit.SECONDS); + // Waiting behind the worker callbacks allows the fixture models to arrive before printing. + Thread.sleep(250); + try { + for (String view : new String[]{"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}) { + SwingUtilities.invokeAndWait(() -> findButton(panel.get(), view).doClick()); + Thread.sleep(50); + SwingUtilities.invokeAndWait(() -> { + try { + panel.get().setSize(width, height); layout(panel.get()); + BufferedImage bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = bitmap.createGraphics(); + graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + panel.get().printAll(graphics); graphics.dispose(); + ImageIO.write(bitmap, "png", output.resolve(view.toLowerCase().replace(' ', '-') + ".png").toFile()); + } catch (Exception e) { throw new RuntimeException(e); } + }); + } + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + private static LauncherActions fixtures(AtomicBoolean onEventThread, CountDownLatch calls) { + return new LauncherActions() { + private void called() { if (SwingUtilities.isEventDispatchThread()) onEventThread.set(true); calls.countDown(); } + @Override public List profiles() { + called(); return Arrays.asList( + new ProfileInfo("vanilla", "Everyday Minecraft", "1.21.1", "VANILLA", "MODS", "/profiles/everyday", false), + new ProfileInfo("fabric", "Exploration pack", "1.21.1", "FABRIC", "MODS", "/profiles/exploration", false), + new ProfileInfo("paper", "Friends server", "1.21.1", "PAPER", "PLUGINS", "/profiles/friends", false), + new ProfileInfo("template", "My base template", "1.21.1", "FABRIC", "MODS", "/profiles/base", true)); + } + @Override public List worlds() { + called(); return Arrays.asList(new WorldInfo("cove", "Quiet Cove", "paper", "vanilla", "/worlds/quiet-cove", "", false), + new WorldInfo("forest", "The long weekend", "paper", "fabric", "/worlds/long-weekend", "", false)); + } + @Override public SettingsInfo settings() { called(); SettingsInfo settings = new SettingsInfo(); settings.account = "Offline · Alex"; settings.defaultProfile = "vanilla"; settings.java17 = "/runtimes/java-17/bin/java"; settings.java21 = "/runtimes/java-21/bin/java"; return settings; } + }; + } + private static AbstractButton findButton(Container container, String text) { + for (Component component : container.getComponents()) { + if (component instanceof AbstractButton && text.equals(((AbstractButton) component).getText())) return (AbstractButton) component; + if (component instanceof Container) { AbstractButton found = findButton((Container) component, text); if (found != null) return found; } + } + return null; + } + private static void layout(Container container) { container.doLayout(); for (Component component : container.getComponents()) if (component instanceof Container) layout((Container) component); } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/MinecraftServerInstallerTest.java b/src/test/java/com/osiris/autoplug/client/worlds/MinecraftServerInstallerTest.java new file mode 100644 index 00000000..89570f26 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/MinecraftServerInstallerTest.java @@ -0,0 +1,61 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.jar.*; +import static org.junit.jupiter.api.Assertions.*; + +class MinecraftServerInstallerTest { + @TempDir Path temporary; + @Test void installsIntoIndependentWorldsCachesJarsAndPreservesMutableWorldConfig() throws Exception { + ProfileStore store = new ProfileStore(temporary.resolve("profiles")); + Profile profile = store.create("Server template", "1.20.4", "PAPER", ProfileType.PLUGINS); + profile.template = true; store.save(profile); + Path plugin = profile.getDirectory().resolve("plugins/example.jar"); + jar(plugin, "v1"); + Files.write(profile.getDirectory().resolve("server.properties"), "motd=Template".getBytes(StandardCharsets.UTF_8)); + Files.createDirectories(profile.getDirectory().resolve("world")); + Files.write(profile.getDirectory().resolve("world/level.dat"), new byte[]{9}); + AtomicInteger acquisitions = new AtomicInteger(); + Path java = Paths.get(System.getProperty("java.home"), "bin", "java"); + MinecraftServerInstaller installer = new MinecraftServerInstaller(store.getCache(), version -> java, (p, work, runtime) -> { + acquisitions.incrementAndGet(); Path result = work.resolve("fixture-server.jar"); jar(result, "server"); return result; + }); + Path first = temporary.resolve("worlds/first"), second = temporary.resolve("worlds/second"); + ServerLaunch firstLaunch = installer.prepare(profile, first); + installer.prepare(profile, second); + assertEquals(1, acquisitions.get()); + assertEquals(first.toAbsolutePath(), firstLaunch.directory); + assertEquals("server.jar", firstLaunch.command.get(4)); + assertTrue(Files.exists(first.resolve("plugins/example.jar"))); + assertFalse(Files.exists(first.resolve("world/level.dat")), "Reusable profiles must not copy saved worlds"); + Files.write(first.resolve("server.properties"), "motd=My world".getBytes(StandardCharsets.UTF_8)); + Files.delete(plugin); + jar(profile.getDirectory().resolve("plugins/replacement.jar"), "v2"); + installer.prepare(profile, first); + assertFalse(Files.exists(first.resolve("plugins/example.jar")), "Removed profile artifacts must not remain active"); + assertTrue(Files.exists(first.resolve("plugins/replacement.jar"))); + assertTrue(Files.exists(second.resolve("plugins/example.jar")), "Another world's files remain isolated"); + assertEquals("motd=My world", new String(Files.readAllBytes(first.resolve("server.properties")), StandardCharsets.UTF_8)); + assertEquals("motd=Template", new String(Files.readAllBytes(profile.getDirectory().resolve("server.properties")), StandardCharsets.UTF_8)); + } + @Test void rejectsAnErrorPageInsteadOfCachingItAsServerJar() throws Exception { + ProfileStore store = new ProfileStore(temporary.resolve("profiles")); + Profile profile = store.create("Server", "1.20.4", "PAPER", ProfileType.PLUGINS); + MinecraftServerInstaller installer = new MinecraftServerInstaller(store.getCache(), version -> temporary.resolve("java"), (p, work, runtime) -> { + Path bad = work.resolve("bad.jar"); Files.write(bad, "not a jar".getBytes(StandardCharsets.UTF_8)); return bad; + }); + assertThrows(java.io.IOException.class, () -> installer.prepare(profile, temporary.resolve("world"))); + assertFalse(Files.exists(temporary.resolve("world/server.jar"))); + } + private static void jar(Path file, String contents) throws Exception { + Files.createDirectories(file.getParent()); + try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(file))) { + out.putNextEntry(new JarEntry("fixture.txt")); out.write(contents.getBytes(StandardCharsets.UTF_8)); out.closeEntry(); + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/UpnpSharingServiceTest.java b/src/test/java/com/osiris/autoplug/client/worlds/UpnpSharingServiceTest.java new file mode 100644 index 00000000..3aee62e5 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/UpnpSharingServiceTest.java @@ -0,0 +1,109 @@ +package com.osiris.autoplug.client.worlds; + +import org.junit.jupiter.api.Test; +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import com.sun.net.httpserver.HttpServer; +import static org.junit.jupiter.api.Assertions.*; + +class UpnpSharingServiceTest { + @Test void explicitSharingRelaysLoopbackTrafficAndRemovesOnlyItsOwnedMapping() throws Exception { + FakeGateway gateway = new FakeGateway(); + ExecutorService executor = Executors.newSingleThreadExecutor(); + try (ServerSocket target = new ServerSocket(0, 1, InetAddress.getByName("127.0.0.1"))) { + Future echo = executor.submit(() -> { + try (Socket socket = target.accept()) { + socket.setSoTimeout(3000); + int value = socket.getInputStream().read(); socket.getOutputStream().write(value + 1); socket.getOutputStream().flush(); + } catch (IOException e) { throw new UncheckedIOException(e); } + }); + SharingService.Lease lease = new UpnpSharingService(() -> gateway).open(target.getLocalPort()); + try { + assertEquals(1, gateway.additions.get()); + assertEquals("203.0.113.10:" + gateway.port, lease.address()); + try (Socket client = new Socket("127.0.0.1", gateway.port)) { + client.setSoTimeout(3000); client.getOutputStream().write(41); client.getOutputStream().flush(); + assertEquals(42, client.getInputStream().read()); + } + echo.get(5, TimeUnit.SECONDS); + } finally { lease.close(); } + lease.close(); + assertEquals(1, gateway.removals.get()); + assertThrows(IOException.class, () -> new Socket("127.0.0.1", gateway.port)); + } finally { executor.shutdownNow(); } + } + @Test void mappingFailureClosesForwardingListener() throws Exception { + FakeGateway gateway = new FakeGateway() { + @Override public void addMapping(int external, int internal, String description, int lease) throws IOException { + port = internal; throw new IOException("Fixture denies mapping"); + } + }; + assertThrows(IOException.class, () -> new UpnpSharingService(() -> gateway).open(25565)); + assertTrue(gateway.port > 0); + assertThrows(IOException.class, () -> new Socket("127.0.0.1", gateway.port)); + assertEquals(0, gateway.removals.get()); + } + @Test void detectsDoubleNatBeforeOpeningMapping() throws Exception { + FakeGateway gateway = new FakeGateway() { @Override public String externalAddress() { return "100.64.0.2"; } }; + assertThrows(IOException.class, () -> new UpnpSharingService(() -> gateway).open(25565)); + assertEquals(0, gateway.additions.get()); + } + @Test void gatewayXmlCannotReadExternalEntities() { + byte[] payload = "]>&secret;".getBytes(StandardCharsets.UTF_8); + assertThrows(Exception.class, () -> UpnpSharingService.xml(payload)); + } + @Test void soapFixtureChecksOwnershipBeforeOverwritingOrDeletingMapping() throws Exception { + HttpServer http = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + AtomicReference owner = new AtomicReference<>(); + AtomicInteger deletes = new AtomicInteger(); + http.createContext("/control", exchange -> { + String action = exchange.getRequestHeaders().getFirst("SOAPAction"); + String response; int code = 200; + if (action.contains("GetExternalIPAddress")) response = "203.0.113.10"; + else if (action.contains("GetSpecificPortMappingEntry")) { + if (owner.get() == null) { code = 500; response = "714NoSuchEntryInArray"; } + else response = "25565127.0.0.1" + owner.get() + ""; + } else if (action.contains("AddPortMapping")) { + String body = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8); + assertTrue(body.contains("3600")); + assertTrue(body.contains("127.0.0.1")); + owner.set("owned"); response = ""; + } else { deletes.incrementAndGet(); owner.set(null); response = ""; } + byte[] bytes = ("" + response + "").getBytes(StandardCharsets.UTF_8); + exchange.sendResponseHeaders(code, bytes.length); + try (OutputStream out = exchange.getResponseBody()) { out.write(bytes); } + }); + http.start(); + try { + UpnpSharingService.Gateway gateway = new UpnpSharingService.SoapGateway(new URL("http://127.0.0.1:" + http.getAddress().getPort() + "/control"), + "urn:schemas-upnp-org:service:WANIPConnection:1", InetAddress.getByName("127.0.0.1")); + assertEquals("203.0.113.10", gateway.externalAddress()); + gateway.addMapping(25565, 25565, "owned", 3600); + gateway.addMapping(25565, 25565, "owned", 3600); + owner.set("another application"); + assertThrows(IOException.class, () -> gateway.addMapping(25565, 25565, "owned", 3600)); + gateway.removeMapping(25565, 25565, "owned"); + assertEquals(0, deletes.get()); + owner.set("owned"); gateway.removeMapping(25565, 25565, "owned"); + assertEquals(1, deletes.get()); + } finally { http.stop(0); } + } + private static class FakeGateway implements UpnpSharingService.Gateway { + int port; String ownedDescription; + final AtomicInteger additions = new AtomicInteger(), removals = new AtomicInteger(); + public InetAddress localAddress() { return InetAddress.getLoopbackAddress(); } + public String externalAddress() { return "203.0.113.10"; } + public void addMapping(int external, int internal, String description, int lease) throws IOException { + assertEquals(external, internal); assertEquals(3600, lease); + port = internal; ownedDescription = description; additions.incrementAndGet(); + } + public void removeMapping(int external, int internal, String description) { + if (ownedDescription == null) return; + assertEquals(port, internal); assertEquals(ownedDescription, description); removals.incrementAndGet(); + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java b/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java new file mode 100644 index 00000000..4422b03c --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java @@ -0,0 +1,51 @@ +package com.osiris.autoplug.client.worlds; + +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.Properties; + +/** A real child JVM used only by offline lifecycle tests; all sockets bind loopback. */ +public final class WorldFixtureProcess { + public static void main(String[] args) throws Exception { + if (args[0].equals("client")) { Thread.sleep(60000); return; } + if (args[0].equals("exit")) return; + Properties properties = new Properties(); + try (InputStream input = Files.newInputStream(Paths.get("server.properties"))) { properties.load(input); } + if (!"127.0.0.1".equals(properties.getProperty("server-ip"))) throw new IllegalStateException("Fixture must be local"); + try (ServerSocket server = new ServerSocket(Integer.parseInt(properties.getProperty("server-port")), 8, + InetAddress.getByName("127.0.0.1"))) { + Thread input = new Thread(() -> { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); + String line; + while ((line = reader.readLine()) != null) if (line.equals("stop")) { + Files.write(Paths.get("stopped.txt"), "graceful".getBytes(StandardCharsets.UTF_8)); server.close(); return; + } + } catch (IOException ignored) { } + }); + input.setDaemon(true); input.start(); + while (!server.isClosed()) { + try (Socket socket = server.accept()) { + socket.setSoTimeout(2000); + DataInputStream in = new DataInputStream(socket.getInputStream()); + int length = varint(in); byte[] handshake = new byte[length]; in.readFully(handshake); + in.readUnsignedByte(); in.readUnsignedByte(); + byte[] json = "{\"version\":{\"name\":\"1.20.4\",\"protocol\":765},\"players\":{\"max\":20,\"online\":0},\"description\":{\"text\":\"Offline fixture\"}}".getBytes(StandardCharsets.UTF_8); + ByteArrayOutputStream packet = new ByteArrayOutputStream(); + packet.write(0); varint(packet, json.length); packet.write(json); + OutputStream out = socket.getOutputStream(); varint(out, packet.size()); packet.writeTo(out); out.flush(); + } catch (SocketException e) { if (!server.isClosed()) throw e; } + } + } + } + private static int varint(InputStream input) throws IOException { + int value = 0; + for (int i = 0; i < 5; i++) { int b = input.read(); if (b < 0) throw new EOFException(); value |= (b & 127) << (i * 7); if ((b & 128) == 0) return value; } + throw new IOException("Invalid varint"); + } + private static void varint(OutputStream output, int value) throws IOException { + do { int b = value & 127; value >>>= 7; output.write(value == 0 ? b : b | 128); } while (value != 0); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java b/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java new file mode 100644 index 00000000..d9f4fd61 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java @@ -0,0 +1,180 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.*; +import com.osiris.autoplug.client.utils.MineStat; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.InetAddress; +import java.nio.file.*; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import static org.junit.jupiter.api.Assertions.*; + +class WorldServiceTest { + @TempDir Path temporary; + + @Test void realLocalServerBecomesReadyThenStopsWhenClientExits() throws Exception { + Fixture fixture = fixture(true); + AtomicInteger mappings = new AtomicInteger(); + AtomicInteger unmappings = new AtomicInteger(); + SharingService share = port -> { mappings.incrementAndGet(); return new SharingService.Lease() { + public String address() { return "203.0.113.1:25565"; } + public void close() { unmappings.incrementAndGet(); } + }; }; + try (WorldService service = service(fixture, share, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + WorldSession session = service.launch(fixture.world.id, false); + assertTrue(session.server().isAlive()); + assertTrue(session.client().isAlive()); + assertEquals(0, mappings.get(), "Local launch must never discover or map a router"); + Properties properties = new Properties(); + try (java.io.InputStream input = Files.newInputStream(fixture.worlds.getDirectory(fixture.world.id).resolve("server.properties"))) { properties.load(input); } + assertEquals("127.0.0.1", properties.getProperty("server-ip")); + assertEquals("true", properties.getProperty("online-mode")); + assertTrue(session.share().isShared()); + assertTrue(session.share().isShared()); + assertEquals(1, mappings.get(), "A second click reuses the owned lease"); + session.client().destroy(); + assertTrue(session.client().waitFor(5, TimeUnit.SECONDS)); + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(10); + while ((!service.activeSessions().isEmpty() || session.server().isAlive()) && System.nanoTime() < deadline) Thread.sleep(50); + assertFalse(session.server().isAlive()); + assertTrue(service.activeSessions().isEmpty()); + assertEquals("graceful", new String(Files.readAllBytes(fixture.worlds.getDirectory(fixture.world.id).resolve("stopped.txt")), java.nio.charset.StandardCharsets.UTF_8)); + assertEquals(1, unmappings.get()); + session.close(); + assertEquals(1, unmappings.get()); + } + } + + @Test void refusesUnacceptedEulaBeforeAnyInstallOrNetwork() throws Exception { + Fixture fixture = fixture(false); + try (WorldService service = service(fixture, port -> { throw new AssertionError("No sharing expected"); }, + (p, d) -> { throw new AssertionError("Must not install before EULA acceptance"); }, realProbe(), Duration.ofSeconds(5))) { + assertTrue(assertThrows(IllegalStateException.class, () -> service.launch(fixture.world.id, false)).getMessage().contains("EULA")); + assertFalse(Files.exists(fixture.worlds.getDirectory(fixture.world.id).resolve("eula.txt"))); + } + } + + @Test void timeoutStopsTheRealChildAndDoesNotLaunchClient() throws Exception { + Fixture fixture = fixture(true); + AtomicReference server = new AtomicReference<>(); + try (WorldService service = new WorldService(fixture.profiles, fixture.worlds, fixtureInstaller(), + (p, h, n) -> { throw new AssertionError("Client must wait for readiness"); }, + port -> { throw new AssertionError("No router actions"); }, (host, port) -> false, + launch -> { Process process = process(launch); server.set(process); return process; }, Duration.ofMillis(700))) { + assertThrows(IOException.class, () -> service.launch(fixture.world.id, false)); + assertNotNull(server.get()); + assertFalse(server.get().isAlive()); + assertTrue(service.activeSessions().isEmpty()); + } + } + + @Test void sharingFailureLeavesLocalWorldAliveAndReturnsFallback() throws Exception { + Fixture fixture = fixture(true); + try (WorldService service = service(fixture, port -> { throw new IOException("No gateway"); }, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + WorldSession session = service.launch(fixture.world.id, true); + assertFalse(session.getShareResult().isShared()); + assertTrue(session.getShareResult().message.contains("TCP tunnel")); + assertTrue(session.server().isAlive()); + assertTrue(session.client().isAlive()); + } + } + + @Test void offlineWorldAllowsLocalJoinButNeverSharesUnauthenticatedServer() throws Exception { + Fixture fixture = fixture(true); + try (WorldService service = service(fixture, port -> { throw new AssertionError("Offline mode must not map a router"); }, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + WorldSession session = service.launch(fixture.world.id, true, false); + Properties properties = new Properties(); + try (java.io.InputStream input = Files.newInputStream(fixture.worlds.getDirectory(fixture.world.id).resolve("server.properties"))) { properties.load(input); } + assertEquals("false", properties.getProperty("online-mode")); + assertEquals("127.0.0.1", properties.getProperty("server-ip")); + assertFalse(session.getShareResult().isShared()); + assertTrue(session.share().message.contains("licensed Microsoft account")); + assertTrue(session.server().isAlive()); + } + } + + @Test void clientLaunchFailureStillStopsServerAndReleasesWorldLease() throws Exception { + Fixture fixture = fixture(true); + AtomicReference server = new AtomicReference<>(); + try (WorldService service = new WorldService(fixture.profiles, fixture.worlds, fixtureInstaller(), + (p, h, n) -> { throw new IOException("Client fixture failure"); }, port -> { throw new AssertionError(); }, realProbe(), + launch -> { Process result = process(launch); server.set(result); return result; }, Duration.ofSeconds(10))) { + assertThrows(IOException.class, () -> service.launch(fixture.world.id, false)); + assertFalse(server.get().isAlive()); + try (ProfileLease ignored = new ProfileLease(fixture.worlds.getDirectory(fixture.world.id))) { assertTrue(true); } + } + } + + @Test void disabledSharingMakesNoRouterRequestAndUsesPreferredPort() throws Exception { + Fixture fixture = fixture(true); + int preferred; + try (ServerSocket free = new ServerSocket(0, 1, InetAddress.getByName("127.0.0.1"))) { preferred = free.getLocalPort(); } + try (WorldService service = service(fixture, port -> { throw new AssertionError("Settings prohibit router requests"); }, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + service.setPreferredPort(preferred); + service.setSharingEnabled(false); + WorldSession session = service.launch(fixture.world.id, true); + assertEquals(preferred, session.getPort()); + assertFalse(session.getShareResult().isShared()); + assertTrue(service.shareWorld(fixture.world.id).message.contains("disabled in Settings")); + service.setPreferredPort(preferred == 65535 ? 25565 : preferred + 1); + assertEquals(preferred, session.getPort(), "Settings do not change an active world's port"); + } + } + + @Test void busyPreferredPortFallsBackAndDisablingSettingsReleasesExistingShare() throws Exception { + Fixture fixture = fixture(true); + AtomicInteger removed = new AtomicInteger(); + SharingService sharing = port -> new SharingService.Lease() { + public String address() { return "203.0.113.10:25565"; } + public void close() { removed.incrementAndGet(); } + }; + try (ServerSocket busy = new ServerSocket(0, 1, InetAddress.getByName("127.0.0.1")); + WorldService service = service(fixture, sharing, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + service.setPreferredPort(busy.getLocalPort()); + WorldSession session = service.launch(fixture.world.id, true); + assertNotEquals(busy.getLocalPort(), session.getPort()); + assertTrue(session.getShareResult().isShared()); + service.setSharingEnabled(false); + assertEquals(1, removed.get()); + assertFalse(session.share().isShared()); + assertTrue(session.server().isAlive()); + } + assertEquals(1, removed.get(), "Closing the world must not delete an already-removed mapping again"); + } + + private Fixture fixture(boolean eula) throws Exception { + ProfileStore profiles = new ProfileStore(temporary.resolve("profiles")); + Profile server = profiles.create("Server", "1.20.4", "PAPER", ProfileType.PLUGINS); + Profile client = profiles.create("Client", "1.20.4", "VANILLA", ProfileType.MODS); + WorldStore worlds = new WorldStore(temporary.resolve("worlds")); + return new Fixture(profiles, worlds, worlds.create("Local fixture", server.id, client.id, eula)); + } + private WorldService service(Fixture fixture, SharingService sharing, ServerInstaller installer, WorldService.Probe probe, Duration timeout) { + return new WorldService(fixture.profiles, fixture.worlds, installer, + (profile, host, port) -> new ProcessBuilder(command("client")).start(), sharing, probe, WorldServiceTest::process, timeout); + } + private ServerInstaller fixtureInstaller() { return (profile, directory) -> new ServerLaunch(command("server"), directory); } + private WorldService.Probe realProbe() { return (host, port) -> new MineStat(host, port, 1, MineStat.Request.JSON).isServerUp(); } + private static Process process(ServerLaunch launch) throws IOException { + return new ProcessBuilder(launch.command).directory(launch.directory.toFile()).redirectErrorStream(true) + .redirectOutput(launch.directory.resolve("fixture.log").toFile()).start(); + } + private static List command(String mode) { + String java = Paths.get(System.getProperty("java.home"), "bin", System.getProperty("os.name").startsWith("Windows") ? "java.exe" : "java").toString(); + try { + String classes = Paths.get(WorldFixtureProcess.class.getProtectionDomain().getCodeSource().getLocation().toURI()).toString(); + return Arrays.asList(java, "-cp", classes, WorldFixtureProcess.class.getName(), mode); + } catch (Exception e) { throw new IllegalStateException(e); } + } + private static final class Fixture { + final ProfileStore profiles; final WorldStore worlds; final VirtualWorld world; + Fixture(ProfileStore profiles, WorldStore worlds, VirtualWorld world) { this.profiles = profiles; this.worlds = worlds; this.world = world; } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/WorldStoreTest.java b/src/test/java/com/osiris/autoplug/client/worlds/WorldStoreTest.java new file mode 100644 index 00000000..4b626bea --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/WorldStoreTest.java @@ -0,0 +1,31 @@ +package com.osiris.autoplug.client.worlds; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import static org.junit.jupiter.api.Assertions.*; + +class WorldStoreTest { + @TempDir Path temporary; + @Test void roundTripsSeparateWorldDirectoriesAndExplicitEula() throws Exception { + WorldStore store = new WorldStore(temporary); + VirtualWorld first = store.create("First", "shared-server", "client"); + VirtualWorld second = store.create("Second", "shared-server", "client"); + assertNotEquals(store.getDirectory(first.id), store.getDirectory(second.id)); + assertFalse(new WorldStore(temporary).get(first.id).eulaAccepted); + store.setEulaAccepted(first.id, true); + assertTrue(store.get(first.id).eulaAccepted); + assertFalse(store.get(second.id).eulaAccepted); + assertEquals(2, store.list().size()); + Files.write(store.getDirectory(first.id).resolve("server-icon.png"), new byte[]{1}); + assertNotNull(store.get(first.id).thumbnail); + store.delete(first.id); + assertEquals(1, store.list().size()); + assertTrue(Files.exists(temporary.resolve(".trash")), "Deletion keeps saves recoverable"); + } + @Test void rejectsPathsOutsideStore() throws Exception { + WorldStore store = new WorldStore(temporary); + assertThrows(IllegalArgumentException.class, () -> store.getDirectory("../escape")); + assertThrows(IllegalArgumentException.class, () -> store.delete("..")); + } +} diff --git a/src/test/resources/launcher/1.16.5.json b/src/test/resources/launcher/1.16.5.json new file mode 100644 index 00000000..31b3b015 --- /dev/null +++ b/src/test/resources/launcher/1.16.5.json @@ -0,0 +1 @@ +{"arguments": {"game": ["--username", "${auth_player_name}", "--version", "${version_name}", "--gameDir", "${game_directory}", "--assetsDir", "${assets_root}", "--assetIndex", "${assets_index_name}", "--uuid", "${auth_uuid}", "--accessToken", "${auth_access_token}", "--userType", "${user_type}", "--versionType", "${version_type}", {"rules": [{"action": "allow", "features": {"is_demo_user": true}}], "value": "--demo"}, {"rules": [{"action": "allow", "features": {"has_custom_resolution": true}}], "value": ["--width", "${resolution_width}", "--height", "${resolution_height}"]}], "jvm": [{"rules": [{"action": "allow", "os": {"name": "osx"}}], "value": ["-XstartOnFirstThread"]}, {"rules": [{"action": "allow", "os": {"name": "windows"}}], "value": "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump"}, {"rules": [{"action": "allow", "os": {"name": "windows", "version": "^10\\."}}], "value": ["-Dos.name=Windows 10", "-Dos.version=10.0"]}, {"rules": [{"action": "allow", "os": {"arch": "x86"}}], "value": "-Xss1M"}, "-Djava.library.path=${natives_directory}", "-Dminecraft.launcher.brand=${launcher_name}", "-Dminecraft.launcher.version=${launcher_version}", "-cp", "${classpath}"]}, "assetIndex": {"id": "1.16", "sha1": "f3c4aa96e12951cd2781b3e1c0e8ab82bf719cf2", "size": 295227, "totalSize": 334438503, "url": "https://piston-meta.mojang.com/v1/packages/f3c4aa96e12951cd2781b3e1c0e8ab82bf719cf2/1.16.json"}, "assets": "1.16", "complianceLevel": 1, "downloads": {"client": {"sha1": "37fd3c903861eeff3bc24b71eed48f828b5269c8", "size": 17547153, "url": "https://piston-data.mojang.com/v1/objects/37fd3c903861eeff3bc24b71eed48f828b5269c8/client.jar"}, "client_mappings": {"sha1": "374c6b789574afbdc901371207155661e0509e17", "size": 5746047, "url": "https://piston-data.mojang.com/v1/objects/374c6b789574afbdc901371207155661e0509e17/client.txt"}, "server": {"sha1": "1b557e7b033b583cd9f66746b7a9ab1ec1673ced", "size": 37962360, "url": "https://piston-data.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar"}, "server_mappings": {"sha1": "41285beda6d251d190f2bf33beadd4fee187df7a", "size": 4400926, "url": "https://piston-data.mojang.com/v1/objects/41285beda6d251d190f2bf33beadd4fee187df7a/server.txt"}}, "id": "1.16.5", "javaVersion": {"component": "jre-legacy", "majorVersion": 8}, "libraries": [{"downloads": {"artifact": {"path": "com/mojang/patchy/1.3.9/patchy-1.3.9.jar", "sha1": "eb8bb7b66fa0e2152b1b40b3856e82f7619439ee", "size": 23581, "url": "https://libraries.minecraft.net/com/mojang/patchy/1.3.9/patchy-1.3.9.jar"}}, "name": "com.mojang:patchy:1.3.9"}, {"downloads": {"artifact": {"path": "oshi-project/oshi-core/1.1/oshi-core-1.1.jar", "sha1": "9ddf7b048a8d701be231c0f4f95fd986198fd2d8", "size": 30973, "url": "https://libraries.minecraft.net/oshi-project/oshi-core/1.1/oshi-core-1.1.jar"}}, "name": "oshi-project:oshi-core:1.1"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar", "sha1": "cb208278274bf12ebdb56c61bd7407e6f774d65a", "size": 1091208, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar"}}, "name": "net.java.dev.jna:jna:4.4.0"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar", "sha1": "e3f70017be8100d3d6923f50b3d2ee17714e9c13", "size": 913436, "url": "https://libraries.minecraft.net/net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar"}}, "name": "net.java.dev.jna:platform:3.4.0"}, {"downloads": {"artifact": {"path": "com/ibm/icu/icu4j/66.1/icu4j-66.1.jar", "sha1": "72c7519b6d91f7a1f993bd44a99fe95d67211b27", "size": 12935630, "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j/66.1/icu4j-66.1.jar"}}, "name": "com.ibm.icu:icu4j:66.1"}, {"downloads": {"artifact": {"path": "com/mojang/javabridge/1.0.22/javabridge-1.0.22.jar", "sha1": "6aa6453aa99a52a5cd91749da1af6ab70e082ab3", "size": 5111, "url": "https://libraries.minecraft.net/com/mojang/javabridge/1.0.22/javabridge-1.0.22.jar"}}, "name": "com.mojang:javabridge:1.0.22"}, {"downloads": {"artifact": {"path": "net/sf/jopt-simple/jopt-simple/5.0.3/jopt-simple-5.0.3.jar", "sha1": "cdd846cfc4e0f7eefafc02c0f5dce32b9303aa2a", "size": 78175, "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/5.0.3/jopt-simple-5.0.3.jar"}}, "name": "net.sf.jopt-simple:jopt-simple:5.0.3"}, {"downloads": {"artifact": {"path": "io/netty/netty-all/4.1.25.Final/netty-all-4.1.25.Final.jar", "sha1": "d0626cd3108294d1d58c05859add27b4ef21f83b", "size": 3823147, "url": "https://libraries.minecraft.net/io/netty/netty-all/4.1.25.Final/netty-all-4.1.25.Final.jar"}}, "name": "io.netty:netty-all:4.1.25.Final"}, {"downloads": {"artifact": {"path": "com/google/guava/guava/21.0/guava-21.0.jar", "sha1": "3a3d111be1be1b745edfa7d91678a12d7ed38709", "size": 2521113, "url": "https://libraries.minecraft.net/com/google/guava/guava/21.0/guava-21.0.jar"}}, "name": "com.google.guava:guava:21.0"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", "sha1": "6c6c702c89bfff3cd9e80b04d668c5e190d588c6", "size": 479881, "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar"}}, "name": "org.apache.commons:commons-lang3:3.5"}, {"downloads": {"artifact": {"path": "commons-io/commons-io/2.5/commons-io-2.5.jar", "sha1": "2852e6e05fbb95076fc091f6d1780f1f8fe35e0f", "size": 208700, "url": "https://libraries.minecraft.net/commons-io/commons-io/2.5/commons-io-2.5.jar"}}, "name": "commons-io:commons-io:2.5"}, {"downloads": {"artifact": {"path": "commons-codec/commons-codec/1.10/commons-codec-1.10.jar", "sha1": "4b95f4897fa13f2cd904aee711aeafc0c5295cd8", "size": 284184, "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.10/commons-codec-1.10.jar"}}, "name": "commons-codec:commons-codec:1.10"}, {"downloads": {"artifact": {"path": "net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar", "sha1": "39c7796b469a600f72380316f6b1f11db6c2c7c4", "size": 208338, "url": "https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"}}, "name": "net.java.jinput:jinput:2.0.5"}, {"downloads": {"artifact": {"path": "net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar", "sha1": "e12fe1fda814bd348c1579329c86943d2cd3c6a6", "size": 7508, "url": "https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar"}}, "name": "net.java.jutils:jutils:1.0.0"}, {"downloads": {"artifact": {"path": "com/mojang/brigadier/1.0.17/brigadier-1.0.17.jar", "sha1": "c6b7dc51dd44379cc751b7504816006e9be4b1e6", "size": 77392, "url": "https://libraries.minecraft.net/com/mojang/brigadier/1.0.17/brigadier-1.0.17.jar"}}, "name": "com.mojang:brigadier:1.0.17"}, {"downloads": {"artifact": {"path": "com/mojang/datafixerupper/4.0.26/datafixerupper-4.0.26.jar", "sha1": "ebd6690f33871ccee9b6132c6480668ee2e35020", "size": 673183, "url": "https://libraries.minecraft.net/com/mojang/datafixerupper/4.0.26/datafixerupper-4.0.26.jar"}}, "name": "com.mojang:datafixerupper:4.0.26"}, {"downloads": {"artifact": {"path": "com/google/code/gson/gson/2.8.0/gson-2.8.0.jar", "sha1": "c4ba5371a29ac9b2ad6129b1d39ea38750043eff", "size": 231952, "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar"}}, "name": "com.google.code.gson:gson:2.8.0"}, {"downloads": {"artifact": {"path": "com/mojang/authlib/2.1.28/authlib-2.1.28.jar", "sha1": "ad54da276bf59983d02d5ed16fc14541354c71fd", "size": 76328, "url": "https://libraries.minecraft.net/com/mojang/authlib/2.1.28/authlib-2.1.28.jar"}}, "name": "com.mojang:authlib:2.1.28"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar", "sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d", "size": 365552, "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"}}, "name": "org.apache.commons:commons-compress:1.8.1"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar", "sha1": "18f4247ff4572a074444572cee34647c43e7c9c7", "size": 589512, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"}}, "name": "org.apache.httpcomponents:httpclient:4.3.3"}, {"downloads": {"artifact": {"path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar", "sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f", "size": 62050, "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"}}, "name": "commons-logging:commons-logging:1.1.3"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar", "sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e", "size": 282269, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"}}, "name": "org.apache.httpcomponents:httpcore:4.3.2"}, {"downloads": {"artifact": {"path": "it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar", "sha1": "5ad88f325e424f8dbc2be5459e21ea5cab3864e9", "size": 18800417, "url": "https://libraries.minecraft.net/it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar"}}, "name": "it.unimi.dsi:fastutil:8.2.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-api/2.8.1/log4j-api-2.8.1.jar", "sha1": "e801d13612e22cad62a3f4f3fe7fdbe6334a8e72", "size": 228859, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.8.1/log4j-api-2.8.1.jar"}}, "name": "org.apache.logging.log4j:log4j-api:2.8.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-core/2.8.1/log4j-core-2.8.1.jar", "sha1": "4ac28ff2f1ddf05dae3043a190451e8c46b73c31", "size": 1402925, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.8.1/log4j-core-2.8.1.jar"}}, "name": "org.apache.logging.log4j:log4j-core:2.8.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar", "sha1": "2bb514e444994c6fece99a21f76e0c90438e377f", "size": 317748, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar", "sha1": "8ad6294407e15780b43e84929c40e4c5e997972e", "size": 321900, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar", "sha1": "7a0c583fcbec32b15784f846df536e1837d83666", "size": 38616, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar", "sha1": "ee8e57a79300f78294576d87c4a587f8c99402e2", "size": 34848, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar", "sha1": "dc7ff2dabb40a141ee9bf2e326d9b1b19f3278fb", "size": 80103, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar", "sha1": "2b772a102b0a11ee5f2109a5b136f4dc7c630827", "size": 80012, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar", "sha1": "57008c2374c5bc434b18adfef3f3653ee450ee18", "size": 931322, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar", "sha1": "6ac5bb88b44c43ea195a570aab059f63da004cd8", "size": 929780, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar", "sha1": "027abb7f64894b61cad163791acd8113f0b21296", "size": 116708, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar", "sha1": "d3ad4df38e400b8afba1de63f84338809399df5b", "size": 108907, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar", "sha1": "31f5eb5fce3791d58ec898bc5c1867d76d781ba1", "size": 105765, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar", "sha1": "3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f", "size": 104469, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar", "sha1": "259f1dbddb921e27e01b32458d6f584eb8bba13a", "size": 7088, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar", "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", "size": 7092, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar", "sha1": "2bb514e444994c6fece99a21f76e0c90438e377f", "size": 317748, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar", "sha1": "5a4c271d150906858d475603dcb9479453c60555", "size": 39835, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar", "sha1": "8ad6294407e15780b43e84929c40e4c5e997972e", "size": 321900, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-linux.jar", "sha1": "ae7976827ca2a3741f6b9a843a89bacd637af350", "size": 124776, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-windows.jar", "sha1": "05359f3aa50d36352815fc662ea73e1c00d22170", "size": 279593, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar", "sha1": "7a0c583fcbec32b15784f846df536e1837d83666", "size": 38616, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1-natives-macos.jar", "sha1": "439ab9d0264167a949cc7bcce673704322baaf50", "size": 117001, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar", "sha1": "ee8e57a79300f78294576d87c4a587f8c99402e2", "size": 34848, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-linux.jar", "sha1": "268c08a150347e04e44ba56e359d62c9b78669df", "size": 156173, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-windows.jar", "sha1": "338b25b99da3ba5f441f6492f2ce2a9c608860ed", "size": 220623, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar", "sha1": "dc7ff2dabb40a141ee9bf2e326d9b1b19f3278fb", "size": 80103, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1-natives-macos.jar", "sha1": "9357ebfc82a0d6f64e17093dd963219367cd6fa2", "size": 528004, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-openal:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar", "sha1": "2b772a102b0a11ee5f2109a5b136f4dc7c630827", "size": 80012, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-linux.jar", "sha1": "0364f9f5c3947393083ab5f37a571f5603aadd0b", "size": 590997, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-windows.jar", "sha1": "ec20a7d42a2438528fca87e60b1705f1e2339ddb", "size": 1310102, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-openal:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar", "sha1": "57008c2374c5bc434b18adfef3f3653ee450ee18", "size": 931322, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1-natives-macos.jar", "sha1": "dca9ad9e59a87172144d531e08ef7f6988073db0", "size": 38998, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-opengl:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar", "sha1": "6ac5bb88b44c43ea195a570aab059f63da004cd8", "size": 929780, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-linux.jar", "sha1": "338d33387919cb3f4cdba143c2b738a71ccfda60", "size": 77392, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-windows.jar", "sha1": "d8dcdc91066cae2d2d8279cb4a9f9f05d9525826", "size": 170798, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-opengl:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar", "sha1": "027abb7f64894b61cad163791acd8113f0b21296", "size": 116708, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1-natives-macos.jar", "sha1": "72fe6dab6110a5a1cd4833f11840eef7b2eadce5", "size": 64724, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-glfw:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar", "sha1": "d3ad4df38e400b8afba1de63f84338809399df5b", "size": 108907, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar", "sha1": "0957733f26a6661d4883da0335f7ef46d3bbbd7d", "size": 159198, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar", "sha1": "dc6826d636bf796b33a49038c354210e661bfc17", "size": 266648, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-glfw:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar", "sha1": "31f5eb5fce3791d58ec898bc5c1867d76d781ba1", "size": 105765, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1-natives-macos.jar", "sha1": "1f5615c952451c30afafba4a6e3ba4e1cd9e7f5c", "size": 192364, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-stb:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar", "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", "size": 7092, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar", "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687", "size": 38804, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar", "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f", "size": 208314, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar", "sha1": "259f1dbddb921e27e01b32458d6f584eb8bba13a", "size": 7088, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1-natives-macos.jar", "sha1": "759c2fd9cc5c6ce0b5b7af77ac8200483b7fb660", "size": 41962, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar", "sha1": "3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f", "size": 104469, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-linux.jar", "sha1": "172c52e586fecf43f759bc4f70a778c01f6fdcc1", "size": 203476, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-windows.jar", "sha1": "811f705cbb29e8ae8d60bdf8fdd38c0c123ad3ef", "size": 465810, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-stb:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar", "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", "size": 13164, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar"}}, "name": "com.mojang:text2speech:1.11.3"}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar", "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", "size": 13164, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar"}, "classifiers": {"natives-linux": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-linux.jar", "sha1": "ac641755a2a841d1fca9e660194f42523ee5cfe0", "size": 7833, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-linux.jar"}, "natives-windows": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-windows.jar", "sha1": "c0b242c0091be5acbf303263c7eeeaedd70544c7", "size": 81379, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-windows.jar"}}}, "extract": {"exclude": ["META-INF/"]}, "name": "com.mojang:text2speech:1.11.3", "natives": {"linux": "natives-linux", "windows": "natives-windows"}}, {"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar", "sha1": "6ef160c3133a78de015830860197602ca1c855d3", "size": 40502, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar"}, "classifiers": {"natives-osx": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0-natives-osx.jar", "sha1": "08befab4894d55875f33c3d300f4f71e6e828f64", "size": 5629, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0-natives-osx.jar"}}}, "extract": {"exclude": ["META-INF/"]}, "name": "ca.weblite:java-objc-bridge:1.0.0", "natives": {"osx": "natives-osx"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar", "sha1": "6ef160c3133a78de015830860197602ca1c855d3", "size": 40502, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar"}}, "name": "ca.weblite:java-objc-bridge:1.0.0", "rules": [{"action": "allow", "os": {"name": "osx"}}]}], "logging": {"client": {"argument": "-Dlog4j.configurationFile=${path}", "file": {"id": "client-1.12.xml", "sha1": "bd65e7d2e3c237be76cfbef4c2405033d7f91521", "size": 888, "url": "https://piston-data.mojang.com/v1/objects/bd65e7d2e3c237be76cfbef4c2405033d7f91521/client-1.12.xml"}, "type": "log4j2-xml"}}, "mainClass": "net.minecraft.client.main.Main", "minimumLauncherVersion": 21, "releaseTime": "2021-01-14T16:05:32+00:00", "time": "2021-01-14T16:05:32+00:00", "type": "release"} \ No newline at end of file diff --git a/src/test/resources/launcher/1.17.1.json b/src/test/resources/launcher/1.17.1.json new file mode 100644 index 00000000..e1df9cf9 --- /dev/null +++ b/src/test/resources/launcher/1.17.1.json @@ -0,0 +1 @@ +{"arguments": {"game": ["--username", "${auth_player_name}", "--version", "${version_name}", "--gameDir", "${game_directory}", "--assetsDir", "${assets_root}", "--assetIndex", "${assets_index_name}", "--uuid", "${auth_uuid}", "--accessToken", "${auth_access_token}", "--userType", "${user_type}", "--versionType", "${version_type}", {"rules": [{"action": "allow", "features": {"is_demo_user": true}}], "value": "--demo"}, {"rules": [{"action": "allow", "features": {"has_custom_resolution": true}}], "value": ["--width", "${resolution_width}", "--height", "${resolution_height}"]}], "jvm": [{"rules": [{"action": "allow", "os": {"name": "osx"}}], "value": ["-XstartOnFirstThread"]}, {"rules": [{"action": "allow", "os": {"name": "windows"}}], "value": "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump"}, {"rules": [{"action": "allow", "os": {"name": "windows", "version": "^10\\."}}], "value": ["-Dos.name=Windows 10", "-Dos.version=10.0"]}, {"rules": [{"action": "allow", "os": {"arch": "x86"}}], "value": "-Xss1M"}, "-Djava.library.path=${natives_directory}", "-Dminecraft.launcher.brand=${launcher_name}", "-Dminecraft.launcher.version=${launcher_version}", "-cp", "${classpath}"]}, "assetIndex": {"id": "1.17", "sha1": "f425401a00adf0112fde624ee80c66333530f8a1", "size": 346398, "totalSize": 348383264, "url": "https://piston-meta.mojang.com/v1/packages/f425401a00adf0112fde624ee80c66333530f8a1/1.17.json"}, "assets": "1.17", "complianceLevel": 1, "downloads": {"client": {"sha1": "8d9b65467c7913fcf6f5b2e729d44a1e00fde150", "size": 19546842, "url": "https://piston-data.mojang.com/v1/objects/8d9b65467c7913fcf6f5b2e729d44a1e00fde150/client.jar"}, "client_mappings": {"sha1": "e4d540e0cba05a6097e885dffdf363e621f87d3f", "size": 6437531, "url": "https://piston-data.mojang.com/v1/objects/e4d540e0cba05a6097e885dffdf363e621f87d3f/client.txt"}, "server": {"sha1": "a16d67e5807f57fc4e550299cf20226194497dc2", "size": 43626592, "url": "https://piston-data.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar"}, "server_mappings": {"sha1": "f6cae1c5c1255f68ba4834b16a0da6a09621fe13", "size": 4953452, "url": "https://piston-data.mojang.com/v1/objects/f6cae1c5c1255f68ba4834b16a0da6a09621fe13/server.txt"}}, "id": "1.17.1", "javaVersion": {"component": "java-runtime-alpha", "majorVersion": 16}, "libraries": [{"downloads": {"artifact": {"path": "com/mojang/blocklist/1.0.5/blocklist-1.0.5.jar", "sha1": "9da540f21c9a8d5ed7c029e1f88d1a6dabb0d6ad", "size": 964, "url": "https://libraries.minecraft.net/com/mojang/blocklist/1.0.5/blocklist-1.0.5.jar"}}, "name": "com.mojang:blocklist:1.0.5"}, {"downloads": {"artifact": {"path": "com/mojang/patchy/2.1.6/patchy-2.1.6.jar", "sha1": "ce112c16c6275fdfff2d30208533ec906a191f71", "size": 10090, "url": "https://libraries.minecraft.net/com/mojang/patchy/2.1.6/patchy-2.1.6.jar"}}, "name": "com.mojang:patchy:2.1.6"}, {"downloads": {"artifact": {"path": "com/github/oshi/oshi-core/5.7.5/oshi-core-5.7.5.jar", "sha1": "725374463734aacde70a3b20f018aca3f922655f", "size": 835738, "url": "https://libraries.minecraft.net/com/github/oshi/oshi-core/5.7.5/oshi-core-5.7.5.jar"}}, "name": "com.github.oshi:oshi-core:5.7.5"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar", "sha1": "3551d8d827e54858214107541d3aff9c615cb615", "size": 1729586, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar"}}, "name": "net.java.dev.jna:jna:5.8.0"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna-platform/5.8.0/jna-platform-5.8.0.jar", "sha1": "2f12f6d7f7652270d13624cef1b82d8cd9a5398e", "size": 1338206, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna-platform/5.8.0/jna-platform-5.8.0.jar"}}, "name": "net.java.dev.jna:jna-platform:5.8.0"}, {"downloads": {"artifact": {"path": "org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar", "sha1": "83b0359d847ee053d745be7ec0d8e9e8a44304b4", "size": 44213, "url": "https://libraries.minecraft.net/org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar"}}, "name": "org.slf4j:slf4j-api:1.8.0-beta4"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-slf4j18-impl/2.14.1/log4j-slf4j18-impl-2.14.1.jar", "sha1": "312b4d91b21160b9fab43600fa787f31e8cab930", "size": 20688, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-slf4j18-impl/2.14.1/log4j-slf4j18-impl-2.14.1.jar"}}, "name": "org.apache.logging.log4j:log4j-slf4j18-impl:2.14.1"}, {"downloads": {"artifact": {"path": "com/ibm/icu/icu4j/66.1/icu4j-66.1.jar", "sha1": "72c7519b6d91f7a1f993bd44a99fe95d67211b27", "size": 12935630, "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j/66.1/icu4j-66.1.jar"}}, "name": "com.ibm.icu:icu4j:66.1"}, {"downloads": {"artifact": {"path": "com/mojang/javabridge/1.1.23/javabridge-1.1.23.jar", "sha1": "3e5084d916ba393dfd82928ec97663aeb10b2e2c", "size": 6014, "url": "https://libraries.minecraft.net/com/mojang/javabridge/1.1.23/javabridge-1.1.23.jar"}}, "name": "com.mojang:javabridge:1.1.23"}, {"downloads": {"artifact": {"path": "net/sf/jopt-simple/jopt-simple/5.0.3/jopt-simple-5.0.3.jar", "sha1": "cdd846cfc4e0f7eefafc02c0f5dce32b9303aa2a", "size": 78175, "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/5.0.3/jopt-simple-5.0.3.jar"}}, "name": "net.sf.jopt-simple:jopt-simple:5.0.3"}, {"downloads": {"artifact": {"path": "io/netty/netty-all/4.1.25.Final/netty-all-4.1.25.Final.jar", "sha1": "d0626cd3108294d1d58c05859add27b4ef21f83b", "size": 3823147, "url": "https://libraries.minecraft.net/io/netty/netty-all/4.1.25.Final/netty-all-4.1.25.Final.jar"}}, "name": "io.netty:netty-all:4.1.25.Final"}, {"downloads": {"artifact": {"path": "com/google/guava/guava/21.0/guava-21.0.jar", "sha1": "3a3d111be1be1b745edfa7d91678a12d7ed38709", "size": 2521113, "url": "https://libraries.minecraft.net/com/google/guava/guava/21.0/guava-21.0.jar"}}, "name": "com.google.guava:guava:21.0"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar", "sha1": "6c6c702c89bfff3cd9e80b04d668c5e190d588c6", "size": 479881, "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar"}}, "name": "org.apache.commons:commons-lang3:3.5"}, {"downloads": {"artifact": {"path": "commons-io/commons-io/2.5/commons-io-2.5.jar", "sha1": "2852e6e05fbb95076fc091f6d1780f1f8fe35e0f", "size": 208700, "url": "https://libraries.minecraft.net/commons-io/commons-io/2.5/commons-io-2.5.jar"}}, "name": "commons-io:commons-io:2.5"}, {"downloads": {"artifact": {"path": "commons-codec/commons-codec/1.10/commons-codec-1.10.jar", "sha1": "4b95f4897fa13f2cd904aee711aeafc0c5295cd8", "size": 284184, "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.10/commons-codec-1.10.jar"}}, "name": "commons-codec:commons-codec:1.10"}, {"downloads": {"artifact": {"path": "net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar", "sha1": "39c7796b469a600f72380316f6b1f11db6c2c7c4", "size": 208338, "url": "https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"}}, "name": "net.java.jinput:jinput:2.0.5"}, {"downloads": {"artifact": {"path": "net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar", "sha1": "e12fe1fda814bd348c1579329c86943d2cd3c6a6", "size": 7508, "url": "https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar"}}, "name": "net.java.jutils:jutils:1.0.0"}, {"downloads": {"artifact": {"path": "com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar", "sha1": "c1ef1234282716483c92183f49bef47b1a89bfa9", "size": 77116, "url": "https://libraries.minecraft.net/com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar"}}, "name": "com.mojang:brigadier:1.0.18"}, {"downloads": {"artifact": {"path": "com/mojang/datafixerupper/4.0.26/datafixerupper-4.0.26.jar", "sha1": "ebd6690f33871ccee9b6132c6480668ee2e35020", "size": 673183, "url": "https://libraries.minecraft.net/com/mojang/datafixerupper/4.0.26/datafixerupper-4.0.26.jar"}}, "name": "com.mojang:datafixerupper:4.0.26"}, {"downloads": {"artifact": {"path": "com/google/code/gson/gson/2.8.0/gson-2.8.0.jar", "sha1": "c4ba5371a29ac9b2ad6129b1d39ea38750043eff", "size": 231952, "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar"}}, "name": "com.google.code.gson:gson:2.8.0"}, {"downloads": {"artifact": {"path": "com/mojang/authlib/2.3.31/authlib-2.3.31.jar", "sha1": "bbd00ca33b052f73a6312254780fc580d2da3535", "size": 87662, "url": "https://libraries.minecraft.net/com/mojang/authlib/2.3.31/authlib-2.3.31.jar"}}, "name": "com.mojang:authlib:2.3.31"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar", "sha1": "a698750c16740fd5b3871425f4cb3bbaa87f529d", "size": 365552, "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar"}}, "name": "org.apache.commons:commons-compress:1.8.1"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar", "sha1": "18f4247ff4572a074444572cee34647c43e7c9c7", "size": 589512, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar"}}, "name": "org.apache.httpcomponents:httpclient:4.3.3"}, {"downloads": {"artifact": {"path": "commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar", "sha1": "f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f", "size": 62050, "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"}}, "name": "commons-logging:commons-logging:1.1.3"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar", "sha1": "31fbbff1ddbf98f3aa7377c94d33b0447c646b6e", "size": 282269, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar"}}, "name": "org.apache.httpcomponents:httpcore:4.3.2"}, {"downloads": {"artifact": {"path": "it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar", "sha1": "5ad88f325e424f8dbc2be5459e21ea5cab3864e9", "size": 18800417, "url": "https://libraries.minecraft.net/it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar"}}, "name": "it.unimi.dsi:fastutil:8.2.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar", "sha1": "cd8858fbbde69f46bce8db1152c18a43328aae78", "size": 300365, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar"}}, "name": "org.apache.logging.log4j:log4j-api:2.14.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-core/2.14.1/log4j-core-2.14.1.jar", "sha1": "9141212b8507ab50a45525b545b39d224614528b", "size": 1745700, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.14.1/log4j-core-2.14.1.jar"}}, "name": "org.apache.logging.log4j:log4j-core:2.14.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar", "sha1": "2bb514e444994c6fece99a21f76e0c90438e377f", "size": 317748, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar", "sha1": "8ad6294407e15780b43e84929c40e4c5e997972e", "size": 321900, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar", "sha1": "7a0c583fcbec32b15784f846df536e1837d83666", "size": 38616, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar", "sha1": "ee8e57a79300f78294576d87c4a587f8c99402e2", "size": 34848, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar", "sha1": "dc7ff2dabb40a141ee9bf2e326d9b1b19f3278fb", "size": 80103, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar", "sha1": "2b772a102b0a11ee5f2109a5b136f4dc7c630827", "size": 80012, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar", "sha1": "57008c2374c5bc434b18adfef3f3653ee450ee18", "size": 931322, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar", "sha1": "6ac5bb88b44c43ea195a570aab059f63da004cd8", "size": 929780, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar", "sha1": "027abb7f64894b61cad163791acd8113f0b21296", "size": 116708, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar", "sha1": "d3ad4df38e400b8afba1de63f84338809399df5b", "size": 108907, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar", "sha1": "31f5eb5fce3791d58ec898bc5c1867d76d781ba1", "size": 105765, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar", "sha1": "3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f", "size": 104469, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar", "sha1": "259f1dbddb921e27e01b32458d6f584eb8bba13a", "size": 7088, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar", "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", "size": 7092, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar", "sha1": "2bb514e444994c6fece99a21f76e0c90438e377f", "size": 317748, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar", "sha1": "5a4c271d150906858d475603dcb9479453c60555", "size": 39835, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.1/lwjgl-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar", "sha1": "8ad6294407e15780b43e84929c40e4c5e997972e", "size": 321900, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-linux.jar", "sha1": "ae7976827ca2a3741f6b9a843a89bacd637af350", "size": 124776, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-windows.jar", "sha1": "05359f3aa50d36352815fc662ea73e1c00d22170", "size": 279593, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.2.2/lwjgl-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar", "sha1": "7a0c583fcbec32b15784f846df536e1837d83666", "size": 38616, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1-natives-macos.jar", "sha1": "439ab9d0264167a949cc7bcce673704322baaf50", "size": 117001, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.1/lwjgl-jemalloc-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar", "sha1": "ee8e57a79300f78294576d87c4a587f8c99402e2", "size": 34848, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-linux.jar", "sha1": "268c08a150347e04e44ba56e359d62c9b78669df", "size": 156173, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-windows.jar", "sha1": "338b25b99da3ba5f441f6492f2ce2a9c608860ed", "size": 220623, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.2.2/lwjgl-jemalloc-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-jemalloc:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar", "sha1": "dc7ff2dabb40a141ee9bf2e326d9b1b19f3278fb", "size": 80103, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1-natives-macos.jar", "sha1": "9357ebfc82a0d6f64e17093dd963219367cd6fa2", "size": 528004, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.1/lwjgl-openal-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-openal:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar", "sha1": "2b772a102b0a11ee5f2109a5b136f4dc7c630827", "size": 80012, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-linux.jar", "sha1": "0364f9f5c3947393083ab5f37a571f5603aadd0b", "size": 590997, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-windows.jar", "sha1": "ec20a7d42a2438528fca87e60b1705f1e2339ddb", "size": 1310102, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.2.2/lwjgl-openal-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-openal:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar", "sha1": "57008c2374c5bc434b18adfef3f3653ee450ee18", "size": 931322, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1-natives-macos.jar", "sha1": "dca9ad9e59a87172144d531e08ef7f6988073db0", "size": 38998, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.1/lwjgl-opengl-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-opengl:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar", "sha1": "6ac5bb88b44c43ea195a570aab059f63da004cd8", "size": 929780, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-linux.jar", "sha1": "338d33387919cb3f4cdba143c2b738a71ccfda60", "size": 77392, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-windows.jar", "sha1": "d8dcdc91066cae2d2d8279cb4a9f9f05d9525826", "size": 170798, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.2.2/lwjgl-opengl-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-opengl:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar", "sha1": "027abb7f64894b61cad163791acd8113f0b21296", "size": 116708, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1-natives-macos.jar", "sha1": "72fe6dab6110a5a1cd4833f11840eef7b2eadce5", "size": 64724, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.1/lwjgl-glfw-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-glfw:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar", "sha1": "d3ad4df38e400b8afba1de63f84338809399df5b", "size": 108907, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar", "sha1": "0957733f26a6661d4883da0335f7ef46d3bbbd7d", "size": 159198, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar", "sha1": "dc6826d636bf796b33a49038c354210e661bfc17", "size": 266648, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.2.2/lwjgl-glfw-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-glfw:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar", "sha1": "31f5eb5fce3791d58ec898bc5c1867d76d781ba1", "size": 105765, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1-natives-macos.jar", "sha1": "1f5615c952451c30afafba4a6e3ba4e1cd9e7f5c", "size": 192364, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.1/lwjgl-stb-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-stb:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar", "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", "size": 7092, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar", "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687", "size": 38804, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar", "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f", "size": 208314, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar", "sha1": "259f1dbddb921e27e01b32458d6f584eb8bba13a", "size": 7088, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1.jar"}, "classifiers": {"natives-macos": {"path": "org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1-natives-macos.jar", "sha1": "759c2fd9cc5c6ce0b5b7af77ac8200483b7fb660", "size": 41962, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.1/lwjgl-tinyfd-3.2.1-natives-macos.jar"}}}, "name": "org.lwjgl:lwjgl-tinyfd:3.2.1", "natives": {"osx": "natives-macos"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar", "sha1": "3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f", "size": 104469, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2.jar"}, "classifiers": {"natives-linux": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-linux.jar", "sha1": "172c52e586fecf43f759bc4f70a778c01f6fdcc1", "size": 203476, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-linux.jar"}, "natives-windows": {"path": "org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-windows.jar", "sha1": "811f705cbb29e8ae8d60bdf8fdd38c0c123ad3ef", "size": 465810, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.2.2/lwjgl-stb-3.2.2-natives-windows.jar"}}}, "name": "org.lwjgl:lwjgl-stb:3.2.2", "natives": {"linux": "natives-linux", "windows": "natives-windows"}, "rules": [{"action": "allow"}, {"action": "disallow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar", "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", "size": 13164, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar"}}, "name": "com.mojang:text2speech:1.11.3"}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar", "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", "size": 13164, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar"}, "classifiers": {"natives-linux": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-linux.jar", "sha1": "ac641755a2a841d1fca9e660194f42523ee5cfe0", "size": 7833, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-linux.jar"}, "natives-windows": {"path": "com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-windows.jar", "sha1": "c0b242c0091be5acbf303263c7eeeaedd70544c7", "size": 81379, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3-natives-windows.jar"}}}, "extract": {"exclude": ["META-INF/"]}, "name": "com.mojang:text2speech:1.11.3", "natives": {"linux": "natives-linux", "windows": "natives-windows"}}, {"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar", "sha1": "6ef160c3133a78de015830860197602ca1c855d3", "size": 40502, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar"}, "classifiers": {"natives-osx": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0-natives-osx.jar", "sha1": "08befab4894d55875f33c3d300f4f71e6e828f64", "size": 5629, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0-natives-osx.jar"}}}, "extract": {"exclude": ["META-INF/"]}, "name": "ca.weblite:java-objc-bridge:1.0.0", "natives": {"osx": "natives-osx"}, "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar", "sha1": "6ef160c3133a78de015830860197602ca1c855d3", "size": 40502, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.0.0/java-objc-bridge-1.0.0.jar"}}, "name": "ca.weblite:java-objc-bridge:1.0.0", "rules": [{"action": "allow", "os": {"name": "osx"}}]}], "logging": {"client": {"argument": "-Dlog4j.configurationFile=${path}", "file": {"id": "client-1.12.xml", "sha1": "bd65e7d2e3c237be76cfbef4c2405033d7f91521", "size": 888, "url": "https://piston-data.mojang.com/v1/objects/bd65e7d2e3c237be76cfbef4c2405033d7f91521/client-1.12.xml"}, "type": "log4j2-xml"}}, "mainClass": "net.minecraft.client.main.Main", "minimumLauncherVersion": 21, "releaseTime": "2021-07-06T12:01:34+00:00", "time": "2021-07-06T12:01:34+00:00", "type": "release"} \ No newline at end of file diff --git a/src/test/resources/launcher/1.20.1.json b/src/test/resources/launcher/1.20.1.json new file mode 100644 index 00000000..3f47dcb4 --- /dev/null +++ b/src/test/resources/launcher/1.20.1.json @@ -0,0 +1 @@ +{"arguments": {"game": ["--username", "${auth_player_name}", "--version", "${version_name}", "--gameDir", "${game_directory}", "--assetsDir", "${assets_root}", "--assetIndex", "${assets_index_name}", "--uuid", "${auth_uuid}", "--accessToken", "${auth_access_token}", "--clientId", "${clientid}", "--xuid", "${auth_xuid}", "--userType", "${user_type}", "--versionType", "${version_type}", {"rules": [{"action": "allow", "features": {"is_demo_user": true}}], "value": "--demo"}, {"rules": [{"action": "allow", "features": {"has_custom_resolution": true}}], "value": ["--width", "${resolution_width}", "--height", "${resolution_height}"]}, {"rules": [{"action": "allow", "features": {"has_quick_plays_support": true}}], "value": ["--quickPlayPath", "${quickPlayPath}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_singleplayer": true}}], "value": ["--quickPlaySingleplayer", "${quickPlaySingleplayer}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_multiplayer": true}}], "value": ["--quickPlayMultiplayer", "${quickPlayMultiplayer}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_realms": true}}], "value": ["--quickPlayRealms", "${quickPlayRealms}"]}], "jvm": [{"rules": [{"action": "allow", "os": {"name": "osx"}}], "value": ["-XstartOnFirstThread"]}, {"rules": [{"action": "allow", "os": {"name": "windows"}}], "value": "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump"}, {"rules": [{"action": "allow", "os": {"arch": "x86"}}], "value": "-Xss1M"}, "-Djava.library.path=${natives_directory}", "-Djna.tmpdir=${natives_directory}", "-Dorg.lwjgl.system.SharedLibraryExtractPath=${natives_directory}", "-Dio.netty.native.workdir=${natives_directory}", "-Dminecraft.launcher.brand=${launcher_name}", "-Dminecraft.launcher.version=${launcher_version}", "-cp", "${classpath}"]}, "assetIndex": {"id": "5", "sha1": "3d1e8e9cad62f188270564f4bdfd3a79df9be65a", "size": 413067, "totalSize": 650617398, "url": "https://piston-meta.mojang.com/v1/packages/3d1e8e9cad62f188270564f4bdfd3a79df9be65a/5.json"}, "assets": "5", "complianceLevel": 1, "downloads": {"client": {"sha1": "0c3ec587af28e5a785c0b4a7b8a30f9a8f78f838", "size": 23028853, "url": "https://piston-data.mojang.com/v1/objects/0c3ec587af28e5a785c0b4a7b8a30f9a8f78f838/client.jar"}, "client_mappings": {"sha1": "6c48521eed01fe2e8ecdadbd5ae348415f3c47da", "size": 8001795, "url": "https://piston-data.mojang.com/v1/objects/6c48521eed01fe2e8ecdadbd5ae348415f3c47da/client.txt"}, "server": {"sha1": "84194a2f286ef7c14ed7ce0090dba59902951553", "size": 47791053, "url": "https://piston-data.mojang.com/v1/objects/84194a2f286ef7c14ed7ce0090dba59902951553/server.jar"}, "server_mappings": {"sha1": "0b4dba049482496c507b2387a73a913230ebbd76", "size": 6154195, "url": "https://piston-data.mojang.com/v1/objects/0b4dba049482496c507b2387a73a913230ebbd76/server.txt"}}, "id": "1.20.1", "javaVersion": {"component": "java-runtime-gamma", "majorVersion": 17}, "libraries": [{"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.1/java-objc-bridge-1.1.jar", "sha1": "1227f9e0666314f9de41477e3ec277e542ed7f7b", "size": 1330045, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.1/java-objc-bridge-1.1.jar"}}, "name": "ca.weblite:java-objc-bridge:1.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "com/github/oshi/oshi-core/6.2.2/oshi-core-6.2.2.jar", "sha1": "54f5efc19bca95d709d9a37d19ffcbba3d21c1a6", "size": 947865, "url": "https://libraries.minecraft.net/com/github/oshi/oshi-core/6.2.2/oshi-core-6.2.2.jar"}}, "name": "com.github.oshi:oshi-core:6.2.2"}, {"downloads": {"artifact": {"path": "com/google/code/gson/gson/2.10/gson-2.10.jar", "sha1": "dd9b193aef96e973d5a11ab13cd17430c2e4306b", "size": 286235, "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.10/gson-2.10.jar"}}, "name": "com.google.code.gson:gson:2.10"}, {"downloads": {"artifact": {"path": "com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", "sha1": "1dcf1de382a0bf95a3d8b0849546c88bac1292c9", "size": 4617, "url": "https://libraries.minecraft.net/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"}}, "name": "com.google.guava:failureaccess:1.0.1"}, {"downloads": {"artifact": {"path": "com/google/guava/guava/31.1-jre/guava-31.1-jre.jar", "sha1": "60458f877d055d0c9114d9e1a2efb737b4bc282c", "size": 2959479, "url": "https://libraries.minecraft.net/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar"}}, "name": "com.google.guava:guava:31.1-jre"}, {"downloads": {"artifact": {"path": "com/ibm/icu/icu4j/71.1/icu4j-71.1.jar", "sha1": "9e7d3304c23f9ba5cb71915f7cce23231a57a445", "size": 13963762, "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j/71.1/icu4j-71.1.jar"}}, "name": "com.ibm.icu:icu4j:71.1"}, {"downloads": {"artifact": {"path": "com/mojang/authlib/4.0.43/authlib-4.0.43.jar", "sha1": "2ff9d747a77570a07a60d32ac77eb6162ad2a2d9", "size": 121766, "url": "https://libraries.minecraft.net/com/mojang/authlib/4.0.43/authlib-4.0.43.jar"}}, "name": "com.mojang:authlib:4.0.43"}, {"downloads": {"artifact": {"path": "com/mojang/blocklist/1.0.10/blocklist-1.0.10.jar", "sha1": "5c685c5ffa94c4cd39496c7184c1d122e515ecef", "size": 964, "url": "https://libraries.minecraft.net/com/mojang/blocklist/1.0.10/blocklist-1.0.10.jar"}}, "name": "com.mojang:blocklist:1.0.10"}, {"downloads": {"artifact": {"path": "com/mojang/brigadier/1.1.8/brigadier-1.1.8.jar", "sha1": "5244ce82c3337bba4a196a3ce858bfaecc74404a", "size": 77121, "url": "https://libraries.minecraft.net/com/mojang/brigadier/1.1.8/brigadier-1.1.8.jar"}}, "name": "com.mojang:brigadier:1.1.8"}, {"downloads": {"artifact": {"path": "com/mojang/datafixerupper/6.0.8/datafixerupper-6.0.8.jar", "sha1": "3ba4a30557a9b057760af4011f909ba619fc5125", "size": 689960, "url": "https://libraries.minecraft.net/com/mojang/datafixerupper/6.0.8/datafixerupper-6.0.8.jar"}}, "name": "com.mojang:datafixerupper:6.0.8"}, {"downloads": {"artifact": {"path": "com/mojang/logging/1.1.1/logging-1.1.1.jar", "sha1": "832b8e6674a9b325a5175a3a6267dfaf34c85139", "size": 15343, "url": "https://libraries.minecraft.net/com/mojang/logging/1.1.1/logging-1.1.1.jar"}}, "name": "com.mojang:logging:1.1.1"}, {"downloads": {"artifact": {"path": "com/mojang/patchy/2.2.10/patchy-2.2.10.jar", "sha1": "da05971b07cbb379d002cf7eaec6a2048211fefc", "size": 4439, "url": "https://libraries.minecraft.net/com/mojang/patchy/2.2.10/patchy-2.2.10.jar"}}, "name": "com.mojang:patchy:2.2.10"}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.17.9/text2speech-1.17.9.jar", "sha1": "3cad216e3a7f0c19b4b394388bc9ffc446f13b14", "size": 12243, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.17.9/text2speech-1.17.9.jar"}}, "name": "com.mojang:text2speech:1.17.9"}, {"downloads": {"artifact": {"path": "commons-codec/commons-codec/1.15/commons-codec-1.15.jar", "sha1": "49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d", "size": 353793, "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.15/commons-codec-1.15.jar"}}, "name": "commons-codec:commons-codec:1.15"}, {"downloads": {"artifact": {"path": "commons-io/commons-io/2.11.0/commons-io-2.11.0.jar", "sha1": "a2503f302b11ebde7ebc3df41daebe0e4eea3689", "size": 327135, "url": "https://libraries.minecraft.net/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar"}}, "name": "commons-io:commons-io:2.11.0"}, {"downloads": {"artifact": {"path": "commons-logging/commons-logging/1.2/commons-logging-1.2.jar", "sha1": "4bfc12adfe4842bf07b657f0369c4cb522955686", "size": 61829, "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"}}, "name": "commons-logging:commons-logging:1.2"}, {"downloads": {"artifact": {"path": "io/netty/netty-buffer/4.1.82.Final/netty-buffer-4.1.82.Final.jar", "sha1": "a544270cf1ae8b8077082f5036436a9a9971ea71", "size": 304664, "url": "https://libraries.minecraft.net/io/netty/netty-buffer/4.1.82.Final/netty-buffer-4.1.82.Final.jar"}}, "name": "io.netty:netty-buffer:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-codec/4.1.82.Final/netty-codec-4.1.82.Final.jar", "sha1": "b77200379acb345a9ffdece1c605e591ac3e4e0a", "size": 339155, "url": "https://libraries.minecraft.net/io/netty/netty-codec/4.1.82.Final/netty-codec-4.1.82.Final.jar"}}, "name": "io.netty:netty-codec:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-common/4.1.82.Final/netty-common-4.1.82.Final.jar", "sha1": "022d148e85c3f5ebdacc0ce1f5aabb1d420f73f3", "size": 653880, "url": "https://libraries.minecraft.net/io/netty/netty-common/4.1.82.Final/netty-common-4.1.82.Final.jar"}}, "name": "io.netty:netty-common:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-handler/4.1.82.Final/netty-handler-4.1.82.Final.jar", "sha1": "644041d1fa96a5d3130a29e8978630d716d76e38", "size": 538569, "url": "https://libraries.minecraft.net/io/netty/netty-handler/4.1.82.Final/netty-handler-4.1.82.Final.jar"}}, "name": "io.netty:netty-handler:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-resolver/4.1.82.Final/netty-resolver-4.1.82.Final.jar", "sha1": "38f665ae8dcd29032eea31245ba7806bed2e0fa8", "size": 37776, "url": "https://libraries.minecraft.net/io/netty/netty-resolver/4.1.82.Final/netty-resolver-4.1.82.Final.jar"}}, "name": "io.netty:netty-resolver:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-classes-epoll/4.1.82.Final/netty-transport-classes-epoll-4.1.82.Final.jar", "sha1": "e7c7dd18deac93105797f30057c912651ea76521", "size": 142066, "url": "https://libraries.minecraft.net/io/netty/netty-transport-classes-epoll/4.1.82.Final/netty-transport-classes-epoll-4.1.82.Final.jar"}}, "name": "io.netty:netty-transport-classes-epoll:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-epoll/4.1.82.Final/netty-transport-native-epoll-4.1.82.Final-linux-aarch_64.jar", "sha1": "476409d6255001ca53a55f65b01c13822f8dc93a", "size": 39489, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-epoll/4.1.82.Final/netty-transport-native-epoll-4.1.82.Final-linux-aarch_64.jar"}}, "name": "io.netty:netty-transport-native-epoll:4.1.82.Final:linux-aarch_64", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-epoll/4.1.82.Final/netty-transport-native-epoll-4.1.82.Final-linux-x86_64.jar", "sha1": "c7350a71920f3ae9142945e25fed4846cce53374", "size": 37922, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-epoll/4.1.82.Final/netty-transport-native-epoll-4.1.82.Final-linux-x86_64.jar"}}, "name": "io.netty:netty-transport-native-epoll:4.1.82.Final:linux-x86_64", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-unix-common/4.1.82.Final/netty-transport-native-unix-common-4.1.82.Final.jar", "sha1": "3e895b35ca1b8a0eca56cacff4c2dde5d2c6abce", "size": 43684, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-unix-common/4.1.82.Final/netty-transport-native-unix-common-4.1.82.Final.jar"}}, "name": "io.netty:netty-transport-native-unix-common:4.1.82.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport/4.1.82.Final/netty-transport-4.1.82.Final.jar", "sha1": "e431a218d91acb6476ccad5f5aafde50aa3945ca", "size": 485752, "url": "https://libraries.minecraft.net/io/netty/netty-transport/4.1.82.Final/netty-transport-4.1.82.Final.jar"}}, "name": "io.netty:netty-transport:4.1.82.Final"}, {"downloads": {"artifact": {"path": "it/unimi/dsi/fastutil/8.5.9/fastutil-8.5.9.jar", "sha1": "bb7ea75ecdb216654237830b3a96d87ad91f8cc5", "size": 23376043, "url": "https://libraries.minecraft.net/it/unimi/dsi/fastutil/8.5.9/fastutil-8.5.9.jar"}}, "name": "it.unimi.dsi:fastutil:8.5.9"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna-platform/5.12.1/jna-platform-5.12.1.jar", "sha1": "097406a297c852f4a41e688a176ec675f72e8329", "size": 1356627, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna-platform/5.12.1/jna-platform-5.12.1.jar"}}, "name": "net.java.dev.jna:jna-platform:5.12.1"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna/5.12.1/jna-5.12.1.jar", "sha1": "b1e93a735caea94f503e95e6fe79bf9cdc1e985d", "size": 1866196, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna/5.12.1/jna-5.12.1.jar"}}, "name": "net.java.dev.jna:jna:5.12.1"}, {"downloads": {"artifact": {"path": "net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar", "sha1": "4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c", "size": 78146, "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar"}}, "name": "net.sf.jopt-simple:jopt-simple:5.0.4"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar", "sha1": "4ec95b60d4e86b5c95a0e919cb172a0af98011ef", "size": 1018316, "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar"}}, "name": "org.apache.commons:commons-compress:1.21"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar", "sha1": "c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e", "size": 587402, "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar"}}, "name": "org.apache.commons:commons-lang3:3.12.0"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar", "sha1": "e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada", "size": 780321, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"}}, "name": "org.apache.httpcomponents:httpclient:4.5.13"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpcore/4.4.15/httpcore-4.4.15.jar", "sha1": "7f2e0c573eaa7a74bac2e89b359e1f73d92a0a1d", "size": 328324, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.4.15/httpcore-4.4.15.jar"}}, "name": "org.apache.httpcomponents:httpcore:4.4.15"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-api/2.19.0/log4j-api-2.19.0.jar", "sha1": "ea1b37f38c327596b216542bc636cfdc0b8036fa", "size": 317566, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.19.0/log4j-api-2.19.0.jar"}}, "name": "org.apache.logging.log4j:log4j-api:2.19.0"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-core/2.19.0/log4j-core-2.19.0.jar", "sha1": "3b6eeb4de4c49c0fe38a4ee27188ff5fee44d0bb", "size": 1864386, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.19.0/log4j-core-2.19.0.jar"}}, "name": "org.apache.logging.log4j:log4j-core:2.19.0"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-slf4j2-impl/2.19.0/log4j-slf4j2-impl-2.19.0.jar", "sha1": "5c04bfdd63ce9dceb2e284b81e96b6a70010ee10", "size": 27721, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-slf4j2-impl/2.19.0/log4j-slf4j2-impl-2.19.0.jar"}}, "name": "org.apache.logging.log4j:log4j-slf4j2-impl:2.19.0"}, {"downloads": {"artifact": {"path": "org/joml/joml/1.10.5/joml-1.10.5.jar", "sha1": "22566d58af70ad3d72308bab63b8339906deb649", "size": 712082, "url": "https://libraries.minecraft.net/org/joml/joml/1.10.5/joml-1.10.5.jar"}}, "name": "org.joml:joml:1.10.5"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", "size": 128801, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux.jar", "sha1": "81716978214ecbda15050ca394b06ef61501a49e", "size": 119817, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos.jar", "sha1": "9ec4ce1fc8c85fdef03ef4ff2aace6f5775fb280", "size": 131655, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", "sha1": "cac0d3f712a3da7641fa174735a5f315de7ffe0a", "size": 129077, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows.jar", "sha1": "ed892f945cf7e79c8756796f32d00fa4ceaf573b", "size": 145512, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-arm64.jar", "sha1": "beda65ee503443e60aa196d58ed31f8d001dc22a", "size": 123808, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-x86.jar", "sha1": "b997e3391d6ce8f05487e7335d95c606043884a1", "size": 139251, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", "sha1": "a817bcf213db49f710603677457567c37d53e103", "size": 36601, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux.jar", "sha1": "33dbb017b6ed6b25f993ad9d56741a49e7937718", "size": 166524, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos.jar", "sha1": "56424dc8db3cfb8e7b594aa6d59a4f4387b7f544", "size": 117480, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", "sha1": "e577b87d8ad2ade361aaea2fcf226c660b15dee8", "size": 103475, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows.jar", "sha1": "948a89b76a16aa324b046ae9308891216ffce5f9", "size": 135585, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar", "sha1": "cae85c4edb219c88b6a0c26a87955ad98dc9519d", "size": 114250, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-x86.jar", "sha1": "fb476c8ec110e1c137ad3ce8a7f7bfe6b11c6324", "size": 110405, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", "size": 88237, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux.jar", "sha1": "f906b6439f6daa66001182ea7727e3467a93681b", "size": 476825, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos.jar", "sha1": "3a57b8911835fb58b5e558d0ca0d28157e263d45", "size": 397196, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", "sha1": "23d55e7490b57495320f6c9e1936d78fd72c4ef8", "size": 346125, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows.jar", "sha1": "30a474d0e57193d7bc128849a3ab66bc9316fdb1", "size": 576872, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-arm64.jar", "sha1": "40d65f1a7368a2aa47336f9cb69f5a190cf9975a", "size": 505234, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-x86.jar", "sha1": "888349f7b1be6fbae58bf8edfb9ef12def04c4e3", "size": 520313, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", "size": 921563, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux.jar", "sha1": "ab9ab6fde3743e3550fa5d46d785ecb45b047d99", "size": 79125, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos.jar", "sha1": "a0d12697ea019a7362eff26475b0531340e876a6", "size": 40709, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", "sha1": "eafe34b871d966292e8db0f1f3d6b8b110d4e91d", "size": 41665, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows.jar", "sha1": "c1807e9bd571402787d7e37e3029776ae2513bb8", "size": 100205, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-arm64.jar", "sha1": "527d78f1e9056aff3ed02ce93019c73c5e8f1721", "size": 82445, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-x86.jar", "sha1": "deef3eb9b178ff2ff3ce893cc72ae741c3a17974", "size": 87463, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", "size": 112380, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux.jar", "sha1": "3ee7aec8686e52867677110415566a5342a80230", "size": 227237, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos.jar", "sha1": "def8879b8d38a47a4cc1d48b1f9a7b772e51258e", "size": 203582, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", "sha1": "fcf073ed911752abdca5f0b00a53cfdf17ff8e8b", "size": 178408, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows.jar", "sha1": "86315914ac119efdb02dc9e8e978ade84f1702af", "size": 256301, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-arm64.jar", "sha1": "fde63cdd2605c00636721a6c8b961e41d1f6b247", "size": 216848, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-x86.jar", "sha1": "a8d41f419eecb430b7c91ea2ce2c5c451cae2091", "size": 225147, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", "size": 6767, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux.jar", "sha1": "a35110b9471bea8cde826ab297550ee8c22f5035", "size": 45389, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos.jar", "sha1": "78641a0fa5e9afa714adfdd152c357930c97a1ce", "size": 44821, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", "sha1": "972ecc17bad3571e81162153077b4d47b7b9eaa9", "size": 41380, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows.jar", "sha1": "a5d830475ec0958d9fdba1559efa99aef211e6ff", "size": 127930, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar", "sha1": "83a5e780df610829ff3a737822b4f931cffecd91", "size": 109139, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-x86.jar", "sha1": "842eedd876fae354abc308c98a263f6bbc9e8a4d", "size": 110042, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", "size": 724243, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux.jar", "sha1": "1de885aba434f934201b99f2f1afb142036ac189", "size": 110704, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos.jar", "sha1": "fc6bb723dec2cd031557dccb2a95f0ab80acb9db", "size": 55706, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", "sha1": "71d0d5e469c9c95351eb949064497e3391616ac9", "size": 42693, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows.jar", "sha1": "0036c37f16ab611b3aa11f3bcf80b1d509b4ce6b", "size": 159361, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-arm64.jar", "sha1": "0f46cadcf95675908fd3a550d63d9d709cb68998", "size": 130064, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-x86.jar", "sha1": "3b14f4beae9dd39791ec9e12190a9380cd8a3ce6", "size": 134695, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl:3.3.1:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/slf4j/slf4j-api/2.0.1/slf4j-api-2.0.1.jar", "sha1": "f48d81adce2abf5ad3cfe463df517952749e03bc", "size": 61388, "url": "https://libraries.minecraft.net/org/slf4j/slf4j-api/2.0.1/slf4j-api-2.0.1.jar"}}, "name": "org.slf4j:slf4j-api:2.0.1"}], "logging": {"client": {"argument": "-Dlog4j.configurationFile=${path}", "file": {"id": "client-1.12.xml", "sha1": "bd65e7d2e3c237be76cfbef4c2405033d7f91521", "size": 888, "url": "https://piston-data.mojang.com/v1/objects/bd65e7d2e3c237be76cfbef4c2405033d7f91521/client-1.12.xml"}, "type": "log4j2-xml"}}, "mainClass": "net.minecraft.client.main.Main", "minimumLauncherVersion": 21, "releaseTime": "2023-06-12T13:25:51+00:00", "time": "2023-06-12T13:25:51+00:00", "type": "release"} \ No newline at end of file diff --git a/src/test/resources/launcher/1.21.1.json b/src/test/resources/launcher/1.21.1.json new file mode 100644 index 00000000..867a8056 --- /dev/null +++ b/src/test/resources/launcher/1.21.1.json @@ -0,0 +1 @@ +{"arguments": {"game": ["--username", "${auth_player_name}", "--version", "${version_name}", "--gameDir", "${game_directory}", "--assetsDir", "${assets_root}", "--assetIndex", "${assets_index_name}", "--uuid", "${auth_uuid}", "--accessToken", "${auth_access_token}", "--clientId", "${clientid}", "--xuid", "${auth_xuid}", "--userType", "${user_type}", "--versionType", "${version_type}", {"rules": [{"action": "allow", "features": {"is_demo_user": true}}], "value": "--demo"}, {"rules": [{"action": "allow", "features": {"has_custom_resolution": true}}], "value": ["--width", "${resolution_width}", "--height", "${resolution_height}"]}, {"rules": [{"action": "allow", "features": {"has_quick_plays_support": true}}], "value": ["--quickPlayPath", "${quickPlayPath}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_singleplayer": true}}], "value": ["--quickPlaySingleplayer", "${quickPlaySingleplayer}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_multiplayer": true}}], "value": ["--quickPlayMultiplayer", "${quickPlayMultiplayer}"]}, {"rules": [{"action": "allow", "features": {"is_quick_play_realms": true}}], "value": ["--quickPlayRealms", "${quickPlayRealms}"]}], "jvm": [{"rules": [{"action": "allow", "os": {"name": "osx"}}], "value": ["-XstartOnFirstThread"]}, {"rules": [{"action": "allow", "os": {"name": "windows"}}], "value": "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump"}, {"rules": [{"action": "allow", "os": {"arch": "x86"}}], "value": "-Xss1M"}, "-Djava.library.path=${natives_directory}", "-Djna.tmpdir=${natives_directory}", "-Dorg.lwjgl.system.SharedLibraryExtractPath=${natives_directory}", "-Dio.netty.native.workdir=${natives_directory}", "-Dminecraft.launcher.brand=${launcher_name}", "-Dminecraft.launcher.version=${launcher_version}", "-cp", "${classpath}"]}, "assetIndex": {"id": "17", "sha1": "9b16298b1dc0697878cec88bb2d96168f5239e4f", "size": 449557, "totalSize": 825003775, "url": "https://piston-meta.mojang.com/v1/packages/9b16298b1dc0697878cec88bb2d96168f5239e4f/17.json"}, "assets": "17", "complianceLevel": 1, "downloads": {"client": {"sha1": "30c73b1c5da787909b2f73340419fdf13b9def88", "size": 26836906, "url": "https://piston-data.mojang.com/v1/objects/30c73b1c5da787909b2f73340419fdf13b9def88/client.jar"}, "client_mappings": {"sha1": "2244b6f072256667bcd9a73df124d6c58de77992", "size": 9598610, "url": "https://piston-data.mojang.com/v1/objects/2244b6f072256667bcd9a73df124d6c58de77992/client.txt"}, "server": {"sha1": "59353fb40c36d304f2035d51e7d6e6baa98dc05c", "size": 51627615, "url": "https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar"}, "server_mappings": {"sha1": "03f8985492bda0afc0898465341eb0acef35f570", "size": 7456063, "url": "https://piston-data.mojang.com/v1/objects/03f8985492bda0afc0898465341eb0acef35f570/server.txt"}}, "id": "1.21.1", "javaVersion": {"component": "java-runtime-delta", "majorVersion": 21}, "libraries": [{"downloads": {"artifact": {"path": "ca/weblite/java-objc-bridge/1.1/java-objc-bridge-1.1.jar", "sha1": "1227f9e0666314f9de41477e3ec277e542ed7f7b", "size": 1330045, "url": "https://libraries.minecraft.net/ca/weblite/java-objc-bridge/1.1/java-objc-bridge-1.1.jar"}}, "name": "ca.weblite:java-objc-bridge:1.1", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "com/github/oshi/oshi-core/6.4.10/oshi-core-6.4.10.jar", "sha1": "b1d8ab82d11d92fd639b56d639f8f46f739dd5fa", "size": 979212, "url": "https://libraries.minecraft.net/com/github/oshi/oshi-core/6.4.10/oshi-core-6.4.10.jar"}}, "name": "com.github.oshi:oshi-core:6.4.10"}, {"downloads": {"artifact": {"path": "com/google/code/gson/gson/2.10.1/gson-2.10.1.jar", "sha1": "b3add478d4382b78ea20b1671390a858002feb6c", "size": 283367, "url": "https://libraries.minecraft.net/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"}}, "name": "com.google.code.gson:gson:2.10.1"}, {"downloads": {"artifact": {"path": "com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", "sha1": "1dcf1de382a0bf95a3d8b0849546c88bac1292c9", "size": 4617, "url": "https://libraries.minecraft.net/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"}}, "name": "com.google.guava:failureaccess:1.0.1"}, {"downloads": {"artifact": {"path": "com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar", "sha1": "5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318", "size": 3041591, "url": "https://libraries.minecraft.net/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar"}}, "name": "com.google.guava:guava:32.1.2-jre"}, {"downloads": {"artifact": {"path": "com/ibm/icu/icu4j/73.2/icu4j-73.2.jar", "sha1": "61ad4ef7f9131fcf6d25c34b817f90d6da06c9e9", "size": 14567819, "url": "https://libraries.minecraft.net/com/ibm/icu/icu4j/73.2/icu4j-73.2.jar"}}, "name": "com.ibm.icu:icu4j:73.2"}, {"downloads": {"artifact": {"path": "com/mojang/authlib/6.0.54/authlib-6.0.54.jar", "sha1": "de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7", "size": 115242, "url": "https://libraries.minecraft.net/com/mojang/authlib/6.0.54/authlib-6.0.54.jar"}}, "name": "com.mojang:authlib:6.0.54"}, {"downloads": {"artifact": {"path": "com/mojang/blocklist/1.0.10/blocklist-1.0.10.jar", "sha1": "5c685c5ffa94c4cd39496c7184c1d122e515ecef", "size": 964, "url": "https://libraries.minecraft.net/com/mojang/blocklist/1.0.10/blocklist-1.0.10.jar"}}, "name": "com.mojang:blocklist:1.0.10"}, {"downloads": {"artifact": {"path": "com/mojang/brigadier/1.3.10/brigadier-1.3.10.jar", "sha1": "d15b53a14cf20fdcaa98f731af5dda654452c010", "size": 80082, "url": "https://libraries.minecraft.net/com/mojang/brigadier/1.3.10/brigadier-1.3.10.jar"}}, "name": "com.mojang:brigadier:1.3.10"}, {"downloads": {"artifact": {"path": "com/mojang/datafixerupper/8.0.16/datafixerupper-8.0.16.jar", "sha1": "67d4de6d7f95d89bcf5862995fb854ebaec02a34", "size": 724313, "url": "https://libraries.minecraft.net/com/mojang/datafixerupper/8.0.16/datafixerupper-8.0.16.jar"}}, "name": "com.mojang:datafixerupper:8.0.16"}, {"downloads": {"artifact": {"path": "com/mojang/logging/1.2.7/logging-1.2.7.jar", "sha1": "24cb95ffb0e3433fd6e844c04e68009e504ca1c0", "size": 15343, "url": "https://libraries.minecraft.net/com/mojang/logging/1.2.7/logging-1.2.7.jar"}}, "name": "com.mojang:logging:1.2.7"}, {"downloads": {"artifact": {"path": "com/mojang/patchy/2.2.10/patchy-2.2.10.jar", "sha1": "da05971b07cbb379d002cf7eaec6a2048211fefc", "size": 4439, "url": "https://libraries.minecraft.net/com/mojang/patchy/2.2.10/patchy-2.2.10.jar"}}, "name": "com.mojang:patchy:2.2.10"}, {"downloads": {"artifact": {"path": "com/mojang/text2speech/1.17.9/text2speech-1.17.9.jar", "sha1": "3cad216e3a7f0c19b4b394388bc9ffc446f13b14", "size": 12243, "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.17.9/text2speech-1.17.9.jar"}}, "name": "com.mojang:text2speech:1.17.9"}, {"downloads": {"artifact": {"path": "commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar", "sha1": "4e3eb3d79888d76b54e28b350915b5dc3919c9de", "size": 360738, "url": "https://libraries.minecraft.net/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar"}}, "name": "commons-codec:commons-codec:1.16.0"}, {"downloads": {"artifact": {"path": "commons-io/commons-io/2.15.1/commons-io-2.15.1.jar", "sha1": "f11560da189ab563a5c8e351941415430e9304ea", "size": 501218, "url": "https://libraries.minecraft.net/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar"}}, "name": "commons-io:commons-io:2.15.1"}, {"downloads": {"artifact": {"path": "commons-logging/commons-logging/1.2/commons-logging-1.2.jar", "sha1": "4bfc12adfe4842bf07b657f0369c4cb522955686", "size": 61829, "url": "https://libraries.minecraft.net/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"}}, "name": "commons-logging:commons-logging:1.2"}, {"downloads": {"artifact": {"path": "io/netty/netty-buffer/4.1.97.Final/netty-buffer-4.1.97.Final.jar", "sha1": "f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f", "size": 306590, "url": "https://libraries.minecraft.net/io/netty/netty-buffer/4.1.97.Final/netty-buffer-4.1.97.Final.jar"}}, "name": "io.netty:netty-buffer:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-codec/4.1.97.Final/netty-codec-4.1.97.Final.jar", "sha1": "384ba4d75670befbedb45c4d3b497a93639c206d", "size": 345274, "url": "https://libraries.minecraft.net/io/netty/netty-codec/4.1.97.Final/netty-codec-4.1.97.Final.jar"}}, "name": "io.netty:netty-codec:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-common/4.1.97.Final/netty-common-4.1.97.Final.jar", "sha1": "7cceacaf11df8dc63f23d0fb58e9d4640fc88404", "size": 659930, "url": "https://libraries.minecraft.net/io/netty/netty-common/4.1.97.Final/netty-common-4.1.97.Final.jar"}}, "name": "io.netty:netty-common:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-handler/4.1.97.Final/netty-handler-4.1.97.Final.jar", "sha1": "abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36", "size": 560040, "url": "https://libraries.minecraft.net/io/netty/netty-handler/4.1.97.Final/netty-handler-4.1.97.Final.jar"}}, "name": "io.netty:netty-handler:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-resolver/4.1.97.Final/netty-resolver-4.1.97.Final.jar", "sha1": "cec8348108dc76c47cf87c669d514be52c922144", "size": 37792, "url": "https://libraries.minecraft.net/io/netty/netty-resolver/4.1.97.Final/netty-resolver-4.1.97.Final.jar"}}, "name": "io.netty:netty-resolver:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-classes-epoll/4.1.97.Final/netty-transport-classes-epoll-4.1.97.Final.jar", "sha1": "795da37ded759e862457a82d9d92c4d39ce8ecee", "size": 147139, "url": "https://libraries.minecraft.net/io/netty/netty-transport-classes-epoll/4.1.97.Final/netty-transport-classes-epoll-4.1.97.Final.jar"}}, "name": "io.netty:netty-transport-classes-epoll:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar", "sha1": "5514744c588190ffda076b35a9b8c9f24946a960", "size": 40427, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar"}}, "name": "io.netty:netty-transport-native-epoll:4.1.97.Final:linux-aarch_64", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar", "sha1": "54188f271e388e7f313aea995e82f58ce2cdb809", "size": 38954, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar"}}, "name": "io.netty:netty-transport-native-epoll:4.1.97.Final:linux-x86_64", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "io/netty/netty-transport-native-unix-common/4.1.97.Final/netty-transport-native-unix-common-4.1.97.Final.jar", "sha1": "d469d84265ab70095b01b40886cabdd433b6e664", "size": 43897, "url": "https://libraries.minecraft.net/io/netty/netty-transport-native-unix-common/4.1.97.Final/netty-transport-native-unix-common-4.1.97.Final.jar"}}, "name": "io.netty:netty-transport-native-unix-common:4.1.97.Final"}, {"downloads": {"artifact": {"path": "io/netty/netty-transport/4.1.97.Final/netty-transport-4.1.97.Final.jar", "sha1": "f37380d23c9bb079bc702910833b2fd532c9abd0", "size": 489624, "url": "https://libraries.minecraft.net/io/netty/netty-transport/4.1.97.Final/netty-transport-4.1.97.Final.jar"}}, "name": "io.netty:netty-transport:4.1.97.Final"}, {"downloads": {"artifact": {"path": "it/unimi/dsi/fastutil/8.5.12/fastutil-8.5.12.jar", "sha1": "c24946d46824bd528054bface3231d2ecb7e95e8", "size": 23326598, "url": "https://libraries.minecraft.net/it/unimi/dsi/fastutil/8.5.12/fastutil-8.5.12.jar"}}, "name": "it.unimi.dsi:fastutil:8.5.12"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna-platform/5.14.0/jna-platform-5.14.0.jar", "sha1": "28934d48aed814f11e4c584da55c49fa7032b31b", "size": 1369287, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna-platform/5.14.0/jna-platform-5.14.0.jar"}}, "name": "net.java.dev.jna:jna-platform:5.14.0"}, {"downloads": {"artifact": {"path": "net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar", "sha1": "67bf3eaea4f0718cb376a181a629e5f88fa1c9dd", "size": 1878533, "url": "https://libraries.minecraft.net/net/java/dev/jna/jna/5.14.0/jna-5.14.0.jar"}}, "name": "net.java.dev.jna:jna:5.14.0"}, {"downloads": {"artifact": {"path": "net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar", "sha1": "4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c", "size": 78146, "url": "https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar"}}, "name": "net.sf.jopt-simple:jopt-simple:5.0.4"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-compress/1.26.0/commons-compress-1.26.0.jar", "sha1": "659feffdd12280201c8aacb8f7be94f9a883c824", "size": 1078328, "url": "https://libraries.minecraft.net/org/apache/commons/commons-compress/1.26.0/commons-compress-1.26.0.jar"}}, "name": "org.apache.commons:commons-compress:1.26.0"}, {"downloads": {"artifact": {"path": "org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar", "sha1": "1ed471194b02f2c6cb734a0cd6f6f107c673afae", "size": 657952, "url": "https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar"}}, "name": "org.apache.commons:commons-lang3:3.14.0"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar", "sha1": "e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada", "size": 780321, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"}}, "name": "org.apache.httpcomponents:httpclient:4.5.13"}, {"downloads": {"artifact": {"path": "org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar", "sha1": "51cf043c87253c9f58b539c9f7e44c8894223850", "size": 327891, "url": "https://libraries.minecraft.net/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar"}}, "name": "org.apache.httpcomponents:httpcore:4.4.16"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-api/2.22.1/log4j-api-2.22.1.jar", "sha1": "bea6fede6328fabafd7e68363161a7ea6605abd1", "size": 335001, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.22.1/log4j-api-2.22.1.jar"}}, "name": "org.apache.logging.log4j:log4j-api:2.22.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-core/2.22.1/log4j-core-2.22.1.jar", "sha1": "7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4", "size": 1900022, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.22.1/log4j-core-2.22.1.jar"}}, "name": "org.apache.logging.log4j:log4j-core:2.22.1"}, {"downloads": {"artifact": {"path": "org/apache/logging/log4j/log4j-slf4j2-impl/2.22.1/log4j-slf4j2-impl-2.22.1.jar", "sha1": "d7e6693c2606cb7e7335047d7bb96dec52db5665", "size": 27364, "url": "https://libraries.minecraft.net/org/apache/logging/log4j/log4j-slf4j2-impl/2.22.1/log4j-slf4j2-impl-2.22.1.jar"}}, "name": "org.apache.logging.log4j:log4j-slf4j2-impl:2.22.1"}, {"downloads": {"artifact": {"path": "org/jcraft/jorbis/0.0.17/jorbis-0.0.17.jar", "sha1": "8872d22b293e8f5d7d56ff92be966e6dc28ebdc6", "size": 99701, "url": "https://libraries.minecraft.net/org/jcraft/jorbis/0.0.17/jorbis-0.0.17.jar"}}, "name": "org.jcraft:jorbis:0.0.17"}, {"downloads": {"artifact": {"path": "org/joml/joml/1.10.5/joml-1.10.5.jar", "sha1": "22566d58af70ad3d72308bab63b8339906deb649", "size": 712082, "url": "https://libraries.minecraft.net/org/joml/joml/1.10.5/joml-1.10.5.jar"}}, "name": "org.joml:joml:1.10.5"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3.jar", "sha1": "a0db6c84a8becc8ca05f9dbfa985edc348a824c7", "size": 450896, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-linux.jar", "sha1": "149070a5480900347071b7074779531f25a6e3dc", "size": 1245129, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-macos-arm64.jar", "sha1": "b0a8c9baa9d1f54ac61e1ab9640c7659e7fa700c", "size": 1040981, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-macos-patch.jar", "sha1": "806d869f37ce0df388a24e17aaaf5ca0894d851b", "size": 1071983, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-macos-patch.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-macos-patch", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows.jar", "sha1": "81091b006dbb43fab04c8c638e9ac87c51b4096d", "size": 1035586, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows-arm64.jar", "sha1": "82028265a0a2ff33523ca75137ada7dc176e5210", "size": 886068, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows-x86.jar", "sha1": "15a8c1de7f51d07a92eae7ce1222557073a0c0c3", "size": 877480, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-freetype/3.3.3/lwjgl-freetype-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-freetype:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3.jar", "sha1": "efa1eb78c5ccd840e9f329717109b5e892d72f8e", "size": 135546, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-linux.jar", "sha1": "a03684c5e4b1b1dbbe0d29dbbdc27b985b6840f2", "size": 118478, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-macos.jar", "sha1": "a1bf400f6bc64e6195596cb1430dafda46090751", "size": 140884, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-macos-arm64.jar", "sha1": "ee8cc78d0a4a5b3b4600fade6d927c9fc320c858", "size": 138288, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows.jar", "sha1": "e449e28b4891fc423c54c85fbc5bb0b9efece67a", "size": 166368, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows-arm64.jar", "sha1": "f27018dc74f6289574502b46cce55d52817554e2", "size": 141970, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows-x86.jar", "sha1": "32334f3fd5270a59bad9939a93115acb6de36dcf", "size": 157123, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.3/lwjgl-glfw-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-glfw:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3.jar", "sha1": "b543467b7ff3c6920539a88ee602d34098628be5", "size": 43896, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-linux.jar", "sha1": "4f86728bf449b1dd61251c4e0ac01df1389cb51e", "size": 206779, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-macos.jar", "sha1": "2906637657a57579847238c9c72d2c4bde7083f8", "size": 153131, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-macos-arm64.jar", "sha1": "e9412c3ff8cb3a3bad1d3f52909ad74d8a5bdad1", "size": 141418, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows.jar", "sha1": "426222fc027602a5f21b9c0fe79cde6a4c7a011f", "size": 180344, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar", "sha1": "ba1f3fed0ee4be0217eaa41c5bbfb4b9b1383c33", "size": 154415, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows-x86.jar", "sha1": "f6063b6e0f23be483c5c88d84ce51b39dc69126c", "size": 148612, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.3/lwjgl-jemalloc-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3.jar", "sha1": "daada81ceb5fc0c291fbfdd4433cb8d9423577f2", "size": 110586, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-linux.jar", "sha1": "3037360cc4595079bea240af250b6d1a527e0905", "size": 573224, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-macos.jar", "sha1": "8df8338bfa77f2ebabef4e58964bd04d24805cbf", "size": 519824, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-macos-arm64.jar", "sha1": "0c78b078de2fb52f45aa55d04db889a560f3544f", "size": 471012, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows.jar", "sha1": "cf83862ae95d98496b26915024c7e666d8ab1c8f", "size": 698720, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows-arm64.jar", "sha1": "8e0615235116b9e4160dfe87bec90f5f6378bf72", "size": 630410, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows-x86.jar", "sha1": "87b8d5050e3adb46bb58fe1cb2669a4a48fce10d", "size": 638424, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.3/lwjgl-openal-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-openal:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3.jar", "sha1": "02f6b0147078396a58979125a4c947664e98293a", "size": 929192, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-linux.jar", "sha1": "62c70a4b00ca5391882b0f4b787c1588d24f1c86", "size": 80463, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-macos.jar", "sha1": "1bd45997551ae8a28469f3a2b678f4b7289e12c0", "size": 41484, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-macos-arm64.jar", "sha1": "d213ddef27637b1af87961ffa94d6b27036becc8", "size": 42487, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows.jar", "sha1": "e6c1eec8be8a71951b830a4d69efc01c6531900c", "size": 101535, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows-arm64.jar", "sha1": "65e956d3735a1abdc82eff4baec1b61174697d4b", "size": 83095, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows-x86.jar", "sha1": "0d32d833dcaa2f355a886eaf21f0408b5f03241d", "size": 88612, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.3/lwjgl-opengl-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-opengl:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3.jar", "sha1": "25dd6161988d7e65f71d5065c99902402ee32746", "size": 120283, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-linux.jar", "sha1": "fd1271ccd9d85eff2fa31f3fd543e02ccfaf5041", "size": 231820, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-macos.jar", "sha1": "472792c98fb2c1557c060cb9da5fca6a9773621f", "size": 216456, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-macos-arm64.jar", "sha1": "51c6955571fbcdb7bb538c6aa589b953b584c6af", "size": 183628, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows.jar", "sha1": "1d9facdf6541de114b0f963be33505b7679c78cb", "size": 261297, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows-arm64.jar", "sha1": "a584ab44de569708871f0a79561f4d8c37487f2c", "size": 219511, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows-x86.jar", "sha1": "b5c874687b9aac1a936501d4ed2c49567fd1b575", "size": 227800, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.3/lwjgl-stb-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-stb:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3.jar", "sha1": "82d755ca94b102e9ca77283b9e2dc46d1b15fbe5", "size": 13400, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-linux.jar", "sha1": "d8d58daa0c3e5fd906fee96f5fddbcbc07cc308b", "size": 44192, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-macos.jar", "sha1": "6598081e346a03038a8be68eb2de614a1c2eac68", "size": 45865, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-macos-arm64.jar", "sha1": "406feedb977372085a61eb0fee358183f4f4c67a", "size": 42498, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows.jar", "sha1": "a6697981b0449a5087c1d546fc08b4f73e8f98c9", "size": 130253, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar", "sha1": "a88c494f3006eb91a7433b12a3a55a9a6c20788b", "size": 110867, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows-x86.jar", "sha1": "c336c84ee88cccb495c6ffa112395509e7378e8a", "size": 111797, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.3/lwjgl-tinyfd-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3.jar", "sha1": "29589b5f87ed335a6c7e7ee6a5775f81f97ecb84", "size": 785029, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3"}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-linux.jar", "sha1": "1713758e3660ba66e1e954396fd18126038b33c0", "size": 114627, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-linux.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-linux", "rules": [{"action": "allow", "os": {"name": "linux"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-macos.jar", "sha1": "33a6efa288390490ce6eb6c3df47ac21ecf648cf", "size": 60543, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-macos.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-macos", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-macos-arm64.jar", "sha1": "226246e75f6bd8d4e1895bdce8638ef87808d114", "size": 48620, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-macos-arm64.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-macos-arm64", "rules": [{"action": "allow", "os": {"name": "osx"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows.jar", "sha1": "a5ed18a2b82fc91b81f40d717cb1f64c9dcb0540", "size": 165442, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-windows", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows-arm64.jar", "sha1": "e9aca8c5479b520a2a7f0d542a118140e812c5e8", "size": 133378, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows-arm64.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-windows-arm64", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows-x86.jar", "sha1": "9e670718e050aeaeea0c2d5b907cffb142f2e58f", "size": 139653, "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.3/lwjgl-3.3.3-natives-windows-x86.jar"}}, "name": "org.lwjgl:lwjgl:3.3.3:natives-windows-x86", "rules": [{"action": "allow", "os": {"name": "windows"}}]}, {"downloads": {"artifact": {"path": "org/lz4/lz4-java/1.8.0/lz4-java-1.8.0.jar", "sha1": "4b986a99445e49ea5fbf5d149c4b63f6ed6c6780", "size": 682804, "url": "https://libraries.minecraft.net/org/lz4/lz4-java/1.8.0/lz4-java-1.8.0.jar"}}, "name": "org.lz4:lz4-java:1.8.0"}, {"downloads": {"artifact": {"path": "org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar", "sha1": "7cf2726fdcfbc8610f9a71fb3ed639871f315340", "size": 64579, "url": "https://libraries.minecraft.net/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar"}}, "name": "org.slf4j:slf4j-api:2.0.9"}], "logging": {"client": {"argument": "-Dlog4j.configurationFile=${path}", "file": {"id": "client-1.12.xml", "sha1": "bd65e7d2e3c237be76cfbef4c2405033d7f91521", "size": 888, "url": "https://piston-data.mojang.com/v1/objects/bd65e7d2e3c237be76cfbef4c2405033d7f91521/client-1.12.xml"}, "type": "log4j2-xml"}}, "mainClass": "net.minecraft.client.main.Main", "minimumLauncherVersion": 21, "releaseTime": "2024-08-08T12:24:45+00:00", "time": "2024-08-08T12:24:45+00:00", "type": "release"} \ No newline at end of file diff --git a/src/test/resources/launcher/fabric-1.21.1.json b/src/test/resources/launcher/fabric-1.21.1.json new file mode 100644 index 00000000..2b698f13 --- /dev/null +++ b/src/test/resources/launcher/fabric-1.21.1.json @@ -0,0 +1 @@ +{"id":"fabric-loader-0.16.10-1.21.1","inheritsFrom":"1.21.1","releaseTime":"2026-10-03T16:33:18+0000","time":"2026-10-03T16:33:18+0000","type":"release","mainClass":"net.fabricmc.loader.impl.launch.knot.KnotClient","arguments":{"game":[],"jvm":["-DFabricMcEmu= net.minecraft.client.main.Main "]},"libraries":[{"name":"org.ow2.asm:asm:9.7.1","url":"https://maven.fabricmc.net/","md5":"e2cdd32d198ad31427d298eee9d39d8d","sha1":"f0ed132a49244b042cd0e15702ab9f2ce3cc8436","sha256":"8cadd43ac5eb6d09de05faecca38b917a040bb9139c7edeb4cc81c740b713281","sha512":"4767b01603dad5c79cc1e2b5f3722f72b1059d928f184f446ba11badeb1b381b3a3a9a801cc43d25d396df950b09d19597c73173c411b1da890de808b94f1f50","size":126093},{"name":"org.ow2.asm:asm-analysis:9.7.1","url":"https://maven.fabricmc.net/","md5":"4cd9e7178dfb85371bba3077e40cd514","sha1":"f97a3b319f0ed6a8cd944dc79060d3912a28985f","sha256":"85b29371884ba31bb76edf22323c2c24e172c3267a67152eba3d1ccc2e041ef2","sha512":"a8bd265c81d9bb4371cafd3f5d18f96ad79aec65031457d518c54599144d199d9feddf13b8dc822b2598b8b504a88edbd81d1f2c52991a70a6b343d8f5bb6fe5","size":35126},{"name":"org.ow2.asm:asm-commons:9.7.1","url":"https://maven.fabricmc.net/","md5":"8344aea3c8b7d707e9d35a62710e77c9","sha1":"406c6a2225cfe1819f102a161e54cc16a5c24f75","sha256":"9a579b54d292ad9be171d4313fd4739c635592c2b5ac3a459bbd1049cddec6a0","sha512":"81daf5765e387e6aeec5d45c4b9e4e1b471fb4f350931e5a214845c7c657a2142768f6902765e49c0ce2c595962e5d008883cba2e4a40c4bdce8f2e92518d2db","size":73459},{"name":"org.ow2.asm:asm-tree:9.7.1","url":"https://maven.fabricmc.net/","md5":"e85029f613b6469989cc7cf53fe06b74","sha1":"3a53139787663b139de76b627fca0084ab60d32c","sha256":"9929881f59eb6b840e86d54570c77b59ce721d104e6dfd7a40978991c2d3b41f","sha512":"e55008c392fdd35e95d3404766b12dd4b46e13d5c362fcd0ab42a65751a82737eaf0ebc857691d1916190d34407adfde4437615d69c278785416fd911e00978d","size":51939},{"name":"org.ow2.asm:asm-util:9.7.1","url":"https://maven.fabricmc.net/","md5":"36d373a9cd6cad9b35db9f984c6b4bbb","sha1":"9e23359b598ec6b74b23e53110dd5c577adf2243","sha256":"f885be71b5c90556f5f1ad1c4f9276b29b96057c497d46666fe4ddbec3cb43c6","sha512":"522d793d15a2c5ea6504a50222cf0750f1eab7b881cf289675042539b1aba8b3868197b1bebe729de728dd10020eb028ae16252dcd5d84fdcbf7f925832bc269","size":94519},{"name":"net.fabricmc:sponge-mixin:0.15.4+mixin.0.8.7","url":"https://maven.fabricmc.net/","md5":"991ca8be2c408fe19eb64014d8a18243","sha1":"6a12aacc794f1078458433116e9ed42c1cc98096","sha256":"4631f67da980ae2ac9e6e285a7df4680645e2f37a6a14acc775f97982162c2a2","sha512":"d4f6caaee7cb841cc9bc36ae5eb725bdb3dd28a5af8f63f75747a17156d708263b37f5a87eca863b2c3d91732c0b128318e9de455d1cd964e1ae8ba0a318fbf1","size":1494834},{"name":"net.fabricmc:intermediary:1.21.1","url":"https://maven.fabricmc.net/"},{"name":"net.fabricmc:fabric-loader:0.16.10","url":"https://maven.fabricmc.net/"}]} \ No newline at end of file diff --git a/src/test/resources/launcher/neoforge-1.21.1.json b/src/test/resources/launcher/neoforge-1.21.1.json new file mode 100644 index 00000000..385dc6b4 --- /dev/null +++ b/src/test/resources/launcher/neoforge-1.21.1.json @@ -0,0 +1 @@ +{"id":"neoforge-21.1.172","time":"2025-05-12T21:39:20.541475284","releaseTime":"2025-05-12T21:39:20.541475284","type":"release","mainClass":"cpw.mods.bootstraplauncher.BootstrapLauncher","inheritsFrom":"1.21.1","arguments":{"game":["--fml.neoForgeVersion","21.1.172","--fml.fmlVersion","4.0.39","--fml.mcVersion","1.21.1","--fml.neoFormVersion","20240808.144430","--launchTarget","forgeclient"],"jvm":["-Djava.net.preferIPv6Addresses=system","-DignoreList=client-extra,${version_name}.jar","-DlibraryDirectory=${library_directory}","-p","${library_directory}/cpw/mods/bootstraplauncher/2.0.2/bootstraplauncher-2.0.2.jar${classpath_separator}${library_directory}/cpw/mods/securejarhandler/3.0.8/securejarhandler-3.0.8.jar${classpath_separator}${library_directory}/org/ow2/asm/asm-commons/9.7/asm-commons-9.7.jar${classpath_separator}${library_directory}/org/ow2/asm/asm-util/9.7/asm-util-9.7.jar${classpath_separator}${library_directory}/org/ow2/asm/asm-analysis/9.7/asm-analysis-9.7.jar${classpath_separator}${library_directory}/org/ow2/asm/asm-tree/9.7/asm-tree-9.7.jar${classpath_separator}${library_directory}/org/ow2/asm/asm/9.7/asm-9.7.jar${classpath_separator}${library_directory}/net/neoforged/JarJarFileSystems/0.4.1/JarJarFileSystems-0.4.1.jar","--add-modules","ALL-MODULE-PATH","--add-opens","java.base/java.util.jar=cpw.mods.securejarhandler","--add-opens","java.base/java.lang.invoke=cpw.mods.securejarhandler","--add-exports","java.base/sun.security.util=cpw.mods.securejarhandler","--add-exports","jdk.naming.dns/com.sun.jndi.dns=java.naming"]},"libraries":[{"name":"net.neoforged.fancymodloader:earlydisplay:4.0.39","downloads":{"artifact":{"sha1":"4388fd457faa6f04f8858d92ead5f33a354693a0","size":261720,"url":"https://maven.neoforged.net/releases/net/neoforged/fancymodloader/earlydisplay/4.0.39/earlydisplay-4.0.39.jar","path":"net/neoforged/fancymodloader/earlydisplay/4.0.39/earlydisplay-4.0.39.jar"}}},{"name":"net.neoforged.fancymodloader:loader:4.0.39","downloads":{"artifact":{"sha1":"3721e43a7254e2861a63ab4a4ce716e4150d2640","size":504648,"url":"https://maven.neoforged.net/releases/net/neoforged/fancymodloader/loader/4.0.39/loader-4.0.39.jar","path":"net/neoforged/fancymodloader/loader/4.0.39/loader-4.0.39.jar"}}},{"name":"net.neoforged.accesstransformers:at-modlauncher:10.0.1","downloads":{"artifact":{"sha1":"5aba50202aceead086bc09fbc2751c9f05cb4890","size":2347,"url":"https://maven.neoforged.net/releases/net/neoforged/accesstransformers/at-modlauncher/10.0.1/at-modlauncher-10.0.1.jar","path":"net/neoforged/accesstransformers/at-modlauncher/10.0.1/at-modlauncher-10.0.1.jar"}}},{"name":"net.neoforged:accesstransformers:10.0.1","downloads":{"artifact":{"sha1":"fd83b5725f76eae9115e9355fa1c456a6a441400","size":67234,"url":"https://maven.neoforged.net/releases/net/neoforged/accesstransformers/10.0.1/accesstransformers-10.0.1.jar","path":"net/neoforged/accesstransformers/10.0.1/accesstransformers-10.0.1.jar"}}},{"name":"net.neoforged:bus:8.0.2","downloads":{"artifact":{"sha1":"163c9ef7c4bcca6d850c34e95261b606af91fe06","size":29341,"url":"https://maven.neoforged.net/releases/net/neoforged/bus/8.0.2/bus-8.0.2.jar","path":"net/neoforged/bus/8.0.2/bus-8.0.2.jar"}}},{"name":"net.neoforged:coremods:7.0.3","downloads":{"artifact":{"sha1":"09147e6f638b4272b3bd5fc8f92ad37802512c6c","size":22659,"url":"https://maven.neoforged.net/releases/net/neoforged/coremods/7.0.3/coremods-7.0.3.jar","path":"net/neoforged/coremods/7.0.3/coremods-7.0.3.jar"}}},{"name":"cpw.mods:modlauncher:11.0.4","downloads":{"artifact":{"sha1":"6619d4812a3c092310d521ebc4c9503727563df7","size":116200,"url":"https://maven.neoforged.net/releases/cpw/mods/modlauncher/11.0.4/modlauncher-11.0.4.jar","path":"cpw/mods/modlauncher/11.0.4/modlauncher-11.0.4.jar"}}},{"name":"net.neoforged:mergetool:2.0.0:api","downloads":{"artifact":{"sha1":"52fe1949be64e3303aabaaa21e315f551db9c9f4","size":2550,"url":"https://maven.neoforged.net/releases/net/neoforged/mergetool/2.0.0/mergetool-2.0.0-api.jar","path":"net/neoforged/mergetool/2.0.0/mergetool-2.0.0-api.jar"}}},{"name":"com.electronwill.night-config:toml:3.8.2","downloads":{"artifact":{"sha1":"c128842f759692f613ea6c3ef0ef052273bbb38c","size":39516,"url":"https://maven.neoforged.net/releases/com/electronwill/night-config/toml/3.8.2/toml-3.8.2.jar","path":"com/electronwill/night-config/toml/3.8.2/toml-3.8.2.jar"}}},{"name":"com.electronwill.night-config:core:3.8.2","downloads":{"artifact":{"sha1":"94eee571e1524129804d08c75f6416a3be380ad4","size":380967,"url":"https://maven.neoforged.net/releases/com/electronwill/night-config/core/3.8.2/core-3.8.2.jar","path":"com/electronwill/night-config/core/3.8.2/core-3.8.2.jar"}}},{"name":"net.neoforged:JarJarSelector:0.4.1","downloads":{"artifact":{"sha1":"fb3cc7a58af22ad2880adb98af6d518128c47dae","size":17168,"url":"https://maven.neoforged.net/releases/net/neoforged/JarJarSelector/0.4.1/JarJarSelector-0.4.1.jar","path":"net/neoforged/JarJarSelector/0.4.1/JarJarSelector-0.4.1.jar"}}},{"name":"net.neoforged:JarJarMetadata:0.4.1","downloads":{"artifact":{"sha1":"f8da03683dc81694556dc3e177c5e3bb77ae6fcb","size":15648,"url":"https://maven.neoforged.net/releases/net/neoforged/JarJarMetadata/0.4.1/JarJarMetadata-0.4.1.jar","path":"net/neoforged/JarJarMetadata/0.4.1/JarJarMetadata-0.4.1.jar"}}},{"name":"org.apache.maven:maven-artifact:3.8.5","downloads":{"artifact":{"sha1":"4433f50c07debefaed0553bd0068f4f48d449313","size":58077,"url":"https://maven.neoforged.net/releases/org/apache/maven/maven-artifact/3.8.5/maven-artifact-3.8.5.jar","path":"org/apache/maven/maven-artifact/3.8.5/maven-artifact-3.8.5.jar"}}},{"name":"net.jodah:typetools:0.6.3","downloads":{"artifact":{"sha1":"a01aaa6ddaea9ec07ec4f209487b7a46a526283a","size":18281,"url":"https://maven.neoforged.net/releases/net/jodah/typetools/0.6.3/typetools-0.6.3.jar","path":"net/jodah/typetools/0.6.3/typetools-0.6.3.jar"}}},{"name":"net.minecrell:terminalconsoleappender:1.3.0","downloads":{"artifact":{"sha1":"b562e9bb61235c9520e26282cdee71f8f802d1fc","size":16949,"url":"https://maven.neoforged.net/releases/net/minecrell/terminalconsoleappender/1.3.0/terminalconsoleappender-1.3.0.jar","path":"net/minecrell/terminalconsoleappender/1.3.0/terminalconsoleappender-1.3.0.jar"}}},{"name":"net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7","downloads":{"artifact":{"sha1":"2af2f021d8e02a0220dc27a7a72b4666d66d44ca","size":1494751,"url":"https://maven.neoforged.net/releases/net/fabricmc/sponge-mixin/0.15.2+mixin.0.8.7/sponge-mixin-0.15.2+mixin.0.8.7.jar","path":"net/fabricmc/sponge-mixin/0.15.2+mixin.0.8.7/sponge-mixin-0.15.2+mixin.0.8.7.jar"}}},{"name":"org.openjdk.nashorn:nashorn-core:15.4","downloads":{"artifact":{"sha1":"f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5","size":2167292,"url":"https://maven.neoforged.net/releases/org/openjdk/nashorn/nashorn-core/15.4/nashorn-core-15.4.jar","path":"org/openjdk/nashorn/nashorn-core/15.4/nashorn-core-15.4.jar"}}},{"name":"org.apache.commons:commons-lang3:3.14.0","downloads":{"artifact":{"sha1":"1ed471194b02f2c6cb734a0cd6f6f107c673afae","size":657952,"url":"https://libraries.minecraft.net/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar","path":"org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar"}}},{"name":"cpw.mods:bootstraplauncher:2.0.2","downloads":{"artifact":{"sha1":"1a2d076cbc33b0520cbacd591224427b2a20047d","size":11116,"url":"https://maven.neoforged.net/releases/cpw/mods/bootstraplauncher/2.0.2/bootstraplauncher-2.0.2.jar","path":"cpw/mods/bootstraplauncher/2.0.2/bootstraplauncher-2.0.2.jar"}}},{"name":"cpw.mods:securejarhandler:3.0.8","downloads":{"artifact":{"sha1":"c0ef95cecd8699a0449053ac7d9c160748d902cd","size":103765,"url":"https://maven.neoforged.net/releases/cpw/mods/securejarhandler/3.0.8/securejarhandler-3.0.8.jar","path":"cpw/mods/securejarhandler/3.0.8/securejarhandler-3.0.8.jar"}}},{"name":"org.ow2.asm:asm-commons:9.7","downloads":{"artifact":{"sha1":"e86dda4696d3c185fcc95d8d311904e7ce38a53f","size":73426,"url":"https://maven.neoforged.net/releases/org/ow2/asm/asm-commons/9.7/asm-commons-9.7.jar","path":"org/ow2/asm/asm-commons/9.7/asm-commons-9.7.jar"}}},{"name":"org.ow2.asm:asm-util:9.7","downloads":{"artifact":{"sha1":"c0655519f24d92af2202cb681cd7c1569df6ead6","size":93784,"url":"https://maven.neoforged.net/releases/org/ow2/asm/asm-util/9.7/asm-util-9.7.jar","path":"org/ow2/asm/asm-util/9.7/asm-util-9.7.jar"}}},{"name":"org.ow2.asm:asm-analysis:9.7","downloads":{"artifact":{"sha1":"e4a258b7eb96107106c0599f0061cfc1832fe07a","size":34776,"url":"https://maven.neoforged.net/releases/org/ow2/asm/asm-analysis/9.7/asm-analysis-9.7.jar","path":"org/ow2/asm/asm-analysis/9.7/asm-analysis-9.7.jar"}}},{"name":"org.ow2.asm:asm-tree:9.7","downloads":{"artifact":{"sha1":"e446a17b175bfb733b87c5c2560ccb4e57d69f1a","size":51934,"url":"https://maven.neoforged.net/releases/org/ow2/asm/asm-tree/9.7/asm-tree-9.7.jar","path":"org/ow2/asm/asm-tree/9.7/asm-tree-9.7.jar"}}},{"name":"org.ow2.asm:asm:9.7","downloads":{"artifact":{"sha1":"073d7b3086e14beb604ced229c302feff6449723","size":125428,"url":"https://maven.neoforged.net/releases/org/ow2/asm/asm/9.7/asm-9.7.jar","path":"org/ow2/asm/asm/9.7/asm-9.7.jar"}}},{"name":"net.neoforged:JarJarFileSystems:0.4.1","downloads":{"artifact":{"sha1":"78f59f89defcd032ed788b151ca6a0d40ace796a","size":31807,"url":"https://maven.neoforged.net/releases/net/neoforged/JarJarFileSystems/0.4.1/JarJarFileSystems-0.4.1.jar","path":"net/neoforged/JarJarFileSystems/0.4.1/JarJarFileSystems-0.4.1.jar"}}},{"name":"net.sf.jopt-simple:jopt-simple:5.0.4","downloads":{"artifact":{"sha1":"4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c","size":78146,"url":"https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar","path":"net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar"}}},{"name":"org.slf4j:slf4j-api:2.0.9","downloads":{"artifact":{"sha1":"7cf2726fdcfbc8610f9a71fb3ed639871f315340","size":64579,"url":"https://libraries.minecraft.net/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar","path":"org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar"}}},{"name":"org.antlr:antlr4-runtime:4.13.1","downloads":{"artifact":{"sha1":"17125bae1d965624e265ef49552f6465a2bfa307","size":326305,"url":"https://maven.neoforged.net/releases/org/antlr/antlr4-runtime/4.13.1/antlr4-runtime-4.13.1.jar","path":"org/antlr/antlr4-runtime/4.13.1/antlr4-runtime-4.13.1.jar"}}},{"name":"com.mojang:logging:1.2.7","downloads":{"artifact":{"sha1":"24cb95ffb0e3433fd6e844c04e68009e504ca1c0","size":15343,"url":"https://libraries.minecraft.net/com/mojang/logging/1.2.7/logging-1.2.7.jar","path":"com/mojang/logging/1.2.7/logging-1.2.7.jar"}}},{"name":"org.apache.logging.log4j:log4j-slf4j2-impl:2.22.1","downloads":{"artifact":{"sha1":"d7e6693c2606cb7e7335047d7bb96dec52db5665","size":27364,"url":"https://libraries.minecraft.net/org/apache/logging/log4j/log4j-slf4j2-impl/2.22.1/log4j-slf4j2-impl-2.22.1.jar","path":"org/apache/logging/log4j/log4j-slf4j2-impl/2.22.1/log4j-slf4j2-impl-2.22.1.jar"}}},{"name":"org.apache.logging.log4j:log4j-core:2.22.1","downloads":{"artifact":{"sha1":"7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4","size":1900022,"url":"https://libraries.minecraft.net/org/apache/logging/log4j/log4j-core/2.22.1/log4j-core-2.22.1.jar","path":"org/apache/logging/log4j/log4j-core/2.22.1/log4j-core-2.22.1.jar"}}},{"name":"org.apache.logging.log4j:log4j-api:2.22.1","downloads":{"artifact":{"sha1":"bea6fede6328fabafd7e68363161a7ea6605abd1","size":335001,"url":"https://libraries.minecraft.net/org/apache/logging/log4j/log4j-api/2.22.1/log4j-api-2.22.1.jar","path":"org/apache/logging/log4j/log4j-api/2.22.1/log4j-api-2.22.1.jar"}}},{"name":"org.jline:jline-reader:3.20.0","downloads":{"artifact":{"sha1":"8f15415b022a25b473e8e16c28ae913186ffb9c4","size":171052,"url":"https://maven.neoforged.net/releases/org/jline/jline-reader/3.20.0/jline-reader-3.20.0.jar","path":"org/jline/jline-reader/3.20.0/jline-reader-3.20.0.jar"}}},{"name":"org.jline:jline-terminal:3.20.0","downloads":{"artifact":{"sha1":"d0ddcc708ddf527a3454c941b7b9225cc83a15ff","size":228481,"url":"https://maven.neoforged.net/releases/org/jline/jline-terminal/3.20.0/jline-terminal-3.20.0.jar","path":"org/jline/jline-terminal/3.20.0/jline-terminal-3.20.0.jar"}}},{"name":"commons-io:commons-io:2.15.1","downloads":{"artifact":{"sha1":"f11560da189ab563a5c8e351941415430e9304ea","size":501218,"url":"https://libraries.minecraft.net/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar","path":"commons-io/commons-io/2.15.1/commons-io-2.15.1.jar"}}},{"name":"net.minecraftforge:srgutils:0.4.15","downloads":{"artifact":{"sha1":"ca408b131759478f164e010fae0d73997e125fb5","size":69393,"url":"https://maven.neoforged.net/releases/net/minecraftforge/srgutils/0.4.15/srgutils-0.4.15.jar","path":"net/minecraftforge/srgutils/0.4.15/srgutils-0.4.15.jar"}}},{"name":"com.google.guava:guava:32.1.2-jre","downloads":{"artifact":{"sha1":"5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318","size":3041591,"url":"https://libraries.minecraft.net/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar","path":"com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar"}}},{"name":"com.google.guava:failureaccess:1.0.1","downloads":{"artifact":{"sha1":"1dcf1de382a0bf95a3d8b0849546c88bac1292c9","size":4617,"url":"https://libraries.minecraft.net/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar","path":"com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"}}},{"name":"com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava","downloads":{"artifact":{"sha1":"b421526c5f297295adef1c886e5246c39d4ac629","size":2199,"url":"https://libraries.minecraft.net/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar","path":"com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"}}},{"name":"com.google.code.findbugs:jsr305:3.0.2","downloads":{"artifact":{"sha1":"25ea2e8b0c338a877313bd4672d3fe056ea78f0d","size":19936,"url":"https://libraries.minecraft.net/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar","path":"com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"}}},{"name":"org.checkerframework:checker-qual:3.33.0","downloads":{"artifact":{"sha1":"de2b60b62da487644fc11f734e73c8b0b431238f","size":223979,"url":"https://libraries.minecraft.net/org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar","path":"org/checkerframework/checker-qual/3.33.0/checker-qual-3.33.0.jar"}}},{"name":"com.google.errorprone:error_prone_annotations:2.18.0","downloads":{"artifact":{"sha1":"89b684257096f548fa39a7df9fdaa409d4d4df91","size":16017,"url":"https://libraries.minecraft.net/com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar","path":"com/google/errorprone/error_prone_annotations/2.18.0/error_prone_annotations-2.18.0.jar"}}},{"name":"com.google.j2objc:j2objc-annotations:2.8","downloads":{"artifact":{"sha1":"c85270e307e7b822f1086b93689124b89768e273","size":9301,"url":"https://libraries.minecraft.net/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar","path":"com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar"}}},{"name":"com.google.code.gson:gson:2.10.1","downloads":{"artifact":{"sha1":"b3add478d4382b78ea20b1671390a858002feb6c","size":283367,"url":"https://libraries.minecraft.net/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar","path":"com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"}}},{"name":"org.codehaus.plexus:plexus-utils:3.3.0","downloads":{"artifact":{"sha1":"cf43b5391de623b36fe066a21127baef82c64022","size":263253,"url":"https://maven.neoforged.net/releases/org/codehaus/plexus/plexus-utils/3.3.0/plexus-utils-3.3.0.jar","path":"org/codehaus/plexus/plexus-utils/3.3.0/plexus-utils-3.3.0.jar"}}},{"name":"com.machinezoo.noexception:noexception:1.7.1","downloads":{"artifact":{"sha1":"b65330c98e38a1f915fa54a6e5eca496505e3f0a","size":250861,"url":"https://maven.neoforged.net/releases/com/machinezoo/noexception/noexception/1.7.1/noexception-1.7.1.jar","path":"com/machinezoo/noexception/noexception/1.7.1/noexception-1.7.1.jar"}}}]} \ No newline at end of file diff --git a/src/test/resources/launcher/quilt-1.20.1.json b/src/test/resources/launcher/quilt-1.20.1.json new file mode 100644 index 00000000..df09248f --- /dev/null +++ b/src/test/resources/launcher/quilt-1.20.1.json @@ -0,0 +1,69 @@ +{ + "id": "quilt-loader-0.26.4-1.20.1", + "inheritsFrom": "1.20.1", + "type": "release", + "mainClass": "org.quiltmc.loader.impl.launch.knot.KnotClient", + "arguments": { + "game": [] + }, + "libraries": [ + { + "name": "net.fabricmc:tiny-mappings-parser:0.3.0+build.17", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "net.fabricmc:sponge-mixin:0.15.3+mixin.0.8.7", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "net.fabricmc:tiny-remapper:0.10.4", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "net.fabricmc:access-widener:2.1.0", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.quiltmc:quilt-json5:1.0.4+final", + "url": "https://maven.quiltmc.org/repository/release/" + }, + { + "name": "org.ow2.asm:asm:9.6", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.ow2.asm:asm-analysis:9.6", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.ow2.asm:asm-commons:9.6", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.ow2.asm:asm-tree:9.6", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.ow2.asm:asm-util:9.6", + "url": "https://maven.fabricmc.net/" + }, + { + "name": "org.quiltmc:quilt-config:1.3.1", + "url": "https://maven.quiltmc.org/repository/release/" + }, + { + "name": "org.quiltmc:quilt-loader:0.26.4", + "url": "https://maven.quiltmc.org/repository/release/" + }, + { + "name": "org.quiltmc:hashed:1.20.1", + "url": "https://maven.quiltmc.org/repository/release/" + }, + { + "name": "net.fabricmc:intermediary:1.20.1", + "url": "https://maven.fabricmc.net/" + } + ], + "releaseTime": "2023-06-12T13:25:51+00:00", + "time": "2026-09-15T06:42:41+00:00" +} \ No newline at end of file From df4625a7d60cfa10430ce198fa5437aafa14e505 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 01:02:06 +0200 Subject: [PATCH 2/9] Clarify explicit sharing and default UPnP preference --- docs/native-launcher.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/native-launcher.md b/docs/native-launcher.md index 41cf1081..1414ec9b 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -109,7 +109,7 @@ Launching starts a background dedicated server bound to `127.0.0.1`, waits for M Sharing requires all of the following: - A Microsoft-authenticated world session. Offline worlds use local authentication and remain loopback-only; sign in and relaunch before sharing. -- **Use UPnP when I explicitly share a world** enabled in Settings. This permission is off by default and does not itself start sharing. Turning it off releases existing owned mappings. +- **Use UPnP when I explicitly share a world** enabled in Settings. This option is on by default but does not itself start sharing; a separate explicit **Share** action is required. Turning it off releases existing owned mappings. - An explicit **Share** action or `--share` launch flag, plus a compatible gateway with a public IPv4 address. For sharing, AutoPlug opens a LAN TCP forwarding endpoint to the loopback server and requests a leased UPnP mapping. It reports the external address for friends to use. The Minecraft server itself remains bound to loopback. Closing the world removes the owned forwarding endpoint and mapping; AutoPlug does not overwrite or delete another application's mapping. From 59bed9880b9388fc99a6b9863016af7d05629a98 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 01:31:08 +0200 Subject: [PATCH 3/9] Document dashboard with fixture-rendered previews --- docs/images/native-launcher/profiles.png | Bin 0 -> 36490 bytes docs/images/native-launcher/settings.png | Bin 0 -> 49683 bytes docs/images/native-launcher/virtual-worlds.png | Bin 0 -> 39875 bytes docs/native-launcher.md | 16 ++++++++++++++++ 4 files changed, 16 insertions(+) create mode 100644 docs/images/native-launcher/profiles.png create mode 100644 docs/images/native-launcher/settings.png create mode 100644 docs/images/native-launcher/virtual-worlds.png diff --git a/docs/images/native-launcher/profiles.png b/docs/images/native-launcher/profiles.png new file mode 100644 index 0000000000000000000000000000000000000000..8122ac552f8f1752e52efdec6b5f5403d6fa3eb0 GIT binary patch literal 36490 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�~xslaJWiOU8o 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 aHWhd5`JzqhX!r%b{kwI4db#V=<$nQSfZUe= literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3e348ff63f15feaf423bef98d7d27926ee530d79 GIT binary patch literal 49683 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 aXZMI;^xfVkSI1P5m-CnTc*uF59{vMMRyouF literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/virtual-worlds.png b/docs/images/native-launcher/virtual-worlds.png new file mode 100644 index 0000000000000000000000000000000000000000..9c057791bea9dba3defbc2785ec463cc973d73af GIT binary patch literal 39875 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�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

KFE`mU-0TH(x@dP>h_V#-k!@$ItupX&w_ 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

WTI;{o5i-^dCx5 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 l<39rFKcxF#0RLIa{0j3@m@_8HMcr&_d$e}nQ#t Date: Sun, 4 Oct 2026 10:32:56 +0200 Subject: [PATCH 4/9] Refine dashboard theme and launch existing singleplayer saves --- docs/images/native-launcher/profiles.png | Bin 36490 -> 44264 bytes docs/images/native-launcher/settings.png | Bin 49683 -> 62760 bytes docs/images/native-launcher/worlds.png | Bin 0 -> 61547 bytes docs/native-launcher.md | 32 ++- .../client/browser/VanillaServersReader.java | 39 ++-- .../client/launcher/LaunchRequest.java | 13 ++ .../client/launcher/MinecraftLauncher.java | 24 +- .../client/profiles/LauncherCommands.java | 33 ++- .../client/profiles/LauncherServices.java | 53 ++++- .../autoplug/client/ui/DashboardPanel.java | 114 +++++++--- .../autoplug/client/ui/DashboardTheme.java | 138 ++++++++++++ .../autoplug/client/ui/LauncherActions.java | 11 +- .../client/worlds/LevelDatReader.java | 39 ++++ .../autoplug/client/worlds/LocalWorld.java | 18 ++ .../client/worlds/LocalWorldStore.java | 106 +++++++++ .../launcher/MinecraftLauncherTest.java | 31 +++ .../client/profiles/LauncherCommandsTest.java | 36 ++- .../profiles/LocalClientLifecycleTest.java | 69 ++++++ .../client/ui/DashboardPanelTest.java | 92 +++++++- .../client/worlds/LocalWorldStoreTest.java | 210 ++++++++++++++++++ 20 files changed, 977 insertions(+), 81 deletions(-) create mode 100644 docs/images/native-launcher/worlds.png create mode 100644 src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/LocalClientLifecycleTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java diff --git a/docs/images/native-launcher/profiles.png b/docs/images/native-launcher/profiles.png index 8122ac552f8f1752e52efdec6b5f5403d6fa3eb0..a01e9378b76eb1e8c2b37a3c9a3fce77877efc33 100644 GIT binary patch literal 44264 zcmbrm1z1&E_czJ`L<9*1K^jE5l#mXQkd|&xy1P>Zq(P-O4br_Ssf~1Zx5TDl(;ath z(D$74|K9uEd%w%`;In0|HP@VDj`;n?7;^``lNHB6BSb?$K){fAE24mafLwxrfW(f9 z2>j)FtMmi{!bb!Nk=IHtI$N_rnz-u8oafi~=c=7|dg`>bwKHRsGh-O&f0$QC{UA3N z2Ezh>JWEdxWcac8*#Zm;2D8LJFz7$55;~5CO;eyOt?LP2g;D=!V=JM$7V*xU%-`yt$Tttf7Pe0N8g-~xll?YQ{ z!{>^CQ1I^m{I-f^q0@-`S6*ZlEE@xR+U>G1{&<9+gB7n;QMG9tDt4u4v433NzC{T! z-s@(^+oQfO)%(-ppOMtZMYITW753?X_s@_P79YK5?MVrDQX<$@%yhpIayc27r z1H@G8eDzp-{QP_k$-HV?r=FYeb~qC&X*PrYeCmdl!9-VyVe1T^FNE3+n*&8lwt_no z-AD)@scSUWKxqud68Kc&3B@7YPYOlKzy>i5C&nA~wPnwXAyM3uF*~m< ztUcBF%VB^6XXz>e%}bsjpc@N*@6W(Y*#?YzP2O7dw)i@Ue|Zl^zZu8U7QGx|MT{kb z-|^8_3Ir^U45HJJLzaFlMsn#7d+?LI#%qm!F*fGWZwbV-oE}cUBcE{^IN%`l;6y+f zJbI)0sG&UcC-ipjN}dCA`Hc9XhsD->Z;uJ}rv^+j{w&iFnOX4mB~&j3u3q7yo+Q8h zb%CJvxF-1Y?`xT?TvuY`e%LQvMD5)5msG8%9>AYLXd7e%$rW-V3!^@2Kw3z~*~@04IKn?>gpDep=hhc8ZY?g>zOu41GZ&Ekg3{Q*B5~jo z7@R|%e>TnIN31-}tVILZBpJW}0_$?d@mjm?iK? z$t!?~-R|EPZA}23u;bm zc9&l0nkRzY^V%<)g!fwQbfaB?5iNXdhKt_VMR!B@D>{=ivUTb`IXU=cq7tm9-Iu$L zGz%?BmT)2+_=l%<=C1QV7qyrv@3!Agl6&v+n_1SCOtvl4kS@D&QU0A%(D~jO1gSH=RFW2s$X`)6P;J7!z`*&TQM~ zaOl>%SP;`Pc9jW2UucpuLTp5f%q&btXO;(tSG&kW{iVjO=+QaIIAJrx7GDG%c-He1 zhf?jLH(s*xRL&g`h|2X&pOEIMdb`pR-5TuXODS?KvNByrpz1}zwWVT6;x>Ea}``9F{N*T)P=u!@lqgp#L7*qy9%PFg48?neDXuf+ja8R4we9b;8HZYV7 zP2Zn5wYDD3($}ixaNC?qSsDg|=Bskg;c`L1(~l8~Q?%2Ol~A-tk7nuCg6L%CF{)PI z2$-10FrX`AsT*64>=Z28TPJ|pX{cN7*K17kN-=9+*|zIY)?S;AzgB;nu&J~{bq+Py zyrvw*G7Av&%!;A2)Tz}zXb$J+IigIO_puo-9iF!c+>hAzICtZ7x$GIIwm gho#v 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 TD70)oPz8ghtDnm{r-UW|IL&`Z literal 36490 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�~xslaJWiOU8o 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 aHWhd5`JzqhX!r%b{kwI4db#V=<$nQSfZUe= diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png index 3e348ff63f15feaf423bef98d7d27926ee530d79..8abd3935b730a72b73496e56de086557d97974f6 100644 GIT binary patch literal 62760 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 SmVgLw7!1XNex%aOE&jhg8DgOT literal 49683 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 aXZMI;^xfVkSI1P5m-CnTc*uF59{vMMRyouF diff --git a/docs/images/native-launcher/worlds.png b/docs/images/native-launcher/worlds.png new file mode 100644 index 0000000000000000000000000000000000000000..311b70198c123e00b54f34497a71c57486db61ca GIT binary patch literal 61547 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 YHI4Zr#;3Y#1s@1DTKF6>i>5VTK;5DumI5) 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 OmB*S`8B+|s68{71yzUPG literal 0 HcmV?d00001 diff --git a/docs/native-launcher.md b/docs/native-launcher.md index 45176553..11bb6c24 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -1,6 +1,6 @@ -# Native Minecraft launcher, profiles and virtual worlds +# Native Minecraft launcher, profiles and worlds -AutoPlug's desktop dashboard includes **Server Browser**, **Virtual Worlds**, **Profiles**, **Server Manager** and **Settings**. The launcher downloads Minecraft metadata, libraries, assets and loader components directly; it does not embed another launcher. The existing server wrapper and updater commands remain available. +AutoPlug's desktop dashboard includes **Server Browser**, **Worlds**, **Profiles**, **Server Manager** and **Settings**. The launcher downloads Minecraft metadata, libraries, assets and loader components directly; it does not embed another launcher. The existing server wrapper and updater commands remain available. Rounded translucent panels sit over an original block-landscape panorama, with colors adapted to the selected light or dark theme. AutoPlug targets Java 9 or later. Minecraft runs in a separate JVM selected from its version metadata. Settings supports Java 8, 17 and 21 executable overrides and additional `major=path` entries. If no matching runtime is configured or already installed, AutoPlug uses its Adoptium provider to download one. Runtime availability depends on the operating system and architecture. @@ -23,9 +23,9 @@ These previews render the actual Swing components with synthetic fixture data at ![Profiles dashboard with sample vanilla, Fabric and Paper profiles](images/native-launcher/profiles.png) -**Virtual Worlds:** separate saved worlds with local play, explicit sharing and EULA controls. +**Worlds:** existing singleplayer saves and separate managed server worlds in one place. Only managed server worlds expose sharing and server EULA controls. -![Virtual Worlds dashboard with two sample worlds](images/native-launcher/virtual-worlds.png) +![Worlds dashboard with fixture singleplayer saves and managed worlds](images/native-launcher/worlds.png) **Settings:** runtime overrides, default profile, sharing preference and account controls. @@ -104,9 +104,27 @@ Choose **Sign in with Microsoft**, then complete the displayed device-code instr Use the first command in a running AutoPlug console to keep sign-in within that session. A standalone command exits after sign-in, so a later independent JAR invocation needs either a new sign-in or the explicit `--remember` option. Offline names provide a local test identity; they do not authenticate to Microsoft-backed multiplayer servers. -## Virtual worlds and sharing +## Existing singleplayer saves -In **Virtual Worlds**, create a world with a server profile and a playable client profile. They must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available. +**Worlds** scans `saves/` in the standard Minecraft directory: `%APPDATA%/.minecraft` on Windows, `~/Library/Application Support/minecraft` on macOS, and `~/.minecraft` on Linux. It reads each save's `level.dat` for its name and recorded Minecraft version and uses `icon.png` when available. Refresh rescans the folder. Discovery does not copy, convert, rename or rewrite saves; malformed or linked entries are skipped with a diagnostic. + +Choose **Launch** on a singleplayer card to open the original save using Vanilla Minecraft and the account selected in Settings. The recorded game version is preserved, including the exact pre-release or release-candidate build. A save with no recorded version requires you to choose its original version explicitly; AutoPlug never chooses an upgrade automatically. Saves marked as modded must be opened using their original modded setup to preserve their contents. + +When the publisher's version metadata supports singleplayer Quick Play (Minecraft 1.20 and later), AutoPlug passes the save folder name directly to Minecraft. Older versions open the matching game and show instructions to choose the save from **Singleplayer**. Launching a save allows Minecraft to write its normal save, options and log files in the original game directory. Back up important saves before playing. AutoPlug serializes its launches in that shared directory and leaves Minecraft's own world locking in place. + +The CLI uses the same discovered IDs and version checks: + +```text +.mc worlds list +.mc worlds launch "local:My World" +.mc worlds launch "local:Older World" --version 1.12.2 +``` + +Use `--version` only to supply a missing original version; an override that differs from a save's recorded version is rejected. Singleplayer saves have no AutoPlug dedicated server, server EULA flag or UPnP sharing action. Leave the world or use **Open to LAN** from Minecraft's own menu. Quitting AutoPlug leaves these local games running so Minecraft can save and exit normally; close them from Minecraft itself. + +## Managed worlds and sharing + +In **Worlds**, create a managed world with a server profile and a playable client profile. They must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available. Read and accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for the world before launching it. AutoPlug does not silently accept it during profile creation or server installation. The CLI flag below records that explicit choice: @@ -158,7 +176,7 @@ The focused automated tests use provider fixtures, real local child JVMs, loopba From a checkout with Maven and a suitable JDK, run: ```text -mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,MinecraftLauncherTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test +mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,LauncherCommandsTest,LocalClientLifecycleTest,MinecraftLauncherTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,LocalWorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test mvn -DskipTests package ``` diff --git a/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java b/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java index 091431b5..23967928 100644 --- a/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java +++ b/src/main/java/com/osiris/autoplug/client/browser/VanillaServersReader.java @@ -12,28 +12,36 @@ public final class VanillaServersReader { public List read(Path file) throws IOException { if (!Files.exists(file)) return Collections.emptyList(); - if (Files.size(file) > MAX_BYTES) throw new IOException("servers.dat exceeds the 16 MiB import limit."); + Map root = readCompound(file); + List result = new ArrayList<>(); + Object servers = root.get("servers"); + if (!(servers instanceof List)) return result; + for (Object value : (List) servers) { + if (!(value instanceof Map)) continue; + Map entry = (Map) value; + if (!(entry.get("ip") instanceof String)) continue; + try { + result.add(new SavedServer(entry.get("name") instanceof String ? (String) entry.get("name") : "", (String) entry.get("ip"))); + } catch (IllegalArgumentException ignored) { /* An invalid favorite must not hide valid entries. */ } + } + return result; + } + + /** Shared bounded decoder for servers.dat and read-only local level.dat metadata. */ + @SuppressWarnings("unchecked") + public Map readCompound(Path file) throws IOException { + if (Files.size(file) > MAX_BYTES) throw new IOException("NBT file exceeds the 16 MiB import limit."); try (BufferedInputStream raw = new BufferedInputStream(Files.newInputStream(file))) { raw.mark(2); int first = raw.read(), second = raw.read(); raw.reset(); InputStream decoded = first == 0x1f && second == 0x8b ? new GZIPInputStream(raw) : raw; try (DataInputStream input = new DataInputStream(new LimitedStream(decoded))) { - if (input.readUnsignedByte() != 10) throw new IOException("servers.dat must contain an NBT compound."); + if (input.readUnsignedByte() != 10) throw new IOException("NBT file must contain a compound."); input.readUTF(); - Object root = readValue(input, 10, 0, new int[]{100000}); - List result = new ArrayList<>(); - Object servers = ((Map) root).get("servers"); - if (!(servers instanceof List)) return result; - for (Object value : (List) servers) { - if (!(value instanceof Map)) continue; - Map entry = (Map) value; - if (!(entry.get("ip") instanceof String)) continue; - try { - result.add(new SavedServer(entry.get("name") instanceof String ? (String) entry.get("name") : "", (String) entry.get("ip"))); - } catch (IllegalArgumentException ignored) { /* An invalid favorite must not hide valid entries. */ } - } - return result; + Map root = (Map) readValue(input, 10, 0, new int[]{100000}); + if (input.read() != -1) throw new IOException("Trailing data in NBT file."); + return root; } } } @@ -63,6 +71,7 @@ private Object readValue(DataInputStream input, int type, int depth, int[] budge if (child == 0) return compound; if (i == MAX_ITEMS) throw new IOException("Too many NBT compound entries."); String name = input.readUTF(); + if (compound.containsKey(name)) throw new IOException("Duplicate NBT compound entry: " + name); compound.put(name, readValue(input, child, depth + 1, budget)); } throw new IOException("Invalid NBT compound."); diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java index df1c5a27..ff81435a 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java @@ -14,9 +14,15 @@ public final class LaunchRequest { public final MinecraftAccount account; public final String serverHost; public final int serverPort; + public final String singleplayerWorld; public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, MinecraftAccount account, String serverHost, int serverPort) { + this(gameDir, version, loader, loaderVersion, account, serverHost, serverPort, null); + } + + public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, + MinecraftAccount account, String serverHost, int serverPort, String singleplayerWorld) { this.gameDir = Objects.requireNonNull(gameDir, "gameDir").toAbsolutePath().normalize(); this.version = safeVersion(version); this.loader = loader == null ? "VANILLA" : loader.toUpperCase(Locale.ROOT); @@ -30,6 +36,13 @@ public LaunchRequest(Path gameDir, String version, String loader, String loaderV if (this.serverHost != null && (this.serverHost.contains("\n") || this.serverHost.contains("\r"))) throw new IllegalArgumentException("Invalid server address."); this.serverPort = serverPort; + if (singleplayerWorld != null && (singleplayerWorld.isEmpty() || singleplayerWorld.equals(".") || singleplayerWorld.equals("..") + || singleplayerWorld.indexOf('/') >= 0 || singleplayerWorld.indexOf('\\') >= 0 || singleplayerWorld.indexOf(':') >= 0 + || singleplayerWorld.chars().anyMatch(Character::isISOControl))) + throw new IllegalArgumentException("Singleplayer world must be a save directory name."); + if (singleplayerWorld != null && this.serverHost != null) + throw new IllegalArgumentException("Choose either a local world or a multiplayer server."); + this.singleplayerWorld = singleplayerWorld; } static String safeVersion(String value) { diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java index 1d7bf205..d1892516 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java @@ -64,6 +64,8 @@ public synchronized PreparedLaunch prepare(LaunchRequest request, Consumer args = buildArguments(metadata, request, classpath, natives, assets, assetId, logging); + if (request.singleplayerWorld != null && !args.contains("--quickPlaySingleplayer")) + log.accept("Minecraft " + request.version + " has no supported singleplayer Quick Play argument. Select '" + request.singleplayerWorld + "' manually in Singleplayer."); log.accept("Minecraft " + id + " is ready (Java " + major + ")"); return new PreparedLaunch(java, request.gameDir, args, id, major); } @@ -305,16 +307,19 @@ static List buildArguments(JsonObject metadata, LaunchRequest request, L values.put("game_assets", assets.resolve("virtual").resolve(assetId).toString()); List classpathStrings = new ArrayList<>(); for (Path path : classpath) classpathStrings.add(path.toString()); values.put("classpath", String.join(File.pathSeparator, classpathStrings)); - boolean quickPlay = request.serverHost != null && metadata.has("arguments") - && metadata.getAsJsonObject("arguments").toString().contains("${quickPlayMultiplayer}"); + boolean quickPlay = request.serverHost != null && supportsQuickPlay(metadata, "${quickPlayMultiplayer}"); + boolean quickSingleplayer = request.singleplayerWorld != null && supportsQuickPlay(metadata, "${quickPlaySingleplayer}"); Map features = new HashMap<>(); features.put("is_quick_play_multiplayer", quickPlay); - features.put("has_quick_plays_support", quickPlay); + features.put("is_quick_play_singleplayer", quickSingleplayer); + features.put("has_quick_plays_support", quickPlay || quickSingleplayer); + if (quickSingleplayer) values.put("quickPlaySingleplayer", request.singleplayerWorld); if (quickPlay) { String host = request.serverHost.contains(":") && !request.serverHost.startsWith("[") ? "[" + request.serverHost + "]" : request.serverHost; values.put("quickPlayMultiplayer", host + ":" + request.serverPort); - values.put("quickPlayPath", request.gameDir.resolve("logs").resolve("quick-play.json").toString()); } + if (quickPlay || quickSingleplayer) + values.put("quickPlayPath", request.gameDir.resolve("logs").resolve("quick-play.json").toString()); List args = new ArrayList<>(); args.add("-Xmx2G"); if (metadata.has("arguments") && metadata.getAsJsonObject("arguments").has("jvm")) @@ -339,6 +344,17 @@ else if (metadata.has("minecraftArguments")) { } return args; } + private static boolean supportsQuickPlay(JsonObject metadata, String placeholder) { + if (!metadata.has("arguments") || !metadata.getAsJsonObject("arguments").has("game")) return false; + for (JsonElement argument : metadata.getAsJsonObject("arguments").getAsJsonArray("game")) { + JsonElement value = argument.isJsonPrimitive() ? argument : argument.getAsJsonObject().get("value"); + if (value == null) continue; + if (value.isJsonPrimitive() && placeholder.equals(value.getAsString())) return true; + if (value.isJsonArray()) for (JsonElement element : value.getAsJsonArray()) + if (element.isJsonPrimitive() && placeholder.equals(element.getAsString())) return true; + } + return false; + } private static void expand(JsonArray array, Map values, Map features, List output) throws IOException { for (JsonElement item : array) { if (item.isJsonPrimitive()) output.add(substitute(item.getAsString(), values)); diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java index 623db4c6..4acd4aae 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java @@ -97,19 +97,42 @@ else if (args.get(2).equals("microsoft")) { private void worlds(List args) throws Exception { String action = at(args, 2, "Use .mc worlds list/create/launch/share/stop"); switch (action) { - case "list": for (LauncherActions.WorldInfo w : services.worlds()) output.accept(w.id + " | " + w.name + " | " + (w.running ? "running" : "stopped")); break; + case "list": for (LauncherActions.WorldInfo w : services.worlds()) output.accept(w.id + " | " + w.name + " | " + + (w.local ? "singleplayer | " + (w.gameVersion.isEmpty() ? "version unknown" : w.gameVersion) : "managed server") + + " | " + (w.running ? "running" : "stopped")); break; case "create": LauncherActions.WorldInfo w = services.createWorld(at(args, 3, "Name required"), at(args, 4, "Server profile id required"), at(args, 5, "Client profile id required")); if (args.contains("--accept-eula")) services.setWorldEulaAccepted(w.id, true); output.accept("Created world " + w.id + (args.contains("--accept-eula") ? "" : "; EULA acceptance required before launch (https://aka.ms/MinecraftEULA).")); break; case "launch": - String id = at(args, 3, "World id required"); if (args.contains("--accept-eula")) services.setWorldEulaAccepted(id, true); - services.launchWorld(id, args.contains("--share")); break; - case "share": output.accept(services.shareWorld(at(args, 3, "World id required"))); break; - case "stop": services.getWorldService().stopWorld(at(args, 3, "World id required")); break; + String id = at(args, 3, "World id required"); + LauncherActions.WorldInfo selected = world(id); + if (selected.local) { + if (args.contains("--share") || args.contains("--accept-eula")) + throw new IOException("Singleplayer saves do not use AutoPlug server sharing or server EULA flags."); + String version = option(args, "--version", selected.gameVersion); + require(version, "This save has no recorded version. Use --version ; no upgrade is selected automatically."); + output.accept(services.launchLocalWorld(id, version)); + } else { + if (args.contains("--version")) throw new IOException("Managed worlds use their attached profiles; --version is for singleplayer saves."); + if (args.contains("--accept-eula")) services.setWorldEulaAccepted(id, true); + services.launchWorld(id, args.contains("--share")); + } + break; + case "share": output.accept(services.shareWorld(managedWorld(at(args, 3, "World id required")).id)); break; + case "stop": services.getWorldService().stopWorld(managedWorld(at(args, 3, "World id required")).id); break; default: throw new IOException("Unknown world action"); } } + private LauncherActions.WorldInfo world(String id) throws Exception { + for (LauncherActions.WorldInfo world : services.worlds()) if (world.id.equals(id)) return world; + throw new IOException("World not found: " + id); + } + private LauncherActions.WorldInfo managedWorld(String id) throws Exception { + LauncherActions.WorldInfo world = world(id); + if (world.local) throw new IOException("This is a singleplayer save. Use Minecraft's menu to leave it or open it to LAN."); + return world; + } public String help() { return ".profiles list/create/clone/delete/template/add; .check|.update mods|plugins --profile ; " + ".mc launch [--server host[:port]]; .mc servers list/import/add; " diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java index 3a2404e8..460b735f 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java @@ -22,6 +22,7 @@ public class State { private final ProfileStore profiles; private final ProfileUpdates updates; private final WorldStore worlds; + private final LocalWorldStore localWorlds; private final WorldService worldService; private final ServerBrowserService servers; private final JavaRuntimeManager runtimes; @@ -29,6 +30,7 @@ public class State { private final AccountStore accounts; private final MicrosoftAccountService microsoft = new MicrosoftAccountService(); private final Map clients = new ConcurrentHashMap<>(); + private final Map localClients = new ConcurrentHashMap<>(); private final Map plans = new ConcurrentHashMap<>(); private final JsonFiles json = new JsonFiles(); private State state; @@ -38,10 +40,15 @@ public class State { private final ThreadLocal worldAccount = new ThreadLocal<>(); public LauncherServices(Path root, Consumer progress) throws Exception { + this(root, LocalWorldStore.defaultMinecraftDirectory(), progress); + } + /** An explicit Minecraft directory keeps local-save discovery testable without touching user saves. */ + public LauncherServices(Path root, Path minecraftDirectory, Consumer progress) throws Exception { this.root = root.toAbsolutePath().normalize(); this.progress = progress == null ? ignored -> { } : progress; Files.createDirectories(this.root); profiles = new ProfileStore(this.root.resolve("profiles")); updates = new ProfileUpdates(profiles); worlds = new WorldStore(this.root.resolve("worlds")); + localWorlds = new LocalWorldStore(minecraftDirectory, this.progress); runtimes = new JavaRuntimeManager(this.root.resolve("cache/runtimes")); launcher = new MinecraftLauncher(this.root.resolve("cache"), runtimes); accounts = new AccountStore(this.root.resolve("accounts.json")); @@ -52,7 +59,7 @@ public LauncherServices(Path root, Consumer progress) throws Exception { if (state.settings.rememberAccount) for (MinecraftAccount saved : accounts.list()) if (saved.uuid.equals(state.selectedAccount)) account = saved; if (!state.settings.rememberAccount) forgetStoredAccounts(); applyRuntimeSettings(state.settings); - servers = new ServerBrowserService(this.root.resolve("servers.json"), ServerBrowserService.defaults().vanillaFile()); + servers = new ServerBrowserService(this.root.resolve("servers.json"), minecraftDirectory.resolve("servers.dat")); MinecraftServerInstaller installer = new MinecraftServerInstaller(profiles.getCache(), version -> runtimes.resolve(launcher.requiredJavaMajor(version, this.progress), this.progress), this.progress, (profile, directory) -> { @@ -114,7 +121,45 @@ public void addArtifact(String id, Path source, String modrinthId) throws Except addArtifact(id, Paths.get(source), modrinthId == null || modrinthId.trim().isEmpty() ? null : modrinthId.trim()); } @Override public List worlds() throws Exception { - List result = new ArrayList<>(); for (VirtualWorld w : worlds.list()) result.add(info(w)); return result; + List result = new ArrayList<>(); + try { + for (LocalWorld world : localWorlds.list()) result.add(new WorldInfo(world.id, world.name, "", "", world.directory.toString(), + world.icon == null ? null : world.icon.toString(), localClients.containsKey(world.id), true, world.gameVersion)); + } catch (IOException | SecurityException e) { + progress.accept("Could not list local Minecraft saves: " + e.getMessage()); + } + for (VirtualWorld w : worlds.list()) result.add(info(w)); + return result; + } + @Override public String launchLocalWorld(String id, String version) throws Exception { + LocalWorld world = localWorlds.get(id); + String selected = localWorlds.launchVersion(world, version); + // All standard saves share one game directory and its settings/native files. + // Retain one lease for that directory until the child exits, including preparation failures. + ProfileLease lease = new ProfileLease(world.gameDirectory); + try { + MinecraftAccount current = currentAccount(); + PreparedLaunch prepared = launcher.prepare(new LaunchRequest(world.gameDirectory, selected, "VANILLA", null, + current, null, 0, world.saveName()), progress); + LocalWorld fresh = localWorlds.get(id); + if (!fresh.gameVersion.equals(world.gameVersion) || fresh.modded != world.modded) + throw new IOException("The save's version metadata changed while preparing Minecraft. Refresh and select it again."); + localWorlds.launchVersion(fresh, selected); + Process process = launcher.launch(prepared); trackLocalClient(id, process, lease); + if (prepared.arguments.contains("--quickPlaySingleplayer")) + return "Started Minecraft " + selected + " with Quick Play for '" + world.name + "'."; + return "Started Minecraft " + selected + ". This version does not support direct world launch; choose '" + world.name + + "' (folder " + world.saveName() + ") from Singleplayer."; + } catch (Exception e) { lease.close(); throw e; } + } + /** Existing saves must be closed from Minecraft so its integrated server can save normally. */ + void trackLocalClient(String id, Process process, ProfileLease lease) { + localClients.put(id, process); + process.onExit().thenRun(() -> { + localClients.remove(id, process); + try { lease.close(); } + catch (IOException e) { progress.accept("Could not release local Minecraft lock: " + e.getMessage()); } + }); } @Override public WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { Profile server = profiles.get(serverProfileId), client = profiles.get(clientProfileId); @@ -214,10 +259,12 @@ private WorldInfo info(VirtualWorld w) throws IOException { return new WorldInfo(w.id, w.name, w.serverProfileId, w.clientProfileId, worlds.getDirectory(w.id).toString(), w.thumbnail, running); } public void waitForSessions() throws InterruptedException { - while (!clients.isEmpty() || !worldService.activeSessions().isEmpty()) Thread.sleep(250); + while (!clients.isEmpty() || !localClients.isEmpty() || !worldService.activeSessions().isEmpty()) Thread.sleep(250); } @Override public void close() { worldService.close(); for (Process process : clients.values()) if (process.isAlive()) process.destroy(); + // Never destroy localClients: abrupt termination can corrupt an original user's save. + // Their exit callbacks retain/release the lease while this launcher JVM remains alive. } } diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java index 2816b573..370c7610 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -17,6 +17,8 @@ /** Five-view Swing dashboard. Network, launcher and disk operations never run on the EDT. */ public final class DashboardPanel extends JPanel implements AutoCloseable { + // FlatLaf caches shared borders when the first controls are created. + { DashboardTheme.installDefaults(); } private final LauncherActions actions; private final ServerBrowserService browser; private final ExecutorService workers = Executors.newFixedThreadPool(4, runnable -> { @@ -57,33 +59,40 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boolean includeLegacyControls) { super(new BorderLayout(0, 0)); this.actions = Objects.requireNonNull(actions); this.browser = Objects.requireNonNull(browser); + setBorder(new EmptyBorder(12, 12, 10, 12)); pages.setOpaque(false); setPreferredSize(new Dimension(1100, 720)); - JPanel navigation = new JPanel(); navigation.setLayout(new BoxLayout(navigation, BoxLayout.Y_AXIS)); + JPanel navigation = DashboardTheme.surface(null, 16); navigation.setLayout(new BoxLayout(navigation, BoxLayout.Y_AXIS)); navigation.setBorder(new EmptyBorder(24, 16, 20, 16)); navigation.setPreferredSize(new Dimension(195, 600)); JLabel brand = new JLabel("AutoPlug"); brand.setFont(brand.getFont().deriveFont(Font.BOLD, 25f)); navigation.add(brand); navigation.add(Box.createVerticalStrut(5)); JLabel subtitle = new JLabel("PLAY · MANAGE · SHARE"); subtitle.setFont(subtitle.getFont().deriveFont(10f)); navigation.add(subtitle); navigation.add(Box.createVerticalStrut(30)); ButtonGroup group = new ButtonGroup(); - String[] names = {"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}; + String[] names = {"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}; JPanel[] views = {serverPage(), worldsPage(), profilesPage(), managerPage(includeLegacyControls), settingsPage()}; for (int i = 0; i < names.length; i++) { String name = names[i]; pages.add(views[i], name); JToggleButton button = new JToggleButton(name); button.setHorizontalAlignment(SwingConstants.LEFT); button.setPreferredSize(new Dimension(170, 43)); button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 43)); button.setAlignmentX(Component.LEFT_ALIGNMENT); - button.addActionListener(e -> { cards.show(pages, name); if (name.equals("Virtual Worlds")) refreshWorlds(); }); + button.addActionListener(e -> { cards.show(pages, name); if (name.equals("Worlds")) refreshWorlds(); }); group.add(button); navigation.add(button); navigation.add(Box.createVerticalStrut(8)); if (i == 0) button.setSelected(true); } navigation.add(Box.createVerticalGlue()); JLabel footer = new JLabel("Your worlds. Your profiles."); footer.setFont(footer.getFont().deriveFont(11f)); navigation.add(footer); add(navigation, BorderLayout.WEST); add(pages, BorderLayout.CENTER); - status.setBorder(new EmptyBorder(8, 16, 8, 16)); add(status, BorderLayout.SOUTH); + JPanel statusBar = DashboardTheme.surface(new BorderLayout(), 8); + statusBar.add(status, BorderLayout.CENTER); add(statusBar, BorderLayout.SOUTH); refreshProfiles(); refreshWorlds(); refreshSettings(); run("Importing Minecraft favorites", () -> { browser.importVanilla(); return browser.list(); }, this::showServers); } + @Override protected void paintComponent(Graphics graphics) { + super.paintComponent(graphics); DashboardTheme.landscape(graphics, getWidth(), getHeight()); + } + @Override public void updateUI() { super.updateUI(); DashboardTheme.refreshColors(this); } + private JPanel serverPage() { JPanel page = page("Server Browser", "Your Minecraft favorites, with live status and matching local profiles."); JPanel content = content(); @@ -216,8 +225,8 @@ private JPanel profilesPage() { content.add(toolbar(typeFilter, button("Create", this::createProfile), button("Clone / migrate", () -> cloneProfile(selectedProfile(), null)), button("Check", () -> checkOrUpdate(false)), button("Update", () -> checkOrUpdate(true)), button("Refresh", this::refreshProfiles)), BorderLayout.NORTH); content.add(tableScroll(profileTable), BorderLayout.CENTER); - JPanel bottom = new JPanel(new BorderLayout(0, 8)); - bottom.setBorder(new EmptyBorder(12, 0, 0, 0)); bottom.add(new JScrollPane(profileDetails), BorderLayout.CENTER); + JPanel bottom = DashboardTheme.transparent(new BorderLayout(0, 8)); + bottom.setBorder(new EmptyBorder(12, 0, 0, 0)); bottom.add(DashboardTheme.scroll(profileDetails), BorderLayout.CENTER); bottom.add(toolbar(button("Launch client", () -> { ProfileInfo profile = selectedProfile(); if (!ready(profile)) return; if (!"MODS".equalsIgnoreCase(profile.type)) { information("Client profiles", "Choose a MODS profile to launch the Minecraft client."); return; } @@ -318,13 +327,18 @@ private List clientProfiles() { } private JPanel worldsPage() { - JPanel page = page("Virtual Worlds", "Singleplayer worlds powered by their own local dedicated server."); - JPanel content = content(); content.add(toolbar(button("Create world", this::createWorld), button("Refresh", this::refreshWorlds)), BorderLayout.NORTH); + JPanel page = page("Worlds", "Your Minecraft saves and managed worlds, together in one place."); + JPanel content = DashboardTheme.transparent(new BorderLayout(0, 12)); + JPanel controls = DashboardTheme.surface(new BorderLayout(), 8); + controls.add(toolbar(button("Create world", this::createWorld), button("Refresh", this::refreshWorlds))); + content.add(controls, BorderLayout.NORTH); worldCards.setLayout(new BoxLayout(worldCards, BoxLayout.Y_AXIS)); - JScrollPane scroll = new JScrollPane(worldCards); scroll.setBorder(null); scroll.getVerticalScrollBar().setUnitIncrement(16); + worldCards.setOpaque(false); + JScrollPane scroll = DashboardTheme.scroll(worldCards); content.add(scroll, BorderLayout.CENTER); - JLabel note = new JLabel("Local play stays on your PC. Sharing is optional and always requires confirmation."); - note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; + JPanel note = DashboardTheme.surface(new BorderLayout(), 12); + note.add(new JLabel("Singleplayer opens your original save. Managed worlds support optional sharing.")); + content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; } private void createWorld() { List serverProfiles = new ArrayList<>(); @@ -334,7 +348,7 @@ private void createWorld() { JTextField name = new JTextField(); JComboBox server = new JComboBox<>(serverProfiles.toArray(new ProfileInfo[0])); JComboBox client = new JComboBox<>(clientProfiles.toArray(new ProfileInfo[0])); JCheckBox eula = new JCheckBox("I accept the Minecraft EULA"); - if (!form("Create virtual world", fields("World name", name, "Server profile", server, "Client profile", client, "Minecraft EULA", toolbar(eula, button("Read EULA", this::openEula))))) return; + if (!form("Create managed world", fields("World name", name, "Server profile", server, "Client profile", client, "Minecraft EULA", toolbar(eula, button("Read EULA", this::openEula))))) return; if (!required(name)) return; ProfileInfo serverProfile = (ProfileInfo) server.getSelectedItem(), clientProfile = (ProfileInfo) client.getSelectedItem(); if (serverProfile == null || clientProfile == null) return; @@ -349,26 +363,39 @@ private void createWorld() { private void showWorlds() { worldCards.removeAll(); if (worlds.isEmpty()) { - JPanel empty = new JPanel(new BorderLayout()); empty.setBorder(new EmptyBorder(60, 24, 60, 24)); + JPanel empty = DashboardTheme.surface(new BorderLayout(0, 12), 24); empty.setBorder(new EmptyBorder(60, 24, 60, 24)); JLabel title = new JLabel("A world of your own", SwingConstants.CENTER); title.setFont(title.getFont().deriveFont(Font.BOLD, 22f)); - empty.add(title, BorderLayout.NORTH); empty.add(new JLabel("Create a world from a server pack and a matching client profile.", SwingConstants.CENTER), BorderLayout.CENTER); + empty.add(title, BorderLayout.NORTH); empty.add(new JLabel("Minecraft saves appear here automatically, or create a managed world.", SwingConstants.CENTER), BorderLayout.CENTER); worldCards.add(empty); } for (WorldInfo world : worlds) { - JPanel card = new JPanel(new BorderLayout(18, 8)); card.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(UIManager.getColor("Separator.foreground")), new EmptyBorder(16, 16, 16, 16))); - card.setMaximumSize(new Dimension(Integer.MAX_VALUE, 160)); - JLabel image = new JLabel("WORLD", SwingConstants.CENTER); image.setOpaque(true); image.setBackground(new Color(0x284C40)); image.setForeground(Color.WHITE); image.setPreferredSize(new Dimension(105, 95)); + JPanel card = DashboardTheme.surface(new BorderLayout(18, 8), 16); + card.setName("world-" + world.id); card.setAlignmentX(Component.LEFT_ALIGNMENT); + card.setMaximumSize(new Dimension(Integer.MAX_VALUE, 180)); + JLabel image = DashboardTheme.worldThumbnail(); image.setToolTipText(world.name); if (world.thumbnail != null && !world.thumbnail.isEmpty()) run("Loading world thumbnail", () -> { File file = new File(world.thumbnail); if (!file.isFile() || file.length() > 8 * 1024 * 1024) return null; java.awt.image.BufferedImage bitmap = javax.imageio.ImageIO.read(file); - if (bitmap == null) return null; return new ImageIcon(bitmap.getScaledInstance(105, 95, Image.SCALE_SMOOTH)); + if (bitmap == null) return null; + double scale = 96.0 / Math.max(bitmap.getWidth(), bitmap.getHeight()); + return new ImageIcon(bitmap.getScaledInstance(Math.max(1, (int) (bitmap.getWidth() * scale)), Math.max(1, (int) (bitmap.getHeight() * scale)), Image.SCALE_SMOOTH)); }, icon -> { if (icon != null) { image.setText(""); image.setIcon(icon); } }); - card.add(image, BorderLayout.WEST); - JPanel details = new JPanel(new BorderLayout(0, 6)); JLabel name = new JLabel(world.name + (world.running ? " • Running" : "")); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); - details.add(name, BorderLayout.NORTH); JTextArea description = textArea(2); - description.setText("Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId) + "\n" + world.directory); + JPanel thumbnail = DashboardTheme.transparent(new GridBagLayout()); thumbnail.add(image); + card.add(thumbnail, BorderLayout.WEST); + JPanel details = DashboardTheme.transparent(new BorderLayout(0, 6)); + JPanel heading = DashboardTheme.transparent(new BorderLayout(0, 4)); + JLabel kind = new JLabel(world.local ? "Singleplayer" : "Managed world" + (world.running ? " · Running" : "")); + DashboardTheme.tint(kind, true); kind.setFont(kind.getFont().deriveFont(Font.BOLD, 11f)); + JLabel name = new JLabel(world.name); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); + name.putClientProperty("html.disable", Boolean.TRUE); + heading.add(kind, BorderLayout.NORTH); heading.add(name, BorderLayout.CENTER); + details.add(heading, BorderLayout.NORTH); JTextArea description = textArea(2); + DashboardTheme.tint(description, false); + description.setText((world.local ? "Minecraft " + (knownWorldVersion(world) ? world.gameVersion : "version unknown — choose before launch") + : "Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId)) + "\n" + world.directory); details.add(description, BorderLayout.CENTER); - details.add(toolbar(button("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), + if (world.local) details.add(toolbar(button("Launch", () -> launchLocalWorld(world)), button("Open folder", () -> openFolder(world.directory))), BorderLayout.SOUTH); + else details.add(toolbar(button("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), button("Share", () -> { if (!confirm("Share this world", "Share “" + world.name + "” beyond this PC?\nThis may open a router port using UPnP and expose the server to the internet.\nOnly share the join address with people you trust.")) return; run("Preparing world sharing", () -> { @@ -384,6 +411,23 @@ private void showWorlds() { } worldCards.add(Box.createVerticalGlue()); worldCards.revalidate(); worldCards.repaint(); } + + private static boolean knownWorldVersion(WorldInfo world) { return world.gameVersion != null && !world.gameVersion.trim().isEmpty(); } + private void launchLocalWorld(WorldInfo world) { + String version = world.gameVersion; + if (!knownWorldVersion(world)) { + JTextField choice = new JTextField(); + JTextArea explanation = textArea(3); + explanation.setText("This save has no recorded Minecraft version. Enter the version you last used for it. Choose carefully: opening a save in another version can upgrade or damage it. Back up the save first."); + JPanel prompt = new JPanel(new BorderLayout(0, 12)); prompt.add(explanation, BorderLayout.NORTH); + prompt.add(fields("Minecraft version", choice), BorderLayout.CENTER); + if (!form("Choose this save's existing version", prompt) || !required(choice)) return; + version = choice.getText().trim(); + } + final String selectedVersion = version; + run("Launching " + world.name + " with Minecraft " + selectedVersion, + () -> actions.launchLocalWorld(world.id, selectedVersion), result -> { status.setText(result); status.setToolTipText(result); }); + } private String profileName(String id) { for (ProfileInfo profile : profiles) if (profile.id.equals(id)) return profile.name; return id; } private void showShare(String text) { JTextArea area = textArea(6); area.setText(text); JPanel panel = new JPanel(new BorderLayout(0, 8)); panel.add(new JScrollPane(area)); @@ -418,7 +462,7 @@ private JButton commandButton(String label, String command) { private JPanel settingsPage() { JPanel page = page("Settings", "Runtime choices, default profiles, local networking and Minecraft accounts."); - JPanel content = new JPanel(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); + JPanel content = DashboardTheme.surface(null, 18); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); JLabel runtime = section("Java runtimes"); content.add(runtime); content.add(fields("Java 8 executable", java8, "Java 17 executable", java17, "Java 21 executable", java21, "Other runtimes (major=path; …)", extraJava)); @@ -443,7 +487,7 @@ private JPanel settingsPage() { }))); JTextArea note = textArea(3); note.setText("Offline mode is for local/offline-enabled play. Online servers usually require a licensed Microsoft account.\nUPnP is used only after you explicitly choose Share; unsupported routers need manual forwarding or a tunnel."); note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note); content.add(Box.createVerticalGlue()); - JScrollPane scroll = new JScrollPane(content); scroll.setBorder(null); scroll.getVerticalScrollBar().setUnitIncrement(16); page.add(scroll, BorderLayout.CENTER); return page; + page.add(DashboardTheme.scroll(content), BorderLayout.CENTER); return page; } private void refreshSettings() { run("Loading settings", actions::settings, this::showSettings); } private void showSettings(SettingsInfo settings) { @@ -499,14 +543,14 @@ private void run(String description, Callable work, Consumer success) private static JComboBox loaders(String selected) { JComboBox result = new JComboBox<>(new String[]{"VANILLA", "FABRIC", "QUILT", "FORGE", "NEOFORGE", "PAPER", "SPIGOT", "PURPUR"}); result.setSelectedItem(selected); return result; } private static JLabel section(String title) { JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 16f)); label.setBorder(new EmptyBorder(0, 0, 10, 0)); label.setAlignmentX(Component.LEFT_ALIGNMENT); return label; } private static JPanel page(String title, String description) { - JPanel page = new JPanel(new BorderLayout(0, 22)); page.setBorder(new EmptyBorder(26, 22, 16, 22)); - JPanel heading = new JPanel(new BorderLayout(0, 7)); JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 27f)); - heading.add(label, BorderLayout.NORTH); JLabel subtitle = new JLabel(description); subtitle.setFont(subtitle.getFont().deriveFont(12f)); heading.add(subtitle, BorderLayout.SOUTH); page.add(heading, BorderLayout.NORTH); return page; - } - private static JPanel content() { return new JPanel(new BorderLayout(0, 12)); } - private static JPanel toolbar(JComponent... components) { JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 6, 3)); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } - private static JButton button(String text, Runnable action) { JButton button = new JButton(text); button.addActionListener(e -> action.run()); return button; } - private static JTextArea textArea(int rows) { JTextArea area = new JTextArea(rows, 30); area.setEditable(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setFont(UIManager.getFont("Label.font")); return area; } + JPanel page = DashboardTheme.transparent(new BorderLayout(0, 16)); page.setBorder(new EmptyBorder(0, 18, 12, 0)); + JPanel heading = DashboardTheme.surface(new BorderLayout(0, 7), 18); JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 27f)); + heading.add(label, BorderLayout.NORTH); JLabel subtitle = new JLabel(description); DashboardTheme.tint(subtitle, false); subtitle.setFont(subtitle.getFont().deriveFont(12f)); heading.add(subtitle, BorderLayout.SOUTH); page.add(heading, BorderLayout.NORTH); return page; + } + private static JPanel content() { return DashboardTheme.surface(new BorderLayout(0, 12), 16); } + private static JPanel toolbar(JComponent... components) { JPanel panel = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 6, 3)); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } + private static JButton button(String text, Runnable action) { JButton button = new JButton(text); button.setMargin(new Insets(6, 14, 6, 14)); button.addActionListener(e -> action.run()); return button; } + private static JTextArea textArea(int rows) { JTextArea area = new JTextArea(rows, 30); area.setEditable(false); area.setOpaque(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setFont(UIManager.getFont("Label.font")); return area; } private static DefaultTableModel model(String... columns) { return new DefaultTableModel(columns, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; } private static JTable table(DefaultTableModel model) { JTable table = new JTable(model); table.setRowHeight(35); table.setFillsViewportHeight(true); @@ -515,9 +559,9 @@ private static JTable table(DefaultTableModel model) { text.putClientProperty("html.disable", Boolean.TRUE); table.setDefaultRenderer(Object.class, text); return table; } - private static JScrollPane tableScroll(JTable table) { JScrollPane scroll = new JScrollPane(table); scroll.setColumnHeaderView(table.getTableHeader()); return scroll; } + private static JScrollPane tableScroll(JTable table) { JScrollPane scroll = DashboardTheme.scroll(table); scroll.setColumnHeaderView(table.getTableHeader()); return scroll; } private static JPanel fields(Object... fields) { - JPanel panel = new JPanel(new GridBagLayout()); panel.setAlignmentX(Component.LEFT_ALIGNMENT); + JPanel panel = DashboardTheme.transparent(new GridBagLayout()); panel.setAlignmentX(Component.LEFT_ALIGNMENT); for (int i = 0; i < fields.length; i += 2) { GridBagConstraints label = new GridBagConstraints(); label.gridx = 0; label.gridy = i / 2; label.anchor = GridBagConstraints.WEST; label.insets = new Insets(5, 0, 5, 14); panel.add(new JLabel(String.valueOf(fields[i])), label); diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java new file mode 100644 index 00000000..0a55f6e1 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java @@ -0,0 +1,138 @@ +package com.osiris.autoplug.client.ui; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; + +/** Original, resolution-independent block landscape and translucent dashboard surfaces. */ +final class DashboardTheme { + static final int ARC = 16; + + private DashboardTheme() {} + + static void installDefaults() { + UIManager.put("Button.arc", ARC); + UIManager.put("Component.arc", ARC); + UIManager.put("TextComponent.arc", ARC); + UIManager.put("ProgressBar.arc", ARC); + } + + static boolean dark() { + Color background = UIManager.getColor("Panel.background"); + return background != null && background.getRed() + background.getGreen() + background.getBlue() < 420; + } + + static Color muted() { return dark() ? new Color(0xB6C6CD) : new Color(0x4A606A); } + static Color accent() { return dark() ? new Color(0xA3D7BF) : new Color(0x286C52); } + + static void tint(JComponent component, boolean accent) { + component.putClientProperty("AutoPlug.accent", accent); + component.setForeground(accent ? accent() : muted()); + } + + static void refreshColors(Component component) { + if (component instanceof JComponent) { + Object accent = ((JComponent) component).getClientProperty("AutoPlug.accent"); + if (accent instanceof Boolean) component.setForeground((Boolean) accent ? accent() : muted()); + } + if (component instanceof Container) for (Component child : ((Container) component).getComponents()) refreshColors(child); + } + + static JPanel transparent(LayoutManager layout) { + JPanel panel = new JPanel(layout); panel.setOpaque(false); return panel; + } + + static JPanel surface(LayoutManager layout, int padding) { + JPanel panel = new Surface(layout); + panel.setBorder(new EmptyBorder(padding, padding, padding, padding)); + return panel; + } + + static JScrollPane scroll(Component view) { + JScrollPane scroll = new JScrollPane(view); + scroll.setOpaque(false); scroll.getViewport().setOpaque(false); scroll.setBorder(null); + scroll.getVerticalScrollBar().setUnitIncrement(16); + return scroll; + } + + /** Paints only geometric artwork authored here; no Minecraft assets or remote images. */ + static void landscape(Graphics graphics, int width, int height) { + if (width <= 0 || height <= 0) return; + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.scale(width / 1200.0, height / 800.0); + g.setPaint(new GradientPaint(0, 0, new Color(0x101E2C), 0, 800, new Color(0x496065))); + g.fillRect(0, 0, 1200, 800); + // Sparse square stars and a pale block moon keep the sky quiet behind the content. + g.setColor(new Color(207, 224, 226, 62)); + int[][] stars = {{220, 86}, {392, 160}, {595, 94}, {726, 208}, {919, 100}, {1094, 184}}; + for (int[] star : stars) g.fillRect(star[0], star[1], 3, 3); + g.setColor(new Color(182, 204, 208, 82)); g.fillRect(996, 83, 56, 56); + g.setColor(new Color(31, 47, 61, 110)); g.fillRect(1014, 83, 38, 38); + ridge(g, new Color(0x344B55), 800, new int[]{0, 180, 320, 470, 640, 830, 990, 1200}, + new int[]{400, 360, 420, 310, 366, 290, 360, 336}); + ridge(g, new Color(0x293F46), 800, new int[]{0, 140, 290, 420, 590, 730, 910, 1080, 1200}, + new int[]{480, 440, 504, 466, 534, 458, 492, 436, 480}); + ridge(g, new Color(0x213A36), 800, new int[]{0, 154, 310, 492, 680, 870, 1032, 1200}, + new int[]{628, 560, 606, 646, 594, 554, 612, 584}); + // Top faces, rock layers and small block trees suggest a playable landscape. + g.setColor(new Color(0x3B5647)); + g.fillRect(0, 628, 154, 10); g.fillRect(154, 560, 156, 10); + g.fillRect(870, 554, 162, 10); g.fillRect(1032, 612, 168, 10); + g.setColor(new Color(0x263B38)); + g.fillRect(46, 698, 170, 28); g.fillRect(970, 710, 230, 22); + tree(g, 194, 560, 1.0); tree(g, 929, 554, 1.3); tree(g, 1112, 612, .85); + g.setPaint(new GradientPaint(0, 0, new Color(4, 12, 19, 66), 0, 800, new Color(4, 12, 19, 22))); + g.fillRect(0, 0, 1200, 800); + } finally { g.dispose(); } + } + + private static void ridge(Graphics2D g, Color color, int bottom, int[] x, int[] y) { + Polygon polygon = new Polygon(); polygon.addPoint(x[0], bottom); polygon.addPoint(x[0], y[0]); + for (int i = 1; i < x.length; i++) { polygon.addPoint(x[i], y[i - 1]); polygon.addPoint(x[i], y[i]); } + polygon.addPoint(x[x.length - 1], bottom); g.setColor(color); g.fillPolygon(polygon); + } + + private static void tree(Graphics2D graphics, int x, int ground, double scale) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.translate(x, ground); g.scale(scale, scale); + g.setColor(new Color(0x29352F)); g.fillRect(-5, -58, 10, 58); + g.setColor(new Color(0x1D3430)); g.fillRect(-30, -86, 60, 35); g.fillRect(-21, -105, 42, 24); + g.setColor(new Color(0x30483A)); g.fillRect(-21, -105, 42, 5); g.fillRect(-30, -86, 25, 5); + } finally { g.dispose(); } + } + + static JLabel worldThumbnail() { + JLabel label = new JLabel() { + @Override protected void paintComponent(Graphics graphics) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.clip(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), ARC, ARC)); + landscape(g, getWidth(), getHeight()); super.paintComponent(g); + } finally { g.dispose(); } + } + }; + label.setHorizontalAlignment(SwingConstants.CENTER); + label.setPreferredSize(new Dimension(96, 96)); return label; + } + + private static final class Surface extends JPanel { + Surface(LayoutManager layout) { super(layout); setOpaque(false); } + @Override protected void paintComponent(Graphics graphics) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color top = dark() ? new Color(34, 47, 54, 232) : new Color(246, 250, 250, 237); + Color bottom = dark() ? new Color(23, 35, 42, 221) : new Color(230, 239, 239, 224); + g.setPaint(new GradientPaint(0, 0, top, 0, Math.max(1, getHeight()), bottom)); + g.fillRoundRect(0, 0, getWidth(), getHeight(), ARC, ARC); + g.setColor(dark() ? new Color(215, 235, 237, 36) : new Color(255, 255, 255, 155)); + g.draw(new RoundRectangle2D.Float(.5f, .5f, getWidth() - 1f, getHeight() - 1f, ARC, ARC)); + } finally { g.dispose(); } + super.paintComponent(graphics); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java index 792d10f8..8bd6b5d6 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java +++ b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java @@ -20,6 +20,8 @@ public interface LauncherActions { default WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { throw unavailable(); } default void setWorldEulaAccepted(String id, boolean accepted) throws Exception { throw unavailable(); } default void launchWorld(String id, boolean share) throws Exception { throw unavailable(); } + /** Opens an existing singleplayer save and returns instructions if the game needs manual selection. */ + default String launchLocalWorld(String id, String version) throws Exception { throw unavailable(); } default String shareWorld(String id) throws Exception { throw unavailable(); } default void launchProfile(String profileId, String host, int port) throws Exception { throw unavailable(); } default SettingsInfo settings() throws Exception { return new SettingsInfo(); } @@ -47,11 +49,14 @@ public ProfileInfo(String id, String name, String gameVersion, String loader, St } final class WorldInfo { - public final String id, name, serverProfileId, clientProfileId, directory, thumbnail; - public final boolean running; + public final String id, name, serverProfileId, clientProfileId, directory, thumbnail, gameVersion; + public final boolean running, local; public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running) { + this(id, name, serverProfileId, clientProfileId, directory, thumbnail, running, false, ""); + } + public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running, boolean local, String gameVersion) { this.id = id; this.name = name; this.serverProfileId = serverProfileId; this.clientProfileId = clientProfileId; this.directory = directory; - this.thumbnail = thumbnail; this.running = running; + this.thumbnail = thumbnail; this.running = running; this.local = local; this.gameVersion = gameVersion == null ? "" : gameVersion; } @Override public String toString() { return name; } } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java b/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java new file mode 100644 index 00000000..9c4f54ed --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java @@ -0,0 +1,39 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.browser.VanillaServersReader; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** Retains only display/version metadata from the shared bounded NBT decoder. */ +final class LevelDatReader { + static final class Metadata { + String name = "", version = ""; + boolean modded; + } + + Metadata read(Path path) throws IOException { + Map root = new VanillaServersReader().readCompound(path); + if (!(root.get("Data") instanceof Map)) throw new IOException("level.dat has no Data compound"); + Map data = (Map) root.get("Data"); + Metadata result = new Metadata(); + if (data.containsKey("LevelName") && !(data.get("LevelName") instanceof String)) throw new IOException("Invalid LevelName tag"); + if (data.containsKey("Version") && !(data.get("Version") instanceof Map)) throw new IOException("Invalid Version tag"); + if (data.containsKey("WasModded") && !(data.get("WasModded") instanceof Number)) throw new IOException("Invalid WasModded tag"); + if (data.get("LevelName") instanceof String) result.name = (String) data.get("LevelName"); + if (data.get("Version") instanceof Map) { + Object name = ((Map) data.get("Version")).get("Name"); + if (name != null && !(name instanceof String)) throw new IOException("Invalid version Name tag"); + if (name instanceof String) result.version = (String) name; + } + result.modded = data.get("WasModded") instanceof Number && ((Number) data.get("WasModded")).intValue() != 0; + for (String marker : Arrays.asList("FML", "fml", "ForgeData", "forge", "neoforge", "fabric", "Mods", "mods", "ModList")) + if (root.containsKey(marker) || data.containsKey(marker)) result.modded = true; + Object brands = data.get("ServerBrands"); + if (brands instanceof List) for (Object brand : (List) brands) + if (brand instanceof String && !"vanilla".equals(brand)) result.modded = true; + return result; + } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java new file mode 100644 index 00000000..2798c8bf --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java @@ -0,0 +1,18 @@ +package com.osiris.autoplug.client.worlds; + +import java.nio.file.Path; + +/** A read-only view of an existing Minecraft save; it is never a managed server. */ +public final class LocalWorld { + public final String id, name, gameVersion; + public final Path directory, gameDirectory, icon; + public final boolean modded; + + LocalWorld(String id, String name, String gameVersion, Path directory, Path gameDirectory, Path icon, boolean modded) { + this.id = id; this.name = name; this.gameVersion = gameVersion; + this.directory = directory; this.gameDirectory = gameDirectory; this.icon = icon; this.modded = modded; + } + + /** The directory name, rather than LevelName, is what Minecraft Quick Play accepts. */ + public String saveName() { return directory.getFileName().toString(); } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java new file mode 100644 index 00000000..417096ed --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java @@ -0,0 +1,106 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.browser.ServerBrowserService; +import java.io.*; +import java.nio.file.*; +import java.util.*; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Discovers standard local saves in place. There are intentionally no create, save, or delete methods. */ +public final class LocalWorldStore { + private static final String PREFIX = "local:"; + private final Path minecraft; + private final Consumer progress; + + public LocalWorldStore(Path minecraft) { this(minecraft, ignored -> { }); } + public LocalWorldStore(Path minecraft, Consumer progress) { + this.minecraft = minecraft.toAbsolutePath().normalize(); + this.progress = progress == null ? ignored -> { } : progress; + } + public static Path defaultMinecraftDirectory() { return ServerBrowserService.defaults().vanillaFile().getParent(); } + public Path getMinecraftDirectory() { return minecraft; } + + public List list() throws IOException { + Path saves = minecraft.resolve("saves"); + if (!Files.exists(saves, LinkOption.NOFOLLOW_LINKS)) return Collections.emptyList(); + validateSaves(saves); + List result = new ArrayList<>(); + try (DirectoryStream children = Files.newDirectoryStream(saves)) { + int count = 0; + for (Path child : children) { + if (++count > 10000) throw new IOException("Too many entries in the Minecraft saves folder"); + if (!Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS)) continue; + if (!Files.exists(child.resolve("level.dat"), LinkOption.NOFOLLOW_LINKS)) continue; + try { result.add(get(PREFIX + child.getFileName())); } + catch (IOException | IllegalArgumentException e) { progress.accept("Skipped local save '" + child.getFileName() + "': " + e.getMessage()); } + } + } + result.sort(Comparator.comparing((LocalWorld world) -> world.name, String.CASE_INSENSITIVE_ORDER).thenComparing(world -> world.id)); + return result; + } + + public LocalWorld get(String id) throws IOException { + if (id == null || !id.startsWith(PREFIX)) throw new IOException("Invalid local world identifier"); + String name = id.substring(PREFIX.length()); + if (name.isEmpty() || name.equals(".") || name.equals("..") || name.indexOf('/') >= 0 || name.indexOf('\\') >= 0 + || name.indexOf(':') >= 0 || name.chars().anyMatch(Character::isISOControl)) + throw new IOException("Invalid local world directory"); + Path saves = minecraft.resolve("saves"); validateSaves(saves); + Path directory = saves.resolve(name).normalize(); + if (!directory.getParent().equals(saves) || !Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS) + || Files.isSymbolicLink(directory) || !directory.toRealPath().equals(saves.toRealPath().resolve(name))) + throw new IOException("Linked or external save directories are not supported"); + Path level = directory.resolve("level.dat"); + if (!regularChild(level, directory)) throw new IOException("Missing or linked level.dat"); + LevelDatReader.Metadata metadata = new LevelDatReader().read(level); + String display = metadata.name.trim(); + if (display.isEmpty()) display = name; + Path icon = directory.resolve("icon.png"); + try { if (!safeIcon(icon, directory)) icon = null; } + catch (IOException e) { icon = null; } // An unreadable thumbnail must not hide a valid save. + return new LocalWorld(id, display, metadata.version, directory, minecraft, icon, metadata.modded); + } + + /** Preserve the exact recorded build; require an explicit choice for older unknown saves. */ + public String launchVersion(LocalWorld world, String selected) throws IOException { + String version = canonicalVersion(selected == null ? "" : selected.trim()); + if (world.modded) throw new IOException("This save was marked as modded. Open it with its original modded launcher to preserve its content."); + if (!world.gameVersion.isEmpty()) { + String recorded = canonicalVersion(world.gameVersion); + if (version.isEmpty()) version = recorded; + if (!version.equals(recorded)) throw new IOException("This save records Minecraft " + world.gameVersion + "; selecting another version could change it. Use the recorded version."); + } + if (version.isEmpty()) throw new IOException("This save does not record a Minecraft version. Choose its original version explicitly."); + if (version.equals(".") || version.contains("..") || !version.matches("[A-Za-z0-9._+ -]+")) + throw new IOException("The save's Minecraft version is not a valid published version identifier"); + return version; + } + + /** Publisher display names and manifest IDs can identify the same prerelease build. */ + private static String canonicalVersion(String version) { + Matcher display = Pattern.compile("^([0-9]+\\.[0-9]+(?:\\.[0-9]+)?) (Pre-release|Release Candidate) ([1-9][0-9]*)$", Pattern.CASE_INSENSITIVE).matcher(version); + if (display.matches()) return display.group(1) + (display.group(2).equalsIgnoreCase("Pre-release") ? "-pre" : "-rc") + display.group(3); + Matcher id = Pattern.compile("^([0-9]+\\.[0-9]+(?:\\.[0-9]+)?)-(pre|rc)([1-9][0-9]*)$", Pattern.CASE_INSENSITIVE).matcher(version); + return id.matches() ? id.group(1) + "-" + id.group(2).toLowerCase(Locale.ROOT) + id.group(3) : version; + } + + private void validateSaves(Path saves) throws IOException { + if (!Files.isDirectory(saves, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(saves) + || !saves.toRealPath().equals(minecraft.toRealPath().resolve("saves"))) + throw new IOException("Linked or external Minecraft saves folders are not supported"); + } + private static boolean regularChild(Path file, Path directory) throws IOException { + return Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS) && !Files.isSymbolicLink(file) + && file.toRealPath().equals(directory.toRealPath().resolve(file.getFileName())); + } + private static boolean safeIcon(Path icon, Path directory) throws IOException { + if (!regularChild(icon, directory) || Files.size(icon) < 24 || Files.size(icon) > 1024 * 1024) return false; + try (DataInputStream input = new DataInputStream(Files.newInputStream(icon))) { + if (input.readLong() != 0x89504e470d0a1a0aL || input.readInt() != 13 || input.readInt() != 0x49484452) return false; + int width = input.readInt(), height = input.readInt(); + return width > 0 && width <= 1024 && height > 0 && height <= 1024; + } catch (EOFException e) { return false; } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java b/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java index d61a97e4..56d3dbf3 100644 --- a/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java +++ b/src/test/java/com/osiris/autoplug/client/launcher/MinecraftLauncherTest.java @@ -84,6 +84,37 @@ static JsonObject fixture(String name) { assertTrue(MinecraftLauncher.allowed(feature, Collections.singletonMap("is_demo_user", true))); } + @Test void localQuickPlayUsesSaveFolderAndRetainsOriginalGameDirectory() throws Exception { + Path original = temporary.resolve(".minecraft"); + LaunchRequest request = new LaunchRequest(original, "1.21.1", "VANILLA", null, + MinecraftAccount.offline("Player"), null, 0, "My world folder"); + List args = args(fixture("1.21.1"), request); + assertEquals("My world folder", args.get(args.indexOf("--quickPlaySingleplayer") + 1)); + assertEquals(original.toString(), args.get(args.indexOf("--gameDir") + 1)); + assertEquals(original.resolve("logs/quick-play.json").toString(), args.get(args.indexOf("--quickPlayPath") + 1)); + assertFalse(args.contains("--quickPlayMultiplayer")); + assertFalse(args.contains("--quickPlayRealms")); + assertFalse(args.contains("--server")); + } + + @Test void legacyLocalWorldKeepsExactVersionWithoutInventingDirectLaunchFlags() throws Exception { + LaunchRequest request = new LaunchRequest(temporary, "1.16.5", "VANILLA", null, + MinecraftAccount.offline("Player"), null, 0, "Legacy world"); + List args = args(fixture("1.16.5"), request); + assertEquals("1.16.5", args.get(args.indexOf("--version") + 1)); + assertFalse(args.contains("--quickPlaySingleplayer")); + assertFalse(args.contains("--server")); + assertFalse(args.stream().anyMatch(value -> value.contains("${"))); + } + + @Test void localWorldRequestsRejectTraversalAndAmbiguousTargets() { + for (String invalid : Arrays.asList("", ".", "..", "../world", "nested/world", "nested\\world", "C:world", "world\n")) + assertThrows(IllegalArgumentException.class, () -> new LaunchRequest(temporary, "1.21.1", "VANILLA", null, + MinecraftAccount.offline("Player"), null, 0, invalid)); + assertThrows(IllegalArgumentException.class, () -> new LaunchRequest(temporary, "1.21.1", "VANILLA", null, + MinecraftAccount.offline("Player"), "localhost", 25565, "World")); + } + @Test void mavenCoordinatesAndCachePathsRejectTraversal() throws Exception { assertEquals("net/fabricmc/intermediary/1.21.1/intermediary-1.21.1.jar", MinecraftLauncher.mavenPath("net.fabricmc:intermediary:1.21.1")); assertEquals("g/a/1/a-1-natives.jar", MinecraftLauncher.mavenPath("g:a:1:natives")); diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java index bd9a917f..08ca3889 100644 --- a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java @@ -18,7 +18,7 @@ class LauncherCommandsTest { } @Test void commandsPersistProfilesAndSettingsAcrossInvocationsWithoutGlobalConfig() throws Exception { List output = new ArrayList<>(); String id; - try (LauncherServices services = new LauncherServices(temp, output::add)) { + try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), output::add)) { LauncherCommands commands = new LauncherCommands(services, output::add); commands.execute(commands.tokenize(".profiles create \"My Pack\" 1.21.1 FABRIC --template")); id = services.profiles().get(0).id; @@ -28,7 +28,7 @@ class LauncherCommandsTest { assertFalse(Files.exists(temp.resolve("autoplug"))); // No legacy server initialization. assertFalse(Files.exists(temp.resolve("accounts.json"))); // Offline setting creates no credential store. } - try (LauncherServices services = new LauncherServices(temp, output::add)) { + try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), output::add)) { assertEquals("FixtureUser (offline)", services.settings().account); assertEquals(25570, services.settings().port); assertFalse(services.settings().upnp); assertEquals(id, services.settings().defaultProfile); @@ -40,7 +40,7 @@ class LauncherCommandsTest { } } @Test void updateNeedsReviewedPlanAndWorldProfileCompatibilityIsCheckedEarly() throws Exception { - try (LauncherServices services = new LauncherServices(temp, ignored -> { })) { + try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), ignored -> { })) { LauncherActions.ProfileInfo client = services.createProfile("Client", "1.21.1", "FABRIC", "MODS", false); LauncherActions.ProfileInfo server = services.createProfile("Server", "1.21.1", "FORGE", "MODS_SERVER", false); assertThrows(java.io.IOException.class, () -> services.updateProfile(client.id)); @@ -50,7 +50,7 @@ class LauncherCommandsTest { } } @Test void disablingRememberClearsAccountsEvenAfterSwitchingOffline() throws Exception { - try (LauncherServices services = new LauncherServices(temp, ignored -> { })) { + try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), ignored -> { })) { LauncherActions.SettingsInfo settings = services.settings(); settings.rememberAccount = true; services.saveSettings(settings); com.osiris.autoplug.client.launcher.AccountStore store = new com.osiris.autoplug.client.launcher.AccountStore(temp.resolve("accounts.json")); store.save(new com.osiris.autoplug.client.launcher.MinecraftAccount("FixtureOne", "123456781234123412341234567890ab", "test-access", "test-refresh", "test-client", "", false, java.time.Instant.now().plusSeconds(3600))); @@ -60,4 +60,32 @@ class LauncherCommandsTest { assertTrue(store.list().isEmpty()); } } + @Test void localWorldLaunchUsesRecordedVersionAndCannotStartOrShareAServer() throws Exception { + List output = new ArrayList<>(), launches = new ArrayList<>(); + try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), output::add) { + @Override public List worlds() { + return Arrays.asList( + new LauncherActions.WorldInfo("local:New World", "My save", "", "", "fixture", "", false, true, "1.21.1"), + new LauncherActions.WorldInfo("local:Legacy", "Legacy", "", "", "fixture", "", false, true, "")); + } + @Override public String launchLocalWorld(String id, String version) { launches.add(id + " | " + version); return "Select Singleplayer in Minecraft."; } + @Override public void launchWorld(String id, boolean share) { fail("A local save must not start a dedicated server"); } + @Override public void setWorldEulaAccepted(String id, boolean accepted) { fail("A local save must not write a server EULA"); } + }) { + LauncherCommands commands = new LauncherCommands(services, output::add); + commands.execute(commands.tokenize(".mc worlds launch \"local:New World\"")); + assertEquals(Collections.singletonList("local:New World | 1.21.1"), launches); + assertEquals("Select Singleplayer in Minecraft.", output.get(output.size() - 1)); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds launch local:Legacy"))); + commands.execute(commands.tokenize(".mc worlds launch local:Legacy --version 1.12.2")); + assertEquals("local:Legacy | 1.12.2", launches.get(1)); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds launch \"local:New World\" --share"))); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds launch \"local:New World\" --accept-eula"))); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds share \"local:New World\""))); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds stop \"local:New World\""))); + assertEquals(2, launches.size()); + commands.execute(commands.tokenize(".mc worlds list")); + assertTrue(output.stream().anyMatch(line -> line.contains("singleplayer | 1.21.1"))); + } + } } diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LocalClientLifecycleTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LocalClientLifecycleTest.java new file mode 100644 index 00000000..2d083b8c --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/LocalClientLifecycleTest.java @@ -0,0 +1,69 @@ +package com.osiris.autoplug.client.profiles; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.*; +import static org.junit.jupiter.api.Assertions.*; + +class LocalClientLifecycleTest { + @TempDir Path temporary; + + @Test void closingLauncherLeavesLocalGameAliveAndRetainsLeaseUntilGameExits() throws Exception { + Path minecraft = Files.createDirectories(temporary.resolve("minecraft")); + LauncherServices services = new LauncherServices(temporary.resolve("autoplug"), minecraft, ignored -> { }); + FixtureProcess process = new FixtureProcess(); + ProfileLease lease = new ProfileLease(minecraft); + services.trackLocalClient("local:Fixture", process, lease); + try { + services.close(); + assertFalse(process.destroyed, "Closing AutoPlug must not terminate the local integrated server"); + assertTrue(process.isAlive()); + assertThrows(IOException.class, () -> new ProfileLease(minecraft)); + process.exitNormally(); + try (ProfileLease released = new ProfileLease(minecraft)) { assertNotNull(released); } + } finally { process.exitNormally(); services.close(); } + } + + @Test void waitingForSessionsIncludesLocalGameUntilItsNormalExit() throws Exception { + Path minecraft = Files.createDirectories(temporary.resolve("minecraft")); + LauncherServices services = new LauncherServices(temporary.resolve("autoplug"), minecraft, ignored -> { }); + FixtureProcess process = new FixtureProcess(); + services.trackLocalClient("local:Fixture", process, new ProfileLease(minecraft)); + ExecutorService worker = Executors.newSingleThreadExecutor(); + CountDownLatch started = new CountDownLatch(1); + Future waiting = worker.submit(() -> { + started.countDown(); + try { services.waitForSessions(); } + catch (InterruptedException e) { Thread.currentThread().interrupt(); } + }); + try { + assertTrue(started.await(2, TimeUnit.SECONDS)); + assertThrows(TimeoutException.class, () -> waiting.get(350, TimeUnit.MILLISECONDS)); + process.exitNormally(); + waiting.get(2, TimeUnit.SECONDS); + assertFalse(process.destroyed); + } finally { process.exitNormally(); worker.shutdownNow(); services.close(); } + } + + /** No OS process or Minecraft world is launched by this lifecycle regression. */ + private static final class FixtureProcess extends Process { + private final CompletableFuture exited = new CompletableFuture<>(); + private volatile boolean alive = true, destroyed; + @Override public OutputStream getOutputStream() { return new ByteArrayOutputStream(); } + @Override public InputStream getInputStream() { return new ByteArrayInputStream(new byte[0]); } + @Override public InputStream getErrorStream() { return new ByteArrayInputStream(new byte[0]); } + @Override public int waitFor() throws InterruptedException { + try { exited.get(); return 0; } + catch (ExecutionException e) { throw new AssertionError(e); } + } + @Override public int exitValue() { if (alive) throw new IllegalThreadStateException(); return 0; } + @Override public boolean isAlive() { return alive; } + @Override public CompletableFuture onExit() { return exited; } + @Override public void destroy() { destroyed = true; exitNormally(); } + @Override public Process destroyForcibly() { destroy(); return this; } + void exitNormally() { alive = false; exited.complete(this); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index 1e77946f..d247cf18 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -1,6 +1,7 @@ package com.osiris.autoplug.client.ui; import com.formdev.flatlaf.FlatLightLaf; +import com.formdev.flatlaf.FlatDarkLaf; import com.osiris.autoplug.client.browser.ServerBrowserService; import com.osiris.autoplug.client.ui.LauncherActions.*; import org.junit.jupiter.api.Test; @@ -53,7 +54,7 @@ class DashboardPanelTest { try { assertTrue(calls.await(4, TimeUnit.SECONDS)); assertFalse(onEventThread.get()); SwingUtilities.invokeAndWait(() -> { - for (String view : new String[]{"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}) + for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}) assertNotNull(findButton(panel.get(), view), "Missing navigation: " + view); assertNotNull(findButton(panel.get(), "Create world")); assertNotNull(findButton(panel.get(), "Sign in with Microsoft")); @@ -61,6 +62,65 @@ class DashboardPanelTest { } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } } + @Test void localWorldLaunchUsesRecordedVersionWithoutProfileEulaOrSharing() throws Exception { + CountDownLatch launched = new CountDownLatch(1); + AtomicReference> request = new AtomicReference<>(); AtomicBoolean onEventThread = new AtomicBoolean(); + String result = "Minecraft 1.12.2 started. Select Singleplayer, then Old cottage."; + LauncherActions actions = new LauncherActions() { + @Override public List worlds() { + return Arrays.asList(new WorldInfo("local:cottage", "Old cottage", "", "", directory.toString(), "", false, true, "1.12.2")); + } + @Override public List profiles() { + return Arrays.asList(new ProfileInfo("newer-profile", "Different version", "1.21.1", "FABRIC", "MODS", "", false)); + } + @Override public String launchLocalWorld(String id, String version) { + onEventThread.set(SwingUtilities.isEventDispatchThread()); request.set(Arrays.asList(id, version)); launched.countDown(); return result; + } + @Override public void launchWorld(String id, boolean share) { fail("A local save must not start a managed server"); } + }; + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> findNamed(panel.get(), "world-local:cottage") != null); + SwingUtilities.invokeAndWait(() -> { + Container card = findNamed(panel.get(), "world-local:cottage"); + assertTrue(containsText(card, "Singleplayer")); assertTrue(containsText(card, "Minecraft 1.12.2")); + assertNull(findButton(card, "Share")); assertNull(findButton(card, "Minecraft EULA")); assertNull(findButton(card, "Play locally")); + findButton(card, "Launch").doClick(); + }); + assertTrue(launched.await(4, TimeUnit.SECONDS)); assertFalse(onEventThread.get()); + assertEquals(Arrays.asList("local:cottage", "1.12.2"), request.get()); + awaitUi(() -> containsText(panel.get(), result)); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void unknownLocalVersionIsVisibleAndManagedWorldKeepsItsOwnControls() throws Exception { + CountDownLatch managedLaunch = new CountDownLatch(1); + LauncherActions actions = new LauncherActions() { + @Override public List worlds() { + return Arrays.asList(new WorldInfo("local:old", "Old save", "", "", directory.toString(), "", false, true, ""), + new WorldInfo("managed", "Friends", "server", "client", directory.toString(), "", false)); + } + @Override public void launchWorld(String id, boolean share) { assertEquals("managed", id); assertFalse(share); managedLaunch.countDown(); } + @Override public String launchLocalWorld(String id, String version) { fail("Managed play must not launch a local save"); return ""; } + }; + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> findNamed(panel.get(), "world-managed") != null); + SwingUtilities.invokeAndWait(() -> { + Container local = findNamed(panel.get(), "world-local:old"); + assertTrue(containsText(local, "version unknown")); assertNotNull(findButton(local, "Launch")); + assertFalse(containsText(local, "Server:")); assertNull(findButton(local, "Share")); + Container managed = findNamed(panel.get(), "world-managed"); + assertTrue(containsText(managed, "Managed world")); assertNotNull(findButton(managed, "Share")); + assertNotNull(findButton(managed, "Minecraft EULA")); assertNull(findButton(managed, "Launch")); + findButton(managed, "Play locally").doClick(); + }); + assertTrue(managedLaunch.await(4, TimeUnit.SECONDS)); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + @Test void consoleReceivesBackgroundLogsAndReleasesListenerOnClose() throws Exception { java.util.List> before = new java.util.ArrayList<>(com.osiris.jlib.logger.AL.actionsOnMessageEvent); @@ -110,7 +170,7 @@ public static void main(String[] args) throws Exception { Path data = Files.createTempDirectory("autoplug-dashboard-preview-"); AtomicReference panel = new AtomicReference<>(); CountDownLatch calls = new CountDownLatch(3); SwingUtilities.invokeAndWait(() -> { - FlatLightLaf.setup(); + if (args.length > 3 && "light".equalsIgnoreCase(args[3])) FlatLightLaf.setup(); else FlatDarkLaf.setup(); com.osiris.autoplug.client.utils.GD.TARGET = com.osiris.autoplug.client.Target.MINECRAFT_SERVER; panel.set(new DashboardPanel(fixtures(new AtomicBoolean(), calls), new ServerBrowserService(data.resolve("servers.json"), data.resolve("servers.dat")), true)); }); @@ -118,7 +178,7 @@ public static void main(String[] args) throws Exception { // Waiting behind the worker callbacks allows the fixture models to arrive before printing. Thread.sleep(250); try { - for (String view : new String[]{"Server Browser", "Virtual Worlds", "Profiles", "Server Manager", "Settings"}) { + for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}) { SwingUtilities.invokeAndWait(() -> findButton(panel.get(), view).doClick()); Thread.sleep(50); SwingUtilities.invokeAndWait(() -> { @@ -147,8 +207,9 @@ private static LauncherActions fixtures(AtomicBoolean onEventThread, CountDownLa new ProfileInfo("template", "My base template", "1.21.1", "FABRIC", "MODS", "/profiles/base", true)); } @Override public List worlds() { - called(); return Arrays.asList(new WorldInfo("cove", "Quiet Cove", "paper", "vanilla", "/worlds/quiet-cove", "", false), - new WorldInfo("forest", "The long weekend", "paper", "fabric", "/worlds/long-weekend", "", false)); + called(); return Arrays.asList(new WorldInfo("local:cottage", "Lakeside cottage", "", "", "/.minecraft/saves/Lakeside cottage", "", false, true, "1.21.1"), + new WorldInfo("cove", "Quiet Cove", "paper", "vanilla", "/worlds/quiet-cove", "", false), + new WorldInfo("local:archive", "An old adventure", "", "", "/.minecraft/saves/An old adventure", "", false, true, "")); } @Override public SettingsInfo settings() { called(); SettingsInfo settings = new SettingsInfo(); settings.account = "Offline · Alex"; settings.defaultProfile = "vanilla"; settings.java17 = "/runtimes/java-17/bin/java"; settings.java21 = "/runtimes/java-21/bin/java"; return settings; } }; @@ -160,5 +221,26 @@ private static AbstractButton findButton(Container container, String text) { } return null; } + private static Container findNamed(Container container, String name) { + if (name.equals(container.getName())) return container; + for (Component child : container.getComponents()) if (child instanceof Container) { + Container found = findNamed((Container) child, name); if (found != null) return found; + } + return null; + } + private static boolean containsText(Container container, String text) { + if (container instanceof JLabel && ((JLabel) container).getText() != null && ((JLabel) container).getText().contains(text)) return true; + if (container instanceof JTextArea && ((JTextArea) container).getText().contains(text)) return true; + for (Component child : container.getComponents()) if (child instanceof Container && containsText((Container) child, text)) return true; + return false; + } + private static void awaitUi(java.util.function.BooleanSupplier condition) throws Exception { + AtomicBoolean satisfied = new AtomicBoolean(); long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(4); + while (!satisfied.get() && System.nanoTime() < deadline) { + SwingUtilities.invokeAndWait(() -> satisfied.set(condition.getAsBoolean())); + if (!satisfied.get()) Thread.sleep(20); + } + assertTrue(satisfied.get(), "Dashboard update did not arrive"); + } private static void layout(Container container) { container.doLayout(); for (Component component : container.getComponents()) if (component instanceof Container) layout((Container) component); } } diff --git a/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java new file mode 100644 index 00000000..d4f0d580 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java @@ -0,0 +1,210 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.LauncherServices; +import com.osiris.autoplug.client.ui.LauncherActions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.api.Assumptions; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; +import java.nio.file.*; +import java.util.*; +import java.util.zip.GZIPOutputStream; +import static org.junit.jupiter.api.Assertions.*; + +class LocalWorldStoreTest { + @TempDir Path temporary; + + @Test void discoversRawAndCompressedMetadataAndIconsWithoutChangingSaves() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + Path modern = save(minecraft, "Folder with spaces", "Display name", "1.21.1", true, false, false); + save(minecraft, "Legacy", "", null, false, false, false); + ImageIO.write(new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB), "png", modern.resolve("icon.png").toFile()); + byte[] before = Files.readAllBytes(modern.resolve("level.dat")); + java.nio.file.attribute.FileTime modified = Files.getLastModifiedTime(modern.resolve("level.dat")); + List worlds = new LocalWorldStore(minecraft).list(); + assertEquals(2, worlds.size()); + LocalWorld world = worlds.get(0); + assertEquals("local:Folder with spaces", world.id); + assertEquals("Display name", world.name); + assertEquals("Folder with spaces", world.saveName()); + assertEquals("1.21.1", world.gameVersion); + assertEquals(minecraft, world.gameDirectory); + assertEquals(modern.resolve("icon.png"), world.icon); + assertEquals("Legacy", worlds.get(1).name); + assertEquals("", worlds.get(1).gameVersion); + assertArrayEquals(before, Files.readAllBytes(modern.resolve("level.dat"))); + assertEquals(modified, Files.getLastModifiedTime(modern.resolve("level.dat"))); + assertFalse(Files.exists(minecraft.resolve(".autoplug"))); + } + + @Test void missingMinecraftDirectoryIsNotCreatedByDiscovery() throws Exception { + Path absent = temporary.resolve("not-installed"); + assertTrue(new LocalWorldStore(absent).list().isEmpty()); + assertFalse(Files.exists(absent)); + } + + @Test void versionMustMatchAndUnknownRequiresAnExplicitChoice() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + save(minecraft, "Modern", "Modern", "1.21.1", true, false, false); + save(minecraft, "Old", "Old", null, false, false, false); + LocalWorldStore store = new LocalWorldStore(minecraft); + LocalWorld modern = store.get("local:Modern"), old = store.get("local:Old"); + assertEquals("1.21.1", store.launchVersion(modern, null)); + assertThrows(IOException.class, () -> store.launchVersion(modern, "1.21.2")); + assertThrows(IOException.class, () -> store.launchVersion(old, "")); + assertEquals("1.7.10", store.launchVersion(old, "1.7.10")); + assertThrows(IOException.class, () -> store.launchVersion(old, "../../latest")); + // Metadata is not cached: a changed save is reflected before any subsequent launch. + save(minecraft, "Modern", "Modern", "1.21.2", true, false, false); + assertEquals("1.21.2", store.get("local:Modern").gameVersion); + } + + @Test void moddedMarkersRemainVisibleButPreventVanillaLaunch() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + save(minecraft, "WasModded", "Modded", "1.21.1", true, true, false); + save(minecraft, "Forge", "Forge", "1.21.1", true, false, true); + LocalWorldStore store = new LocalWorldStore(minecraft); + assertEquals(2, store.list().size()); + for (LocalWorld world : store.list()) { + assertTrue(world.modded); + assertTrue(assertThrows(IOException.class, () -> store.launchVersion(world, "1.21.1")).getMessage().contains("modded")); + } + } + + @Test void prereleaseDisplayNamesResolveOnlyToTheSamePublishedBuild() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + save(minecraft, "Prerelease", "Prerelease", "1.20 Pre-release 1", true, false, false); + save(minecraft, "Candidate", "Candidate", "1.20.2 Release Candidate 2", true, false, false); + LocalWorldStore store = new LocalWorldStore(minecraft); + LocalWorld prerelease = store.get("local:Prerelease"), candidate = store.get("local:Candidate"); + assertEquals("1.20 Pre-release 1", prerelease.gameVersion); + assertEquals("1.20-pre1", store.launchVersion(prerelease, null)); + assertEquals("1.20-pre1", store.launchVersion(prerelease, "1.20-pre1")); + assertEquals("1.20-pre1", store.launchVersion(prerelease, "1.20 pRE-rELEASe 1")); + assertEquals("1.20.2-rc2", store.launchVersion(candidate, "1.20.2-rc2")); + assertEquals("1.20.2-rc2", store.launchVersion(candidate, "1.20.2 RELEASE CANDIDATE 2")); + assertThrows(IOException.class, () -> store.launchVersion(prerelease, "1.20-pre2")); + assertThrows(IOException.class, () -> store.launchVersion(prerelease, "1.20")); + assertThrows(IOException.class, () -> store.launchVersion(candidate, "1.20.2-rc1")); + assertThrows(IOException.class, () -> store.launchVersion(candidate, "1.20.2-rc2 extra")); + } + + @Test void malformedSaveDoesNotHideValidWorldAndThumbnailIsOptional() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + Path good = save(minecraft, "Valid", "Valid", "1.21.1", true, false, false); + Files.write(good.resolve("icon.png"), new byte[]{1, 2, 3}); + Path broken = Files.createDirectories(minecraft.resolve("saves/Broken")); + Files.write(broken.resolve("level.dat"), new byte[]{10, 0, 0, 10}); + List messages = new ArrayList<>(); + List worlds = new LocalWorldStore(minecraft, messages::add).list(); + assertEquals(1, worlds.size()); assertNull(worlds.get(0).icon); + assertTrue(messages.stream().anyMatch(message -> message.contains("Broken"))); + assertThrows(IOException.class, () -> new LocalWorldStore(minecraft).get("local:Broken")); + } + + @Test void rejectsTraversalAndLinkedSaveOrMetadata() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + Path original = save(minecraft, "Original", "Original", "1.21.1", false, false, false); + LocalWorldStore store = new LocalWorldStore(minecraft); + for (String invalid : Arrays.asList("Original", "local:..", "local:../Original", "local:nested/Original", "local:C:world", "local:")) + assertThrows(IOException.class, () -> store.get(invalid)); + Path linked = minecraft.resolve("saves/Linked"); + try { Files.createSymbolicLink(linked, original); } + catch (IOException | UnsupportedOperationException | SecurityException e) { Assumptions.assumeTrue(false, "Host does not permit fixture symlinks"); } + assertThrows(IOException.class, () -> store.get("local:Linked")); + Path linkedMetadata = Files.createDirectories(minecraft.resolve("saves/LinkedMetadata")); + Files.createSymbolicLink(linkedMetadata.resolve("level.dat"), original.resolve("level.dat")); + assertThrows(IOException.class, () -> store.get("local:LinkedMetadata")); + assertEquals(1, store.list().size()); + } + + @Test void boundedReaderRejectsNegativeArraysDeepNestingAndCompressedExpansion() throws Exception { + Path badLength = temporary.resolve("negative.dat"); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(badLength))) { + tag(out, 10, ""); tag(out, 7, "bytes"); out.writeInt(-1); + } + assertThrows(IOException.class, () -> new LevelDatReader().read(badLength)); + Path deep = temporary.resolve("deep.dat"); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(deep))) { + tag(out, 10, ""); for (int i = 0; i < 40; i++) tag(out, 10, "nested"); + for (int i = 0; i < 41; i++) out.writeByte(0); + } + assertThrows(IOException.class, () -> new LevelDatReader().read(deep)); + Path expanded = temporary.resolve("expanded.dat"); + try (DataOutputStream out = new DataOutputStream(new GZIPOutputStream(Files.newOutputStream(expanded)))) { + tag(out, 10, ""); tag(out, 10, "Data"); tag(out, 7, "bytes"); out.writeInt(16 * 1024 * 1024); + byte[] block = new byte[8192]; for (int i = 0; i < 2048; i++) out.write(block); + out.writeByte(0); out.writeByte(0); + } + assertTrue(Files.size(expanded) < 100000); + assertThrows(IOException.class, () -> new LevelDatReader().read(expanded)); + } + + @Test void duplicateVersionTagsAreRejectedRatherThanSilentlyOverridingSafetyMetadata() throws Exception { + Path file = temporary.resolve("duplicate.dat"); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(file))) { + tag(out, 10, ""); tag(out, 10, "Data"); + tag(out, 1, "WasModded"); out.writeByte(1); + tag(out, 1, "WasModded"); out.writeByte(0); + out.writeByte(0); out.writeByte(0); + } + assertThrows(IOException.class, () -> new LevelDatReader().read(file)); + } + + @Test void servicesCombineLocalAndManagedWorldsAndRejectUpgradeBeforeDownloads() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + Path original = save(minecraft, "Local", "Local save", "1.21.1", true, false, false); + byte[] before = Files.readAllBytes(original.resolve("level.dat")); + try (LauncherServices services = new LauncherServices(temporary.resolve("autoplug"), minecraft, ignored -> { })) { + LauncherActions.ProfileInfo server = services.createProfile("Server", "1.21.1", "VANILLA", "MODS_SERVER", false); + LauncherActions.ProfileInfo client = services.createProfile("Client", "1.21.1", "VANILLA", "MODS", false); + services.createWorld("Managed", server.id, client.id); + List worlds = services.worlds(); + assertEquals(2, worlds.size()); + assertTrue(worlds.get(0).local); assertEquals("1.21.1", worlds.get(0).gameVersion); + assertEquals(original.toString(), worlds.get(0).directory); + assertFalse(worlds.get(1).local); + assertThrows(IOException.class, () -> services.launchLocalWorld(worlds.get(0).id, "1.21.2")); + } + assertArrayEquals(before, Files.readAllBytes(original.resolve("level.dat"))); + assertFalse(Files.exists(minecraft.resolve(".autoplug"))); + } + + @Test void invalidLocalSavesRootDoesNotHideManagedWorlds() throws Exception { + Path minecraft = Files.createDirectories(temporary.resolve("minecraft")); + byte[] original = new byte[]{1, 2, 3}; + Files.write(minecraft.resolve("saves"), original); + List messages = new ArrayList<>(); + try (LauncherServices services = new LauncherServices(temporary.resolve("autoplug"), minecraft, messages::add)) { + LauncherActions.ProfileInfo server = services.createProfile("Server", "1.21.1", "VANILLA", "MODS_SERVER", false); + LauncherActions.ProfileInfo client = services.createProfile("Client", "1.21.1", "VANILLA", "MODS", false); + LauncherActions.WorldInfo managed = services.createWorld("Managed", server.id, client.id); + List worlds = services.worlds(); + assertEquals(1, worlds.size()); + assertEquals(managed.id, worlds.get(0).id); + assertFalse(worlds.get(0).local); + assertTrue(messages.stream().anyMatch(message -> message.contains("Could not list local Minecraft saves"))); + } + assertArrayEquals(original, Files.readAllBytes(minecraft.resolve("saves"))); + } + + private static Path save(Path minecraft, String folder, String name, String version, boolean compressed, boolean modded, boolean forge) throws IOException { + Path directory = Files.createDirectories(minecraft.resolve("saves").resolve(folder)); + OutputStream raw = Files.newOutputStream(directory.resolve("level.dat")); + try (DataOutputStream out = new DataOutputStream(compressed ? new GZIPOutputStream(raw) : raw)) { + tag(out, 10, ""); tag(out, 10, "Data"); + tag(out, 8, "LevelName"); out.writeUTF(name); + if (version != null) { tag(out, 10, "Version"); tag(out, 8, "Name"); out.writeUTF(version); out.writeByte(0); } + tag(out, 1, "WasModded"); out.writeByte(modded ? 1 : 0); + // Unknown arrays must be consumed correctly without being interpreted as metadata. + tag(out, 12, "Unrelated"); out.writeInt(2); out.writeLong(1); out.writeLong(2); + out.writeByte(0); + if (forge) { tag(out, 10, "FML"); out.writeByte(0); } + out.writeByte(0); + } + return directory; + } + private static void tag(DataOutputStream out, int type, String name) throws IOException { out.writeByte(type); out.writeUTF(name); } +} From 74a62fa9225133e9772037e9c3867a6d5e49e472 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 10:52:17 +0200 Subject: [PATCH 5/9] Use clean light dashboard styling with blue accents --- docs/images/native-launcher/profiles.png | Bin 44264 -> 45278 bytes docs/images/native-launcher/settings.png | Bin 62760 -> 57736 bytes docs/images/native-launcher/worlds.png | Bin 61547 -> 57275 bytes docs/native-launcher.md | 4 +- .../autoplug/client/ui/DashboardPanel.java | 26 ++-- .../autoplug/client/ui/DashboardTheme.java | 123 +++++++++++------- .../osiris/autoplug/client/ui/MainWindow.java | 1 + .../client/ui/DashboardPanelTest.java | 2 +- 8 files changed, 92 insertions(+), 64 deletions(-) diff --git a/docs/images/native-launcher/profiles.png b/docs/images/native-launcher/profiles.png index a01e9378b76eb1e8c2b37a3c9a3fce77877efc33..3d1dba773fbf9609ae02d6c689edad5081d27352 100644 GIT binary patch literal 45278 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 gho#v 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 TD70)oPz8ghtDnm{r-UW|IL&`Z diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png index 8abd3935b730a72b73496e56de086557d97974f6..bc1a2564da6d5d74e0657a410ca3fdeaf0ebea56 100644 GIT binary patch literal 57736 zcmcG$1z42byDp9iC<0<2A}O8H(%lV8hmz9L4WcL_AYD=--O>#z(lK-mA<_dw&k)1F zSp$CG@4NPI@BKgf{Lk_7x*Xw+^{)3>&vQTbeXj{tQ<1%K?fx|^EUX*ya#9*tSeL(I zVO`?Jxd?tj)2cL%h4l(cUP}Clhtc{pw#V&}qxNl_*L&HwYqw-sh$-%n;#~YdO{;M8 zj@pHrmv2gy+|H86r6gM&6kjF$KxW0e_3o$QlMkN*rEoF{HRL7&T}~W0Iq{u&la!%t z`@SOKko80^F3Wv9Z^-5b-L^tg@&#~PtQvgJJY~#>S8Epn2r(auH7`qG{;g5DiGw-h zmw+_oW$^E-wcG#W1MbifwzV1KHz(Y_pGZjLhO5@uNag;1iXPUh=`!Vqxv08&-0YR> zfw=N{PNlguW)poKJ#`Z5qY4{0Y9$v$BI~6$NDwki$p=4&%Oi1#O`=&DNmfa8CnmJP z$ygneI$9lNDsdxag^43?D{frD2`t5pH}_48OSLjO(R@Nq>mD-2<+PkzttsC6b9u@y z&nginia8TYLaV#X;v-{+>|5m39|u3V`CYG4bbo%ekc!)TD9SWAoYduaK0x7Xb;nhF zgsF=yB)8+H_?=F3`C`#EXv{SP@4Ps))20knmTM$5RWG?bF26xh8#1ilO@4N&SipGm zaTPP+J6U}eMiQ7gmS89Pp?jp4&BPlh0XUt35EVb`cI5}x+%`$##DD$!h_8w;o>vzm z>*X3N*T2KD!Kt@nQo0>3Qa$+DC#cc-zwwhh58N1;QJBcXLS2DYAJY;35XT7w|9jO! zh%=}6|LWrhA{?&r63kt{QUnkdzZJs)A0OlW4?kvY1#BH>^%OE=F0@Wx@WR!qi2CdS z=mg#Tyw-}UNAomgd50Upuf^0c&y#!yM{|gi*LG^S(L20;qprZD^+T3IER%85@hN)t zR2aR-6`kYr8R>p6__a|jEh)?hocfsoC-5b!3T|NY@lMi$7^}N3D}oS3o0GXQQ@)?# z{;rF5xbe^}SHHTL_np2&NNuS-I~`u-e9h@%+M)D^F>|AVO=`$v;6YISJ%>+_ag{i=6wWsOvn!|U$t&YqHg z;YL0U$pUrq~c>93)ito>|mpQ^FDDqLF8)cjOvGl%yXJ|Ny)b7 z3SXbwSsWJjM&grw+BMaK8KFpmEb|Am6d_4`q9uK>yl1iVm(r&!j<{0@LevCxTo*b@ zPte#?ekeHKw2Nje(^GPvmGtd-dMU$D4kSlUbM5;2Gg$Ok=i=NzM!Pox#yVGJJ5h#! zjgSf*^mbe)4ns@JSRg-zi&~+7-Wn;;X4fvB65gNM{XT5f$(Wa|xyqK4&92|{#jqZE zgOoQWN4G$$$f7r?d4EQ3$O`16Urh!Kgnqld_VYiU6oiZDeL=EZo)5Rm^M+gA`xIL@ z_m1@V7+)7&n0ig?4kMw35o6%h8~0a+hBM`dK7S^x3|E(tsS1ZIXk;mnWbbe0Yv%Nw zo)G8mb8qs-q>w53hPFJa^51UNCK?ZA)o`Enb(eT8y_uGfFqQtMIxjpXPkobuIKIDP z^LfZ@4#&Ay8 z6ZF359^~p~-C8jk)vTzbgpV&W)aXrs{w5!teUD%O+PL#xqe^h0a%|kF(F{Rs&h?hb>ipd zUN4650S&`RVqH}jm%e_BxMysXR8i8K&k+lZRcsj}4t%it~)PEAd{Q&c@;-Tyft zS$A-0WgtUSgAKZ}x$%Gkr?oYt6e0p0Imm~NWcO-5e;(-tsh;uDpLN|^acmT(rdDup znB2QL--&QzxAA13#rK5sRF&xN2G5+d5*x3=d8~)~?_=ZpNILi&E~d8a_M|nd%`TeP z1a9k(I;qT4f!DEhub2pj!vEOOZk4gSKa)mLN9W)M-_+;I+~%t?#yMUSHw!|;vIhl{ zMJYxrtTcC42_X>9pTM$G|5ZoBR6;uCU?GgZ}Z^ zOOI&@t&y9j8>=~K>i&HU|L|epXv!HPoZV>sv`BBnLvNl9@#WC1!=|JZ{p0P6 zM#Cxu5-e()u>C3Lk{OR*-&EUn!SY|NZ@`Q9IGCgJ%4ne5>9U=wIow%vnJ)!T@Y0>_ zCXS@U$>6;4{>F4=n^uwD>YBR$DVC{!<8=2&9dldm*mY%PW$%^rpdLZIkzDnM^UHx? zRm^J}`xfzu>~uWj6)0fkos5pw+-TTUnP)377YfIIX+k+17?@1PWnsJ66&uFBBe;n- zg8VeO%QTO>Yh7I~Y2*$5sVe~4+Dp-FL0Z#)KAaL3Cg|pqe_AkHU_V_4t%5%y!z9K1 zMWTTIcFU-y-+PGZY#uh9EePMlj33JGuMv8W?JP3yA@%KR7uQPMX=!N4AHVEBNTOfv zONk%zq$&5^pWX*KW|-8nCm~VW5;NF%R{dhWt|;H3?A~~`R@5OGXO`5wr_igROX)Hi zn%!}y$Hqj6wXw0u?l@K(5BM(2eBRE#M!nWX>M*Py6{QiHGBi{k>hIA~vo@qE$~Ob` zIy|!HGrS2#ZQn(EG5thefcZ)8Xa5J5$D=QLKk*C=aqXR)7AnEtKdo{XMht6up+4MU zMj(syeGy17^SZ*}dOK1?x1tN(`U+ZQ>Z|uf{Ry5O?U8t)!bQm+x$ucPAMZ(K@%&tE{EHHcEo^WKF=jLkGm7H!lWE+rx2OxsoN31VM)d#^4@ zHTF|nt#5mdVV#i8F&+F3fruIGDi|u?;<1>=)-Tl~iE`O+@;1Y8VPrznS~q+1AQU0P zE@%=9H>{p=3YqcSnDWFd8x4mNqsF?C-2_;l;O6lzM6-%LziRvi-^nN0`4YX}jt*`= zm9rS|q4e2qji+XpDu6d1drA36o+3*8t-{)7g}I)83HOT0cUc`gqMEy@eg*z{bB9TS z(&u=4)T{fw`z)86-~MEC-E)E14d|v{Kk7-Ynm8N`70Z3$SnTo3Ut%pz+z_wTtoS|2 zP;)uOz{C0s$UY?a#z3m#@yep>Ei@YfRN#4#%MtEPUFg;^u)TZ>vT~c@(`%YG- z0WXs8L@uFp`VvUcUWHP2KEvK&ivE$;0;kJR_Ap0z*NjVeLHb6kNzuGT|gPb<|)`Q!&w(=HgiOdqa8~ z*5<=S2R?GrW!<7zu@3X|3&Qj5<>;(o77-D57(1PMJ6z|whCo)@jIF}S1l=mU$cJd3 zSTA1;I|jgJl+;|v3$@g%k2k$b@y^?^QtZJ0bl?9JvCD@H|5&>KM_1IQr7JC;E{;6} ziKBd=-3_}SjCXQ((zWB%a{d&Z9-ApXKTE}8+|)1|NE+^xeiGK}#cuqLa-n_KfyWyP>5#82|!yd->wo4C?^=a7UwNr|b81cDMBk=IDhV zqITJvyuh-!&;5c@cLQXSm`h2#z6+w8c(GGi$bEu?v;~IwpgE*_zkVoqaJzK@XXNoO zz98-zcvYEsch@UHxAlrs=q7tB{b~v=8kPdG+DMZxwpC;d!>P~7bnd_|r1@99U67Fb z&?13Fa;=apg9MljnDlQ5jE zOgeAWsOseOVf)SFN^;-5fzVJTv{0KN?1l1h-4Q9&UYJ?W*mX|x9Qor3ETk&4BXbmIf zBhgo)pJ+bSpWp1|L*nA&cQW7NwHamM+JjreMenaMtILa6WA}!Va3SoS-j90hEKnHM zyA^@#3edVv?i~1tdNlu&^8&w%b54$?`=Z z3$#l(PPQe(=B{b6Jy%_R{n2NCLs(T9@dN;3CauEp2G3nM)SZUzWS2~oB;U)hT85H^ z3e?`sg-(hCvTKjsMW`2@>W!dIkUJvz1xmeO^CaJ6tJo6A3lIGvZ) ztL&iYHRIE|)$Ak%5U2p+d2iHK&)T4y4|Z()9KoHxxrT_X4C1Bz*2x2@s353D@FE8B z{Cad*BHrTTD{V}(1&~kh9*Px!R(0cb-({N#}CZEG= zcbKO9PtjifjeDv2>`ezdsbD6z+ejB*!Wqy^yv4aG$T)p_-Ae09kes_~8UM^;A3-2d zpoRt;yV0>a0J(i>1Y9x?9S@!IFFy)4Dx)H3Ms1+zls}nSSO7>-03z7MCDco0zLS*K z)&uq=0{PWutT^gtMRbx%fooia+d_xB9n_jn-X+SAn9aat+oWPuBAd|WDF7WgN{5uJ ztcJo&CCspTI@MH-MlV-{7)0`n?Rn4!V2Ujbt*#j=h{BIMiwxIKGe?C~*lQ2Gw92@4 z3V#EWr=ZsnL9II@0<)vT@AFt6A8ePgmcAVS`uwPKWT>n7aF-aY7}CkA5qq$x$vI2{ zN3Ksq_tPvPRt8#3I_9Kj5 zTeScVk|}YR=_6NW&Fr4hq9*VnlB$Yg!?u%!Nsso1RL4q;Pm>(nl0NQq&42K!2Ichh zc=t4vRgZ*y`LAGnEJ~;_?J}esF0|7Ta0$Eet}vmDj8P4Es7jGC$2o}@zZhYPNULd! zo`geq^(^RPoxMUvhOFz6aHyy^GP$9S=SBasodw41T~faFQtJ^I$kYljF7nv1I|##} zY~}s!M6>n6)CsOXOU2QTlG~irv^$8R&#=koZI!V5hEO`PRDA93&6|f?Ed>6114NCj zFe`+!+s0I_QX;2TJ*z=YuJuTMn%|MGM%3bP9wnMkus!1tF*cj&FZK=6ma#*oJseuytQgORH11R8 z2W{@wB*TE|w}gE<)?==NhRN@KrXo5-9(ys9MpB#&aAWl6sse==e2-ELEI>wKtm$y^4)|;P47K2nGEXY&B`{< ztKZpyz?u(?gbP}}a;*E@S=3QZho~8_E2d+s8GySehL5$Ai|nW_)F;RBY)!AS<3CtS zNWZ@s{o5-gq|a66B4AH%p3_a{rbB(c!q-n~1L_u7-SBIqnruVAw-q<61l|5U-k>8K zJ0c_a=lUy`ls~Kqz0JlK(`!>U=6$|&t#R@5>43ZM-6o+I$)@kDA4CZVSvsaf0xDMW zvP8{Y%PT(ue|Bfkv8Pr&D=HnRU?pAiX-?#}bcKk|Td?T)^YiS!ohnJPRuZoEIf1X! zlF~jeo;ZHGHPP|>)>1dJFr2qTeUNG?${f}Z?tOz?)T%FkT(PrlTPJEr+u_*h+g4sl z6MVPV{lbwey?=u9bl!Cl`PyXXcQpqK{EB>yoMyjCH+#qZx4v5C!sLgU{VE|P5PcD+ znr)bj`T*{{C0qP+2lTN%x+i-#!6<-3Gk(v{S)ydhGCz!~MBB-Gqxy1KJ8WTYvZ$Vh zx1&6ozL<~AptfjMFnXv+*nKEZiC7~j#lC%LEc_{ZygmF*6?zKc{K-Du#oV@Sc_*!u zqFCp&b}tf1jQtUf7`K{;8xx=0y`QlCb`YC#TFdTuaNNX|hL{cT4W$M$W$^CJk?;Dx zuVM0qGrR&;+vwl*;+wrfo=3@kdL#{w&v<2W`!WP>wrPLkwwSlEF?*1H#66;z%j((t zb|h&Q36*Pdr^CW(4H3f``yC^e8+nnhAP}KCB5#jhg*p zLgat2=};!T^oG`HSo}1jR+cOpe>ct{@=lR~%4p15HJtaOWp8%L)h0pV10^XvuPVRE zPE?*59wVLN{;)KaruutUn)da8N=F^vYL02l`AWi%Xx^m!D%{iX6HPn4m8l1Z0TaM8uUkTbku!WA}}t0U3yLt#Bm)ZN*}JRS_8i28}kVxi6K& zb|6I&8WFnzf+>_$s|30!8eMtCQ9>i1d*kF}6CzV_A(vjggn`4g-<#`W>T&mYuN+%? z%7T+#oF8Dnj@YQ?;BP!B_9+CU9k@51l7@M^4%S#Li%iHVsKmodkcU=blidlav(D9C zey-z(BED#yf_P2i=TL~DXpTTEY<%z1o0Dtt5AJz0dX5Jk?rPinBJ3z8;^H)^o_pR{ zztVD@7P_gbFW|I8t>{!Y^CeuFEO>-uOxO4I72)7fqBM`%{fOZ7=fulJ<6ly~d#I4o zYa27WQX4&LxTw`$I72T3qk_>6$2BZTG{%iAo3AHsrr=_UZ3DKu@-Z`E*E^P!c%KGI zn{|>0JxGng6PbCpv}zxv>k27#%q3he3TC7fKXGrMxBaslv!ioaaf9QD zi)PqXf9sGdLQ>zf+r&R=!hv~)wvY-rEiDje2N}N~BDHIdYBLR^pV~RBUag&tj)D7* ziB#?#r`C_`7PR#3uR{IuMsDRp41L|Su=7&8#^Jr{M+I%*Zu&_Q5V`%o^fUT`a&9Yb5al>NZ z)onc_Jc|!?U;FPGz8aBEYC;c^ZnEoDDx)sYLxsbjn#4YwAZIWC$Ur<_5izLp{PvaL z^~p6pzbh)jEg(tG-seJrbwlj!=VkQ^HAid`<~H1sbJOOU%eS1GC*+TWX4$v|v*A2r7gv3aZmEb5z;-XO6NX z?``&g@^P|REsB`CfTgy6CS>3Rnk+0xM~fPyq@vop%%%^)8uHugJ}ea`Wv=Z_+t@@e z1!~VCIe7KpR#P8q2>C!I(w*uq(?Idl8XEYNvGAc979S21wC~yJzEsu!s>R0I-7k5H zny%0m4)&7Pt?cG>`Mn-H$j?Nl?$y;b@;K^OdE{nj5;MGQ_AouQ{c%Gwq^uYnOH*Ym zKVOg&-Pk?q$JDYW>hd9VH1zM;+WgNZD_O`_#p~pFjiSu=NGZ^k0yQ7%cD3M=COcL7 z;+tBVIKQ%?8f|!-eZsb|=<)H75eF`qt*AJHrVT1%X`3jpIUg;~FG^``tIZb*h1q1O z1a6B#O{=_6c|p1HYWjtJZ{bO^HFghzxBHYJHv-$52QOfWl|IBQG7&A8}GwN!<4V>cK(mJaQjrLJ^=qRpKELVS%Cu>=?Xc_k@{okb;t%-PA*%$B;M z^o(oPe=aR?Gd_WCe{XS^1>tt4M@93L7bcsd3)%9|0?joAJ-SybR2i zuKX#)VE!`S2dMp|&Fn&x-Hc9t)+skPgi)v|;|s&g-?FSNBtx#kQ3K*+n1SqxB_yME z0|&O_A+ofcjpRNjMBq>?UDEDrx}%+LCsUtqVh&?Dld{D)&UHj^z^ekPzctZ+eq`Jh zOGq%o6(I9Dc=IEZq~FT_^wqBju2RQf z`A#dwyu_EXobH@&IKw%UICD75VJ^!6Sb)3Le2Tgj7)1g&L$BlgTMJ^U)a8uMOkDc! zmE_L4F9T)yD?c>Fb7=WuOdG4Ja4r_s|8 z0u=?TI9uxC^ZwOeUW^v@`$2){&}f2@D_Uw#Ba ztm!;^kg?LWFeMz^dW?<0fWQpFZ1YSPH)*u(JFlXlA_xx#8X$=VW32^AoR z2R|UefymHhW}D}q-UGjUwHASiuH7P@#R9`ekf(gW9KXHG@x8a9VP! zG1Mx#1FLSiAsh?E&qCNnmud9AH1`xE$h}&ND~vEtvHkdJEUvCXt5%9~oy*K;mg-jD zJL$Kwt-dv8Zzj`g-qkVsMz>s?OWZmL?XgA7f-|vRPDkA- zD~#^FxizT~Kgtx36Bun#$m=4c&tW8Y$V9Doe$c1-HabJx z&4dOA8)rLKuZu+9;J3TJsqKGsm|&~uZxw$dI7Zd2ceOBOw(q&e)u1asFph>Z8^$jI z`ZY7>%MDe-S(O-FgqGI#a55#_-K%K-mt*_sr8OSOD^3&=i{vxZZ2ED~iwV<0?W{%YYH#GT^BEWG!!Vm|le zio@_8Ok3t5TU+PM64{a52{+Ofbxg_HAwL=8HVfIO5Il@u_;!6@o4rxQYpR0QE|ru4 z+B=C5+3|kwvW6P{+1L2)2s^bOzuNg;YQVW|A~NU7kC>?v1BKU<4bG5gL*umS^-pO` z!{x~dpyIjH_r?FLT$pe6*UW{VXpv^jM^)I6kS+@8`GwTR+`_5$JxsB6_cgEK78xy_ zZB6)zKON))V(^4aoj(}TvlvBy_UF$dvxhtqx^$KsUs6MG1EZGB#|JW00Gjsj@B==`IeI4Fo3X+V<@r@E*g$n(zCW_$gFFt8YeMryh zb28%ILTx&V+OR%!nT_a|vx*5F+evH!BmfK4S!A+5-?VumWNd9&$d}Hb@9W}_FQXel z%O5&~ekWP1W-pp7Dud>gtG`{QnS|Bh+SFUVcm9+E-Swyl_Wk3SFEj;XGspp=Pjs^< zpR%=^A&k$RzV&xbI=tsV;x!Wrx=baH8XhUKOrcsJdh_hEZ!#gEhogqJt1kJpa{n4j zhFp@aZrYUBdcbXB{bZvgqVykAz6=WZ!}IJZ1!~}}KQnWYDmnQ4rGR46Cv}!6li!Qs zSW=%QQxz%7K(6!3Ko1H`;(4091*ih0Gi%kiU{Gx7{#>@06bA_AQBgy~I2XdHcA3iy zRT^)c9rpQNtv#iX&*MkDZ0gE4x9eE;EJ`QGvh=)X0f z(*w%2Sydo~{1RBG3wXrQ`FoS%TeXaEY)@fNNl%#of|n5Iy7fwby8E10H4XewvpUHxLlyji`-!AaSYz(iafE4}k<^(|me@s!a7qyULKK@;hsJ9{@fJ z`nU^L320Z8OxS&S%f{B>?|WMZ+p|eLHgsq}B5y}TG>6vjl{p^dX^N|g9GU@nn!;-( zeb!&p5eSn6A_t$7;ic{5g1!Pen=HtU>9I`tXh5-z7HB(+7EXAffVAelx1ydQbAw-g zzAY>)2#o%ld94d&PgieX&TADE3j17zT_?P(p7hb73ZjPST|%(wyTmSwl#>N?c&?gptfsm2kX1mbSdy3jE& zRTSw}=AV3ZUheZ+rtmu`#R!^gd4L7As!#R!jcZ!(hk*eGi3Qja$|g~?D=u4eEdhRh ze%OrrEN8=Le+{5YWXNTS$kzs&V(Pe`2&H9wj9OmVuM#TYxMUxLd0!SdyaEsngR`m;3U6P{Bl5I8s^L=Zrm8HDQ z4J=ZLiMm9t_BC@?;d5`VtCut#Sp#{ba@}l-Hq~>9#L5b|E^KGrpmt^GF6NR2@0iFc zZKsU9R%A;|Om`XUX=R6`wc)(z<9#4_0|K;fpW&fvJaRXXS-ZGQCrb3-S$^Idc#xh1mtXXdn?IBwiPw&a zV60>|B02dB-~G;8G5A0)(s0Mj?G=z7R31FQseGI{QfxT;A`BDUGae{-wGC-o##Q_W z46Nqeaj~ZgnH9SXL(*ZafQs)AFVZea#oXeEU1WsRZoeA+67aNoAx7D$dX;uiEsXK& z6*K5;QXW4h1X0-t1aPb2+yM};h&E%tLqw!3Iiqot4`8Ch$pr1Yq<`n6ofPoIu^9>o z3H|8HaDf$r5UvK20uXhgnEX-j_n5n#qD#_*uEVvbb>M2BgG|75V60m4SwP*Hu5%rN zE>1knRZ9oU10uYij5qFa7VCEd2seIyKg*z7w)i&!6DPD^eK|*;tsr;0OPr9eF(x0VCwNL|LLJKqVv}*$JO$x#XPISC%9E|*|v^=*q3lVRFSVV_;gstk zAFY)RO|~G}@!}d`RQcI<-bGVeiNawFY}mMgTR6J96FY7sgoK3m?^~DZaB^{#oCEP# zolXo2r&jDZ>Z&9;T^vqe~0PX)2zVTn;VieH~I|g z^2R=w>IMC005)sk-8bzZrT1Z~qg9pbd|q8&*c#uxduKRRyC&OM>KcDiez!!kBm^w3 zAJcCG0|Vc^`!pNNc-Bxo&@ZEmG!L%R>Wp8${3DCPVN=lT$9n6UtWp9!0e!C#Bk5*? zsO3zVvR+UXgg_5KIfV^}l*oi-)Zt0Y6k*NFMXjPYsp!lcwTA4#RScgKb~5u z4IrAsKcE;85Sl=^vZ7iIx^M%bO~-7DlN2|Ht0^}3CcivwDsyC{l6DCFsJN3@+n`%N zbJCprq~zldN1#M6F7o&u;Z-(%J~^0&02Nj{|B3vGH&8++zi$_c@Dzk~gq-!YS!Xe{ zN_(A1H!jyE*2hzYvIo8TJ)n28naFcnL%}}IW~9`(I|tSEZuI#==37Yfk-d&tkJqf> zAUVj%gH4RxatAL zYy_WHoQ)f(ca?^wh&&L}MhoP;%@mqv5y+qM_nfFTEORxV`qQlv%#sLt_rK3OlEn1@ z(v{V8R`bsvjiSeeJbE_*n@>HfyiX%l-F$tQ$3$1ch;HhO3~8&}i$yV8tFaUpi0PzD zyv?Kuv6Z8Xv8$An|0?WJ;9bN^&3;+p>^&G{0>ml0aR)~q7$kw?2N(%lH)n)-c#7ns z>1JkT^wNqA>v(Lx?j3U12n`l@7Ba0s;w*kETxWipafJpwM|Fy2HBn);3-C^N4C5_#MiCLJQeX@P z^7a$dJ&5y$j}9oAnT8s=E490Az@M;hKi1@{WSe}sfy1=Di{IQ7R3oRWo!-yqZf4^< zb$p#`0fyI8Xk#CZi@}H-INvBg2YG6jT zNKM;K>#c`#=UgiV+*hetfk2xmB`$9QifQ?zxLeo*o-Plf zlH-f%0=yFmj~u_)(&$E+dk=hRZIc`hk&vc5PkPcH#BlcKj{>$#Tta`QyRMCPBZ1I7 z^BpRA_CPNORx+l< zm%uxzC78>Kk!`mVX-MN1ZWjcoktNwGr3%rm!G;VPy~4H$5kzV?an90(QzU3#&@~>E zJw08i!rpzrw&AkjlOR+Gz|iT1O8{@@$Yy7>e^jg}0EQ+Vk3hHgld@yL`*P*_T?M*i zLHAT!Qg`{xLgVI>w4B!!L8XrIu#tjlk8N4SIF=&d9vNwpI04NRN4X+%o*kiFVjlRJzHTe0bL}#>k&YMaZyAm(;+=KF4=b~;g_Xz_B32S~YV9kh z21O>Im20G(4!{WqGan*r3)60n=)yBYks~AdW`2-VF|>+3L-}em?Qr528w{ z7;-9xIR+WDI#Q|7gy{f@2?E8MB)}g@$zF%fv*%F%$f_IBQ6}~0Nx<|^)9RiTk5Ps* zdP{}ntaioG!t`j3&k+K-*bIYes*shRY4#aw=JcdfL+UOKjH#9UKQxy~yVv<+@~Q!$ zKpc}8>$^VA;rVdM`8-8DFep2Ykbci1y=Tm=qXteSpui6eQ+%R%S?Jy0-QwJ*1y-FI zHc-sKm|5>$?>wt$xkRkGwjEKDcgZoAkV_wW7AJXW?obiXc7hMS^me`MLengf`@cu2aX4jF+N(FaFD}6#!;{ z@ah88lCKH)0tVGO?iF^#pZ@bNz$gF!qXh-O)03!6X}7$HKwGDosGDf)I%xOstV?h0 zz%;S;bV7GrCTB${!3GXn1M1Fx-_EH{ye^?G+pgrh)Hf`MFczj)CX28Dwdg-Q@T2DZ z?_uX8aOr0-%JcsJ47iG&n`b@%T3{paj3KxU=z}TTKe!Up!2B5=c>nZ&5G4lqga4Y# z$1OxeM0^wTqu@My)wKF$;}Nt$EJ9|7>BaKb!1Vw|4z%g&>58lFe)Z~Af4^EtYgA&Q z=i7e+a%MNF6>qxwngH~SxjCEM%xi$}-F6n_ohZ+)jnAg**Fh~6NBy=haN{Pa`psOri&D1Z2$fby3-R8&;y>FG=E=KlsA z1_QPLwJwiu{pFvp*+BW(v(K$29L=KQb%gm6%^%wgf00j0Sk5xT^2w zWBOA+o}9QLO#g#WR!se$MmvSy$F_78i(n-nc`UC45suPF-#b5==_bc zKu7R-==*mn%VElYbp-ZgIGc_8GrdXG9TUTbpdgTnm;_E55djw>{~yTEsb?3s^y~YZ zrF~OLV6(CYV_DLwSERFA%c zj=~Bf28PEZ#jz+3gLDHJoqwnPU#^Mes$Y68V=)R0fy8&o)7{u`tI|G>G-{Eim)^ty zw&D%24P;@#Y!|=2pkJPGmg#8RHvT?Nd70D3?)&#R@N`G4x89#<(YMdA6}$_u(SK_Q z{KnOq*)vy{ul@k;U@edxL4}yEb8k-mGzvHxd<^EW1a)+#p?0zzHlf4{+^arWsuY^0 z!>ubHQv^CaCo3KNIRusv0hd7S&rR71rcYg&$_mMQQ=uQF2^`g0fLa38gk8VNpgxX# zp~8+`(p;Ccs3QCUPd=CpP+iD)yehVJT%Tlf7^m4@{sFT34Kjfz(73U$#?5{_HlxE; zh~o^0?l!PFM9^hL4M3>nG=C9c;pxY^*{Pb@N~;4IvaKKP$cEl?Tpuq*Z8jTM)w^%9 z$;t<gv%Pn+>vJ zWUZHovz00DXkUsTYHu||l>5fB;gNb3qsxsPCE9H;k`L(fHwKN(xgy~yVjcJ@DDq6a zS-vXK``@A>9pR+B#k?xJ(>3>w;qd}@2V6srQb(e#woo!=?Z`0T!t3Ct-F*92HbJ0+ zs^uL)2`I-7z$E7%H~iSi7rN(CR!ml8%MEN`Lex&3QCVeh_l{YQ_g?DbIDt_w0jwsl z(>Icoe>ho^HZT<8sLy+!&)x^P&j1SSsQO7yDonc|B_$H2 zHEY+6L1{e^uq`n7b=gnjdbgAj{4$$`T=lkSk40jfk%6wZz~EcuPNxm2w(NQpClRhK>KAUnT3KvS2w)=|}C&phPZ91)o?!1BnVM+D7d5c z{q-xYpLPa9tL&;L#qAgk>ng$_nT1mh(Xe?Ad?gSn=VglTs-uoN7b@wAak_#Gv70&cD zf2Em7=KRsu$Mc3ZroD&li8wJ$!g3xZ{JHH^7Qk_=M#lqDw2Hvgf5(+$a#*}!s(cx2 zC%b>pU2>!?Lke(TgQqjU+eF#okw;f7^VnwPn8wgxd12Tn^L|no#uTDp4@Bca9&7KB zkRPzL6gd@@IAY^dt7_)4?E7{`U<*Knk7r-Q_2yg7?&>XYEi=Sh7^~3Z{}emF#>I6%?mzAO}D`MtZ@ndU|QCUfKKLq{gu`Lsv64pR!*o@K5j?$$vV@$B*E&2zO{Y^fuyk=u3=mFbTI+`n0!iMnYPIaIEOoy8I`PugU5=4ZT{rXjz-95nTNAzi-au-2d$Docu z_yF_q1-vG&F?q8Q(p|46Er{Cs`C^$W5ZWRbx`k7M%|?zB;PZzknTZ6_LpE=nTw+^X zM8vPy-RWN=@7QSdrTra~PtMES6~&Ww^?%~;4Ytmx2ZV&5{cMI=nFIyBw|}>S&BkB~ zV?5K6Vz7nI-U5@?87MDfQ6FPEJQszwuy$lT0VLZcEf*XHMsowOd+H9eR)Twts^>S& z&tO64eu>9WMPG_F*2T{xrMU~7D zEv=z&>?BF+M=>1LsQ*t`Zxx`%`(-}L%zMoeH7vqZFafcCsPIGl3>yCuA}7TWMK8$~ zIsOPWho@4oK-CAff&10x_r#dszKHa*DfUaQ)$p3d^uF$*0%fJNYzZg-Xm`%MlmAK{5okd(WvjR79$i*L^G z!Sm1eaoSbTa$lZ3arrSMJOenekcy5(OID*Cz~-If`{a&{i|H?B(jncK+8s)`zKp~k+>1)pHjcownd=ly1qQ^+Y#^W7ZqpkJ8N^OG%Nlv zTW0a(Bgt*h*Z`vYOdEbF`{yArt?c=$`*)4>zYPY-I11ROOfhhN_M6KR9)UfDwx0EP zI5;>rZdB^9Bqk>Qae*ilnw3&1;_G^J>`30FD!Z*dM(_6b61wXHuvs*{YSg83%Hn0` z`9X{>bTnt$D`uH7I{aL!wmk1EWMlusn%anB=>);=!+RF@F}D;kJrCm)C3!XVjLV|u5xmm!3GLo_HY5Az!`%C~X8n87 zr8%${A*_M05~!;6n@##Qwfi&Pd=4|z%i4nR$pG5}K&xsursG=%x(0ratRaWNzB&(Hc!p_ev*i-|KEQ00#ZOa1tS|Z7NaSoK+clc!acHK7P0JVc{;MP#DlYwe;)4i1eG65GLvi;bF zh^D2c0^g`61bmeM_<079>K@93K6YClNAJ(FL#ONA<1;cPU0hsprmU<%OeiUZR3&d1%?tklzdWCT@0I8gaazcw!4{$4qd7Obop}b9ro?jj7bqxMf%0ioYGMv{ zH2r34ZKtP+W7f8Bc^76)F_bqr$dzh4v=ps6`l-(WM(2gtU`=PH<5jshlTd29$W+Dw zz7K#uXQA=y7LF!1zuEZK9N2+<3hz)yL!$1>7CR)Rs*F|wfPtATSt&N%vL{t&{6kU# zb@pqd0cu2jz(F(CDHVD|Xt890@%*9DmtITu{cNL+!kdooN$L6AlhKpiV?{OiESu}%|8|?h zk)m)h_M|kauUn6@P(9<_*a!?X&lNsLtCmDp%!8ZV-~t6?W@8=d8A_H_WdB`@LzOP) z&rmWB+TRif{V>n@_VDH?6yQt&AzT%fdW%k}CJL1zKS9oCpWIYLW}ci4u&qHSI)xd0 z8wM0?nyS#u1Dj)57um(Rl{jAE~ z*mB3_Qo>^l9ZtVIvQSI`q^IKvUXVNA^(r$~Ti5pl=Hni8g!4$S+M1?)VJ$!rXLl zfiY1#?I3@|CKMQpzkL_FI0uXq@U^u9(cxPmF+JUY=rDUoOKWMgH*U&+Q)u?4iTd|{ z7GD~jDp-NSu(FjBsYy9FKp3s^_3HS31ikR~Uu4fQK_f=m0}{H}{4YS*#R}UXlauW0 z82A3c+OJP9yYf(y3A;5&yuAjxV}1(qbh0nVfoaEfvZ%7*0uSBmf#(fTJEkF0I&X;d zjt2m1Kbrq^?Z zXnP%W`7My7cYd#l!rc}ppFFGwMZ#}&Fl({fd8t)qJ+jjaUO85=JHBBxwGkz#EG{mt zSFg2W&qfC7jfJVLlPKQ3N6%)Pl2PI|{C>xqfDLV;qf~oJ9+K8;@R0r9Okoo*&B~{&;&veagmH0Hh*F zYO`+86}7ds>5(NNdpjL#_gnT>`S;)WO#;mW0bDejww2+fq5FqmXClI_q#&RlhIQ4r zagC-77Un5zTwux2_7`_KNs+C6-lSk$BNq>^0gnF04W7n_d^V#>b}o^eVXRbC;!XqL z5pEbNRDC%4{rC@ebv^DlJmZ{j1fUM^+clqP6rIGxUL6&wSLd#;ueXK}$Ah9eoTs_u zYp+4Rb+)AQS7;S){zLV^u-w<9___e7`!t&{oo?TBxCC1ABAwD74K2Q1mr~EV{yU9k zjMUeOTw_fL{*c@Z51CQprKUSF>)C0y&UL(|Kb8Th)5_OZ7RSXBJg+cZyGUga-EgHF zYAz-w_Toius|gj!+0jqG{Lvl&E-k}hbh+OH0AwSu4|D;52JK2j zy#X@L)I-9ZpjF||#ehZcx(z*d2Ht+CO%O;zGVxE3nUaEvqI_?lU{q~1NsMRAnP={4 zjv$b60Hy|RKNrfFo|oY3UH~AW#QvjLOh}kX{E-X{1PD{F39xpGE8qTyC+~0L$xoV) zW`C@-8(vI6=9qnbB1H8sH_ICpZ0w+9^*8_2a{d={?;Y0Uy6ubF!D#`-1}H^Aq)QX& ziXZ|~q$5oPq)1Va4nY(}q=zQb6r}eSq=YCay-4q%^dbZZ5D0{v5pb@()?RzxbMAf4 zx%bY$<|E0M?|Z+uj4^&?{EeY3F8=z``&mXv_KQi~ZiMwW0c96GTCYqq5Bp~#IgoLn znk??38c4l(^`EHXWYptd$&giHfN9>6mfp92KX4q6?~JnSKNCaBF0)eu#5%*|P0hf3 ziBs=Cpe4nW!K__Gj8*F&FbK0hweH)rIU1ndlc|(0dt8r5LYPw@##ZmW^I?(CrW-pS zIwkridWX;aH;4wXBY>It#2H|h=g$Es*u`7@cIG0ySKtYe)0#npJ9qBDEZH!K-a%O! z^8djg*u9C*sUDKIYVa5M ze_88jxM&ReDqc&w@YeqTMh?BXp|?}NS+HG|aC0yrJ)&_pNG zPFeZafa}vQ66X4I&T#7?t~ebSmmP?U>w&q&v*vE2k-rG3a9uL^wSk`m)#PhOlvZdo9M; zWt3Yp{SDqbqA9B63$?_7=-iU)74q1Ud$&?xefX_ir7%(YnFp{vVy>F#0-Ybvu(cf$ zDo|uwUE@hE44^jYd07HEyFL4pdwv)N9kS#m4zGpI0Wclm3*40`9Pl-yz9KU&@Oy1c zGG9tYc`hRg%Zvu9kbH>^)RIfH2W6ck28;1zzirgwmWoaWE~OhZw@>b;=h=W|2(>Z!oYD1JO5$su}suDfI>Mx2>1ox4?bj%IUIkr#ZUGeHv=7M}%|oXP4%BI%P^How=f*=>#v!0eN$ zy<7t%GszCT|By&eLEDH6Gk1n(!33wD)AC};SSoAGcQ%7-#G}SP+tk~aC*l)|ZW*4x zI%}=dIaN+ow-%4xpXEd^V)=3WuHP#$XJT4H^Ph1CqT^DupsrWiE9!Z%w{DYdDD30G z_1wab^w(^W^VyXHpYpY_!^rYPld;+EY_Uhbb+YveC!1-ITs4a4=#{2AP2yv>?oO9F z&I#A8tz8haSqZ=XOj2ALxR_*+Lk~r0SVPT=WgVAa?)qU|9Wd5*&P1m&wd?#cRY+uD z%r$!7&Z#bKEEr#jXc-oP^%e=SOl6b1#2%x7u?S01s=jzp>VClrsjr-7`bx$McFa4^ zbiee0i;BH64^GLM`Q9^?>l^Gnb(;F#O*xsq6N6DtZ=O1M`qDZD?LAu03#RmDrvhc_ z-^d(fKH}qPggoxe(vI!${Kz$@B`j~BPG3{#gh>to<3&w zLe<8R;pU#ix*|D-(A!Qe@|IHg;Hl&bG&By^#(Y-hdsL3a@H=KqoSIZ_jJ@5|!G;%F z4xQ=1wI1q8??|DwF^XcD$uX{eO(HIH3PnJ@|1TBsjc`5;$&xkOpr_o~+B$1R9QWH{ zQZWOPB87OlU~`43LE&Ky_tnh@%qA(V@0bJcYNLvbTpdv)nsgK*>92_;w)pU~IsY_J zr@R*f&=f%mruQqJnN7`M)ixR)eBxT_Y;tCZUn-Ev>KWNkU0r9)b(R!(ydBPF?mX*0 z6(m8?OeFeBUVl_oI790m$bb_^yfzpz_h|@}3r@Hydc;NZxaRWyUmw1{gtXCW>&lQA z?rb=xHjj{}Uga6t6|nhO0Sv0SFxt1z3CMmeE-QSNK#09cuwmnMNiEGbY7aH3l^b+5 z2Z}s5=58{ux5F;0tO-Pv4t;()7LRtTw`t3jX-O*>$#3GC@pwEu5Gn6*cnP7bNw-PG zfLyC686zgtsg(b`to&XBY&Xy&5LfMN;vl?p0|%~Gt|xPX%qBe+Ns>`@D-$JB3cYg@ z>sY-GXIhh{d$Up8wA!l-2qjFY7@k2*V!L)Oj=w+&{}FkZn~0oa*sP5)%HC}AV(RoA z5?b?%@eLe7V;46WbFb|_x`(%F?9F8rj7EmW3|Q6-d;R>;UpxZA;#5xg?Q{cU zW8-Sy;5w0L&Ut~Q>H)hV@ccM?_H4;UPj-#4V-)A@g{ia0dK!4`T>+~rL|deeMeU7Z;Ae5rkx6;S~Q)+~N*Jqu_7qj<6> zR(R(#&y$L@M0?J0lp@#4*2RSEbQD_wnko|YJ(?A>J@< z^&Q>~4yEHZ3TgW9PsEzWSqDD%;_|f2<~-s3q-86Z<+@{qQ}6Q=G%PdJQ$|^#<4pN^0I-17homcq%4)02Nm8(H%}F;M4{G~#4GP&g1IShA{U1)#iX1~39ITzAnqrUiR` z#guUKdVIrRyr|=Qnc~!VM2!b)eDJgF$zilPVClpOHP$mc#GYCLOJ&_VckBi3sI&C+ zk9{VO09U&{BeoXE zK)M@6e|uiyiN=Ut19-F+z+;0wjXD<3%S&3}%x&QT)7X?|y%qGqvmrNn%amd+h&j&@ zQDx59wro9T^av&^>-V>BGLk|H-l-k~#kNvQgl(VkVSdxjaSVA~kjifdd3q50 zR1za?4^*{Jy*R>?2IT#z52SB2f{Ls(8MKqtyEek?^Tnj(_!( zx7w}vTyZmE8yq|2%w=EN_@Sz7cJSvLSoyF2*u>RS=IG~PRaAsz<80NAFW8h^C58`sJ@0aiThaAG~Dh6&u ztlUU5eN>7{`IKXnurpTnkLtnCXSR0BdiT5Jt%axz8?5>;Sblweqe4Vqcoheq+N*`gMVSze?;0O5soDwYhin3NBi% z(!p9$SB#Gnzv&vZEVwGC50{1~XL_#S#?&O~DvEHOWy_@TZEmsPuRkq$S!&!?IQGup zAD@VB2%3u83{z9ZK=hJUR zbMrU8>^A|&uZNyGOL_WD3EI}YwXG2&V0%_^3#2d&bmVWdd#lo=+T%)WMwVtUQI2Jk zbX^+@B<{}Ixh<9u>HH>|G)w=>Kh3GueJY`*0C#)d8`hh>DwAOOSdekMYqL;XV0=WT zR*7|222iUYL33YVY}Gq1tZ-ofXf;ub0imvrF5rHv+`Elstsz? z&MMMxh2zPxJ1bg0xGiao$IULk|Ge-5b0d#QN9$wVe0#`JvM1sNtvW4cFp{YA;7st7 z5;n6ippnAK-A;SqLiV+utPOraL5)BS*3f#7&-dI~r`t?C{(i8)5}xL`N0Vq~r_{&? zCclNeT$VF)D|3JYov%0=Yqc)=D%aIx=!%2N8|QushI90z=xW!ER5SIHS^cYR?Oyed z;N2$^f83(V6lw0ctXb*ddWj|jG*njUuiGv`Ql*02!#)qi?DWEO<$o>TXLh*mvjmCf6aJe|8@kaP;dNUNj8zu*qu%-#uHxgPgAx<$U8)6gF(j}AH9N}RP zMZ(zVs7D}IXNv05WQ<*SbNblHg#L~vVN&m@$AOTl#M(y+hSJ^VI#D>g~)f2sU?S`&J;ei zizRg8*!guYancLH%gV7VB=pu>PL%oYqf3>pF3TG60ReB`gfyc!kEiXYVi3I;0|DTq zC2JwAKqiBH!14%Tbxtv|@OObV!HpZ(ei2Hg=Zd2p__fi-7GweblLO>s=I5WUMM zcAiL>>)dA3?z>wM*)JYH0|xRH6TeXu_pcELuQ=$HZWHLGD=^K)dL;`;!twLsT>Xw>M(9Dj0bTiV0GY1_uWN0s@Zm4TYK1 z7IKxG0uA5^1r??&u{N|RdNZ%llc|HaVn1g{s#J2o$C}N{@I3+l_U27)PrVvBMUo?^ z0hx#K9}wGSg>)Ujc%;ViUTC(DTNJpp-FGT9Bu|;Yt0~Gn+WGKmk}XU!UI9)$;_xY) zVPnc)2m*zSnf*)@rTGlr%Ze1ktyhd}4!wj$elB(%*(+ZaxwrCoku{<89-%RGlX}!s zQMLW2W6x?NgM4Xw2g;zFx_kBc2vJ<|0F88Svgp^k2bo z%Yyx|Hi@uKV-m2`$Pw6Xu4>~aT=T9bkY4W))w!!bdNUDK%@sWbu6;%%tE1PbRLxi} zz9gw{jtC;M(>PY6PB-uOxM0z@;*hiwRcJD`U_XqEk1|JJlz`Hj%o}`I4p3Yujx%Ug zOX^ih2l8b=f@p*&?Oxm0B!RIeXrgiKe44~_AI&W25f=Gw@7&E@WR7F)EUGMqzy2`$yY-;uE;cm9c?p?g`>D#L> z%SSC#%+c}-yd^G^(aTHNOIT9srUlAA+tPyJkr~E~MM9DxqP*2Nq5V z@2e|@_#&0ToUnz}fgvx?s*b`dZ8QfnrKX2HJBb1K)V~6+Pi1mPR5apBI|fE2=3^$^ zM5D5tQyEvjRT<;F7^9=d5E~A2LLc%Vs><0Wk_oL|wE_n4FpiM>uuuolIwVNKo7?#{ z)pUukxb65)#e^^k%!8UV6=AnEx~DDLdb9Pd;(-k&;`4_YUHd5t2T3|JmKvY&_|TD* z(vl1I&Te1b_Fg#!A)2D+o6a<{32;AJn-O+=Rb&L}#<@}Ar?k#@-ysdkU^34;<~@nB zNu3*y4nKz&!NzGaKB@H@+nz7lwBrAjaD&Om;TVJXCxBvr;1%HSPhK-)Siya8c-)ye z>|>YXC>%R_yu4My>LVL!HFm;P`$_Ey{P*B3$;)g#MCGdJgrkBbM2afjlF!0e$J!w0 zk-}-J{XFj{`zoA6R~1yB>_%8`VE>5SCW*t*6TcZHu~5F<+R^dgt$TCs0!`_HMD1Wn z6K+MEkUrJ%Nvd1z|oDYTep;W!C+k;Gg@T^qE2#`%XEe z)+&F-^v~LoVjX$6kM735KoTNnDR2SGi?BoQ!X*a)JNPg13K=+ub^}zVi_{n2?FPiu z5ra2ATPaC@^W1Rr`M)1WE^)RmxCq@+IdMg3e4|0Vn-R_UAMxp6NIbEA_S+pvq5BH; zVG;k9$f$nfRq?cMOR>l66ds6Gj!zfYbp_fh9;(-8OwG(dW6lcyv9M(A$PM2n79q`$ zT#=^rEJxTpg*30Qic*)^EA#3^a@Bj|4=d7;GmMG)23!|onHMC5+`QN#j}G~}ccD$k zlT!VS_MQ66DOpR_MiyvtfRsO@T;PF}4X-TVAZItSYxNyVjp|amao4S#ZimU|Eb_73 zN=2Hpsi?*$i7UCLESs*@dMY2NQoCCj%F4!O*I(p!{*TV)3-VPMSAyvY&GEZB?fX9# zFiVIbWc!h)$b%7;4Wgi8iT$*`-}p@l*;*Mu z^>p>rQhgD^IWyqjf~P{z+qdn`8y5wnh%1F|7~Y!oH7LyLT;{>2KfcZ6sCHP^ux+7rzlMIg9tFI+%)CgPTvC_P+7^yaVFv2myQ5iBr zdDVR%W#WGS4$IW`G6X^>SU${|oYGaHVh|tiWLL>yXA&wE6n!?mKI$*9y0^0Ctk&Ks zUdn+e-SHy=SqA0Z1cPR%7ZSWP5}O%Ei6lx;URbV-PfUFO{v9eo>6C@1KaR5l#Xv@O zI_QEJ5av5Xr8594{U}F%AWDLfi*=t zFrXI~7cVwx`S2S#eKeGQgJp7F9$OXl$Kkx|;0Tum|or z7;WfI^7UsJi*$!XI6nN{O98eJ>cD&!aTxwV)yaEn{{8i*YQYQ=;I|I888xx7`bN0M zNuR?sxs_$=K)xQQP9g`WaA1e8dGGh7I7Y|i4pnh#Mk%9tA(hi=&*#`b>^oEiHxG%P zVsS1!q|d%;ZtG*ZS3O9H(;IlvCI14ia# zd__gY5uVRK!Ad(4wS})b!n*~+)lb}{Y&flxf+ab4_31J?JlDF>U`q@fHDP@3wSaba zkLDerWDsXPf=X&DPlRSxA_EMbT0auT>s(2a~kFYsQDm9XZg*w0jx#)C%x&SnLw?_6S}*BUxa7}!-%d|5bemzVcPS`E5Z&Z$ z*;L#r#aE{7`^=)|f!FX$x^+ya>{!)-da#G9h+$ zdAgcl-i)ZQgalsvJTxp3au5)@wA?qhCv@$*nsXQvIb`F=yF zA=LHF4wNLAee%hi%bB}CPtO_GDvpaa%WdnXe}p`9`R+T5g|^xO!-+gLk@M4vL!8m~0GFy`YP8t8Qv#4|tux zhZ^I)#OVI}uw`0sMN7UQI%YRu1Nl@*({EKo6yOXlN*CqaEDG68Y2^bm7E7+2F+ayOJ0!!uck*f%OON z!jcjbov_0;3qACcD8yH{;Efx^e(O}Br~}eCYy}_3H=a6RKsCZZ2N(C$J^(wlaa%6k zf^YqE#AI`_Fiyt5+=()nHTb$YI{}$ACaEgIqu!~=Mn|Ed@5_7v3;LR4c%MxLpM`gH#|Q}pzkggFOp-#2hJLVRR& zJY47Vvzc1L^B4Lmdp8KxE5id`DFH1Q;=CR5LqIdw!#mH|Pktf<_m-li%2Fhw(>X*$ zHrf?=Bg#d+wmnS7i!9^i)|v$3ilvL4AKm!aK}DqMc1|bL&)r74P?cNDiXx^k4Xto* zIdiTeL_#vamm*zi-U4B1i?#c!%c%HiagCXd+g8)g36xyCUcGXK=B*TU9(`pn~|AQ*06>HbG(a;I)^eL3Yx+m-XS+RwjfE&k^cx>|q2ci3Tr^Y&ILDIS9fS+~iO08gBI^1V3PxsekR1UQaP-5;)08*~%r_xT z;>PkGEgc=5x$bOrHMK0U7EM{nKkhy2if8T>gtzx-9|VOEInd6psMrCC=DB`icUf?< z5#4`+eX}jPs;WQXc8tfRFgwxz1QMMx(<``({Ep;`HvPrYn0hhws|Up1ul^^=jYd%d zy&#xOK@<;J-TzbA13aMEn0J)|AJxkBEv#%3|@k)D$@Gy?qm`aIeQL}knl+?Bx<;e#IB zr=hIe0+vJV9UW%BiiB8Y&)g$4Wb7h0#_X3z>X2b!&@4e_*N!NoNo()^kN1#Ay&yw? z{q&3onQ_Jf$r2Z%j>XO^jLd0+je2Q`U` zaipTu`jd3Y8+fc)BfXIA`O~M9u^jxRuTv8cT3B8o7~S=XT?-1Ho=yfJNG3Qbe8%%x^R5slb);D@_%1b7nW+vOR!Ami%C-C6AOP`d^V4;u$Z z22}Gm*BI3j4yYz$i_g!QGtAV3r2PG3QMuc~NlHeC8RcQ#zd@%QJcvzxO95+2g(i``x z*x+jK%g}u6+O-phkFaEgwLmO2mUvmo>GvQGlH6OjZgtgKaOe6v|M8@8o0ynzoM|`v z`r@D!4&F^|Fe9Uc+cS`UlCJ-F6vfpA8qrFa=1Os*nvSz3*5C-UP6Lxo6Jl}bT{r44 zWJDJimU>rn9<=*Hw=?WU5LUS-e68_xweJTAbx^wwNVs~BPJ|67UGxSTX!#yGMxV2R z)vi1)d^svai>!_IJ~C`@j-Ecob2OZ^^r(HK4kFs?@zLD#+J@0_Q|PM^%&f*hD=M|S zf1Ii~YM8`Q1z*dQThHllJFZ6(Kt+e~cB zW*!|zbeM~0xNQXsJ4>$h(zL54yp9v*HN22nFw$nC+rH7QXQy|(B(6c~Z*EV9A!1_! z8WYv_&pAOT#B}XicmEtWE=Q54RE9rB5X9FH8L(4NGznrpgxrueca0O2_XrVRZd_sK z1ZWU9nJwEp=QS?W^USupVk2j0)6mN^XWq=Z56M9+=vjM$W0tbrV!wDX5o8r&P76zp zq66waE>e^nmZ}epfmR!PPZUJ(&z^Rqh&j*4fh#DeuGH1qxqW?Ky*frOIVz)^V|GpI zZ0d+rm)5aN^qnd!1DRe4~yJpi5wF>Ln-be;Y z2O#4-|9AlMmZJGMG3UcnRJqVv7O0U&ihD?P$D}SB+1Dq-x?5Vptu}^aT`A3c++({* zbsi-#Xn&_R$cvtT{EP`McI@;_#nf<{eGUkZBg9{sc0yrB8`A%WzvL99uHB~dZGE@& z?l%~4mXYtbdgadx|LfSXV>>McJmuA7K^_&!_=FH3tdwM*T!)dTtgy4be(f2dp(@{V}L$lHO$2lk+hUL^aRr6WY)`2Sh z@)52K4mLKqNHtwuuXV?zgXBY(n$ll4|Dbdz@_m_Q$K^R;+1(wtKx2FV$6Uh3RKmX= zVmh|NGhh!=?^B_&s~L{Yt~yi|8+%^xLzo5BcK$n(EL zvG{o6(G&P`3e3cD47Mo+!3AIV3$`sb_U#*=B}{st>)^wO56P@>*9MIlP-D1)ifc6# zQDiq_yzy4kP3oE3aY2ue@yIf>cu%Gx@u-X9myHB`T*#f+qV(-&C>VLVs010+zJwCI zU!m_C+_+pX&^$IZ*X^Wzg69LJ?THvL65Jvp8P)CFLiGva?# zyK)_96_B9dxOB#){b$gng;}aY%+v}10PmdMYX~^K5m_4{F9M1rRI$9_&+j6&>s32&H02pw3zj9NzPs?1Ieloskk!N(Kh0uY=XnixurjA1s#Nh|PTxBMIY$c(;cw zC4R`oa$YwQI2Twg7o_Ok5-Yr7!tERD@F{mcDPZ^NO)rl){#O^48x-LOEuSO;VLNQu zb?L}gzp%^XM4A9>!6?sBjd;8#5=e1(+@LLXfg2ArK{p9P-Z>{M^fYtS&}-IBzIxSAvM^F}T3&I96hRFdc|D)u(F55d>* z4V;BZNl8$&`#``ii1n5`GnRt(65m@wQoZ@;DjmlpT7YEGl`f?)5UPN~Y?(EA;uUWx z-%nRd*36WOLV3KpgAr9FCARZ+;bh!Nd-fRLl9#!uvG(Z@(Z80zx~}}Tkag!BB_1Pt z`->u`TRwi;Mnma9P~a~#V@L{(b{zH2r-DA{si2hMn8+|-PT>~?ACIBp$HGEg;M+Es zqNImo)n$--Gjs$`%9Y1(A0poPPHGYWs5E*N=>hU-CLK61FBaLi%zpcF`tr zg-gFk=NQz*hw{gGx~^&U+FQe1f1)}7Cg2Nm00B60YMabhaB zh^hkrN0#b~2c+dGPd*CRCYSkcj(+)i>7?CdrFgXvT8-)m&*kJO!^l3Th5k&@RXIyB zwP?}#6STa?`p5=sC!B-A*Nk{dO&dBbYpf%AIf!aDDj7z3U-_#)R@Z*wbC~4XI2mD4 zVlu@bB2$?+A!_7q6I6te*D;T;wFvMe7Y$=Qh%qF)6OHGRBY*ZkW&AHXq)F`wHw2DVf8OUT9 zNhkH!%<4*^pfWqgb~pTXOTD;OG{^7n0S;J^$$D=9DmOk^bj!D<-fp&3rSgHW3L50H zY3dEh%S*Zr8+o;VFs>FN5f$d&`uQCe(E~ef&bp&kc|Ng!;-8GYsNi;|PskO_v6HfE z^HR_H%)HR^r~%es`Erkq<&j)cLT=xRV)2DXlx>wRE3}gL3Hh=26T_Dzr!IAv-x+gx zL}o~vpz?d|k^dlXn<7l)wyYU}1rA>Dl~@x(G$W{V=oLIw-XbD`dN zJ9z%;KucZSo#M-p5rUa_FJV``hG-}?19cuKy>w#=mwVERPSSKASc|h~i`t$G6UU|s z`v!kj*CLUK_Sx3A<>d4Vnnld>Jg@9L_s1pKv+^~-kh<5+^@WeV%?Yuc<{i9U zPVeRoWfP3MW?MlzaoKO0$jX>;i^2W3pE%Z>JsIXig=_o^eZP6uK+h+!GR07tpkurx zq{HAl|7)8hG;`ME2bJJ@=?4GD283L&S-rO%detdD_(+&n#;lU;&clKO92w2}WstNG zxoQ^4ITa{8jAZ?}d^*!3`xNY6_TL-2P>MRFxHwURjx1N4K{>uT8h0r3uEV(AyJ`8C zj4ZlIA8eRnuUi&yt#p*k*FjRdSFgWTps*{4TTgAGrgEF0Z>gy2=kE_huuO!NkwCBH zsR39k?M!@^p@sXenw^KM+A+qFw zDEa<@(PGg7_g_YL=7Rk_`W?DN^$7nSmA!kO-}-YXn0@5RRMEY>J%Lml_HZza4~`fO zPwz10v)azSimJ926W)5~QO_C$@3V1>xqoU;Bb~#z|5o`F`fD0Sk31+%O`=anh+Y8E z*^=jU^L zjGp47v!7#8kacfd<{1s34F+I{>>?C-1myUs6S&y76Hj|9FOo>_R|X#LPLPv}Kwsj` zmEMUTwc=1`A8n}z1}Eeu04Kng9H~Iz=}ao4@HR_k6aEY)7t0|wdRg~n0yo4C{#Bx0 z>63O|<+FtooT~^RB(#G{ktO*$bxMj2b{H)OMR7QS(y-iO+vqj}tbVlWP8@QodxO#k z@)|=ReE`@+o4^ZgP*{Pls;tJb{}%u?Cm0wE!MHv%ci|HPE2S#lBFA*}$Pq9>TFu3z zOqWA#=P)@+3~$(FWghtt&g%cch>QK6_mf+0PFrt_SUHhex$-)Su8Ov=2B}NA?HyLc zCKaKOVs-z%nwpxl^kHT=)-M_DB|JA;aK(@hu0$dwOeKmHX;-B zi`bVX?LVm4JB**H4@3?mkKB@dsA+G%42A>>*2g;)c{F)+cw+8Cl&V0n`_-!TiS(0> z4MQe@H}XRCScDa9qYzXP;hh?XwY%#ke2|Ti{yj#}E&ll!`NiI(@}X}p1ehP-^@BSf zo^PeuEh>smqi;IYn>BvN;h^^R;S{;L^n!tMO#9Q&lGW>YkDva7Jf)U|xVuV;P}d!ynHqqA_wg@5iCwuvqQs;#h? zNA7Idw2hW#oBy~BGqq@_&66GKc=&;x(%cU}>z6y6kPj^6CxEs=mlm8cc@1%HU*f{% zhKp*6KPbBQ-VA@Y@DZOth5DMFw^O&`(6H#r=z@imUEUfQ;JVglo{c`3S;g@9KYr_} z7Soo?OSWrwj)$A}J}YzoTGG9DY9On1NDn_?m!pXLK_$Xy{Zjn|SQ{0CKpEKoD2ukL zvQ6vL*E*v!^J@DmdEn{I!H}GMR}S_P`M+K~?cRQv)X?)NKmVAr>=B=KNIY+wntpP` z_iD>)vGm{Hk>E z);zbcK}R+>x&n6Eg7$NGfyN=R;LidMgQUK3+iOHB0la%Nj<$2q1MhveHD&&R!$!X# z9dL#i?Mv|t&Le_79j?Dz@EJyfeW`;ZHk+QGCO#cBr;mMmhBBB@Y8YhU+r-Vx7HHzM zHq$|_ML~)TWC#A&@?%g-hkwoiSQ)UZ$<~D28fU<6p;E+;0EiemG$Z2ynsr_n)IACQ z9Fp>6Mvxhqsy>=^qt_+Fowz3Oi`g}*y#5jfi$rziZi>(2(NfgHi%R(C!s3Bm2<(gp zA|iE&M`1g;U|pz-xxax3b67KQ07`EdW$o4^|Y=(;aZK zGFRLqlMIk!(4xQ{&yotP6u@^*%y|J!?)H*7N8vYNzWEjI`)EJUxxnb;vRqvga&#!y;iC?@8(p4#W7~%^ z`GffF=xj76uuCC?`Jz;HGYkinizxIZ7HGF`e^Cf?1N;-aSx^A|Vtap~KiWEj^U8@+ z0AHFP4TI25NJFNnsVTe#+Ha`$LusFkg74_l07$dy{pJ_%{0O(aOs=VaI7&VdV$V^^ z2KtI`Fthb^X#IN9-ahhDtJGZ_GiPS--hE!nxdG9d@{GaWb* z4f?DGrw)q&r$=!sf>jGRk8@qqMX^OcVb%i&LNKRn7Nl^u(_5yeEly9Z7#BPSd479c zLj$q}f?K_QC~YrvW%j@<3NYTq3d3r^gYchj>old*@K4)~aIt0V0$)58n;W7`MKm~W zv8Wv5aakiRlqSlJ|J`rohcvh0<(g!#tY_Ni=UvsGZpn4m$0*~E_Bs!a{Jb!%qSY<7 z$*h7)dFqs8Y@7MhxltUS9e-|ha}Q4bNXxbBr$wkC!UqQU3RI+#PEdXx9UVp44rNe5 z%0))-@C!p?P;>=^F*P-{9KB>WUKa{&+ONHK1h5^dosj>i4w|PJwx7w2 z&k~v(u&vL$RxnacTy4rVjl=Y4%>J65p93RL8Jo9>T$4&;zb6~7_D6}&y0UdRwi8K+ zm6f{EmEBow&lGM2w+v|Or+kRcfiUjl>)VrKphvv>f$uKAA<%>}HPSEUFOCIEX;CQ0 zTvOuz1=)egQAK6tO6Wiii6)@lD*wD3b^g-7+7jl`$%|pr40sP8A>s%3n$(5A@b~d&V*jz# z*R{5mJmUIaK0=naoixlN|Lwdvhq*W(q%E-0yWeQssa~lAYYON0?c1+~9)Zix=mhI@ zE)++;=#q2J4-{3$X8IDclmocv6X=Mz@!R$D$e5Io`d!hLFTzTLNAKUxs8c|SgHu_a zxZ$$STyn=Ye2|C8zyW9wC@TwIbF+o(qx37b$vtJx`;x0HhyO@lO#MVFRHl6g&zH*D zCyhJJ;8p9J#o}UPxqda=#L_e*Hymt)lXfl_4)QNg$+w53{x3Or)dK%Hu#nGE_@}sn z^%`x%tNMw0S@I>r4ngzDbTW7s9&#hi`c7+*Q7Fn(wtZIU@MCtn`s@(;izVOJrVe@5 zH#8_KDJm)`DBQX7(OHe>E{_TiGJzg;%sPH=Rn<|SN_-XqW^=T+CRZ} z|4nghSDyr9_rEHJ`v2YC${(ik=`r$p`D63t#E)MlU~=RRRG2$=-c&;LvxgkLK;-^9 zHv69Qh{*y8UocU_lT=txvLgS&tatGQK^EfsJ%`Bo?i=r`moHC3fxAuW*|d#YciB=+ zj6$cF51BjPxVhy|%4o(&T}9P@KRZ`_{?n-nc+t;KlB2K<0dLiWY$g^}S$9P`Mz7`c zS@C$siyR!YWJw{kom!cbi=gJnCGzf>TTm|3oPlbaq92}ZnN#p#>Y0$Bxb zj4;)?E9F}(JjEL(%dJrM3w-nD^K3>YlzC&=j4JIN8zZyH3eplow0VO2aK&8tDye*} ze~#rz#{OoSoNW)Kjz`U(jNEK7COV*=Pc|r5jw`=C1O|BT|T<@!*- zEc!}}y!!N)zsg0LJ}mFcyLYK8WY&v#tY)~i#{-UhtKUch<`p*G09jB~Rn=79L<8V@ z@;uTLI^G_%ior1E9|94VtS zB{${~Eil`kOQpN)H;xC9;EU6g$$TrQf#kMSm64Lk?~0%ft8RAZe%TxYUJKc&auHXX z!P-HnSdnP)uqJ4z<^j$J+1ELlBe7{$zANMr0G+uqBldAe6G@{or&ilbM#g6aJM4bL zM!_et8OWB!mZe7rl#GO%3l5Winv63ae#o?C{hh-SoP1?H4K=QjfAL5GyLvi|?fL|9QakS>S5mIbnZ#UNYCiIn8k?;i zW3~J{c5rZ?j3g-r-pP6xd6#7ZNI`uAG=9gIDjm-N%`9dT9r^WO9|+$Z-{1w(Y73Rm z#VO2n+kh6Q=(6WP5R6+OgG0jnQHWOxHXN(Ul4=cjn`6!TGJ|t<@)NCdh?9D_cQ5Yl zj`sAAdj#xx*C?5hU5+6?Q`-F+cIt05=ottJ%{I3(65G0 z!83H_{X=0=6JvV~i_C&L#~cLgAU!du<1XoMS@dkD%GN6ZoGU7n{@V7ZR=b&v**PD; z^E8N7>bSfYcg@@-5Cka$RE6i}aeiYUH>E1~cvMa*n)HC7MY-b~11&8(yWos3BlmxL zXs7_gz1?7kmPUXSK?eDJ&;Lu9%Kzub25d_%E1w@Pho=YfmR;fE`n}wkyFQ9BnlVw0 zt=zb_1eBo2+Izr+2E6-Sgs0l7SDCeIQcWPh99;9@9}1FrExP#u=XF>!o>dp;21^xt za)z2DYD!^5LD{*3^|*}dbVq2TtnHV+H%8`)yR7%(<)!Y%3hFYRp$4}{k6+)T-Mp4K zMYIzYw=IE{_U+x~!U!7woTVD3&ydJ6PjRO5P#LrzsTYX=GH7ZDN{ChBn;v`mKtK!b z8RW6gaiBIPqe@qnc=`G5peoTXA86ETIF=2x@&6JK)`AMBi8ZoY(?tQO|x%aXCFP0ZvzL;1r`f4w>z1ZzD% zI^U#3f6Co|MA!&bYEJ^~EqYeJymq{{esE-TwkJVy>|QCZJw&O?F1Ct);18N2@l`o4 zXQrbhL6QyT^%9xF1cx{HhPQ2P2Y=PU#|*Sv0Ep2x#-q3yspqS}(d)JN#uOzVmYRkp z10R((wJ)5{Dr~-_in>2pv_3f?1F2-&L(5=*640MNlWck|Dil-jgHD?l&I(x~^Br1` z@U|R1c8oYP)f~Ce+@qhyd05o-q5y;EU~l*vR_#p5pH`dunr%qA_r2~SJWvlK&VRPV zb$`Q#eaiQkuxc#jD!d@>ahDD@0#>Sf_T}Pqp33l6N9ABap7J95Jl4RI%@8Y>YsT5t z1C^7&H-*L?)v0%@{T;w0WWSK`wZc{jyXcNZ*cSh=cHI*YlOi*r`h18g8QeLv9FLyt z`)WCXi7z4!BSlSil{*7{4~Cr&KV)Z};Y>LaO|s1iK5JpS>D5Ir;n#OHYxMF$RSgO} z`1t`a<_sq?y!G?L*GPw%LeHWV6TcVBd7WJ_VRouL0EbjT0MZHj*3Vxik=s9h{Fo77 zXk10;chv2#aQFplA1PfM6qdhe;phk(^(O{qpM%@f6P}KI(;v z$dt;}%6@NJg^%(`BUfCRuKbzFF5rB1p9emnE8CeRmGm%lc?dV zC9AdLjg5td5zo+%TM@<4k@3tQpLKH<5}PiUpl#7^xfO)|-#wEso{w8AUlNL7L-`*3 zXPG1ViY6xa?l*b(ki}Quv8&5(gl)o&)D*{sPj>i~_&5*2D zrm`$^7j-YpD5mV&Jw`*Y&LB;JB=sW2E|IbR?VWDf0#OcovXwQk2JgtrM_}E$v9EU6 zCHKren>w;QX7T)`0nQ)bDUlb@*wg?WU&qlmcYf-ML;dWX?mM!Zu3#YuMiV+U$tfvj zrlvZWgS*#{*gy&)v%*&)PiOiM#`zJcQcm9GdE z7M4ZVd%O3CHVtIqgqGjW{#HJHiZV;c7Iae{AMf(_hYAQ%;rf(bT$v-7z9Aj>jr#wb zf`oUtuWz2bGII}|ym2LvtEWC9Q!-aC*KhW;_^ zW)xX&Gu2`c5dYmjio9=ux+rlXxr(2n@S<K6Yq`OL={Ce1TmoO3xhBnl@ zyt70P=rodSq`L1HSRD-I87KMJVbmqaHzbCrjDHej9`Ewgo8ocLj_jvrs^X&)_^B>} z06@WgWV?Dl#W8Y~m3Zjb_!FTn$RFh7V z;Djq8S}E_Z8YAf*4Or%(T^f%J7UIe0>A1`gkP6DNA^oiCU{oUjlp+GXZIfi^+}y?0 zKAD;zi2@Pxg_ubHrI$B$xy2KiI|7=Ml&oLGNmYs`T}&MeM%@m(=;nmERndw$?HpCa zytehs4+TJGc9IJ&{p2|?@2vmq9*y4(-iqr2J4H8P#nb~Le#SMW*0t|w!b@$Il%x}X z8+?9}Pe;}}Ul7B$Ajn|)_M^C5<(Ko{^$dS`EvF4RNpRz!EJMNcY>9RW|H~ujHt6usBLE5r9WrRROXrZ1e`EVtM{$v=8 zjD-j^vP#b|fTqr;6OS|29~Id|>1?iDfc`t{-{0qM1@N(58OUO7gXTqKT)km9HNjQ+ znEQArko26y_4*49qvta_9=I<>o;|m7J`z^uQ=QVwKPC>5&qfBU*R@b&8TYvL8*Zqe z>~gMhFOun9#Xc=S%8e!_f_8TteC%p z8;*L^^4F0g1I6wbvpkTd?k<)8(cE`NMYSzkqo^1GQ4x?Nk^}?=l^hh2B%l2e>b$!!f$5 z?dsckx+*3;Px4SJ*N|ebexyD8e%m;)UOi3$q^N-+7n7&;v?>{5yYdSW2WaT%xY8Cn z%@%AIZzm}ad#sF(j!V$U_8z(k^q^)3vE?8BOaw)$M;|2k-Zmw^BQ~hue7$rZbgv?h z+&J$05enpnSy^>9f{;~P{%jhM40Td%6>^x&b$7?Fv7u!Td#T>2D!|`y zErd~X#GS-F;#{8^NE@@qE;OViTtT#p;{u}_0B@?JvAd6S;hMcGEL~#OT7*tAJDm(3 z>ne(!&AQm6Nh5%It3xc6`7h$#{i0f?RN2^jo8CWPH4C?Rri~@no(#K}DtP9!~8WiLa5__zCp2PjKru|d5E?(S;CVHIR;jz8u`o44I z)UmWZg11nVtBA0$cGb+H#NHIjerc@Fnss4JlazXw40bD5@KkDYGE|B_GBz&J;|p~W@_OTu7FLT$Y6pTBh>RvQw&!W*^l9Q8teSHh}c7Tk%W6#V@9%=y$^Z#2| z?Za$erB!WX6chduE%SG*5jc$xb{X*ZSZAL?`7Y!bZ1J4EY^26-c6e{ccf*&BKs}n} zIFT8?kN=J&HEiZPAu}y+=%~)CU+&O>Kgko0&0a_4VxbT}2c$>7SoE5MRdfHnEZd4l zcc7-X4xXs#7l@2CK}E}f~zwuL~zWo`YC~PMk2$-XGy%Eyc`mz zREHt(m310cztXTP!4BBxenj@UAA>5_R;(0f(-tUol-o_YOr>1H#-f<|lkZE}SilAs zvqrUr5k4o)j5{LWfNUF<$W!U;+KJ+{^swPrN|I~5|a@YQF#y3%!D zNM;FMi1F~_n^bZtP8W(<($m$x*ql;3aHfX)tnNgn#%Z%BDO?Z2M2GHSJI!w#xDohX z?KHxz(BPiglNmOuGdGNmagIsF{O|1}`|5`6F31k`K@WT73EiVm-vD(h-4u)} zIu3F=kOQ)=JyV%%^80&%VKCn#O@kZT1k&Ws%86CZ>weR-ZDXvY4@ZVRLTdK}yp-Id!k-?Ml#qp7Q*Go$x>`@IK{z?&;)@E9B8}jXje+N~ve;{Wb<3*8S+jrxIgvBcpvGkXph1&C8sf!uu;nrP9)9{J=kuaDm+C@LEe}Kdb1Q0B# z2vTeFjTGZ;=36f?1rmr0QBjzj{Jy$ihG7tR$?Nj4t+z!Zn({0eox8M6CoP9pelR7z z4hq^@MVu2$H5JXW`F4<@*rK<}xIrbO8sfCU3D=!}M^E0xD;9=SPnFr18*h87;6s%K z3X-jXLa)NaZ}-Od_$xnJTE*E9mL-eq&e;PH=@lDa{|M4gO)5Y#@z;9?3N(uD>q}>@iQeJ@YISeb1*>_1?-l#0cM*X?;4Rz)e7WcCH z%F6er!L%upzgtSX?A<1!y3yppmH7uf&99ZnZ$5oFNb~mr;|$9H!nVd%#d0f?h((Ed z3|ZchQ|y`IE73r|(4jDO#hqzd?%gy!>#`}?4>bY$TwNES{#bnek68pq{q?7kKGdj2l1HOT?DeNF)D)V?<=q=2%^U{HM6LTj!bqAz7g%g*g5w(#^k-+u7qd4k8mzk$fwYR;%#3Z^wlcp;A*)k-HPgUgOh~@KGKFV0~$MCwdA*tPSBQ_bY1e=Ks{Klxev(y>% zJ{P+-_AB@mHZHmGM4M?h3b-$xV8$XYlhsJJc<3?731JegB|Idw_;1-a;C{A$1BxcEBSLOy)hs*fdTu0OFqr=QLB=qf6%`sa0CZBb2T_ z(={XLhIu2H8SlpIHaUo!7|q3R=!Q&125H{P>HZb^rcrsZ!KX@Wu?cO%kVP+R6`5dj zN`W0sR?M|$CB!&})Q}R>%t%qy>Yb^MEWNwr`a>vn@mZWm@aMF?^!cbu^{N8o^Kay; z%HI3Ku^%hR=8+pWv`80^|p zP|pxMo2zBb6I-#es^Dy=sH6lk3bBjU9l59y%s%1kY-}?6UgLt!l#wR&cEJ+JDRfvG z;4S63>0zb<2Ym;Ba>i@7Up?^CZu-lHmZQeanp@84?m2a7)=A zlKa}%mE~1Oan#2kJk&ieid5nV_+fXPzSkX2K6$b!VAJ2a^qiiAc@w70sr?V1);IKa zK{f;wE%lubZe+Dh`M+DIS{*v9mF#2J5pwV&;4czN4`@$t#QX9W-m*WFAa9}c_Ucsc z^3fT-5;964iI7OG5%0aL4CA|VU1FAq^5)K2JL%Q)@Nst48-0NiW4Wu|coTvSg1dRp z^T3sh+l`Y`0=!V#t&TkWzrL(*PDwHkhv_o-lKcV!lBxGNPapNWnV~3?;5mL#F2Qg7 zm7M3DOzPdIv97nZ>qw2y&dwef7-(;A2jYy=MdI-v?o9(OVRAkiZhGFCC47>_S)`pQ z_WABJo|nYr7Zh~oA(Y9JcP}5t!Q#vto|Z&s3b6xt&6i4XHsfgt%ckdvm*PCFz`(m? z$BL5M@KL?IJL(LYdMeRTQMDievvWI6^RToF&bKprF~q`1_5(E{yd0*smX^88vdnwe zc*nOC$f~TcF{T=|ca37msVaS;dZpILFpRKK2~DHT z(;?vl=*CLi-RXY8N+9S|uT9vSOfZ@aL}~u4-u8k*8sHxPo;aHsp|A}b-s-Hg3^>{2 zQsr%QIkF*&5#izEUuVcDE?yEvgX%9-EcZ>@4uW8p!`vf!J#r@Dr7jpgVfOa3ziEc2 z9kxj+PB8Lcg`n2o0Fk0U7mDo*6tC@m3&K%v%CxElvKr9U7;@b9S&g9zWn~awtVBu!UtEBqMBni zI1+Om?u=w?w%j(;F0<>k4d4e4J{0z`sx3BHkf6Hr(fZlc09bH5MWo2ylSU^D@j2pi zV+>rhry&p$Dh)(d-j#_aO`5bUwgWeJpY*h+pVUiL1dyx&X3`4$2K+O_aFg3E<4B8^ zCN~Jo#3;y5-N=yK=owQ{R#FNQHUQr_`7YO`jiq-=E}8fo)^I z6w>UHon9iw#x}7YSW7hxq7FKGDi7)PxS&aiy6Ix^<+?SEVzZ7%PQjBS(1xpbEZST6`9S;leN29YetyEhzLJ}#{yH;N7DBr!C04k3nF_%)8F1%G~XyS|9fH6Un zf^bO;82_#Z#eoc>28KOe`$*?dG1ER-PcC0SL^Ir@lrz)O369_HqIz9@lleym-=_CM z+^lD!L!a4L-S&&v9Erg)eHH-) z9`rVO9Qc&TF2v*1+vsT!uk zwVBl(Jt>Nsulzu4BvHuP#<})k*5KZagoXQEa8>*g5(X~{J=9U`?v@}SX^Rr)yL4$T z))^&29?x&`*0?B^0;S?V*Dt8Qm7OZ#v;be zMxW4Hj+vQDdlMhuQd(Ntn&`PVUG1yt1;WKHPK79|?^@rorPtqW6FgF(YIT)QB%$WD zVj~ofuc0~j22N*uN-iPnpNsh>GaB?JfIVjN9jUaTn3fDCuqzLN*}N#X`}QjS0b&dd z0^x*Tr$O6nAUPP6&7RfUUKJJ9^_T{~fA6|tCmU?T#27l)z8mgt9tn+iO3YO6YG`O! zT3VW!U2NDj2nzb#OPd#zZ!Gb!D&JbtQyaVb2WY4IhkZYtiHV#Tw=gJpqy#08b$`8I zM*VV#*ujQ^do3PT_n_`^#l7sc$WoQxC&ZpGF#ZC;a*Wx2)kCCVZ?0c z54jpFUwia)u}ze0%s9Ak{oD^Om-3Cw$h#CwPvlFQbm!Mm_X#gf3(4>0;{u4W=@to>$p`VxpRe18_IfURRO7VdF&{QvQh`qf64%YgJ;K zW1o|5<`;1_n5V=GPxQo0Z}^zrVZTpxShvVR*zm{UnY`lrGau+Apa1LaUN;K<^xz-r zWfaf;*ln+(K<;9TbJ<=W{2Z-WwNSaP?ZEl-{&`32pCcUy4GJWY##C(H_ZaFBgDL-d z8Ps)rf=~6}6hp;V-R)JQAdRp_+EW!woBe0gC5AT=Z)fpr_ULL&w{R~RY|kDcJ=FWO z!xA%Zh?podbszL7!1frjR!{i|Rq4H*7)1QudRUF?b8gKD+5Drw5QcHD`B7ex7P3gK zzBcr};M803yWd4CI)<=0H(VN*W@CmLR^5N7Rav+dJGOCDooUPh+A@2{@-=c7BrZco z*jRa@F~}YL(UVrpi2sN>bG)ddrHzdZWSO#8pFe*Ny`@>%*`X;|@uyEe=lM*)vj@Q{ zh|s*UGXPbpVjD`M&j$HOO>O`e3d+im-)Vymo0E%c1e~iDQ3CgBF>RoLmXGQ2;B6@_8A6CDIP-{p$=9?8HwL87Y77m4wF4^H09KR*QBY z$&%B-*H&y_)sfN3b!*q`)q7Usb;BVdo_!)MqSBTyf6T(leN3sWAJ^OJye;&Q(nudU zyY8EpKlLNTP-kK~&22ks;raqCV&ZjUf`N&=inDP_9{+Y?)j&F<>m>J3DsHW+c@2%5 zXyK#B|I8Q{H;bg_Oj$`b@~6QIQD=M7vhIvhq#G2U36*bwjBEHWsI#pC5d|Qf*ILH# z+l<#2pd?&@t*b1)qGn++3vj4{gZxQ$Rum}eSwe$N(EL*YMTPFleQ5%##R?i4(O-CU zi<+ll^N`f;gc>}a6-IHF`twaOd@&m!C04QT--qVQCXOD{H&;bAisJIDZRNUBcOmpv z;YP9OuxSMK`H8wDj^idw=Sp-pED&QWs121rxujLNi5I-sLM^L}ULTqn{s-b6Z!}(Q zy|e1|Y+aJTeHN_#(=$sPkKWHH&HIv^Poma_neh4Vf8b1#L@TYUaq6oYRRJZ1OF5|& zf-a&Ge~Lpy0v4N?X?K<}C|{Vi#+!9gFiG$@o2>#JP4T(NaO|$+|(?}jp!G@7<;9k0>K)zXyVc^FU-K=)UexOGjYIt)e^W0(R z%jXEqsI*oXL>=TrT$Wn|Qw-G9>_Bj!GY>ILcUf528MG0ny&b}0Qt!UwiUJWD;Z3NL zk8ugScp%fh@?#h29n)Dp(>7431y0r>MvWY@H!RPtSpH?$f9QKJ1ld=4CZ8YS#k?_r z?_HgXyQU+2uzpcLwQtVwS#tN6=uv?b5I`sm}W!o*?BY9;A<8}0?6pL@9F ziTe5tr9%B2QJsy=DXq%k_)~pzjUScWqBypvn{1G626}UNn;##IFuJ^Jf3#d(hw&;^ zf{dhC>*Fc8l1@ltl|d;XXhSa0Dr5u{d7^xRgnJpfsj)FTW_&XBN1AEkipk;)pF@R~ zgBu_RCOPt}k>8@{6PS$2iHR0aEW>sv59gZ%Xg25*rd?#<4O@F8!I1#TDv&rkDweH7 zaarcqKR29L<@-n0x+}K(rd*%!=GEgAtuvw$Kf>Y{8NlE<&8BW(5LK&%^dfFGS;1vV zY|jK2<5H@Sw4RHdX%!<`%B~$hw|}2?D{b3Qd8#=ROg*ETWTW<7^zP$gZYr-t!cW|N z^_ies?q4FUhhjAFL!^<`tl~NtU4<_Z3_U8p@Bz;@SK9nlx|zTlW>_-w@bOj8iSZZ8bTl?J-r(2zD8nd~%2|`ZS zK|IfJehIiOIPxwYo|81MT zTPfwVL4(<@z_{uqtd%XZp{b1c&r^0e{Bz;}IN3o2TZEShSIpUA7)u*39UQ_BEnQ!G zx2%pnRO)7Pa)moCHr9E({-o*455DR3LyhD!|JdPQIWfE0PrNPQh?>4aYI#0JnfIfI z3GlX5b#&Gp<5bK){FlR#m*A_CG8y?cn8Ui!%Wu*xWgu7507szs?1 z2ixAbtbD4QxQzS05qd(q&!f8=B1pUaB&j~P@!uZ^yEeqy9J@Zb0vPSZiGRgttx)Cl z&g_LvyNm-^s^MpVUQQ4Z&*Q_sY!k9E6%m)(p5u<_-`d5MHtX0Y=ECE`Z$Uq8$`5zs zFF0sowQ_=tgrp7Vm4dHcNO3A~2S3VgcD7aTx@2pMN>HPdd|^zJGTvT)FuaNNtRio$ zp3s(gCTp=pUt|O*+{VS}>gXu&XKRPKM+`=YN4|^PVm$!>keGRk;5_0RT^QHIuVHCG z7<#MD^vL7Rt45ZX+q|KA>|>Y{8>;Z`5e3emH4q!C*ZcN#uVAluue661C5hJ`AaKP2 z%qF7m0V4kTzYQS$Cs6-?5SRLIF3Uo7ShA(LY;!5W+S(f4x*R`m&6Yxzvsyf4&~j4`_Ox9Dd(8k->4M;z25T^OYLMVXJu%mmg}OD%AW| zLV>)k|G50%FU-*O*K5(Y<10xys+YeV8?ls~K04jcc1d!3y*Ajgox_4VyO% zNpMAN@^>ANescVpqI)vKWM)}G5tX2cop(ZtDDZ=PU{ zq;(uvbj3Ff47^)1T?IHoH$9ZI=joe<5LCA(SOcXSL9|7TnH*(I=X>l3VrjY z2jZy^<%bB4=YNb9Ataq%+FSgW{9a`d*i^-0GRAl_WdMxXovvR`i9`bIfr z67S383e$bkqs;XW1`K@@3SQ&^wNXyx%KQgYRzZ*WZZmZ`ty_4@+BOq)4*wDR+H(KZ zHC*{LC_8bi!75|yZig$9zB&oY3F8xnP}A4{^danK9OQoyHhx{V7nmzcD)=0-_%>6N z(kZdCaEe>dz;cWqt>Crq=|+Ahn=lex&9o9`bVswaQPE87hCLfai`#g!K>s6;)zVIu zrf93_2O8<~J_Laqh`1pRr1E{ubgQH)s!Ex}rnjw5+6?8>R%|4chxWpc0I)FS+c)rv z&itX0IXTKJG}~`9XUr#_9}}_c&3A7I2Sf?tttpEy&RK=~rwzKUHZ1>0mRCi~r-X=| zfJ`8pwcJiT%qV6r9wz6H7!+H|E@+J=&kyhE>9N`_yg>(%%<~jlAYffzuVuLNK|;iE z^+rJ(;YmK#v?)Gf8Bq3ZF4pK&-}8A)x6pE{v(IW)FqH>lt_|LbF}$|T+$ZZrehzyf z-@((R=xBcX=y*BU$U5Hdz>7K2rQZ?)i0MSPG9CRuiR{It-u)rJ-)xo2(1NB}sA-2g zUU7764B<2)W6!Dk%T-rW)>WkNqhp71%kPp7Y{Hc~OuFe=F^(o~PO(pp2x}1V4d5dP zKl5~d7FVX|Fxb}HQ)gHqkfZR+U86fSPtQ;q1bd5~;=jFljxEik|9L~dNQp^x+XF2d zd_{kPi_atqSMWuQ@FODJZ@j5f8=>%(`=U5a^U+TC%Y-}6vRiuUN;*aC&#mkv9!&;1 zNx1iU=@7#xutEu6l;R+d^`*Kw$L(yb%aQ=$N?uoIBRZoa#ZY`v?7zkhQ(G43J#QyM z7)!r680u&;R?uuAP3=P4y?z>FAoDC9RUKrsJKzUe_mYkod6^8GEu2ve5osHujZQDc z_;dok$QPCVeoFwY$@WReKW1ETi`cSSkv2i@>y)9JF=u;|^}y3C$Y}O`h>=*pR0k%a z5sX6yDnUT=Z$l1gcZgKVguf7b()g*C?acJOqOZ6jkKk21a~Vu(;@cMMv?+0;;NkmA zCD5+ksKMLjsEt9F?$v!8Gd}%>cO3oxZRW=ix}c+{u5@rv=VYdhR9uxsoJ1;ND?NnX zsH{=lppgq>Y8LjDPjely4LVjz)%mHPT>H+r`(0_2pz&lE>UuPr#4C?TsQVJMm)5*8 zmudaa$v*=9Gf~26m0OZte~*ev{_Z3ODS-kI?0+QgbM=_kOxR<{Wt!=&4J@lD%gKHE zm?V~_@g%yYQl@ywMHd7gB{%EpkmOxL8-d8Wn6Clo?he>zuvm}$lnn=YJ?$ck(!ma) z_tu^}(a#MRdMr88I?&V_44OO}U-iA|uHk@F4-Cd8R5?yuek%dZq{k*o-M)HxuTCo3 zcUBgYs-ep~%&*tIOU0>?Z4P3PdX8HUgac>==8JXq<8Y4WfNjv@W$m@0AcRQ5BeEt?t(?7JF~pS06%Y1h|ESz^(vMeXz>r zu3l$ER&Q*_zRy#_7>Qkss)B(FytJX`&6lMkn0tVvhKOH|crtIYAUIrOb9dWMoM zdU{~ZmZ>k@4j}}sgfA-F73ON9%fw`h%m-b7PQW0r0Sp5F;|%N}OS@^(Sx|c3!Yk=Q zC)B*5y^LpKEY8B-w0BKE*zF?O#>|8GwzV}Xr!bJ4`w2~@_^R}tOj0^OqrYa3ZNzB^ z7tKiB*T%0->QsL^Jx&+6gMMd2WH1lt>zt^G0p;SL1HxN;Ebac+3?%H^Ns^`tn(D2i zYL7aNjs}QUZne5jzxl_wa;<3nF&{JoN&B!S{n!s!jI6t{J-z3-bSCwQ zEeop$Ajr;oN~Di8`yNBfn!q>P(Y`=;^o{YQL7OJd71^NO2?_~H;y7z+e)RmlUuq6Q zuu6Z6Z#&yXOX4~1#_Jha_m~S3UgZ))_bA9WmgAxzX~CaejaXUKjH%1^_Q_RJPzd)A zIm12l$w0rHw_Msk5t=Y$RY#p}=2;qGr(n_4x3`BK6G={Zq$c`DmX;#y;`l|b(tIr| zTcucjrG&~y5@JoC^^Z~W<_|smL`!ycK18RR+g$uBL2GyBF7^)-?j{@rw!-X7D&oW~ zkZ%H!_4AsILT@F?|MUwEZY(6oB=B`sPYkQ%xQa^2>@c8uAtctSsJ?C)*026t~3LuB?{HdnV_$Ltwv^)PyE}Q=5dHQokeCX<;=9xc70$#Pik@2RXgfqt->}(i9LtgS3XF8WSO{CJy?pH>n>>_M zm!iD6c(GF1F0*SrGfg9h^yxLx%tJ(ueFNJduz?8QTL&Qt^z9TfBk9%x?qRwE`x@;N z_4K=GNbJFMNv0ZUgmf}`TK}YY+L5pJJ5JRxUzLjkx~wbC%V+=8iI8XHn_d!*P4j)r zkj1E8aFQiOCrf<2BfIzhH9&@I{*nV(MZQm`IZtk`9~u_;bT7y@oTcix`#u-Nr^mJf z3Fv7BbNgo`Y1fIL+MIL*B>W#=8*;@YSGjjU&J`PgFwoSPU+h+8dbUgXl6=~6+g*K* z^8Ipd#dF{j)JuCp2e0L&V<~Kcj;2sFe~OBV(dk(#A(EIagxw?Vsu{}#vBb|kj8NYBQPx#b?ufMtqqbHSEe1wS2nye)(Rq`uUW%*W1gli_g^5Y*25ted0~O!4DBFfZGWJ& z(k{DA_ zTp82}uEmS~bPB@W9wYPw6!S)?i>01Avbkj#a_Rv~-Dp<)eFlNAxT-3vje9PNQE9fj z2wY7h@SG#6&%PJ3f}HlHf4WX1`=t=CMDq0o8MAnQN#a#X1qiDheeuh!qMprfL{ns1 zXTUXa-S(-L*Ea}v@U-nMHy=1q_%X2!I$)3c`y3Zq9?=dq(JWOfOsl$FUZ9VzO}8Jb z2@Kk>@9sWMa)X#g`*?{mI+Ag7EW$Hf5?_p|FQDTqc|R6?sXvBCn+uv{9|{s***C!^ ze=NASlYF1Z@Ut zjjI-z_=VRQa|+*Diqi}JE77b`_n8|+CapTlRy3bf-%pB63egwj9ePBsu<8b+qMdYd zUd7VeI#dJQxvYv47H7yp#MXX(UwX!q#&c{zu&~zp;@q+15I%3Br>Du$j{A|&Wc@^# z8iSDi17!@pfOQ|uk!5Syc2DMaer zozE7%HW_?~s+#%VB`2^^G^jqO>?)G-+F=i!I05@||iCA=@neFdk$<2C%Kgl~) zRn;8rWS~IF=|EUlbQZ$ zC)>PFzcXDh*{lvE41OU*hR6wkrEU(cq2D2#RU1l2Q-0 zTIuF{ZOvOZy2SvBaxO{Mo`#XNSz|LCRBLz{hPvTf$Xc>D|GI<(p7tHj(85gWjx=VH z5kEotg?{_7&l~$^sXg&#Pg`T2bjg!9H}TE(EY`$%*cZ6j$`f1hBzi7JRhOc>or zw4v&qUS3*IQQxSsnEr$;vwn!Yy;YV)x?if0n5u-J1E@BaZ>@@EZxEN4@&Kp?bc{`g z7@CMrwa!otG6VOK$NJ9|=Wg)pk;9r+g%m%ZhX`w_?BW=2Yo& zpek8al6FjE?mHvmOG1Q0LA5`jm&C{``E_H2cRq} z*J)9>o$Ik5(ajy~XCGOh^U5U{{xOr|g{l0`w{ zLH-t-ys}kpkA@1&{a5EuU>2yHY2E@*tZogL+T%B@-iM_mfg4zM*bL=kz#cqKD>55z z+h;W#h68&6C>VqT!^D#v6A%K>qKrC|Ds4UUS%Sf9ea)~N=9W7l~k(?xaO&Q!kU)S)xT z6IXegd(sh(c($z=*L}>Fi90oD52u%G;;O5&WSXKu1t_}C?;67WY2l1#yC_|dXY|ah z=ERL#31>h+XnJ$dwUgYcvQmYB20jgucUaxJOZre@jAFIYs?N{fWf+2fjR(-at4N$j zX@&muLFUl8O8fKZi8=*zSziwkq%6481tQ} zZQFbe&=25<^wD1@t%37Q23&6c0S`PwegwGAt3D+jNAtfgU4E;lO^;#8OrvhTeUL^W z=bUm^kJiM~2NAQZu58MmCliMseyfooq>{T`WEdmHP&imZ3Z`!%0}SJvKL2g#hyHcw z)#|XgN~-}ucg{+-wT>%Yq{D|C2A#URLpnLG&8PL9UoJpRG*wruW)GbzoB+dMytwCGhj{KnSJ?xb%((F7lQO-8X;_xk|zF^o~2F!q5}(mK_~a|dfgQ9ul1|U ztM$Nec3qi%7aIC(c#ERXdk?>AOn3OL-pWR%5w1=`0Pe1$qARpjo4Z|}CgBmNLO-T^ zMti*Ff>l_--?ar7J?Wo2IxQ}F}pcM z8-IY!HDsIK{(F#MR5U}rKlDLzSq9~mr8^)mLxo=_);U-lRL~(QYJeML8v$Ymqs2x2@A%}mPSGBr^5{AxXsUm3N_DKYV zq7D@cnt~yBDN;fv|%}5|=NB z;WffUj$_IW9LOrDvcqO~t*tuOa!!mXOJpr2vpnCM0BU46QLnDBL-&|%0)}tLWtp3) zB6O*)2e@G>@KuveA~xgn>g5imgRU4>TH|3tI5Ew+xhC0@=zldho7}J)T!|s4<)?La zHt3wXM5n6JB1;1@>FoQql*NZHTeJCMd>G9{%>Nxw{IQx>??Duf_a%!Gkpj z1II1TZQM2ZK$843R~l@HBu(Jl55S(mMr+lTw4F3b-wAUGxaY{gQq}1(NK;c=(CP$yjffRt`Ngh&ZV2dtnpMSv z5f<^ubbd*^USG8iJ_z0IwoYC! zV?6vpAoYjH-bV|?>=S*~#+YM&pym?`Wfw^?6CCw^mz@OvlKS8CqyL*c)Zb{=*T{Y0 z79{4td3v}@*Zz3oKmJqcp7*n+R?;*6!P6mYQlaC7uyVQTLgKl%?!ixW3GE--zi+5Y zP_mYKj`Ox#LD4!1$;s1d%sf0IC0Xy)JR8ZLv*JPqWHxd@VwHsX`SYW`Y-jw7=efAD zgg#3CAyp3-m7PzdnyUiw0TN2>8wYQG&RYu=>(Hd%yzem9JdO!Fee({B@Kh_18}u+>AdgFa*J@HaOFpvUMo<dSI>gi$c(ev@dEK2qQ7SzyF@ggDG7_)H8go*dtBmPA zrD?2!d5@PVh<)ziomkuM?0@^?s(872hKu)t)Z(|N&NAz+O$tpEuH@TJ*mR=k6$#}H zsutGw@^>OWv4<(4toNy1prmF@5B=l3@bjcQaR5lX>cio;oKGTFXAYe^OmUhi`~$^u zE;I3`TimZKN~>^3e6}=)pP%sUcQ~U?FS0atpO5$>v$_1U{@-}q{&%shoas^}#eW`n zJj{@QUefSepPXC&xdF*-YBlBo?Rz>Z9$JY+VE_`!r>s@-FFPXM@xmGQlit#@!HmMw zJI`@T_>~paDAqXb7#HR5%}F>T-m(6eYPfq=k9pwpc72Ee@o!$-a>PqOHkSB* zX>ae5)m+&7!S^C1QjOR|*=`!WzKp6yiyn}^?KB=Hy8@&-81EClLX?aWqu28D_3m5u zMrj(X6eQ}ucRc*!+RGte*pZN=dw)7~GviL8H3AB3hR)OMR2hKn|8%GZHYbSOTz~wt zP{YW;gILK1YZ#B6imNWar?VHx&^ZL9ZyFwQIyS|a+0LwD<9aftc(W7jd$}&Uk&PL$ zCa(=U;;p>6{P-w!QcO|Y5I-%TgQ_ETkmE23puPl>>V}T3n>>mxyj#os89?nBZ7zCR zY}p^SSVP54$*U9D2Ey=zuB-Es_rM9?t{FYMGDW;3iTY6lb0iPPhr28T(K-D&NHkha zl#`qu+(d~MJ@>uxDU+`3y5tnIj?`20?>M7g`}pVF0KzS_uj1#Y=5w~rsL)Z-`JfER zco+^9Ez%Eayyde?ZPkRJPGIs{_=)TGJIu9r;DPsAi05Esy%Q^<#1&3Dhx|N-RP>_1 z{NPvRDUK=Iok{xq zax4C!DWSp{)fZ$Vr)LuOCmppjFAm>+N%~>(Ww%`Z!1oX_^G>Mpd<&dwF5$T1-8vYE z612n+oMXQbAB2CT+26ExtJ~w<;D_%hD78vNX=RhQ7h7#W%n196_)a7@j;b;rF9i&@ z`7R3h$;3Z-G5d*7GOl(N{S%-0i^;BN?!3ee8w4|ShW-cYBA!6dn?FA?pef|#>ZNbr1$$j^k}-t9m)|}OOha(WD;gNIpc_5?2Ae$ zyW8Im-Ms&)8VDA|OEQaSV@@bM>*$D=>^$sih-kYJ`#|%d_Wh|5o1sfYW9%gt@tA#| zlHprS<+qRTJ?wvKR7z=StmAzTl5siA@`g3oILz*R_*Uh2h9ZU*I&l7L^ z3oXUGa}f~`{viIr{`3y|AerXe*-%K(_ji{|deV+%C%GrP(;=GVeejN=Fo_g{%-#j2 axA#39^+%VO-m)NGNM7ddt=yXrp8r2ANiFRF literal 62760 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 SmVgLw7!1XNex%aOE&jhg8DgOT diff --git a/docs/images/native-launcher/worlds.png b/docs/images/native-launcher/worlds.png index 311b70198c123e00b54f34497a71c57486db61ca..7c63cb02183123ad4970e927b7558a12df87df99 100644 GIT binary patch literal 57275 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 z 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 literal 61547 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 YHI4Zr#;3Y#1s@1DTKF6>i>5VTK;5DumI5) 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 OmB*S`8B+|s68{71yzUPG diff --git a/docs/native-launcher.md b/docs/native-launcher.md index 11bb6c24..7cc1d486 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -1,6 +1,6 @@ # Native Minecraft launcher, profiles and worlds -AutoPlug's desktop dashboard includes **Server Browser**, **Worlds**, **Profiles**, **Server Manager** and **Settings**. The launcher downloads Minecraft metadata, libraries, assets and loader components directly; it does not embed another launcher. The existing server wrapper and updater commands remain available. Rounded translucent panels sit over an original block-landscape panorama, with colors adapted to the selected light or dark theme. +AutoPlug's desktop dashboard includes **Server Browser**, **Worlds**, **Profiles**, **Server Manager** and **Settings**. The launcher downloads Minecraft metadata, libraries, assets and loader components directly; it does not embed another launcher. The existing server wrapper and updater commands remain available. Light is the default theme: rounded frosted panels sit on a clean off-white canvas, with blue accents for primary actions, selected navigation and focus. Existing dark or Darcula preferences remain supported. AutoPlug targets Java 9 or later. Minecraft runs in a separate JVM selected from its version metadata. Settings supports Java 8, 17 and 21 executable overrides and additional `major=path` entries. If no matching runtime is configured or already installed, AutoPlug uses its Adoptium provider to download one. Runtime availability depends on the operating system and architecture. @@ -17,7 +17,7 @@ The browser imports favorites from the standard Minecraft `servers.dat` when the ### Dashboard previews -These previews render the actual Swing components with synthetic fixture data at 1200 × 820 pixels. They show the layout and available controls; they do not demonstrate live Microsoft authentication, server connectivity or router sharing. The fixture data and rendering helper are in `DashboardPanelTest`. +These previews render the actual Swing components in the default light theme with synthetic fixture data at 1200 × 820 pixels. They show the layout and available controls; they do not demonstrate live Microsoft authentication, server connectivity or router sharing. The fixture data and rendering helper are in `DashboardPanelTest`. **Profiles:** isolated client and server collections, reusable templates, and migration controls. diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java index 370c7610..7f6455bc 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -73,6 +73,7 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo for (int i = 0; i < names.length; i++) { String name = names[i]; pages.add(views[i], name); JToggleButton button = new JToggleButton(name); button.setHorizontalAlignment(SwingConstants.LEFT); + DashboardTheme.navigation(button); button.setPreferredSize(new Dimension(170, 43)); button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 43)); button.setAlignmentX(Component.LEFT_ALIGNMENT); button.addActionListener(e -> { cards.show(pages, name); if (name.equals("Worlds")) refreshWorlds(); }); @@ -89,7 +90,7 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo } @Override protected void paintComponent(Graphics graphics) { - super.paintComponent(graphics); DashboardTheme.landscape(graphics, getWidth(), getHeight()); + super.paintComponent(graphics); DashboardTheme.canvas(graphics, getWidth(), getHeight()); } @Override public void updateUI() { super.updateUI(); DashboardTheme.refreshColors(this); } @@ -99,7 +100,7 @@ private JPanel serverPage() { content.add(toolbar(button("Add server", this::addServer), button("Import Minecraft", () -> run("Importing favorites", () -> { int count = browser.importVanilla(); return count; }, count -> { status.setText("Imported " + count + " new favorites from " + browser.vanillaFile()); refreshServers(); })), - button("Refresh status", this::refreshServers), button("Join selected", this::joinSelected), + button("Refresh status", this::refreshServers), primaryButton("Join selected", this::joinSelected), button("Remove", this::removeServer)), BorderLayout.NORTH); serverTable.getColumnModel().getColumn(3).setPreferredWidth(220); content.add(tableScroll(serverTable), BorderLayout.CENTER); @@ -222,12 +223,12 @@ private JPanel profilesPage() { JPanel page = page("Profiles", "Isolated modpacks and pluginpacks, reusable across worlds and servers."); JPanel content = content(); typeFilter.addActionListener(e -> showProfiles()); - content.add(toolbar(typeFilter, button("Create", this::createProfile), button("Clone / migrate", () -> cloneProfile(selectedProfile(), null)), + content.add(toolbar(typeFilter, primaryButton("Create", this::createProfile), button("Clone / migrate", () -> cloneProfile(selectedProfile(), null)), button("Check", () -> checkOrUpdate(false)), button("Update", () -> checkOrUpdate(true)), button("Refresh", this::refreshProfiles)), BorderLayout.NORTH); content.add(tableScroll(profileTable), BorderLayout.CENTER); JPanel bottom = DashboardTheme.transparent(new BorderLayout(0, 8)); bottom.setBorder(new EmptyBorder(12, 0, 0, 0)); bottom.add(DashboardTheme.scroll(profileDetails), BorderLayout.CENTER); - bottom.add(toolbar(button("Launch client", () -> { + bottom.add(toolbar(primaryButton("Launch client", () -> { ProfileInfo profile = selectedProfile(); if (!ready(profile)) return; if (!"MODS".equalsIgnoreCase(profile.type)) { information("Client profiles", "Choose a MODS profile to launch the Minecraft client."); return; } run("Launching client", () -> { actions.launchProfile(profile.id, null, 25565); return null; }, ignored -> {}); @@ -330,7 +331,7 @@ private JPanel worldsPage() { JPanel page = page("Worlds", "Your Minecraft saves and managed worlds, together in one place."); JPanel content = DashboardTheme.transparent(new BorderLayout(0, 12)); JPanel controls = DashboardTheme.surface(new BorderLayout(), 8); - controls.add(toolbar(button("Create world", this::createWorld), button("Refresh", this::refreshWorlds))); + controls.add(toolbar(primaryButton("Create world", this::createWorld), button("Refresh", this::refreshWorlds))); content.add(controls, BorderLayout.NORTH); worldCards.setLayout(new BoxLayout(worldCards, BoxLayout.Y_AXIS)); worldCards.setOpaque(false); @@ -384,18 +385,18 @@ private void showWorlds() { card.add(thumbnail, BorderLayout.WEST); JPanel details = DashboardTheme.transparent(new BorderLayout(0, 6)); JPanel heading = DashboardTheme.transparent(new BorderLayout(0, 4)); - JLabel kind = new JLabel(world.local ? "Singleplayer" : "Managed world" + (world.running ? " · Running" : "")); - DashboardTheme.tint(kind, true); kind.setFont(kind.getFont().deriveFont(Font.BOLD, 11f)); + JLabel kind = DashboardTheme.badge(world.local ? "Singleplayer" : "Managed world" + (world.running ? " · Running" : "")); + JPanel badgeRow = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 0, 0)); badgeRow.add(kind); JLabel name = new JLabel(world.name); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); name.putClientProperty("html.disable", Boolean.TRUE); - heading.add(kind, BorderLayout.NORTH); heading.add(name, BorderLayout.CENTER); + heading.add(badgeRow, BorderLayout.NORTH); heading.add(name, BorderLayout.CENTER); details.add(heading, BorderLayout.NORTH); JTextArea description = textArea(2); DashboardTheme.tint(description, false); description.setText((world.local ? "Minecraft " + (knownWorldVersion(world) ? world.gameVersion : "version unknown — choose before launch") : "Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId)) + "\n" + world.directory); details.add(description, BorderLayout.CENTER); - if (world.local) details.add(toolbar(button("Launch", () -> launchLocalWorld(world)), button("Open folder", () -> openFolder(world.directory))), BorderLayout.SOUTH); - else details.add(toolbar(button("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), + if (world.local) details.add(toolbar(primaryButton("Launch", () -> launchLocalWorld(world)), button("Open folder", () -> openFolder(world.directory))), BorderLayout.SOUTH); + else details.add(toolbar(primaryButton("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), button("Share", () -> { if (!confirm("Share this world", "Share “" + world.name + "” beyond this PC?\nThis may open a router port using UPnP and expose the server to the internet.\nOnly share the join address with people you trust.")) return; run("Preparing world sharing", () -> { @@ -468,10 +469,10 @@ private JPanel settingsPage() { "Other runtimes (major=path; …)", extraJava)); content.add(Box.createVerticalStrut(16)); content.add(section("Defaults and networking")); content.add(fields("Default client profile", defaultProfile, "Preferred server port", port, "Sharing", upnp)); - content.add(toolbar(button("Save settings", this::saveSettings), button("Reload", this::refreshSettings))); + content.add(toolbar(primaryButton("Save settings", this::saveSettings), button("Reload", this::refreshSettings))); content.add(Box.createVerticalStrut(24)); content.add(section("Minecraft account")); content.add(fields("Current account", account, "Microsoft app client ID", clientId, "Account storage", rememberAccount, "Offline player name", offlineName)); - content.add(toolbar(button("Sign in with Microsoft", () -> { + content.add(toolbar(primaryButton("Sign in with Microsoft", () -> { if (!confirm("Microsoft sign-in", "Start Microsoft device sign-in?\nYou will authorize the displayed app in your browser. AutoPlug never asks for your Microsoft password.")) return; if (clientId.getText().trim().isEmpty()) { information("Microsoft client ID", "Enter and save the public client ID of your Microsoft application before signing in."); return; } SettingsInfo settings; @@ -550,6 +551,7 @@ private static JPanel page(String title, String description) { private static JPanel content() { return DashboardTheme.surface(new BorderLayout(0, 12), 16); } private static JPanel toolbar(JComponent... components) { JPanel panel = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 6, 3)); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } private static JButton button(String text, Runnable action) { JButton button = new JButton(text); button.setMargin(new Insets(6, 14, 6, 14)); button.addActionListener(e -> action.run()); return button; } + private static JButton primaryButton(String text, Runnable action) { return DashboardTheme.primary(button(text, action)); } private static JTextArea textArea(int rows) { JTextArea area = new JTextArea(rows, 30); area.setEditable(false); area.setOpaque(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setFont(UIManager.getFont("Label.font")); return area; } private static DefaultTableModel model(String... columns) { return new DefaultTableModel(columns, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; } private static JTable table(DefaultTableModel model) { diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java index 0a55f6e1..b5004ca4 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java @@ -2,12 +2,14 @@ import javax.swing.*; import javax.swing.border.EmptyBorder; +import javax.swing.plaf.ColorUIResource; import java.awt.*; import java.awt.geom.RoundRectangle2D; -/** Original, resolution-independent block landscape and translucent dashboard surfaces. */ +/** Neutral dashboard surfaces with a consistent blue accent in light and dark themes. */ final class DashboardTheme { static final int ARC = 16; + private static final Color BLUE = new Color(0x0066FF); private DashboardTheme() {} @@ -16,6 +18,22 @@ static void installDefaults() { UIManager.put("Component.arc", ARC); UIManager.put("TextComponent.arc", ARC); UIManager.put("ProgressBar.arc", ARC); + UIManager.put("Component.focusColor", BLUE); + UIManager.put("Component.focusedBorderColor", BLUE); + UIManager.put("Button.focusedBorderColor", BLUE); + UIManager.put("ToggleButton.selectedBackground", BLUE); + UIManager.put("ToggleButton.selectedForeground", Color.WHITE); + UIManager.put("ToggleButton.focusedBorderColor", BLUE); + UIManager.put("TabbedPane.underlineColor", BLUE); + UIManager.put("ProgressBar.foreground", BLUE); + UIManager.put("CheckBox.icon.selectedBackground", BLUE); + UIManager.put("CheckBox.icon.selectedBorderColor", BLUE); + UIManager.put("CheckBox.icon.checkmarkColor", Color.WHITE); + UIManager.put("Table.selectionBackground", BLUE); + UIManager.put("Table.selectionForeground", Color.WHITE); + UIManager.put("TableHeader.background", new ColorUIResource(dark() ? 0x2B3443 : 0xF3F6FB)); + UIManager.put("TableHeader.foreground", new ColorUIResource(dark() ? 0xE4EAF5 : 0x34435A)); + UIManager.put("Table.gridColor", new ColorUIResource(dark() ? 0x3A4555 : 0xE4EAF3)); } static boolean dark() { @@ -23,8 +41,41 @@ static boolean dark() { return background != null && background.getRed() + background.getGreen() + background.getBlue() < 420; } - static Color muted() { return dark() ? new Color(0xB6C6CD) : new Color(0x4A606A); } - static Color accent() { return dark() ? new Color(0xA3D7BF) : new Color(0x286C52); } + static Color muted() { return dark() ? new Color(0xBCC8DA) : new Color(0x526176); } + static Color accent() { return dark() ? new Color(0x8AB8FF) : BLUE; } + + static JButton primary(JButton button) { + button.setBackground(BLUE); button.setForeground(Color.WHITE); + button.setFont(button.getFont().deriveFont(Font.BOLD)); + return button; + } + + static void navigation(JToggleButton button) { + button.putClientProperty("AutoPlug.navigation", Boolean.TRUE); + button.addItemListener(event -> refreshNavigation(button)); + refreshNavigation(button); + } + + private static void refreshNavigation(JToggleButton button) { + button.setBackground(button.isSelected() ? BLUE : (dark() ? new Color(0x273142) : new Color(0xF6F8FC))); + button.setForeground(button.isSelected() ? Color.WHITE : (dark() ? new Color(0xE4EAF5) : new Color(0x34435A))); + } + + static JLabel badge(String text) { + JLabel label = new JLabel(text) { + @Override protected void paintComponent(Graphics graphics) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(dark() ? new Color(36, 75, 128, 150) : new Color(0xEAF2FF)); + g.fillRoundRect(0, 0, getWidth(), getHeight(), ARC, ARC); + } finally { g.dispose(); } + super.paintComponent(graphics); + } + }; + label.setBorder(new EmptyBorder(2, 8, 2, 8)); tint(label, true); + label.setFont(label.getFont().deriveFont(Font.BOLD, 11f)); return label; + } static void tint(JComponent component, boolean accent) { component.putClientProperty("AutoPlug.accent", accent); @@ -35,6 +86,8 @@ static void refreshColors(Component component) { if (component instanceof JComponent) { Object accent = ((JComponent) component).getClientProperty("AutoPlug.accent"); if (accent instanceof Boolean) component.setForeground((Boolean) accent ? accent() : muted()); + if (component instanceof JToggleButton && Boolean.TRUE.equals(((JComponent) component).getClientProperty("AutoPlug.navigation"))) + refreshNavigation((JToggleButton) component); } if (component instanceof Container) for (Component child : ((Container) component).getComponents()) refreshColors(child); } @@ -56,51 +109,12 @@ static JScrollPane scroll(Component view) { return scroll; } - /** Paints only geometric artwork authored here; no Minecraft assets or remote images. */ - static void landscape(Graphics graphics, int width, int height) { + static void canvas(Graphics graphics, int width, int height) { if (width <= 0 || height <= 0) return; Graphics2D g = (Graphics2D) graphics.create(); try { - g.scale(width / 1200.0, height / 800.0); - g.setPaint(new GradientPaint(0, 0, new Color(0x101E2C), 0, 800, new Color(0x496065))); - g.fillRect(0, 0, 1200, 800); - // Sparse square stars and a pale block moon keep the sky quiet behind the content. - g.setColor(new Color(207, 224, 226, 62)); - int[][] stars = {{220, 86}, {392, 160}, {595, 94}, {726, 208}, {919, 100}, {1094, 184}}; - for (int[] star : stars) g.fillRect(star[0], star[1], 3, 3); - g.setColor(new Color(182, 204, 208, 82)); g.fillRect(996, 83, 56, 56); - g.setColor(new Color(31, 47, 61, 110)); g.fillRect(1014, 83, 38, 38); - ridge(g, new Color(0x344B55), 800, new int[]{0, 180, 320, 470, 640, 830, 990, 1200}, - new int[]{400, 360, 420, 310, 366, 290, 360, 336}); - ridge(g, new Color(0x293F46), 800, new int[]{0, 140, 290, 420, 590, 730, 910, 1080, 1200}, - new int[]{480, 440, 504, 466, 534, 458, 492, 436, 480}); - ridge(g, new Color(0x213A36), 800, new int[]{0, 154, 310, 492, 680, 870, 1032, 1200}, - new int[]{628, 560, 606, 646, 594, 554, 612, 584}); - // Top faces, rock layers and small block trees suggest a playable landscape. - g.setColor(new Color(0x3B5647)); - g.fillRect(0, 628, 154, 10); g.fillRect(154, 560, 156, 10); - g.fillRect(870, 554, 162, 10); g.fillRect(1032, 612, 168, 10); - g.setColor(new Color(0x263B38)); - g.fillRect(46, 698, 170, 28); g.fillRect(970, 710, 230, 22); - tree(g, 194, 560, 1.0); tree(g, 929, 554, 1.3); tree(g, 1112, 612, .85); - g.setPaint(new GradientPaint(0, 0, new Color(4, 12, 19, 66), 0, 800, new Color(4, 12, 19, 22))); - g.fillRect(0, 0, 1200, 800); - } finally { g.dispose(); } - } - - private static void ridge(Graphics2D g, Color color, int bottom, int[] x, int[] y) { - Polygon polygon = new Polygon(); polygon.addPoint(x[0], bottom); polygon.addPoint(x[0], y[0]); - for (int i = 1; i < x.length; i++) { polygon.addPoint(x[i], y[i - 1]); polygon.addPoint(x[i], y[i]); } - polygon.addPoint(x[x.length - 1], bottom); g.setColor(color); g.fillPolygon(polygon); - } - - private static void tree(Graphics2D graphics, int x, int ground, double scale) { - Graphics2D g = (Graphics2D) graphics.create(); - try { - g.translate(x, ground); g.scale(scale, scale); - g.setColor(new Color(0x29352F)); g.fillRect(-5, -58, 10, 58); - g.setColor(new Color(0x1D3430)); g.fillRect(-30, -86, 60, 35); g.fillRect(-21, -105, 42, 24); - g.setColor(new Color(0x30483A)); g.fillRect(-21, -105, 42, 5); g.fillRect(-30, -86, 25, 5); + g.setColor(dark() ? new Color(0x181E29) : new Color(0xF5F7FB)); + g.fillRect(0, 0, width, height); } finally { g.dispose(); } } @@ -111,7 +125,18 @@ static JLabel worldThumbnail() { try { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.clip(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), ARC, ARC)); - landscape(g, getWidth(), getHeight()); super.paintComponent(g); + g.setColor(dark() ? new Color(0x263750) : new Color(0xEEF4FF)); + g.fillRect(0, 0, getWidth(), getHeight()); + if (getIcon() == null) { + // A neutral world symbol while no saved thumbnail is available. + g.setColor(accent()); g.setStroke(new BasicStroke(1.7f)); + int x = getWidth() / 2 - 21, y = getHeight() / 2 - 21; + g.drawOval(x, y, 42, 42); g.drawOval(x + 11, y, 20, 42); + g.drawLine(x, y + 21, x + 42, y + 21); + g.drawArc(x + 3, y + 6, 36, 12, 180, 180); + g.drawArc(x + 3, y + 25, 36, 12, 0, 180); + } + super.paintComponent(g); } finally { g.dispose(); } } }; @@ -125,11 +150,11 @@ private static final class Surface extends JPanel { Graphics2D g = (Graphics2D) graphics.create(); try { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - Color top = dark() ? new Color(34, 47, 54, 232) : new Color(246, 250, 250, 237); - Color bottom = dark() ? new Color(23, 35, 42, 221) : new Color(230, 239, 239, 224); + Color top = dark() ? new Color(39, 49, 65, 242) : new Color(255, 255, 255, 245); + Color bottom = dark() ? new Color(32, 41, 56, 230) : new Color(250, 252, 255, 225); g.setPaint(new GradientPaint(0, 0, top, 0, Math.max(1, getHeight()), bottom)); g.fillRoundRect(0, 0, getWidth(), getHeight(), ARC, ARC); - g.setColor(dark() ? new Color(215, 235, 237, 36) : new Color(255, 255, 255, 155)); + g.setColor(dark() ? new Color(149, 171, 204, 55) : new Color(209, 219, 234, 190)); g.draw(new RoundRectangle2D.Float(.5f, .5f, getWidth() - 1f, getHeight() - 1f, ARC, ARC)); } finally { g.dispose(); } super.paintComponent(graphics); diff --git a/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java b/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java index 1d746f90..bdd640d9 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java +++ b/src/main/java/com/osiris/autoplug/client/ui/MainWindow.java @@ -55,6 +55,7 @@ public void initTheme(GeneralConfig generalConfig) { if ("dark".equals(theme)) FlatDarkLaf.setup(); else if ("darcula".equals(theme)) FlatDarculaLaf.setup(); else FlatLightLaf.setup(); + DashboardTheme.installDefaults(); if (isDisplayable()) SwingUtilities.invokeLater(() -> SwingUtilities.updateComponentTreeUI(this)); } catch (Exception e) { AL.warn("Failed to initialize the dashboard theme", e); } } diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index d247cf18..ee8ef5be 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -170,7 +170,7 @@ public static void main(String[] args) throws Exception { Path data = Files.createTempDirectory("autoplug-dashboard-preview-"); AtomicReference panel = new AtomicReference<>(); CountDownLatch calls = new CountDownLatch(3); SwingUtilities.invokeAndWait(() -> { - if (args.length > 3 && "light".equalsIgnoreCase(args[3])) FlatLightLaf.setup(); else FlatDarkLaf.setup(); + if (args.length > 3 && "dark".equalsIgnoreCase(args[3])) FlatDarkLaf.setup(); else FlatLightLaf.setup(); com.osiris.autoplug.client.utils.GD.TARGET = com.osiris.autoplug.client.Target.MINECRAFT_SERVER; panel.set(new DashboardPanel(fixtures(new AtomicBoolean(), calls), new ServerBrowserService(data.resolve("servers.json"), data.resolve("servers.dat")), true)); }); From c15a94ac398abe1a66dd38a34dcdc056c5e8a2c9 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 20:07:03 +0200 Subject: [PATCH 6/9] Fix legacy world entry and address launcher UX review --- docs/images/native-launcher/profiles.png | Bin 45278 -> 47753 bytes .../images/native-launcher/server-browser.png | Bin 0 -> 39248 bytes .../native-launcher/settings-compact.png | Bin 0 -> 41230 bytes docs/images/native-launcher/settings-dark.png | Bin 0 -> 49561 bytes docs/images/native-launcher/settings.png | Bin 57736 -> 50101 bytes docs/images/native-launcher/worlds.png | Bin 57275 -> 68985 bytes docs/native-launcher.md | 31 +- pom.xml | 18 + src/main/java/JPM.java | 11 + .../client/launcher/DownloadProgress.java | 158 ++++++++ .../client/launcher/LauncherFiles.java | 36 +- .../client/launcher/LegacyWorldLaunch.java | 163 +++++++++ .../client/launcher/LoaderInstaller.java | 22 +- .../client/launcher/MinecraftLauncher.java | 31 +- .../client/launcher/PreparedLaunch.java | 5 + .../client/profiles/LauncherCommands.java | 7 +- .../client/profiles/LauncherServices.java | 83 ++++- .../client/profiles/ProfileStore.java | 11 + .../client/tasks/updater/TaskDownload.java | 55 ++- .../client/tasks/updater/java/AdoptV3API.java | 17 +- .../tasks/updater/java/TaskJavaDownload.java | 57 ++- .../tasks/updater/mods/TaskModDownload.java | 56 ++- .../updater/plugins/TaskPluginDownload.java | 60 ++- .../autoplug/client/ui/DashboardPanel.java | 345 +++++++++++++++--- .../autoplug/client/ui/DashboardTheme.java | 53 +++ .../autoplug/client/ui/LauncherActions.java | 24 +- .../client/worlds/LevelDatReader.java | 27 +- .../autoplug/client/worlds/LocalWorld.java | 20 + .../client/worlds/LocalWorldStore.java | 40 +- .../autoplug/client/worlds/WorldStore.java | 64 ++++ .../autoplug/legacy/LegacyWorldAgent.java | 156 ++++++++ .../launcher/legacy/1.12.2.properties | 17 + .../launcher/legacy/1.13.2.properties | 15 + .../launcher/legacy/1.7.10.properties | 15 + .../launcher/legacy/1.8.9.properties | 15 + .../client/launcher/DownloadProgressTest.java | 188 ++++++++++ .../launcher/LegacyWorldClientFixture.java | 78 ++++ .../launcher/LegacyWorldLaunchTest.java | 147 ++++++++ .../client/profiles/LauncherCommandsTest.java | 46 ++- .../client/profiles/LauncherDefaultsTest.java | 106 ++++++ .../updater/LegacyDownloadProgressTest.java | 186 ++++++++++ .../client/ui/DashboardPanelTest.java | 122 ++++++- .../client/worlds/LocalWorldStoreTest.java | 85 +++++ .../legacy-adapter-1.12.2-evidence.txt | 44 +++ .../legacy-adapter-1.13.2-evidence.txt | 31 ++ .../legacy-adapter-1.7.10-evidence.txt | 33 ++ .../legacy-adapter-1.8.9-evidence.txt | 36 ++ .../launcher/legacy-mappings-1.14.4.txt | 29 ++ .../launcher/legacy-mappings-1.15.2.txt | 29 ++ .../launcher/legacy-mappings-1.16.5.txt | 17 + .../launcher/legacy-mappings-1.16.txt | 17 + .../launcher/legacy-mappings-1.17.1.txt | 17 + .../launcher/legacy-mappings-1.18.2.txt | 17 + .../launcher/legacy-mappings-1.19.2.txt | 19 + .../launcher/legacy-mappings-1.19.3.txt | 19 + .../launcher/legacy-mappings-1.19.4.txt | 19 + .../launcher/legacy-mappings-1.19.txt | 19 + .../launcher/legacy-mappings-22w11a.txt | 19 + .../launcher/legacy-mappings-22w13a.txt | 19 + 59 files changed, 2738 insertions(+), 216 deletions(-) create mode 100644 docs/images/native-launcher/server-browser.png create mode 100644 docs/images/native-launcher/settings-compact.png create mode 100644 docs/images/native-launcher/settings-dark.png create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/DownloadProgress.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunch.java create mode 100644 src/main/java/com/osiris/autoplug/legacy/LegacyWorldAgent.java create mode 100644 src/main/resources/launcher/legacy/1.12.2.properties create mode 100644 src/main/resources/launcher/legacy/1.13.2.properties create mode 100644 src/main/resources/launcher/legacy/1.7.10.properties create mode 100644 src/main/resources/launcher/legacy/1.8.9.properties create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/DownloadProgressTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldClientFixture.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunchTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/tasks/updater/LegacyDownloadProgressTest.java create mode 100644 src/test/resources/launcher/legacy-adapter-1.12.2-evidence.txt create mode 100644 src/test/resources/launcher/legacy-adapter-1.13.2-evidence.txt create mode 100644 src/test/resources/launcher/legacy-adapter-1.7.10-evidence.txt create mode 100644 src/test/resources/launcher/legacy-adapter-1.8.9-evidence.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.14.4.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.15.2.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.16.5.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.16.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.17.1.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.18.2.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.19.2.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.19.3.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.19.4.txt create mode 100644 src/test/resources/launcher/legacy-mappings-1.19.txt create mode 100644 src/test/resources/launcher/legacy-mappings-22w11a.txt create mode 100644 src/test/resources/launcher/legacy-mappings-22w13a.txt diff --git a/docs/images/native-launcher/profiles.png b/docs/images/native-launcher/profiles.png index 3d1dba773fbf9609ae02d6c689edad5081d27352..4c7ba91e3cef47b97d45441b07fd6248ef70948e 100644 GIT binary patch literal 47753 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 literal 45278 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 z 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ڭ-<9 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 SO4bOUFdlAR2TEOkxcD!Ay^XT~ literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/settings-dark.png b/docs/images/native-launcher/settings-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..44893e28e47d651ced485dfe91ed4938fcd2c814 GIT binary patch literal 49561 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 a5d7|6{LVZJfLwGK7z%RW2gNcke*F(+IZA&3 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png index bc1a2564da6d5d74e0657a410ca3fdeaf0ebea56..7e90e0cbdb97a26e377f0ad2cd4bf9ce3850bbfd 100644 GIT binary patch literal 50101 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 z%0D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 LHSQzi9tHguU-kJm literal 57736 zcmcG$1z42byDp9iC<0<2A}O8H(%lV8hmz9L4WcL_AYD=--O>#z(lK-mA<_dw&k)1F zSp$CG@4NPI@BKgf{Lk_7x*Xw+^{)3>&vQTbeXj{tQ<1%K?fx|^EUX*ya#9*tSeL(I zVO`?Jxd?tj)2cL%h4l(cUP}Clhtc{pw#V&}qxNl_*L&HwYqw-sh$-%n;#~YdO{;M8 zj@pHrmv2gy+|H86r6gM&6kjF$KxW0e_3o$QlMkN*rEoF{HRL7&T}~W0Iq{u&la!%t z`@SOKko80^F3Wv9Z^-5b-L^tg@&#~PtQvgJJY~#>S8Epn2r(auH7`qG{;g5DiGw-h zmw+_oW$^E-wcG#W1MbifwzV1KHz(Y_pGZjLhO5@uNag;1iXPUh=`!Vqxv08&-0YR> zfw=N{PNlguW)poKJ#`Z5qY4{0Y9$v$BI~6$NDwki$p=4&%Oi1#O`=&DNmfa8CnmJP z$ygneI$9lNDsdxag^43?D{frD2`t5pH}_48OSLjO(R@Nq>mD-2<+PkzttsC6b9u@y z&nginia8TYLaV#X;v-{+>|5m39|u3V`CYG4bbo%ekc!)TD9SWAoYduaK0x7Xb;nhF zgsF=yB)8+H_?=F3`C`#EXv{SP@4Ps))20knmTM$5RWG?bF26xh8#1ilO@4N&SipGm zaTPP+J6U}eMiQ7gmS89Pp?jp4&BPlh0XUt35EVb`cI5}x+%`$##DD$!h_8w;o>vzm z>*X3N*T2KD!Kt@nQo0>3Qa$+DC#cc-zwwhh58N1;QJBcXLS2DYAJY;35XT7w|9jO! zh%=}6|LWrhA{?&r63kt{QUnkdzZJs)A0OlW4?kvY1#BH>^%OE=F0@Wx@WR!qi2CdS z=mg#Tyw-}UNAomgd50Upuf^0c&y#!yM{|gi*LG^S(L20;qprZD^+T3IER%85@hN)t zR2aR-6`kYr8R>p6__a|jEh)?hocfsoC-5b!3T|NY@lMi$7^}N3D}oS3o0GXQQ@)?# z{;rF5xbe^}SHHTL_np2&NNuS-I~`u-e9h@%+M)D^F>|AVO=`$v;6YISJ%>+_ag{i=6wWsOvn!|U$t&YqHg z;YL0U$pUrq~c>93)ito>|mpQ^FDDqLF8)cjOvGl%yXJ|Ny)b7 z3SXbwSsWJjM&grw+BMaK8KFpmEb|Am6d_4`q9uK>yl1iVm(r&!j<{0@LevCxTo*b@ zPte#?ekeHKw2Nje(^GPvmGtd-dMU$D4kSlUbM5;2Gg$Ok=i=NzM!Pox#yVGJJ5h#! zjgSf*^mbe)4ns@JSRg-zi&~+7-Wn;;X4fvB65gNM{XT5f$(Wa|xyqK4&92|{#jqZE zgOoQWN4G$$$f7r?d4EQ3$O`16Urh!Kgnqld_VYiU6oiZDeL=EZo)5Rm^M+gA`xIL@ z_m1@V7+)7&n0ig?4kMw35o6%h8~0a+hBM`dK7S^x3|E(tsS1ZIXk;mnWbbe0Yv%Nw zo)G8mb8qs-q>w53hPFJa^51UNCK?ZA)o`Enb(eT8y_uGfFqQtMIxjpXPkobuIKIDP z^LfZ@4#&Ay8 z6ZF359^~p~-C8jk)vTzbgpV&W)aXrs{w5!teUD%O+PL#xqe^h0a%|kF(F{Rs&h?hb>ipd zUN4650S&`RVqH}jm%e_BxMysXR8i8K&k+lZRcsj}4t%it~)PEAd{Q&c@;-Tyft zS$A-0WgtUSgAKZ}x$%Gkr?oYt6e0p0Imm~NWcO-5e;(-tsh;uDpLN|^acmT(rdDup znB2QL--&QzxAA13#rK5sRF&xN2G5+d5*x3=d8~)~?_=ZpNILi&E~d8a_M|nd%`TeP z1a9k(I;qT4f!DEhub2pj!vEOOZk4gSKa)mLN9W)M-_+;I+~%t?#yMUSHw!|;vIhl{ zMJYxrtTcC42_X>9pTM$G|5ZoBR6;uCU?GgZ}Z^ zOOI&@t&y9j8>=~K>i&HU|L|epXv!HPoZV>sv`BBnLvNl9@#WC1!=|JZ{p0P6 zM#Cxu5-e()u>C3Lk{OR*-&EUn!SY|NZ@`Q9IGCgJ%4ne5>9U=wIow%vnJ)!T@Y0>_ zCXS@U$>6;4{>F4=n^uwD>YBR$DVC{!<8=2&9dldm*mY%PW$%^rpdLZIkzDnM^UHx? zRm^J}`xfzu>~uWj6)0fkos5pw+-TTUnP)377YfIIX+k+17?@1PWnsJ66&uFBBe;n- zg8VeO%QTO>Yh7I~Y2*$5sVe~4+Dp-FL0Z#)KAaL3Cg|pqe_AkHU_V_4t%5%y!z9K1 zMWTTIcFU-y-+PGZY#uh9EePMlj33JGuMv8W?JP3yA@%KR7uQPMX=!N4AHVEBNTOfv zONk%zq$&5^pWX*KW|-8nCm~VW5;NF%R{dhWt|;H3?A~~`R@5OGXO`5wr_igROX)Hi zn%!}y$Hqj6wXw0u?l@K(5BM(2eBRE#M!nWX>M*Py6{QiHGBi{k>hIA~vo@qE$~Ob` zIy|!HGrS2#ZQn(EG5thefcZ)8Xa5J5$D=QLKk*C=aqXR)7AnEtKdo{XMht6up+4MU zMj(syeGy17^SZ*}dOK1?x1tN(`U+ZQ>Z|uf{Ry5O?U8t)!bQm+x$ucPAMZ(K@%&tE{EHHcEo^WKF=jLkGm7H!lWE+rx2OxsoN31VM)d#^4@ zHTF|nt#5mdVV#i8F&+F3fruIGDi|u?;<1>=)-Tl~iE`O+@;1Y8VPrznS~q+1AQU0P zE@%=9H>{p=3YqcSnDWFd8x4mNqsF?C-2_;l;O6lzM6-%LziRvi-^nN0`4YX}jt*`= zm9rS|q4e2qji+XpDu6d1drA36o+3*8t-{)7g}I)83HOT0cUc`gqMEy@eg*z{bB9TS z(&u=4)T{fw`z)86-~MEC-E)E14d|v{Kk7-Ynm8N`70Z3$SnTo3Ut%pz+z_wTtoS|2 zP;)uOz{C0s$UY?a#z3m#@yep>Ei@YfRN#4#%MtEPUFg;^u)TZ>vT~c@(`%YG- z0WXs8L@uFp`VvUcUWHP2KEvK&ivE$;0;kJR_Ap0z*NjVeLHb6kNzuGT|gPb<|)`Q!&w(=HgiOdqa8~ z*5<=S2R?GrW!<7zu@3X|3&Qj5<>;(o77-D57(1PMJ6z|whCo)@jIF}S1l=mU$cJd3 zSTA1;I|jgJl+;|v3$@g%k2k$b@y^?^QtZJ0bl?9JvCD@H|5&>KM_1IQr7JC;E{;6} ziKBd=-3_}SjCXQ((zWB%a{d&Z9-ApXKTE}8+|)1|NE+^xeiGK}#cuqLa-n_KfyWyP>5#82|!yd->wo4C?^=a7UwNr|b81cDMBk=IDhV zqITJvyuh-!&;5c@cLQXSm`h2#z6+w8c(GGi$bEu?v;~IwpgE*_zkVoqaJzK@XXNoO zz98-zcvYEsch@UHxAlrs=q7tB{b~v=8kPdG+DMZxwpC;d!>P~7bnd_|r1@99U67Fb z&?13Fa;=apg9MljnDlQ5jE zOgeAWsOseOVf)SFN^;-5fzVJTv{0KN?1l1h-4Q9&UYJ?W*mX|x9Qor3ETk&4BXbmIf zBhgo)pJ+bSpWp1|L*nA&cQW7NwHamM+JjreMenaMtILa6WA}!Va3SoS-j90hEKnHM zyA^@#3edVv?i~1tdNlu&^8&w%b54$?`=Z z3$#l(PPQe(=B{b6Jy%_R{n2NCLs(T9@dN;3CauEp2G3nM)SZUzWS2~oB;U)hT85H^ z3e?`sg-(hCvTKjsMW`2@>W!dIkUJvz1xmeO^CaJ6tJo6A3lIGvZ) ztL&iYHRIE|)$Ak%5U2p+d2iHK&)T4y4|Z()9KoHxxrT_X4C1Bz*2x2@s353D@FE8B z{Cad*BHrTTD{V}(1&~kh9*Px!R(0cb-({N#}CZEG= zcbKO9PtjifjeDv2>`ezdsbD6z+ejB*!Wqy^yv4aG$T)p_-Ae09kes_~8UM^;A3-2d zpoRt;yV0>a0J(i>1Y9x?9S@!IFFy)4Dx)H3Ms1+zls}nSSO7>-03z7MCDco0zLS*K z)&uq=0{PWutT^gtMRbx%fooia+d_xB9n_jn-X+SAn9aat+oWPuBAd|WDF7WgN{5uJ ztcJo&CCspTI@MH-MlV-{7)0`n?Rn4!V2Ujbt*#j=h{BIMiwxIKGe?C~*lQ2Gw92@4 z3V#EWr=ZsnL9II@0<)vT@AFt6A8ePgmcAVS`uwPKWT>n7aF-aY7}CkA5qq$x$vI2{ zN3Ksq_tPvPRt8#3I_9Kj5 zTeScVk|}YR=_6NW&Fr4hq9*VnlB$Yg!?u%!Nsso1RL4q;Pm>(nl0NQq&42K!2Ichh zc=t4vRgZ*y`LAGnEJ~;_?J}esF0|7Ta0$Eet}vmDj8P4Es7jGC$2o}@zZhYPNULd! zo`geq^(^RPoxMUvhOFz6aHyy^GP$9S=SBasodw41T~faFQtJ^I$kYljF7nv1I|##} zY~}s!M6>n6)CsOXOU2QTlG~irv^$8R&#=koZI!V5hEO`PRDA93&6|f?Ed>6114NCj zFe`+!+s0I_QX;2TJ*z=YuJuTMn%|MGM%3bP9wnMkus!1tF*cj&FZK=6ma#*oJseuytQgORH11R8 z2W{@wB*TE|w}gE<)?==NhRN@KrXo5-9(ys9MpB#&aAWl6sse==e2-ELEI>wKtm$y^4)|;P47K2nGEXY&B`{< ztKZpyz?u(?gbP}}a;*E@S=3QZho~8_E2d+s8GySehL5$Ai|nW_)F;RBY)!AS<3CtS zNWZ@s{o5-gq|a66B4AH%p3_a{rbB(c!q-n~1L_u7-SBIqnruVAw-q<61l|5U-k>8K zJ0c_a=lUy`ls~Kqz0JlK(`!>U=6$|&t#R@5>43ZM-6o+I$)@kDA4CZVSvsaf0xDMW zvP8{Y%PT(ue|Bfkv8Pr&D=HnRU?pAiX-?#}bcKk|Td?T)^YiS!ohnJPRuZoEIf1X! zlF~jeo;ZHGHPP|>)>1dJFr2qTeUNG?${f}Z?tOz?)T%FkT(PrlTPJEr+u_*h+g4sl z6MVPV{lbwey?=u9bl!Cl`PyXXcQpqK{EB>yoMyjCH+#qZx4v5C!sLgU{VE|P5PcD+ znr)bj`T*{{C0qP+2lTN%x+i-#!6<-3Gk(v{S)ydhGCz!~MBB-Gqxy1KJ8WTYvZ$Vh zx1&6ozL<~AptfjMFnXv+*nKEZiC7~j#lC%LEc_{ZygmF*6?zKc{K-Du#oV@Sc_*!u zqFCp&b}tf1jQtUf7`K{;8xx=0y`QlCb`YC#TFdTuaNNX|hL{cT4W$M$W$^CJk?;Dx zuVM0qGrR&;+vwl*;+wrfo=3@kdL#{w&v<2W`!WP>wrPLkwwSlEF?*1H#66;z%j((t zb|h&Q36*Pdr^CW(4H3f``yC^e8+nnhAP}KCB5#jhg*p zLgat2=};!T^oG`HSo}1jR+cOpe>ct{@=lR~%4p15HJtaOWp8%L)h0pV10^XvuPVRE zPE?*59wVLN{;)KaruutUn)da8N=F^vYL02l`AWi%Xx^m!D%{iX6HPn4m8l1Z0TaM8uUkTbku!WA}}t0U3yLt#Bm)ZN*}JRS_8i28}kVxi6K& zb|6I&8WFnzf+>_$s|30!8eMtCQ9>i1d*kF}6CzV_A(vjggn`4g-<#`W>T&mYuN+%? z%7T+#oF8Dnj@YQ?;BP!B_9+CU9k@51l7@M^4%S#Li%iHVsKmodkcU=blidlav(D9C zey-z(BED#yf_P2i=TL~DXpTTEY<%z1o0Dtt5AJz0dX5Jk?rPinBJ3z8;^H)^o_pR{ zztVD@7P_gbFW|I8t>{!Y^CeuFEO>-uOxO4I72)7fqBM`%{fOZ7=fulJ<6ly~d#I4o zYa27WQX4&LxTw`$I72T3qk_>6$2BZTG{%iAo3AHsrr=_UZ3DKu@-Z`E*E^P!c%KGI zn{|>0JxGng6PbCpv}zxv>k27#%q3he3TC7fKXGrMxBaslv!ioaaf9QD zi)PqXf9sGdLQ>zf+r&R=!hv~)wvY-rEiDje2N}N~BDHIdYBLR^pV~RBUag&tj)D7* ziB#?#r`C_`7PR#3uR{IuMsDRp41L|Su=7&8#^Jr{M+I%*Zu&_Q5V`%o^fUT`a&9Yb5al>NZ z)onc_Jc|!?U;FPGz8aBEYC;c^ZnEoDDx)sYLxsbjn#4YwAZIWC$Ur<_5izLp{PvaL z^~p6pzbh)jEg(tG-seJrbwlj!=VkQ^HAid`<~H1sbJOOU%eS1GC*+TWX4$v|v*A2r7gv3aZmEb5z;-XO6NX z?``&g@^P|REsB`CfTgy6CS>3Rnk+0xM~fPyq@vop%%%^)8uHugJ}ea`Wv=Z_+t@@e z1!~VCIe7KpR#P8q2>C!I(w*uq(?Idl8XEYNvGAc979S21wC~yJzEsu!s>R0I-7k5H zny%0m4)&7Pt?cG>`Mn-H$j?Nl?$y;b@;K^OdE{nj5;MGQ_AouQ{c%Gwq^uYnOH*Ym zKVOg&-Pk?q$JDYW>hd9VH1zM;+WgNZD_O`_#p~pFjiSu=NGZ^k0yQ7%cD3M=COcL7 z;+tBVIKQ%?8f|!-eZsb|=<)H75eF`qt*AJHrVT1%X`3jpIUg;~FG^``tIZb*h1q1O z1a6B#O{=_6c|p1HYWjtJZ{bO^HFghzxBHYJHv-$52QOfWl|IBQG7&A8}GwN!<4V>cK(mJaQjrLJ^=qRpKELVS%Cu>=?Xc_k@{okb;t%-PA*%$B;M z^o(oPe=aR?Gd_WCe{XS^1>tt4M@93L7bcsd3)%9|0?joAJ-SybR2i zuKX#)VE!`S2dMp|&Fn&x-Hc9t)+skPgi)v|;|s&g-?FSNBtx#kQ3K*+n1SqxB_yME z0|&O_A+ofcjpRNjMBq>?UDEDrx}%+LCsUtqVh&?Dld{D)&UHj^z^ekPzctZ+eq`Jh zOGq%o6(I9Dc=IEZq~FT_^wqBju2RQf z`A#dwyu_EXobH@&IKw%UICD75VJ^!6Sb)3Le2Tgj7)1g&L$BlgTMJ^U)a8uMOkDc! zmE_L4F9T)yD?c>Fb7=WuOdG4Ja4r_s|8 z0u=?TI9uxC^ZwOeUW^v@`$2){&}f2@D_Uw#Ba ztm!;^kg?LWFeMz^dW?<0fWQpFZ1YSPH)*u(JFlXlA_xx#8X$=VW32^AoR z2R|UefymHhW}D}q-UGjUwHASiuH7P@#R9`ekf(gW9KXHG@x8a9VP! zG1Mx#1FLSiAsh?E&qCNnmud9AH1`xE$h}&ND~vEtvHkdJEUvCXt5%9~oy*K;mg-jD zJL$Kwt-dv8Zzj`g-qkVsMz>s?OWZmL?XgA7f-|vRPDkA- zD~#^FxizT~Kgtx36Bun#$m=4c&tW8Y$V9Doe$c1-HabJx z&4dOA8)rLKuZu+9;J3TJsqKGsm|&~uZxw$dI7Zd2ceOBOw(q&e)u1asFph>Z8^$jI z`ZY7>%MDe-S(O-FgqGI#a55#_-K%K-mt*_sr8OSOD^3&=i{vxZZ2ED~iwV<0?W{%YYH#GT^BEWG!!Vm|le zio@_8Ok3t5TU+PM64{a52{+Ofbxg_HAwL=8HVfIO5Il@u_;!6@o4rxQYpR0QE|ru4 z+B=C5+3|kwvW6P{+1L2)2s^bOzuNg;YQVW|A~NU7kC>?v1BKU<4bG5gL*umS^-pO` z!{x~dpyIjH_r?FLT$pe6*UW{VXpv^jM^)I6kS+@8`GwTR+`_5$JxsB6_cgEK78xy_ zZB6)zKON))V(^4aoj(}TvlvBy_UF$dvxhtqx^$KsUs6MG1EZGB#|JW00Gjsj@B==`IeI4Fo3X+V<@r@E*g$n(zCW_$gFFt8YeMryh zb28%ILTx&V+OR%!nT_a|vx*5F+evH!BmfK4S!A+5-?VumWNd9&$d}Hb@9W}_FQXel z%O5&~ekWP1W-pp7Dud>gtG`{QnS|Bh+SFUVcm9+E-Swyl_Wk3SFEj;XGspp=Pjs^< zpR%=^A&k$RzV&xbI=tsV;x!Wrx=baH8XhUKOrcsJdh_hEZ!#gEhogqJt1kJpa{n4j zhFp@aZrYUBdcbXB{bZvgqVykAz6=WZ!}IJZ1!~}}KQnWYDmnQ4rGR46Cv}!6li!Qs zSW=%QQxz%7K(6!3Ko1H`;(4091*ih0Gi%kiU{Gx7{#>@06bA_AQBgy~I2XdHcA3iy zRT^)c9rpQNtv#iX&*MkDZ0gE4x9eE;EJ`QGvh=)X0f z(*w%2Sydo~{1RBG3wXrQ`FoS%TeXaEY)@fNNl%#of|n5Iy7fwby8E10H4XewvpUHxLlyji`-!AaSYz(iafE4}k<^(|me@s!a7qyULKK@;hsJ9{@fJ z`nU^L320Z8OxS&S%f{B>?|WMZ+p|eLHgsq}B5y}TG>6vjl{p^dX^N|g9GU@nn!;-( zeb!&p5eSn6A_t$7;ic{5g1!Pen=HtU>9I`tXh5-z7HB(+7EXAffVAelx1ydQbAw-g zzAY>)2#o%ld94d&PgieX&TADE3j17zT_?P(p7hb73ZjPST|%(wyTmSwl#>N?c&?gptfsm2kX1mbSdy3jE& zRTSw}=AV3ZUheZ+rtmu`#R!^gd4L7As!#R!jcZ!(hk*eGi3Qja$|g~?D=u4eEdhRh ze%OrrEN8=Le+{5YWXNTS$kzs&V(Pe`2&H9wj9OmVuM#TYxMUxLd0!SdyaEsngR`m;3U6P{Bl5I8s^L=Zrm8HDQ z4J=ZLiMm9t_BC@?;d5`VtCut#Sp#{ba@}l-Hq~>9#L5b|E^KGrpmt^GF6NR2@0iFc zZKsU9R%A;|Om`XUX=R6`wc)(z<9#4_0|K;fpW&fvJaRXXS-ZGQCrb3-S$^Idc#xh1mtXXdn?IBwiPw&a zV60>|B02dB-~G;8G5A0)(s0Mj?G=z7R31FQseGI{QfxT;A`BDUGae{-wGC-o##Q_W z46Nqeaj~ZgnH9SXL(*ZafQs)AFVZea#oXeEU1WsRZoeA+67aNoAx7D$dX;uiEsXK& z6*K5;QXW4h1X0-t1aPb2+yM};h&E%tLqw!3Iiqot4`8Ch$pr1Yq<`n6ofPoIu^9>o z3H|8HaDf$r5UvK20uXhgnEX-j_n5n#qD#_*uEVvbb>M2BgG|75V60m4SwP*Hu5%rN zE>1knRZ9oU10uYij5qFa7VCEd2seIyKg*z7w)i&!6DPD^eK|*;tsr;0OPr9eF(x0VCwNL|LLJKqVv}*$JO$x#XPISC%9E|*|v^=*q3lVRFSVV_;gstk zAFY)RO|~G}@!}d`RQcI<-bGVeiNawFY}mMgTR6J96FY7sgoK3m?^~DZaB^{#oCEP# zolXo2r&jDZ>Z&9;T^vqe~0PX)2zVTn;VieH~I|g z^2R=w>IMC005)sk-8bzZrT1Z~qg9pbd|q8&*c#uxduKRRyC&OM>KcDiez!!kBm^w3 zAJcCG0|Vc^`!pNNc-Bxo&@ZEmG!L%R>Wp8${3DCPVN=lT$9n6UtWp9!0e!C#Bk5*? zsO3zVvR+UXgg_5KIfV^}l*oi-)Zt0Y6k*NFMXjPYsp!lcwTA4#RScgKb~5u z4IrAsKcE;85Sl=^vZ7iIx^M%bO~-7DlN2|Ht0^}3CcivwDsyC{l6DCFsJN3@+n`%N zbJCprq~zldN1#M6F7o&u;Z-(%J~^0&02Nj{|B3vGH&8++zi$_c@Dzk~gq-!YS!Xe{ zN_(A1H!jyE*2hzYvIo8TJ)n28naFcnL%}}IW~9`(I|tSEZuI#==37Yfk-d&tkJqf> zAUVj%gH4RxatAL zYy_WHoQ)f(ca?^wh&&L}MhoP;%@mqv5y+qM_nfFTEORxV`qQlv%#sLt_rK3OlEn1@ z(v{V8R`bsvjiSeeJbE_*n@>HfyiX%l-F$tQ$3$1ch;HhO3~8&}i$yV8tFaUpi0PzD zyv?Kuv6Z8Xv8$An|0?WJ;9bN^&3;+p>^&G{0>ml0aR)~q7$kw?2N(%lH)n)-c#7ns z>1JkT^wNqA>v(Lx?j3U12n`l@7Ba0s;w*kETxWipafJpwM|Fy2HBn);3-C^N4C5_#MiCLJQeX@P z^7a$dJ&5y$j}9oAnT8s=E490Az@M;hKi1@{WSe}sfy1=Di{IQ7R3oRWo!-yqZf4^< zb$p#`0fyI8Xk#CZi@}H-INvBg2YG6jT zNKM;K>#c`#=UgiV+*hetfk2xmB`$9QifQ?zxLeo*o-Plf zlH-f%0=yFmj~u_)(&$E+dk=hRZIc`hk&vc5PkPcH#BlcKj{>$#Tta`QyRMCPBZ1I7 z^BpRA_CPNORx+l< zm%uxzC78>Kk!`mVX-MN1ZWjcoktNwGr3%rm!G;VPy~4H$5kzV?an90(QzU3#&@~>E zJw08i!rpzrw&AkjlOR+Gz|iT1O8{@@$Yy7>e^jg}0EQ+Vk3hHgld@yL`*P*_T?M*i zLHAT!Qg`{xLgVI>w4B!!L8XrIu#tjlk8N4SIF=&d9vNwpI04NRN4X+%o*kiFVjlRJzHTe0bL}#>k&YMaZyAm(;+=KF4=b~;g_Xz_B32S~YV9kh z21O>Im20G(4!{WqGan*r3)60n=)yBYks~AdW`2-VF|>+3L-}em?Qr528w{ z7;-9xIR+WDI#Q|7gy{f@2?E8MB)}g@$zF%fv*%F%$f_IBQ6}~0Nx<|^)9RiTk5Ps* zdP{}ntaioG!t`j3&k+K-*bIYes*shRY4#aw=JcdfL+UOKjH#9UKQxy~yVv<+@~Q!$ zKpc}8>$^VA;rVdM`8-8DFep2Ykbci1y=Tm=qXteSpui6eQ+%R%S?Jy0-QwJ*1y-FI zHc-sKm|5>$?>wt$xkRkGwjEKDcgZoAkV_wW7AJXW?obiXc7hMS^me`MLengf`@cu2aX4jF+N(FaFD}6#!;{ z@ah88lCKH)0tVGO?iF^#pZ@bNz$gF!qXh-O)03!6X}7$HKwGDosGDf)I%xOstV?h0 zz%;S;bV7GrCTB${!3GXn1M1Fx-_EH{ye^?G+pgrh)Hf`MFczj)CX28Dwdg-Q@T2DZ z?_uX8aOr0-%JcsJ47iG&n`b@%T3{paj3KxU=z}TTKe!Up!2B5=c>nZ&5G4lqga4Y# z$1OxeM0^wTqu@My)wKF$;}Nt$EJ9|7>BaKb!1Vw|4z%g&>58lFe)Z~Af4^EtYgA&Q z=i7e+a%MNF6>qxwngH~SxjCEM%xi$}-F6n_ohZ+)jnAg**Fh~6NBy=haN{Pa`psOri&D1Z2$fby3-R8&;y>FG=E=KlsA z1_QPLwJwiu{pFvp*+BW(v(K$29L=KQb%gm6%^%wgf00j0Sk5xT^2w zWBOA+o}9QLO#g#WR!se$MmvSy$F_78i(n-nc`UC45suPF-#b5==_bc zKu7R-==*mn%VElYbp-ZgIGc_8GrdXG9TUTbpdgTnm;_E55djw>{~yTEsb?3s^y~YZ zrF~OLV6(CYV_DLwSERFA%c zj=~Bf28PEZ#jz+3gLDHJoqwnPU#^Mes$Y68V=)R0fy8&o)7{u`tI|G>G-{Eim)^ty zw&D%24P;@#Y!|=2pkJPGmg#8RHvT?Nd70D3?)&#R@N`G4x89#<(YMdA6}$_u(SK_Q z{KnOq*)vy{ul@k;U@edxL4}yEb8k-mGzvHxd<^EW1a)+#p?0zzHlf4{+^arWsuY^0 z!>ubHQv^CaCo3KNIRusv0hd7S&rR71rcYg&$_mMQQ=uQF2^`g0fLa38gk8VNpgxX# zp~8+`(p;Ccs3QCUPd=CpP+iD)yehVJT%Tlf7^m4@{sFT34Kjfz(73U$#?5{_HlxE; zh~o^0?l!PFM9^hL4M3>nG=C9c;pxY^*{Pb@N~;4IvaKKP$cEl?Tpuq*Z8jTM)w^%9 z$;t<gv%Pn+>vJ zWUZHovz00DXkUsTYHu||l>5fB;gNb3qsxsPCE9H;k`L(fHwKN(xgy~yVjcJ@DDq6a zS-vXK``@A>9pR+B#k?xJ(>3>w;qd}@2V6srQb(e#woo!=?Z`0T!t3Ct-F*92HbJ0+ zs^uL)2`I-7z$E7%H~iSi7rN(CR!ml8%MEN`Lex&3QCVeh_l{YQ_g?DbIDt_w0jwsl z(>Icoe>ho^HZT<8sLy+!&)x^P&j1SSsQO7yDonc|B_$H2 zHEY+6L1{e^uq`n7b=gnjdbgAj{4$$`T=lkSk40jfk%6wZz~EcuPNxm2w(NQpClRhK>KAUnT3KvS2w)=|}C&phPZ91)o?!1BnVM+D7d5c z{q-xYpLPa9tL&;L#qAgk>ng$_nT1mh(Xe?Ad?gSn=VglTs-uoN7b@wAak_#Gv70&cD zf2Em7=KRsu$Mc3ZroD&li8wJ$!g3xZ{JHH^7Qk_=M#lqDw2Hvgf5(+$a#*}!s(cx2 zC%b>pU2>!?Lke(TgQqjU+eF#okw;f7^VnwPn8wgxd12Tn^L|no#uTDp4@Bca9&7KB zkRPzL6gd@@IAY^dt7_)4?E7{`U<*Knk7r-Q_2yg7?&>XYEi=Sh7^~3Z{}emF#>I6%?mzAO}D`MtZ@ndU|QCUfKKLq{gu`Lsv64pR!*o@K5j?$$vV@$B*E&2zO{Y^fuyk=u3=mFbTI+`n0!iMnYPIaIEOoy8I`PugU5=4ZT{rXjz-95nTNAzi-au-2d$Docu z_yF_q1-vG&F?q8Q(p|46Er{Cs`C^$W5ZWRbx`k7M%|?zB;PZzknTZ6_LpE=nTw+^X zM8vPy-RWN=@7QSdrTra~PtMES6~&Ww^?%~;4Ytmx2ZV&5{cMI=nFIyBw|}>S&BkB~ zV?5K6Vz7nI-U5@?87MDfQ6FPEJQszwuy$lT0VLZcEf*XHMsowOd+H9eR)Twts^>S& z&tO64eu>9WMPG_F*2T{xrMU~7D zEv=z&>?BF+M=>1LsQ*t`Zxx`%`(-}L%zMoeH7vqZFafcCsPIGl3>yCuA}7TWMK8$~ zIsOPWho@4oK-CAff&10x_r#dszKHa*DfUaQ)$p3d^uF$*0%fJNYzZg-Xm`%MlmAK{5okd(WvjR79$i*L^G z!Sm1eaoSbTa$lZ3arrSMJOenekcy5(OID*Cz~-If`{a&{i|H?B(jncK+8s)`zKp~k+>1)pHjcownd=ly1qQ^+Y#^W7ZqpkJ8N^OG%Nlv zTW0a(Bgt*h*Z`vYOdEbF`{yArt?c=$`*)4>zYPY-I11ROOfhhN_M6KR9)UfDwx0EP zI5;>rZdB^9Bqk>Qae*ilnw3&1;_G^J>`30FD!Z*dM(_6b61wXHuvs*{YSg83%Hn0` z`9X{>bTnt$D`uH7I{aL!wmk1EWMlusn%anB=>);=!+RF@F}D;kJrCm)C3!XVjLV|u5xmm!3GLo_HY5Az!`%C~X8n87 zr8%${A*_M05~!;6n@##Qwfi&Pd=4|z%i4nR$pG5}K&xsursG=%x(0ratRaWNzB&(Hc!p_ev*i-|KEQ00#ZOa1tS|Z7NaSoK+clc!acHK7P0JVc{;MP#DlYwe;)4i1eG65GLvi;bF zh^D2c0^g`61bmeM_<079>K@93K6YClNAJ(FL#ONA<1;cPU0hsprmU<%OeiUZR3&d1%?tklzdWCT@0I8gaazcw!4{$4qd7Obop}b9ro?jj7bqxMf%0ioYGMv{ zH2r34ZKtP+W7f8Bc^76)F_bqr$dzh4v=ps6`l-(WM(2gtU`=PH<5jshlTd29$W+Dw zz7K#uXQA=y7LF!1zuEZK9N2+<3hz)yL!$1>7CR)Rs*F|wfPtATSt&N%vL{t&{6kU# zb@pqd0cu2jz(F(CDHVD|Xt890@%*9DmtITu{cNL+!kdooN$L6AlhKpiV?{OiESu}%|8|?h zk)m)h_M|kauUn6@P(9<_*a!?X&lNsLtCmDp%!8ZV-~t6?W@8=d8A_H_WdB`@LzOP) z&rmWB+TRif{V>n@_VDH?6yQt&AzT%fdW%k}CJL1zKS9oCpWIYLW}ci4u&qHSI)xd0 z8wM0?nyS#u1Dj)57um(Rl{jAE~ z*mB3_Qo>^l9ZtVIvQSI`q^IKvUXVNA^(r$~Ti5pl=Hni8g!4$S+M1?)VJ$!rXLl zfiY1#?I3@|CKMQpzkL_FI0uXq@U^u9(cxPmF+JUY=rDUoOKWMgH*U&+Q)u?4iTd|{ z7GD~jDp-NSu(FjBsYy9FKp3s^_3HS31ikR~Uu4fQK_f=m0}{H}{4YS*#R}UXlauW0 z82A3c+OJP9yYf(y3A;5&yuAjxV}1(qbh0nVfoaEfvZ%7*0uSBmf#(fTJEkF0I&X;d zjt2m1Kbrq^?Z zXnP%W`7My7cYd#l!rc}ppFFGwMZ#}&Fl({fd8t)qJ+jjaUO85=JHBBxwGkz#EG{mt zSFg2W&qfC7jfJVLlPKQ3N6%)Pl2PI|{C>xqfDLV;qf~oJ9+K8;@R0r9Okoo*&B~{&;&veagmH0Hh*F zYO`+86}7ds>5(NNdpjL#_gnT>`S;)WO#;mW0bDejww2+fq5FqmXClI_q#&RlhIQ4r zagC-77Un5zTwux2_7`_KNs+C6-lSk$BNq>^0gnF04W7n_d^V#>b}o^eVXRbC;!XqL z5pEbNRDC%4{rC@ebv^DlJmZ{j1fUM^+clqP6rIGxUL6&wSLd#;ueXK}$Ah9eoTs_u zYp+4Rb+)AQS7;S){zLV^u-w<9___e7`!t&{oo?TBxCC1ABAwD74K2Q1mr~EV{yU9k zjMUeOTw_fL{*c@Z51CQprKUSF>)C0y&UL(|Kb8Th)5_OZ7RSXBJg+cZyGUga-EgHF zYAz-w_Toius|gj!+0jqG{Lvl&E-k}hbh+OH0AwSu4|D;52JK2j zy#X@L)I-9ZpjF||#ehZcx(z*d2Ht+CO%O;zGVxE3nUaEvqI_?lU{q~1NsMRAnP={4 zjv$b60Hy|RKNrfFo|oY3UH~AW#QvjLOh}kX{E-X{1PD{F39xpGE8qTyC+~0L$xoV) zW`C@-8(vI6=9qnbB1H8sH_ICpZ0w+9^*8_2a{d={?;Y0Uy6ubF!D#`-1}H^Aq)QX& ziXZ|~q$5oPq)1Va4nY(}q=zQb6r}eSq=YCay-4q%^dbZZ5D0{v5pb@()?RzxbMAf4 zx%bY$<|E0M?|Z+uj4^&?{EeY3F8=z``&mXv_KQi~ZiMwW0c96GTCYqq5Bp~#IgoLn znk??38c4l(^`EHXWYptd$&giHfN9>6mfp92KX4q6?~JnSKNCaBF0)eu#5%*|P0hf3 ziBs=Cpe4nW!K__Gj8*F&FbK0hweH)rIU1ndlc|(0dt8r5LYPw@##ZmW^I?(CrW-pS zIwkridWX;aH;4wXBY>It#2H|h=g$Es*u`7@cIG0ySKtYe)0#npJ9qBDEZH!K-a%O! z^8djg*u9C*sUDKIYVa5M ze_88jxM&ReDqc&w@YeqTMh?BXp|?}NS+HG|aC0yrJ)&_pNG zPFeZafa}vQ66X4I&T#7?t~ebSmmP?U>w&q&v*vE2k-rG3a9uL^wSk`m)#PhOlvZdo9M; zWt3Yp{SDqbqA9B63$?_7=-iU)74q1Ud$&?xefX_ir7%(YnFp{vVy>F#0-Ybvu(cf$ zDo|uwUE@hE44^jYd07HEyFL4pdwv)N9kS#m4zGpI0Wclm3*40`9Pl-yz9KU&@Oy1c zGG9tYc`hRg%Zvu9kbH>^)RIfH2W6ck28;1zzirgwmWoaWE~OhZw@>b;=h=W|2(>Z!oYD1JO5$su}suDfI>Mx2>1ox4?bj%IUIkr#ZUGeHv=7M}%|oXP4%BI%P^How=f*=>#v!0eN$ zy<7t%GszCT|By&eLEDH6Gk1n(!33wD)AC};SSoAGcQ%7-#G}SP+tk~aC*l)|ZW*4x zI%}=dIaN+ow-%4xpXEd^V)=3WuHP#$XJT4H^Ph1CqT^DupsrWiE9!Z%w{DYdDD30G z_1wab^w(^W^VyXHpYpY_!^rYPld;+EY_Uhbb+YveC!1-ITs4a4=#{2AP2yv>?oO9F z&I#A8tz8haSqZ=XOj2ALxR_*+Lk~r0SVPT=WgVAa?)qU|9Wd5*&P1m&wd?#cRY+uD z%r$!7&Z#bKEEr#jXc-oP^%e=SOl6b1#2%x7u?S01s=jzp>VClrsjr-7`bx$McFa4^ zbiee0i;BH64^GLM`Q9^?>l^Gnb(;F#O*xsq6N6DtZ=O1M`qDZD?LAu03#RmDrvhc_ z-^d(fKH}qPggoxe(vI!${Kz$@B`j~BPG3{#gh>to<3&w zLe<8R;pU#ix*|D-(A!Qe@|IHg;Hl&bG&By^#(Y-hdsL3a@H=KqoSIZ_jJ@5|!G;%F z4xQ=1wI1q8??|DwF^XcD$uX{eO(HIH3PnJ@|1TBsjc`5;$&xkOpr_o~+B$1R9QWH{ zQZWOPB87OlU~`43LE&Ky_tnh@%qA(V@0bJcYNLvbTpdv)nsgK*>92_;w)pU~IsY_J zr@R*f&=f%mruQqJnN7`M)ixR)eBxT_Y;tCZUn-Ev>KWNkU0r9)b(R!(ydBPF?mX*0 z6(m8?OeFeBUVl_oI790m$bb_^yfzpz_h|@}3r@Hydc;NZxaRWyUmw1{gtXCW>&lQA z?rb=xHjj{}Uga6t6|nhO0Sv0SFxt1z3CMmeE-QSNK#09cuwmnMNiEGbY7aH3l^b+5 z2Z}s5=58{ux5F;0tO-Pv4t;()7LRtTw`t3jX-O*>$#3GC@pwEu5Gn6*cnP7bNw-PG zfLyC686zgtsg(b`to&XBY&Xy&5LfMN;vl?p0|%~Gt|xPX%qBe+Ns>`@D-$JB3cYg@ z>sY-GXIhh{d$Up8wA!l-2qjFY7@k2*V!L)Oj=w+&{}FkZn~0oa*sP5)%HC}AV(RoA z5?b?%@eLe7V;46WbFb|_x`(%F?9F8rj7EmW3|Q6-d;R>;UpxZA;#5xg?Q{cU zW8-Sy;5w0L&Ut~Q>H)hV@ccM?_H4;UPj-#4V-)A@g{ia0dK!4`T>+~rL|deeMeU7Z;Ae5rkx6;S~Q)+~N*Jqu_7qj<6> zR(R(#&y$L@M0?J0lp@#4*2RSEbQD_wnko|YJ(?A>J@< z^&Q>~4yEHZ3TgW9PsEzWSqDD%;_|f2<~-s3q-86Z<+@{qQ}6Q=G%PdJQ$|^#<4pN^0I-17homcq%4)02Nm8(H%}F;M4{G~#4GP&g1IShA{U1)#iX1~39ITzAnqrUiR` z#guUKdVIrRyr|=Qnc~!VM2!b)eDJgF$zilPVClpOHP$mc#GYCLOJ&_VckBi3sI&C+ zk9{VO09U&{BeoXE zK)M@6e|uiyiN=Ut19-F+z+;0wjXD<3%S&3}%x&QT)7X?|y%qGqvmrNn%amd+h&j&@ zQDx59wro9T^av&^>-V>BGLk|H-l-k~#kNvQgl(VkVSdxjaSVA~kjifdd3q50 zR1za?4^*{Jy*R>?2IT#z52SB2f{Ls(8MKqtyEek?^Tnj(_!( zx7w}vTyZmE8yq|2%w=EN_@Sz7cJSvLSoyF2*u>RS=IG~PRaAsz<80NAFW8h^C58`sJ@0aiThaAG~Dh6&u ztlUU5eN>7{`IKXnurpTnkLtnCXSR0BdiT5Jt%axz8?5>;Sblweqe4Vqcoheq+N*`gMVSze?;0O5soDwYhin3NBi% z(!p9$SB#Gnzv&vZEVwGC50{1~XL_#S#?&O~DvEHOWy_@TZEmsPuRkq$S!&!?IQGup zAD@VB2%3u83{z9ZK=hJUR zbMrU8>^A|&uZNyGOL_WD3EI}YwXG2&V0%_^3#2d&bmVWdd#lo=+T%)WMwVtUQI2Jk zbX^+@B<{}Ixh<9u>HH>|G)w=>Kh3GueJY`*0C#)d8`hh>DwAOOSdekMYqL;XV0=WT zR*7|222iUYL33YVY}Gq1tZ-ofXf;ub0imvrF5rHv+`Elstsz? z&MMMxh2zPxJ1bg0xGiao$IULk|Ge-5b0d#QN9$wVe0#`JvM1sNtvW4cFp{YA;7st7 z5;n6ippnAK-A;SqLiV+utPOraL5)BS*3f#7&-dI~r`t?C{(i8)5}xL`N0Vq~r_{&? zCclNeT$VF)D|3JYov%0=Yqc)=D%aIx=!%2N8|QushI90z=xW!ER5SIHS^cYR?Oyed z;N2$^f83(V6lw0ctXb*ddWj|jG*njUuiGv`Ql*02!#)qi?DWEO<$o>TXLh*mvjmCf6aJe|8@kaP;dNUNj8zu*qu%-#uHxgPgAx<$U8)6gF(j}AH9N}RP zMZ(zVs7D}IXNv05WQ<*SbNblHg#L~vVN&m@$AOTl#M(y+hSJ^VI#D>g~)f2sU?S`&J;ei zizRg8*!guYancLH%gV7VB=pu>PL%oYqf3>pF3TG60ReB`gfyc!kEiXYVi3I;0|DTq zC2JwAKqiBH!14%Tbxtv|@OObV!HpZ(ei2Hg=Zd2p__fi-7GweblLO>s=I5WUMM zcAiL>>)dA3?z>wM*)JYH0|xRH6TeXu_pcELuQ=$HZWHLGD=^K)dL;`;!twLsT>Xw>M(9Dj0bTiV0GY1_uWN0s@Zm4TYK1 z7IKxG0uA5^1r??&u{N|RdNZ%llc|HaVn1g{s#J2o$C}N{@I3+l_U27)PrVvBMUo?^ z0hx#K9}wGSg>)Ujc%;ViUTC(DTNJpp-FGT9Bu|;Yt0~Gn+WGKmk}XU!UI9)$;_xY) zVPnc)2m*zSnf*)@rTGlr%Ze1ktyhd}4!wj$elB(%*(+ZaxwrCoku{<89-%RGlX}!s zQMLW2W6x?NgM4Xw2g;zFx_kBc2vJ<|0F88Svgp^k2bo z%Yyx|Hi@uKV-m2`$Pw6Xu4>~aT=T9bkY4W))w!!bdNUDK%@sWbu6;%%tE1PbRLxi} zz9gw{jtC;M(>PY6PB-uOxM0z@;*hiwRcJD`U_XqEk1|JJlz`Hj%o}`I4p3Yujx%Ug zOX^ih2l8b=f@p*&?Oxm0B!RIeXrgiKe44~_AI&W25f=Gw@7&E@WR7F)EUGMqzy2`$yY-;uE;cm9c?p?g`>D#L> z%SSC#%+c}-yd^G^(aTHNOIT9srUlAA+tPyJkr~E~MM9DxqP*2Nq5V z@2e|@_#&0ToUnz}fgvx?s*b`dZ8QfnrKX2HJBb1K)V~6+Pi1mPR5apBI|fE2=3^$^ zM5D5tQyEvjRT<;F7^9=d5E~A2LLc%Vs><0Wk_oL|wE_n4FpiM>uuuolIwVNKo7?#{ z)pUukxb65)#e^^k%!8UV6=AnEx~DDLdb9Pd;(-k&;`4_YUHd5t2T3|JmKvY&_|TD* z(vl1I&Te1b_Fg#!A)2D+o6a<{32;AJn-O+=Rb&L}#<@}Ar?k#@-ysdkU^34;<~@nB zNu3*y4nKz&!NzGaKB@H@+nz7lwBrAjaD&Om;TVJXCxBvr;1%HSPhK-)Siya8c-)ye z>|>YXC>%R_yu4My>LVL!HFm;P`$_Ey{P*B3$;)g#MCGdJgrkBbM2afjlF!0e$J!w0 zk-}-J{XFj{`zoA6R~1yB>_%8`VE>5SCW*t*6TcZHu~5F<+R^dgt$TCs0!`_HMD1Wn z6K+MEkUrJ%Nvd1z|oDYTep;W!C+k;Gg@T^qE2#`%XEe z)+&F-^v~LoVjX$6kM735KoTNnDR2SGi?BoQ!X*a)JNPg13K=+ub^}zVi_{n2?FPiu z5ra2ATPaC@^W1Rr`M)1WE^)RmxCq@+IdMg3e4|0Vn-R_UAMxp6NIbEA_S+pvq5BH; zVG;k9$f$nfRq?cMOR>l66ds6Gj!zfYbp_fh9;(-8OwG(dW6lcyv9M(A$PM2n79q`$ zT#=^rEJxTpg*30Qic*)^EA#3^a@Bj|4=d7;GmMG)23!|onHMC5+`QN#j}G~}ccD$k zlT!VS_MQ66DOpR_MiyvtfRsO@T;PF}4X-TVAZItSYxNyVjp|amao4S#ZimU|Eb_73 zN=2Hpsi?*$i7UCLESs*@dMY2NQoCCj%F4!O*I(p!{*TV)3-VPMSAyvY&GEZB?fX9# zFiVIbWc!h)$b%7;4Wgi8iT$*`-}p@l*;*Mu z^>p>rQhgD^IWyqjf~P{z+qdn`8y5wnh%1F|7~Y!oH7LyLT;{>2KfcZ6sCHP^ux+7rzlMIg9tFI+%)CgPTvC_P+7^yaVFv2myQ5iBr zdDVR%W#WGS4$IW`G6X^>SU${|oYGaHVh|tiWLL>yXA&wE6n!?mKI$*9y0^0Ctk&Ks zUdn+e-SHy=SqA0Z1cPR%7ZSWP5}O%Ei6lx;URbV-PfUFO{v9eo>6C@1KaR5l#Xv@O zI_QEJ5av5Xr8594{U}F%AWDLfi*=t zFrXI~7cVwx`S2S#eKeGQgJp7F9$OXl$Kkx|;0Tum|or z7;WfI^7UsJi*$!XI6nN{O98eJ>cD&!aTxwV)yaEn{{8i*YQYQ=;I|I888xx7`bN0M zNuR?sxs_$=K)xQQP9g`WaA1e8dGGh7I7Y|i4pnh#Mk%9tA(hi=&*#`b>^oEiHxG%P zVsS1!q|d%;ZtG*ZS3O9H(;IlvCI14ia# zd__gY5uVRK!Ad(4wS})b!n*~+)lb}{Y&flxf+ab4_31J?JlDF>U`q@fHDP@3wSaba zkLDerWDsXPf=X&DPlRSxA_EMbT0auT>s(2a~kFYsQDm9XZg*w0jx#)C%x&SnLw?_6S}*BUxa7}!-%d|5bemzVcPS`E5Z&Z$ z*;L#r#aE{7`^=)|f!FX$x^+ya>{!)-da#G9h+$ zdAgcl-i)ZQgalsvJTxp3au5)@wA?qhCv@$*nsXQvIb`F=yF zA=LHF4wNLAee%hi%bB}CPtO_GDvpaa%WdnXe}p`9`R+T5g|^xO!-+gLk@M4vL!8m~0GFy`YP8t8Qv#4|tux zhZ^I)#OVI}uw`0sMN7UQI%YRu1Nl@*({EKo6yOXlN*CqaEDG68Y2^bm7E7+2F+ayOJ0!!uck*f%OON z!jcjbov_0;3qACcD8yH{;Efx^e(O}Br~}eCYy}_3H=a6RKsCZZ2N(C$J^(wlaa%6k zf^YqE#AI`_Fiyt5+=()nHTb$YI{}$ACaEgIqu!~=Mn|Ed@5_7v3;LR4c%MxLpM`gH#|Q}pzkggFOp-#2hJLVRR& zJY47Vvzc1L^B4Lmdp8KxE5id`DFH1Q;=CR5LqIdw!#mH|Pktf<_m-li%2Fhw(>X*$ zHrf?=Bg#d+wmnS7i!9^i)|v$3ilvL4AKm!aK}DqMc1|bL&)r74P?cNDiXx^k4Xto* zIdiTeL_#vamm*zi-U4B1i?#c!%c%HiagCXd+g8)g36xyCUcGXK=B*TU9(`pn~|AQ*06>HbG(a;I)^eL3Yx+m-XS+RwjfE&k^cx>|q2ci3Tr^Y&ILDIS9fS+~iO08gBI^1V3PxsekR1UQaP-5;)08*~%r_xT z;>PkGEgc=5x$bOrHMK0U7EM{nKkhy2if8T>gtzx-9|VOEInd6psMrCC=DB`icUf?< z5#4`+eX}jPs;WQXc8tfRFgwxz1QMMx(<``({Ep;`HvPrYn0hhws|Up1ul^^=jYd%d zy&#xOK@<;J-TzbA13aMEn0J)|AJxkBEv#%3|@k)D$@Gy?qm`aIeQL}knl+?Bx<;e#IB zr=hIe0+vJV9UW%BiiB8Y&)g$4Wb7h0#_X3z>X2b!&@4e_*N!NoNo()^kN1#Ay&yw? z{q&3onQ_Jf$r2Z%j>XO^jLd0+je2Q`U` zaipTu`jd3Y8+fc)BfXIA`O~M9u^jxRuTv8cT3B8o7~S=XT?-1Ho=yfJNG3Qbe8%%x^R5slb);D@_%1b7nW+vOR!Ami%C-C6AOP`d^V4;u$Z z22}Gm*BI3j4yYz$i_g!QGtAV3r2PG3QMuc~NlHeC8RcQ#zd@%QJcvzxO95+2g(i``x z*x+jK%g}u6+O-phkFaEgwLmO2mUvmo>GvQGlH6OjZgtgKaOe6v|M8@8o0ynzoM|`v z`r@D!4&F^|Fe9Uc+cS`UlCJ-F6vfpA8qrFa=1Os*nvSz3*5C-UP6Lxo6Jl}bT{r44 zWJDJimU>rn9<=*Hw=?WU5LUS-e68_xweJTAbx^wwNVs~BPJ|67UGxSTX!#yGMxV2R z)vi1)d^svai>!_IJ~C`@j-Ecob2OZ^^r(HK4kFs?@zLD#+J@0_Q|PM^%&f*hD=M|S zf1Ii~YM8`Q1z*dQThHllJFZ6(Kt+e~cB zW*!|zbeM~0xNQXsJ4>$h(zL54yp9v*HN22nFw$nC+rH7QXQy|(B(6c~Z*EV9A!1_! z8WYv_&pAOT#B}XicmEtWE=Q54RE9rB5X9FH8L(4NGznrpgxrueca0O2_XrVRZd_sK z1ZWU9nJwEp=QS?W^USupVk2j0)6mN^XWq=Z56M9+=vjM$W0tbrV!wDX5o8r&P76zp zq66waE>e^nmZ}epfmR!PPZUJ(&z^Rqh&j*4fh#DeuGH1qxqW?Ky*frOIVz)^V|GpI zZ0d+rm)5aN^qnd!1DRe4~yJpi5wF>Ln-be;Y z2O#4-|9AlMmZJGMG3UcnRJqVv7O0U&ihD?P$D}SB+1Dq-x?5Vptu}^aT`A3c++({* zbsi-#Xn&_R$cvtT{EP`McI@;_#nf<{eGUkZBg9{sc0yrB8`A%WzvL99uHB~dZGE@& z?l%~4mXYtbdgadx|LfSXV>>McJmuA7K^_&!_=FH3tdwM*T!)dTtgy4be(f2dp(@{V}L$lHO$2lk+hUL^aRr6WY)`2Sh z@)52K4mLKqNHtwuuXV?zgXBY(n$ll4|Dbdz@_m_Q$K^R;+1(wtKx2FV$6Uh3RKmX= zVmh|NGhh!=?^B_&s~L{Yt~yi|8+%^xLzo5BcK$n(EL zvG{o6(G&P`3e3cD47Mo+!3AIV3$`sb_U#*=B}{st>)^wO56P@>*9MIlP-D1)ifc6# zQDiq_yzy4kP3oE3aY2ue@yIf>cu%Gx@u-X9myHB`T*#f+qV(-&C>VLVs010+zJwCI zU!m_C+_+pX&^$IZ*X^Wzg69LJ?THvL65Jvp8P)CFLiGva?# zyK)_96_B9dxOB#){b$gng;}aY%+v}10PmdMYX~^K5m_4{F9M1rRI$9_&+j6&>s32&H02pw3zj9NzPs?1Ieloskk!N(Kh0uY=XnixurjA1s#Nh|PTxBMIY$c(;cw zC4R`oa$YwQI2Twg7o_Ok5-Yr7!tERD@F{mcDPZ^NO)rl){#O^48x-LOEuSO;VLNQu zb?L}gzp%^XM4A9>!6?sBjd;8#5=e1(+@LLXfg2ArK{p9P-Z>{M^fYtS&}-IBzIxSAvM^F}T3&I96hRFdc|D)u(F55d>* z4V;BZNl8$&`#``ii1n5`GnRt(65m@wQoZ@;DjmlpT7YEGl`f?)5UPN~Y?(EA;uUWx z-%nRd*36WOLV3KpgAr9FCARZ+;bh!Nd-fRLl9#!uvG(Z@(Z80zx~}}Tkag!BB_1Pt z`->u`TRwi;Mnma9P~a~#V@L{(b{zH2r-DA{si2hMn8+|-PT>~?ACIBp$HGEg;M+Es zqNImo)n$--Gjs$`%9Y1(A0poPPHGYWs5E*N=>hU-CLK61FBaLi%zpcF`tr zg-gFk=NQz*hw{gGx~^&U+FQe1f1)}7Cg2Nm00B60YMabhaB zh^hkrN0#b~2c+dGPd*CRCYSkcj(+)i>7?CdrFgXvT8-)m&*kJO!^l3Th5k&@RXIyB zwP?}#6STa?`p5=sC!B-A*Nk{dO&dBbYpf%AIf!aDDj7z3U-_#)R@Z*wbC~4XI2mD4 zVlu@bB2$?+A!_7q6I6te*D;T;wFvMe7Y$=Qh%qF)6OHGRBY*ZkW&AHXq)F`wHw2DVf8OUT9 zNhkH!%<4*^pfWqgb~pTXOTD;OG{^7n0S;J^$$D=9DmOk^bj!D<-fp&3rSgHW3L50H zY3dEh%S*Zr8+o;VFs>FN5f$d&`uQCe(E~ef&bp&kc|Ng!;-8GYsNi;|PskO_v6HfE z^HR_H%)HR^r~%es`Erkq<&j)cLT=xRV)2DXlx>wRE3}gL3Hh=26T_Dzr!IAv-x+gx zL}o~vpz?d|k^dlXn<7l)wyYU}1rA>Dl~@x(G$W{V=oLIw-XbD`dN zJ9z%;KucZSo#M-p5rUa_FJV``hG-}?19cuKy>w#=mwVERPSSKASc|h~i`t$G6UU|s z`v!kj*CLUK_Sx3A<>d4Vnnld>Jg@9L_s1pKv+^~-kh<5+^@WeV%?Yuc<{i9U zPVeRoWfP3MW?MlzaoKO0$jX>;i^2W3pE%Z>JsIXig=_o^eZP6uK+h+!GR07tpkurx zq{HAl|7)8hG;`ME2bJJ@=?4GD283L&S-rO%detdD_(+&n#;lU;&clKO92w2}WstNG zxoQ^4ITa{8jAZ?}d^*!3`xNY6_TL-2P>MRFxHwURjx1N4K{>uT8h0r3uEV(AyJ`8C zj4ZlIA8eRnuUi&yt#p*k*FjRdSFgWTps*{4TTgAGrgEF0Z>gy2=kE_huuO!NkwCBH zsR39k?M!@^p@sXenw^KM+A+qFw zDEa<@(PGg7_g_YL=7Rk_`W?DN^$7nSmA!kO-}-YXn0@5RRMEY>J%Lml_HZza4~`fO zPwz10v)azSimJ926W)5~QO_C$@3V1>xqoU;Bb~#z|5o`F`fD0Sk31+%O`=anh+Y8E z*^=jU^L zjGp47v!7#8kacfd<{1s34F+I{>>?C-1myUs6S&y76Hj|9FOo>_R|X#LPLPv}Kwsj` zmEMUTwc=1`A8n}z1}Eeu04Kng9H~Iz=}ao4@HR_k6aEY)7t0|wdRg~n0yo4C{#Bx0 z>63O|<+FtooT~^RB(#G{ktO*$bxMj2b{H)OMR7QS(y-iO+vqj}tbVlWP8@QodxO#k z@)|=ReE`@+o4^ZgP*{Pls;tJb{}%u?Cm0wE!MHv%ci|HPE2S#lBFA*}$Pq9>TFu3z zOqWA#=P)@+3~$(FWghtt&g%cch>QK6_mf+0PFrt_SUHhex$-)Su8Ov=2B}NA?HyLc zCKaKOVs-z%nwpxl^kHT=)-M_DB|JA;aK(@hu0$dwOeKmHX;-B zi`bVX?LVm4JB**H4@3?mkKB@dsA+G%42A>>*2g;)c{F)+cw+8Cl&V0n`_-!TiS(0> z4MQe@H}XRCScDa9qYzXP;hh?XwY%#ke2|Ti{yj#}E&ll!`NiI(@}X}p1ehP-^@BSf zo^PeuEh>smqi;IYn>BvN;h^^R;S{;L^n!tMO#9Q&lGW>YkDva7Jf)U|xVuV;P}d!ynHqqA_wg@5iCwuvqQs;#h? zNA7Idw2hW#oBy~BGqq@_&66GKc=&;x(%cU}>z6y6kPj^6CxEs=mlm8cc@1%HU*f{% zhKp*6KPbBQ-VA@Y@DZOth5DMFw^O&`(6H#r=z@imUEUfQ;JVglo{c`3S;g@9KYr_} z7Soo?OSWrwj)$A}J}YzoTGG9DY9On1NDn_?m!pXLK_$Xy{Zjn|SQ{0CKpEKoD2ukL zvQ6vL*E*v!^J@DmdEn{I!H}GMR}S_P`M+K~?cRQv)X?)NKmVAr>=B=KNIY+wntpP` z_iD>)vGm{Hk>E z);zbcK}R+>x&n6Eg7$NGfyN=R;LidMgQUK3+iOHB0la%Nj<$2q1MhveHD&&R!$!X# z9dL#i?Mv|t&Le_79j?Dz@EJyfeW`;ZHk+QGCO#cBr;mMmhBBB@Y8YhU+r-Vx7HHzM zHq$|_ML~)TWC#A&@?%g-hkwoiSQ)UZ$<~D28fU<6p;E+;0EiemG$Z2ynsr_n)IACQ z9Fp>6Mvxhqsy>=^qt_+Fowz3Oi`g}*y#5jfi$rziZi>(2(NfgHi%R(C!s3Bm2<(gp zA|iE&M`1g;U|pz-xxax3b67KQ07`EdW$o4^|Y=(;aZK zGFRLqlMIk!(4xQ{&yotP6u@^*%y|J!?)H*7N8vYNzWEjI`)EJUxxnb;vRqvga&#!y;iC?@8(p4#W7~%^ z`GffF=xj76uuCC?`Jz;HGYkinizxIZ7HGF`e^Cf?1N;-aSx^A|Vtap~KiWEj^U8@+ z0AHFP4TI25NJFNnsVTe#+Ha`$LusFkg74_l07$dy{pJ_%{0O(aOs=VaI7&VdV$V^^ z2KtI`Fthb^X#IN9-ahhDtJGZ_GiPS--hE!nxdG9d@{GaWb* z4f?DGrw)q&r$=!sf>jGRk8@qqMX^OcVb%i&LNKRn7Nl^u(_5yeEly9Z7#BPSd479c zLj$q}f?K_QC~YrvW%j@<3NYTq3d3r^gYchj>old*@K4)~aIt0V0$)58n;W7`MKm~W zv8Wv5aakiRlqSlJ|J`rohcvh0<(g!#tY_Ni=UvsGZpn4m$0*~E_Bs!a{Jb!%qSY<7 z$*h7)dFqs8Y@7MhxltUS9e-|ha}Q4bNXxbBr$wkC!UqQU3RI+#PEdXx9UVp44rNe5 z%0))-@C!p?P;>=^F*P-{9KB>WUKa{&+ONHK1h5^dosj>i4w|PJwx7w2 z&k~v(u&vL$RxnacTy4rVjl=Y4%>J65p93RL8Jo9>T$4&;zb6~7_D6}&y0UdRwi8K+ zm6f{EmEBow&lGM2w+v|Or+kRcfiUjl>)VrKphvv>f$uKAA<%>}HPSEUFOCIEX;CQ0 zTvOuz1=)egQAK6tO6Wiii6)@lD*wD3b^g-7+7jl`$%|pr40sP8A>s%3n$(5A@b~d&V*jz# z*R{5mJmUIaK0=naoixlN|Lwdvhq*W(q%E-0yWeQssa~lAYYON0?c1+~9)Zix=mhI@ zE)++;=#q2J4-{3$X8IDclmocv6X=Mz@!R$D$e5Io`d!hLFTzTLNAKUxs8c|SgHu_a zxZ$$STyn=Ye2|C8zyW9wC@TwIbF+o(qx37b$vtJx`;x0HhyO@lO#MVFRHl6g&zH*D zCyhJJ;8p9J#o}UPxqda=#L_e*Hymt)lXfl_4)QNg$+w53{x3Or)dK%Hu#nGE_@}sn z^%`x%tNMw0S@I>r4ngzDbTW7s9&#hi`c7+*Q7Fn(wtZIU@MCtn`s@(;izVOJrVe@5 zH#8_KDJm)`DBQX7(OHe>E{_TiGJzg;%sPH=Rn<|SN_-XqW^=T+CRZ} z|4nghSDyr9_rEHJ`v2YC${(ik=`r$p`D63t#E)MlU~=RRRG2$=-c&;LvxgkLK;-^9 zHv69Qh{*y8UocU_lT=txvLgS&tatGQK^EfsJ%`Bo?i=r`moHC3fxAuW*|d#YciB=+ zj6$cF51BjPxVhy|%4o(&T}9P@KRZ`_{?n-nc+t;KlB2K<0dLiWY$g^}S$9P`Mz7`c zS@C$siyR!YWJw{kom!cbi=gJnCGzf>TTm|3oPlbaq92}ZnN#p#>Y0$Bxb zj4;)?E9F}(JjEL(%dJrM3w-nD^K3>YlzC&=j4JIN8zZyH3eplow0VO2aK&8tDye*} ze~#rz#{OoSoNW)Kjz`U(jNEK7COV*=Pc|r5jw`=C1O|BT|T<@!*- zEc!}}y!!N)zsg0LJ}mFcyLYK8WY&v#tY)~i#{-UhtKUch<`p*G09jB~Rn=79L<8V@ z@;uTLI^G_%ior1E9|94VtS zB{${~Eil`kOQpN)H;xC9;EU6g$$TrQf#kMSm64Lk?~0%ft8RAZe%TxYUJKc&auHXX z!P-HnSdnP)uqJ4z<^j$J+1ELlBe7{$zANMr0G+uqBldAe6G@{or&ilbM#g6aJM4bL zM!_et8OWB!mZe7rl#GO%3l5Winv63ae#o?C{hh-SoP1?H4K=QjfAL5GyLvi|?fL|9QakS>S5mIbnZ#UNYCiIn8k?;i zW3~J{c5rZ?j3g-r-pP6xd6#7ZNI`uAG=9gIDjm-N%`9dT9r^WO9|+$Z-{1w(Y73Rm z#VO2n+kh6Q=(6WP5R6+OgG0jnQHWOxHXN(Ul4=cjn`6!TGJ|t<@)NCdh?9D_cQ5Yl zj`sAAdj#xx*C?5hU5+6?Q`-F+cIt05=ottJ%{I3(65G0 z!83H_{X=0=6JvV~i_C&L#~cLgAU!du<1XoMS@dkD%GN6ZoGU7n{@V7ZR=b&v**PD; z^E8N7>bSfYcg@@-5Cka$RE6i}aeiYUH>E1~cvMa*n)HC7MY-b~11&8(yWos3BlmxL zXs7_gz1?7kmPUXSK?eDJ&;Lu9%Kzub25d_%E1w@Pho=YfmR;fE`n}wkyFQ9BnlVw0 zt=zb_1eBo2+Izr+2E6-Sgs0l7SDCeIQcWPh99;9@9}1FrExP#u=XF>!o>dp;21^xt za)z2DYD!^5LD{*3^|*}dbVq2TtnHV+H%8`)yR7%(<)!Y%3hFYRp$4}{k6+)T-Mp4K zMYIzYw=IE{_U+x~!U!7woTVD3&ydJ6PjRO5P#LrzsTYX=GH7ZDN{ChBn;v`mKtK!b z8RW6gaiBIPqe@qnc=`G5peoTXA86ETIF=2x@&6JK)`AMBi8ZoY(?tQO|x%aXCFP0ZvzL;1r`f4w>z1ZzD% zI^U#3f6Co|MA!&bYEJ^~EqYeJymq{{esE-TwkJVy>|QCZJw&O?F1Ct);18N2@l`o4 zXQrbhL6QyT^%9xF1cx{HhPQ2P2Y=PU#|*Sv0Ep2x#-q3yspqS}(d)JN#uOzVmYRkp z10R((wJ)5{Dr~-_in>2pv_3f?1F2-&L(5=*640MNlWck|Dil-jgHD?l&I(x~^Br1` z@U|R1c8oYP)f~Ce+@qhyd05o-q5y;EU~l*vR_#p5pH`dunr%qA_r2~SJWvlK&VRPV zb$`Q#eaiQkuxc#jD!d@>ahDD@0#>Sf_T}Pqp33l6N9ABap7J95Jl4RI%@8Y>YsT5t z1C^7&H-*L?)v0%@{T;w0WWSK`wZc{jyXcNZ*cSh=cHI*YlOi*r`h18g8QeLv9FLyt z`)WCXi7z4!BSlSil{*7{4~Cr&KV)Z};Y>LaO|s1iK5JpS>D5Ir;n#OHYxMF$RSgO} z`1t`a<_sq?y!G?L*GPw%LeHWV6TcVBd7WJ_VRouL0EbjT0MZHj*3Vxik=s9h{Fo77 zXk10;chv2#aQFplA1PfM6qdhe;phk(^(O{qpM%@f6P}KI(;v z$dt;}%6@NJg^%(`BUfCRuKbzFF5rB1p9emnE8CeRmGm%lc?dV zC9AdLjg5td5zo+%TM@<4k@3tQpLKH<5}PiUpl#7^xfO)|-#wEso{w8AUlNL7L-`*3 zXPG1ViY6xa?l*b(ki}Quv8&5(gl)o&)D*{sPj>i~_&5*2D zrm`$^7j-YpD5mV&Jw`*Y&LB;JB=sW2E|IbR?VWDf0#OcovXwQk2JgtrM_}E$v9EU6 zCHKren>w;QX7T)`0nQ)bDUlb@*wg?WU&qlmcYf-ML;dWX?mM!Zu3#YuMiV+U$tfvj zrlvZWgS*#{*gy&)v%*&)PiOiM#`zJcQcm9GdE z7M4ZVd%O3CHVtIqgqGjW{#HJHiZV;c7Iae{AMf(_hYAQ%;rf(bT$v-7z9Aj>jr#wb zf`oUtuWz2bGII}|ym2LvtEWC9Q!-aC*KhW;_^ zW)xX&Gu2`c5dYmjio9=ux+rlXxr(2n@S<K6Yq`OL={Ce1TmoO3xhBnl@ zyt70P=rodSq`L1HSRD-I87KMJVbmqaHzbCrjDHej9`Ewgo8ocLj_jvrs^X&)_^B>} z06@WgWV?Dl#W8Y~m3Zjb_!FTn$RFh7V z;Djq8S}E_Z8YAf*4Or%(T^f%J7UIe0>A1`gkP6DNA^oiCU{oUjlp+GXZIfi^+}y?0 zKAD;zi2@Pxg_ubHrI$B$xy2KiI|7=Ml&oLGNmYs`T}&MeM%@m(=;nmERndw$?HpCa zytehs4+TJGc9IJ&{p2|?@2vmq9*y4(-iqr2J4H8P#nb~Le#SMW*0t|w!b@$Il%x}X z8+?9}Pe;}}Ul7B$Ajn|)_M^C5<(Ko{^$dS`EvF4RNpRz!EJMNcY>9RW|H~ujHt6usBLE5r9WrRROXrZ1e`EVtM{$v=8 zjD-j^vP#b|fTqr;6OS|29~Id|>1?iDfc`t{-{0qM1@N(58OUO7gXTqKT)km9HNjQ+ znEQArko26y_4*49qvta_9=I<>o;|m7J`z^uQ=QVwKPC>5&qfBU*R@b&8TYvL8*Zqe z>~gMhFOun9#Xc=S%8e!_f_8TteC%p z8;*L^^4F0g1I6wbvpkTd?k<)8(cE`NMYSzkqo^1GQ4x?Nk^}?=l^hh2B%l2e>b$!!f$5 z?dsckx+*3;Px4SJ*N|ebexyD8e%m;)UOi3$q^N-+7n7&;v?>{5yYdSW2WaT%xY8Cn z%@%AIZzm}ad#sF(j!V$U_8z(k^q^)3vE?8BOaw)$M;|2k-Zmw^BQ~hue7$rZbgv?h z+&J$05enpnSy^>9f{;~P{%jhM40Td%6>^x&b$7?Fv7u!Td#T>2D!|`y zErd~X#GS-F;#{8^NE@@qE;OViTtT#p;{u}_0B@?JvAd6S;hMcGEL~#OT7*tAJDm(3 z>ne(!&AQm6Nh5%It3xc6`7h$#{i0f?RN2^jo8CWPH4C?Rri~@no(#K}DtP9!~8WiLa5__zCp2PjKru|d5E?(S;CVHIR;jz8u`o44I z)UmWZg11nVtBA0$cGb+H#NHIjerc@Fnss4JlazXw40bD5@KkDYGE|B_GBz&J;|p~W@_OTu7FLT$Y6pTBh>RvQw&!W*^l9Q8teSHh}c7Tk%W6#V@9%=y$^Z#2| z?Za$erB!WX6chduE%SG*5jc$xb{X*ZSZAL?`7Y!bZ1J4EY^26-c6e{ccf*&BKs}n} zIFT8?kN=J&HEiZPAu}y+=%~)CU+&O>Kgko0&0a_4VxbT}2c$>7SoE5MRdfHnEZd4l zcc7-X4xXs#7l@2CK}E}f~zwuL~zWo`YC~PMk2$-XGy%Eyc`mz zREHt(m310cztXTP!4BBxenj@UAA>5_R;(0f(-tUol-o_YOr>1H#-f<|lkZE}SilAs zvqrUr5k4o)j5{LWfNUF<$W!U;+KJ+{^swPrN|I~5|a@YQF#y3%!D zNM;FMi1F~_n^bZtP8W(<($m$x*ql;3aHfX)tnNgn#%Z%BDO?Z2M2GHSJI!w#xDohX z?KHxz(BPiglNmOuGdGNmagIsF{O|1}`|5`6F31k`K@WT73EiVm-vD(h-4u)} zIu3F=kOQ)=JyV%%^80&%VKCn#O@kZT1k&Ws%86CZ>weR-ZDXvY4@ZVRLTdK}yp-Id!k-?Ml#qp7Q*Go$x>`@IK{z?&;)@E9B8}jXje+N~ve;{Wb<3*8S+jrxIgvBcpvGkXph1&C8sf!uu;nrP9)9{J=kuaDm+C@LEe}Kdb1Q0B# z2vTeFjTGZ;=36f?1rmr0QBjzj{Jy$ihG7tR$?Nj4t+z!Zn({0eox8M6CoP9pelR7z z4hq^@MVu2$H5JXW`F4<@*rK<}xIrbO8sfCU3D=!}M^E0xD;9=SPnFr18*h87;6s%K z3X-jXLa)NaZ}-Od_$xnJTE*E9mL-eq&e;PH=@lDa{|M4gO)5Y#@z;9?3N(uD>q}>@iQeJ@YISeb1*>_1?-l#0cM*X?;4Rz)e7WcCH z%F6er!L%upzgtSX?A<1!y3yppmH7uf&99ZnZ$5oFNb~mr;|$9H!nVd%#d0f?h((Ed z3|ZchQ|y`IE73r|(4jDO#hqzd?%gy!>#`}?4>bY$TwNES{#bnek68pq{q?7kKGdj2l1HOT?DeNF)D)V?<=q=2%^U{HM6LTj!bqAz7g%g*g5w(#^k-+u7qd4k8mzk$fwYR;%#3Z^wlcp;A*)k-HPgUgOh~@KGKFV0~$MCwdA*tPSBQ_bY1e=Ks{Klxev(y>% zJ{P+-_AB@mHZHmGM4M?h3b-$xV8$XYlhsJJc<3?731JegB|Idw_;1-a;C{A$1BxcEBSLOy)hs*fdTu0OFqr=QLB=qf6%`sa0CZBb2T_ z(={XLhIu2H8SlpIHaUo!7|q3R=!Q&125H{P>HZb^rcrsZ!KX@Wu?cO%kVP+R6`5dj zN`W0sR?M|$CB!&})Q}R>%t%qy>Yb^MEWNwr`a>vn@mZWm@aMF?^!cbu^{N8o^Kay; z%HI3Ku^%hR=8+pWv`80^|p zP|pxMo2zBb6I-#es^Dy=sH6lk3bBjU9l59y%s%1kY-}?6UgLt!l#wR&cEJ+JDRfvG z;4S63>0zb<2Ym;Ba>i@7Up?^CZu-lHmZQeanp@84?m2a7)=A zlKa}%mE~1Oan#2kJk&ieid5nV_+fXPzSkX2K6$b!VAJ2a^qiiAc@w70sr?V1);IKa zK{f;wE%lubZe+Dh`M+DIS{*v9mF#2J5pwV&;4czN4`@$t#QX9W-m*WFAa9}c_Ucsc z^3fT-5;964iI7OG5%0aL4CA|VU1FAq^5)K2JL%Q)@Nst48-0NiW4Wu|coTvSg1dRp z^T3sh+l`Y`0=!V#t&TkWzrL(*PDwHkhv_o-lKcV!lBxGNPapNWnV~3?;5mL#F2Qg7 zm7M3DOzPdIv97nZ>qw2y&dwef7-(;A2jYy=MdI-v?o9(OVRAkiZhGFCC47>_S)`pQ z_WABJo|nYr7Zh~oA(Y9JcP}5t!Q#vto|Z&s3b6xt&6i4XHsfgt%ckdvm*PCFz`(m? z$BL5M@KL?IJL(LYdMeRTQMDievvWI6^RToF&bKprF~q`1_5(E{yd0*smX^88vdnwe zc*nOC$f~TcF{T=|ca37msVaS;dZpILFpRKK2~DHT z(;?vl=*CLi-RXY8N+9S|uT9vSOfZ@aL}~u4-u8k*8sHxPo;aHsp|A}b-s-Hg3^>{2 zQsr%QIkF*&5#izEUuVcDE?yEvgX%9-EcZ>@4uW8p!`vf!J#r@Dr7jpgVfOa3ziEc2 z9kxj+PB8Lcg`n2o0Fk0U7mDo*6tC@m3&K%v%CxElvKr9U7;@b9S&g9zWn~awtVBu!UtEBqMBni zI1+Om?u=w?w%j(;F0<>k4d4e4J{0z`sx3BHkf6Hr(fZlc09bH5MWo2ylSU^D@j2pi zV+>rhry&p$Dh)(d-j#_aO`5bUwgWeJpY*h+pVUiL1dyx&X3`4$2K+O_aFg3E<4B8^ zCN~Jo#3;y5-N=yK=owQ{R#FNQHUQr_`7YO`jiq-=E}8fo)^I z6w>UHon9iw#x}7YSW7hxq7FKGDi7)PxS&aiy6Ix^<+?SEVzZ7%PQjBS(1xpbEZST6`9S;leN29YetyEhzLJ}#{yH;N7DBr!C04k3nF_%)8F1%G~XyS|9fH6Un zf^bO;82_#Z#eoc>28KOe`$*?dG1ER-PcC0SL^Ir@lrz)O369_HqIz9@lleym-=_CM z+^lD!L!a4L-S&&v9Erg)eHH-) z9`rVO9Qc&TF2v*1+vsT!uk zwVBl(Jt>Nsulzu4BvHuP#<})k*5KZagoXQEa8>*g5(X~{J=9U`?v@}SX^Rr)yL4$T z))^&29?x&`*0?B^0;S?V*Dt8Qm7OZ#v;be zMxW4Hj+vQDdlMhuQd(Ntn&`PVUG1yt1;WKHPK79|?^@rorPtqW6FgF(YIT)QB%$WD zVj~ofuc0~j22N*uN-iPnpNsh>GaB?JfIVjN9jUaTn3fDCuqzLN*}N#X`}QjS0b&dd z0^x*Tr$O6nAUPP6&7RfUUKJJ9^_T{~fA6|tCmU?T#27l)z8mgt9tn+iO3YO6YG`O! zT3VW!U2NDj2nzb#OPd#zZ!Gb!D&JbtQyaVb2WY4IhkZYtiHV#Tw=gJpqy#08b$`8I zM*VV#*ujQ^do3PT_n_`^#l7sc$WoQxC&ZpGF#ZC;a*Wx2)kCCVZ?0c z54jpFUwia)u}ze0%s9Ak{oD^Om-3Cw$h#CwPvlFQbm!Mm_X#gf3(4>0;{u4W=@to>$p`VxpRe18_IfURRO7VdF&{QvQh`qf64%YgJ;K zW1o|5<`;1_n5V=GPxQo0Z}^zrVZTpxShvVR*zm{UnY`lrGau+Apa1LaUN;K<^xz-r zWfaf;*ln+(K<;9TbJ<=W{2Z-WwNSaP?ZEl-{&`32pCcUy4GJWY##C(H_ZaFBgDL-d z8Ps)rf=~6}6hp;V-R)JQAdRp_+EW!woBe0gC5AT=Z)fpr_ULL&w{R~RY|kDcJ=FWO z!xA%Zh?podbszL7!1frjR!{i|Rq4H*7)1QudRUF?b8gKD+5Drw5QcHD`B7ex7P3gK zzBcr};M803yWd4CI)<=0H(VN*W@CmLR^5N7Rav+dJGOCDooUPh+A@2{@-=c7BrZco z*jRa@F~}YL(UVrpi2sN>bG)ddrHzdZWSO#8pFe*Ny`@>%*`X;|@uyEe=lM*)vj@Q{ zh|s*UGXPbpVjD`M&j$HOO>O`e3d+im-)Vymo0E%c1e~iDQ3CgBF>RoLmXGQ2;B6@_8A6CDIP-{p$=9?8HwL87Y77m4wF4^H09KR*QBY z$&%B-*H&y_)sfN3b!*q`)q7Usb;BVdo_!)MqSBTyf6T(leN3sWAJ^OJye;&Q(nudU zyY8EpKlLNTP-kK~&22ks;raqCV&ZjUf`N&=inDP_9{+Y?)j&F<>m>J3DsHW+c@2%5 zXyK#B|I8Q{H;bg_Oj$`b@~6QIQD=M7vhIvhq#G2U36*bwjBEHWsI#pC5d|Qf*ILH# z+l<#2pd?&@t*b1)qGn++3vj4{gZxQ$Rum}eSwe$N(EL*YMTPFleQ5%##R?i4(O-CU zi<+ll^N`f;gc>}a6-IHF`twaOd@&m!C04QT--qVQCXOD{H&;bAisJIDZRNUBcOmpv z;YP9OuxSMK`H8wDj^idw=Sp-pED&QWs121rxujLNi5I-sLM^L}ULTqn{s-b6Z!}(Q zy|e1|Y+aJTeHN_#(=$sPkKWHH&HIv^Poma_neh4Vf8b1#L@TYUaq6oYRRJZ1OF5|& zf-a&Ge~Lpy0v4N?X?K<}C|{Vi#+!9gFiG$@o2>#JP4T(NaO|$+|(?}jp!G@7<;9k0>K)zXyVc^FU-K=)UexOGjYIt)e^W0(R z%jXEqsI*oXL>=TrT$Wn|Qw-G9>_Bj!GY>ILcUf528MG0ny&b}0Qt!UwiUJWD;Z3NL zk8ugScp%fh@?#h29n)Dp(>7431y0r>MvWY@H!RPtSpH?$f9QKJ1ld=4CZ8YS#k?_r z?_HgXyQU+2uzpcLwQtVwS#tN6=uv?b5I`sm}W!o*?BY9;A<8}0?6pL@9F ziTe5tr9%B2QJsy=DXq%k_)~pzjUScWqBypvn{1G626}UNn;##IFuJ^Jf3#d(hw&;^ zf{dhC>*Fc8l1@ltl|d;XXhSa0Dr5u{d7^xRgnJpfsj)FTW_&XBN1AEkipk;)pF@R~ zgBu_RCOPt}k>8@{6PS$2iHR0aEW>sv59gZ%Xg25*rd?#<4O@F8!I1#TDv&rkDweH7 zaarcqKR29L<@-n0x+}K(rd*%!=GEgAtuvw$Kf>Y{8NlE<&8BW(5LK&%^dfFGS;1vV zY|jK2<5H@Sw4RHdX%!<`%B~$hw|}2?D{b3Qd8#=ROg*ETWTW<7^zP$gZYr-t!cW|N z^_ies?q4FUhhjAFL!^<`tl~NtU4<_Z3_U8p@Bz;@SK9nlx|zTlW>_-w@bOj8iSZZ8bTl?J-r(2zD8nd~%2|`ZS zK|IfJehIiOIPxwYo|81MT zTPfwVL4(<@z_{uqtd%XZp{b1c&r^0e{Bz;}IN3o2TZEShSIpUA7)u*39UQ_BEnQ!G zx2%pnRO)7Pa)moCHr9E({-o*455DR3LyhD!|JdPQIWfE0PrNPQh?>4aYI#0JnfIfI z3GlX5b#&Gp<5bK){FlR#m*A_CG8y?cn8Ui!%Wu*xWgu7507szs?1 z2ixAbtbD4QxQzS05qd(q&!f8=B1pUaB&j~P@!uZ^yEeqy9J@Zb0vPSZiGRgttx)Cl z&g_LvyNm-^s^MpVUQQ4Z&*Q_sY!k9E6%m)(p5u<_-`d5MHtX0Y=ECE`Z$Uq8$`5zs zFF0sowQ_=tgrp7Vm4dHcNO3A~2S3VgcD7aTx@2pMN>HPdd|^zJGTvT)FuaNNtRio$ zp3s(gCTp=pUt|O*+{VS}>gXu&XKRPKM+`=YN4|^PVm$!>keGRk;5_0RT^QHIuVHCG z7<#MD^vL7Rt45ZX+q|KA>|>Y{8>;Z`5e3emH4q!C*ZcN#uVAluue661C5hJ`AaKP2 z%qF7m0V4kTzYQS$Cs6-?5SRLIF3Uo7ShA(LY;!5W+S(f4x*R`m&6Yxzvsyf4&~j4`_Ox9Dd(8k->4M;z25T^OYLMVXJu%mmg}OD%AW| zLV>)k|G50%FU-*O*K5(Y<10xys+YeV8?ls~K04jcc1d!3y*Ajgox_4VyO% zNpMAN@^>ANescVpqI)vKWM)}G5tX2cop(ZtDDZ=PU{ zq;(uvbj3Ff47^)1T?IHoH$9ZI=joe<5LCA(SOcXSL9|7TnH*(I=X>l3VrjY z2jZy^<%bB4=YNb9Ataq%+FSgW{9a`d*i^-0GRAl_WdMxXovvR`i9`bIfr z67S383e$bkqs;XW1`K@@3SQ&^wNXyx%KQgYRzZ*WZZmZ`ty_4@+BOq)4*wDR+H(KZ zHC*{LC_8bi!75|yZig$9zB&oY3F8xnP}A4{^danK9OQoyHhx{V7nmzcD)=0-_%>6N z(kZdCaEe>dz;cWqt>Crq=|+Ahn=lex&9o9`bVswaQPE87hCLfai`#g!K>s6;)zVIu zrf93_2O8<~J_Laqh`1pRr1E{ubgQH)s!Ex}rnjw5+6?8>R%|4chxWpc0I)FS+c)rv z&itX0IXTKJG}~`9XUr#_9}}_c&3A7I2Sf?tttpEy&RK=~rwzKUHZ1>0mRCi~r-X=| zfJ`8pwcJiT%qV6r9wz6H7!+H|E@+J=&kyhE>9N`_yg>(%%<~jlAYffzuVuLNK|;iE z^+rJ(;YmK#v?)Gf8Bq3ZF4pK&-}8A)x6pE{v(IW)FqH>lt_|LbF}$|T+$ZZrehzyf z-@((R=xBcX=y*BU$U5Hdz>7K2rQZ?)i0MSPG9CRuiR{It-u)rJ-)xo2(1NB}sA-2g zUU7764B<2)W6!Dk%T-rW)>WkNqhp71%kPp7Y{Hc~OuFe=F^(o~PO(pp2x}1V4d5dP zKl5~d7FVX|Fxb}HQ)gHqkfZR+U86fSPtQ;q1bd5~;=jFljxEik|9L~dNQp^x+XF2d zd_{kPi_atqSMWuQ@FODJZ@j5f8=>%(`=U5a^U+TC%Y-}6vRiuUN;*aC&#mkv9!&;1 zNx1iU=@7#xutEu6l;R+d^`*Kw$L(yb%aQ=$N?uoIBRZoa#ZY`v?7zkhQ(G43J#QyM z7)!r680u&;R?uuAP3=P4y?z>FAoDC9RUKrsJKzUe_mYkod6^8GEu2ve5osHujZQDc z_;dok$QPCVeoFwY$@WReKW1ETi`cSSkv2i@>y)9JF=u;|^}y3C$Y}O`h>=*pR0k%a z5sX6yDnUT=Z$l1gcZgKVguf7b()g*C?acJOqOZ6jkKk21a~Vu(;@cMMv?+0;;NkmA zCD5+ksKMLjsEt9F?$v!8Gd}%>cO3oxZRW=ix}c+{u5@rv=VYdhR9uxsoJ1;ND?NnX zsH{=lppgq>Y8LjDPjely4LVjz)%mHPT>H+r`(0_2pz&lE>UuPr#4C?TsQVJMm)5*8 zmudaa$v*=9Gf~26m0OZte~*ev{_Z3ODS-kI?0+QgbM=_kOxR<{Wt!=&4J@lD%gKHE zm?V~_@g%yYQl@ywMHd7gB{%EpkmOxL8-d8Wn6Clo?he>zuvm}$lnn=YJ?$ck(!ma) z_tu^}(a#MRdMr88I?&V_44OO}U-iA|uHk@F4-Cd8R5?yuek%dZq{k*o-M)HxuTCo3 zcUBgYs-ep~%&*tIOU0>?Z4P3PdX8HUgac>==8JXq<8Y4WfNjv@W$m@0AcRQ5BeEt?t(?7JF~pS06%Y1h|ESz^(vMeXz>r zu3l$ER&Q*_zRy#_7>Qkss)B(FytJX`&6lMkn0tVvhKOH|crtIYAUIrOb9dWMoM zdU{~ZmZ>k@4j}}sgfA-F73ON9%fw`h%m-b7PQW0r0Sp5F;|%N}OS@^(Sx|c3!Yk=Q zC)B*5y^LpKEY8B-w0BKE*zF?O#>|8GwzV}Xr!bJ4`w2~@_^R}tOj0^OqrYa3ZNzB^ z7tKiB*T%0->QsL^Jx&+6gMMd2WH1lt>zt^G0p;SL1HxN;Ebac+3?%H^Ns^`tn(D2i zYL7aNjs}QUZne5jzxl_wa;<3nF&{JoN&B!S{n!s!jI6t{J-z3-bSCwQ zEeop$Ajr;oN~Di8`yNBfn!q>P(Y`=;^o{YQL7OJd71^NO2?_~H;y7z+e)RmlUuq6Q zuu6Z6Z#&yXOX4~1#_Jha_m~S3UgZ))_bA9WmgAxzX~CaejaXUKjH%1^_Q_RJPzd)A zIm12l$w0rHw_Msk5t=Y$RY#p}=2;qGr(n_4x3`BK6G={Zq$c`DmX;#y;`l|b(tIr| zTcucjrG&~y5@JoC^^Z~W<_|smL`!ycK18RR+g$uBL2GyBF7^)-?j{@rw!-X7D&oW~ zkZ%H!_4AsILT@F?|MUwEZY(6oB=B`sPYkQ%xQa^2>@c8uAtctSsJ?C)*026t~3LuB?{HdnV_$Ltwv^)PyE}Q=5dHQokeCX<;=9xc70$#Pik@2RXgfqt->}(i9LtgS3XF8WSO{CJy?pH>n>>_M zm!iD6c(GF1F0*SrGfg9h^yxLx%tJ(ueFNJduz?8QTL&Qt^z9TfBk9%x?qRwE`x@;N z_4K=GNbJFMNv0ZUgmf}`TK}YY+L5pJJ5JRxUzLjkx~wbC%V+=8iI8XHn_d!*P4j)r zkj1E8aFQiOCrf<2BfIzhH9&@I{*nV(MZQm`IZtk`9~u_;bT7y@oTcix`#u-Nr^mJf z3Fv7BbNgo`Y1fIL+MIL*B>W#=8*;@YSGjjU&J`PgFwoSPU+h+8dbUgXl6=~6+g*K* z^8Ipd#dF{j)JuCp2e0L&V<~Kcj;2sFe~OBV(dk(#A(EIagxw?Vsu{}#vBb|kj8NYBQPx#b?ufMtqqbHSEe1wS2nye)(Rq`uUW%*W1gli_g^5Y*25ted0~O!4DBFfZGWJ& z(k{DA_ zTp82}uEmS~bPB@W9wYPw6!S)?i>01Avbkj#a_Rv~-Dp<)eFlNAxT-3vje9PNQE9fj z2wY7h@SG#6&%PJ3f}HlHf4WX1`=t=CMDq0o8MAnQN#a#X1qiDheeuh!qMprfL{ns1 zXTUXa-S(-L*Ea}v@U-nMHy=1q_%X2!I$)3c`y3Zq9?=dq(JWOfOsl$FUZ9VzO}8Jb z2@Kk>@9sWMa)X#g`*?{mI+Ag7EW$Hf5?_p|FQDTqc|R6?sXvBCn+uv{9|{s***C!^ ze=NASlYF1Z@Ut zjjI-z_=VRQa|+*Diqi}JE77b`_n8|+CapTlRy3bf-%pB63egwj9ePBsu<8b+qMdYd zUd7VeI#dJQxvYv47H7yp#MXX(UwX!q#&c{zu&~zp;@q+15I%3Br>Du$j{A|&Wc@^# z8iSDi17!@pfOQ|uk!5Syc2DMaer zozE7%HW_?~s+#%VB`2^^G^jqO>?)G-+F=i!I05@||iCA=@neFdk$<2C%Kgl~) zRn;8rWS~IF=|EUlbQZ$ zC)>PFzcXDh*{lvE41OU*hR6wkrEU(cq2D2#RU1l2Q-0 zTIuF{ZOvOZy2SvBaxO{Mo`#XNSz|LCRBLz{hPvTf$Xc>D|GI<(p7tHj(85gWjx=VH z5kEotg?{_7&l~$^sXg&#Pg`T2bjg!9H}TE(EY`$%*cZ6j$`f1hBzi7JRhOc>or zw4v&qUS3*IQQxSsnEr$;vwn!Yy;YV)x?if0n5u-J1E@BaZ>@@EZxEN4@&Kp?bc{`g z7@CMrwa!otG6VOK$NJ9|=Wg)pk;9r+g%m%ZhX`w_?BW=2Yo& zpek8al6FjE?mHvmOG1Q0LA5`jm&C{``E_H2cRq} z*J)9>o$Ik5(ajy~XCGOh^U5U{{xOr|g{l0`w{ zLH-t-ys}kpkA@1&{a5EuU>2yHY2E@*tZogL+T%B@-iM_mfg4zM*bL=kz#cqKD>55z z+h;W#h68&6C>VqT!^D#v6A%K>qKrC|Ds4UUS%Sf9ea)~N=9W7l~k(?xaO&Q!kU)S)xT z6IXegd(sh(c($z=*L}>Fi90oD52u%G;;O5&WSXKu1t_}C?;67WY2l1#yC_|dXY|ah z=ERL#31>h+XnJ$dwUgYcvQmYB20jgucUaxJOZre@jAFIYs?N{fWf+2fjR(-at4N$j zX@&muLFUl8O8fKZi8=*zSziwkq%6481tQ} zZQFbe&=25<^wD1@t%37Q23&6c0S`PwegwGAt3D+jNAtfgU4E;lO^;#8OrvhTeUL^W z=bUm^kJiM~2NAQZu58MmCliMseyfooq>{T`WEdmHP&imZ3Z`!%0}SJvKL2g#hyHcw z)#|XgN~-}ucg{+-wT>%Yq{D|C2A#URLpnLG&8PL9UoJpRG*wruW)GbzoB+dMytwCGhj{KnSJ?xb%((F7lQO-8X;_xk|zF^o~2F!q5}(mK_~a|dfgQ9ul1|U ztM$Nec3qi%7aIC(c#ERXdk?>AOn3OL-pWR%5w1=`0Pe1$qARpjo4Z|}CgBmNLO-T^ zMti*Ff>l_--?ar7J?Wo2IxQ}F}pcM z8-IY!HDsIK{(F#MR5U}rKlDLzSq9~mr8^)mLxo=_);U-lRL~(QYJeML8v$Ymqs2x2@A%}mPSGBr^5{AxXsUm3N_DKYV zq7D@cnt~yBDN;fv|%}5|=NB z;WffUj$_IW9LOrDvcqO~t*tuOa!!mXOJpr2vpnCM0BU46QLnDBL-&|%0)}tLWtp3) zB6O*)2e@G>@KuveA~xgn>g5imgRU4>TH|3tI5Ew+xhC0@=zldho7}J)T!|s4<)?La zHt3wXM5n6JB1;1@>FoQql*NZHTeJCMd>G9{%>Nxw{IQx>??Duf_a%!Gkpj z1II1TZQM2ZK$843R~l@HBu(Jl55S(mMr+lTw4F3b-wAUGxaY{gQq}1(NK;c=(CP$yjffRt`Ngh&ZV2dtnpMSv z5f<^ubbd*^USG8iJ_z0IwoYC! zV?6vpAoYjH-bV|?>=S*~#+YM&pym?`Wfw^?6CCw^mz@OvlKS8CqyL*c)Zb{=*T{Y0 z79{4td3v}@*Zz3oKmJqcp7*n+R?;*6!P6mYQlaC7uyVQTLgKl%?!ixW3GE--zi+5Y zP_mYKj`Ox#LD4!1$;s1d%sf0IC0Xy)JR8ZLv*JPqWHxd@VwHsX`SYW`Y-jw7=efAD zgg#3CAyp3-m7PzdnyUiw0TN2>8wYQG&RYu=>(Hd%yzem9JdO!Fee({B@Kh_18}u+>AdgFa*J@HaOFpvUMo<dSI>gi$c(ev@dEK2qQ7SzyF@ggDG7_)H8go*dtBmPA zrD?2!d5@PVh<)ziomkuM?0@^?s(872hKu)t)Z(|N&NAz+O$tpEuH@TJ*mR=k6$#}H zsutGw@^>OWv4<(4toNy1prmF@5B=l3@bjcQaR5lX>cio;oKGTFXAYe^OmUhi`~$^u zE;I3`TimZKN~>^3e6}=)pP%sUcQ~U?FS0atpO5$>v$_1U{@-}q{&%shoas^}#eW`n zJj{@QUefSepPXC&xdF*-YBlBo?Rz>Z9$JY+VE_`!r>s@-FFPXM@xmGQlit#@!HmMw zJI`@T_>~paDAqXb7#HR5%}F>T-m(6eYPfq=k9pwpc72Ee@o!$-a>PqOHkSB* zX>ae5)m+&7!S^C1QjOR|*=`!WzKp6yiyn}^?KB=Hy8@&-81EClLX?aWqu28D_3m5u zMrj(X6eQ}ucRc*!+RGte*pZN=dw)7~GviL8H3AB3hR)OMR2hKn|8%GZHYbSOTz~wt zP{YW;gILK1YZ#B6imNWar?VHx&^ZL9ZyFwQIyS|a+0LwD<9aftc(W7jd$}&Uk&PL$ zCa(=U;;p>6{P-w!QcO|Y5I-%TgQ_ETkmE23puPl>>V}T3n>>mxyj#os89?nBZ7zCR zY}p^SSVP54$*U9D2Ey=zuB-Es_rM9?t{FYMGDW;3iTY6lb0iPPhr28T(K-D&NHkha zl#`qu+(d~MJ@>uxDU+`3y5tnIj?`20?>M7g`}pVF0KzS_uj1#Y=5w~rsL)Z-`JfER zco+^9Ez%Eayyde?ZPkRJPGIs{_=)TGJIu9r;DPsAi05Esy%Q^<#1&3Dhx|N-RP>_1 z{NPvRDUK=Iok{xq zax4C!DWSp{)fZ$Vr)LuOCmppjFAm>+N%~>(Ww%`Z!1oX_^G>Mpd<&dwF5$T1-8vYE z612n+oMXQbAB2CT+26ExtJ~w<;D_%hD78vNX=RhQ7h7#W%n196_)a7@j;b;rF9i&@ z`7R3h$;3Z-G5d*7GOl(N{S%-0i^;BN?!3ee8w4|ShW-cYBA!6dn?FA?pef|#>ZNbr1$$j^k}-t9m)|}OOha(WD;gNIpc_5?2Ae$ zyW8Im-Ms&)8VDA|OEQaSV@@bM>*$D=>^$sih-kYJ`#|%d_Wh|5o1sfYW9%gt@tA#| zlHprS<+qRTJ?wvKR7z=StmAzTl5siA@`g3oILz*R_*Uh2h9ZU*I&l7L^ z3oXUGa}f~`{viIr{`3y|AerXe*-%K(_ji{|deV+%C%GrP(;=GVeejN=Fo_g{%-#j2 axA#39^+%VO-m)NGNM7ddt=yXrp8r2ANiFRF diff --git a/docs/images/native-launcher/worlds.png b/docs/images/native-launcher/worlds.png index 7c63cb02183123ad4970e927b7558a12df87df99..22a248e51194469fbe5fe93a59b80e5aad84b5d3 100644 GIT binary patch literal 68985 zcmbTdby$>L_b-m9fFhxkG>UXdi8O+UbV`TPokI*YA|;&z(%s!Kq$u6p&CoeW*SUx1 zdCvR1-*e9OyRM&q;oSG$d+oJXeAZ{}J3v8B0_!o!V-yq=EXj}Wl~7O~l%k;A=fXe* zetFdI~5n*ow-LY_~P@zwg)2jaMXt!)pRC4soj>q_F)v;*RF-ju!7>; zpg^jZ;V4UfwqjIdOBg&pOtU=SzKc+aeEm!n{}nf!8XY(ERXBfKV$|TRo~*A_PQl1# zoFOe|l#OtTe@=Ej3|0@D%W0lTiu>?TTosT2_-Fc+r0dgPe-7eO;UeWiLE%!s@cHXE zEPT`#cYlf8_Z7jo`)g3-#sBZuqN%-JbLMOy#;#UJXEUXzP&i<3HXf&Kzi)Ce$BCsx z&i_@@%DQAi zT$DAAu$aKVlP=ZG04A1wX$aHGb~8TzF#VMrSh42&-oCU{Pi4)mdZ|jq;F##d6CGXz z+^{5=%;}sUHoEKf-rZo7w0a|$Nq_0OV%n6*k0>=!F|9*&w4L`8G8~t}j8dyX-2&R4 zcW)X`x?Nhm!A zJo$UD6FcP6iV;^=t_F}DVT>Y^zU^Q9@_d-XTeX+1GDc7NZkm>0_mP@~Y}BQ?9^UbC z3xtl)S4q(I;HOu5n#O~HSw<791!Q+Gf}rtD*KY_gqF9Z3YR*uc(h5E{RrY>th-T4S zzI)*_)zIuN59*6rjK2=^YY!FfH@A0G50Fo7i64mCvQ<6uF`B@4BNtRFeamd7qi*T) zUgZ_x2&OENEQu_+Y^p%PSXT}HD;k=%_Vy3r-~r2#vcacAc0)s5{!f5O7T0hwem2%J z;}XW`Vq!_pl2Kfb6|PF4X~a9RS&V+V7i9`F9X8!EMKvQabH@%g6+WhRVsw zRjV@_85srEFoT#u??Kui5GWXwiCDT1Ok2x>l&$!Y&qJDt80!#BZE!glXSGE$?NO## zW>+QybUiL37@vs98L=v9)9r;2m5}K8C=n=wG*pTQUbwSCD_#fsP8xOkN*gEd1KC47 zDi6`fL`FVFNh&iAaK`@l@ljGTA*BJ7MxC_+r9&D)i{Ow>rMm@-7}WzJyLVIquGOC% zT)2|4#$UwC#4E+CgR75@Fw-+K8ZW0(U6I4GGGcO&Uekj00#GV2M4K#T^owzMqIv2Y zQz`QKl$4y@csp&0?uN@|E<6u-8^u-(!)H-f8y923uT6-f^Q8nyF4kZ38yFa{ z5C*;B1RslbNK3HDKLptsQ*&@A^>cEYujMpQ6#miZxXCJ?y=SWLXre{>gG{Hprzebz zSM=7Lbk=4l=|5xJuNR_6Ra+jWiqQXCzd~LIT_`6{!j%?S=BAq0IVagldCIS` z`Jv*1$6%%Xxgm6a`fdH_9aOk|^{_)o^_bORn@kp!m(mhFp{^7_lS>go$| zXGY`!&f)@|N_6_jXMw_a-&cq$`k^o*^F>*C0P-Y8r5t`4Vrz(%7p;hdK zGI{cO7v}U3X!KT|j7Kirv090c8{77v71T++<3POF8EwvLQ?(nU9Ns1JoQOyw&0=db zFaF|}Kh9AOL_f_icQYdwb*3|dI)TTg*s7^%GGY6-{(c}#8R>hAes@tslFHp$puQ*t zCJpv@+~ZgoJk{Mz1|`s%&)_&t^Svlg6HfWbNcmhPE0RrXMg41Lm@JHGrG|;9BD&$F z(S#(t>?y&VTvj<-QC)b}m4h){)16&CNV+y%yUV~gOjP}rl}Y{lb7Z6olwfZoi&>zB z&rm(u$UmCU19T!~xsiM$HTftj^*yhBTKVt~>&G0#7^i!4(rFgE(^c`Vhd$vk-@ku1 z>WK+pBmcxEPzqmL6S}=RqI5sFS0W=Xe>>59<2Ykg(|CO{LrhG(rP8IgIa#(c=e)pj zni;QAVO(W8wEPpD5`P7ULZH@hd%Q26+YN9cX(=fe567TA6{H2!zW7`1^(Eu;%cN|h zdX2EL6J;>|{3z7@P%EQyt3ya`x=YCOwFKDc8Pk<}arrv+FO9yRP(p4m7jTFHY#69}Z=|zN?)bJCshgyzOv{XzpLJdiE9W zIKl>_ro9Y%SF}I{A@1J$IV^iptv~nj;FJ^H%24?QUxC`Fj&yBSy*`5~;rsH`$@Y`+ zjZLns%3wHO8LN?Sw@+o}nmM`}q?gV3VPGiFIU_tji9HqRuA-WI&9^rllo0LH5Cu(r z1B0qh`Qon{)pWtY4pHGvpv$4iN zX1s(4tskl`V}^*nO)6JmYIGm1O!0*F&vh`Kzr0{BeV7%%ADvKNhVFg8$q35pTZo_> z$pkzN=mL+QawFAM-9UtiGQ2{GDHZ^yvx;@9V4)_OB{g% z5qI~7Sy|;6x8X=2^LmJis+Sg9w`~#rmzL=OEjwc@#OGgun=zt=FHmTKO^#NIJ5O2PwzGlf#5> z&WdX0FUGZOjEs#*3jcj5g8?LYgmna`#_eIPcE`NjrDeJlXY>s|Psew~kwtTYNoYUaZcTKC1yJC)g%sTlWZ{d25dv zdBjNpLs=D}`t$9d92ZXduyuFl*XW}_whEJh2sge|AU5jD)Qt&@6>lWe`km=`ak3VN9L9dYb_J<7$$HpR)Wsoftm{C+zM8y7fIsG?Wvd<7X zn=(l`-1*ZXe4}{9JQ>8+M1KkrG2$rDc{37hP=>!Vg?D)H3nxg5FK~;`o0t{D$D*d= z|3G5rVa+^=zM-+9n#q45q*Ye0*K~9>W+T}G{2u4hDUA9tGG#+yaJ3##j?J zLo+<9&s*-}Ja*xD@krl+Y^Ci?wuV?tD3y~`*-H*s-cxJV(Wj*ZTl1T z1kcc2quyx_FtN4{#SB!gByr`8{CCndx;l9p?^7ZphX)7SinMB)0GqUKI$w)n(Q3Lv z^!)s(%o2mjnb6lSgbJ)GSRgk?DJv^@=CkiVe8|piSPA8S z!q>yyek>72Q4c_pv7*YWZM|D1h|1|HDj-YN&WkVli``LI&JWXKOo1Z7ObQNOd-m*^ ze6m2Eteh@vFk<+yI|>=*7L#XR;?mM25ghJE$qOw(*_yA)I|cl)#S1QjE^PA)#$aj2Q^+28tb0EzL{oW1Ty&_ z1BX>W>d!HgEcg^h@K1Pd;_DZ=uznaf+VP7QNAHaQr&cS{OiD_^BXCrRdN#J=a&O{+ zs6GRX5GH8n;POYUB9fBW&}^E#YY>}Dhs%u1k;{uKgewm5q(Je5)W?tiyRe#%ezK{) z@qMFqV`Jla1R4OcS}JPAsqhzurwTPV58ujNk8c3jL`Tz{;F{@Ic!0Xm?4Pv+o4||n zBcksYRTdKg7qNPt8qQ?kwEJB>JrldyIw9{ow#SRa;b(_<@2{IYE7&FU50P zj7_z>Xf(Jy(vwb#_PjoRRT2zD#I1r5$*t_fL~TVj&%JLk01OSf0PsP;#p%48yfaxJ zt)ab1{mIo~2PF}-QaIi7c#AuKk9*(G#O^I_a$};h%D4R^qz|FI4%$oEWYuh{is5C# z1zhzO|EKZRsF}TgYHC3GFF+ezOerqQj}*_B{3)}ubOOTU2d`pMjT2{VnsvBBp0kTK zc<~yv%P0bX@K#8`T}@Z_=H@!$bOF+wtJmc2`&>fhP2`&wQT#Ji>rG8f>4;>vy+@cc z5eW%39&XQ}pXMy)u?CiHsTy3yA}z|g)p+lO+DN}Nfd$3b6dB1q@&R-Mpa*JsZXg+` zLUMw_qd}^#Qb+;Rv)m@FGF4-vr^rBf{Hx}Jl8oz02+wFyy8OF$X&3Jj8-Vk}RJDkE zE;09NzsPTPs#s9i^UCK!o~-R9Z3r8}NihDG*K6vUw={Dv_2734r~XG9G`Mof0^*q@ z$MXE90!O`^=`+6rqKc$En8FY!8uP`<#o9J22Ee6gNWnV&5%H0$P_j z9XKEMsAA1|(As0el7+$5GrqqkaS>U6!AR@MiOSgLu zMDI51>@A`$+#W)D3#>QiFd)b?2O43inY9O;x9NCX3pkdn9FxwZ#`}LWY4re$M)VJp z#sg3~FaKsv_t3m>wE+t1ZjW;S-xl;wtA%; z|G9`G0S2c-Agf-Vyj)+_z5m)cJYk)Lmj?IdOX+ZKLHU(Jo5XF%jzNJZ0VNJyMHmkD zP_fb13%sM_MZZXMatw$6Vo~kEcz0UB!kr@>A?KK*8=2#ngFIPUDx z*0J89_NrziZ)YX_e&MWVnG?(Xv4_oDTR*YJIB<2`Ed=32!^iuf|Iet@o#^o~RIAqwb`G)-nE zD;la6+!94mr4)%znI}>Zyij~)_kFlLto&7e`OQR6w;Lyv&?7oqFgoXh#VPviJ1f*B zumI^@Zh!5+m$-SO(Udn1j~4m3w>glm=^oFqsHOV$NAB!mh5&KPvpFk4=mM6Z$J$QO zM-Zx!XcOPp-`> z-@h=xvE)9ZHu2rstWK(h@Z_+6emd!%^P(*kXc2K|O{R-7^Pc=nxIjfy;S9t_Yk{L9l|R@L z*KqBmO7-eCxo>$YsgbFf|4+nH;hL}mlaP|2QESJCQfG-2j9f&%iKEx+l8@)E43~jJ z!dRb9lJW{6)&iuNV0m~^-VUk6Sp7Zg)>Q%qhn>F#>;wc%cwu4~9J2TikjS0(-CdH0yWzz2U3bWwjX zbQ(%CM*#~oGX4+1rVc$$EUwt|p3TY?wKUk`z3hI}Z$J|y4X%jx2`#?ATJHW(PT$o;njmBSoXxd-|%h{d`Q zXR6!XGg;)bw`3T0=XKr<`c~-&`k+!>;rp--q$$k*UcGBMd+;*#_dW3lYVb3g8QSC!&+9^_-on0F?KJ_Ec((77#?=ZyvRCgXeJPK^tG2U)^Ioi4S-9=fm_*r=h!409h z7$gexmreq@W^9m=I!Z0`No)##INrmF-Y}Y|&a-Zkh)*s{1vFAULfwMbP#VQTgkd1! z!)vYWDZA-pmG8~z4Z>P=MRab9gia0Rn=82RljLp#YG`9l!5_LXY&Gl6wAuBN!t*$f zh6O#dY45h2ocqw*N3ThugaSQc;!?aOa!QAsQuK|c1sR)he|K*sjS3Fm_8Or(n(TL9 zWP(o0>L@J;R)RjU8keJze>XlLF-he^umkz`D-S#PGDHM}RUZ);y@YT;w@+OB)*4Of zq0y31U7!8|&ohQn=?(c8Uv%^eshcNOQnlqTHD{t8r?43M+89hV3zQyagClmTWEdL^ z-4>Motb6kH2nlf%+FyC(OkpP8(+Y0Cx-o@ga2#>kstLc*w5MfC8Tbq*%n$Ck{9aD) zUiO`U*6-8iYeT%t31=hdAsFvrL*1o%+A(N%QOzRWYpe7BY8st(qLa2i1UJohG9FkP zP;xK%M?Ohw#S$uv?8vFu?1pN?X%`p;#hE%TmAyVRB^GIS>l;ZWZ{5(bGI{fqp@01o z@gXCA(N=Y@IV0OoEK~ZFR<_ESp)U01YLg5?u41`OG4rcN<0%1U0cljt*6=l2|CaIR zMyqYgexrfC>0To^OLeT`Emt&@VXi17Z#JF2f!~|p+b<@xrDKEYa>zORHQ`nOhT$Wv^HZ|m!uwJeJFADVQtMoDx$SM_%a1$RQpho zk+F*qCR)|P_st+uf76tO?&hpAN|#l!ADm{_pZN*9xW2}z@BgJqsqV^v^fyZOll#Yt zUpHZ*Gnr|m{!bJhr#~OJj;Nkz1(k;Op**aU@GB#yIBcx$GLq^4y7zx`J3O%Xw8GL4 zw~LAr;ktnokHbf|_Hy@6&_uVcCfK`6s?h^N(|$#VHCmgre!7`K$&8I!!pzpeZ(H-2XO zuPJ~@QBd4~borlk?;zP^&%eVv4)U!Q-T#Wl$e&P7IR3q>yBuB``=7uXtjb)UefQ#5 z@V^HC4UYf4?BB3>$LK!-107oA(7X9^&|4earQJpKWn?T>RDjO)fcD1h5OLR z$ORWrVE<#EXyQ-`ey6M7C7oXLKK-;w%6t{rhN8%9;x#DymaL3Scc?`K0+I5*zBr9d zcxz%gnn}+8%k6aYXd@$RT>TMJE&)I(Ndy=Jzv&e0fdu4okFNsc36HYw1)`D|6$lSo zg4tiKFvN9=KBwMnP6`-;vJRwx-Dr^?u{OLQdXfROMuH>_zUGq~!8Bwd7TKUB3+2Kt zQ71hvSCn%efkBaD`V9~#GYnp@gs$p)a*W$OS+r%mNGwA&X|ii3(@F$ufLpH#o>>8p7{Ds)xW zK~WEn(b{V`>gQQ-mF9wLJZ^swdfjt-!$!_fC3JJP;*EyW-`l@bq+h>9KB%g*z~n7S zjgBMUd^Rjy836F(wr$;?;vIW-1YQCgG&MyYFb!_|@88D8@Gb__2DBtSz8*v#&u8E$ zX>@y8nbgeLdWIJ}qZCM?UhmD7Y66X{I|aaP2RilO^QrY@rc|ap?XIpq$l8>NIAznU z`%$0U>0ZuwD0%ZZSC>Jga?XlP{q7q@@GmSLQ@-am;?(?fVTj~xPMhw|Ue7Hy$Pm{M z0yx<0Y@JX0Kh*OJMvI7|PPV&7u7VuS>;e8Fu>8IR(w>3R>kg#@bU}<`8@{kKW0?jIO$GxkE^IQAE z-)mTPsuN!>7tgt!b*SmNg=i+cvFaA45VqquZ_NVu+pRqre{8+OFqPEaH})!Dv%L>h zxzMoxtQSRVt}M%C>PYTSlnC2wjTP|NxL)o$_tWXgNH!u4J5mnfi*-Cer+ulBBT1Df zyZi_7PPO+z6k0kZtiBCjCguM?6o0y4)&@q}eB?jDdw53bgkVuwl z=q+B#TN)Qeco~tNYk;%GcwwBec;KfHOPu;v=UqZ3p+AFS>E5ns^tsj^h`b!*-bC>) z^3EoJr3l>|{)u~VVah=N4ChgwrMP#Fs;0g^wnaRJ%i_KH_xGR^zv*5b#=Gq|#!eiB zg~&V*^_Hv$+E3uVE@hJq1MB20paZ`3bcgTGF1`W~wr*Acx7!Y5RiixUJDL5+1=hkF zfI@^y<^RE_gj~)n3^(J~ob{y7_VFxe*NKk#YW{NCu^dYG%}qm`l#(O*XF(&fR|a1c zAC)`}BLpN817&~K(208cfboDN{+{kH;WzmVxFquNli_b)4rz?M(;b}wE=YVu1ImF! zOs_$_EU8CG^~Kv*esob@jC*tg zP;k6R`Z&NA&x6hm*tW-Q1_8ZD7r`NJYs8ESXH!*fI5yY&kQv1Ic+mn-Z^!B#91WCF zdY)0vUkpH+hzJ}zl@#7X8-S+x9PNHD|9<5fCEz+yanO+>EoWKul_Jwhi&L8YtL}ml zrS%>Lv$^`yMcJmNIhT>keTeO$l9bdI0g2DV6S9qg%Sy|s$O)g_Nrv`lrVu(=GR1-9 zMh=b&w?79XpwjK{fZ?Uy18&N!i&FhjK!D<2p$51v$>Jxz@1wjqK$k7Jpw8mIq2KXB zr&xsGx?IS#+ISw34oNVNSw%ydgU&kZcjxiawuU!C`S);*=6|{{kw}^h9Mx#Slk?2f zC_Vlt%Hpxe17!0QFSubqg0f1H=aZV5fSKFNlRy&9QT_q`Nyqnq41*|Ob*kRZ^7n0t zuf1Kn3%s{q;JVU-VKT$CI5VvYa#yZfZLzxM)0GVH^k4pvp-OY1K${2GI~4<9Ss?S2 zH1C0c9yM^Gq_0S`%60F2olgGInyjAt&>qk{XaM3O!1A592C?(B0SGDAc9BPW3?WpZy8XjPJAW z_854)g6B$b7_*Fh`%kJmlU`7`+mi2EwP!B0(a8?04N z%VUpncmBGvBXJPR-rw)O*PvJzC)!?~$0atvQ$wO?Wv!d9Pnw$#T7%;%q@;RQt%3Pa zU;-St-LkZ9)%!wM1$)%}dNBKQsqtuDrd5LN$5tLc1NRY_QcVkXU%QtsJ!3Apa4~!+ zq>|Z@Ll1y-~?KOs6DL(xSU4cG7$z;M6Ub@KPUL^je^iSJ<0{)(hm z>B#~I$!ohCrhUiRT1U2BmJ-Rv_&JAzSC0ed(1PWq2N)`i>Yn0>-W*2Q@Gqpzq024K zT|7w`PP@cdx!J-Jw7~S?Js1D8-?Q&1Bai~rAvA&=kUzn0kpuJsJ-8hyf6Jwd64fgrHWOB@nz<)i z3?0CGUwBysgR+j~fXC?w#mIUILnRGUw`Uyh!|mpUYtikK z%{VYVv);wJ+Jb*sBlkwhd^lhH#UIkkp2PRD14}DwH#r^)L3zZ|6V@I#yKM3_x<9IH z=OE38IoU=QHG-#MPSHAfS6vhLO<1)hd?)7jx$MR{*qgfMY|;M@HT#5TJRkR1bO}^n zXVnF-2|fi^qg!Lo+@5sI*|W5%m<{UfPHmS2XKVMRk2g1u zBqMTQ>splO2UHULlE>R`_5=CBG4`J|UFBx_z5PNGj@ltGh4XVrCBN&-0GP*^!7K8i zv`M}5Eu_+Fxo~3`*1DczjQ-bgLd57Zb^Efh3wZWiu7C9_i{)Q^O6#;Y+!<}VmXOQ% z&23`W#^XzJI#DDu(7isRq&ECkpxMZcy^1gpr-?k(xRgbD*<5Z@K4DDr|U4$Z)Gq@*sC@{fHS zk6AJnrT&LOVOqs00D%hAY*6;UJVKr7L74ZymICOxe&4(QJE$j=TwjJH7Ux}^_&2J^ z-ztG^7Za)NOn^us)jKpYcjeu5K+eizr^ac|V>L68C!abCqPkF@xVOT8O6vTIwW+-y zO%^HD-lM;ufcmVs(aKY!**94u94BnhybpV8u83gX;BN~#N&aL)s>J6&n5sXayj@@w zbD;vg33T}RqCiTzCr`j-C$aBKL_Bt*-@|=jm*^8^UFV~d&fdbSPB95L>?Cai6K`7N zN~gf(P(Xb8pkOsL8x`H;T&`nf634N3z`a6`+?)oOMJMOl>&G8|wfhHS#Iu=Wzo*<5 zHg7i(`lXGB(U$R1R%4G=&0f51yjsUUe#deU30Uvi7InB7zLjJ~7p(BEuYscznf1fH zgc$o9Sq(zs=k8B0WACmmcGoLHG=s*W=paULJK2YOX4j`~?&xSqat$pOXkkee{2U() zIUT>8U+mtCBJ$YdWHwzxL`HJt_jZ>BC&A7z7nXqEjo0xNWWRhd+sJ20x(wZ2Lq->VY4>T;^vQ1S2^pJOrXZ5s_M7%AgZL*bRdwXQQJ9Q%{8{ z(hy<7lsVmIN8_dRKeRqRvOV{Eo&QMZT5RHGC8|FsTC*fT_AD&Uih=$qsUS3526~Bo zlTM+hJf2Eh7l|Jm6NVAr%+E0{W3qC0jLym_Uax6s-*7U?%ROD>{<}iBw~y&V$I4J5 zYn)arZe!F*3)ki=uoUzj18HUL_9_ZiHE||E^Ms4Ux0SF$#4@_Blinq>`yW1uNzfZD zzU;(|EtX4YHiow+rRyp$$_lVrPgjR^lV71uYeNcotS_GBry16Q=HB$ts=C*E$I7?U zq08ya=AAwVyUS{b@pLM#Wxj`5UORCnSy&_L9okf{t9%0~xi_&r)ev;NU2 zxS;uf+>?e{O^1zW6n-N3!E8B2J41J9LfG_Av^ayAM*FXBkoW8<<0L9#V`ae0c(g?|0T~Vck&%-(Xf^n|FcCE> z34V99JZdRk;fVqAZ#|dQc%{D*rE*HIs|jtkH_+nx?I@F6(w}0hc*^7|3DYDBZjd%8 z&ggyc$X#De`ow6)MH2Oa5C!?RNY`iJS;)0|1M=98eR<1t{?l=0!wkxnilt2XcgJN4hOK7|k4 z#|Zy`EHc(6K>lNJKtM=fVBqiNILst|K5r1kre$}|dxmlEtvrs;(P>5E$rP%U;OT+FNzga@#(P`x7G1}y zoHM7Pe4D3_;C~}LWGAOB(sJ4W&=V6s8|r z1yz5XfofSu{<9LYlOw=~+dtXYN}Bd9n&TlYpS=lykO} z{{(HtLi|AQM6qe`#fWA+TUc6znLAR%W@Qovj|?-GE+9i351@?K@sTyOrx~-|I05L! z{yNWRHEl&~+KGI+Y+^&apcbn8GR=M3j3a4E2R3qa(6?o-bZw3p8RPaTeqbl~eQs^$qIM*;-=m{=s#3ZF;P}4! z-+e$)=M{b%dX-Jh+JE79J2jYUJ{byjCeflWhq`@G}$ zh8IUG&w*=cJIlhZ2k?My7QyJzoxrfCIng}d zm~Prjj40v1cy~SxPvlHqKYR_iP&yEDN&Im>QU_7eWwH!AnQbFrRWE>W7wjFwdQ|XZ zUxRuj&6rue=Azz~7gsK+1~!u#@X~9C*Y+&R22D?@D_o+K#5%onl99sUJS@&*`42Cn zLUkHd=8Q>utE2FZyEcVHU+-JABsfXE`x3u<*R++rhgGLnxN*~IX`UMAQK295B)Qf~ z4_{D!TMLTs+%UM7=sW8*`C(0!`7JBer(5e+#%K``fG8d#uR8mqiQee12fdrVm^|7k z>c1ua^mMgTwyFD;wCmX%QBd?d(y6FMUbli&lKdRiEiu8oX7$*+v+Ywgt;cQ%HkSb+ zWfz0#!6ff4EF`t%wb@Bv`Z7m;n%g#zS+NPJoz{I%M!~fY1b(2VAQV%4{+-uVvvJda zE-JfE56@#YlMI9Z_)%i>75`xbTBh9zC7%@hTkA03GN3*FYVU>IQo*4ya-vw;X~a@n=w{xWWEOT(YQB2g>fy`lU)+)i->uqB6-FZI+0?={yr z3zPjR#3sF^&Ko*&M1oWE(jL6^_^GM;=Et4cOhB4DOg<0h{l;wYE2f#YvJ*6YjGwcq z7Z?<)%sI9K=+=ea`H_#r00A?$v?dWDDTNnh_UWi^KY7wSzA(@mxUyxWKU!;T5Ob+x zbkl`6(7AJT`SK01_XM8yVkaQwJ9sQjXfz6l9Y9+y+#k+2-Bj#%^3K}+2jD??rz0de z&m!~87JlmG%J3XUCk3meNd}Z=+yTf+!q>*OPS)={-#wZGI6qwJ zqLHMUz!T--oHKT;_(K)3h93hb1W%v7MH_}=MVfdBw9zz-#lBKGGR}MtOxdA4x&l^nTyr|Gc1FxIg zQ`U{VdD-6*HmLzFkJhIxM>+6HXJ-=lN=s-?gnrNo_@7c3Q1>sU0k<9hFW<;T?Fav) z9<0mY{J0+RSFZrESsVfAxya5E?Za(q5m7an0eQQ1K_PEc{*Lgkt*&A3ohhp89$_WH zs=(w*!XoKoL@Ak7EZ?9|r!01qN$(f?$LY*OZyoJ&<_+GD0P$1kKHcvmKCL;%2K%vW zTSoQA(lgqSFYvKtFR( zq8M=r_`1OHMO05)2CN4Ty3Cl0~a-}_T`{^C`|zZI#L3f z0EqY&X(3(H{;*hJssY_T^)&UaVZ)rHcb-XlG$_&ud3F%wJAEqrZ~@8Utzw+w0xmFPru+3Pm3oPSD)VzF1bv+2=G~a zkEgK;=GQp))M z?#y?K&WQoy%l(Dw?bNqdaMD&&@j%}OZvn+S9a&GEXIu>6W3ByORR683Sen9T!<{81 zb-d+T_qj@^>?(Cs3{Z|sx+}I%+LwT6vfc(E^kmhCeh{(c zjJ);f;1oSCwYWW0VQU9s-+;}=>YqaQ>0chg1y>X&Z#o#{Oz|9Nx z#WyvRag5UW-%+o^kh;$ufD{tH<+*D7SNac#Z@6!+)`focPeqc_rNnN@dC}qyZz^;s zg5{os$_ZxIex~nLrX3yac{u&RNRw|L;3)F_fl}q*Jy5BHB{NNuQG}Ry&j@kZf)cTBRzwt`;d*&(x$#J`)7%Hp0cjR7o#7Pi z))Y_=C6j__DBn>;J&@7O^nAz;mm2?`dY*FrBqOo?)`^{gw`!tv@kDU4Cu>V2_i|L4 z2RAaKnHHN&FlzZ8R=wr*iT=z&zJ?VWtI}2K&qt8tJU4B8>$WShGlqV1H*MnQWYg6> zgIx})2tDr6T|6!aUYY{Ckr;*c`uI2rt)+#8mp_Ol$O>mQipwzJPJ!S`*MToT`A=^Q z8$HYEqXRum4eDR59x2T+EMEJ{d7v`%28G4*Dux-@GA}o1Sv@*ZLA{(&acqRORBa2{ zPo9PA$-T<&0F3BB0Z6)It8ApEB%_Rbi{`*tc9E^XDZY60p0u3;Xzq>vk zE@A>c4_zKc6xCy6WBhn=`=L&aVV^HI`+L6MIDGcr3YCfQf4wE2xPJLfMj#ESF~5Rm>R-E^Ny1523X;Xbe_mies^g+dlte zn&4oQj?1=}CtJq*RXbhtAx+(v713B_1Z)mXZ>A!M_|JQCD_Pk_Ou1-7WL8F0bN#A2 z*LZd7^#Lr7hLmR>9pH}&mL7;A48PiI$!A@fJ1xqGA#bYxY{(RQU~0o`45MO12lcqydV2qO<<7DGzqNP$5eA0Qd(p|-~?DIHH0Ap zO_uE^a4yG7OrJy`P|!27S}Yih?z9mIkIJpF+!lN5eO-&4!g_+8=PfB^qcoHSYI9d6g5e3s>oLr)>s=?UQtfaHlU z*ICU7w=iFAVLY)vc@+-i@-$@`I#_AvUW!s74La?C)Q7!nt4qG)N6`tu?h}7k-2Vc6 z5qSJL3;5I+`C*X4K8XsIOpl`HNGy5P-ab}x?eF*|^~@rk_63YAM>y@xrB9`}+b!$R z6M%=}bQrn-YWJWpkV#3u|JoRss+Wy^Q`r2&>CY(ru%xa&HmSGH;Hit0cq7Ag3$;MxqN&!aQH$MuN$IPtOpUHu7Gy!|CA!Ae zfoFPfI1=0K@wUD{35+fCx#Y{wOKgfPg1fq(?r>D(?ETmB!|zI#pMHxP<)^vUagJu7 z5nyz^)%xfLiK$L@bIG+&X|5iAewME+0W)(7mnNkIiBL@1R$=UT` zb#rsueS8cNN@@;O^ST%wMEw%8+hefNLUfy3M5hx|kv&KEPjw!dVCrtZtoLT+3BYG&*H&H? zB;Q-ue=A~iQKOt9LV*I5RU^eS-`U*#k=$MGkH&XWJU{V=0Z4r@Yob2b3%{yTvXf>Z zT79~+3?yl*8mlnBUlg+AP{tZRX3Zi)3%r0n7CV>r!Pl zNJy)sKdTKPm}dP9rR@EJRH$b7qdAHDPmpY$^D%HwI*%;8>6~*JKOyQL!b9(>)klOH zsO<^n)FhDs1v{Z)b%y*yJh1OdjvD)^l6Fxq~)&(w?2)v!N5!6zGQO> zPH%mwg|fKOBz*GxQu?D;b<;_`&N6iv%~g^3@!NQB?vjw`>?dm>k8cc&wH{05l982n zn|xN#bnOSQPnp!l7A5S2G6f_gF3^`y_F1Rq9Ug1!Jm^}}84`H*a*O_-JHOoq;omneA&elBSk7#y?wW+J5_uOq@lX02QDqhyb{ zgJ9ie|JRMYneN->`_f++pf!FHn@&+C0r7sJ3H-KydcUzS^P=VX5ONOPtS;?4Y=SpjUI4X@CMwGaP zY1Eoy&OHv2(z{I^QYJi{0i9=S7e`|vFv_=*Thy(>T1`vrkAk?4Vf8~z9rS&TO%0C6 zf#7rTzY+PNx%G8Uug;i3=c_|{GiO6)$Lt}lmFHyfV+R|n1XydbbLRjS7Z@d&Y?XKP zm*;NK0?J57%!ShmV=^#7924D_p3wWi;q`TP*Nk)BhZX$?+fQMu?$J_maEBzpCQUx$ zE)4YWcuAy^AT$r>IP+#}O!)B^@*DOLC~yri=NtRF z#(5i+>g}fc?iy&*Sa?oqk;Ibf)zL}Cx=YPzA>!1BVQS|VYPyv}#^XK{rI|O7;-`9! zrby!dA%oq_5DbOU45(ZAFwcxu_b42ms;O!n`~Zr4TkVED**a|oWE`|-pz+>YM1R;X z1oR8?)(qVdkySg^y3WXmI9zpm78EmFL=IU%MeQQO#g-*~-yF3$aY&FN7?6$hq$ zVjh1x=|85Hxan!TvW-{D(?$$Uq%?EDeztCyKcJZq|MfW6j$sxr##qQ>XK9q9T20TC znie;(v@xQ-1F&CkSOnnnSe103ixknQ0gsz202Jp|TPxPs9byllkFuxeR7omgVz}vs zgdxf~0+pXQg==|TX;r7xdZ*XAW{HXS8*R4}KpOQpYEJoU*RlD{=Jl>0Z(otS-K@&o zHvUO8aWET6vuvg#7H`}=|+)Im(Y`Q}vk_gJ$(Y z+)=6u9bTGyGXzrNP1S-Dkm1SpWBBVmLd{rs?X!@TVNS6-F0E$2$2*?XwPm{*DpV{^ z5!*}4o^;lgi(bjFHUu>R9^d!8?)Pdbai^B< zUm5ib7DKvDd`fDD_TJ)C0h}}1(E;6uD4{8mi8;))ba=XOjXN{MWw8wz-y8CIsi|_0 z32|lifp`b!&dNlX>p_*(L2(gZTvk$7-q&*!Oz-f-=2Tb)ne0nD z!DFpMdQ4g@ECW(rM$j^^;+V= z{$h)KHedNzJxriUP^*LP4fc*D@S7vIJ_K$#X~}U+a(1a}Eb%)`C>8}*!EU<@k;KF} z9VrTXDR-9AmQp;_@fV`WTBaFtQt^aaM(s$kYK>=htw3lySA)izm2(g&$=ML#lW#OX zvBv-n7=%v|ZLfP)pofHLWJgQ9Bc$osO+bBB3@s0fUZ&y1)za{GQpan#RNtJvDYffR zl+q?WBlPv;9{T5I;1%fijpJ)g4N2_sJmm?GKo9N^*Gvr1AX@%4XsdDAW-9ts*VVJtCT{*2nzXgt z(#zZ|^;6tHpKiSi{F@j{%VzqQ*SrUhHt_yguwT9NL%do>UA1=>oq^6!5W5_Bm<;-c z1+*2gGM|RK!vLc4cOgIQ-WAP&t#)|~Kh_dDAQ}iTn|f8g z{|K5eT;3u`mITaLudkwunj10L4^W}C;=t0Ugb#MHCJ?-{kWA*6HE3}a+e3iiG4Q?`z4SG`RO#!Ww z|MiMPek^|3`AEHt_qkIR@{%}&jk)6vZ_%tze7I3g7=Z)(tNexAKy|*)z3vppyy|fa z9%-G;)5R^B%*f9|EjK#ck+f6w+~MW3@4*V_$oCMJ$vpTuK_4j9>5P)XoL2_23-3FE z1WpJz^j2(V6Cw-cjZj)|JwrvSY5gh@z3rB97RZWQvO8{WpTCW* z3JQZwWg&8Ups?P-dm-Yi4Dw!em~r1ghX4W4K%oBGV0sap4LrcjokXMiJx`a|vL^!T z`j%=7PXj?yVv#Ksr4z6%2~$;xPC-&G4lhzVil%Q(?!?YW49?e67@W@6**gh)t4um0%8Jj^XdI|m!!odAP*8e7>l88YUV(r6xQ+Ld z(75rbvRTOK{-|)X8bfoMsKwD+ zVHTAg-qRpgciGy?4NRqKjVIX}%&*jc%B4DzL`LaGo6}lNIhcqJM<_OWM4>2H3s*R} z&}U##)$Ie96sgFDUVogHywDvPS%Gefn1G&cdE}1E(_AL?G0T2Y9*sF)G0%gZH%+U^ z57jjtR%wr?st}!E^DNh$?=P+!Qv8$a!#OBSnqJF&e>2jWoLwDDo!ra+`EnXgL064uWpkD+@R6F#n+by^D^*N&k~7X(kkd^%9Q2Dq#4 zMuAdYV%ZIKWPMLUzOfQ5>uiwXD(v4-b-J~jT;qf|C*KT#2vgqw@bNw>e>5TlY1X%U zd&FGZRL4c$Y5PLk3dCMdE8E#Oa6Dii#pN{Yxf!~g#}!Te?GA&C{H#tviH=LFKe8>p z=Au4LgPvxv=#nw1lwvmkAw0uct4qaY!)y-aec#eRIx$KMdlN`@5{kjyDCCDU?Xt=( z67BRf>DZ1^bG`-7}KJz_|dnzBT}yg+d6y~sjCEKYifOwr=fDu%lNmd zYkuQjooDnAIV8IQ*GV}S|BheL_cj_V`^aZ(A{nzhcUX(GPa@P<4xPPR=7vAEC(7@l zQCs`sjanl-AV%FWXZj62f0Uj>BAzodRe=#AnKZJ#r7UiGw|nvS?5w-z#3+-F1g_i+ z70T?U311oxTd0+{z8&)q7&(GRyYaepX}bm>X(!9Z0lVJPqnkP(dzr4%R)6cG(24RB z>ixl|65h{O@Xu}dX5w-gyY4t}|DA|j`vI3{ps#r!DFcr1rwcpGN}^OXnBqf+%?;W5 zNe7~V@7B=`Ezxgjwu6%@-?xqt``;trjOAcZjX06z|I`q`q0$^J=0x8hgvM~~S0GNe zuGZZ`cNZ}bDzTF3>hfz7SUA#<=??W4VAhDhp|9YUs zvMfy2sOA57Aa$}zxTAjqZHYb z^r?qPYAF_5nLQ8Y*VmE;A`0F+gijS z9>%){ecbtl;3>>pdcW%PC+OoJfDMG;Aq4dO2?C^1B=qvGbcwH(+&|e8C0LG>|7W<# zD8rv78?jh@vZc@z2KC3ED;b}0@KMk`2r_28{$AzDF7gNh5PACt2qOOIdP5utET0=m zR~QiWnm?Ns0q)~ZkXr@k{m&E+2_tjS!2)kIg#8WDx#wMm*A09vS7hUD+WPs}d{5#|77fdO=!gj)}B8MUsPvj7$ zW|#r7QTKcR-KO#4LrmhpS28@Y@nW1esC<7J&IkMnDT+cAP|obf+OJ_a#-B6Hf#h)d zOL(! z{J8*8J2BR$a+HWg;DAN^0U+Z4UjRgw%U4u2jPI5^R`?sJQ92R)F6%GXotGu&X{LVu z`jyP*@_@U)Tet#oT|WdN=KmL%NDDjyEiL=;z*CxC5x}A;)kZIOD>gj*C7MK{TNyqh zn*p2k!CT;f2qgmtOMk;jcH zfQ3VVpy=rCf_ehyzbuBm9Kx2c$DN3AUteL|3*A|FINf(8#7Hg$u=?J}<3~si+P@($ z;1qs=_su51S5ugQ|8CP1y@_LKSv;y)yghfRc@C=)G{>X&Ej|B$PC-UPA^qcl;{)Lz zxIZ2od!XGvCVt^~|Ne9Q2UKK<&oodaQ72CLIiEN8Eq#05ZOoG7W^D`jW>Qumdr599 z-SP3P2C0WTGCN{q_Hy<}d+kg6YelmDKk)6#UNYr~AfB!_D(MePO~iFu7$%Rego(TU z%l;)$N8el`hY(2T`?vIvjIGJ0J*8ZDzNu^M#^nHi+ZcC<9C7qlC0`+s*1$=@NNV&B z|2%lt@W^p_wy9MG^2yXS0?lWvL^~)rm@i9fjZ%ehioM~#ue~Zn_DI@2=b-oXZ%rlr z1qk~u?@QUCAQ>_~_tSTj)%M$yBPBBUI5?0&X{H%~-wES8X#eJo1o#Jo8Isfi-3bhE zv~gO`PJdlo5k}#&Srm0VWYmI1-R4W6*Nbbr8q#%?(|+}1`-N%=8y zq0|eu3Fx!%C%G#40O*XE*Rk@nPI+j{SkrV&pC=1!%sgMmdJQk~kM1O4_&j%C^R#3d z%gCOQd=29M)JW+R`^fp~&K|NhX z>rTz*$+(ZyN?yAF#75h%Uo*3v``H7@8Of$dL;rqI=KG4b+!tbcUnt>PPd$7ESBy7v zX3f(=yqiOB`DeJ+;eo&8T?ABQBPF>z6DvY2E5E1Y2&dbpr#Q7 z{9}QEcZ+MZBr5?=Y+Q2kOu7il#&!pF>g#HY_)+ndtp_@2QM3Jn6uo@pO97>zGW!Z#Dp|-1jvWjw2`q$WEc()4>2Hs zWC-)_-9drRv9U@OfVGugWnlA~(I;8ZOCW~!t)k&-Z!&G-^3oFD@wfrtGsWuxoJO@- zSy=#Tr2u$jdNi%|i;s&+0b64qAPyQSRLh40VB`74*&!4e2#)(ker{w`R4kKj33$96 zQuwKag2F(tM;yc7C$wIhESSsj^WxlbqeLYk9U$sEY$e>cT^H1aS88+4HKJrXBPsbe z@$Xx$dNa(ei!b*o&zpCB6FN&@J5dI_Xh+5seR~G zi{uM30I_dop8V_AGRxd{EAsI?ruKG#{4T_VL*Ium2OQ2kKvDFzn6q3J-A539)+d%n zPeYRi?eCZOK+@b?U6r_#*pmYun30TZ-soh6@m~*XzlE0m(#GXZ_Tdi>;3Sg9{+xPe zUAfC^v9*;Ed3P4a`W`YusH435%b8-hBeF*CO%;7=&dN;aEMQu1*fctR7z4$qvUMDZ zD!@hRIUkEe=^GjOpm@;L2{&jx91(yY zKFOW4!b6pQ3?&j~_+_~ANYMord+tos%XS{GddnY(BllxehFNU(8ByIRwT#gQmfxcV zarRYvi%*tAG-~LoJ~TC)e$tGq)-~NQcx_n6q?EIsZG^Od0C81YY8ez~AW&K-fTu2; zT!aSValTyxIPBE>Quu!rh^sIeEAsym-cB@{tTa9R`B3iX&z~mz?I=G02eZGVT--_@2xm0UEe>Vz%Nglm7ZOUlzJ}j?pjw&i1J$w);n3> zHAN6)(Pjm7cEvK)Sj|A2&UZ3f&Bsb`dY&MW`!+fO`r^y;-CXt4rIP&bS;E&D~!8f9MioB=U|<+DUlN2|dSFj#qv+5&ow~v1;md`mmDEmUY_suFcVO z^+yEp$!apo*uPhs;p=Hj!$r%RPEC6o)QicAuofW_RR6FEV!RU%Mwvh)0KAoX1Fzl{8Q7hNs92-|(=S~CZCa|0TUR#r6%EaEVE9k& z`W$|?f}YbS!>4l2<2r&kta!`Lg`U8quL_Y}oY+SLy_H`^-1tSgx;s^n7FxG;i3sy2y&a$J?3{+K3~D_xTdt> z0>%_I_p)v%xDL6y@zA6nB1 zq+7X_7DFNW3u^vNzcHN28lt0D*lA9G)zmf3mV}*Z|HKj`g6?t(9+L1eHg5155pse1 zTfuhLjQw!-hyS|2gv8wb>R5RkBbybQtNUL*7HF$9?xmK0fUZ>$QaaeLX(qyOM)!^% zT!PWU$vt)=fREkfIgc)nxxgbEn|(kP-dglgOh4TwbKv)1K3u&t*~O0k;iKbFcc+AZ zUt~wreSg$Lp@*595tJ`{<^$tZx^PO{(Cle=ACetP}k={;kScC#gO1m)6o!%{+DQY10 zuWy6E^D#gpW#t{Yj_-UeKF<(Hj5_Tu%Q%NRzhcRTPPsD0V%@UJpreSWi$Ik$D+Hu_}DwN z=*j5G*vYZ$a~P_*X=PlDi~>A7JQP3d{4#QI2_F&?5RzWZkO8fZ{_@(xUHFs0?e9y1 z8{BxO^{1Cij`;8UsmLVHF)6a(PoHR>F|K0Y;zQQft?RrP)CzB)yzE{^|A9I#nL*^o3`^RmL|F}*-NKla6JnjE=9o$E_V&dWp#R_s_YM)D( zv<*Gi8D7ptJpO}Hsu7r_LGLof@~&TTB}(4{}gHmJB^CB;JO8Zl^0tv|)Z#ee;xe!KdJj9^sP zetYfiphH%n1a`uaL%W*ye1u=$QBg_e+MOF(v! zC#XI@`HyFJCA)q9$?nS?MJXNAGY8KgL^|chd)frSp=Swl#b7JnVf!QL*@`Q8Muf~Q zBR;(GCUB*XEoeo_923FNvmg`~qwC0C@#%m0R9)Rn`fGyjYt0U8`>U@%Pm5>mNkyM% zm;}R3zJ6-)4qti{J;blA=@>G%bM+T#>D;V6Nv4ldKrQ5V&`f9S-~?5DndnU+IYS;>=Uq^u8}BvwKr|=JGlJ)rZ58 zU`IKoAVJLK5fKVD`)Cu~cYJ>>QyIp{lMYm6(!U&wD0!-_RQKh=cJ5lMBfw6@LNDVN zmH^{H@8ze*Ym#ebgY4P#n?g@T$*yksj3XSjO`?j=AX|;G=SM)y*O^)iV1@Pj*BKgGr z$4~V{MQ_jIK`iV&*69wVt#AIxkT@(wb`J{+aggp^3HCqP62U+O#9jz__+KA!#DDU3 z!HWUmDB|BYAjF_~EwAL3o}-Sbl(?S0nde2!>#I-FYMFb&O;ft5`IRq>{QKr>0c18jb)$_RC;ViSf z$;fBjqhi};mpjblDK`ye6b(=|ycSGyLD z{Z(&dU}6;AX3@UJ(Ie^Uyx^Xh;NZi#dJ$!!b}OO~ZawZ)7%swUoFI58Sw)M5<|9cP-(+A^W0Co z%%};W8X0PCXhgBoAnWdBlJ25g;4)TWbYOgepaIE8=2czhDkrFD@fXVoG>C%DL^=zGI z{a0G32G!>YHtW*yWwWe@T;ZvUb6rwZh} z`_HI-gl)}KN$1cQrtGC(zOsfj#a2rKpNUFELCSsZUUojbdi@o5_=Cwp(qmk#wP%x? z{JJ-{ptWX9^;StipIG)QJ~s>o@PdqJDvD=5AZYgtWC6qpg9JXMifLi?YM5 zKNN%INUqS@Mc=F2vKlfAbfszbzpIfbm=(v}3PqaZq}3`ppfr%*zkb3SMj*|Wb=0{= z0fd{!4Uw9cu$bOxGz>`eW~3E#4P+G)73nKd`?|&aP-I4r02b(j83C5Kf z{8mhMUw9kDee!g4A!jID7yJkv{T1uBaGo|Jx{r;TZK<|eniWnoK?~M9HYxWt@ac^W zQQ)i$(}C+#<+kH{`iSdriUOE!RAk|W#a@WiY?JE9)+<>z*5cuQn*DTyCy@8hfdG|~ zg5qvamy6Ghuoq*oB`nQHxS;S}wc)AvVNfBesZ)Elv)z)@?6U-o;J)h4x&cm-S%8CP zMXafHP7EO-mB5wNcgSEw`X4P5gb+(mQz%2|^lR$D*gO%tb+=;5Q8UB+OV6Jn9Ggwe zAV@d}X@jX57+iwXsPQi2m#h!E5(F^H-x^I#|S=FnVf4Y#=- z?dLXHSqhVf$S+XOuJrsQrO@eA9y}Z&97sGK3z+o7!eTMaS=WwHc1luA!OzjeO~2?= zTd&y}^$VDgvaQy1HkmIrs84VzbZ^tf-}_rII{w?!6#@{90L$a2m5p6)qH@Fh2ZlGrr<>xyG(AmX`?PH0@-DBI)^VLp!2!X}CdzL!Azs;b_F3 zcn%bk-yby}onw*mb@8`~UVYq9eCd5@_M%~l)=WkO&-!@qQB~RV*BXyJ3l;f@4kOF`UHNn{=dv*Np9LF#JILM1W$!?>$}pJP*dZ9z*M zxT4=YhHc0yRSbXp(>Z+U2f@?kt@~h4ybioR2QrLFa9C0zU~76?xWoXLp;0ZHLzP&pRP#?7_-B$Q~V_2kGno z4kZo>{qza7O;Hf9&e8tPI?v>}(??fSABd()HuJ^T))79#<1sVjLrufi%YG)&r~Tmj zH-^zbw0r{yzK5E;S+`)-HlD~Zla0%?9BfK(e|{i&;B@cBm42WHjx}Jt$Y&1f=<4to0OwMRkPT@{r=h^)PAn{ z-K*gU{MTQ*c9O3KaD(f$3pzyH*gu?UCIi`S?fh_@|F8qmBH-pe>`q?yhs-KXvR2R+GJX zKs!Is?0&U^;ZJqt0A`(`K)x;IiFZtQo*z-F(<<3PG`!Y7)eS&7SWbwj$mU#!XQqHU2S|g|fUYQ$63xGLD^yBK~0p8t`2819Bi2(RS6}op>y36k#PO-Jg zI?MVd&%W7GQCJZCEG!S3lxY1RG2M?7q!9?%U5@}!nLns2OBAYri~DFfLb>jSIjS(k2Lust`khHmORZpmRm1nr)< zdzP5FK_0VvcNfz|bDvP{USFDQ4%2+hyxf~5htpBDj zZICj&+X(pKYF+Mt3_g~J#az=z6ZbYsggCzA1UV!SN{D4w15aE0G4Hw5lny8v2FQC0 zBxHOZPI0=$xU%9M-bOy3`8L)Ic0NaOXM3_yLKi;L1k1Pt!`SfHHFX9j@y+g$R;{|Z zGh6n-mc1?|*yQ0&5yi!9Za#VZ<5^pPn69*2quvUZ!^9DEFk5;|z_E%xhX)q$o;N(n zvtEph&xJ#0Nl5bQhJHfor2F2HxiF0xz|UD+3ZMU2ogrYc&Y~~`808d{V6Z{o}c z=ewD6Zo3|qV~8ON4`jR^^_U_pesx`G2MQE~#7$}vd4&@=4KG~rHsR|n3Ck{jk2B(&BbcOHCN)Ysmn zHmEdcm(#2DizvKAATzdfuA^%n|Mm~pK&;pXR^vVeod*N$Wfo_)g`+ak0r~^h6omK! zI$!Y-bvg4Gzp9uz|8PIo#u>L`FwRbSPG*jaok1ihAG%!Xb*^Ql<81;al1g=HJI#pY zD{fwd{zK$RP^p@Ya+Y~#0RKSCCM3nHb|^zd_ke{9*}E)dvBfa9XlojqQv7ng&nxF> zBtr~+JAUDz9G?w4yLKfl9V7AcH}i;@nU=HehYZ`BT9vmAPhZk_cwD;F=)$36pm2J5 z21s5{@O1h;Z+>_!DGA$aah!BZyvVy9XbI+ugm>bFH5)iY}9tm1I z%rqRz@As&H2nlvUtt7w2Z!fHAL;@EPO&7((%ztjMFe%XVFt6}B&{r~Cj0q+|YE={r zQuWNQdfjL$S9s#uaA@PzqQ^#KMTF{d`xd`|elJaFp8LKa9Gg7w?xa>GkkK3RHHc~- zB0HfNpAi}8+r`;@biA7Eb|-~9RfxT%ttXo%E+rn`D&b-5S3;kEiI%RKBYeK&8C#lV zJ#&Z=b3ziFAvMQbF=1JM*yJ;|-{oRdZmhau%eD?hviF{JC(Xz;%4 z;+w6E2`USnOkVT+9^OzEGd-Ky(SwSn%-MA|G8U+W=RFLRtNUH`S@DHk-9QgRs;51B zyxQ?_77?+&cx6Bct~k^gJA3&$>*w^vgJKre+;{fvVBE|4W0#90Pdtpf|8bGVTj@(` z?e9P{g07TI4?WGy*Xs#_%FjTh$3qK$aiy(>bqJPq$y?%^Sa`f9@E*Z0 zVXem70w>vkWe!Bj4aj#8q43xgWTNQ=b)*}8YWRz6&FJn4TXZqf!UTHkl*6GVLC5^tffzb}n2k6Vlt5`IbiB_#F#V@5a9>50FPdc{9p6ykFKa}fh^xo$m6!4o1rvz+vU zAY%W#6fla|Yp>y9F4F;qd1rYPp6j`<{RaDo(g!SG4r;b|rY+w**L8TZ5k1zA#*Z8( zXv4D-8p5DzLlEzxv{JmY$eLpgPaDzQTE;MYjPcd4)M16rBz6!32QPML5170Bk7_q& z{Ed5c3xa#>Pl)xZFAu^XhTgIxN%XtCnOa zWcLz&^A6PNnp#q^xe44AKv?a(~ zPP3nW;tpQP^nQpNd=G8JEL1c(!_-w`S7@wT0y1P0L|Y{mPR~%`uy;4y!lGQNRH+oZ zYixHBQq{INoviG}&l|8f*VZVWWxPVLK`iiQ6Qg*Hr?32Sv&-u}P?c&x8bM)!{{JW~ zO$*-7S*B$@q4y%OqlC;1NtkNlppveYRwfj*i0W=RBvYZrRF>8h_rRzO{f!POXM=Iog1$m-OiU`y?)NOSH1iM%HcH}7W`?J^>(^Hb3G*7u#)rU&`UXId|Qmo(ra|v zgZmvCba>y?_ttH1pY#z+jL+KHJw+4|-rtZEeW6UiV|1L?5hQvJupDQ1dh&~mk}x=H z*ZmTzAxnZnASXr->THvDeX0v&oSC0;u&~fE3Xt>W-smX1%rKWw3ooHW)blX2UL+n7 zcTBjQ@1rUg3O6f|oG2mbu##pEJupq4T+4dG2U4fAhWpIwdyCIbfkZ<+H z{9xao<|Jx4`42sc63_{j%Ly=$jF%lY#}L(<|FjN_E=n{1i)HI(L6I1M5K%JDIHO{_ zsalIjpf^yYuBycC1fw;ZaBx&(Ae ziOU*|i>qoRgUcFMzrgoSNF7f4dYE$H4BKnO&hwvKyW&GD(q@)&h&I9sbS_Xp(BL3u z3)K$tmTw1HFMuI(e8xjTLGf4`_WC-GH`$%T*pQr!NNTJh4HK$b+QP|Re#Aapg`akB zF5}7Df|$}iMRV6uW)57?;n2jP#GvFh8Cac7xZ&^md)pidsFVO>9*B6M`6fDg*Jg zx{<`@!3~T%qu`<&Lo>_G>u8l zE5MnqYRXDP0ONXhF%8+Ss>+!;*c`0V4gY%gQCyWJ?BlA-`71t;%ScbAhFN>O-c(xB zw><4GT}{u~9wrj)U<_&RRg6w1vJ_RFybhG6t2+%AxbGP}ITR5aJ!vr#T(R(!bEf~D z@(!Go4AIZrvF=oiB7EZoC@pU_!kljxU?hgo3le1+)nW!k2bprxsY&D`@~&U*hHT#{ z@XDlPX5@0u^sCM$$@6o~6gYdz9vT+cQc3$}t)O@auVj1JT+~&ysVN2TXj$$&l%rd~ zCB(Bu$CLbpQtWHluJWDF=H|Fd)!Y0mUS~!+)|2D@^9li7!vX0w=W*$1|YM$Jt zy>tl?rLcomN~X=@$GYY`ETc1K%VBOI{rbVGfDws@*J8+j#xJ>+{~_TNh>Bz=_0VsT}42Fkaac^SXdHyR|^%Uxc*vspr7F?&tjOwzh2|-<|7$Bi+97zK(+X zYIH^fD8Rc}3zB%7P5-ctZf%S?Kc|&$Zd8f?oXba?=4shY&}HmV`FRrLJ!=!(3L~NE zvw3~KRd6T`kP=g+Z%ffKfw$SHKzq@LCYhnvrQ{Dyw2E6y(MKIg@gFCKXLuRNPK7`1 zxBJ0CEJ$oHX^B$$enOh#b4+2M*}ch)4@t*G`6p$P+%CT&L(b^X4?kPxNZLu}Tkd|} zHHrEStT5{c=~;HxFi@rlX^hY&Gb@@pY%_FcWaOUD=@IvNc7zre8L#y9eDkHpM|uDo zrBvB)dYe}>>)U8-=Ito8Zm7ODeOMjQ>WG zZ-(6Hso*`jw}!{HT_`d)(cP=;we28{%pI*c(C*BB#qMKjptR=S5;zVc$MYZSqUD5?98Tu#~tg3j@T~P*rgb zE2R#zLUapvLl3Z#Zs4Kf3pNAR!eZ_Qa!}5Gcip>!-N74KadP|{J1-}xG2=3O4hD;+ z+)}%Zm7+!p^{5+G*CjTS+%}~b;fKh;hIGt!d5wUBCsa&V__f*&K9Fu;G;xm8gJ}&k z}W}8^6>w?qG4W_#XuIR%l)r*iU zgOQWa(ZSt^hzA5eeIUX{Or`njXeGsh!^ER(x{>MLqjS)m?+Rv)XysD1x|)OUvv{ya z9}Ayn@DF;PX;Sb1ZpPg}DSn+jkhPm#u$;A@#o}`(g_hwv{8xX9=rvi%qn^M#{OJ1=K)gvnq9)(xd+2 zF8^!uUfm6=-4|a=3o%(RBd|9 z+iy!v`klX+Ca*k}|B0n6KnTn9WB^HGe$Z<5Z&^NCe3C7xOT~WD+V*iZW^~BvB4kbk zDduD)zcjKs!R!R@oBWkCL6S#0Kn^K_aglFF980^cPVsyMlJV?=s>2dzgtd!=(^f%V z*5Yp+%6l;g)5&iU`MI-6z_vl#3BKWZw?0JyxcX8PCq za^@vIhibc&+ZZhvs`yYlm#VX@XCtZ+RMAA(mF3LyF{-kTC##3CAmSc`;4nMP8!DRv zPqkGk9K3p<)3d%kciAZz{32D5UJJSQylE!Q@4=qUl?AQrq#hAe>HoG8S@jd}4~^$H zJD?aa8cb60d|{Uto~*`Z1ywX-HR@bUYS7mjaf_rB##Nl3D1*Eo#qsqvpk`WgvMh96 zeYd%@7aufAv{4V3uC&jxk0W@pJevaeBn|IAmmam)Wj1+@mpb6q6k4#;-~$>}?{Z|w zP{*mIHI2T6Z?wcUg~)w-6sTq2X9wt`C#}R zBp?;{us{T1Omd6YC_xl}Q>W^ojX{j0yZl^0A9HAB2zk}uq3Os%rl5TM2Mj~%P1(Fi zeH|mm?>k5l$^v*%?OJ9YJAxN5i5VCG_@W1OneKSbzho;;E`LWX77B7ncTMRzx6>1V z*CPMmWmh-veUf4aF;h|aEpl#~r+%ZykNGam5}1+PhYe1lOx7@N0z(Be+F5iAt@;-8 zcAwKOHH?7v{*T2Q#J?iQ)9vpq8r1JxF5`@e@+bS65)lIOP7o>-HjVQdbv~HQH5I%N zy+=I-n2uZw>ibJ*O%$LRh2kII)WeP*Mh=?9w7Glfa|DmAaxQ3J?Fa^x*RaxmnACOxUb(`EXD0sT zIu)?!$v4v_TI_gAG1iO)khf7*?R5|s&e3A~R)!C+pa;eSAGfy*Ydp>(q7sTRE&ARK!nVYUf9f$z=0wO|uaV$FK z`GP8Y1FzA3pCD6qt*!61ID4hp88W0wyb~>lcSPR*(cu~w1_bo$`;|-Xzc;M}t5X4U3-j+ix zCYtIdStfY<7Ej(MlQJuF2>OG9p+yC-G`b`1b^&lvwgfDHaLR z-PhRP-WoCY05*T^;d3h1-0L$1jB~Y26z_iA^59Qb9&K9P%ieSx^iFOJ z?+5u4mo6*!t~Fp5>#^>I%Dx;}1jA+^Bpi|#3rR-XvFAAq>LT2MuH#K7pG*_kwT^q# zzcQAl`P^cF#``R2-U$sp|Zg zukMGgj&%_0M^6~}lnl|e$?6t_WnQ>fd7jdRT>7Oymy7S0??Y$XiZ)%Z)0L7MaRR+b z@}&P|QRdOoeXF;+lxbSzJ*O&RX&fy%%Hn#a!%JedXJ%U(HHKcRvy}Cx!5l{wZ+_vL zO@Jsmf=DcT&HF^MRYoJj>(0KJYj1maf9R}t^w7^a##ZW_W2~fOQ(efiq6ZlpAB2#d zHku_^xBqb<71VWMDa@wnMFlO1d<_V{84ICW>{=t|A&&&}>?l%<6H@SewJhC1xBjFm zu1tX>aTLIY_AIlXBej$IZE&p{xc{|;f^%Zwo|FnRqw^^) z2~Wol)fr*KNV}@<4(G^=XaW7_b;MAzgR*#4P6q|df0?sat~QZ_S*4K)Zd%#so^dJ1 zFVC|Z4@GQ|Nv~%z@%^WsmR$VR%Rp`A&gZNnYfsV6&n6Ebk*3V@E>GnpyI8GELMDe) z846s}JVpJ755Ff`hYykv&0MmWh0On5DL~BFr2u{G$FrV%x43Ef#4(JLKj)QNVXBu3 zOw`xM4jP4ip@p_~B{Af39q8ve6U0>G7;c0>vr_WCCecUwNlcq7otlbS|F?Lc_xun) z+eI+DPm?_z=8$B2x@c)GSPI>URg!EiE&>6;#^F?RiJ$AG`3S&iHkpL|pV39{!)9@3 zwUOAitR?(0My{fgY_Bsv+=8hd2@Rg!?xi;`W!+A7g2LF{)q4Jxuy8=RGzZ zfs{C2SciRjx#SC+?_}4I=h52~p0D8m0VqRM{)tr9?uK^^|RBj)>1~xs^BDJ?757IE`hOTEHB27C&eu3SdEG0=gR@ z%_!_@NZ`A6y8&)&KDKSc?vP+Vw?`hqESO31{KZIRA1YZ|taI%|u z6ulW;p5%m8RTGiuE~T!-n;dhl*jwiVFCnwmdfw*_rHF79OPt93pneL&A%f&OOB3WdYjH{vU1c9o6L0 zy@7f}1x1R8A|PF)gLLT#N)?bINEf8H2+|=SDxxAH(xms^q<2sdkluTVbV6@QAR%xk zc+SyJ&sz7l)?N4f6 z>6Q`^M+cv+fqh#^IDebh((P;td$5C)f5DlmRc5mCS6-U6xvNoc1zcGSLB)HFwP%*2 zN7EvIaN_ZvDY;h!Tv`DLp0(uW;L0fh0zh#Ofw#`G*q*pQkZwOn_~vBZWF^l`e_aaP z>`p>hP;gvLB22m5?@JO#{eWa2yyqqCcKiVG!wz!92^o+V;LsuY%$tyhu+hFE|HR>gwbw|$*EpB-EFkjVU7Ne3``uby&$8xSs4FZtHVlXModd>3@zL>KtTNDCa$1)*ASBbUKXTjV$=(u)sqESfRxZx0wi72+ zu!xQRv20}BVLNtAKIHD#z(8SQdM4EOa+b`4HI(HpbsOncv$WLhmyJkjvGUA{31G&T zKgs@n@&25wjR2C!TBbyryys@Sv1RU9_!uCMEG;NjB}ombC314 z1Dl>&Y^{ve)K>nd`?at6rnhk)TKw*irvb z6oj~1niMfGbx#edfwQ7N2_@wr#$TB9+^{0f}l&SW}10e82N%q-f<+=jsX8E2n-C?)Dq##!Zs= z#WgW?Z{;AijiigRI`)H-Zx$cnzsuzPynEtipyn)I^592WBygHqw-S~&63fHeWv+w#3i9i*}weSj$fmDz81 z(rlb-3kpjsU3?GLsvt;6{7>*1%sm|tUR^UdhqPa{M`+e*(4kuo-qq}-VX`oPv!zkK z8&;h&Oba*c_3mmOzzK(4L85g51+t8ocbBb`K2^lBqi7D}+kjtTU=PemA4^WNX0~_u zXb-0OUAhK>{>!=h-k%?wD}3n*gj+)cDUVHLkmba#oq#YW;54; z9Q2)=Z~gdT{H9I*Hit2ye4+b6-I}6pR%icT<2-#Y7K##&wEw%tvB*dkv+M2r0 zZ7w5=4fDvcMkYiVCaQLNodL;%^tKBOgn$YHmo}~+>Om>hN(Az*NfCW`we;XAG09_# zm;G!q%k`j|KwzuG1g(n!?wZY%a+&SX-H(+uPc}lxuYsGbIfj0~V!2Qk>~Qx-ZKI#; z`@~F>RKEpMsp^B`XnJ7x6{YI{CK$Y}H_f>ow2Ais(PX4_T3~W`EO)#pLG@E$w-vi) zZt_Q7o9*O@18U=}20F921KuuSE1|V$v_YYx+i0h;HaHFUi=mV6#sX;Tgt_y7FB7yzjH>Jr?^RsU7z-@ZT>Cd!;8i0Ya69BSwvN){Sja`}kGv{KK<}OH$RM4L%#(`*3oy5w~)*HhD}eY?|arjaZqL~#b`DS z>Lqevp3*rJg~zbPTE7mqEYyoHZWI-cBOUuxYvn)&=p*sRWx+9Sfji8Xa6F>qF^>p# z_1QPX;y~;?tzyVHruMOP03aB=@h^l=huiDhSrxv%w#6! zbLNjrCc5IE!=M9?+>K1EebjY9I`a7imb<8vpxxj3eon<7BY8FAeV7p6HLb8mWE!ma z7K@iiu8KTrPDTJ|rWs|!ZB!*=Ta6?nd;Myg>`s9M{@|jW7OA6p*d5xGh<4%CWEtxw z!Mr{x_xSRSubPWITi7=$+IACp4jM+S$881aX=|^Ykna^y?e1Q;yi;$o5G&TpH^T4b zu7UmW{O9Me_$8r-c8a=ba3kDAFp&EhWPi+?Mj0J@qF~W9D7dJU>~sytl0G3+svMypAc&@OKTw|kB%^1)|TCFJM7{F;ofYk2d!?3cmrCZcuk;(A&0?2)v({Jo00`4j( zwGN0TF(uTRrPS#Y#i^tGzVM!98{N2fE0G_^ zq#lm}ldc@mzh`7TU8WvNF+WGK14b2WDr{iW8>K3BVjg}C4=56N1A-4f<4q6l#sWf^ zT$c^5j+d=lZ7xM)1V~bJ{OK_^a~aWVj6O>ZyUyPLe|LxW^4=dqY(rndw(Wjg|M_l< zFgi5a0+yC_VF*)uVgCW{47RlFFNwxe$Hi=+KTb{%{63Mz&mN!3d`kZ_lpO!y-(tFd zlHEW23vPh_^lP}k{+eq1VaDGbvWOR+$!WeMX367o&i@nw{_SX=?>)egB~RslA^(9K z$jPWrRNjfl&u99H4Z!o$H`Q?~^Mu+jX(-U}26^0Nk0->#f9`33Hq=RyJ46@hC~==` z+WoY^lk24C#OVdEdJEt_No4pXaP9b!+Km5?EWd+<&95w~x0!qa_jdnHY;O6n zT7{HKu=wBI&Mi0%&h!831d_Z&FBsRj7?Z~nwIza|^I^Rj!1e^Rt)B1cS54sd|g|4}xV(;tM+q1dF@jT9Q z&PGIYe;Xrf9oPOJM>me?KVXauM0H96rS{iQl8?!S$rolDuh7sKYH69pIt}gkcfIP$ z@r%v1y?j0k!#Qa9=c{)Izr0F!H`b#1@#0snUQv0#c$k=Gdy-^#3moqla^f0L>Q+Sb z_{;mMZjDL63O$znImu*!z}@upv^etVX)4}+6M-(_HRA|w!?9GwP`Mzg-g+&e{QST) zq-xn0ZdGFITerR>iE#}yS5RIqZrc5`FD$2IyrNVY=UH|Kx!`bk7+!+!;XV-V>c{DG zKVpjHDRnL)@^G|JV1r|k<@NT?8UADR7uz_~hfkjPO!Vst>X8_wCMZwPh$p_GEyS80 zs?d72w#jL!hatKRA0J=SV{NSTw@22ampQ6k>mJxBtJDsp z?v{v?e1kZg1MgCEn)24-mXN~#ETL9EY1W9nyYq3C&86uj%oz_xpJ;oy4&*6KjYL1v zhg(bBoCt?s({Pf3RFRXD?{2`3)~h$tN%#5_4olP#zOwG~ZQ($9O6p*<5$N?PNK2m> zyf^#$A`8{{;Ka;kE3KsW-U8v<@`!xH>ap;%K#Ru66P^ad{UW>EzJK;JH#cv-tjbyK zw&8<@XT%6Y91I+vSeprzrH8w65tC#k6MBh5Y(vHwNj0$Guz`*&bKE;u4RGq9-UiW| z-0{&iP&lhO6XIQ9V0CTyta6GN z(cfx?pkG<9Szd7Im)T8Lm1-B8G`_6Iu0epZVZw25Pj zW^=)vIxu7KNFYi~$N!ll~AJj13jStHn7!&80 z!MZc3aQP-AM!=%;4#nJ4z<3Z~w7I;iw5&6_WCk6weoq+_ME$1&5v7$Q9X3o zXxiRVAnayPsd3jofP~J$&a4thdcC6-e)r*Qno>w&X6RzP7dJ1jV`sFW)>MUK%Fs=A zcBNHS0Zfb3p}LmV?fI@avHlm5EGz*FTW;bf0@Q{WBd$aMZ8^>Mg9C3_=xlS)^JmXW zf*I9cMV`-+W_lkTE$Vyd&8|tR(b1)RUR6V*4`}CQ0xe4moVKAdIauNz3sIK&Mzu;< zO(iMc!ZTMm_|&lH7_^! zF0OXkkAy~Q{?_v|xP|S^v3x{#u95!Ax~zQ%!rZ>ngLXN25RijgmvVV|d3$?%wMKwi zn@=9x)Dt8VCf@%9VWb3;p+M;KFkHRAO+J8~sf-;|a?sfi4@3*zSK~=v(_t@QtG{Yf zci$pO&uaO}tl+?E_M%^_h|Rv`bBEH!I9my;(}9ywd~vti?k>go%CKH;;{rmRV^|a* zso#rI^2&5po9amcT}O6JY0s6s@~_-7GBRP=qs4nvCWr^t#v;0XKNL z@av}%`|$|k)(1JPYLfe@!NI{ub#VrRLQ{V*t7qaq&&-&zcSrHd^NJP7Sv*hS3UYou zvnX{`sc_SoD^pTHKnwPC2))10cHh@A1BgYcQkw-fO*7oLnK{cq;|&f);m#FLH~52R z-+mkHs)0U9C+gD{cE0J`l3NndGdR?}McOLUZla=akL&XM!d`c*NPmer2DxVJK7CsK zaF*_91jvnI_4@xayaJWh190#_$AeLk3nwsXd0y+HmSDI^l^hEh zJ&m2gw$*HRu9GuENedY}NeTafh_)vB6gR8U}X=v%pBSn(Hkl}al zKe%S7#zhN5RC)D{y9v>JQszb}upYFe01da1V%+Zfq<$C>q0ag;l&9~}zPf6+WgJn~ z(-Iq-eH569{!b$TDcvTqb z<#qRh^eTbAWqg^j%Ijo_jaZ7meXK~5&V#vr-*(nJx4F2Z4_9AAMpCF0C@U*daOn+X zF1NHG`c3oh{*~^9S_ebdZ?oI^Q{r-BbVUK#zrm52t^?#LA06&A__}__cj1v^W=DE z&cAnZbX?M}kB@9FJJ)$rguEp5gmvzVy(nr9KaEo6sU=@0=~q4sIa9RKK*;00Ub&ci zgAjFy#kA{re|>eKj&KVgtMzExeCx52EYA5gi0hpZ)4EZD!mqXSi;K#|^0Xdbt5ZAy zasY`zBlg03-1nc|GB-~%4TE3{4BT?O; zZ!DiI5x2qE_xKi_NerL)o7yUzq_ue|*J<4)FY42EP2R<>oQ_8{GO*6WsEDoE9N)ec zcV)gnqt}&9;;GtSKP}o_w;x&UMAe>nddjTg;5sQI{Y!ogCerKaR(K{S4kg)2v@zH# z5Gc)Sq;p-MLgQ)Zi_XK=C_?TE`UaL4Um(1&)$RHAHE-LZr~~>`FJ)0Jyd>=VO`x(} z`(>=Obt-ka<#jE7an^sm;nevT7?ggoMoqX2%UJ(DHzN_nZip~St!vLG;Km-;LJR^+ zc^76sn0>!XxaWMitPtsCa`IRZGuJuSsug3be5;T>6W)L%QjmVx4mrti()1>i;7Jox zy&BF+-AHyCukXsuN^*Be9yvKV-M=61R!fPs*yBj~V&^39WbEQr9PnKm!w{aj7&KtR zL=tTjIgy-p$n!hr|$BJW{x5Nr*B!A$^k1z~>^t z1=2>!tP2De`>VK`b|O;+7PHjx_>_LU8OY}Wq3rVsXj{^li9p=jlOF&5_6vVBydk=d z-epOdnt0`Vr_|%ntq}DOg?)Hd<252KjW3C&fS$+XoYCC7U3;OnzgrP_09ujEYv2=e zrr`}cVJ6X!mS~%_9#U@PMwT=#zL@^@?c3fr*478`ze>V&R*eC`?>;=3Noz4PTf%v z3q3DucGXP4?5>%anYUTkZck+^*^`|GP)8nCQc?nlm6xSOkvZYE5gd^#k=2=wl@o~& zp^rffDzRK+fcPbQGrb)n{p#tJE`=cJk9$M*Z1Hsu+ieMlIdvmyp4m5@qr|5qqPz&( zAbJTj2V$eE%mKD*Z6&h4GH){QmsHocEmJNi)QrGR7E2+oM4zsw^Bz&Vj}{j&UU z0t2riet9KM1LAi3FAfl=$dGLQ%PPWAV7pM62_YWnTKu@sDS$uD-2 z0l%Qv`~T96G8Y{nd+8(5gyZY>J|K#7lM#J-OkiR2;y2KEz1a?AM{wfuAK#USx{KZn zDcc4C8-Be?fLe%5v%Cb?B?g~;j?7Ikzmyj_LOi!^30;KYJXe7yjE!EmfE z`T8a3-m(7Z)7!G(D?e9uItl_{<^qKi@T_Z8z_kDw zSny9WqW{Zdx6Zv7^+>BmlBb)`K}Mr+B)0TWbCFDhOOcWI@GH=q0ZGz@OJUH+5RfM} z(9+OVuY?@=;J)`XH^|(dbHz-Tt36tmCzXl*hlRX$l=}I$+uL$>e+WYo;6C?&2+&<3 zBe?K>>{LU|GpDH0aBueGDS6Fyp`>T=#k{BbS|ILa*GYX^ET7|^PN^%>j@ISLhF$Z7|b#VFDHUsJ_U_s$*WaL))FO}xpxVySy)C9M=^V^iW6dC<^AlON+oEkF}x$3&qg?|lArjW3S`Am}{!b@X?J{LfkLp1nWC z$E-zL`!zaz#-7c8Jc01i)Po(_hsACxx+b+1>{@&Fh{jA+ukjXrS)OkAk?c`>ePOh7 z*_ql)S=~q8hq5Hm|7&7rGp7z+YV_XvC*q+VH(8!I&|AJ8+0@7G0r%#E>CT3iTj*Br z0*;HV%;pWvXLKKb6xO|Mvg`E8_)}3q>?VUMvyptjJ=5zitQ5o}vlQRA) z)xJw2S)!y$sdpzYvL|eQyS2tcb(LKlnQ)J~+F~%`-ZU5lLlLwzNgZ@7sBv2C1+d%& zu#~}!r!IM1&*!-jm=p|O$S1nP`P$OU=G+UNx92XU=YEPeobK;C%q>`?PD;pxt7Bu* zkomf7Nf~$39=C@*AEVp3m-$eNcsW+NFENaTQ*4vZAOUG)e9*=UrqHQ>rx1)`mA_jw zOMc1CfScMHx@Vu+{91o~Vm?f2>}p$3XSJSh6lu0d+TtxQ;naZbanK{hjWOS&Pb+;F zk~9rOM9C#5*Ak4#Z1#g&@#9v|j!Dh>#l$t|hcjx2DSQJ!6cjjlyf}}Sgo;XONW5i` zuT)suSoik&b|!C)hXQffdyioO2vlp%0)g{L0$@>t)odcGb8neQwQ%1z_@&Q@g%YEr z1RuqADLfO^UIuv*Tzn(G0D2pNKKDZOI*rZl zNAQ=#UfiQk(Gj=^h<=4L*pPmxgY9xRo>6}dfq;(@IA22cn0~;Kz%$I0A2GTZJ0M`S zNjgbiXLHv|Q0SGCw-<0lnLN1Xj^Itdo5+T0mpEU2)`NHH`BC-EITpb7EKV1p}^!K3mgacEkm^6ck zlF49GHsqUd03VVXe}P4Bc_a+fMKG(y%(VvY)BcyjF{%;>Ew%*rnb+p?;i`Bn({`ii zNflvi9@ulS#5rqJyRPjJzHx?>fh-h*Yyh_V=nztD(fLkvITLJ`>fJUZfgDymaU7D) z_W*um=-31{(9kjKjLQ0+Os}#@-y^&uOrUY>pPMti62E)$^cC<6{HW;wx>5Dp&jM;z#}KzL^ZJnb z*%HT@HXthn4>MmGEsk8jx7yj|;uPr>ni(2W*)o|lX~d`tu9S#v!(G?WFa3n-=6GtW z=3T(XW~sY+3@l}=AyX1)9}T~ymbzuMFi&x~tyAwrTv!fnv)O)5BI%qUJaMmrW3AIL zs{ppM4KDg{TV^r_dDfe!enpyFY4RNtcqApoq0MN7acld0yUqyDcuD1?^=xWL0PS)_ zXpEHi*Nez@p#G-s#+n*6`F+f`0K;uB@7cT_1F37uw+6yv)w0#l@v@^LW2IXSsXGKY z{q(VK+Mt9KTxI%7rv%~ln0JP*w{co(tH}BzEZy9^x;#yIsj$2ea(QsvL439;s)^Zr zg9{4t@n{Oy(T*bW?{BVY_V8#V@(u5ZErVJH;VyF~zV!F&%@yCD z5w3#UTChmX6d+gE*~#&Vqh5_e(bcT2tF_n|NI>02v8hU7ovXh@8ry%e6|$c)9gg+h zZe1r{tIddWjmB=rK!kPf8;9={#;;Ex*U|@i)q+F5x$Q%IZOff$i*pOhr4G0B*p8Ou zr9M!Hc!gEJk1U@YYM$~M(zP57l88C45I%bErhSKPY-HD~L3d_=q)C6>IyXns^2+km zZ)XeJSCqlK>mLd~v5CcV2^tTPr?uYT;$|zhO?@~#@}>1jg&9A_9LUufGDWpaex5~$ zKt|ZQiYbxE8KC*CT!|HdbdN(Kcr!$3RL~f**PJi1l3Tnxt%_L_b8T(!nAD9w zL)(?mvNV{33ZU~bJL){2;TTjqPeDFv%vZCL?>prN!)ojm9H9%qC?lu96+||%=_N^>x!=|XATH{5Uqy{na?HMBdiTD@v5hU` zrlUewxXzgR9MB>wukT2oeUtCFGEx{?i)yBZj1}@rNIXJ;1ddyE^WoN|?&)De6br^2 zcr#{Bm*s)c{?948#TLk^Qd=pnHH1if^YvQnPJ$cD{Y7a^VMhxs_0nq9TA7gRtP~dR zdA5XXT5{hk$e_Mf$1Tkk$ADE^OeZ(Fc2+LN+YZ0=@w{u~V-id&AtCQ!6m9UI>*lLw zirlzIigILrykQql=UeaXEcW_}WZMZoKGe+%-)arLTbYq4vN)=0Y#%DJQjeMDNe8d0 zt{eB^#v6{wiKX9&`$TNxJZdyrD9X+5m` z-FbM)7Fi=u3Cb-W6a2b$oK+6~cy^ITc1h~dr@7iRBsV5Q%!RyHkQVqtkXI5pI@k#Y z4l*TJ61_-aDB%9Bry=>n>EBG&yw0lryF(@%N6a5a;F=b-)RHWdeGVS8wwHPgp@nv&=at!#qE}jU zy$Ea9>@|F$E~c?H2hu@TIV2Q`;tPxkQv3NEOF1(hXJb8jN>fdR=m2`4? zqBN;{>sn==^3Hmd)#D{M(=to16+vqzuC&?=BXn4N+L0*KRV(;Ghgp=@3LbRWdrQ`g zJ!fS2u=hfF=?ZnnHp)-_rIdt+t4EV08@O)U@vz}imCB6mD{BVan?t;=54`-ZS391Z z))AA1?b_}qB0|s{&)S7vO72!;JRs1UeHvr!>hYd%U36sez$Bz&=|W%>=Mzlu$Agh? zS*o3H!gy$*-Vmx5yI_2_B_Baer}cJ7Rg7J_edq-b3RKq4{ZC(IyYAswq{ zTRxmhOquNH$xoxMK};(sTl2`n4g2b`fP>dD`0*0sqizh1=evoIRg?K}e!H2zO9`Uw z#%|M1!xZPK1lQgXW98o^=xQ4=hmU&PX>1nvwQTw8xtv5~s1B!K6Z55hi+aT8#>O#M zsP{C64e2)Bu;WLWV{;;^>*D&WE;MUYTzH8sGcx~-4eRW4dmmZe@>KJC#MHUWJT7H zmbHkoVvPS`a$D1xi-! z*G*ka?+)31j!lS1G$%if``V0xo^`1cLp`7CPOV{_4^*n>IIjbzw8W<0Ox>Y<-fU@3 z!TF#{uZ>zLZNJPdxNL(`zk13XT7hw1*VURe+o3UQoIZIXG5?nt$Uthbpv!{#6zx(v zr9ib#@*%RRv8AaFK?M^$f_i75HZQ9Ge zEnsbofF7E zzf-r=g}C%GXZLNfkLCnRv;^ce`5Ptn)Pt@MW-w%)Val3U^H9E#Eyl<6VmL9qC32hrfME$pF`q++H8DZ|e|Fh`phF8Ou{odG3;6d@>L|IM@~W zkX4u4#lEgwI(r)khH7!^9==|bh9dRXH+I@;Q0zH$^l!btXj~Cm*e8~dU+-iasJ&D7 zQnfZAtW8XGx0{2tvH;VwXzU>`wXw|BLcg7Or%nc@)O~a1aFWH-<*=`9xy3Z?U-XO=w403$-zR9tdPv{0lOaUr6um+)4^w1%BU|AjL_%WlFz9-@ps;oQzQ?Y!Zi0FqcMY}-rEJUPXkfRNx@lNvI{- zC`)(q&<2&Se$jZj50#a>`mFpibRgZZez(J}+s`u`mbQ^;BpV+RTegWMhY=#Rx;$)k z>!(A-VeGkERM*_U1+`ZwdZ0NVu&Jb@-ALF_WGW92dk8G@o6eHHuE*xh72&4dDzv(q z;&U=W<`1pvb!(HuvtDv;c+iS|F_{AnBmJkdiRXbV49MwS7eT<`c~31hhK zY4|v@-)&J`$SK?Gimt@CaerGUPejx1q#-Q@((=|io-Cce%T@X>t>xo73$<=K87;tV zPx!#WiSrL}k#^|Rb=4{)HS@mBcg^m$@CrBcdGdEx#AMNtsfEk^1*^?_mz1eC>ofeBWtO~0?u!vcdRueh%w{8CM zCawGnidU)&#!1B_&}DAM!5fs5M7z`L{iB_`X8gXgL_p>L*Qt|(lD0ac+4oqHxsX4e zGZZWe$j%an*oU3EPv}p@4{{K8%zZn7#}jE^lJ9~3>~`>O#Q|$?x}@HhBQKA|yYT~2;lo?j?|Hf&-b{*B@8Yl= zZW(&{J5DY|6TLt_kBbc69V*!8-ql+452hn8k^U&$y)N{azdTyRjV z=w_CsOKm5rAYUXL`cl=P`cS{y2-aq`A77rNa1iJ=l|m4?T-{y{wqgUPe`0K4rz>@` zR{0ma1Hd(%`Vo7K68!QTdFL+z!PEqki;Fx4NhHBhl6PwP>stsYAXADr7!9&FxM5(= zevjhkMg_FP_8`0$CH#`A;>f#ZKe%ngcl!{#akQBju~*M0>a{*YERj%AF#djYCt|5K z+~nlb`~ksIaul&`_rV9olDD67jBW!DXjm5xb`jh^;XAO{ON`iycmBryeB;cGru)Sg zox*CuXr0T;PJtUk0sS_Py0Wz$qnzI9qkL|=FCSJb?ECo}o1631&9Q?t)f3?OAYopP z)T0uSa1C$(m{!6XDFtp;>Y06=#vxfM7Fo+vSNE_d)7s5>Ny_P)3ixUwGzgo>m$a-}yBzYsyJF42ov3b~JKMWavpS`WdvPr9Zb>bs}DGO@HeZQJ{;Lq2@2fn^h26Cv}|6}QCz+l z+dSr1(I0GN0p1?UKhhpTiMg6XtIadWhw@=&!#J275YNP4yd9DMVD{7rm=f@DEfN^L zj48GCR_>4WkDItqD8+Gb)xb|RYuqB0bsL&{c)MZ4_OBoTLalZ*o|1(=v)Y)n#rMfG z+ts2ZVFyemitKCM6=TOhOKlDStuK=?10DHw=P}Q#bs?NiZAfPLqe&3%M%=uei@(KH z@Tdh_+CER(p}~hT8gAM@l2QOUREBxCh-=m3D_dYsz4bE(58QZ#sV3{kNfEByC5v($ z;1+3md#fCu30ijg1&9<}z103Z4%wLLlxr93IuB<`yW*t%tjH`w2aw zVvHH9*OzX7CRS(~RQybQqAtAZJ2z}{-VyU2++&tyP;?Obm`e;vCE~tYvfFVLMr?oD zKW#RnyAmK@V{J@&1W=mnBHwB#;#8iCek& zh=lcU(^_yHAros++DE(X6yvq>cdoC^XL^wwR#L(DXO?*`w^h!)buxlJ>Ll& zQCc2}(X^`X7>VQ1Z9gQp0`9;N6V%qmX0YkAqcC;?f8%@fLS8u%Jn zwF_nEsQ#XJhfZ zE|-6+FY&8P6g%JEI`a44lQDo85w!VfnJ#z~Ks+%I537O$uu-R(`Sm&nXmq{_4sB`jtHZ8%k;9WvS-k14r=cYVkVfrVQM4c0O0o;kA*k8eF=DuBg`N z>wQ(opK4?}ovl`1)IAepV^LeEaI!VFJOUn1LsouGrS;CjLV!=hZ8}CYal-EITx6VV z-!T|k2K#0h44T;*xjSJF&Bf3n{vF=X?)s35!Lk*4k9ATK4Gztc~1+RF1#vR5}4S@I93y?kAiP|9YDc$+ZpXRA^3VAWfDR;{J2r47; zs05}gkn}qh!*$_g(iJ0`K8M)vdF64F-5||d&W8iPa8CxykS9ba!i3U4h%2sJCrwll z!7U1^UOs8%MkO(nW2Mf|%O$T`v#rgu)+(bT4Uxf}1E>E8udgo>)Q?$X_e^r;pAX3| zM@mK7pHHi(PCyL>;HZuritAVVig$S|x1eDH+tFfC&M_ZM|Iu$2UYTEuqLNe zVq70b)3B{cAo?pmX$^y&ZTxCc`nQ zs3bCF?g2*l&dR!unfUIj!M?Y{Q&7l0OI01M#OAln43=*0f)SQ^$;Rtl#uW{r-}IwGcSkQ*=e~sqtc@Vqz5u=j@~N*||D|IuNBi855TWr~9smr6ulhY1!=3!3 zdO<1MQWw{wo^~&b2Vzb>R@cq5LU4viO)H6vbXpy#^1VBt68ykEEbP9^`i_=~qW{$W z;A_YZ4-B4RKEd2GiHwgDZjJ%*Y7@iu-&Q@8ogY1kr+$5p@>a=O=@<%(z%!Gd+r3R` zR=%Cw!VO(1I`VVw$%>Xax-KJP3k)mEy+btpGDk|fHmOF)u}&NjaCqGWFtCHo_^k;N z!Wb^KG_#jF3p`Mp8D#*3ZeYX9HT(Ihq>vCcseOQGw%M!wXxLLXXI2Q$1Vy{b2OO%s zO|agWjL{LW>(~KI;0>#RC!-!s8k$-fy!J?al$3a`{csCKO@b-i&GpLR4G*iwcMz7^ zZZ4jyUCW2eZ%64`tkKV4M#oIlILf`j2M*5w;xW(V)r#GMt_Y_Lzqj-*=AJ=Pn_ zYp3(zfxB-rFsrJSr7L;8P>>7%{1YjXNs)?b+nvKcTiS>}kF|RnhZYCsQHr^=%tLub z4h+gJ9q)cMjhA>h+1YE5)h_P$R@dgiB((q(Q^>YIpqPrL9KOE@0IbuuDRYkD`x{sd z_LjRIceZ6!eO_Pt9QEX~QYYA}I-r(b4Q%vH`YD;-1&qLxKBAcZRHyyy?g^|{+a-MC zPp2}h**itCoCe6PJd)i`4$e*# zXax$H;6;uOiz0k9&TMx2b2wDi2T#U4VM<}?UhjEgW}!XRcga@VZSisNO9zO%Z5;)r zgI%1H?XZ3d225PPpR~JRqV!UkPk^9XoZx}sN*#qPZk{+7e+RK~v}`R3>=d$Bn8`Zg zt1FVx(~4}}o{vH_<1y<_)qWRgjj|nd4Yc8__Tw)1RyL$wQVAhXXNBD4{lODeUowU$ zQHw6@W2%T8-Ey8Q`Byzu%myH6tEoA!4y%w_nX@B(R+%gywePS*#W*J8VmDj-uYfBW z04~f_#cVu2{`i*S$(U8ciq+2n$;hB@MqUC+9LUOzu5@|Xa^V_5SfF!4Z~4R+VrWV7 zuM^S_f5KlP0n+Q7fYFW-wLJusu5&F!^>O4stj=DB?F7E-s-V;6l65uT6Gk`vB<`E_ z$25*GY}gCx65Efx8@0di?QHS2)|!I_zk(w;$CmSq^?CooF=Bhr5clJ1( zyG$*!pUpUpR=e-BtXqIp^l*cVJ*%f>xq8zc;sgc&o?kP6D9O|9)!koQ?Y9nYeLvOw zultar$K@~!**LS7`rN`W?T}ze$#oDZvj{F;n=l9Xn>nq-%lRwPP*=4(IQ4Dc{~ z%U4=1i_%br4T9oGRukHq$5D{t#@&M8eg$} z;x;4Fqz{0P82~vY#ulqx;S+nv4|8vB2(P;XA7F@1p<({dti4Nx>>kmmZ)-aI>Xpo|H5^J zigth#dae}t$cyfLj422X&iB)Ong{z_nW!GIZsd(Q8!s9zEN8(Dlt^H zGK+r3d|k1Ia&MrxuO1?mys@e1WV1*LwO>~i&u};U{$R0O->&a2J4eGrg>1w4W+DGv z5%cAI^e%^5F}P4I04>EOyEXMj4N-{ZZYV9-8uI4pqf}$_J=hoifC3==+8Pw!7zMJR zCx6S;6^`sui8DNMbB3s3&wYP}cM}xaJ!SY8p8Ux2{+7@>?mOn!6Na9_ke$_5t&uy1)FY z>MavTo8<^W+o5YL!tqJ3hOa+j1V@^gQc?pzb?z^_JFb`T3{BFjo)tDJna)SMr?WuW z_<^m=m`H74v}?YS4MdO_SDEc(?BwPY?3954OiIb*Dxqf)bR2wCH?o*L!ZR=?S;FJVpSFpghg}@IzQLb~G^t z_v#JQ*&n6xdv-U*ROIe92W@~V<9qTy{a>Mq6iq;)e3no;&q$xEcQi4sinCy%l=jWv zCHWPN7N1%xT9@DqU`m%-{@d}K&fWf`rJhvzbfl5trv*^5E-EN!>QwJE?8!O=4gzRt z&2@^}or!rH^ERGV1F$<@KRY|7CPnj}n8s6J#(b-2&LW^=Ct0Y{xYAaFytTDeoQG=s z`t0?Ti~w*)@<9B*d-WiAKoG!gfu`2vBR|<(`OT5`&nUFeON}EM$k~e|sjFZfyDn?6<}vI9Cd~ z-BIWwVM96|-rbEDqq`@k!C8>d0as9Sc02qmIIfUiG4lpjknr`Q+UiuTm#%J9`5msZ z(}b4~b~B`KSK_&~pkfR*!QF5s8kB?!}Ix3CxvY)3bjM44IPVKC zaTMSDj2ACdI;twRRx%E$muTotLt99}+A@V;zYY2$G;_M%8JYI)XEnU~5nE)kM|JQf zaniPW)y_I71{^(#r<3FscUM+bb)}&hTd&#a0@W4cXW#H!c8SltV$#smByqTeiO|w4 z*|Gnw|KFX``hUth^LVKH{@=UX$Wkhivb7+)5|e!=VaR&RGIa?d#y%N_6cr^QOBf=O zbu3xOjO#+#$(}3|*|)LIWX5nl!*$Vj++7>$aKBU+C)h4LL&SwAAh=sQK`%z~( zv5zeh<$hB)A%^Rz`fG+##RoN7iO<4He3yo;ZU(J<#VMOV@m&5Qoo>Z3q|-7glgu z843JFi=Go>kMKSeI#=7gUhdgKB2|R<%Njjl_F~TA!3&tBei(LH`KG>@HF)x^#=+(Y ziVYurR&Yvf2CKZcS%IE6gTYw{X=u=PBalrz+a$nf(XFT#s!_%|)m9RmgfWz#CS?VH4hWe1qc8Z<32k07@ z1kL4Sr;IM(paM!`p(hrMEsc!@HcYdjzL1wV9C9N@10ZdtvjNpXGzyA<`tqwzpA#P< zUCtk8RiSLw6Hw?791C^H%?-|6D>Y`hzJnwt(C?DXd2x?fxzB}x^rP$kl=WE?cRw1V*?bS%cW@>A~Zow*T|M(7&$VE`FnA+`Xkn02no%fme zI5Epq&>VnPMkzwjTs1{x<2VZ%mQ=O!>5P#oZ5<>)$tx!^)(yF14eOkAbUuA4wx{P% z6b&h)txigLL(o+k(UmKwkAj!T^@}Ww;ESg8IRYZr&s?(WC2^o6uOkY{Enw= zbGuo6kK>bSJmpRYJl^~lQ{+rHk+!)$cU&4Kf+h<$j4ucaTbi5uKRS~9$N$Vu{?a0U zPlGwFjocZ&v%dbHjjIQETVG!o_0Vw*Y8p95;kpS@}QB&j;Y7 zZ3&9BAAOyzGYOsC{WuN|&g{(0<=(p=lAkC3!uA6T`7?h9jg0!2lQcBdo^wX--m(y1 z`P1Ed`3wMK#`SNnfqtjxo{tst>NI&ebkA$^sztKjn>vxB7Gxkx^TxIh*}2$L@&a^VESl6LSZA|fJyNYvKWzMzTw%K?lA z+m^pK{rQ{5t%1))c_@LAuqnM`wHooMq#4)5+l<-_f=kmkA_s1iYk$5T)LlvQ7{>6E z7U)R3Y4_|5KRGRQ-S402xmh}b_7gq#X&t!vKhtye6fl|inV!2u-zDK^dM+^t9Qc`@ zGf)Kwex~Q%@q+_DLwr5|?avsh7Q=i9tX-n#`u_*&RGfXW_Pq&$&N%#?m|JR>((e@Q z=G_O*{T-hQ%ZeN7UVEmW=aUA`GAP{vsNA$hS>Y}#2k@$M*>7y7e4GbWMnHDe|K~8> z|0PE6|K($^)$F_NXE$4@9OlfuY3(;fZxS!dit}GOp!2ypWdVLBP+)92L1f# znReYUfGuXqg-B!G*f{zLrZLl>ajZEBtbWPguCgZrjSt$xdEFRB@dZ>W4f_pp}XnVX1 zPul4-cRj15K`;Jm-r{x3A2rbBn<<9!=Vg?0NL&j5+WnJY^6c&&wuz1?ZN+>K9hlB+z`gVUK z2Jh(VIft3KQ{5ZEj6(2|*O#JWOYweZ&&$k91y`w)wpXGC9G6C2iE~}02?rk8M=4t% z*HXq;TZ4gvqwgHN)?UGp@M>o@p_T$t9d1=Pk5HySLHSmy3~kS+f{9?4yYmoEm|8yc zwaE(1IasTBr?n^xc-}chUWmI!o<%_>glrXvksi)L_Z0-ZX~PUV&+_p3FQbTcGIgme zrT$C3-c5oDTdURc+jof7v+rtYK-?>5{fwp|^oq~SGC<>8`{tt1sgsB5aa7V-p^9&c zM<_Af<;3c_+&mx{rgDGTxYIT*_>Y5VtWVs-5BIt=o5uz9v&8pHZp3xfoX2M`qvfkd z!HPWOM&~~XElpgnC%z63urFOS+DWaC#n;w&JV~x`g$f^07Qi9N(al1%tqlz1tL`T0 zErE&Px{MYElYYQ%*b0X%k3W<0pGjXbNxZyKmA12WZbabPYFZ~bKImHxeKzTn6)ym} z4CYowzyY*kyJlrk4BT7{lQ%594N&!<`txgCnqJ;6$%uPjx>PD9deqLod8op7h{P?` z5wkk)J#~Gupkh==KhVnAFgWNjHp{khtpj^U9xp65-D_&JIFgOQ=_5yrWxl_564LW` zSam@JSg+=Cz+smJrCqn~TG&XFUBQHY_^PI)Kl zi*?XMo3v(`+y#-h*M;)2D9{m+j1rM5p>Q65>Jt78h$vK58b2+Zz zOs8Lpn5NR5U$W!$!Q$ipdUYkc8}Rv ze;|0)1+fGabc9Yl(2e`%kB%p>LZ7mL zyBN?DNV)3V5{&kI%(2}?nM$wMnK`6>eU%0JI7Awdg`7)LHPWRuztv*9$@t^10nE?3 zKi$yc{(xNoI=}Od>=dYpYAa^axuA)r?99Nr!@}z`gLx$s>MhV+#sH*cL|CsyN>A)KV`}nYS-aQ373m{wSVk zdtc|v$mm#=Y3JFJRh6kk`wNUM68c#*kw`wxc9rN0dh%O9j;sn$KVK83Z5|NIUJpMc zUY*fjb#t^XCCN00yvCC4e7XQNk z&IY(sh6oN|1Eo!_tCxhDPdcZRa3I%b1SQa;6YTO9%-pZjoiaEj>_jKa-H6c?CS^tR zRpsm~-upr>-@ZRWt6eRp+~8N-a9+V3!+N#VHlk4^`4aI&dGB)5*$=%m;VLtZ6GLu0}@2JQb6?NnJBx3g{r6UBbnQE4HpJZ>tmQ4gubvyh3iyjvA)6W z^KL3sfArYQLN!@S~78+_exWUAL^e!D1t3SK#e>3HjjN6nR?uaqW) zSNVr^e;ahl9+cP^Jdc=pRqDM;tRkx%KFlu;8*^U>2&43_s>X-xXEcAzeGx*aM@fmS zexveb=>8M-Xd1e4mRHf&eT3pzHQ#th#hpK+(b)S4aX4$97cnfdllHP4m4LNNYg*Mp15o<&@JZLAbw@BS}k-BysBUB}KhEqN~Yg4;A zOz}EMnKiGh_tmEr&d#r}USp+c6|Vm@Kp77s2>XM#zLzD~`c=_ZNs3Fab~u-sTX+@j zh2BYjSl1n~EI;=`ktixEiKw0%fd4L%opLU$izIV{JSsH_RAP$YgzaNUKLt-DzMy^4 zOAkw)Fi5%bG3OqbubyZN{J5gC&|(dDJ^w^icFtM8?2f!q>w8KC3z5saP9WBj()CQH=7n~Nn-C_GW zHh20_HdxW^F;WG>Y=+Psy}nLFvxccfO3A)$(vTVGX2l}`1R4MrJzXZgyv>7DiDDTE zDjQ#y`mN!L zb{<|hft=e2XNB*MX|}$7eSR`kQmBC#zDdIx8c8v8m^P+6v2)-L zTgwoSzB!|bT5J18!y?%Bk4Dv??~#zKmmmZ=H;_-OITzURS`mTA<{1qH3dI2)B4^g+XhD=4J_2^8|w7#DS;J zcW0w;rTqkh8XA~SMh>Q(?Wq0%*v_=FRaL$2^H<`QHYR7|rqN^qP+P^ttmr7MWOm5A zD&p@?L>3bdXT)Q2j9^$^uCKm- zQ?y5keScp_#lRxHQUR*-YHU^Ujap)S`8@D1do#43J(I#W1VK$|Hb@WCQi71cL49YY zdg#PiT|o@9@`*CP5iS$EQaR9r7+X~%K9|BD-Xsr(WV@#(lWI&wtf1prp&v?CQ73Pg znDW52M5!BR0JSch;@wfDPk_09sU=BFS_o!T)b```cj zahmeQ7BL9|MiImZ|3h>Lu^`eSmD~HvFiF5#OLu96&lCDAF|e6p_3z0eP_DV{JXyZJ zHQp^c0=#JkhNE<0n=0diyg!v~(wjssCdk{~EH^^XCz8LPb#-45(sn|_4zT#@_`;t&27BHoK;PR)=kY*a&)ESiTXLY)$ z5kJ$jyjr8gILm5#M0%U=>~4tYPXV8LB3m_mp4)qWH`2i131ln&*V04J_l@=2`e#j2 zH;(g5Us%(1j7|mm(xAyj-w+ty3p8O?|Dky~_zvf64p^vUc*DniunxEBFl(iaj5~TN zX0sI1Qu~xX;Rig_!MeKc7Pr~Wk6Gr(^rOAk9AC7ho!Y+049-4KaNuClhN@TP&+505 zW+zqHL)y4s%U=#&&!pdMTx+l&>^Uqk>8+vlar>UJDbCK8${Dk!*T z&<%&fX`JU+U!S?Gc_%eg<;+ChBXE&gMua3gr)6-Ov>3*xaY@5!K6|O@;FZ0rmT~If z5`k!KUMB6o$3wu+)RH-T_jr$wU)~KLdi-Jm`+TcyVLT(I1)%3ZCyxFN50DqS4E7~8 zTsiD|e9-5`Gl2-TN(ja*!^z4&4p0Ah1~pntkx;Z7T^cFr5M35&wmQb>AU!G}a6|8o zJ_`zZmtsjU*gu8{l%t337!DgfOm2XnX9GczEo_yv;k2owy>}fDUXd7D=&S`NfEH4i zU>s#vhyH=q`4vNr6sTVksF!jvOomIX3LE`N0$tYvW7)G~(T*HUKuc)On|_cX@FeF+ z_+ZJN^jNdlIM}7PJKaYNJuid2_Oz!NdY+yB-D<;Ti$iHiN&jVC{-bkjVW#G+g+hX9 zQ~3HIuji3ab1!@PLmw=Qk{5vh8|^XMneoK^8$#$-kqIp?1r(dyZpee-fT*mjc}5cC z_r7)^VP+Kcec{;eaqLXHM)c3Oipa~$7fov~ z8bY}ga;pD**!g3`$`(6@=3uNL9vvz2dU|?r{N_8vlNC;50l*dqHuoLn-wrK|is)%}NU+7< z8vAYJP2uKf7~J939C?9$YsN`Uftt;!WQR!t9u+`5^4$=ci^(hrIaEg(5BLW@E+pK8 z)GD>JIMZeCL*JI+0g}T_KwMn>UVr}U{H;!@} za_o4pvRYEUGuRm37AYPTxrqSaj) z9|1RSVq+pH>pX;@JACcQ5Pqfm?|Z_rpGz%?t{5Ej_!>~;j*97K&KV|+yb#0GTvyYOQdVFFv{S7+S8p4$F2Dv=TG1l=qcASRm4^#%mc`hk zdj^@A_4(%dX<(MG3}%o*hDpcAv>qK|tD20r&Kg=es=7KjJug)~6Pziod7F@MWu~ii z;H0IE2xE(_qVAwmXHy%c73TgD3#4u_aaesXHza17ncjX52z^z%zt#@XAGNCVNY7tP z^Pl3*qd*)j3T-w+T&=-EBv>b}(XB2IWeG(PMo0_Z9fSDqI~9o9OXhu^JdHQ_E-J*$ z4}WG9?{&~ga+51%+-_!diVX}+8azId&$pQ!%shuQo=UnY+1q=u^~x2rb-`egzF}d^ z!{Dab(0P81m7`2`I3^n=Y7@6pcEA$O?sz2^ky{&ul%m|{%-aIrwcf+B7Bie^aK(&3W^k(rb4ruN3{KT z{_x>GLYVmZ@qJ?t{;~i09TO|_w}W6QGtZ*wwZg_^Xy^f6t1_1|&#zb_4wF%c@3LvQ zdGUMBa&Lbg@RNGf5>A02h6v+mrPU>`i5~B%nkA2`W(eXa?ML`SHEWY%AFIcnRaHp@ z&IpevK|xy3a?xPN8&=1Zd(6ETy*HUpmLblVo#F0#AK97p+h#^9=J|PM zv^IDrvHz0W&0OCWqB!_54~p*J5-|H9vx9^@KK|x~82B}!+^5N`aVN3Mymdc*+&_QU ze8kh$uQeWHc9ie(1wn_1R^LG-An`M*b0yc4Aba#Hi)(@Y^H+Cq4Oi~W7;p4pFf|!2 zKxX_|LXEx3#4JKTU`sm5_8n(YgB}95%r(faSKF@zb{E@R1}p zbQz*p^0zel$ivQglr^+pG4ym*Rn@0pfwq>GZvIV>I|5narr2@%XxV@$aq`NKqT8Ul zFxF)MC_d$gXHv4|2MX5x*T_4RWdH5Z!za>Cscg-aodFAaB|2{f=(^~KKM9_J1UVD) zY=`HHU<`pX2qDNNS-Jl9$W6uE0U!nZ zf8X5MxL8_F&H|TT+Vd_;NJuDE6?TWz*BEH;UcIuNj-p4m)&8j@&3@=KShTxTK#&BA z%ik4weL_{)lj^T#T!~Af&{vK*B1sD)PCPd8(K!ZpX_pgCvsq$e(;}jxIy<&MosN8X zKw~YYJ-Oo32Nk%p0&>BKcWZVUX2zAGR6zMWc3!=lqbAJPGU92=tym%4{k48KS6$kB zgHwdd&xerdkdl7U(ZG2(U%hMBq-C<@=d15Kj5lz-f}d209FVds+%lHnIr8LRExC4o zx(?Xz;G7!94ma#xLA3eYr5Eyf$VbX6MPV%=$V$;~>PvR@IaGX<%63B#T}@DpYgIbL zNhIZMcBU zexRnc?vXN6Qz~=`{&-g`k^%khlWlTB!ho|;WN!4=oE(&}-JWsuDH;E5pvrqX@U3+t ztE`D4m5+7Lp3a!DjZW3oX=s-n!5O{(*ryTM+kt1?zi0jwk~MC67K=$qVL;x*_mvO! zmwQca8n?Q5mNCT~!tFhPDd9Atpw;&hNR^rO+3tdB>N~4ToSDI?=aE=L6ADLiT$$oQ zPB8d)Ok>6HY)9(Cf(CPFR)tbus!jli|ASJ`yb);nv{YCT`*PoHZC{jCRpTfSTLC@A znS;PFzR=tunW;8Y=vrfAVQW2bhe$Wr3{QEO-6P=c*7<8QHXx@C^oBWLOuRZq@uwnG` z?Cuec%y%Q40paqPH1{UQEu^S?5>>aV=$i!@ahVb=*!A*4qcdLbOZx5RQzF~VGWlH( lih+;qPxr*+|Mc(9z8jDpFW1u-x9MM`rw!FA)VTHVe*p4T^iu!; literal 57275 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 z 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 diff --git a/docs/native-launcher.md b/docs/native-launcher.md index 7cc1d486..fa100440 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -8,10 +8,12 @@ AutoPlug targets Java 9 or later. Minecraft runs in a separate JVM selected from Enable the existing system-tray option in AutoPlug's general configuration and click the tray icon to open the dashboard. Closing the window hides it; it does not stop AutoPlug or its running worlds. When the operating system has no system tray, the dashboard opens as a normal window. -1. In **Profiles**, create a client profile with type `MODS`, a Minecraft version and a loader. A vanilla client also uses the `MODS` type, with loader `VANILLA` and an empty collection. +The header names the current tab, and common actions have icons with text or accessible labels. Long operations show their current step and animated progress; downloads report measured byte progress when a total is known. The current source URL can be selected and copied, and **Activity details** keeps a copyable history of steps and download sources. Download URLs also appear in logs with sensitive credentials redacted. Settings keeps account and sharing controls visible in two compact columns; **Advanced** expands optional runtime overrides. + +1. **Profiles** starts with a playable `Default (VANILLA)` client and a matching `Default` server profile. Defaults use the configured Minecraft version, initially `1.21.1`, and do not download the game until needed. An existing usable default preference is preserved; a template or pending migration is replaced as the launch default without changing that profile. Version-specific defaults are reused rather than retargeting an existing profile. Create additional client profiles with type `MODS`, a Minecraft version and a loader. Vanilla also uses `MODS`, with loader `VANILLA` and an empty collection. 2. Add mod or plugin JARs to the profile's collection directory, available through **Open folder**, or use `.profiles add` below. Provider identities in `collection.json` allow version-aware update checks; `.profiles add --modrinth` records a Modrinth project ID or slug. 3. In **Settings**, select an offline player name or sign in with Microsoft. Configure runtime overrides only if automatic selection is unsuitable. -4. Use **Launch client**, or select a server in **Server Browser** and choose a compatible client profile. The browser shows Minecraft version, MOTD, player count and latency through AutoPlug's existing status ping. A server's reported version is not proof that every installed mod will be compatible; review the selected loader and collection. +4. Use **Launch client**, or select a server in **Server Browser** and choose a compatible client profile. If no client profiles exist, the dashboard prepares defaults before continuing. The browser shows Minecraft version, MOTD, player count and latency through AutoPlug's existing status ping. A server's reported version is not proof that every installed mod will be compatible; review the selected loader and collection. The browser imports favorites from the standard Minecraft `servers.dat` when the dashboard starts. Importing reads the vanilla file and keeps AutoPlug favorites separately; it does not rewrite the vanilla file. Favorites can also be added through the dashboard or CLI. @@ -27,10 +29,16 @@ These previews render the actual Swing components in the default light theme wit ![Worlds dashboard with fixture singleplayer saves and managed worlds](images/native-launcher/worlds.png) -**Settings:** runtime overrides, default profile, sharing preference and account controls. +**Settings:** default profile, sharing preference and account controls, with runtime overrides under **Advanced**. ![Settings dashboard with an offline fixture account and empty Microsoft application ID](images/native-launcher/settings.png) +**Server Browser:** action icons retain labels or accessible tooltips. + +![Server Browser with fixture favorites and action icons](images/native-launcher/server-browser.png) + +Additional settings previews show the [dark theme](images/native-launcher/settings-dark.png) and [compact 950 × 620 layout](images/native-launcher/settings-compact.png). + ## Profiles and migration | Type | Purpose | Collection folder | @@ -106,11 +114,15 @@ Use the first command in a running AutoPlug console to keep sign-in within that ## Existing singleplayer saves -**Worlds** scans `saves/` in the standard Minecraft directory: `%APPDATA%/.minecraft` on Windows, `~/Library/Application Support/minecraft` on macOS, and `~/.minecraft` on Linux. It reads each save's `level.dat` for its name and recorded Minecraft version and uses `icon.png` when available. Refresh rescans the folder. Discovery does not copy, convert, rename or rewrite saves; malformed or linked entries are skipped with a diagnostic. +**Worlds** scans `saves/` in the standard Minecraft directory: `%APPDATA%/.minecraft` on Windows, `~/Library/Application Support/minecraft` on macOS, and `~/.minecraft` on Linux. Its bounded `level.dat` reader exposes name, recorded version, modded status, last-played time, enabled datapacks, cheats and hardcore settings. Cards also show a validated `icon.png`, save size and Quick Play eligibility where known. Size scanning does not follow links and stops at its entry, depth or time budget; an incomplete size is labeled **At least**. Datapack display is capped. Refresh rescans the folder. Discovery does not copy, convert, rename or rewrite saves; malformed or linked entries are skipped with a diagnostic. Choose **Launch** on a singleplayer card to open the original save using Vanilla Minecraft and the account selected in Settings. The recorded game version is preserved, including the exact pre-release or release-candidate build. A save with no recorded version requires you to choose its original version explicitly; AutoPlug never chooses an upgrade automatically. Saves marked as modded must be opened using their original modded setup to preserve their contents. -When the publisher's version metadata supports singleplayer Quick Play (Minecraft 1.20 and later), AutoPlug passes the save folder name directly to Minecraft. Older versions open the matching game and show instructions to choose the save from **Singleplayer**. Launching a save allows Minecraft to write its normal save, options and log files in the original game directory. Back up important saves before playing. AutoPlug serializes its launches in that shared directory and leaves Minecraft's own world locking in place. +When the publisher's version metadata advertises singleplayer Quick Play, AutoPlug passes the save folder name directly to Minecraft. For supported pre-Quick-Play versions with Mojang client mappings (1.14 onward), a bundled Java 8 startup helper resolves the exact version's native world-entry methods. The older releases **1.7.10, 1.8.9, 1.12.2 and 1.13.2** use bundled adapters pinned to the original client JAR's SHA-1; those adapters were checked against original JAR bytecode and MCP mappings. Other pre-mapping builds, or unsupported mapping layouts, fail with an explicit compatibility error. This does not claim support for every historical snapshot. + +The helper schedules Minecraft's normal integrated-world loading flow on the game thread, preserving the original game folder and the save's display name. It does not invent unsupported command-line flags, convert the save to a dedicated server or bypass account authentication. A launch status confirms that the game was started with automatic entry configured; it does not prove that world loading completed. Helper validation failures and timeouts are logged. Launching allows Minecraft to write its normal save, options and log files in the original game directory. Back up important saves before playing. AutoPlug serializes its launches in that shared directory and leaves Minecraft's own world locking in place. + +Preparing a local launch registers a stable `world-` ownership entry under AutoPlug's data root. This entry contains only a reference to the validated original save; it does not move or copy its contents. Repeated launches reuse the same entry and do not add duplicate cards. Existing `local:` command aliases continue to work after the displayed ID becomes `world-`. The CLI uses the same discovered IDs and version checks: @@ -124,7 +136,7 @@ Use `--version` only to supply a missing original version; an override that diff ## Managed worlds and sharing -In **Worlds**, create a managed world with a server profile and a playable client profile. They must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available. +In **Worlds**, create a managed world with a server profile and a playable client profile. Matching defaults are prepared when needed; they do not accept the server EULA. The profiles must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available, and the bounded save metadata appears after the world has a readable `level.dat`. Read and accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for the world before launching it. AutoPlug does not silently accept it during profile creation or server installation. The CLI flag below records that explicit choice: @@ -161,6 +173,7 @@ The default data root is `~/.autoplug`, where `~` means the operating-system use | `profiles//` | Profile identity, collection metadata, configuration and mod/plugin collection | | `worlds//world.json` | World identity, profile references and recorded EULA choice | | `worlds//server/` | Dedicated server files, world saves and `autoplug-server.log` | +| `worlds/world-/local-world.json` | Metadata-only ownership reference to an existing singleplayer save; its files remain in Minecraft's original `saves/` directory | | `cache/` | Shared game downloads, libraries, assets, installer artifacts, content-addressed JARs and runtimes | | `servers.json` | AutoPlug server favorites | | `settings.json` | Launcher preferences and account selection | @@ -171,12 +184,14 @@ Artifacts use hard links when possible, with symbolic-link or copy fallback. Aut ## Verification and optional live smoke checks -The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. +The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, defaults, bounded world metadata, ownership references and CLI aliases, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. Dashboard tests cover progress and concurrent downloads; fixture previews check light and dark layouts at 1200 × 820 and 950 × 620. + +Legacy automatic entry is checked with exact-version mapping fixtures, forked contract clients and original client-bytecode inspection. These checks verify method contracts and scheduling but do not establish successful interactive Minecraft gameplay. Full game loading and play were not verified in the implementation environment; unsupported historical builds are not presented as tested. From a checkout with Maven and a suitable JDK, run: ```text -mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,LauncherCommandsTest,LocalClientLifecycleTest,MinecraftLauncherTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,LocalWorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test +mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,LauncherDefaultsTest,LauncherCommandsTest,LocalClientLifecycleTest,MinecraftLauncherTest,LegacyWorldLaunchTest,DownloadProgressTest,LegacyDownloadProgressTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,LocalWorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test mvn -DskipTests package ``` diff --git a/pom.xml b/pom.xml index f0521ae4..9994694c 100644 --- a/pom.xml +++ b/pom.xml @@ -355,6 +355,24 @@ AUTO-GENERATED FILE, CHANGES SHOULD BE DONE IN ./JPM.java or ./src/main/java//JP 9 9 + + + default-compile + com/osiris/autoplug/legacy/** + + + legacy-world-helper + compile + compile + + 8 + 8 + 8 + com/osiris/autoplug/legacy/** + false + + + org.apache.maven.plugins diff --git a/src/main/java/JPM.java b/src/main/java/JPM.java index 499a666a..c2dd5f7b 100644 --- a/src/main/java/JPM.java +++ b/src/main/java/JPM.java @@ -110,6 +110,17 @@ public ThisProject(List args) throws Exception { // Add custom plugins plugins.add(new AutoPlugPropertiesPlugin()); + // Minecraft 1.16.5 runs on Java 8. Only this dependency-free startup + // helper targets Java 8; the launcher itself retains its Java 9 floor. + CompilerPlugin.get.onBeforeToXML(details -> { + details.addExecution("default-compile", null).putConfiguration("excludes exclude", "com/osiris/autoplug/legacy/**"); + Execution helper = details.addExecution("legacy-world-helper", "compile").addGoal("compile"); + helper.putConfiguration("release", "8"); + helper.putConfiguration("source", "8"); + helper.putConfiguration("target", "8"); + helper.putConfiguration("includes include", "com/osiris/autoplug/legacy/**"); + helper.putConfiguration("useIncrementalCompilation", "false"); + }); // Execute build File cwd = new File(System.getProperty("user.dir")); diff --git a/src/main/java/com/osiris/autoplug/client/launcher/DownloadProgress.java b/src/main/java/com/osiris/autoplug/client/launcher/DownloadProgress.java new file mode 100644 index 00000000..6e7fb3d8 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/DownloadProgress.java @@ -0,0 +1,158 @@ +package com.osiris.autoplug.client.launcher; + +import com.osiris.jlib.logger.AL; + +import java.net.URI; +import java.net.URLDecoder; +import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Download telemetry shared by launcher workers and the existing updater tasks. */ +public final class DownloadProgress { + private static final CopyOnWriteArrayList> LISTENERS = new CopyOnWriteArrayList<>(); + private static final AtomicLong NEXT_ID = new AtomicLong(); + private static final AtomicInteger ACTIVE = new AtomicInteger(); + private static final Pattern URL = Pattern.compile("https?://[^\\s<>\"']+", Pattern.CASE_INSENSITIVE); + + private DownloadProgress() { } + + /** Events can arrive on parallel download workers. Subscribers must marshal UI work to the EDT. */ + public static AutoCloseable subscribe(Consumer listener) { + LISTENERS.add(listener); + return () -> LISTENERS.remove(listener); + } + + public static Transfer begin(String description, String url) { + Transfer transfer = new Transfer(description, url); + log(transfer.message + " from " + transfer.sourceUrl); + transfer.emit(0, -1, false); + return transfer; + } + + /** Forward URLs printed by official loader subprocesses, which perform their own downloads. */ + public static String installerOutput(String line) { + String safe = sanitizeUrls(line); + Matcher urls = URL.matcher(line); + String lastSource = null; + while (urls.find()) { + lastSource = sourceUrl(urls.group()); + log("Loader source: " + lastSource); + publish(safe, lastSource, -1, -1, false, false, 0); + } + if (lastSource == null) publish(safe, null, -1, -1, false, false, 0); + return safe; + } + + public static String sanitizeUrls(String text) { + Matcher urls = URL.matcher(text == null ? "" : text); + StringBuffer safe = new StringBuffer(); + while (urls.find()) urls.appendReplacement(safe, Matcher.quoteReplacement(sourceUrl(urls.group()))); + urls.appendTail(safe); + return safe.toString(); + } + + /** Retain useful source paths/query filters without exposing signed links or embedded credentials. */ + public static String sourceUrl(String url) { + try { + URI uri = new URI(url); + if (!("http".equalsIgnoreCase(uri.getScheme()) || "https".equalsIgnoreCase(uri.getScheme())) + || uri.getRawAuthority() == null) return "[invalid source URL]"; + String authority = uri.getRawAuthority(); + int credentials = authority.lastIndexOf('@'); + if (credentials >= 0) authority = "[redacted]@" + authority.substring(credentials + 1); + StringBuilder safe = new StringBuilder(uri.getScheme()).append("://").append(authority); + if (uri.getRawPath() != null) safe.append(uri.getRawPath()); + String query = uri.getRawQuery(); + if (query != null) { + safe.append('?'); + String[] parameters = query.split("&", -1); + for (int i = 0; i < parameters.length; i++) { + if (i > 0) safe.append('&'); + String parameter = parameters[i]; + int equals = parameter.indexOf('='); + String name = equals < 0 ? parameter : parameter.substring(0, equals); + String key = URLDecoder.decode(name, "UTF-8").toLowerCase(Locale.ROOT).replaceAll("[^a-z0-9]", ""); + boolean sensitive = key.contains("token") || key.contains("password") || key.contains("secret") + || key.contains("credential") || key.contains("signature") || key.contains("apikey") + || key.equals("key") || key.equals("auth") || key.equals("authorization") + || key.equals("code") || key.equals("sig") || key.equals("ticket") || key.equals("policy") + || key.equals("jwt") || key.equals("session") || key.equals("sessionid") || key.equals("cookie") + || key.equals("keypairid"); + safe.append(sensitive ? name + "=[redacted]" : parameter); + } + } + // Fragments are not sent to the server and can carry OAuth tokens. + if (uri.getRawFragment() != null) safe.append("#[redacted]"); + return safe.toString(); + } catch (Exception ignored) { return "[invalid source URL]"; } + } + + private static synchronized void publish(String message, String sourceUrl, long downloadedBytes, long totalBytes, + boolean complete, boolean finished, long transferId) { + // Snapshot the count at dispatch, not earlier on another worker, so queued events cannot restore stale counts. + Event event = new Event(message, sourceUrl, downloadedBytes, totalBytes, complete, finished, transferId); + for (Consumer listener : LISTENERS) { + try { listener.accept(event); } + catch (RuntimeException ignored) { /* A closed view must not fail a download. */ } + } + } + + private static void log(String message) { + // Downloads are also used before Main starts the application logger (and by standalone tools). + synchronized (AL.class) { + if (AL.isStarted && AL.STRIPPED_OUT != null) AL.info(message); + else System.out.println(message); + } + } + + public static final class Event { + public final String message, sourceUrl; + public final long downloadedBytes, totalBytes; + /** Stable per-transfer ID; zero denotes installer-owned work with no byte counters. */ + public final long transferId; + public final int activeTransfers; + public final boolean complete, finished; + private Event(String message, String sourceUrl, long downloadedBytes, long totalBytes, boolean complete, boolean finished, long transferId) { + this.message = message; this.sourceUrl = sourceUrl; this.downloadedBytes = downloadedBytes; + this.totalBytes = totalBytes; this.complete = complete; this.finished = finished; + this.transferId = transferId; this.activeTransfers = ACTIVE.get(); + } + } + + public static final class Transfer implements AutoCloseable { + private final String message, sourceUrl; + private final long id = NEXT_ID.incrementAndGet(); + private final AtomicBoolean finished = new AtomicBoolean(); + private long lastUpdate; + private Transfer(String message, String url) { + this.message = sanitizeUrls(message); this.sourceUrl = sourceUrl(url); + ACTIVE.incrementAndGet(); + } + public void update(long downloaded, long total) { + long now = System.nanoTime(); + if (now - lastUpdate >= 150_000_000L) { lastUpdate = now; emit(downloaded, total, false); } + } + public void complete(long downloaded, long total) { + if (finished.compareAndSet(false, true)) { ACTIVE.decrementAndGet(); emit(downloaded, total, true); } + } + @Override public void close() { + if (finished.compareAndSet(false, true)) { ACTIVE.decrementAndGet(); emit(-1, -1, false); } + } + public void redirect(String url) { + String redirected = sourceUrl(url); + if (!redirected.equals(sourceUrl)) { + log("Download redirected to " + redirected); + publish("Download redirected", redirected, 0, -1, false, false, id); + } + } + private void emit(long downloaded, long total, boolean complete) { + publish(message, sourceUrl, downloaded, total, complete, finished.get(), id); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java index 1cec1892..18a2faf8 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java @@ -28,13 +28,25 @@ final class LauncherFiles { private LauncherFiles() { } static JsonObject json(String url) throws IOException { try { return JsonParser.parseString(text(url)).getAsJsonObject(); } - catch (RuntimeException e) { throw new IOException("Invalid JSON metadata from " + url, e); } + catch (RuntimeException e) { throw new IOException("Invalid JSON metadata from " + DownloadProgress.sourceUrl(url), e); } } static String text(String url) throws IOException { - try (Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { - if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + url); - if (response.body().contentLength() > 32 * 1024 * 1024) throw new IOException("Metadata too large: " + url); - return response.body().string(); + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Fetching metadata", url); + Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { + transfer.redirect(response.request().url().toString()); + if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + DownloadProgress.sourceUrl(url)); + if (response.body().contentLength() > 32 * 1024 * 1024) throw new IOException("Metadata too large: " + DownloadProgress.sourceUrl(url)); + try (InputStream in = response.body().byteStream(); java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream()) { + byte[] buffer = new byte[8192]; int count; long total = 0; + while ((count = in.read(buffer)) != -1) { + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); + total += count; + if (total > 32 * 1024 * 1024) throw new IOException("Metadata too large: " + DownloadProgress.sourceUrl(url)); + out.write(buffer, 0, count); transfer.update(total, response.body().contentLength()); + } + transfer.complete(total, response.body().contentLength()); + return new String(out.toByteArray(), StandardCharsets.UTF_8); + } } } static Path child(Path root, String relative) throws IOException { @@ -72,24 +84,30 @@ private static Path downloadLocked(String url, Path destination, String sha1, lo if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); Files.createDirectories(destination.getParent()); Path temporary = Files.createTempFile(destination.getParent(), ".download-", ".part"); - progress.accept("Downloading " + destination.getFileName()); - try { + String description = "Downloading " + destination.getFileName(); + DownloadProgress.Transfer transfer = DownloadProgress.begin(description, url); + long total = 0, expected = size; + try (DownloadProgress.Transfer ignored = transfer) { + if (progress != null) progress.accept(description + " from " + DownloadProgress.sourceUrl(url)); try (Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { - if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + url); + transfer.redirect(response.request().url().toString()); + if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + DownloadProgress.sourceUrl(url)); + if (expected < 0) expected = response.body().contentLength(); try (InputStream in = response.body().byteStream(); OutputStream out = Files.newOutputStream(temporary)) { byte[] buffer = new byte[65536]; int count; - long total = 0; while ((count = in.read(buffer)) != -1) { if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); total += count; if (size >= 0 && total > size) throw new IOException("Unexpected download size: " + destination.getFileName()); out.write(buffer, 0, count); + transfer.update(total, expected); } } } if (!valid(temporary, sha1, size)) throw new IOException("Checksum or length mismatch: " + destination.getFileName()); move(temporary, destination); + transfer.complete(total, expected); return destination; } finally { Files.deleteIfExists(temporary); } } diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunch.java b/src/main/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunch.java new file mode 100644 index 00000000..54bed681 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunch.java @@ -0,0 +1,163 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonObject; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.HashMap; +import java.util.Arrays; +import java.util.Map; +import java.util.Properties; +import java.util.function.Consumer; +import java.util.jar.Attributes; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Adapts exact publisher mappings to vanilla's integrated-world entry API. */ +final class LegacyWorldLaunch { + static final String AGENT = "com/osiris/autoplug/legacy/LegacyWorldAgent.class"; + final Path agent; + final Path configuration; + + private LegacyWorldLaunch(Path agent, Path configuration) { this.agent = agent; this.configuration = configuration; } + + static LegacyWorldLaunch prepare(Path cache, JsonObject metadata, LaunchRequest request, Consumer progress) throws IOException { + if (!"VANILLA".equals(request.loader)) + throw new IOException("Legacy automatic world entry requires the original vanilla game; modded saves must use their matching modded setup."); + JsonObject downloads = metadata.getAsJsonObject("downloads"); + progress.accept("Preparing automatic entry for the selected legacy world"); + Properties names; + if (downloads != null && downloads.has("client_mappings")) { + JsonObject descriptor = downloads.getAsJsonObject("client_mappings"); + Path mapping = cache.resolve("versions").resolve(LaunchRequest.safeVersion(request.version)).resolve("client-mappings.txt"); + LauncherFiles.download(descriptor.get("url").getAsString(), mapping, + descriptor.get("sha1").getAsString(), descriptor.get("size").getAsLong(), progress); + if (Files.size(mapping) > 32 * 1024 * 1024) throw new IOException("Minecraft mapping file exceeds the supported size."); + names = resolve(new String(Files.readAllBytes(mapping), StandardCharsets.UTF_8)); + } else { + names = bundled(request.version, downloads == null || !downloads.has("client") ? "" : downloads.getAsJsonObject("client").get("sha1").getAsString()); + } + names.setProperty("world", request.singleplayerWorld); + names.setProperty("gameDir", request.gameDir.toString()); + Path agent = packageAgent(cache.resolve("legacy-world-helper")); + Path directory = request.gameDir.resolve(".autoplug"); + Files.createDirectories(directory); + Path configuration = Files.createTempFile(directory, "legacy-world-", ".properties"); + try { + AccountStore.restrict(configuration); + try (OutputStream output = Files.newOutputStream(configuration)) { names.store(output, "AutoPlug exact-version world entry"); } + return new LegacyWorldLaunch(agent, configuration); + } catch (IOException failure) { Files.deleteIfExists(configuration); throw failure; } + } + + String argument() { return "-javaagent:" + agent + "=" + configuration; } + + static Properties bundled(String version, String clientSha1) throws IOException { + Properties result = new Properties(); + try (InputStream input = LegacyWorldLaunch.class.getResourceAsStream("/launcher/legacy/" + LaunchRequest.safeVersion(version) + ".properties")) { + if (input == null) throw new IOException("No verified automatic world-entry adapter is available for Minecraft " + version + "."); + result.load(input); + } + if (!clientSha1.equals(result.getProperty("clientSha1"))) throw new IOException("The legacy Minecraft client differs from the verified adapter."); + return result; + } + + static Properties resolve(String mappings) throws IOException { + Map classes = new HashMap<>(); + Map> members = new HashMap<>(); + Pattern classLine = Pattern.compile("^([^ #].*) -> ([^ ]+):$"); + Pattern methodLine = Pattern.compile("^\\s+(?:\\d+:\\d+:)?[^ ]+ ([^ (]+\\([^)]*\\))(?::\\d+(?::\\d+)?)? -> ([^ ]+)$"); + Pattern fieldLine = Pattern.compile("^\\s+[^ ]+ ([^ ()]+) -> ([^ ]+)$"); + String owner = null; + for (String line : mappings.split("\\r?\\n")) { + Matcher type = classLine.matcher(line); + if (type.matches()) { owner = type.group(1); classes.put(owner, type.group(2)); members.put(owner, new HashMap<>()); } + else if (owner != null) { + Matcher method = methodLine.matcher(line), field = fieldLine.matcher(line); + if (method.matches()) members.get(owner).put(method.group(1), method.group(2)); + else if (field.matches()) members.get(owner).put(field.group(1), field.group(2)); + } + } + String minecraft = "net.minecraft.client.Minecraft"; + Map client = members.get(minecraft); + if (client == null) throw new IOException("Publisher mappings do not contain the vanilla Minecraft client."); + Properties result = new Properties(); + require(result, "minecraft", classes.get(minecraft)); + require(result, "title", classes.get("net.minecraft.client.gui.screens.TitleScreen")); + require(result, "instance", client.get("getInstance()")); + require(result, "screen", client.get("screen")); + require(result, "overlay", client.get("getOverlay()")); + if (client.containsKey("loadLevel(java.lang.String)")) { + require(result, "load", client.get("loadLevel(java.lang.String)")); + } else if (client.containsKey("selectLevel(java.lang.String,java.lang.String,net.minecraft.world.level.LevelSettings)")) { + require(result, "load", client.get("selectLevel(java.lang.String,java.lang.String,net.minecraft.world.level.LevelSettings)")); + require(result, "levelSource", client.get("getLevelSource()")); + require(result, "settingsType", classes.get("net.minecraft.world.level.LevelSettings")); + Map storage = members.get("net.minecraft.world.level.storage.LevelStorageSource"); + Map summary = members.get("net.minecraft.world.level.storage.LevelSummary"); + require(result, "levelList", storage == null ? null : storage.get("getLevelList()")); + require(result, "levelExists", storage == null ? null : storage.get("levelExists(java.lang.String)")); + require(result, "levelId", summary == null ? null : summary.get("getLevelId()")); + require(result, "levelName", summary == null ? null : summary.get("getLevelName()")); + } else { + require(result, "flows", client.get("createWorldOpenFlows()")); + Map flows = members.get("net.minecraft.client.gui.screens.worldselection.WorldOpenFlows"); + if (flows != null && flows.containsKey("loadLevel(java.lang.String)")) { + require(result, "load", flows.get("loadLevel(java.lang.String)")); + } else { + require(result, "load", flows == null ? null : flows.get("loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String)")); + require(result, "screenType", classes.get("net.minecraft.client.gui.screens.Screen")); + } + } + return result; + } + + private static void require(Properties result, String key, String value) throws IOException { + if (value == null || value.isEmpty()) throw new IOException("This Minecraft mapping does not expose the supported automatic world entry API (" + key + ")."); + result.setProperty(key, value); + } + + static Path packageAgent(Path directory) throws IOException { + byte[] bytes; + try (InputStream input = LegacyWorldLaunch.class.getResourceAsStream("/" + AGENT)) { + if (input == null) throw new IOException("AutoPlug's Java 8 world-entry helper is missing from this build."); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; int count; + while ((count = input.read(buffer)) >= 0) output.write(buffer, 0, count); + bytes = output.toByteArray(); + } + if (bytes.length < 8 || bytes[6] != 0 || bytes[7] != 52) + throw new IOException("World-entry helper must be compiled for Java 8."); + String hash = com.osiris.autoplug.client.utils.UtilsCrypto.calculateSHA1Hash(bytes); + Files.createDirectories(directory); + Path target = directory.resolve("autoplug-world-entry-" + hash + ".jar"); + Manifest manifest = new Manifest(); + manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); + manifest.getMainAttributes().putValue("Premain-Class", AGENT.replace('/', '.').replace(".class", "")); + ByteArrayOutputStream packaged = new ByteArrayOutputStream(); + try (JarOutputStream jar = new JarOutputStream(packaged)) { + JarEntry manifestEntry = new JarEntry("META-INF/MANIFEST.MF"); manifestEntry.setTime(0); + jar.putNextEntry(manifestEntry); manifest.write(jar); jar.closeEntry(); + JarEntry classEntry = new JarEntry(AGENT); classEntry.setTime(0); + jar.putNextEntry(classEntry); jar.write(bytes); jar.closeEntry(); + } + byte[] expected = packaged.toByteArray(); + // Validate the complete cached JAR and reuse identical bytes, including + // when another running Java 8 client holds it open on Windows. + if (Files.isRegularFile(target) && Files.size(target) == expected.length && Arrays.equals(expected, Files.readAllBytes(target))) return target.toAbsolutePath(); + Path temporary = Files.createTempFile(directory, "helper-", ".jar"); + try { + Files.write(temporary, expected); + Files.move(temporary, target, StandardCopyOption.REPLACE_EXISTING); + return target.toAbsolutePath(); + } finally { Files.deleteIfExists(temporary); } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java b/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java index cc98becc..08113acc 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/LoaderInstaller.java @@ -262,11 +262,29 @@ static void run(Path java, List arguments, Path directory, Consumer command = new ArrayList<>(); command.add(java.toString()); command.add("-Djava.awt.headless=true"); command.addAll(arguments); Path output = directory.resolve("autoplug-loader-install.log"); - Process process = new ProcessBuilder(command).directory(directory.toFile()).redirectErrorStream(true).redirectOutput(output.toFile()).start(); + Process process = new ProcessBuilder(command).directory(directory.toFile()).redirectErrorStream(true).start(); + java.util.concurrent.atomic.AtomicReference outputFailure = new java.util.concurrent.atomic.AtomicReference<>(); + // Drain while the installer runs: its downloads and substeps must not disappear into a file until exit. + Thread reader = new Thread(() -> { + try (java.io.BufferedReader lines = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)); + java.io.BufferedWriter writer = Files.newBufferedWriter(output, StandardCharsets.UTF_8)) { + String line; + while ((line = lines.readLine()) != null) { + String safe = DownloadProgress.installerOutput(line); + writer.write(safe); writer.newLine(); writer.flush(); + if (log != null) log.accept(safe); + } + } catch (IOException e) { outputFailure.set(e); } + }, "autoplug-loader-output"); + reader.setDaemon(true); + reader.start(); try { if (!process.waitFor(20, TimeUnit.MINUTES)) throw new IOException("Loader installation timed out. See " + output); + reader.join(5000); + if (reader.isAlive()) throw new IOException("Loader output did not finish. See " + output); + if (outputFailure.get() != null) throw new IOException("Unable to record loader progress. See " + output, outputFailure.get()); if (process.exitValue() != 0) throw new IOException("Loader installer exited with " + process.exitValue() + ". See " + output); - log.accept("Official loader installer completed"); + if (log != null) log.accept("Official loader installer completed"); } finally { if (process.isAlive()) { process.descendants().forEach(ProcessHandle::destroy); process.destroyForcibly(); } } diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java index d1892516..905c1831 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java @@ -64,14 +64,25 @@ public synchronized PreparedLaunch prepare(LaunchRequest request, Consumer args = buildArguments(metadata, request, classpath, natives, assets, assetId, logging); - if (request.singleplayerWorld != null && !args.contains("--quickPlaySingleplayer")) - log.accept("Minecraft " + request.version + " has no supported singleplayer Quick Play argument. Select '" + request.singleplayerWorld + "' manually in Singleplayer."); + List temporaryFiles = new ArrayList<>(); + if (request.singleplayerWorld != null && !args.contains("--quickPlaySingleplayer")) { + LegacyWorldLaunch legacy = LegacyWorldLaunch.prepare(cacheRoot, vanilla, request, log); + args.add(0, legacy.argument()); + temporaryFiles.add(legacy.configuration); + log.accept("Minecraft " + request.version + " will enter the selected save automatically through its integrated-world loading flow."); + } log.accept("Minecraft " + id + " is ready (Java " + major + ")"); - return new PreparedLaunch(java, request.gameDir, args, id, major); + return new PreparedLaunch(java, request.gameDir, args, id, major, temporaryFiles); } /** Minecraft's output is written inside this profile and is never mixed with another world's console. */ public Process launch(PreparedLaunch prepared) throws IOException { + List cleanup = new ArrayList<>(prepared.temporaryFiles); + try { return start(prepared, cleanup); } + catch (IOException | RuntimeException failure) { cleanup.forEach(MinecraftLauncher::deleteTemporary); throw failure; } + } + + private Process start(PreparedLaunch prepared, List cleanup) throws IOException { Path logs = prepared.gameDir.resolve("logs"); Files.createDirectories(logs); // Loader classpaths can exceed Windows' command-line limit. Java 9+ accepts a private @@ -81,6 +92,7 @@ public Process launch(PreparedLaunch prepared) throws IOException { if (prepared.javaMajor >= 9) { Path state = prepared.gameDir.resolve(".autoplug"); Files.createDirectories(state); argumentsFile = Files.createTempFile(state, "launch-", ".args"); + cleanup.add(argumentsFile); try { AccountStore.restrict(argumentsFile); List lines = new ArrayList<>(); @@ -90,25 +102,28 @@ public Process launch(PreparedLaunch prepared) throws IOException { command = java.util.Arrays.asList(prepared.executable.toString(), "@" + argumentsFile); } catch (IOException | RuntimeException e) { Files.deleteIfExists(argumentsFile); throw e; } } - final Path cleanup = argumentsFile; try { Process process = new ProcessBuilder(command).directory(prepared.gameDir.toFile()).redirectErrorStream(true) .redirectOutput(ProcessBuilder.Redirect.appendTo(logs.resolve("autoplug-launcher.log").toFile())).start(); - if (cleanup != null) { - cleanup.toFile().deleteOnExit(); + if (!cleanup.isEmpty()) { + cleanup.forEach(path -> path.toFile().deleteOnExit()); // A non-daemon session thread also makes one-shot CLI launches wait for their // client and guarantees cleanup before normal JVM shutdown. A daemon future can // be lost when the launching CLI exits immediately after the game does. Thread cleanupThread = new Thread(() -> { try { process.waitFor(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } - finally { try { Files.deleteIfExists(cleanup); } catch (IOException ignored) { /* deleteOnExit remains registered */ } } + finally { cleanup.forEach(MinecraftLauncher::deleteTemporary); } }, "Minecraft session cleanup"); cleanupThread.setDaemon(false); cleanupThread.start(); } return process; - } catch (IOException e) { if (cleanup != null) Files.deleteIfExists(cleanup); throw e; } + } catch (IOException e) { cleanup.forEach(MinecraftLauncher::deleteTemporary); throw e; } + } + + private static void deleteTemporary(Path path) { + try { Files.deleteIfExists(path); } catch (IOException ignored) { path.toFile().deleteOnExit(); } } static String quoteArgumentFile(String argument) { diff --git a/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java b/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java index 19ecabcd..796d901d 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/PreparedLaunch.java @@ -12,13 +12,18 @@ public final class PreparedLaunch { public final List arguments; public final String version; public final int javaMajor; + final List temporaryFiles; public PreparedLaunch(Path executable, Path gameDir, List arguments, String version, int javaMajor) { + this(executable, gameDir, arguments, version, javaMajor, Collections.emptyList()); + } + PreparedLaunch(Path executable, Path gameDir, List arguments, String version, int javaMajor, List temporaryFiles) { this.executable = executable.toAbsolutePath().normalize(); this.gameDir = gameDir.toAbsolutePath().normalize(); this.arguments = Collections.unmodifiableList(new ArrayList<>(arguments)); this.version = version; this.javaMajor = javaMajor; + this.temporaryFiles = Collections.unmodifiableList(new ArrayList<>(temporaryFiles)); } public List command() { List result = new ArrayList<>(); diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java index 4acd4aae..8b6df386 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherCommands.java @@ -125,7 +125,12 @@ private void worlds(List args) throws Exception { } } private LauncherActions.WorldInfo world(String id) throws Exception { - for (LauncherActions.WorldInfo world : services.worlds()) if (world.id.equals(id)) return world; + for (LauncherActions.WorldInfo world : services.worlds()) { + if (world.id.equals(id)) return world; + // Owning a save gives its visible entry a persistent world-UUID, but + // the documented local: CLI alias continues to identify it. + if (world.local && id.startsWith("local:") && id.equals("local:" + Paths.get(world.directory).getFileName())) return world; + } throw new IOException("World not found: " + id); } private LauncherActions.WorldInfo managedWorld(String id) throws Exception { diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java index 460b735f..3da203c3 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java @@ -19,6 +19,7 @@ public class State { } private final Path root; private final Consumer progress; + private volatile Consumer progressListener = ignored -> { }; private final ProfileStore profiles; private final ProfileUpdates updates; private final WorldStore worlds; @@ -44,7 +45,12 @@ public LauncherServices(Path root, Consumer progress) throws Exception { } /** An explicit Minecraft directory keeps local-save discovery testable without touching user saves. */ public LauncherServices(Path root, Path minecraftDirectory, Consumer progress) throws Exception { - this.root = root.toAbsolutePath().normalize(); this.progress = progress == null ? ignored -> { } : progress; + this.root = root.toAbsolutePath().normalize(); + Consumer log = progress == null ? ignored -> { } : progress; + this.progress = message -> { + try { log.accept(message); } catch (RuntimeException ignored) { } + try { progressListener.accept(message); } catch (RuntimeException ignored) { } + }; Files.createDirectories(this.root); profiles = new ProfileStore(this.root.resolve("profiles")); updates = new ProfileUpdates(profiles); worlds = new WorldStore(this.root.resolve("worlds")); @@ -69,11 +75,39 @@ public LauncherServices(Path root, Path minecraftDirectory, Consumer pro worldService = new WorldService(profiles, worlds, installer, (profile, host, port) -> launchClient(profile.id, host, port)); worldService.setPreferredPort(state.settings.port); worldService.setSharingEnabled(state.settings.upnp); + ensureDefaultProfiles(""); } public Path getRoot() { return root; } public ProfileStore getProfiles() { return profiles; } public WorldService getWorldService() { return worldService; } public ServerBrowserService getServers() { return servers; } + @Override public void onProgress(Consumer listener) { progressListener = listener == null ? ignored -> { } : listener; } + @Override public synchronized ProfileInfo ensureDefaultProfiles(String version) throws Exception { + Profile selected = selectedDefault(); + String target = version == null ? "" : version.trim(); + if (target.isEmpty()) { + Profile configured = configuredDefault(); + if (configured != null) target = configured.gameVersion; + else { + for (Profile profile : profiles.list()) if (profile.type.isClient() && !profile.template && !profile.migrationPending) { target = profile.gameVersion; break; } + if (target.isEmpty()) target = "1.21.1"; // Same initial version as the profile creation form; no network needed. + } + } + Profile client = profiles.ensureDefault(target, ProfileType.MODS); + profiles.ensureDefault(target, ProfileType.MODS_SERVER); + if (selected == null) { state.settings.defaultProfile = client.id; saveState(); } + return info(client); + } + private Profile selectedDefault() { + Profile profile = configuredDefault(); + return profile != null && !profile.template && !profile.migrationPending ? profile : null; + } + private Profile configuredDefault() { + String id = state.settings.defaultProfile; + if (id == null || id.isEmpty()) return null; + try { Profile profile = profiles.get(id); return profile.type.isClient() ? profile : null; } + catch (IOException e) { return null; } + } @Override public List profiles() throws Exception { List result = new ArrayList<>(); for (Profile p : profiles.list()) result.add(info(p)); return result; } @@ -123,8 +157,12 @@ public void addArtifact(String id, Path source, String modrinthId) throws Except @Override public List worlds() throws Exception { List result = new ArrayList<>(); try { - for (LocalWorld world : localWorlds.list()) result.add(new WorldInfo(world.id, world.name, "", "", world.directory.toString(), - world.icon == null ? null : world.icon.toString(), localClients.containsKey(world.id), true, world.gameVersion)); + for (LocalWorld world : localWorlds.list()) { + LocalWorld owned = world; + try { owned = worlds.ownedLocal(world, false); } + catch (IOException e) { progress.accept("Could not load ownership for '" + world.name + "': " + e.getMessage()); } + result.add(info(owned)); + } } catch (IOException | SecurityException e) { progress.accept("Could not list local Minecraft saves: " + e.getMessage()); } @@ -132,7 +170,7 @@ public void addArtifact(String id, Path source, String modrinthId) throws Except return result; } @Override public String launchLocalWorld(String id, String version) throws Exception { - LocalWorld world = localWorlds.get(id); + LocalWorld world = worlds.getLocal(id, localWorlds); String selected = localWorlds.launchVersion(world, version); // All standard saves share one game directory and its settings/native files. // Retain one lease for that directory until the child exits, including preparation failures. @@ -141,15 +179,15 @@ public void addArtifact(String id, Path source, String modrinthId) throws Except MinecraftAccount current = currentAccount(); PreparedLaunch prepared = launcher.prepare(new LaunchRequest(world.gameDirectory, selected, "VANILLA", null, current, null, 0, world.saveName()), progress); - LocalWorld fresh = localWorlds.get(id); + LocalWorld fresh = worlds.getLocal(id, localWorlds); if (!fresh.gameVersion.equals(world.gameVersion) || fresh.modded != world.modded) throw new IOException("The save's version metadata changed while preparing Minecraft. Refresh and select it again."); localWorlds.launchVersion(fresh, selected); - Process process = launcher.launch(prepared); trackLocalClient(id, process, lease); + LocalWorld owned = worlds.registerLocal(fresh); + Process process = launcher.launch(prepared); trackLocalClient(owned.id, process, lease); if (prepared.arguments.contains("--quickPlaySingleplayer")) return "Started Minecraft " + selected + " with Quick Play for '" + world.name + "'."; - return "Started Minecraft " + selected + ". This version does not support direct world launch; choose '" + world.name - + "' (folder " + world.saveName() + ") from Singleplayer."; + return "Started Minecraft " + selected + " with automatic entry for '" + world.name + "'."; } catch (Exception e) { lease.close(); throw e; } } /** Existing saves must be closed from Minecraft so its integrated server can save normally. */ @@ -162,6 +200,12 @@ void trackLocalClient(String id, Process process, ProfileLease lease) { }); } @Override public WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { + if (clientProfileId == null || clientProfileId.trim().isEmpty()) { + String version = serverProfileId == null || serverProfileId.trim().isEmpty() ? "" : profiles.get(serverProfileId).gameVersion; + clientProfileId = ensureDefaultProfiles(version).id; + } + if (serverProfileId == null || serverProfileId.trim().isEmpty()) + serverProfileId = profiles.ensureDefault(profiles.get(clientProfileId).gameVersion, ProfileType.MODS_SERVER).id; Profile server = profiles.get(serverProfileId), client = profiles.get(clientProfileId); if (server.type.isClient() || !client.type.isClient()) throw new IOException("Choose a server profile and a client profile"); if (!server.gameVersion.equals(client.gameVersion)) throw new IOException("World server and client must use the same game version"); @@ -186,6 +230,9 @@ void trackLocalClient(String id, Process process, ProfileLease lease) { } @Override public void launchProfile(String id, String host, int port) throws Exception { launchClient(id, host, port); } private Process launchClient(String id, String host, int port) throws Exception { + if (id == null || id.trim().isEmpty()) { + synchronized (this) { Profile selected = selectedDefault(); id = selected == null ? ensureDefaultProfiles("").id : selected.id; } + } Profile profile = profiles.get(id); if (!profile.type.isClient()) throw new IOException("Choose a MODS client profile"); if (profile.template) throw new IOException("Clone the template before launching it"); @@ -196,8 +243,8 @@ private Process launchClient(String id, String host, int port) throws Exception if (current == null) current = currentAccount(); else if (current.needsRefresh()) current = microsoft.refresh(current); PreparedLaunch prepared = launcher.prepare(new LaunchRequest(profile.getDirectory(), profile.gameVersion, profile.loader, profile.loaderVersion, current, host, port), progress); - Process process = launcher.launch(prepared); clients.put(id, process); - process.onExit().thenRun(() -> { clients.remove(id, process); try { lease.close(); } catch (IOException e) { progress.accept("Could not release profile lock: " + e.getMessage()); } }); + Process process = launcher.launch(prepared); clients.put(profile.id, process); + process.onExit().thenRun(() -> { clients.remove(profile.id, process); try { lease.close(); } catch (IOException e) { progress.accept("Could not release profile lock: " + e.getMessage()); } }); return process; } catch (Exception e) { lease.close(); throw e; } } @@ -256,7 +303,21 @@ private void requireIdle(String id) throws IOException { private ProfileInfo info(Profile p) { return new ProfileInfo(p.id, p.name, p.gameVersion, p.loader, p.type.name(), p.getDirectory().toString(), p.template, p.migrationSummary == null ? "" : p.migrationSummary, !p.migrationPending); } private WorldInfo info(VirtualWorld w) throws IOException { boolean running = worldService.activeSessions().stream().anyMatch(s -> s.getWorld().id.equals(w.id)); - return new WorldInfo(w.id, w.name, w.serverProfileId, w.clientProfileId, worlds.getDirectory(w.id).toString(), w.thumbnail, running); + Path directory = worlds.getDirectory(w.id); + if (Files.isRegularFile(directory.resolve("world/level.dat"), LinkOption.NOFOLLOW_LINKS)) { + try { + LocalWorld metadata = LocalWorldStore.inspect(w.id, directory.resolve("world"), directory); + return new WorldInfo(w.id, w.name, w.serverProfileId, w.clientProfileId, directory.toString(), metadata.icon == null ? w.thumbnail : metadata.icon.toString(), running, + false, metadata.gameVersion, metadata.modded, metadata.lastPlayed, metadata.sizeBytes, metadata.sizeComplete, + metadata.dataPacks, metadata.cheats, metadata.hardcore, false); + } catch (IOException e) { progress.accept("Could not read world details for '" + w.name + "': " + e.getMessage()); } + } + return new WorldInfo(w.id, w.name, w.serverProfileId, w.clientProfileId, directory.toString(), w.thumbnail, running, false, profiles.get(w.serverProfileId).gameVersion); + } + private WorldInfo info(LocalWorld world) { + return new WorldInfo(world.id, world.name, "", "", world.directory.toString(), world.icon == null ? null : world.icon.toString(), + localClients.containsKey(world.id), true, world.gameVersion, world.modded, world.lastPlayed, world.sizeBytes, world.sizeComplete, + world.dataPacks, world.cheats, world.hardcore, world.quickPlayEligible); } public void waitForSessions() throws InterruptedException { while (!clients.isEmpty() || !localClients.isEmpty() || !worldService.activeSessions().isEmpty()) Thread.sleep(250); diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java index a19181eb..5859ca98 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java @@ -41,6 +41,17 @@ public Profile create(String name, String version, String loader, ProfileType ty Files.createDirectories(p.getDirectory().resolve(type.collectionDirectory())); save(p); return p; } + /** Defaults are version-specific; never retarget or overwrite an existing user profile. */ + public Profile ensureDefault(String version, ProfileType type) throws IOException { + if (type != ProfileType.MODS && type != ProfileType.MODS_SERVER) throw new IOException("Invalid default profile type"); + String name = type.isClient() ? "Default (VANILLA)" : "Default"; + try (ProfileLease ignored = new ProfileLease(root)) { + for (Profile profile : list()) if (name.equals(profile.name) && version.equals(profile.gameVersion) + && "VANILLA".equals(profile.loader) && profile.type == type && !profile.template && !profile.migrationPending) + return profile; + return create(name, version, "VANILLA", type); + } + } public void save(Profile p) throws IOException { validate(p); p.setDirectory(directory(p.id)); json.write(p.getDirectory().resolve("profile.json"), p); } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/TaskDownload.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/TaskDownload.java index f76bd0ec..e3fd0761 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/TaskDownload.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/TaskDownload.java @@ -9,6 +9,7 @@ package com.osiris.autoplug.client.tasks.updater; import com.osiris.autoplug.client.utils.UtilsCrypto; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.betterthread.BThread; import com.osiris.betterthread.BThreadManager; import com.osiris.jlib.logger.AL; @@ -61,50 +62,44 @@ public void runAtStart() throws Exception { super.runAtStart(); final String fileName = dest.getName(); - setStatus("Downloading " + fileName + "... (0mb/0mb)"); - AL.debug(this.getClass(), "Downloading " + fileName + " from: " + url); + final String source = DownloadProgress.sourceUrl(url); + setStatus("Downloading " + fileName + " from " + source); Request request = new Request.Builder().url(url) .header("User-Agent", "AutoPlug Client/" + new Random().nextInt() + " - https://autoplug.one") .build(); - Response response = new OkHttpClient.Builder().followRedirects(true).build().newCall(request).execute(); - ResponseBody body = null; - try { + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading " + fileName, url); + Response response = new OkHttpClient.Builder().followRedirects(true).build().newCall(request).execute()) { + transfer.redirect(response.request().url().toString()); if (response.code() != 200) - throw new Exception("Download of '" + dest.getName() + "' failed! Code: " + response.code() + " Message: " + response.message() + " Url: " + url); + throw new Exception("Download of '" + dest.getName() + "' failed! Code: " + response.code() + " Message: " + response.message() + " Url: " + source); - body = response.body(); + ResponseBody body = response.body(); if (body == null) throw new Exception("Download of '" + dest.getName() + "' failed because of null response body!"); validateContentType(dest.getName(), body.contentType(), ignoreContentType, allowedSubContentTypes); long completeFileSize = body.contentLength(); - setMax(completeFileSize); + setMax(Math.max(1, completeFileSize)); - BufferedInputStream in = new BufferedInputStream(body.byteStream()); - FileOutputStream fos = new FileOutputStream(dest); - BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); - byte[] data = new byte[1024]; long downloadedFileSize = 0; - int x = 0; - while ((x = in.read(data, 0, 1024)) >= 0) { - downloadedFileSize += x; - - setStatus("Downloading " + fileName + "... (" + downloadedFileSize / (1024 * 1024) + "mb/" + completeFileSize / (1024 * 1024) + "mb)"); - setNow(downloadedFileSize); - - bout.write(data, 0, x); + try (BufferedInputStream in = new BufferedInputStream(body.byteStream()); + BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(dest), 65536)) { + byte[] data = new byte[65536]; + int x; + while ((x = in.read(data)) >= 0) { + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); + downloadedFileSize += x; + String amount = downloadedFileSize / (1024 * 1024) + "mb" + + (completeFileSize >= 0 ? "/" + completeFileSize / (1024 * 1024) + "mb" : ""); + setStatus("Downloading " + fileName + " (" + amount + ") from " + source); + if (completeFileSize > 0) setNow(downloadedFileSize); + bout.write(data, 0, x); + transfer.update(downloadedFileSize, completeFileSize); + } } - - setStatus("Downloaded " + fileName + " (" + downloadedFileSize / (1024 * 1024) + "mb/" + completeFileSize / (1024 * 1024) + "mb)"); - bout.close(); - in.close(); - body.close(); - response.close(); - } catch (Exception e) { - if (body != null) body.close(); - response.close(); - throw e; + setStatus("Downloaded " + fileName + " from " + source); + transfer.complete(downloadedFileSize, completeFileSize); } } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/java/AdoptV3API.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/java/AdoptV3API.java index 8399cba8..21fb9e83 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/java/AdoptV3API.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/java/AdoptV3API.java @@ -10,6 +10,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.jlib.json.Json; import com.osiris.jlib.json.exceptions.HttpErrorException; import com.osiris.jlib.json.exceptions.WrongJsonTypeException; @@ -68,10 +69,15 @@ public String getVersionInformationUrl(String releaseVersionName, OperatingSyste public JsonArray getVersionInformation(String releaseVersionName, OperatingSystemArchitectureType osArchitectureType, boolean isLargeHeapSize, ImageType imageType, boolean isHotspotImpl, boolean isOnlyLTS, OperatingSystemType osType, int maxItems, VendorProjectType vendorProject, ReleaseType releaseType) throws WrongJsonTypeException, IOException, HttpErrorException { - return Json.getAsJsonArray(getVersionInformationUrl( + String url = getVersionInformationUrl( releaseVersionName, osArchitectureType, isLargeHeapSize, imageType, isHotspotImpl, isOnlyLTS, osType, maxItems, vendorProject, releaseType - )); + ); + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Fetching Java package metadata", url)) { + JsonArray result = Json.getAsJsonArray(url); + transfer.complete(-1, -1); + return result; + } } /** @@ -113,7 +119,12 @@ public void getReleases(OperatingSystemArchitectureType osArchitectureType, bool while (true) { // Loop through all pages until last request gives 404 error code url = getReleasesUrl(page, osArchitectureType, isLargeHeapSize, imageType, isHotspotImpl, isOnlyLTS, osType, maxItems, vendorProject, releaseType); - Boolean shouldContinue = onNewPage.apply(Json.getAsObject(url)); + JsonObject response; + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Fetching Java releases", url)) { + response = Json.getAsObject(url); + transfer.complete(-1, -1); + } + Boolean shouldContinue = onNewPage.apply(response); if (!shouldContinue) break; page++; } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/java/TaskJavaDownload.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/java/TaskJavaDownload.java index 40ad5e7b..2e3344ba 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/java/TaskJavaDownload.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/java/TaskJavaDownload.java @@ -8,6 +8,7 @@ package com.osiris.autoplug.client.tasks.updater.java; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.betterthread.BThread; import com.osiris.betterthread.BThreadManager; import com.osiris.betterthread.BWarning; @@ -59,19 +60,21 @@ public void runAtStart() throws Exception { super.runAtStart(); String fileName = dest.getName(); - setStatus("Downloading " + fileName + "... (0mb/0mb)"); - AL.debug(this.getClass(), "Downloading " + fileName + " from: " + url); + final String source = DownloadProgress.sourceUrl(url); + setStatus("Downloading " + fileName + " from " + source); + AL.debug(this.getClass(), "Downloading " + fileName + " from: " + source); Request request = new Request.Builder().url(url) .header("User-Agent", "AutoPlug Client/" + new Random().nextInt() + " - https://autoplug.one") .build(); - Response response = new OkHttpClient().newCall(request).execute(); - ResponseBody body = null; - try { + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading " + fileName, url); + Response response = new OkHttpClient().newCall(request).execute()) { + transfer.redirect(response.request().url().toString()); + final String currentSource = DownloadProgress.sourceUrl(response.request().url().toString()); if (response.code() != 200) - throw new Exception("Download of '" + fileName + "' failed! Code: " + response.code() + " Message: " + response.message() + " Url: " + url); + throw new Exception("Download of '" + fileName + "' failed! Code: " + response.code() + " Message: " + response.message() + " Url: " + currentSource); - body = response.body(); + ResponseBody body = response.body(); if (body == null) throw new Exception("Download of '" + fileName + "' failed because of null response body!"); else if (body.contentType() == null) @@ -123,35 +126,29 @@ else if (!body.contentType().subtype().equals("java-archive") newDest.createNewFile(); long completeFileSize = body.contentLength(); - setMax(completeFileSize); + setMax(Math.max(1, completeFileSize)); - BufferedInputStream in = new BufferedInputStream(body.byteStream()); - FileOutputStream fos = new FileOutputStream(dest); - BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); - byte[] data = new byte[1024]; long downloadedFileSize = 0; - int x = 0; - while ((x = in.read(data, 0, 1024)) >= 0) { - downloadedFileSize += x; - - setStatus("Downloading " + fileName + "... (" + downloadedFileSize / (1024 * 1024) + "mb/" + completeFileSize / (1024 * 1024) + "mb)"); - setNow(downloadedFileSize); - - bout.write(data, 0, x); + try (BufferedInputStream in = new BufferedInputStream(body.byteStream()); + BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(dest), 1024)) { + byte[] data = new byte[1024]; + int x; + while ((x = in.read(data)) != -1) { + if (Thread.currentThread().isInterrupted()) + throw new java.io.InterruptedIOException("Download interrupted"); + downloadedFileSize += x; + setStatus("Downloading " + fileName + " from " + currentSource + + " (" + downloadedFileSize + "/" + (completeFileSize < 0 ? "?" : completeFileSize) + " bytes)"); + if (completeFileSize > 0) setNow(downloadedFileSize); + transfer.update(downloadedFileSize, completeFileSize); + bout.write(data, 0, x); + } } - setStatus("Downloaded " + fileName + " (" + downloadedFileSize / (1024 * 1024) + "mb/" + completeFileSize / (1024 * 1024) + "mb)"); - bout.close(); - in.close(); - body.close(); - response.close(); - Files.copy(dest.toPath(), newDest.toPath(), StandardCopyOption.REPLACE_EXISTING); - } catch (Exception e) { - if (body != null) body.close(); - response.close(); - throw e; + setStatus("Downloaded " + fileName + " (" + downloadedFileSize + " bytes) from " + currentSource); + transfer.complete(downloadedFileSize, completeFileSize); } } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/TaskModDownload.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/TaskModDownload.java index 77b3e2bd..e86a9715 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/TaskModDownload.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/TaskModDownload.java @@ -10,6 +10,7 @@ import com.osiris.autoplug.client.tasks.updater.search.SearchResult; import com.osiris.autoplug.client.utils.GD; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.betterthread.BThread; import com.osiris.betterthread.BThreadManager; import com.osiris.jlib.logger.AL; @@ -118,24 +119,26 @@ public void download() throws Exception { if (!dir.exists()) dir.mkdirs(); dest = new File(dir + "/" + plName + "-[" + plLatestVersion + "].jar"); - AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + url + "'"); + final String source = DownloadProgress.sourceUrl(url); + AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + source + "'"); if (dest.exists()) dest.delete(); dest.createNewFile(); final String fileName = dest.getName(); - setStatus("Downloading " + fileName + "... (0kb/0kb)"); + setStatus("Downloading " + fileName + " from " + source); Request request = new Request.Builder().url(url) .header("User-Agent", "AutoPlug-Client - https://autoplug.one") .build(); - Response response = new OkHttpClient().newCall(request).execute(); - ResponseBody body = null; - try { + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading " + fileName, url); + Response response = new OkHttpClient().newCall(request).execute()) { + transfer.redirect(response.request().url().toString()); + final String currentSource = DownloadProgress.sourceUrl(response.request().url().toString()); if (response.code() != 200) - throw new Exception("Download error for " + plName + " code: " + response.code() + " message: " + response.message() + " url: " + url); + throw new Exception("Download error for " + plName + " code: " + response.code() + " message: " + response.message() + " url: " + currentSource); - body = response.body(); + ResponseBody body = response.body(); if (body == null) throw new Exception("Download of '" + dest.getName() + "' failed because of null response body!"); else if (body.contentType() == null) @@ -150,32 +153,27 @@ else if (!ignoreContentType && ( throw new Exception("Download of '" + dest.getName() + "' failed because of invalid sub-content type: " + body.contentType().subtype()); long completeFileSize = body.contentLength(); - setMax(completeFileSize); + setMax(Math.max(1, completeFileSize)); - BufferedInputStream in = new BufferedInputStream(body.byteStream()); - FileOutputStream fos = new FileOutputStream(dest); - BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); - byte[] data = new byte[1024]; long downloadedFileSize = 0; - int x = 0; - while ((x = in.read(data, 0, 1024)) >= 0) { - downloadedFileSize += x; - - setStatus("Downloading " + fileName + "... (" + downloadedFileSize / 1024 + "kb/" + completeFileSize / 1024 + "kb)"); - setNow(downloadedFileSize); - - bout.write(data, 0, x); + try (BufferedInputStream in = new BufferedInputStream(body.byteStream()); + BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(dest), 1024)) { + byte[] data = new byte[1024]; + int x; + while ((x = in.read(data)) != -1) { + if (Thread.currentThread().isInterrupted()) + throw new java.io.InterruptedIOException("Download interrupted"); + downloadedFileSize += x; + setStatus("Downloading " + fileName + " from " + currentSource + + " (" + downloadedFileSize + "/" + (completeFileSize < 0 ? "?" : completeFileSize) + " bytes)"); + if (completeFileSize > 0) setNow(downloadedFileSize); + transfer.update(downloadedFileSize, completeFileSize); + bout.write(data, 0, x); + } } - setStatus("Downloaded " + fileName + " (" + downloadedFileSize / 1024 + "kb/" + completeFileSize / 1024 + "kb)"); - bout.close(); - in.close(); - body.close(); - response.close(); - } catch (Exception e) { - if (body != null) body.close(); - response.close(); - throw e; + setStatus("Downloaded " + fileName + " (" + downloadedFileSize + " bytes) from " + currentSource); + transfer.complete(downloadedFileSize, completeFileSize); } } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginDownload.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginDownload.java index dcdf7570..53f74730 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginDownload.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginDownload.java @@ -11,6 +11,7 @@ import com.osiris.autoplug.client.tasks.updater.search.SearchResult; import com.osiris.autoplug.client.utils.GD; import com.osiris.autoplug.client.utils.StringComparator; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.betterthread.BThread; import com.osiris.betterthread.BThreadManager; import com.osiris.jlib.UtilsFiles; @@ -125,24 +126,26 @@ public void download() throws Exception { if (!dir.exists()) dir.mkdirs(); dest = new File(dir + "/" + plName + "-[" + plLatestVersion + "].jar"); - AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + url + "'"); + final String source = DownloadProgress.sourceUrl(url); + AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + source + "'"); if (dest.exists()) dest.delete(); dest.createNewFile(); final String fileName = dest.getName(); - setStatus("Downloading " + fileName + "... (0kb/0kb)"); + setStatus("Downloading " + fileName + " from " + source); Request request = new Request.Builder().url(url) .header("User-Agent", "AutoPlug-Client - https://autoplug.one") .build(); - Response response = new OkHttpClient().newCall(request).execute(); - ResponseBody body = null; - try { + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading " + fileName, url); + Response response = new OkHttpClient().newCall(request).execute()) { + transfer.redirect(response.request().url().toString()); + final String currentSource = DownloadProgress.sourceUrl(response.request().url().toString()); if (response.code() != 200) - throw new Exception("Download error for " + plName + " code: " + response.code() + " message: " + response.message() + " url: " + url); + throw new Exception("Download error for " + plName + " code: " + response.code() + " message: " + response.message() + " url: " + currentSource); - body = response.body(); + ResponseBody body = response.body(); if (body == null) throw new Exception("Download of '" + dest.getName() + "' failed because of null response body!"); else if (body.contentType() == null) @@ -161,39 +164,38 @@ else if (!ignoreContentType && ( boolean isZip = false, isTar = false; if (body.contentType().subtype().equals("zip")) { dest = new File(dir + "/" + plName + "-[" + plLatestVersion + "].zip"); - AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + url + "'"); + AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + currentSource + "'"); if (dest.exists()) dest.delete(); dest.createNewFile(); } else if (body.contentType().subtype().equals("x-gtar")) { dest = new File(dir + "/" + plName + "-[" + plLatestVersion + "].tar.gz"); - AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + url + "'"); + AL.debug(this.getClass(), "Downloading " + dest.getName() + " to '" + dest.getAbsolutePath() + "' from '" + currentSource + "'"); if (dest.exists()) dest.delete(); dest.createNewFile(); } long completeFileSize = body.contentLength(); - setMax(completeFileSize); + setMax(Math.max(1, completeFileSize)); - BufferedInputStream in = new BufferedInputStream(body.byteStream()); - FileOutputStream fos = new FileOutputStream(dest); - BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); - byte[] data = new byte[1024]; long downloadedFileSize = 0; - int x = 0; - while ((x = in.read(data, 0, 1024)) >= 0) { - downloadedFileSize += x; - - setStatus("Downloading " + fileName + "... (" + downloadedFileSize / 1024 + "kb/" + completeFileSize / 1024 + "kb)"); - setNow(downloadedFileSize); - - bout.write(data, 0, x); + try (BufferedInputStream in = new BufferedInputStream(body.byteStream()); + BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(dest), 1024)) { + byte[] data = new byte[1024]; + int x; + while ((x = in.read(data)) != -1) { + if (Thread.currentThread().isInterrupted()) + throw new java.io.InterruptedIOException("Download interrupted"); + downloadedFileSize += x; + setStatus("Downloading " + fileName + " from " + currentSource + + " (" + downloadedFileSize + "/" + (completeFileSize < 0 ? "?" : completeFileSize) + " bytes)"); + if (completeFileSize > 0) setNow(downloadedFileSize); + transfer.update(downloadedFileSize, completeFileSize); + bout.write(data, 0, x); + } } - setStatus("Downloaded " + fileName + " (" + downloadedFileSize / 1024 + "kb/" + completeFileSize / 1024 + "kb)"); - bout.close(); - in.close(); - body.close(); - response.close(); + setStatus("Downloaded " + fileName + " (" + downloadedFileSize + " bytes) from " + currentSource); + transfer.complete(downloadedFileSize, completeFileSize); // Zip/Tar support if (isTar || isZip) { @@ -226,10 +228,6 @@ else if (!ignoreContentType && ( " and selected " + dest.getName()); } - } catch (Exception e) { - if (body != null) body.close(); - response.close(); - throw e; } } diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java index 7f6455bc..b3bc5698 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -1,6 +1,7 @@ package com.osiris.autoplug.client.ui; import com.osiris.autoplug.client.browser.*; +import com.osiris.autoplug.client.launcher.DownloadProgress; import com.osiris.autoplug.client.ui.LauncherActions.*; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -14,6 +15,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; /** Five-view Swing dashboard. Network, launcher and disk operations never run on the EDT. */ public final class DashboardPanel extends JPanel implements AutoCloseable { @@ -29,11 +33,16 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { private final CardLayout cards = new CardLayout(); private final JPanel pages = new JPanel(cards); private final JLabel status = new JLabel("Ready"); + private final JLabel navigationTitle = new JLabel("Server Browser"); + private final JProgressBar progress = new JProgressBar(0, 100); + private final JTextField sourceUrl = new JTextField(); + private final JTextArea activity = textArea(5); + private final JLabel serverEmpty = new JLabel("Add a server or import Minecraft favorites to get started.", SwingConstants.CENTER); private final DefaultTableModel serverModel = model("Name", "Address", "Status", "MOTD", "Players", "Version", "Latency"); private final JTable serverTable = table(serverModel); private final DefaultTableModel profileModel = model("Name", "Minecraft", "Loader", "Type", "Template", "Ready"); private final JTable profileTable = table(profileModel); - private final JPanel worldCards = new JPanel(); + private final JPanel worldCards = new WorldList(); private final Map serverStatuses = new HashMap<>(); private List servers = Collections.emptyList(); private List profiles = Collections.emptyList(); @@ -52,6 +61,8 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { private ServerConsolePanel console; private SettingsInfo loadedSettings; private JDialog signInDialog; + private final AutoCloseable downloadSubscription; + private int activeDownloads; public DashboardPanel(LauncherActions actions, ServerBrowserService browser) { this(actions, browser, true); } @@ -65,26 +76,39 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo navigation.setBorder(new EmptyBorder(24, 16, 20, 16)); navigation.setPreferredSize(new Dimension(195, 600)); JLabel brand = new JLabel("AutoPlug"); brand.setFont(brand.getFont().deriveFont(Font.BOLD, 25f)); navigation.add(brand); navigation.add(Box.createVerticalStrut(5)); - JLabel subtitle = new JLabel("PLAY · MANAGE · SHARE"); subtitle.setFont(subtitle.getFont().deriveFont(10f)); - navigation.add(subtitle); navigation.add(Box.createVerticalStrut(30)); + navigationTitle.setName("navigation-title"); navigationTitle.setFont(navigationTitle.getFont().deriveFont(Font.BOLD, 13f)); + navigationTitle.setMaximumSize(new Dimension(Integer.MAX_VALUE, 24)); navigationTitle.setAlignmentX(Component.LEFT_ALIGNMENT); + DashboardTheme.tint(navigationTitle, true); + navigation.add(navigationTitle); navigation.add(Box.createVerticalStrut(30)); ButtonGroup group = new ButtonGroup(); String[] names = {"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}; JPanel[] views = {serverPage(), worldsPage(), profilesPage(), managerPage(includeLegacyControls), settingsPage()}; for (int i = 0; i < names.length; i++) { String name = names[i]; pages.add(views[i], name); JToggleButton button = new JToggleButton(name); button.setHorizontalAlignment(SwingConstants.LEFT); + button.setIcon(DashboardTheme.icon(name)); button.setToolTipText(name); DashboardTheme.navigation(button); button.setPreferredSize(new Dimension(170, 43)); button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 43)); button.setAlignmentX(Component.LEFT_ALIGNMENT); - button.addActionListener(e -> { cards.show(pages, name); if (name.equals("Worlds")) refreshWorlds(); }); + button.addActionListener(e -> { cards.show(pages, name); navigationTitle.setText(name); if (name.equals("Worlds")) refreshWorlds(); }); group.add(button); navigation.add(button); navigation.add(Box.createVerticalStrut(8)); if (i == 0) button.setSelected(true); } navigation.add(Box.createVerticalGlue()); JLabel footer = new JLabel("Your worlds. Your profiles."); footer.setFont(footer.getFont().deriveFont(11f)); navigation.add(footer); add(navigation, BorderLayout.WEST); add(pages, BorderLayout.CENTER); - JPanel statusBar = DashboardTheme.surface(new BorderLayout(), 8); - statusBar.add(status, BorderLayout.CENTER); add(statusBar, BorderLayout.SOUTH); + JPanel statusBar = DashboardTheme.surface(new BorderLayout(10, 4), 8); + status.putClientProperty("html.disable", Boolean.TRUE); status.setName("activity-step"); + progress.setName("activity-progress"); progress.setPreferredSize(new Dimension(140, 10)); progress.setVisible(false); + JPanel step = DashboardTheme.transparent(new BorderLayout(10, 0)); step.add(status); step.add(progress, BorderLayout.EAST); + sourceUrl.setName("download-source"); sourceUrl.setEditable(false); sourceUrl.setVisible(false); + sourceUrl.setToolTipText("Current download source — select and copy the full URL"); sourceUrl.getAccessibleContext().setAccessibleName("Download source URL"); + JButton details = iconButton("Activity details", "activity", () -> information("Activity & download sources", activity.getText())); + statusBar.add(step, BorderLayout.CENTER); statusBar.add(details, BorderLayout.EAST); statusBar.add(sourceUrl, BorderLayout.SOUTH); + add(statusBar, BorderLayout.SOUTH); + actions.onProgress(this::receiveProgress); + actions.onProgressValue(this::receiveProgressValue); + downloadSubscription = DownloadProgress.subscribe(this::receiveDownloadProgress); refreshProfiles(); refreshWorlds(); refreshSettings(); run("Importing Minecraft favorites", () -> { browser.importVanilla(); return browser.list(); }, this::showServers); } @@ -97,13 +121,16 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo private JPanel serverPage() { JPanel page = page("Server Browser", "Your Minecraft favorites, with live status and matching local profiles."); JPanel content = content(); - content.add(toolbar(button("Add server", this::addServer), button("Import Minecraft", () -> run("Importing favorites", () -> { + content.add(toolbar(button("Add server", this::addServer), iconButton("Import Minecraft", "import", () -> run("Importing favorites", () -> { int count = browser.importVanilla(); return count; }, count -> { status.setText("Imported " + count + " new favorites from " + browser.vanillaFile()); refreshServers(); })), - button("Refresh status", this::refreshServers), primaryButton("Join selected", this::joinSelected), - button("Remove", this::removeServer)), BorderLayout.NORTH); + iconButton("Refresh status", "refresh", this::refreshServers), primaryButton("Join selected", this::joinSelected), + iconButton("Ping selected", "ping", this::pingSelected), iconButton("Copy address", "copy", this::copyServerAddress), + iconButton("Edit server", "edit", this::editServer), iconButton("Remove", "delete", this::removeServer)), BorderLayout.NORTH); serverTable.getColumnModel().getColumn(3).setPreferredWidth(220); - content.add(tableScroll(serverTable), BorderLayout.CENTER); + JPanel list = DashboardTheme.transparent(new BorderLayout(0, 10)); + DashboardTheme.tint(serverEmpty, false); serverEmpty.setBorder(new EmptyBorder(20, 0, 20, 0)); + list.add(serverEmpty, BorderLayout.NORTH); list.add(tableScroll(serverTable)); content.add(list, BorderLayout.CENTER); JLabel note = new JLabel("Server pings show version and players. Mods and loaders come from your local profiles."); note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; @@ -123,11 +150,37 @@ private void removeServer() { run("Removing favorite", () -> { browser.remove(selected.address); return browser.list(); }, this::showServers); } private void refreshServers() { run("Loading favorites", browser::list, this::showServers); } + private void copyServerAddress() { + SavedServer server = selectedServer(); if (server == null) return; + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(server.address), null); + status.setText("Copied " + server.address); + } + private void editServer() { + SavedServer selected = selectedServer(); if (selected == null) return; + JTextField name = new JTextField(selected.name), address = new JTextField(selected.address); + if (!form("Edit favorite", fields("Name", name, "Address", address))) return; + try { + SavedServer edited = new SavedServer(name.getText(), address.getText()); + run("Saving favorite", () -> { + browser.add(edited.name, edited.address); + if (!selected.address.equalsIgnoreCase(edited.address)) browser.remove(selected.address); + return browser.list(); + }, this::showServers); + } catch (IllegalArgumentException e) { error(e); } + } + private void pingSelected() { + SavedServer selected = selectedServer(); if (selected == null) return; + int generation = pingGeneration; + run("Checking " + selected.name, () -> browser.ping(selected), ping -> showPing(generation, selected, ping)); + } private void showServers(List result) { int generation = ++pingGeneration; servers = result; serverModel.setRowCount(0); + serverEmpty.setVisible(servers.isEmpty()); for (SavedServer server : servers) serverModel.addRow(new Object[]{server.name, server.address, "Checking…", "", "", "", ""}); - for (SavedServer server : servers) run("Checking " + server.name, () -> browser.ping(server), ping -> { + for (SavedServer server : servers) run("Checking " + server.name, () -> browser.ping(server), ping -> showPing(generation, server, ping)); + } + private void showPing(int generation, SavedServer server, ServerStatus ping) { if (generation != pingGeneration) return; serverStatuses.put(server.address, ping); for (int i = 0; i < servers.size(); i++) if (servers.get(i).address.equals(server.address)) { @@ -137,7 +190,6 @@ private void showServers(List result) { serverModel.setValueAt(ping.online ? ping.version : "—", i, 5); serverModel.setValueAt(ping.online ? ping.latency + " ms" : "—", i, 6); } - }); } private SavedServer selectedServer() { int row = serverTable.getSelectedRow(); @@ -147,10 +199,16 @@ private SavedServer selectedServer() { private void joinSelected() { SavedServer server = selectedServer(); if (server == null) return; ServerStatus ping = serverStatuses.get(server.address); + String targetVersion = ping != null && ping.online ? gameVersionFromStatus(ping.version) : ""; List clients = clientProfiles(); - if (clients.isEmpty()) { information("Create a client profile", "Create a MODS profile in Profiles before joining a server."); return; } + if (clients.isEmpty()) { + run("Preparing your default Minecraft profile", () -> { actions.ensureDefaultProfiles(targetVersion); return actions.profiles(); }, result -> { + profiles = result; showProfiles(); refreshDefaultProfiles(); + if (clientProfiles().isEmpty()) information("Default profile unavailable", "AutoPlug could not prepare the default client. Check the activity details and try again."); + else joinSelected(); + }); return; + } ProfileInfo base = preferredBase(clients); - String targetVersion = ping != null && ping.online ? gameVersionFromStatus(ping.version) : ""; if (ping != null && ping.online) { ProfileInfo match = matchingClientProfile(clients, targetVersion, base.loader); if (match != null) { launchOnServer(server, match); return; } @@ -249,6 +307,17 @@ private JPanel profilesPage() { ProfileInfo profile = visibleProfiles.get(profileTable.convertRowIndexToModel(row)); profileDetails.setText(profile.directory + "\n" + (profile.launchable ? "Ready to launch" : "Needs migration review") + (profile.migrationSummary == null || profile.migrationSummary.isEmpty() ? "" : "\n" + profile.migrationSummary)); + String assetFolder = "PLUGINS".equalsIgnoreCase(profile.type) ? "plugins" : "mods"; + run("Checking profile content", () -> { + File folder = new File(profile.directory, assetFolder); + String[] jars = folder.list((parent, name) -> name.toLowerCase(Locale.ROOT).endsWith(".jar")); + return !folder.exists() || (jars != null && jars.length == 0); + }, empty -> { + int selected = profileTable.getSelectedRow(); + if (empty && selected >= 0 && selected < visibleProfiles.size() + && visibleProfiles.get(profileTable.convertRowIndexToModel(selected)).id.equals(profile.id)) + profileDetails.append("\nNo " + assetFolder + " added yet. Use Add JAR to build your pack, or keep this profile empty."); + }); } }); return page; } @@ -341,11 +410,17 @@ private JPanel worldsPage() { note.add(new JLabel("Singleplayer opens your original save. Managed worlds support optional sharing.")); content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; } - private void createWorld() { + private void createWorld() { createWorld(false); } + private void createWorld(boolean defaultsChecked) { List serverProfiles = new ArrayList<>(); for (ProfileInfo p : profiles) if (!"MODS".equalsIgnoreCase(p.type) && p.launchable) serverProfiles.add(p); List clientProfiles = clientProfiles(); clientProfiles.removeIf(p -> !p.launchable || p.template); - if (serverProfiles.isEmpty() || clientProfiles.isEmpty()) { information("World profiles", "Create a server profile (PLUGINS or MODS_SERVER) and a matching client MODS profile first."); return; } + if (serverProfiles.isEmpty() || clientProfiles.isEmpty()) { + if (defaultsChecked) { information("Default profiles unavailable", "AutoPlug could not prepare matching defaults. Check the activity details and try again."); return; } + run("Preparing default world profiles", () -> { actions.ensureDefaultProfiles(""); return actions.profiles(); }, result -> { + profiles = result; showProfiles(); refreshDefaultProfiles(); createWorld(true); + }); return; + } JTextField name = new JTextField(); JComboBox server = new JComboBox<>(serverProfiles.toArray(new ProfileInfo[0])); JComboBox client = new JComboBox<>(clientProfiles.toArray(new ProfileInfo[0])); JCheckBox eula = new JCheckBox("I accept the Minecraft EULA"); @@ -372,8 +447,8 @@ private void showWorlds() { for (WorldInfo world : worlds) { JPanel card = DashboardTheme.surface(new BorderLayout(18, 8), 16); card.setName("world-" + world.id); card.setAlignmentX(Component.LEFT_ALIGNMENT); - card.setMaximumSize(new Dimension(Integer.MAX_VALUE, 180)); JLabel image = DashboardTheme.worldThumbnail(); image.setToolTipText(world.name); + image.getAccessibleContext().setAccessibleName("World icon for " + world.name); if (world.thumbnail != null && !world.thumbnail.isEmpty()) run("Loading world thumbnail", () -> { File file = new File(world.thumbnail); if (!file.isFile() || file.length() > 8 * 1024 * 1024) return null; java.awt.image.BufferedImage bitmap = javax.imageio.ImageIO.read(file); @@ -387,13 +462,19 @@ private void showWorlds() { JPanel heading = DashboardTheme.transparent(new BorderLayout(0, 4)); JLabel kind = DashboardTheme.badge(world.local ? "Singleplayer" : "Managed world" + (world.running ? " · Running" : "")); JPanel badgeRow = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 0, 0)); badgeRow.add(kind); + if (world.metadataAvailable && world.quickPlayEligible) { + JLabel quickPlay = DashboardTheme.badge("Quick Play"); quickPlay.setToolTipText("This version supports direct singleplayer Quick Play."); + badgeRow.add(Box.createHorizontalStrut(6)); badgeRow.add(quickPlay); + } JLabel name = new JLabel(world.name); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); name.putClientProperty("html.disable", Boolean.TRUE); heading.add(badgeRow, BorderLayout.NORTH); heading.add(name, BorderLayout.CENTER); - details.add(heading, BorderLayout.NORTH); JTextArea description = textArea(2); + details.add(heading, BorderLayout.NORTH); JTextArea description = textArea(world.metadataAvailable ? 4 : 3); DashboardTheme.tint(description, false); description.setText((world.local ? "Minecraft " + (knownWorldVersion(world) ? world.gameVersion : "version unknown — choose before launch") - : "Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId)) + "\n" + world.directory); + : "Minecraft " + (knownWorldVersion(world) ? world.gameVersion : "version unknown") + " · Server: " + profileName(world.serverProfileId) + " · Client: " + profileName(world.clientProfileId)) + + "\n" + worldMetadata(world) + "\n" + world.directory); + description.setToolTipText(world.directory + (world.dataPacks.isEmpty() ? "" : " | Datapacks: " + String.join(", ", world.dataPacks))); details.add(description, BorderLayout.CENTER); if (world.local) details.add(toolbar(primaryButton("Launch", () -> launchLocalWorld(world)), button("Open folder", () -> openFolder(world.directory))), BorderLayout.SOUTH); else details.add(toolbar(primaryButton("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), @@ -408,11 +489,39 @@ private void showWorlds() { if (!form("Minecraft EULA", fields("Read the terms", button("Open Minecraft EULA", this::openEula), "Your agreement", accept)) || !accept.isSelected()) return; run("Saving EULA acceptance", () -> { actions.setWorldEulaAccepted(world.id, true); return null; }, ignored -> {}); })), BorderLayout.SOUTH); - card.add(details, BorderLayout.CENTER); worldCards.add(card); worldCards.add(Box.createVerticalStrut(12)); + card.add(details, BorderLayout.CENTER); + nameWorldActions(card, world.name); + worldCards.add(card); worldCards.add(Box.createVerticalStrut(12)); } worldCards.add(Box.createVerticalGlue()); worldCards.revalidate(); worldCards.repaint(); } + static String worldMetadata(WorldInfo world) { + if (!world.metadataAvailable) return "Additional save metadata unavailable"; + String played = world.lastPlayed <= 0 ? "Unknown" : DateTimeFormatter.ofPattern("d MMM yyyy, HH:mm").withZone(ZoneId.systemDefault()).format(Instant.ofEpochMilli(world.lastPlayed)); + String size = world.sizeBytes < 0 ? "Unknown" : (world.sizeComplete ? "" : "At least ") + readableSize(world.sizeBytes, !world.sizeComplete); + return "Last played: " + played + " · Size: " + size + "\n" + + (world.modded ? "Modded" : "Vanilla") + " · Cheats: " + (world.cheats ? "On" : "Off") + + " · Hardcore: " + (world.hardcore ? "On" : "Off") + " · Datapacks: " + world.dataPacks.size(); + } + static String readableSize(long bytes) { return readableSize(bytes, false); } + private static String readableSize(long bytes, boolean lowerBound) { + if (bytes < 1024) return bytes + " B"; + double value = bytes; String[] units = {"B", "KiB", "MiB", "GiB", "TiB"}; int unit = 0; + while (value >= 1024 && unit < units.length - 1) { value /= 1024; unit++; } + return String.format(Locale.ROOT, "%.1f %s", lowerBound ? Math.floor(value * 10) / 10 : value, units[unit]); + } + private static void nameWorldActions(Container container, String name) { + for (Component component : container.getComponents()) { + if (component instanceof AbstractButton) { + AbstractButton button = (AbstractButton) component; + button.getAccessibleContext().setAccessibleName(button.getText() + " — " + name); + button.setToolTipText(button.getText() + " — " + name); + } + if (component instanceof Container) nameWorldActions((Container) component, name); + } + } + private static boolean knownWorldVersion(WorldInfo world) { return world.gameVersion != null && !world.gameVersion.trim().isEmpty(); } private void launchLocalWorld(WorldInfo world) { String version = world.gameVersion; @@ -463,16 +572,10 @@ private JButton commandButton(String label, String command) { private JPanel settingsPage() { JPanel page = page("Settings", "Runtime choices, default profiles, local networking and Minecraft accounts."); - JPanel content = DashboardTheme.surface(null, 18); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); - JLabel runtime = section("Java runtimes"); content.add(runtime); - content.add(fields("Java 8 executable", java8, "Java 17 executable", java17, "Java 21 executable", java21, - "Other runtimes (major=path; …)", extraJava)); - content.add(Box.createVerticalStrut(16)); content.add(section("Defaults and networking")); - content.add(fields("Default client profile", defaultProfile, "Preferred server port", port, "Sharing", upnp)); - content.add(toolbar(primaryButton("Save settings", this::saveSettings), button("Reload", this::refreshSettings))); - content.add(Box.createVerticalStrut(24)); content.add(section("Minecraft account")); - content.add(fields("Current account", account, "Microsoft app client ID", clientId, "Account storage", rememberAccount, "Offline player name", offlineName)); - content.add(toolbar(primaryButton("Sign in with Microsoft", () -> { + JPanel identity = settingsGroup("Minecraft account"); identity.setName("settings-account"); + identity.add(stackedFields("Current account", account, "Microsoft app client ID", clientId, "Offline player name", offlineName)); + rememberAccount.setText("Remember my Microsoft account"); identity.add(rememberAccount); + identity.add(toolbar(primaryButton("Sign in with Microsoft", () -> { if (!confirm("Microsoft sign-in", "Start Microsoft device sign-in?\nYou will authorize the displayed app in your browser. AutoPlug never asks for your Microsoft password.")) return; if (clientId.getText().trim().isEmpty()) { information("Microsoft client ID", "Enter and save the public client ID of your Microsoft application before signing in."); return; } SettingsInfo settings; @@ -486,9 +589,84 @@ private JPanel settingsPage() { if (!name.matches("[A-Za-z0-9_]{1,16}")) { information("Offline player name", "Use 1–16 letters, numbers or underscores."); return; } run("Switching to offline account", () -> { actions.useOfflineAccount(name); return null; }, ignored -> refreshSettings()); }))); - JTextArea note = textArea(3); note.setText("Offline mode is for local/offline-enabled play. Online servers usually require a licensed Microsoft account.\nUPnP is used only after you explicitly choose Share; unsupported routers need manual forwarding or a tunnel."); - note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note); content.add(Box.createVerticalGlue()); - page.add(DashboardTheme.scroll(content), BorderLayout.CENTER); return page; + JTextArea note = textArea(2); note.setText("Offline mode is for local/offline-enabled play. Online servers usually require a licensed Microsoft account."); + DashboardTheme.tint(note, false); note.setBorder(new EmptyBorder(10, 0, 0, 0)); identity.add(note); + JPanel defaults = settingsGroup("Defaults and sharing"); defaults.setName("settings-defaults"); + defaults.add(stackedFields("Default client profile", defaultProfile, "Preferred server port", port)); + upnp.setText("Use UPnP when I choose Share"); defaults.add(upnp); + JTextArea sharing = textArea(2); sharing.setText("Sharing is always explicit. UPnP opens a router port only after you choose Share."); + DashboardTheme.tint(sharing, false); sharing.setBorder(new EmptyBorder(10, 0, 0, 0)); defaults.add(sharing); + JPanel advanced = settingsGroup(null); advanced.setName("settings-advanced"); + JToggleButton disclosure = new JToggleButton("Advanced"); disclosure.setIcon(DashboardTheme.icon("advanced")); + disclosure.setToolTipText("Show optional Java runtime overrides"); disclosure.getAccessibleContext().setAccessibleName("Advanced runtime settings"); + disclosure.setAlignmentX(Component.LEFT_ALIGNMENT); advanced.add(disclosure); + JPanel runtime = DashboardTheme.transparent(new BorderLayout(0, 8)); runtime.setName("advanced-runtime-fields"); + JTextArea hint = textArea(2); hint.setText("Java is resolved automatically. Override paths only when you need a specific installation."); DashboardTheme.tint(hint, false); + runtime.add(hint, BorderLayout.NORTH); + runtime.add(stackedFields("Java 8 executable", java8, "Java 17 executable", java17, "Java 21 executable", java21, "Other runtimes (major=path; …)", extraJava)); + runtime.setVisible(false); advanced.add(runtime); + alignGroup(identity); alignGroup(defaults); alignGroup(advanced); + disclosure.addActionListener(e -> { runtime.setVisible(disclosure.isSelected()); disclosure.setText(disclosure.isSelected() ? "Advanced −" : "Advanced"); page.revalidate(); }); + JPanel right = DashboardTheme.transparent(null); right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS)); + right.add(defaults); right.add(Box.createVerticalStrut(12)); right.add(advanced); + ResponsiveSettings settings = new ResponsiveSettings(identity, right); settings.setName("responsive-settings"); + page.add(DashboardTheme.scroll(settings), BorderLayout.CENTER); + JPanel save = DashboardTheme.surface(new BorderLayout(), 8); + save.add(toolbar(primaryButton("Save settings", this::saveSettings), button("Reload", this::refreshSettings))); + page.add(save, BorderLayout.SOUTH); return page; + } + + private static JPanel settingsGroup(String title) { + JPanel panel = DashboardTheme.surface(null, 16); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setAlignmentX(Component.LEFT_ALIGNMENT); + if (title != null) panel.add(section(title)); + return panel; + } + private static void alignGroup(JPanel panel) { + for (Component child : panel.getComponents()) if (child instanceof JComponent) ((JComponent) child).setAlignmentX(Component.LEFT_ALIGNMENT); + } + + private static JPanel stackedFields(Object... fields) { + JPanel panel = DashboardTheme.transparent(new GridBagLayout()); panel.setAlignmentX(Component.LEFT_ALIGNMENT); + for (int i = 0; i < fields.length; i += 2) { + JComponent control = (JComponent) fields[i + 1]; + JLabel label = new JLabel(String.valueOf(fields[i])); label.setLabelFor(control); DashboardTheme.tint(label, false); + GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = i; c.weightx = 1; c.fill = GridBagConstraints.HORIZONTAL; c.insets = new Insets(i == 0 ? 0 : 8, 0, 4, 0); + panel.add(label, c); c.gridy++; c.insets = new Insets(0, 0, 0, 0); panel.add(control, c); + control.setMinimumSize(new Dimension(80, control.getPreferredSize().height)); + } + return panel; + } + + /** Reflows real controls, preserving edits; vertical scrolling remains available at narrow sizes. */ + private static final class ResponsiveSettings extends JPanel implements Scrollable { + ResponsiveSettings(JPanel left, JPanel right) { super(null); setOpaque(false); add(left); add(right); } + private boolean wide(int width) { return width >= 780; } + @Override public void doLayout() { + int width = getWidth(); int column = wide(width) ? (width - 12) / 2 : width; int y = 0; + for (int i = 0; i < getComponentCount(); i++) { + Component child = getComponent(i); child.setSize(column, child.getPreferredSize().height); + int height = child.getPreferredSize().height; + child.setBounds(wide(width) ? i * (column + 12) : 0, wide(width) ? 0 : y, column, height); y += height + 12; + } + } + @Override public Dimension getPreferredSize() { + int width = getParent() == null ? 800 : getParent().getWidth(); int height = 0; + for (Component child : getComponents()) height = wide(width) ? Math.max(height, child.getPreferredSize().height) : height + child.getPreferredSize().height + 12; + return new Dimension(600, height); + } + public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } + public int getScrollableUnitIncrement(Rectangle visible, int orientation, int direction) { return 16; } + public int getScrollableBlockIncrement(Rectangle visible, int orientation, int direction) { return visible.height - 16; } + public boolean getScrollableTracksViewportWidth() { return true; } + public boolean getScrollableTracksViewportHeight() { return false; } + } + private static final class WorldList extends JPanel implements Scrollable { + public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } + public int getScrollableUnitIncrement(Rectangle visible, int orientation, int direction) { return 16; } + public int getScrollableBlockIncrement(Rectangle visible, int orientation, int direction) { return visible.height - 16; } + public boolean getScrollableTracksViewportWidth() { return true; } + public boolean getScrollableTracksViewportHeight() { return false; } } private void refreshSettings() { run("Loading settings", actions::settings, this::showSettings); } private void showSettings(SettingsInfo settings) { @@ -524,13 +702,70 @@ private void showSignIn(String instructions) { } private void run(String description, Callable work, Consumer success) { - if (closed.get()) return; running.incrementAndGet(); status.setText(description + "…"); + if (closed.get()) return; + int active = running.incrementAndGet(); + if (active == 1) { sourceUrl.setVisible(false); setActivity(description + "…"); } + if (active == 1 && activeDownloads == 0) progress.setIndeterminate(true); + progress.setVisible(true); try { workers.submit(() -> { try { - T result = work.call(); SwingUtilities.invokeLater(() -> { if (!closed.get()) success.accept(result); }); - } catch (Exception e) { SwingUtilities.invokeLater(() -> { if (!closed.get()) { status.setText(description + " failed: " + message(e)); error(e); } }); } - finally { running.decrementAndGet(); SwingUtilities.invokeLater(() -> { if (!closed.get()) { int remaining = running.get(); if (remaining > 0) status.setText(remaining + " background operation(s) running…"); else if (status.getText().endsWith("…")) status.setText("Ready"); } }); } - }); } catch (RejectedExecutionException ignored) { running.decrementAndGet(); } + T result = work.call(); SwingUtilities.invokeLater(() -> { + if (closed.get()) return; + String before = status.getText(); + try { success.accept(result); } + finally { finishOperation(); if (running.get() == 0 && Objects.equals(before, status.getText())) setActivity(description + " complete"); } + }); + } catch (Exception e) { SwingUtilities.invokeLater(() -> { + if (closed.get()) return; + finishOperation(); setActivity(description + " failed: " + message(e)); error(e); + }); } + }); } catch (RejectedExecutionException ignored) { finishOperation(); } + } + private void finishOperation() { + if (running.decrementAndGet() <= 0 && activeDownloads == 0) { progress.setIndeterminate(false); progress.setVisible(false); } + } + private void receiveProgress(String message) { + if (message == null || message.trim().isEmpty()) return; + SwingUtilities.invokeLater(() -> { + if (closed.get()) return; + setActivity(message); progress.setIndeterminate(running.get() > 0 || activeDownloads > 0); + java.util.regex.Matcher url = java.util.regex.Pattern.compile("https?://[^\\s<>]+", java.util.regex.Pattern.CASE_INSENSITIVE).matcher(message); + if (url.find()) { sourceUrl.setText(url.group()); sourceUrl.setCaretPosition(0); sourceUrl.setVisible(true); revalidate(); } + }); + } + private void receiveDownloadProgress(DownloadProgress.Event event) { + SwingUtilities.invokeLater(() -> { + if (closed.get()) return; + activeDownloads = event.activeTransfers; + String label = event.message + (event.complete ? " — complete" : event.finished ? " — stopped" : ""); + if (!Objects.equals(status.getText(), label)) setActivity(label); + if (event.sourceUrl != null && !event.sourceUrl.isEmpty()) { + if (!Objects.equals(sourceUrl.getText(), event.sourceUrl)) activity.append("Source: " + event.sourceUrl + "\n"); + sourceUrl.setText(event.sourceUrl); sourceUrl.setCaretPosition(0); sourceUrl.setVisible(true); + } + boolean measured = event.totalBytes > 0 && event.downloadedBytes >= 0; + progress.setIndeterminate(!measured && !event.finished); + if (measured) { + int percent = (int) Math.min(100, 100.0 * event.downloadedBytes / event.totalBytes); + progress.setValue(percent); + progress.setToolTipText(readableSize(event.downloadedBytes) + " / " + readableSize(event.totalBytes) + " — current download"); + } + if (event.finished && (running.get() > 0 || activeDownloads > 0)) progress.setIndeterminate(true); + progress.setVisible(running.get() > 0 || activeDownloads > 0); revalidate(); + }); + } + private void receiveProgressValue(Integer percent) { + SwingUtilities.invokeLater(() -> { + if (closed.get() || running.get() == 0) return; + boolean measured = percent != null && percent >= 0 && percent <= 100; + progress.setIndeterminate(!measured); + if (measured) { progress.setValue(percent); progress.setToolTipText(percent + "% of current step"); } + }); + } + private void setActivity(String message) { + status.setText(message); status.setToolTipText(message); + activity.append(message + "\n"); + if (activity.getDocument().getLength() > 100000) activity.setText(activity.getText().substring(activity.getText().length() - 80000)); } private void openFolder(String directory) { run("Opening folder", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Opening folders is unavailable on this system."); Desktop.getDesktop().open(new File(directory)); return null; }, ignored -> {}); } private void openEula() { run("Opening Minecraft EULA", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Open https://aka.ms/MinecraftEULA in your browser."); Desktop.getDesktop().browse(java.net.URI.create("https://aka.ms/MinecraftEULA")); return null; }, ignored -> {}); } @@ -545,12 +780,12 @@ private void run(String description, Callable work, Consumer success) private static JLabel section(String title) { JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 16f)); label.setBorder(new EmptyBorder(0, 0, 10, 0)); label.setAlignmentX(Component.LEFT_ALIGNMENT); return label; } private static JPanel page(String title, String description) { JPanel page = DashboardTheme.transparent(new BorderLayout(0, 16)); page.setBorder(new EmptyBorder(0, 18, 12, 0)); - JPanel heading = DashboardTheme.surface(new BorderLayout(0, 7), 18); JLabel label = new JLabel(title); label.setFont(label.getFont().deriveFont(Font.BOLD, 27f)); - heading.add(label, BorderLayout.NORTH); JLabel subtitle = new JLabel(description); DashboardTheme.tint(subtitle, false); subtitle.setFont(subtitle.getFont().deriveFont(12f)); heading.add(subtitle, BorderLayout.SOUTH); page.add(heading, BorderLayout.NORTH); return page; + page.setName("page-" + title); page.getAccessibleContext().setAccessibleName(title); page.getAccessibleContext().setAccessibleDescription(description); return page; } private static JPanel content() { return DashboardTheme.surface(new BorderLayout(0, 12), 16); } - private static JPanel toolbar(JComponent... components) { JPanel panel = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 6, 3)); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } - private static JButton button(String text, Runnable action) { JButton button = new JButton(text); button.setMargin(new Insets(6, 14, 6, 14)); button.addActionListener(e -> action.run()); return button; } + private static JPanel toolbar(JComponent... components) { JPanel panel = DashboardTheme.transparent(new WrapLayout()); for (JComponent component : components) panel.add(component); panel.setAlignmentX(Component.LEFT_ALIGNMENT); return panel; } + private static JButton button(String text, Runnable action) { JButton button = new JButton(text, DashboardTheme.icon("Add server".equals(text) ? "favorite" : text)); button.setToolTipText(text); button.getAccessibleContext().setAccessibleName(text); button.setMargin(new Insets(6, 10, 6, 10)); button.addActionListener(e -> action.run()); return button; } + private static JButton iconButton(String text, String icon, Runnable action) { JButton button = button(text, action); button.setText(""); button.setIcon(DashboardTheme.icon(icon)); return button; } private static JButton primaryButton(String text, Runnable action) { return DashboardTheme.primary(button(text, action)); } private static JTextArea textArea(int rows) { JTextArea area = new JTextArea(rows, 30); area.setEditable(false); area.setOpaque(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setFont(UIManager.getFont("Label.font")); return area; } private static DefaultTableModel model(String... columns) { return new DefaultTableModel(columns, 0) { @Override public boolean isCellEditable(int row, int column) { return false; } }; } @@ -572,8 +807,34 @@ private static JPanel fields(Object... fields) { } panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, panel.getPreferredSize().height + 16)); return panel; } + private static final class WrapLayout extends FlowLayout { + private int lastWidth = -1; + WrapLayout() { super(FlowLayout.LEFT, 6, 3); } + @Override public void layoutContainer(Container target) { + super.layoutContainer(target); + if (lastWidth != target.getWidth()) { + lastWidth = target.getWidth(); + if (target.getParent() instanceof JComponent) ((JComponent) target.getParent()).revalidate(); + } + } + @Override public Dimension preferredLayoutSize(Container target) { + int width = target.getWidth(); + if (width <= 0) return super.preferredLayoutSize(target); + Insets inset = target.getInsets(); int available = width - inset.left - inset.right - getHgap() * 2; + int rowWidth = 0, rowHeight = 0, height = getVgap() * 2, maxWidth = 0; + for (Component child : target.getComponents()) if (child.isVisible()) { + Dimension size = child.getPreferredSize(); + if (rowWidth > 0 && rowWidth + getHgap() + size.width > available) { height += rowHeight + getVgap(); maxWidth = Math.max(maxWidth, rowWidth); rowWidth = 0; rowHeight = 0; } + rowWidth += (rowWidth == 0 ? 0 : getHgap()) + size.width; rowHeight = Math.max(rowHeight, size.height); + } + return new Dimension(Math.max(maxWidth, rowWidth) + inset.left + inset.right + getHgap() * 2, height + rowHeight + inset.top + inset.bottom); + } + } @Override public void close() { if (!closed.compareAndSet(false, true)) return; workers.shutdownNow(); + progress.setIndeterminate(false); progress.setVisible(false); + actions.onProgress(null); actions.onProgressValue(null); + try { downloadSubscription.close(); } catch (Exception ignored) { } if (console != null) console.close(); if (signInDialog != null) signInDialog.dispose(); } } diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java index b5004ca4..510bd91b 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java @@ -5,6 +5,7 @@ import javax.swing.plaf.ColorUIResource; import java.awt.*; import java.awt.geom.RoundRectangle2D; +import java.awt.geom.Path2D; /** Neutral dashboard surfaces with a consistent blue accent in light and dark themes. */ final class DashboardTheme { @@ -44,6 +45,57 @@ static boolean dark() { static Color muted() { return dark() ? new Color(0xBCC8DA) : new Color(0x526176); } static Color accent() { return dark() ? new Color(0x8AB8FF) : BLUE; } + /** Small original line icons inherit the control foreground in either theme. */ + static Icon icon(String action) { + return new Icon() { + public int getIconWidth() { return 18; } + public int getIconHeight() { return 18; } + public void paintIcon(Component component, Graphics graphics, int x, int y) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.translate(x, y); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(component.isEnabled() ? component.getForeground() : muted()); + g.setStroke(new BasicStroke(1.6f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + String key = action.toLowerCase(java.util.Locale.ROOT); + if (key.contains("play") || key.contains("launch") || key.contains("join") || key.equals("start")) { + Path2D p = new Path2D.Float(); p.moveTo(5, 3); p.lineTo(15, 9); p.lineTo(5, 15); p.closePath(); g.fill(p); + } else if (key.contains("folder") || key.contains("configuration")) { + Path2D p = new Path2D.Float(); p.moveTo(2, 5); p.lineTo(7, 5); p.lineTo(9, 7); p.lineTo(16, 7); p.lineTo(15, 15); p.lineTo(2, 15); p.closePath(); g.draw(p); + } else if (key.contains("delete") || key.contains("remove")) { + g.drawLine(3, 5, 15, 5); g.drawLine(7, 2, 11, 2); g.drawRoundRect(5, 5, 8, 11, 2, 2); g.drawLine(8, 8, 8, 13); g.drawLine(10, 8, 10, 13); + } else if (key.contains("copy") || key.contains("clone")) { + g.drawRoundRect(6, 6, 9, 10, 2, 2); g.drawLine(3, 12, 3, 2); g.drawLine(3, 2, 11, 2); + } else if (key.contains("edit")) { + g.drawLine(4, 13, 13, 4); g.drawLine(7, 15, 15, 7); g.drawLine(13, 4, 15, 7); g.drawLine(4, 13, 3, 16); g.drawLine(3, 16, 7, 15); + } else if (key.contains("share")) { + g.drawLine(5, 9, 13, 4); g.drawLine(5, 9, 13, 14); g.drawOval(2, 7, 4, 4); g.drawOval(12, 1, 4, 4); g.drawOval(12, 12, 4, 4); + } else if (key.contains("refresh") || key.contains("reload") || key.contains("update") || key.contains("restart")) { + g.drawArc(3, 3, 12, 12, 40, 285); g.drawLine(15, 2, 15, 7); g.drawLine(11, 7, 15, 7); + } else if (key.contains("ping") || key.contains("activity") || key.contains("check")) { + g.drawPolyline(new int[]{1, 5, 7, 10, 12, 17}, new int[]{10, 10, 4, 15, 9, 9}, 6); + } else if (key.contains("import") || key.contains("add jar")) { + g.drawLine(9, 2, 9, 11); g.drawLine(5, 7, 9, 11); g.drawLine(13, 7, 9, 11); g.drawPolyline(new int[]{3, 3, 15, 15}, new int[]{12, 16, 16, 12}, 4); + } else if (key.contains("eula")) { + g.drawRoundRect(3, 2, 12, 14, 2, 2); g.drawLine(6, 6, 12, 6); g.drawLine(6, 9, 12, 9); g.drawLine(6, 12, 10, 12); + } else if (key.contains("settings") || key.contains("advanced")) { + for (int row = 4; row <= 14; row += 5) { g.drawLine(2, row, 16, row); g.fillOval(row == 9 ? 10 : 4, row - 2, 4, 4); } + } else if (key.contains("world")) { + g.drawOval(2, 2, 14, 14); g.drawOval(6, 2, 6, 14); g.drawLine(2, 9, 16, 9); + } else if (key.contains("server")) { + g.drawRoundRect(2, 2, 14, 6, 2, 2); g.drawRoundRect(2, 10, 14, 6, 2, 2); g.fillOval(4, 4, 2, 2); g.fillOval(4, 12, 2, 2); + } else if (key.contains("favorite") || key.contains("template")) { + Path2D p = new Path2D.Float(); for (int n = 0; n < 10; n++) { double angle = -Math.PI / 2 + n * Math.PI / 5, r = n % 2 == 0 ? 7 : 3.2; double px = 9 + Math.cos(angle) * r, py = 9 + Math.sin(angle) * r; if (n == 0) p.moveTo(px, py); else p.lineTo(px, py); } p.closePath(); g.draw(p); + } else if (key.contains("profile") || key.contains("sign in") || key.contains("offline")) { + g.drawOval(6, 2, 6, 6); g.drawArc(3, 10, 12, 11, 0, 180); + } else if (key.contains("save") || key.contains("back")) { + g.drawRoundRect(3, 2, 12, 14, 2, 2); g.drawRect(6, 3, 6, 4); g.drawRect(6, 11, 6, 5); + } else if (key.equals("stop")) g.fillRoundRect(4, 4, 10, 10, 2, 2); + else { g.drawLine(3, 9, 15, 9); g.drawLine(9, 3, 9, 15); } + } finally { g.dispose(); } + } + }; + } + static JButton primary(JButton button) { button.setBackground(BLUE); button.setForeground(Color.WHITE); button.setFont(button.getFont().deriveFont(Font.BOLD)); @@ -146,6 +198,7 @@ static JLabel worldThumbnail() { private static final class Surface extends JPanel { Surface(LayoutManager layout) { super(layout); setOpaque(false); } + @Override public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, getPreferredSize().height); } @Override protected void paintComponent(Graphics graphics) { Graphics2D g = (Graphics2D) graphics.create(); try { diff --git a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java index 8bd6b5d6..00938998 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java +++ b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java @@ -8,6 +8,12 @@ /** Application services used by the dashboard. Calls run outside Swing's event thread. */ public interface LauncherActions { + /** Replaces the dashboard's activity listener; null releases it. Callbacks may arrive on any thread. */ + default void onProgress(Consumer listener) {} + /** Optional measured current-step progress (0–100); null or a negative value means indeterminate. */ + default void onProgressValue(Consumer listener) {} + /** Ensures compatible ready vanilla client/server defaults without replacing a valid user selection. */ + default ProfileInfo ensureDefaultProfiles(String gameVersion) throws Exception { throw unavailable(); } default List profiles() throws Exception { return Collections.emptyList(); } default ProfileInfo createProfile(String name, String version, String loader, String type, boolean template) throws Exception { throw unavailable(); } default ProfileInfo cloneProfile(String sourceId, String name, String targetVersion, String loader) throws Exception { throw unavailable(); } @@ -20,7 +26,7 @@ public interface LauncherActions { default WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { throw unavailable(); } default void setWorldEulaAccepted(String id, boolean accepted) throws Exception { throw unavailable(); } default void launchWorld(String id, boolean share) throws Exception { throw unavailable(); } - /** Opens an existing singleplayer save and returns instructions if the game needs manual selection. */ + /** Starts an existing singleplayer save and returns the backend's launch status. */ default String launchLocalWorld(String id, String version) throws Exception { throw unavailable(); } default String shareWorld(String id) throws Exception { throw unavailable(); } default void launchProfile(String profileId, String host, int port) throws Exception { throw unavailable(); } @@ -51,12 +57,28 @@ public ProfileInfo(String id, String name, String gameVersion, String loader, St final class WorldInfo { public final String id, name, serverProfileId, clientProfileId, directory, thumbnail, gameVersion; public final boolean running, local; + public final boolean modded, sizeComplete, cheats, hardcore, quickPlayEligible, metadataAvailable; + public final long lastPlayed, sizeBytes; + public final List dataPacks; public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running) { this(id, name, serverProfileId, clientProfileId, directory, thumbnail, running, false, ""); } public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running, boolean local, String gameVersion) { + this(id, name, serverProfileId, clientProfileId, directory, thumbnail, running, local, gameVersion, + false, -1, -1, false, Collections.emptyList(), false, false, false, false); + } + public WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running, boolean local, String gameVersion, + boolean modded, long lastPlayed, long sizeBytes, boolean sizeComplete, List dataPacks, boolean cheats, boolean hardcore, boolean quickPlayEligible) { + this(id, name, serverProfileId, clientProfileId, directory, thumbnail, running, local, gameVersion, + modded, lastPlayed, sizeBytes, sizeComplete, dataPacks, cheats, hardcore, quickPlayEligible, true); + } + private WorldInfo(String id, String name, String serverProfileId, String clientProfileId, String directory, String thumbnail, boolean running, boolean local, String gameVersion, + boolean modded, long lastPlayed, long sizeBytes, boolean sizeComplete, List dataPacks, boolean cheats, boolean hardcore, boolean quickPlayEligible, boolean metadataAvailable) { this.id = id; this.name = name; this.serverProfileId = serverProfileId; this.clientProfileId = clientProfileId; this.directory = directory; this.thumbnail = thumbnail; this.running = running; this.local = local; this.gameVersion = gameVersion == null ? "" : gameVersion; + this.modded = modded; this.lastPlayed = lastPlayed; this.sizeBytes = sizeBytes; this.sizeComplete = sizeComplete; + this.dataPacks = Collections.unmodifiableList(new java.util.ArrayList<>(dataPacks == null ? Collections.emptyList() : dataPacks)); + this.cheats = cheats; this.hardcore = hardcore; this.quickPlayEligible = quickPlayEligible; this.metadataAvailable = metadataAvailable; } @Override public String toString() { return name; } } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java b/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java index 9c4f54ed..f3ed929d 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/LevelDatReader.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -11,7 +12,9 @@ final class LevelDatReader { static final class Metadata { String name = "", version = ""; - boolean modded; + boolean modded, cheats, hardcore; + long lastPlayed = -1; + List dataPacks = new ArrayList<>(); } Metadata read(Path path) throws IOException { @@ -29,6 +32,23 @@ Metadata read(Path path) throws IOException { if (name instanceof String) result.version = (String) name; } result.modded = data.get("WasModded") instanceof Number && ((Number) data.get("WasModded")).intValue() != 0; + result.cheats = numericFlag(data, "allowCommands"); + result.hardcore = numericFlag(data, "hardcore"); + Object lastPlayed = data.get("LastPlayed"); + if (lastPlayed != null && !(lastPlayed instanceof Number)) throw new IOException("Invalid LastPlayed tag"); + if (lastPlayed instanceof Number) result.lastPlayed = Math.max(-1, ((Number) lastPlayed).longValue()); + Object packs = data.get("DataPacks"); + if (packs != null && !(packs instanceof Map)) throw new IOException("Invalid DataPacks tag"); + if (packs instanceof Map) { + Object enabled = ((Map) packs).get("Enabled"); + if (enabled != null && !(enabled instanceof List)) throw new IOException("Invalid enabled datapacks tag"); + if (enabled instanceof List) for (Object pack : (List) enabled) { + if (!(pack instanceof String)) throw new IOException("Invalid datapack name"); + if (result.dataPacks.size() == 256) break; + String name = (String) pack; + result.dataPacks.add(name.length() > 256 ? name.substring(0, 256) + "…" : name); + } + } for (String marker : Arrays.asList("FML", "fml", "ForgeData", "forge", "neoforge", "fabric", "Mods", "mods", "ModList")) if (root.containsKey(marker) || data.containsKey(marker)) result.modded = true; Object brands = data.get("ServerBrands"); @@ -36,4 +56,9 @@ Metadata read(Path path) throws IOException { if (brand instanceof String && !"vanilla".equals(brand)) result.modded = true; return result; } + private static boolean numericFlag(Map data, String key) throws IOException { + Object value = data.get(key); + if (value != null && !(value instanceof Number)) throw new IOException("Invalid " + key + " tag"); + return value instanceof Number && ((Number) value).intValue() != 0; + } } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java index 2798c8bf..e805c3c6 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorld.java @@ -1,16 +1,36 @@ package com.osiris.autoplug.client.worlds; import java.nio.file.Path; +import java.util.Collections; +import java.util.ArrayList; +import java.util.List; /** A read-only view of an existing Minecraft save; it is never a managed server. */ public final class LocalWorld { public final String id, name, gameVersion; public final Path directory, gameDirectory, icon; public final boolean modded; + public final boolean cheats, hardcore, quickPlayEligible, sizeComplete; + public final long lastPlayed, sizeBytes; + public final List dataPacks; LocalWorld(String id, String name, String gameVersion, Path directory, Path gameDirectory, Path icon, boolean modded) { + this(id, name, gameVersion, directory, gameDirectory, icon, modded, -1, -1, false, Collections.emptyList(), false, false); + } + LocalWorld(String id, String name, String gameVersion, Path directory, Path gameDirectory, Path icon, boolean modded, + long lastPlayed, long sizeBytes, boolean sizeComplete, List dataPacks, boolean cheats, boolean hardcore) { this.id = id; this.name = name; this.gameVersion = gameVersion; this.directory = directory; this.gameDirectory = gameDirectory; this.icon = icon; this.modded = modded; + this.lastPlayed = lastPlayed; this.sizeBytes = sizeBytes; this.sizeComplete = sizeComplete; + this.dataPacks = Collections.unmodifiableList(new ArrayList<>(dataPacks)); this.cheats = cheats; this.hardcore = hardcore; + this.quickPlayEligible = !modded && supportsQuickPlay(gameVersion); + } + LocalWorld withId(String id) { return new LocalWorld(id, name, gameVersion, directory, gameDirectory, icon, modded, lastPlayed, sizeBytes, sizeComplete, dataPacks, cheats, hardcore); } + private static boolean supportsQuickPlay(String version) { + java.util.regex.Matcher match = java.util.regex.Pattern.compile("^(\\d+)\\.(\\d+)(?:\\.\\d+)?(?:[- ].*)?$").matcher(version); + if (!match.matches()) return false; + try { return Integer.parseInt(match.group(1)) > 1 || (Integer.parseInt(match.group(1)) == 1 && Integer.parseInt(match.group(2)) >= 20); } + catch (NumberFormatException e) { return false; } } /** The directory name, rather than LevelName, is what Minecraft Quick Play accepts. */ diff --git a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java index 417096ed..c6453541 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/LocalWorldStore.java @@ -3,12 +3,13 @@ import com.osiris.autoplug.client.browser.ServerBrowserService; import java.io.*; import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; -/** Discovers standard local saves in place. There are intentionally no create, save, or delete methods. */ +/** Discovers standard local saves in place. Discovery never writes to the saves. */ public final class LocalWorldStore { private static final String PREFIX = "local:"; private final Path minecraft; @@ -52,15 +53,48 @@ public LocalWorld get(String id) throws IOException { if (!directory.getParent().equals(saves) || !Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(directory) || !directory.toRealPath().equals(saves.toRealPath().resolve(name))) throw new IOException("Linked or external save directories are not supported"); + return inspect(id, directory, minecraft); + } + + /** Read only bounded metadata; used for both existing local saves and managed server saves. */ + public static LocalWorld inspect(String id, Path directory, Path gameDirectory) throws IOException { + directory = directory.toAbsolutePath().normalize(); + if (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(directory) + || !directory.toRealPath().equals(directory.getParent().toRealPath().resolve(directory.getFileName()))) + throw new IOException("Linked or external save directories are not supported"); Path level = directory.resolve("level.dat"); if (!regularChild(level, directory)) throw new IOException("Missing or linked level.dat"); LevelDatReader.Metadata metadata = new LevelDatReader().read(level); String display = metadata.name.trim(); - if (display.isEmpty()) display = name; + if (display.isEmpty()) display = directory.getFileName().toString(); Path icon = directory.resolve("icon.png"); try { if (!safeIcon(icon, directory)) icon = null; } catch (IOException e) { icon = null; } // An unreadable thumbnail must not hide a valid save. - return new LocalWorld(id, display, metadata.version, directory, minecraft, icon, metadata.modded); + long[] size = directorySize(directory, 10000); + return new LocalWorld(id, display, metadata.version, directory, gameDirectory, icon, metadata.modded, + metadata.lastPlayed, size[0], size[1] == 1, metadata.dataPacks, metadata.cheats, metadata.hardcore); + } + + /** A lower bound is returned if traversal hits its entry/depth/time budget or inaccessible data. */ + static long[] directorySize(Path directory, int maxEntries) { + long[] result = {0, 1}; int[] entries = {0}; long deadline = System.nanoTime() + 100_000_000L; + try { + Files.walkFileTree(directory, EnumSet.noneOf(FileVisitOption.class), 32, new SimpleFileVisitor() { + private FileVisitResult budget() { + if (++entries[0] > maxEntries || System.nanoTime() > deadline) { result[1] = 0; return FileVisitResult.TERMINATE; } + return FileVisitResult.CONTINUE; + } + @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { return budget(); } + @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + if (budget() == FileVisitResult.TERMINATE) return FileVisitResult.TERMINATE; + if (attrs.isRegularFile()) result[0] += attrs.size(); else result[1] = 0; + return FileVisitResult.CONTINUE; + } + @Override public FileVisitResult visitFileFailed(Path file, IOException error) { result[1] = 0; return budget(); } + @Override public FileVisitResult postVisitDirectory(Path dir, IOException error) { if (error != null) result[1] = 0; return FileVisitResult.CONTINUE; } + }); + } catch (IOException | SecurityException e) { result[1] = 0; } + return result; } /** Preserve the exact recorded build; require an explicit choice for older unknown saves. */ diff --git a/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java b/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java index 999f9c3f..9097ddbe 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/WorldStore.java @@ -13,6 +13,9 @@ /** Persistent metadata; never places a world save inside a reusable profile. */ public final class WorldStore { + private static final class LocalReference { + String id, localId, directory; + } private final Path root; private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); @@ -53,6 +56,64 @@ public synchronized List list() throws IOException { return worlds; } + /** Register ownership without moving, copying, linking or rewriting the user's save. */ + public synchronized LocalWorld registerLocal(LocalWorld world) throws IOException { + return ownedLocal(world, true); + } + + /** Discovery only consults an existing entry, so opening the browser remains read-only. */ + public synchronized LocalWorld ownedLocal(LocalWorld world, boolean create) throws IOException { + String source = world.directory.toRealPath().toString(); + String id = "world-" + UUID.nameUUIDFromBytes(source.getBytes(StandardCharsets.UTF_8)); + Path directory = metadataDirectory(id), file = directory.resolve("local-world.json"); + if (Files.exists(file, LinkOption.NOFOLLOW_LINKS)) { + LocalReference reference = readLocal(id); + if (!source.equals(reference.directory) || !("local:" + world.saveName()).equals(reference.localId)) + throw new IOException("Local world ownership does not match the save"); + return world.withId(id); + } + if (!create) return world; + if (Files.exists(directory, LinkOption.NOFOLLOW_LINKS)) { + // An interrupted metadata write may leave an empty directory. Reuse it, + // but never adopt a directory containing unrecognized user data. + try (DirectoryStream entries = Files.newDirectoryStream(directory)) { + if (entries.iterator().hasNext()) throw new IOException("World ownership directory already contains unrecognized data"); + } + } else Files.createDirectory(directory); + LocalReference reference = new LocalReference(); reference.id = id; + reference.localId = "local:" + world.saveName(); reference.directory = source; + Path temporary = Files.createTempFile(directory, "local-world-", ".tmp"); + try { + Files.write(temporary, gson.toJson(reference).getBytes(StandardCharsets.UTF_8)); + try { Files.move(temporary, file, StandardCopyOption.ATOMIC_MOVE); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, file); } + } finally { Files.deleteIfExists(temporary); } + return world.withId(id); + } + + public synchronized LocalWorld getLocal(String id, LocalWorldStore localWorlds) throws IOException { + if (id != null && id.startsWith("local:")) return ownedLocal(localWorlds.get(id), false); + LocalReference reference = readLocal(id); + LocalWorld world = localWorlds.get(reference.localId); + if (!world.directory.toRealPath().toString().equals(reference.directory)) throw new IOException("Local world moved or reference is invalid"); + LocalWorld owned = ownedLocal(world, false); + if (!owned.id.equals(id)) throw new IOException("Local world ownership identity does not match"); + return owned; + } + + private LocalReference readLocal(String id) throws IOException { + if (id == null || !id.matches("world-[a-f0-9-]{36}")) throw new IOException("Invalid owned local world identifier"); + Path file = metadataDirectory(id).resolve("local-world.json"); + if (!Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(file) || Files.size(file) > 16384) + throw new IOException("Missing or invalid local world ownership metadata"); + try (Reader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { + LocalReference reference = gson.fromJson(reader, LocalReference.class); + if (reference == null || !id.equals(reference.id) || reference.localId == null || reference.directory == null) + throw new IOException("Invalid local world ownership metadata"); + return reference; + } catch (com.google.gson.JsonParseException e) { throw new IOException("Invalid local world ownership metadata", e); } + } + public synchronized VirtualWorld get(String id) throws IOException { Path file = metadataDirectory(id).resolve("world.json"); try (Reader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { @@ -104,6 +165,9 @@ private Path metadataDirectory(String id) throws IOException { if (id == null || !id.matches("[a-zA-Z0-9_-]{1,80}")) throw new IllegalArgumentException("Invalid world id"); Path directory = root.resolve(id).normalize(); if (!directory.startsWith(root) || Files.isSymbolicLink(directory)) throw new IOException("Unsafe world directory"); + if (Files.exists(directory, LinkOption.NOFOLLOW_LINKS) + && (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS) || !directory.toRealPath().equals(root.toRealPath().resolve(id)))) + throw new IOException("Linked or external world ownership directories are not supported"); return directory; } } diff --git a/src/main/java/com/osiris/autoplug/legacy/LegacyWorldAgent.java b/src/main/java/com/osiris/autoplug/legacy/LegacyWorldAgent.java new file mode 100644 index 00000000..0377ebd0 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/legacy/LegacyWorldAgent.java @@ -0,0 +1,156 @@ +package com.osiris.autoplug.legacy; + +import java.io.InputStream; +import java.io.IOException; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.LinkOption; +import java.nio.file.Paths; +import java.util.Properties; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Java 8 bootstrap for unmodified, pre-Quick-Play vanilla clients. No transformer, + * replacement game classes, save conversion, or input/keyboard automation is used. + * Member names come from exact-version publisher mappings or a pinned, bytecode-verified adapter. + */ +public final class LegacyWorldAgent { + private LegacyWorldAgent() { } + + public static void premain(String configuration, Instrumentation instrumentation) throws Exception { + final Properties names = new Properties(); + try (InputStream input = Files.newInputStream(Paths.get(configuration))) { names.load(input); } + for (String key : new String[]{"minecraft", "instance", "screen", "title", "load", "world", "gameDir"}) + if (names.getProperty(key, "").isEmpty()) throw new IllegalArgumentException("Missing legacy launch setting: " + key); + String world = names.getProperty("world"); + if (world.equals(".") || world.equals("..") || world.indexOf('/') >= 0 || world.indexOf('\\') >= 0 || world.indexOf(':') >= 0) + throw new IllegalArgumentException("Invalid save folder."); + validateSave(names); + final AtomicBoolean finished = new AtomicBoolean(); + final AtomicBoolean queued = new AtomicBoolean(); + Thread watcher = new Thread(() -> { + long deadline = System.nanoTime() + 300_000_000_000L; + try { + Class minecraft = null; + while (!finished.get() && System.nanoTime() < deadline) { + // Do not proactively load game classes. Discover classes loaded by + // the normal entry point; reflective access also waits for class init. + if (minecraft == null) for (Class loaded : instrumentation.getAllLoadedClasses()) + if (loaded.getName().equals(names.getProperty("minecraft"))) { minecraft = loaded; break; } + if (minecraft != null) { + Object instance = method(minecraft, names.getProperty("instance")).invoke(null); + if (instance != null && queued.compareAndSet(false, true)) { + Runnable action = () -> { + try { + if (!finished.get()) tryOpen(instance, names, () -> { + if (!finished.compareAndSet(false, true)) throw new IllegalStateException("Automatic world entry was cancelled before handoff."); + }); + } catch (Throwable failure) { + finished.set(true); + reportFailure(failure); + } finally { queued.set(false); } + }; + if (names.getProperty("scheduler") != null) + method(minecraft, names.getProperty("scheduler"), Runnable.class).invoke(instance, action); + else if (instance instanceof Executor) ((Executor) instance).execute(action); + else throw new IllegalStateException("Minecraft does not expose the expected main-thread executor."); + } + } + Thread.sleep(250); + } + if (finished.compareAndSet(false, true)) { + System.err.println("[AutoPlug] Automatic world entry timed out while waiting for Minecraft's title screen. Check the game's startup or consent screen; no save was changed by the helper."); + } + } catch (Throwable failure) { finished.set(true); reportFailure(failure); } + }, "AutoPlug legacy world entry"); + watcher.setDaemon(true); + watcher.start(); + System.out.println("[AutoPlug] Automatic world entry is waiting for Minecraft to finish loading."); + } + + /** Must run on the Minecraft executor. Returning false preserves startup/consent screens. */ + public static boolean tryOpen(Object minecraft, Properties names) throws Exception { + return tryOpen(minecraft, names, () -> { }); + } + + private static boolean tryOpen(Object minecraft, Properties names, Runnable beforeLoad) throws Exception { + Field screenField = minecraft.getClass().getDeclaredField(names.getProperty("screen")); + screenField.setAccessible(true); + Object screen = screenField.get(minecraft); + if (screen == null || !screen.getClass().getName().equals(names.getProperty("title"))) return false; + if (names.getProperty("overlay") != null && method(minecraft.getClass(), names.getProperty("overlay")).invoke(minecraft) != null) return false; + // Recheck after a potentially long game startup. A removed or replaced save + // must not become a newly created world or an external-directory write. + validateSave(names); + String flow = names.getProperty("flows", ""); + if (names.getProperty("levelSource") != null) { + Object source = method(minecraft.getClass(), names.getProperty("levelSource")).invoke(minecraft); + String folder = names.getProperty("world"); + if (!Boolean.TRUE.equals(method(source.getClass(), names.getProperty("levelExists"), String.class).invoke(source, folder))) + throw new IOException("The selected save no longer exists; refusing to create a replacement."); + Object summaries = method(source.getClass(), names.getProperty("levelList")).invoke(source); + String displayName = null; + for (Object summary : (Iterable) summaries) { + if (folder.equals(method(summary.getClass(), names.getProperty("levelId")).invoke(summary))) { + displayName = (String) method(summary.getClass(), names.getProperty("levelName")).invoke(summary); break; + } + } + if (displayName == null) throw new IOException("Minecraft could not read the selected save's original name."); + Class settings = Class.forName(names.getProperty("settingsType"), false, minecraft.getClass().getClassLoader()); + // 1.14/1.15 write this display name back. Match WorldListEntry exactly; + // substituting the directory name would silently rename the save. + beforeLoad.run(); + method(minecraft.getClass(), names.getProperty("load"), String.class, String.class, settings).invoke(minecraft, folder, displayName, null); + } else if (flow.isEmpty()) { + beforeLoad.run(); + method(minecraft.getClass(), names.getProperty("load"), String.class).invoke(minecraft, names.getProperty("world")); + } else { + Object opener = method(minecraft.getClass(), flow).invoke(minecraft); + if (names.getProperty("screenType") == null) { + beforeLoad.run(); + method(opener.getClass(), names.getProperty("load"), String.class).invoke(opener, names.getProperty("world")); + } else { + Class screenType = Class.forName(names.getProperty("screenType"), false, minecraft.getClass().getClassLoader()); + beforeLoad.run(); + method(opener.getClass(), names.getProperty("load"), screenType, String.class).invoke(opener, screen, names.getProperty("world")); + } + } + System.out.println("[AutoPlug] Requested the selected save through Minecraft's normal integrated-world loading flow."); + return true; + } + + private static Method method(Class owner, String name, Class... parameters) throws Exception { + for (Class current = owner; current != null; current = current.getSuperclass()) { + try { + Method result = current.getDeclaredMethod(name, parameters); + result.setAccessible(true); + return result; + } catch (NoSuchMethodException ignored) { } + } + throw new NoSuchMethodException(owner.getName() + "." + name); + } + + private static void validateSave(Properties names) throws IOException { + Path game = Paths.get(names.getProperty("gameDir")).toAbsolutePath().normalize(); + Path saves = game.resolve("saves"), world = saves.resolve(names.getProperty("world")); + Path level = world.resolve("level.dat"); + if (!Files.isDirectory(saves, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(saves) + || !saves.toRealPath().equals(game.toRealPath().resolve("saves")) + || !Files.isDirectory(world, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(world) + || !world.toRealPath().equals(saves.toRealPath().resolve(world.getFileName())) + || !Files.isRegularFile(level, LinkOption.NOFOLLOW_LINKS) || Files.isSymbolicLink(level) + || !level.toRealPath().equals(world.toRealPath().resolve("level.dat"))) + throw new IOException("The original save is missing or linked; automatic world entry was cancelled."); + } + + private static void reportFailure(Throwable failure) { + Throwable cause = failure instanceof InvocationTargetException ? ((InvocationTargetException) failure).getTargetException() : failure; + System.err.println("[AutoPlug] Automatic world entry failed: " + cause.getClass().getSimpleName() + ": " + cause.getMessage()); + cause.printStackTrace(System.err); + } +} diff --git a/src/main/resources/launcher/legacy/1.12.2.properties b/src/main/resources/launcher/legacy/1.12.2.properties new file mode 100644 index 00000000..3df5f830 --- /dev/null +++ b/src/main/resources/launcher/legacy/1.12.2.properties @@ -0,0 +1,17 @@ +# Narrow compatibility adapter verified against the original Mojang client bytecode. +# MCP SRG names: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp/1.12.2/mcp-1.12.2-srg.zip +# Friendly names: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_stable/39-1.12/mcp_stable-39-1.12.zip +# No game classes are redistributed. See legacy-adapter-1.12.2-evidence.txt in tests. +clientSha1=0f275bc1547d01fa5f56ba34bdc87d981ee12daf +minecraft=bib +instance=z +screen=m +title=blr +scheduler=a +load=a +levelSource=g +settingsType=amx +levelList=b +levelExists=f +levelId=a +levelName=b diff --git a/src/main/resources/launcher/legacy/1.13.2.properties b/src/main/resources/launcher/legacy/1.13.2.properties new file mode 100644 index 00000000..f70424cf --- /dev/null +++ b/src/main/resources/launcher/legacy/1.13.2.properties @@ -0,0 +1,15 @@ +# Verified Mojang client bytecode + Forge MCPConfig 1.13.2 TSRG mappings. +# See src/test/resources/launcher/legacy-adapter-1.13.2-evidence.txt for sources. +clientSha1=30bfe37a8db404db11c7edf02cb5165817afb4d9 +minecraft=cft +instance=s +screen=m +title=cki +scheduler=a +load=a +levelSource=g +settingsType=ayd +levelList=b +levelExists=f +levelId=a +levelName=b diff --git a/src/main/resources/launcher/legacy/1.7.10.properties b/src/main/resources/launcher/legacy/1.7.10.properties new file mode 100644 index 00000000..fec7f02b --- /dev/null +++ b/src/main/resources/launcher/legacy/1.7.10.properties @@ -0,0 +1,15 @@ +# Verified Mojang client bytecode + Forge MCP 1.7.10 SRG mappings. +# See src/test/resources/launcher/legacy-adapter-1.7.10-evidence.txt for sources. +clientSha1=e80d9b3bf5085002218d4be59e668bac718abbc6 +minecraft=bao +instance=B +screen=n +title=bee +scheduler=a +load=a +levelSource=d +settingsType=ahj +levelList=b +levelExists=f +levelId=a +levelName=b diff --git a/src/main/resources/launcher/legacy/1.8.9.properties b/src/main/resources/launcher/legacy/1.8.9.properties new file mode 100644 index 00000000..c94dcac6 --- /dev/null +++ b/src/main/resources/launcher/legacy/1.8.9.properties @@ -0,0 +1,15 @@ +# Verified Mojang client bytecode + Forge MCP 1.8.9 SRG mappings. +# See src/test/resources/launcher/legacy-adapter-1.8.9-evidence.txt for sources. +clientSha1=3870888a6c3d349d3771a3e9d16c9bf5e076b908 +minecraft=ave +instance=A +screen=m +title=aya +scheduler=a +load=a +levelSource=f +settingsType=adp +levelList=b +levelExists=f +levelId=a +levelName=b diff --git a/src/test/java/com/osiris/autoplug/client/launcher/DownloadProgressTest.java b/src/test/java/com/osiris/autoplug/client/launcher/DownloadProgressTest.java new file mode 100644 index 00000000..518e8438 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/DownloadProgressTest.java @@ -0,0 +1,188 @@ +package com.osiris.autoplug.client.launcher; + +import com.osiris.autoplug.client.tasks.updater.TaskDownload; +import com.osiris.betterthread.BThreadManager; +import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.*; + +class DownloadProgressTest { + @TempDir Path temporary; + + @Test void sourceUrlsRetainUsefulFiltersAndRedactCredentials() { + String original = "https://name:secret@example.test/download?version=1.21.1&arch=x64&access_token=private&X-Amz-Signature=signature&api%5Fkey=private#access_token=private"; + String safe = DownloadProgress.sourceUrl(original); + assertEquals("https://[redacted]@example.test/download?version=1.21.1&arch=x64&access_token=[redacted]&X-Amz-Signature=[redacted]&api%5Fkey=[redacted]#[redacted]", safe); + assertFalse(safe.contains("secret")); + assertFalse(safe.contains("private")); + assertEquals("https://example.test/a%20b.jar?version=1.21&loader=fabric", DownloadProgress.sourceUrl("https://example.test/a%20b.jar?version=1.21&loader=fabric")); + assertEquals("[invalid source URL]", DownloadProgress.sourceUrl("not-a-url?token=private")); + assertEquals("Source HTTPS://example.test/file?token=[redacted]", DownloadProgress.sanitizeUrls("Source HTTPS://example.test/file?token=private")); + } + + @Test void metadataFetchEmitsSourceAndUnknownLengthProgress() throws Exception { + HttpServer server = server("{\"versions\":[]}", true, 200); + List events = new CopyOnWriteArrayList<>(); + String source = url(server) + "/manifest?channel=release"; + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + assertTrue(LauncherFiles.json(source).has("versions")); + } finally { server.stop(0); } + assertEquals(source, events.get(0).sourceUrl); + assertEquals(-1, events.get(0).totalBytes); + DownloadProgress.Event last = events.get(events.size() - 1); + assertTrue(last.complete); + assertTrue(last.downloadedBytes > 0); + assertEquals(-1, last.totalBytes); + } + + @Test void downloadsEmitMeasuredProgressAndCacheHitsDoNotClaimDownloads() throws Exception { + String content = "verified fixture"; + HttpServer server = server(content, false, 200); + List events = new CopyOnWriteArrayList<>(); + List callbacks = new ArrayList<>(); + String source = url(server) + "/client.jar?version=1.21&token=private"; + Path target = temporary.resolve("client.jar"); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + LauncherFiles.download(source, target, null, content.length(), callbacks::add); + int before = events.size(); + LauncherFiles.download(source, target, null, content.length(), callbacks::add); + assertEquals(before, events.size()); + } finally { server.stop(0); } + assertEquals(content, new String(Files.readAllBytes(target), StandardCharsets.UTF_8)); + assertTrue(events.stream().anyMatch(event -> event.totalBytes == content.length() && !event.complete)); + assertTrue(events.get(events.size() - 1).complete); + assertTrue(callbacks.get(0).contains("from " + url(server))); + assertFalse(callbacks.toString().contains("private")); + assertFalse(events.stream().anyMatch(event -> event.sourceUrl != null && event.sourceUrl.contains("private"))); + } + + @Test void assetWorkerDownloadsReachSubscribersEvenWithoutCallbacks() throws Exception { + HttpServer server = server("asset", false, 200); + List events = new CopyOnWriteArrayList<>(); + ExecutorService workers = Executors.newFixedThreadPool(3); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + List> futures = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + final int id = i; + futures.add(workers.submit(() -> { + try { LauncherFiles.download(url(server) + "/objects/" + id, temporary.resolve("asset-" + id), null, 5, value -> { }); } + catch (IOException e) { throw new IllegalStateException(e); } + })); + } + for (Future future : futures) future.get(); + } finally { workers.shutdownNow(); server.stop(0); } + assertEquals(3, events.stream().filter(event -> event.complete).count()); + for (int i = 0; i < 3; i++) { + String suffix = "/objects/" + i; + assertTrue(events.stream().anyMatch(event -> event.sourceUrl.endsWith(suffix))); + } + } + + @Test void failedDownloadsExposeSafeSourceAndNeverCompletion() throws Exception { + HttpServer server = server("missing", false, 404); + List events = new ArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + IOException failure = assertThrows(IOException.class, () -> LauncherFiles.download(url(server) + "/library?token=private", temporary.resolve("missing.jar"), null, -1, null)); + assertTrue(failure.getMessage().contains("token=[redacted]")); + assertFalse(failure.getMessage().contains("private")); + assertFalse(events.stream().anyMatch(event -> event.complete)); + assertFalse(Files.exists(temporary.resolve("missing.jar"))); + } finally { server.stop(0); } + } + + @Test void updaterArtifactsPublishSourceAndBytes() throws Exception { + HttpServer server = server("plugin", false, 200); + List events = new ArrayList<>(); + Path target = temporary.resolve("plugin.jar"); + String source = url(server) + "/plugin.jar?token=private"; + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + new TaskDownload("test", new BThreadManager(), source, target.toFile(), true).runAtStart(); + } finally { server.stop(0); } + assertTrue(events.stream().anyMatch(event -> event.sourceUrl.equals(DownloadProgress.sourceUrl(source)))); + DownloadProgress.Event last = events.get(events.size() - 1); + assertTrue(last.complete); assertEquals(6, last.downloadedBytes); assertEquals(6, last.totalBytes); + } + + @Test void officialInstallerOutputIsForwardedAndPersistedWithoutTokens() throws Exception { + List events = new CopyOnWriteArrayList<>(); + List logs = new CopyOnWriteArrayList<>(); + Path java = Paths.get(System.getProperty("java.home"), "bin", JavaRuntimeManager.executableName()); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + LoaderInstaller.run(java, Arrays.asList("-cp", System.getProperty("java.class.path"), InstallerFixture.class.getName()), temporary, logs::add); + } + assertTrue(events.stream().anyMatch(event -> event.sourceUrl != null && event.sourceUrl.contains("/library.jar?version=1&token=[redacted]"))); + String file = new String(Files.readAllBytes(temporary.resolve("autoplug-loader-install.log")), StandardCharsets.UTF_8); + assertTrue(file.contains("Installing processors")); + assertFalse(file.contains("private")); + assertFalse(logs.toString().contains("private")); + } + + @Test void listenerDisposalAndFailureDoNotAffectOtherObservers() throws Exception { + AtomicInteger events = new AtomicInteger(); + try (AutoCloseable faulty = DownloadProgress.subscribe(event -> { throw new IllegalStateException("closed view"); })) { + AutoCloseable listener = DownloadProgress.subscribe(event -> events.incrementAndGet()); + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading", "https://example.test/file")) { + transfer.complete(1, 1); + } + listener.close(); + try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Downloading", "https://example.test/file2")) { + transfer.complete(1, 1); + } + } + assertEquals(2, events.get()); + } + + @Test void overlappingAndFailedTransfersHaveStableIdsAndAccurateActiveCount() throws Exception { + List events = new ArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add); + DownloadProgress.Transfer first = DownloadProgress.begin("First", "https://example.test/a"); + DownloadProgress.Transfer second = DownloadProgress.begin("Second", "https://example.test/b")) { + assertEquals(2, events.get(1).activeTransfers); + assertNotEquals(events.get(0).transferId, events.get(1).transferId); + first.complete(10, 10); + assertEquals(1, events.get(2).activeTransfers); + assertEquals(events.get(0).transferId, events.get(2).transferId); + second.close(); + DownloadProgress.Event stopped = events.get(3); + assertEquals(0, stopped.activeTransfers); + assertTrue(stopped.finished); + assertFalse(stopped.complete); + } + } + + private static HttpServer server(String content, boolean chunked, int status) throws IOException { + HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + byte[] bytes = content.getBytes(StandardCharsets.UTF_8); + server.createContext("/", exchange -> { + exchange.getResponseHeaders().set("Content-Type", "application/octet-stream"); + exchange.sendResponseHeaders(status, chunked ? 0 : bytes.length); + try (java.io.OutputStream output = exchange.getResponseBody()) { output.write(bytes); } + }); + server.start(); return server; + } + private static String url(HttpServer server) { return "http://127.0.0.1:" + server.getAddress().getPort(); } + + public static class InstallerFixture { + public static void main(String[] args) { + System.out.println("Downloading https://example.test/library.jar?version=1&token=private"); + System.out.println("Installing processors"); + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldClientFixture.java b/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldClientFixture.java new file mode 100644 index 00000000..d3bc84b1 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldClientFixture.java @@ -0,0 +1,78 @@ +package com.osiris.autoplug.client.launcher; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** A forked client contract fixture: no Minecraft install, credentials or save writes. */ +public final class LegacyWorldClientFixture implements Executor { + private static LegacyWorldClientFixture instance; + private final BlockingQueue queue = new LinkedBlockingQueue<>(); + public Object screen = new Object(); + private Object overlay = new Object(); + private int opened; + private int checked; + private boolean legacyScheduler; + private int scheduled; + + public static LegacyWorldClientFixture getInstance() { return instance; } + public Object getOverlay() { return overlay; } + public void execute(Runnable work) { queue.add(work); } + public Object schedule(Runnable work) { scheduled++; queue.add(work); return null; } + public void loadLevel(String world) throws Exception { record(world, "direct"); } + public Flows createWorldOpenFlows() { return new Flows(this); } + public Source getLevelSource() { return new Source(); } + public void selectLevel(String folder, String name, Settings settings) throws Exception { + if (!"Original display name".equals(name) || settings != null) throw new AssertionError("Save renamed or new settings supplied"); + record(folder, legacyScheduler ? "original-scheduler" : "original-name"); + } + private void record(String world, String route) throws Exception { + if (!Thread.currentThread().getName().equals("main")) throw new AssertionError("Wrong thread"); + if (!(screen instanceof TitleScreen) || (!legacyScheduler && (overlay != null || checked < 2))) throw new AssertionError("Startup screen bypassed"); + if (legacyScheduler && scheduled < 2) throw new AssertionError("Native scheduler was bypassed"); + if (++opened != 1) throw new AssertionError("Duplicate world entry"); + Files.write(Paths.get("entered.txt"), (world + "|" + route + "|main").getBytes(StandardCharsets.UTF_8)); + } + public static class TitleScreen { } + public static class Settings { } + public static class Flows { + private final LegacyWorldClientFixture client; + public Flows(LegacyWorldClientFixture client) { this.client = client; } + public void loadLevel(String world) throws Exception { client.record(world, "flow"); } + public void loadLevel(TitleScreen screen, String world) throws Exception { + if (screen != client.screen) throw new AssertionError("Native return screen lost"); + client.record(world, "screen-flow"); + } + } + public static class Source extends BaseSource { + public java.util.List

getLevelList() { return Collections.singletonList(new Summary()); } + } + public static class BaseSource { + public boolean levelExists(String folder) { return "World folder ü".equals(folder); } + } + public static class Summary { + public String getLevelId() { return "World folder ü"; } + public String getLevelName() { return "Original display name"; } + } + public static void main(String[] args) throws Exception { + instance = new LegacyWorldClientFixture(); + instance.legacyScheduler = args.length > 0 && args[0].equals("original-scheduler"); + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(15); + while (instance.opened == 0 && System.nanoTime() < deadline) { + Runnable task = instance.queue.poll(1, TimeUnit.SECONDS); + if (task == null) continue; + task.run(); + instance.checked++; + if (instance.checked == 1) instance.screen = new TitleScreen(); + if (instance.checked >= 2) instance.overlay = null; + } + if (instance.opened != 1) throw new AssertionError("No world entry"); + Runnable unexpected = instance.queue.poll(500, TimeUnit.MILLISECONDS); + if (unexpected != null) { unexpected.run(); if (instance.opened != 1) throw new AssertionError("Repeated entry"); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunchTest.java b/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunchTest.java new file mode 100644 index 00000000..b73da364 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/LegacyWorldLaunchTest.java @@ -0,0 +1,147 @@ +package com.osiris.autoplug.client.launcher; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import com.google.gson.JsonObject; +import com.sun.net.httpserver.HttpServer; +import java.net.InetSocketAddress; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import java.util.jar.JarFile; +import static org.junit.jupiter.api.Assertions.*; + +class LegacyWorldLaunchTest { + @TempDir Path temporary; + + @Test void exactPublisherMappingsCoverLegacyReleasesAndBothSnapshotFlowApis() throws Exception { + for (String version : Arrays.asList("1.14.4", "1.15.2", "1.16", "1.16.5", "1.17.1", "1.18.2", "1.19", "1.19.2", "1.19.3", "1.19.4", "22w11a", "22w13a")) { + try (InputStream input = getClass().getResourceAsStream("/launcher/legacy-mappings-" + version + ".txt")) { + assertNotNull(input, version); + Properties names = LegacyWorldLaunch.resolve(new String(input.readAllBytes(), StandardCharsets.UTF_8)); + assertFalse(names.getProperty("minecraft").contains("net.minecraft"), version); + assertEquals("a", names.getProperty("load"), version); + assertEquals(version.startsWith("1.14") || version.startsWith("1.15"), names.containsKey("levelSource"), version); + if (version.equals("22w11a")) { assertNotNull(names.getProperty("flows")); assertNull(names.getProperty("screenType")); } + if (version.startsWith("1.19")) assertNotNull(names.getProperty("screenType"), version); + } + } + assertThrows(java.io.IOException.class, () -> LegacyWorldLaunch.resolve("unrecognized -> a:\n")); + } + + @Test void bundledAgentIsJava8AndIdenticalCachedJarIsNotReplaced() throws Exception { + Path jar = LegacyWorldLaunch.packageAgent(temporary); + java.nio.file.attribute.FileTime marker = java.nio.file.attribute.FileTime.fromMillis(123456789); + Files.setLastModifiedTime(jar, marker); + assertEquals(jar, LegacyWorldLaunch.packageAgent(temporary)); + assertEquals(marker, Files.getLastModifiedTime(jar)); + try (JarFile packaged = new JarFile(jar.toFile()); InputStream bytes = packaged.getInputStream(packaged.getJarEntry(LegacyWorldLaunch.AGENT))) { + byte[] header = new byte[8]; assertEquals(8, bytes.read(header)); assertEquals(52, header[7]); + assertEquals("com.osiris.autoplug.legacy.LegacyWorldAgent", packaged.getManifest().getMainAttributes().getValue("Premain-Class")); + } + Files.write(jar, new byte[]{1, 2, 3}); + LegacyWorldLaunch.packageAgent(temporary); + try (JarFile restored = new JarFile(jar.toFile())) { assertNotNull(restored.getJarEntry(LegacyWorldLaunch.AGENT)); } + } + + @Test void preparationVerifiesPublisherMappingsAndReusesTheExactCacheOffline() throws Exception { + byte[] mappings; + try (InputStream input = getClass().getResourceAsStream("/launcher/legacy-mappings-1.18.2.txt")) { mappings = input.readAllBytes(); } + HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + server.createContext("/mappings", exchange -> { + exchange.sendResponseHeaders(200, mappings.length); + try (OutputStream output = exchange.getResponseBody()) { output.write(mappings); } + }); + server.start(); + JsonObject descriptor = new JsonObject(); + descriptor.addProperty("url", "http://127.0.0.1:" + server.getAddress().getPort() + "/mappings"); + descriptor.addProperty("sha1", com.osiris.autoplug.client.utils.UtilsCrypto.calculateSHA1Hash(mappings)); + descriptor.addProperty("size", mappings.length); + JsonObject metadata = new JsonObject(), downloads = new JsonObject(); downloads.add("client_mappings", descriptor); metadata.add("downloads", downloads); + Path cache = temporary.resolve("verified cache"), game = temporary.resolve("original game"); + LaunchRequest request = new LaunchRequest(game, "1.18.2", "VANILLA", null, MinecraftAccount.offline("Player"), null, 0, "Original folder"); + LegacyWorldLaunch prepared; + try { prepared = LegacyWorldLaunch.prepare(cache, metadata, request, ignored -> { }); } + finally { server.stop(0); } + Properties names = new Properties(); try (InputStream input = Files.newInputStream(prepared.configuration)) { names.load(input); } + assertEquals("dyr", names.getProperty("minecraft")); assertEquals("Original folder", names.getProperty("world")); + assertEquals(game.toString(), names.getProperty("gameDir")); + assertTrue(prepared.argument().startsWith("-javaagent:")); + assertEquals(prepared.agent, LegacyWorldLaunch.prepare(cache, metadata, request, ignored -> { }).agent); + assertThrows(java.io.IOException.class, () -> LegacyWorldLaunch.prepare(cache, metadata, + new LaunchRequest(game, "1.18.2", "FABRIC", "test", MinecraftAccount.offline("Player"), null, 0, "Original folder"), ignored -> { })); + Files.write(cache.resolve("versions/1.18.2/client-mappings.txt"), new byte[]{0}); + assertThrows(java.io.IOException.class, () -> LegacyWorldLaunch.prepare(cache, metadata, request, ignored -> { })); + } + + @Test void startupAgentWaitsForTitleAndOverlayThenUsesMainThreadForAllNativeApis() throws Exception { + for (String route : Arrays.asList("direct", "flow", "screen-flow", "original-name", "original-scheduler")) { + Path game = Files.createDirectories(temporary.resolve("game with spaces " + route)); + Properties names = fixtureNames(route); + Files.createDirectories(game.resolve("saves/World folder ü")); + Files.write(game.resolve("saves/World folder ü/level.dat"), new byte[]{1}); + names.setProperty("gameDir", game.toString()); + Path config = game.resolve("launch ü.properties"); + try (OutputStream out = Files.newOutputStream(config)) { names.store(out, "fixture"); } + Path agent = LegacyWorldLaunch.packageAgent(temporary.resolve("helper with spaces")); + String classpath = Paths.get(LegacyWorldClientFixture.class.getProtectionDomain().getCodeSource().getLocation().toURI()).toString(); + String java = Paths.get(System.getProperty("java.home"), "bin", JavaRuntimeManager.executableName()).toString(); + PreparedLaunch prepared = new PreparedLaunch(Paths.get(java), game, + Arrays.asList("-javaagent:" + agent + "=" + config, "-cp", classpath, LegacyWorldClientFixture.class.getName(), route), + "fixture", 21, Collections.singletonList(config)); + Process process = new MinecraftLauncher(temporary.resolve("cache"), new JavaRuntimeManager(temporary.resolve("runtimes"))).launch(prepared); + assertTrue(process.waitFor(20, TimeUnit.SECONDS), route); + assertEquals(0, process.exitValue(), () -> { try { return new String(Files.readAllBytes(game.resolve("logs/autoplug-launcher.log")), StandardCharsets.UTF_8); } catch (Exception e) { return e.toString(); } }); + assertEquals("World folder ü|" + route + "|main", new String(Files.readAllBytes(game.resolve("entered.txt")), StandardCharsets.UTF_8)); + for (int i = 0; i < 100 && Files.exists(config); i++) Thread.sleep(10); + assertFalse(Files.exists(config), "helper config cleanup"); + } + } + + @Test void prePublisherMappingAdapterIsPinnedToTheVerifiedOriginalClient() throws Exception { + Properties adapter = LegacyWorldLaunch.bundled("1.12.2", "0f275bc1547d01fa5f56ba34bdc87d981ee12daf"); + assertEquals("bib", adapter.getProperty("minecraft")); + assertEquals("a", adapter.getProperty("scheduler")); + assertNull(adapter.getProperty("overlay")); + assertThrows(java.io.IOException.class, () -> LegacyWorldLaunch.bundled("1.12.2", "different-client")); + assertThrows(java.io.IOException.class, () -> LegacyWorldLaunch.bundled("unverified-build", "")); + for (String version : Arrays.asList("1.7.10", "1.8.9", "1.12.2", "1.13.2")) { + try (InputStream source = getClass().getResourceAsStream("/launcher/legacy/" + version + ".properties")) { + Properties expected = new Properties(); expected.load(source); + Properties actual = LegacyWorldLaunch.bundled(version, expected.getProperty("clientSha1")); + assertEquals("a", actual.getProperty("scheduler")); + assertNotNull(actual.getProperty("levelName")); + } + } + } + + @Test void temporaryHelperConfigurationIsRemovedWhenStartingFails() throws Exception { + Path config = Files.createTempFile(temporary, "legacy-", ".properties"); + PreparedLaunch launch = new PreparedLaunch(temporary.resolve("missing-java"), temporary, + Collections.emptyList(), "fixture", 8, Collections.singletonList(config)); + MinecraftLauncher launcher = new MinecraftLauncher(temporary.resolve("cache"), new JavaRuntimeManager(temporary.resolve("runtimes"))); + assertThrows(java.io.IOException.class, () -> launcher.launch(launch)); + assertFalse(Files.exists(config)); + } + + private Properties fixtureNames(String route) { + Properties p = new Properties(); String base = LegacyWorldClientFixture.class.getName(); + p.setProperty("minecraft", base); p.setProperty("instance", "getInstance"); p.setProperty("title", base + "$TitleScreen"); + p.setProperty("screen", "screen"); p.setProperty("overlay", "getOverlay"); p.setProperty("world", "World folder ü"); p.setProperty("load", "loadLevel"); + if (route.contains("flow")) p.setProperty("flows", "createWorldOpenFlows"); + if (route.equals("screen-flow")) p.setProperty("screenType", base + "$TitleScreen"); + if (route.startsWith("original-")) { + p.setProperty("load", "selectLevel"); p.setProperty("levelSource", "getLevelSource"); p.setProperty("settingsType", base + "$Settings"); + p.setProperty("levelExists", "levelExists"); p.setProperty("levelList", "getLevelList"); p.setProperty("levelId", "getLevelId"); p.setProperty("levelName", "getLevelName"); + } + if (route.equals("original-scheduler")) { p.setProperty("scheduler", "schedule"); p.remove("overlay"); } + return p; + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java index 08ca3889..ff218c94 100644 --- a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java @@ -21,7 +21,7 @@ class LauncherCommandsTest { try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), output::add)) { LauncherCommands commands = new LauncherCommands(services, output::add); commands.execute(commands.tokenize(".profiles create \"My Pack\" 1.21.1 FABRIC --template")); - id = services.profiles().get(0).id; + id = services.profiles().stream().filter(p -> p.name.equals("My Pack")).findFirst().get().id; commands.execute(commands.tokenize(".mc account offline FixtureUser")); LauncherActions.SettingsInfo settings = services.settings(); settings.defaultProfile = id; settings.port = 25570; settings.upnp = false; services.saveSettings(settings); assertThrows(java.io.IOException.class, () -> services.launchProfile(id, null, 25565)); @@ -31,11 +31,12 @@ class LauncherCommandsTest { try (LauncherServices services = new LauncherServices(temp, temp.resolve("minecraft"), output::add)) { assertEquals("FixtureUser (offline)", services.settings().account); assertEquals(25570, services.settings().port); assertFalse(services.settings().upnp); - assertEquals(id, services.settings().defaultProfile); - assertTrue(services.profiles().get(0).template); + assertNotEquals(id, services.settings().defaultProfile, "Templates must not remain the selected launch default"); + assertFalse(services.getProfiles().get(services.settings().defaultProfile).template); + assertTrue(services.getProfiles().get(id).template); LauncherCommands commands = new LauncherCommands(services, output::add); commands.execute(commands.tokenize(".profiles clone " + id + " 1.20.1 --name Downgrade --yes")); - assertEquals(2, services.profiles().size()); + assertEquals(4, services.profiles().size()); // Two version-matched defaults plus the user's source and clone. assertTrue(services.profiles().stream().anyMatch(p -> p.name.equals("Downgrade") && p.launchable)); } } @@ -88,4 +89,41 @@ class LauncherCommandsTest { assertTrue(output.stream().anyMatch(line -> line.contains("singleplayer | 1.21.1"))); } } + + @Test void ownedLocalSaveRetainsCliAliasWithoutPermittingServerFlags() throws Exception { + Path minecraft = temp.resolve("minecraft"), directory = Files.createDirectories(minecraft.resolve("saves/Already owned")); + try (java.io.DataOutputStream out = new java.io.DataOutputStream(Files.newOutputStream(directory.resolve("level.dat")))) { + out.writeByte(10); out.writeUTF(""); out.writeByte(10); out.writeUTF("Data"); + out.writeByte(8); out.writeUTF("LevelName"); out.writeUTF("Owned fixture"); + out.writeByte(10); out.writeUTF("Version"); out.writeByte(8); out.writeUTF("Name"); out.writeUTF("1.21.1"); + out.writeByte(0); out.writeByte(0); out.writeByte(0); + } + byte[] original = Files.readAllBytes(directory.resolve("level.dat")); + com.osiris.autoplug.client.worlds.WorldStore store = new com.osiris.autoplug.client.worlds.WorldStore(temp.resolve("worlds")); + String ownedId = store.registerLocal(new com.osiris.autoplug.client.worlds.LocalWorldStore(minecraft).get("local:Already owned")).id; + List launches = new ArrayList<>(); + try (LauncherServices services = new LauncherServices(temp, minecraft, null) { + @Override public String launchLocalWorld(String id, String version) throws Exception { + assertEquals(ownedId, store.getLocal(id, new com.osiris.autoplug.client.worlds.LocalWorldStore(minecraft)).id); + launches.add(id + " | " + version); return "Started fixture without launching a process"; + } + @Override public void launchWorld(String id, boolean share) { fail("Local alias must not start a server"); } + @Override public void setWorldEulaAccepted(String id, boolean accepted) { fail("Local alias must not accept server EULA"); } + @Override public String shareWorld(String id) { fail("Local alias must not expose the save"); return ""; } + }) { + assertEquals(1, services.worlds().size()); assertEquals(ownedId, services.worlds().get(0).id); + LauncherCommands commands = new LauncherCommands(services, ignored -> { }); + commands.execute(commands.tokenize(".mc worlds launch \"local:Already owned\"")); + commands.execute(commands.tokenize(".mc worlds launch " + ownedId)); + assertEquals(Arrays.asList("local:Already owned | 1.21.1", ownedId + " | 1.21.1"), launches); + for (String flags : Arrays.asList(" --share", " --accept-eula")) + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds launch \"local:Already owned\"" + flags))); + for (String action : Arrays.asList("share", "stop")) + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds " + action + " \"local:Already owned\""))); + assertThrows(java.io.IOException.class, () -> commands.execute(commands.tokenize(".mc worlds launch \"local:../Already owned\""))); + assertEquals(2, launches.size()); + } + assertArrayEquals(original, Files.readAllBytes(directory.resolve("level.dat"))); + assertFalse(Files.exists(directory.resolve("eula.txt"))); + } } diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java new file mode 100644 index 00000000..66270dca --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java @@ -0,0 +1,106 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.ui.LauncherActions; +import com.osiris.autoplug.client.worlds.WorldStore; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import java.util.*; +import static org.junit.jupiter.api.Assertions.*; + +class LauncherDefaultsTest { + @TempDir Path temporary; + + @Test void firstRunHasMatchingClientAndServerWithoutAcceptingEula() throws Exception { + Path root = temporary.resolve("autoplug"); + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + assertEquals(2, service.profiles().size()); + Profile client = service.getProfiles().get(service.settings().defaultProfile); + assertEquals("Default (VANILLA)", client.name); + assertEquals("VANILLA", client.loader); assertEquals(ProfileType.MODS, client.type); + assertEquals("1.21.1", client.gameVersion); assertFalse(client.template); + assertTrue(Files.isDirectory(client.getDirectory().resolve("mods"))); + LauncherActions.WorldInfo world = service.createWorld("First world", "", ""); + Profile server = service.getProfiles().get(world.serverProfileId); + assertEquals("Default", server.name); assertEquals(client.gameVersion, server.gameVersion); + assertEquals(ProfileType.MODS_SERVER, server.type); + assertFalse(new WorldStore(root.resolve("worlds")).get(world.id).eulaAccepted); + assertFalse(Files.exists(Paths.get(world.directory).resolve("eula.txt"))); + assertFalse(Files.exists(temporary.resolve("minecraft"))); + } + } + + @Test void requestedVersionCreatesIndependentDefaultsAndIsIdempotent() throws Exception { + Path root = temporary.resolve("autoplug"); String original, requested; + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + original = service.settings().defaultProfile; + requested = service.ensureDefaultProfiles("1.20.1").id; + assertNotEquals(original, requested); + assertEquals(requested, service.ensureDefaultProfiles("1.20.1").id); + assertEquals(original, service.settings().defaultProfile, "Choosing a server version must not overwrite the selected user default"); + assertEquals(4, service.profiles().size()); + LauncherActions.WorldInfo world = service.createWorld("Other version", null, requested); + assertEquals("1.20.1", service.getProfiles().get(world.serverProfileId).gameVersion); + assertThrows(java.io.IOException.class, () -> service.ensureDefaultProfiles("../escape")); + assertEquals(4, service.profiles().size()); + } + try (LauncherServices reopened = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + assertEquals(original, reopened.settings().defaultProfile); + assertEquals(requested, reopened.ensureDefaultProfiles("1.20.1").id); + assertEquals(4, reopened.profiles().size()); + } + } + + @Test void existingSelectedUserProfileAndItsFilesArePreservedOnBootstrap() throws Exception { + Path root = temporary.resolve("autoplug"); String selected; byte[] metadata; + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + selected = service.createProfile("Personal pack", "1.19.4", "FABRIC", "MODS", false).id; + LauncherActions.SettingsInfo settings = service.settings(); settings.defaultProfile = selected; service.saveSettings(settings); + Path directory = service.getProfiles().get(selected).getDirectory(); + metadata = Files.readAllBytes(directory.resolve("profile.json")); + Files.write(directory.resolve("options.txt"), Arrays.asList("keep-me")); + } + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + assertEquals(selected, service.settings().defaultProfile); + Profile profile = service.getProfiles().get(selected); + assertArrayEquals(metadata, Files.readAllBytes(profile.getDirectory().resolve("profile.json"))); + assertEquals(Collections.singletonList("keep-me"), Files.readAllLines(profile.getDirectory().resolve("options.txt"))); + assertEquals("1.19.4", service.ensureDefaultProfiles("").gameVersion); + assertEquals(5, service.profiles().size()); + } + } + + @Test void progressSubscriptionsReceiveSamePhaseAsLogAndCanDetach() throws Exception { + Path minecraft = Files.createDirectories(temporary.resolve("minecraft")); + Files.write(minecraft.resolve("saves"), new byte[]{1}); + List log = new ArrayList<>(), ui = new ArrayList<>(); + try (LauncherServices service = new LauncherServices(temporary.resolve("autoplug"), minecraft, log::add)) { + service.onProgress(ui::add); service.worlds(); + assertEquals(log, ui); assertEquals(1, ui.size()); + service.onProgress(null); service.worlds(); + assertEquals(1, ui.size()); assertEquals(2, log.size()); + service.onProgress(message -> { throw new IllegalStateException("Disposed UI"); }); + assertDoesNotThrow(service::worlds); assertEquals(3, log.size()); + } + } + + @Test void unavailableSelectedDefaultsAreReplacedWithoutMutatingTheOriginalProfile() throws Exception { + for (boolean template : new boolean[]{true, false}) { + Path root = temporary.resolve(template ? "template" : "migration"); String unavailable; byte[] metadata; + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + Profile profile = service.getProfiles().create("Not ready", "1.20.4", "FABRIC", ProfileType.MODS); + profile.template = template; profile.migrationPending = !template; service.getProfiles().save(profile); + unavailable = profile.id; metadata = Files.readAllBytes(profile.getDirectory().resolve("profile.json")); + LauncherActions.SettingsInfo settings = service.settings(); settings.defaultProfile = unavailable; service.saveSettings(settings); + } + try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { + Profile selected = service.getProfiles().get(service.settings().defaultProfile); + assertNotEquals(unavailable, selected.id); assertFalse(selected.template); assertFalse(selected.migrationPending); + assertEquals("VANILLA", selected.loader); assertEquals("1.20.4", selected.gameVersion); + assertEquals(selected.id, service.ensureDefaultProfiles("").id); + assertEquals(5, service.profiles().size()); + assertArrayEquals(metadata, Files.readAllBytes(service.getProfiles().get(unavailable).getDirectory().resolve("profile.json"))); + } + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/tasks/updater/LegacyDownloadProgressTest.java b/src/test/java/com/osiris/autoplug/client/tasks/updater/LegacyDownloadProgressTest.java new file mode 100644 index 00000000..04682bc7 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/tasks/updater/LegacyDownloadProgressTest.java @@ -0,0 +1,186 @@ +package com.osiris.autoplug.client.tasks.updater; + +import com.osiris.autoplug.client.launcher.DownloadProgress; +import com.osiris.autoplug.client.tasks.updater.java.AdoptV3API; +import com.osiris.autoplug.client.tasks.updater.java.TaskJavaDownload; +import com.osiris.autoplug.client.tasks.updater.mods.TaskModDownload; +import com.osiris.autoplug.client.tasks.updater.plugins.TaskPluginDownload; +import com.osiris.autoplug.client.utils.GD; +import com.osiris.betterthread.BThreadManager; +import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.api.parallel.ResourceLock; +import org.junit.jupiter.api.parallel.Resources; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import java.io.File; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.*; + +/** Exercises the actual legacy loops, which do not inherit TaskDownload. */ +@ResourceLock(Resources.SYSTEM_PROPERTIES) +class LegacyDownloadProgressTest { + enum Kind { MOD, PLUGIN, JAVA } + private static final byte[] CONTENT = "local legacy download fixture".getBytes(StandardCharsets.UTF_8); + @TempDir Path temporary; + private String originalUserDir; + private File originalWorkingDir; + + @BeforeEach void isolateDownloadCache() { + originalUserDir = System.getProperty("user.dir"); + originalWorkingDir = GD.WORKING_DIR; + System.setProperty("user.dir", temporary.toString()); + } + + @AfterEach void restoreDownloadCache() { + System.setProperty("user.dir", originalUserDir); + GD.WORKING_DIR = originalWorkingDir; + } + + @ParameterizedTest @EnumSource(Kind.class) + void redirectedDownloadsReportSourcesBytesAndCompletion(Kind kind) throws Exception { + HttpServer server = server(false, 200, "application/octet-stream"); + List events = new CopyOnWriteArrayList<>(); + String source = url(server) + "/redirect?token=private"; + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + assertArrayEquals(CONTENT, Files.readAllBytes(download(kind, source))); + } finally { server.stop(0); } + assertEquals(DownloadProgress.sourceUrl(source), events.get(0).sourceUrl); + assertTrue(events.stream().anyMatch(event -> event.sourceUrl.contains("/artifact?version=1&token=[redacted]"))); + assertTrue(events.stream().anyMatch(event -> !event.finished && event.downloadedBytes > 0 + && event.totalBytes == CONTENT.length)); + assertCompleted(events, CONTENT.length); + assertFalse(events.stream().anyMatch(event -> event.sourceUrl.contains("private"))); + } + + @ParameterizedTest @EnumSource(Kind.class) + void unknownLengthDownloadsRemainIndeterminateUntilFinished(Kind kind) throws Exception { + HttpServer server = server(true, 200, "application/octet-stream"); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + assertArrayEquals(CONTENT, Files.readAllBytes(download(kind, url(server) + "/artifact"))); + } finally { server.stop(0); } + assertCompleted(events, -1); + } + + @ParameterizedTest @EnumSource(Kind.class) + void rejectedContentClosesProgressWithoutFalseCompletion(Kind kind) throws Exception { + HttpServer server = server(false, 200, "text/html"); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + Exception failure = assertThrows(Exception.class, () -> download(kind, url(server) + "/artifact")); + assertTrue(failure.getMessage().contains("invalid content type")); + } finally { server.stop(0); } + assertFailed(events); + } + + @ParameterizedTest @EnumSource(Kind.class) + void failedHttpRequestsReleaseActiveCountAndRedactSource(Kind kind) throws Exception { + HttpServer server = server(false, 404, "application/octet-stream"); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + Exception failure = assertThrows(Exception.class, () -> download(kind, url(server) + "/artifact?token=private")); + assertTrue(failure.getMessage().contains("404")); + assertTrue(failure.getMessage().contains("token=[redacted]")); + assertFalse(failure.getMessage().contains("private")); + } finally { server.stop(0); } + assertFailed(events); + } + + @Test void javaCacheCopyFailureMustNotReportSuccessfulCompletion() throws Exception { + HttpServer server = server(false, 200, "application/octet-stream"); + List events = new CopyOnWriteArrayList<>(); + AtomicBoolean blocked = new AtomicBoolean(); + AtomicReference fixtureFailure = new AtomicReference<>(); + Path output = temporary.resolve("java/runtime.zip"); + try (AutoCloseable ignored = DownloadProgress.subscribe(event -> { + events.add(event); + if (!event.finished && event.downloadedBytes > 0 && blocked.compareAndSet(false, true)) { + try { + // Simulate a destination becoming unavailable after HTTP succeeds. + Files.delete(output); + Files.createDirectory(output); + Files.write(output.resolve("occupied"), CONTENT); + } catch (Exception failure) { fixtureFailure.set(failure); } + } + })) { + assertThrows(Exception.class, () -> download(Kind.JAVA, url(server) + "/artifact")); + } finally { server.stop(0); } + assertTrue(blocked.get()); + assertNull(fixtureFailure.get()); + assertFailed(events); + } + + private Path download(Kind kind, String source) throws Exception { + BThreadManager manager = new BThreadManager(); + if (kind == Kind.MOD) { + TaskModDownload task = new TaskModDownload("fixture", manager, "fixture-mod", "1", source, + "MANUAL", temporary.resolve("unused.jar").toFile()); + task.download(); + return task.getDownloadDest().toPath(); + } + if (kind == Kind.PLUGIN) { + TaskPluginDownload task = new TaskPluginDownload("fixture", manager, "fixture-plugin", "1", source, + "MANUAL", temporary.resolve("unused.jar").toFile()); + task.download(); + return task.getDownloadDest().toPath(); + } + TaskJavaDownload task = new TaskJavaDownload("fixture", manager, source, + temporary.resolve("java/runtime.file").toFile(), AdoptV3API.OperatingSystemType.WINDOWS); + task.runAtStart(); + assertTrue(task.getNewCacheDest().getName().endsWith(".zip")); + return task.getNewCacheDest().toPath(); + } + + private static void assertCompleted(List events, long expectedTotal) { + assertFalse(events.isEmpty()); + DownloadProgress.Event last = events.get(events.size() - 1); + assertTrue(last.complete); + assertTrue(last.finished); + assertEquals(CONTENT.length, last.downloadedBytes); + assertEquals(expectedTotal, last.totalBytes); + assertEquals(0, last.activeTransfers); + assertEquals(1, events.stream().filter(event -> event.finished).count()); + assertTrue(events.stream().allMatch(event -> event.transferId == last.transferId)); + } + + private static void assertFailed(List events) { + assertFalse(events.isEmpty()); + assertFalse(events.stream().anyMatch(event -> event.complete)); + DownloadProgress.Event last = events.get(events.size() - 1); + assertTrue(last.finished); + assertEquals(0, last.activeTransfers); + } + + private static HttpServer server(boolean chunked, int status, String contentType) throws Exception { + HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + server.createContext("/redirect", exchange -> { + exchange.getResponseHeaders().set("Location", "/artifact?version=1&token=private"); + exchange.sendResponseHeaders(302, -1); + exchange.close(); + }); + server.createContext("/artifact", exchange -> { + exchange.getResponseHeaders().set("Content-Type", contentType); + exchange.getResponseHeaders().set("Content-Disposition", "attachment; filename=fixture.zip"); + exchange.sendResponseHeaders(status, chunked ? 0 : CONTENT.length); + try (OutputStream output = exchange.getResponseBody()) { output.write(CONTENT); } + }); + server.start(); + return server; + } + + private static String url(HttpServer server) { return "http://127.0.0.1:" + server.getAddress().getPort(); } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index ee8ef5be..5ac0056a 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -17,11 +17,115 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import static org.junit.jupiter.api.Assertions.*; class DashboardPanelTest { @TempDir Path directory; + @Test void progressKeepsLiveStepThroughOtherRefreshAndReleasesSubscriptions() throws Exception { + AtomicReference> listener = new AtomicReference<>(); + AtomicReference> measured = new AtomicReference<>(); + CountDownLatch started = new CountDownLatch(1), release = new CountDownLatch(1); + AtomicInteger settingsCalls = new AtomicInteger(); + LauncherActions actions = new LauncherActions() { + @Override public void onProgress(Consumer callback) { listener.set(callback); } + @Override public void onProgressValue(Consumer callback) { measured.set(callback); } + @Override public SettingsInfo settings() { SettingsInfo result = new SettingsInfo(); result.account = "Account " + settingsCalls.incrementAndGet(); return result; } + @Override public void addArtifact(String id, String path, String project) throws Exception { started.countDown(); assertTrue(release.await(4, TimeUnit.SECONDS)); } + }; + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> panel.get().importArtifact(new ProfileInfo("test", "Test", "1.21.1", "VANILLA", "MODS", "", false), "example.jar", "")); + assertTrue(started.await(4, TimeUnit.SECONDS)); + listener.get().accept("Resolving libraries https://example.invalid/library.jar"); + awaitUi(() -> containsText(panel.get(), "Resolving libraries")); + SwingUtilities.invokeAndWait(() -> { + assertTrue(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate()); + assertEquals("https://example.invalid/library.jar", ((JTextField) findNamed(panel.get(), "download-source")).getText()); + findButton(panel.get(), "Reload").doClick(); + }); + awaitUi(() -> containsText(panel.get(), "Account 2")); + SwingUtilities.invokeAndWait(() -> assertTrue(containsText(panel.get(), "Resolving libraries"))); + measured.get().accept(37); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 37); + SwingUtilities.invokeAndWait(() -> { + assertFalse(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate()); + findButton(panel.get(), "Reload").doClick(); + }); + awaitUi(() -> containsText(panel.get(), "Account 3")); + SwingUtilities.invokeAndWait(() -> assertFalse(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate())); + release.countDown(); awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + Consumer stale = listener.get(); + SwingUtilities.invokeAndWait(() -> panel.get().close()); assertNull(listener.get()); assertNull(measured.get()); + stale.accept("Should not appear"); + SwingUtilities.invokeAndWait(() -> assertFalse(containsText(panel.get(), "Should not appear"))); + } finally { release.countDown(); SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void navigationAndSettingsReflowWithoutDiscardingEdits() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}) { + findButton(panel.get(), view).doClick(); + assertEquals(view, ((JLabel) findNamed(panel.get(), "navigation-title")).getText()); + assertTrue(findNamed(panel.get(), "page-" + view).isVisible()); + } + panel.get().setSize(1200, 820); for (int i = 0; i < 3; i++) layout(panel.get()); + Container grid = findNamed(panel.get(), "responsive-settings"); + assertEquals(grid.getComponent(0).getY(), grid.getComponent(1).getY()); + assertTrue(grid.getComponent(1).getX() > grid.getComponent(0).getX()); + assertFalse(findNamed(panel.get(), "advanced-runtime-fields").isVisible()); + findButton(panel.get(), "Advanced").doClick(); + assertTrue(findNamed(panel.get(), "advanced-runtime-fields").isVisible()); + JTextField runtime = findTextField(findNamed(panel.get(), "advanced-runtime-fields")); runtime.setText("/chosen/java"); + panel.get().setSize(950, 620); for (int i = 0; i < 3; i++) layout(panel.get()); + assertEquals(grid.getComponent(0).getX(), grid.getComponent(1).getX()); + assertTrue(grid.getComponent(1).getY() >= grid.getComponent(0).getHeight()); + assertTrue(runtime.getWidth() >= 80); assertEquals("/chosen/java", runtime.getText()); + assertNotNull(findButton(panel.get(), "Save settings")); + AbstractButton copy = findAccessibleButton(panel.get(), "Copy address"); + assertNotNull(copy); assertNotNull(copy.getIcon()); assertEquals("Copy address", copy.getToolTipText()); + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void parallelDownloadCompletionKeepsProgressVisibleUntilLastTransferEnds() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + try (com.osiris.autoplug.client.launcher.DownloadProgress.Transfer first = com.osiris.autoplug.client.launcher.DownloadProgress.begin("First asset", "https://example.invalid/first.jar"); + com.osiris.autoplug.client.launcher.DownloadProgress.Transfer second = com.osiris.autoplug.client.launcher.DownloadProgress.begin("Second asset", "https://example.invalid/second.jar")) { + first.complete(20, 20); + awaitUi(() -> containsText(panel.get(), "First asset — complete")); + SwingUtilities.invokeAndWait(() -> { + JProgressBar bar = (JProgressBar) findNamed(panel.get(), "activity-progress"); assertTrue(bar.isVisible()); assertTrue(bar.isIndeterminate()); + }); + second.complete(30, 30); + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> assertEquals("https://example.invalid/second.jar", ((JTextField) findNamed(panel.get(), "download-source")).getText())); + } + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void worldMetadataReportsUnknownAndBoundedSizeTruthfully() { + WorldInfo unknown = new WorldInfo("unknown", "Unknown", "", "", "", "", false, true, ""); + assertEquals("Additional save metadata unavailable", DashboardPanel.worldMetadata(unknown)); + WorldInfo bounded = new WorldInfo("known", "Known", "", "", "", "", false, true, "1.21.1", true, -1, 1536, false, Arrays.asList("vanilla", "file/pack"), true, false, true); + String detail = DashboardPanel.worldMetadata(bounded); + assertTrue(detail.contains("Last played: Unknown")); assertTrue(detail.contains("Size: At least 1.5 KiB")); + assertTrue(detail.contains("Modded")); assertTrue(detail.contains("Cheats: On")); assertTrue(detail.contains("Hardcore: Off")); assertTrue(detail.contains("Datapacks: 2")); + WorldInfo partial = new WorldInfo("partial", "Partial", "", "", "", "", false, true, "1.21.1", false, -1, 1588, false, Arrays.asList("vanilla"), false, false, true); + assertTrue(DashboardPanel.worldMetadata(partial).contains("At least 1.5 KiB")); + } + @Test void versionSelectionDoesNotConfuseVersionPrefixes() { assertTrue(DashboardPanel.versionMatches("Paper 1.21.1", "1.21.1")); assertFalse(DashboardPanel.versionMatches("Paper 1.21.11", "1.21.1")); @@ -183,7 +287,7 @@ public static void main(String[] args) throws Exception { Thread.sleep(50); SwingUtilities.invokeAndWait(() -> { try { - panel.get().setSize(width, height); layout(panel.get()); + panel.get().setSize(width, height); for (int pass = 0; pass < 3; pass++) layout(panel.get()); BufferedImage bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = bitmap.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); @@ -207,8 +311,8 @@ private static LauncherActions fixtures(AtomicBoolean onEventThread, CountDownLa new ProfileInfo("template", "My base template", "1.21.1", "FABRIC", "MODS", "/profiles/base", true)); } @Override public List worlds() { - called(); return Arrays.asList(new WorldInfo("local:cottage", "Lakeside cottage", "", "", "/.minecraft/saves/Lakeside cottage", "", false, true, "1.21.1"), - new WorldInfo("cove", "Quiet Cove", "paper", "vanilla", "/worlds/quiet-cove", "", false), + called(); return Arrays.asList(new WorldInfo("local:cottage", "Lakeside cottage", "", "", "/.minecraft/saves/Lakeside cottage", "", false, true, "1.21.1", false, 1791072000000L, 184549376, true, Arrays.asList("vanilla"), false, false, true), + new WorldInfo("cove", "Quiet Cove", "paper", "vanilla", "/worlds/quiet-cove", "", false, false, "1.21.1", true, 1790990000000L, 597688320, true, Arrays.asList("vanilla", "file/terrain"), true, false, false), new WorldInfo("local:archive", "An old adventure", "", "", "/.minecraft/saves/An old adventure", "", false, true, "")); } @Override public SettingsInfo settings() { called(); SettingsInfo settings = new SettingsInfo(); settings.account = "Offline · Alex"; settings.defaultProfile = "vanilla"; settings.java17 = "/runtimes/java-17/bin/java"; settings.java21 = "/runtimes/java-21/bin/java"; return settings; } @@ -221,6 +325,18 @@ private static AbstractButton findButton(Container container, String text) { } return null; } + private static AbstractButton findAccessibleButton(Container container, String name) { + for (Component component : container.getComponents()) { + if (component instanceof AbstractButton && name.equals(component.getAccessibleContext().getAccessibleName())) return (AbstractButton) component; + if (component instanceof Container) { AbstractButton found = findAccessibleButton((Container) component, name); if (found != null) return found; } + } return null; + } + private static JTextField findTextField(Container container) { + for (Component component : container.getComponents()) { + if (component instanceof JTextField) return (JTextField) component; + if (component instanceof Container) { JTextField found = findTextField((Container) component); if (found != null) return found; } + } return null; + } private static Container findNamed(Container container, String name) { if (name.equals(container.getName())) return container; for (Component child : container.getComponents()) if (child instanceof Container) { diff --git a/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java index d4f0d580..a4b73ec6 100644 --- a/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java +++ b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java @@ -190,6 +190,91 @@ class LocalWorldStoreTest { assertArrayEquals(original, Files.readAllBytes(minecraft.resolve("saves"))); } + @Test void displaysBoundedMetadataAndExactSmallSaveSizeWithoutRewritingIt() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + Path directory = Files.createDirectories(minecraft.resolve("saves/Detailed")); + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(directory.resolve("level.dat")))) { + tag(out, 10, ""); tag(out, 10, "Data"); + tag(out, 8, "LevelName"); out.writeUTF("Detailed"); + tag(out, 10, "Version"); tag(out, 8, "Name"); out.writeUTF("1.21.1"); out.writeByte(0); + tag(out, 4, "LastPlayed"); out.writeLong(1700000000123L); + tag(out, 1, "allowCommands"); out.writeByte(1); + tag(out, 1, "hardcore"); out.writeByte(1); + tag(out, 10, "DataPacks"); tag(out, 9, "Enabled"); out.writeByte(8); out.writeInt(2); + out.writeUTF("vanilla"); out.writeUTF("file/custom-pack"); out.writeByte(0); + out.writeByte(0); out.writeByte(0); + } + byte[] level = Files.readAllBytes(directory.resolve("level.dat")); + Files.write(directory.resolve("region.mca"), new byte[128]); + LocalWorld world = new LocalWorldStore(minecraft).get("local:Detailed"); + assertEquals(1700000000123L, world.lastPlayed); assertTrue(world.cheats); assertTrue(world.hardcore); + assertTrue(world.quickPlayEligible); assertFalse(world.modded); + assertEquals(Arrays.asList("vanilla", "file/custom-pack"), world.dataPacks); + assertEquals(level.length + 128, world.sizeBytes); assertTrue(world.sizeComplete); + assertThrows(UnsupportedOperationException.class, () -> world.dataPacks.add("mutate")); + assertArrayEquals(level, Files.readAllBytes(directory.resolve("level.dat"))); + assertEquals(0, LocalWorldStore.directorySize(directory, 1)[1], "Exhausted traversal is labeled a lower bound"); + try (LauncherServices service = new LauncherServices(temporary.resolve("autoplug"), minecraft, null)) { + LauncherActions.WorldInfo info = service.worlds().get(0); + assertTrue(info.metadataAvailable); assertTrue(info.cheats); assertTrue(info.hardcore); + assertEquals(world.lastPlayed, info.lastPlayed); assertEquals(world.dataPacks, info.dataPacks); + } + } + + @Test void localOwnershipIsIdempotentAndNeverDuplicatesOrModifiesTheOriginal() throws Exception { + Path minecraft = temporary.resolve("minecraft"), root = temporary.resolve("autoplug"); + Path directory = save(minecraft, "Existing", "Existing", "1.21.1", true, false, false); + byte[] original = Files.readAllBytes(directory.resolve("level.dat")); + LocalWorldStore local = new LocalWorldStore(minecraft); WorldStore store = new WorldStore(root.resolve("worlds")); + LocalWorld unowned = local.get("local:Existing"); + assertEquals(unowned.id, store.ownedLocal(unowned, false).id); + LocalWorld owned = store.registerLocal(unowned); + assertTrue(owned.id.matches("world-[a-f0-9-]{36}")); + assertEquals(owned.id, store.registerLocal(local.get("local:Existing")).id); + assertEquals(owned.id, new WorldStore(root.resolve("worlds")).registerLocal(unowned).id); + assertEquals(directory, store.getLocal(owned.id, local).directory); + assertEquals(owned.id, store.getLocal("local:Existing", local).id); + assertTrue(store.list().isEmpty(), "Local reference must not also appear as a virtual server world"); + try (java.util.stream.Stream entries = Files.list(root.resolve("worlds"))) { assertEquals(1, entries.count()); } + try (LauncherServices service = new LauncherServices(root, minecraft, null)) { + List displayed = service.worlds(); + assertEquals(1, displayed.size()); assertEquals(owned.id, displayed.get(0).id); assertTrue(displayed.get(0).local); + assertThrows(IOException.class, () -> service.launchLocalWorld(owned.id, "1.20.1")); + } + assertArrayEquals(original, Files.readAllBytes(directory.resolve("level.dat"))); + assertFalse(Files.exists(directory.resolve("world.json"))); + assertFalse(Files.exists(root.resolve("worlds").resolve(owned.id).resolve("server"))); + } + + @Test void alteredOwnershipCannotRedirectLaunchToAnotherSave() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + save(minecraft, "Original", "Original", "1.21.1", false, false, false); + save(minecraft, "Other", "Other", "1.21.1", false, false, false); + LocalWorldStore local = new LocalWorldStore(minecraft); WorldStore store = new WorldStore(temporary.resolve("worlds")); + LocalWorld owned = store.registerLocal(local.get("local:Original")); + Path reference = temporary.resolve("worlds").resolve(owned.id).resolve("local-world.json"); + String json = new String(Files.readAllBytes(reference), java.nio.charset.StandardCharsets.UTF_8); + Files.write(reference, json.replace("local:Original", "local:Other").getBytes(java.nio.charset.StandardCharsets.UTF_8)); + assertThrows(IOException.class, () -> store.getLocal(owned.id, local)); + assertThrows(IOException.class, () -> store.registerLocal(local.get("local:Original"))); + } + + @Test void ownershipRecoversEmptyInterruptedEntryButNeverOverwritesUnrecognizedData() throws Exception { + Path minecraft = temporary.resolve("minecraft"); + save(minecraft, "Original", "Original", "1.21.1", false, false, false); + LocalWorld original = new LocalWorldStore(minecraft).get("local:Original"); + WorldStore store = new WorldStore(temporary.resolve("worlds")); + LocalWorld owned = store.registerLocal(original); + Path entry = temporary.resolve("worlds").resolve(owned.id), reference = entry.resolve("local-world.json"); + Files.delete(reference); // Simulate an interrupted registration leaving its new directory empty. + assertEquals(owned.id, store.registerLocal(original).id); + Files.delete(reference); + byte[] data = new byte[]{1, 2, 3}; Files.write(entry.resolve("existing-save.dat"), data); + assertThrows(IOException.class, () -> store.registerLocal(original)); + assertArrayEquals(data, Files.readAllBytes(entry.resolve("existing-save.dat"))); + assertFalse(Files.exists(reference)); + } + private static Path save(Path minecraft, String folder, String name, String version, boolean compressed, boolean modded, boolean forge) throws IOException { Path directory = Files.createDirectories(minecraft.resolve("saves").resolve(folder)); OutputStream raw = Files.newOutputStream(directory.resolve("level.dat")); diff --git a/src/test/resources/launcher/legacy-adapter-1.12.2-evidence.txt b/src/test/resources/launcher/legacy-adapter-1.12.2-evidence.txt new file mode 100644 index 00000000..9219785b --- /dev/null +++ b/src/test/resources/launcher/legacy-adapter-1.12.2-evidence.txt @@ -0,0 +1,44 @@ +# Narrow adapter evidence for Minecraft 1.12.2; retrieved 2026-10-04. +# Official client: https://piston-data.mojang.com/v1/objects/0f275bc1547d01fa5f56ba34bdc87d981ee12daf/client.jar +# Client SHA-1 verified: 0f275bc1547d01fa5f56ba34bdc87d981ee12daf +# SRG source: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp/1.12.2/mcp-1.12.2-srg.zip +# Names source: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_stable/39-1.12/mcp_stable-39-1.12.zip +# Unmodified source lines below. Method descriptors and native call arguments independently checked with javap. +# GuiListWorldSelectionEntry.loadWorld invokes launchIntegratedServer(summary.getFileName(), summary.getDisplayName(), null) after canLoadWorld. +# Minecraft is NOT Executor; addScheduledTask(Runnable) wraps a Callable and queues it for its original Minecraft thread. +# AnvilSaveConverter extends SaveFormatOld; canLoadWorld is inherited and requires public getMethod or superclass lookup. +# No getOverlay exists in this version; a GuiMainMenu screen is the readiness gate. +CL: tr net/minecraft/util/IThreadListener +CL: amx net/minecraft/world/WorldSettings +CL: bez net/minecraft/world/chunk/storage/AnvilSaveConverter +CL: bfc net/minecraft/world/storage/SaveFormatOld +CL: bfg net/minecraft/world/storage/ISaveFormat +CL: bfh net/minecraft/world/storage/WorldSummary +CL: bib net/minecraft/client/Minecraft +CL: blr net/minecraft/client/gui/GuiMainMenu +CL: bol net/minecraft/client/gui/GuiListWorldSelectionEntry +FD: bib/M net/minecraft/client/Minecraft/field_130070_K +FD: bib/m net/minecraft/client/Minecraft/field_71462_r +MD: bez/b ()Ljava/util/List; net/minecraft/world/chunk/storage/AnvilSaveConverter/func_75799_b ()Ljava/util/List; +MD: bfc/b ()Ljava/util/List; net/minecraft/world/storage/SaveFormatOld/func_75799_b ()Ljava/util/List; +MD: bfc/f (Ljava/lang/String;)Z net/minecraft/world/storage/SaveFormatOld/func_90033_f (Ljava/lang/String;)Z +MD: bfg/b ()Ljava/util/List; net/minecraft/world/storage/ISaveFormat/func_75799_b ()Ljava/util/List; +MD: bfg/f (Ljava/lang/String;)Z net/minecraft/world/storage/ISaveFormat/func_90033_f (Ljava/lang/String;)Z +MD: bfh/a ()Ljava/lang/String; net/minecraft/world/storage/WorldSummary/func_75786_a ()Ljava/lang/String; +MD: bfh/b ()Ljava/lang/String; net/minecraft/world/storage/WorldSummary/func_75788_b ()Ljava/lang/String; +MD: bib/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/client/Minecraft/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; +MD: bib/a (Ljava/lang/String;Ljava/lang/String;Lamx;)V net/minecraft/client/Minecraft/func_71371_a (Ljava/lang/String;Ljava/lang/String;Lnet/minecraft/world/WorldSettings;)V +MD: bib/g ()Lbfg; net/minecraft/client/Minecraft/func_71359_d ()Lnet/minecraft/world/storage/ISaveFormat; +MD: bib/z ()Lbib; net/minecraft/client/Minecraft/func_71410_x ()Lnet/minecraft/client/Minecraft; +MD: bol/e ()V net/minecraft/client/gui/GuiListWorldSelectionEntry/func_186777_e ()V +# Human-readable names from MCP stable 39: +func_152344_a,addScheduledTask,2, +func_186777_e,loadWorld,0, +func_71359_d,getSaveLoader,0,Returns the save loader that is currently being used +func_71371_a,launchIntegratedServer,0,"Arguments: World foldername, World ingame name, WorldSettings" +func_71410_x,getMinecraft,0,Return the singleton Minecraft instance for the game +func_75786_a,getFileName,0,return the file name +func_75788_b,getDisplayName,0,return the display name of the save +func_75799_b,getSaveList,0, +func_90033_f,canLoadWorld,0,Return whether the given world can be loaded. +field_71462_r,currentScreen,0,The GuiScreen that's being displayed at the moment. diff --git a/src/test/resources/launcher/legacy-adapter-1.13.2-evidence.txt b/src/test/resources/launcher/legacy-adapter-1.13.2-evidence.txt new file mode 100644 index 00000000..f203c243 --- /dev/null +++ b/src/test/resources/launcher/legacy-adapter-1.13.2-evidence.txt @@ -0,0 +1,31 @@ +# Narrow adapter evidence for Minecraft 1.13.2; retrieved 2026-10-04. +# Official client: https://piston-data.mojang.com/v1/objects/30bfe37a8db404db11c7edf02cb5165817afb4d9/client.jar +# Client SHA-1 verified: 30bfe37a8db404db11c7edf02cb5165817afb4d9 +# TSRG source: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp_config/1.13.2/mcp_config-1.13.2.zip +# Archive SHA-256: 6cce7b121f7e30c8bec08c5c5ed10e887fc5720a08fd6d698ea1f37ab127df8d +# Unmodified config/joined.tsrg excerpts below; signatures and behavior independently checked with javap. +# Native selection cnc.i() checks cce.f(summary.a()) then calls cft.a(summary.a(), summary.b(), null). +# Runnable scheduler cft.a(Runnable) wraps Callable and queues off-thread work in aG; it is not Executor. +# SaveFormatOld owns inherited canLoadWorld; public getMethod or superclass lookup is necessary. +# No overlay API; original GuiMainMenu is the readiness gate. +ayd net/minecraft/world/WorldSettings +cbw net/minecraft/world/chunk/storage/AnvilSaveConverter + b ()Ljava/util/List; func_75799_b +cca net/minecraft/world/storage/SaveFormatOld + b ()Ljava/util/List; func_75799_b + f (Ljava/lang/String;)Z func_90033_f +cce net/minecraft/world/storage/ISaveFormat + b ()Ljava/util/List; func_75799_b + f (Ljava/lang/String;)Z func_90033_f +ccf net/minecraft/world/storage/WorldSummary + a ()Ljava/lang/String; func_75786_a + b ()Ljava/lang/String; func_75788_b +cft net/minecraft/client/Minecraft + m field_71462_r + a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; func_152344_a + a (Ljava/lang/String;Ljava/lang/String;Layd;)V func_71371_a + g ()Lcce; func_71359_d + s ()Lcft; func_71410_x +cki net/minecraft/client/gui/GuiMainMenu +cnc net/minecraft/client/gui/GuiListWorldSelectionEntry + i ()V func_186777_e diff --git a/src/test/resources/launcher/legacy-adapter-1.7.10-evidence.txt b/src/test/resources/launcher/legacy-adapter-1.7.10-evidence.txt new file mode 100644 index 00000000..1e8b33cf --- /dev/null +++ b/src/test/resources/launcher/legacy-adapter-1.7.10-evidence.txt @@ -0,0 +1,33 @@ +# Narrow adapter evidence for Minecraft 1.7.10; retrieved 2026-10-04. +# Official client: https://launcher.mojang.com/v1/objects/e80d9b3bf5085002218d4be59e668bac718abbc6/client.jar +# Client SHA-1 verified: e80d9b3bf5085002218d4be59e668bac718abbc6 +# SRG source: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp/1.7.10/mcp-1.7.10-srg.zip +# SRG archive SHA-256: d49df5c445dcf00ada532ab3b0e4283bf4b05ac13f210647658dfd3cec8b34c2 +# Unmodified joined.srg lines below; signatures and behavior independently checked with javap. +# Native selection bdx.e(int) checks canLoadWorld and calls launchIntegratedServer(folder, displayName, null). +# Its display-name helper reads the summary name; only null/empty names get localized World N fallback. +# For ordinary nonempty save names, the summary name is passed unchanged. +# Minecraft Runnable scheduler wraps Callable and queues off-thread work in aB; it is not Executor. +# SaveFormatOld owns inherited canLoadWorld; public getMethod or superclass lookup is necessary. +# No overlay API; original GuiMainMenu is the readiness gate. +CL: ahj net/minecraft/world/WorldSettings +CL: ayn net/minecraft/world/chunk/storage/AnvilSaveConverter +CL: ayr net/minecraft/world/storage/SaveFormatOld +CL: aze net/minecraft/world/storage/ISaveFormat +CL: azf net/minecraft/world/storage/SaveFormatComparator +CL: bao net/minecraft/client/Minecraft +CL: bdx net/minecraft/client/gui/GuiSelectWorld +CL: bee net/minecraft/client/gui/GuiMainMenu +FD: bao/n net/minecraft/client/Minecraft/field_71462_r +MD: ayn/b ()Ljava/util/List; net/minecraft/world/chunk/storage/AnvilSaveConverter/func_75799_b ()Ljava/util/List; +MD: ayr/b ()Ljava/util/List; net/minecraft/world/storage/SaveFormatOld/func_75799_b ()Ljava/util/List; +MD: ayr/f (Ljava/lang/String;)Z net/minecraft/world/storage/SaveFormatOld/func_90033_f (Ljava/lang/String;)Z +MD: aze/b ()Ljava/util/List; net/minecraft/world/storage/ISaveFormat/func_75799_b ()Ljava/util/List; +MD: aze/f (Ljava/lang/String;)Z net/minecraft/world/storage/ISaveFormat/func_90033_f (Ljava/lang/String;)Z +MD: azf/a ()Ljava/lang/String; net/minecraft/world/storage/SaveFormatComparator/func_75786_a ()Ljava/lang/String; +MD: azf/b ()Ljava/lang/String; net/minecraft/world/storage/SaveFormatComparator/func_75788_b ()Ljava/lang/String; +MD: bao/B ()Lbao; net/minecraft/client/Minecraft/func_71410_x ()Lnet/minecraft/client/Minecraft; +MD: bao/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/client/Minecraft/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; +MD: bao/a (Ljava/lang/String;Ljava/lang/String;Lahj;)V net/minecraft/client/Minecraft/func_71371_a (Ljava/lang/String;Ljava/lang/String;Lnet/minecraft/world/WorldSettings;)V +MD: bao/d ()Laze; net/minecraft/client/Minecraft/func_71359_d ()Lnet/minecraft/world/storage/ISaveFormat; +MD: bdx/e (I)V net/minecraft/client/gui/GuiSelectWorld/func_146615_e (I)V diff --git a/src/test/resources/launcher/legacy-adapter-1.8.9-evidence.txt b/src/test/resources/launcher/legacy-adapter-1.8.9-evidence.txt new file mode 100644 index 00000000..9fe634b7 --- /dev/null +++ b/src/test/resources/launcher/legacy-adapter-1.8.9-evidence.txt @@ -0,0 +1,36 @@ +# Narrow adapter evidence for Minecraft 1.8.9; retrieved 2026-10-04. +# Official client: https://launcher.mojang.com/v1/objects/3870888a6c3d349d3771a3e9d16c9bf5e076b908/client.jar +# Client SHA-1 verified: 3870888a6c3d349d3771a3e9d16c9bf5e076b908 +# SRG source: https://maven.minecraftforge.net/de/oceanlabs/mcp/mcp/1.8.9/mcp-1.8.9-srg.zip +# SRG archive SHA-256: ea6fdd37e68569a378fd149b0ab7cfede1de7fa3e794f4ed81f9018366fbdc51 +# Unmodified joined.srg lines below; signatures and behavior independently checked with javap. +# Native selection axv.i(int) checks canLoadWorld and calls launchIntegratedServer(folder, displayName, null). +# Its display-name helper reads the summary name; only null/empty names get localized World N fallback. +# For ordinary nonempty save names, the summary name is passed unchanged. +# Minecraft Runnable scheduler wraps Callable and queues off-thread work in aM; it is not Executor. +# SaveFormatOld owns inherited canLoadWorld; public getMethod or superclass lookup is necessary. +# No overlay API; original GuiMainMenu is the readiness gate. +CL: adp net/minecraft/world/WorldSettings +CL: atk net/minecraft/world/chunk/storage/AnvilSaveConverter +CL: atn net/minecraft/world/storage/SaveFormatOld +CL: atr net/minecraft/world/storage/ISaveFormat +CL: ats net/minecraft/world/storage/SaveFormatComparator +CL: ave net/minecraft/client/Minecraft +CL: axv net/minecraft/client/gui/GuiSelectWorld +CL: aya net/minecraft/client/gui/GuiMainMenu +FD: ave/m net/minecraft/client/Minecraft/field_71462_r +MD: atk/b ()Ljava/util/List; net/minecraft/world/chunk/storage/AnvilSaveConverter/func_75799_b ()Ljava/util/List; +MD: atn/b ()Ljava/util/List; net/minecraft/world/storage/SaveFormatOld/func_75799_b ()Ljava/util/List; +MD: atn/f (Ljava/lang/String;)Z net/minecraft/world/storage/SaveFormatOld/func_90033_f (Ljava/lang/String;)Z +MD: atr/b ()Ljava/util/List; net/minecraft/world/storage/ISaveFormat/func_75799_b ()Ljava/util/List; +MD: atr/f (Ljava/lang/String;)Z net/minecraft/world/storage/ISaveFormat/func_90033_f (Ljava/lang/String;)Z +MD: ats/a ()Ljava/lang/String; net/minecraft/world/storage/SaveFormatComparator/func_75786_a ()Ljava/lang/String; +MD: ats/b ()Ljava/lang/String; net/minecraft/world/storage/SaveFormatComparator/func_75788_b ()Ljava/lang/String; +MD: ave/A ()Lave; net/minecraft/client/Minecraft/func_71410_x ()Lnet/minecraft/client/Minecraft; +MD: ave/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/client/Minecraft/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; +MD: ave/a (Ljava/lang/String;Ljava/lang/String;Ladp;)V net/minecraft/client/Minecraft/func_71371_a (Ljava/lang/String;Ljava/lang/String;Lnet/minecraft/world/WorldSettings;)V +MD: ave/f ()Latr; net/minecraft/client/Minecraft/func_71359_d ()Lnet/minecraft/world/storage/ISaveFormat; +MD: axv/i (I)V net/minecraft/client/gui/GuiSelectWorld/func_146615_e (I)V +MD: le/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/world/WorldServer/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; +MD: net/minecraft/server/MinecraftServer/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/server/MinecraftServer/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; +MD: od/a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; net/minecraft/util/IThreadListener/func_152344_a (Ljava/lang/Runnable;)Lcom/google/common/util/concurrent/ListenableFuture; diff --git a/src/test/resources/launcher/legacy-mappings-1.14.4.txt b/src/test/resources/launcher/legacy-mappings-1.14.4.txt new file mode 100644 index 00000000..53e2ecd1 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.14.4.txt @@ -0,0 +1,29 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.14.4; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/6073e4ba6949217eb708c4512be2ccc1850a603f/client.txt +# Source SHA-1: 6073e4ba6949217eb708c4512be2ccc1850a603f +# Native WorldListEntry.loadWorld bytecode calls selectLevel(getLevelId(), getLevelName(), null), after levelExists. +# Verified against original client JAR SHA-1 8c325a0c5bd674dd747d6ebaa4c791fd363ad8a9 using javap; no world was opened. +net.minecraft.client.Minecraft -> cyc: + net.minecraft.client.gui.screens.Screen screen -> n + 803:803:net.minecraft.world.level.storage.LevelStorageSource getLevelSource() -> h + 1577:1646:void selectLevel(java.lang.String,java.lang.String,net.minecraft.world.level.LevelSettings) -> a + 1930:1930:net.minecraft.client.Minecraft getInstance() -> u + 2408:2408:net.minecraft.client.gui.screens.Overlay getOverlay() -> at +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 42:156:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> dcp: +net.minecraft.client.gui.screens.Screen -> dcl: +net.minecraft.client.gui.screens.Overlay -> dcg: +net.minecraft.world.level.LevelSettings -> bhv: +net.minecraft.world.level.storage.LevelStorageSource -> coq: + 75:101:java.util.List getLevelList() -> b + 109:109:net.minecraft.world.level.storage.LevelStorage selectLevel(java.lang.String,net.minecraft.server.MinecraftServer) -> a + 113:113:net.minecraft.world.level.storage.LevelStorage selectLevel(java.nio.file.Path,com.mojang.datafixers.DataFixer,java.lang.String,net.minecraft.server.MinecraftServer) -> a + 247:247:boolean levelExists(java.lang.String) -> e +net.minecraft.world.level.storage.LevelSummary -> cor: + 44:44:java.lang.String getLevelId() -> a + 48:48:java.lang.String getLevelName() -> b +net.minecraft.util.thread.BlockableEventLoop -> agq: + 91:96:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> agu: diff --git a/src/test/resources/launcher/legacy-mappings-1.15.2.txt b/src/test/resources/launcher/legacy-mappings-1.15.2.txt new file mode 100644 index 00000000..852d7b85 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.15.2.txt @@ -0,0 +1,29 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.15.2; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/1fbf9f0bc9c326af859b3ccf71c2a8f5edc47ef8/client.txt +# Source SHA-1: 1fbf9f0bc9c326af859b3ccf71c2a8f5edc47ef8 +# Native WorldListEntry.loadWorld bytecode calls selectLevel(getLevelId(), getLevelName(), null), after levelExists. +# Verified against original client JAR SHA-1 e3f78cd16f9eb9a52307ed96ebec64241cc5b32d using javap; no world was opened. +net.minecraft.client.Minecraft -> dbn: + net.minecraft.client.gui.screens.Screen screen -> x + 832:832:net.minecraft.world.level.storage.LevelStorageSource getLevelSource() -> j + 1613:1682:void selectLevel(java.lang.String,java.lang.String,net.minecraft.world.level.LevelSettings) -> a + 1970:1970:net.minecraft.client.Minecraft getInstance() -> x + 2426:2426:net.minecraft.client.gui.screens.Overlay getOverlay() -> at +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 45:220:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> dgf: +net.minecraft.client.gui.screens.Screen -> dgb: +net.minecraft.client.gui.screens.Overlay -> dfw: +net.minecraft.world.level.LevelSettings -> bka: +net.minecraft.world.level.storage.LevelStorageSource -> crp: + 75:101:java.util.List getLevelList() -> b + 109:109:net.minecraft.world.level.storage.LevelStorage selectLevel(java.lang.String,net.minecraft.server.MinecraftServer) -> a + 113:113:net.minecraft.world.level.storage.LevelStorage selectLevel(java.nio.file.Path,com.mojang.datafixers.DataFixer,java.lang.String,net.minecraft.server.MinecraftServer) -> a + 247:247:boolean levelExists(java.lang.String) -> e +net.minecraft.world.level.storage.LevelSummary -> crq: + 44:44:java.lang.String getLevelId() -> a + 48:48:java.lang.String getLevelName() -> b +net.minecraft.util.thread.BlockableEventLoop -> ais: + 91:96:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> aiw: diff --git a/src/test/resources/launcher/legacy-mappings-1.16.5.txt b/src/test/resources/launcher/legacy-mappings-1.16.5.txt new file mode 100644 index 00000000..5cc4525d --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.16.5.txt @@ -0,0 +1,17 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.16.5; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/374c6b789574afbdc901371207155661e0509e17/client.txt +# Source SHA-1: 374c6b789574afbdc901371207155661e0509e17 +net.minecraft.client.Minecraft -> djz: + net.minecraft.client.gui.screens.Screen screen -> y + 1748:1749:void loadLevel(java.lang.String) -> a + 2295:2295:net.minecraft.client.Minecraft getInstance() -> C + 2752:2752:net.minecraft.client.gui.screens.Overlay getOverlay() -> aA +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 46:231:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> doy: +net.minecraft.client.gui.screens.Screen -> dot: +net.minecraft.client.gui.screens.Overlay -> don: +net.minecraft.util.thread.BlockableEventLoop -> aob: + 91:96:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> aof: diff --git a/src/test/resources/launcher/legacy-mappings-1.16.txt b/src/test/resources/launcher/legacy-mappings-1.16.txt new file mode 100644 index 00000000..7c742b5e --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.16.txt @@ -0,0 +1,17 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.16; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/9539840a7dbea682b305858fe138bd03ee7823cf/client.txt +# Source SHA-1: 9539840a7dbea682b305858fe138bd03ee7823cf +net.minecraft.client.Minecraft -> dlx: + net.minecraft.client.gui.screens.Screen screen -> y + 1698:1699:void loadLevel(java.lang.String) -> a + 2230:2230:net.minecraft.client.Minecraft getInstance() -> B + 2687:2687:net.minecraft.client.gui.screens.Overlay getOverlay() -> az +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 46:231:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> dqw: +net.minecraft.client.gui.screens.Screen -> dqs: +net.minecraft.client.gui.screens.Overlay -> dql: +net.minecraft.util.thread.BlockableEventLoop -> amn: + 91:96:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> amr: diff --git a/src/test/resources/launcher/legacy-mappings-1.17.1.txt b/src/test/resources/launcher/legacy-mappings-1.17.1.txt new file mode 100644 index 00000000..0c9db0e4 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.17.1.txt @@ -0,0 +1,17 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.17.1; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/e4d540e0cba05a6097e885dffdf363e621f87d3f/client.txt +# Source SHA-1: e4d540e0cba05a6097e885dffdf363e621f87d3f +net.minecraft.client.Minecraft -> dvp: + net.minecraft.client.gui.screens.Screen screen -> y + 1939:1940:void loadLevel(java.lang.String) -> a + 2467:2467:net.minecraft.client.Minecraft getInstance() -> C + 2932:2932:net.minecraft.client.gui.screens.Overlay getOverlay() -> aA +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 47:235:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> eav: +net.minecraft.client.gui.screens.Screen -> eaq: +net.minecraft.client.gui.screens.Overlay -> eak: +net.minecraft.util.thread.BlockableEventLoop -> aqv: + 98:103:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> aqz: diff --git a/src/test/resources/launcher/legacy-mappings-1.18.2.txt b/src/test/resources/launcher/legacy-mappings-1.18.2.txt new file mode 100644 index 00000000..f2e9d433 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.18.2.txt @@ -0,0 +1,17 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.18.2; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/a661c6a55a0600bd391bdbbd6827654c05b2109c/client.txt +# Source SHA-1: a661c6a55a0600bd391bdbbd6827654c05b2109c +net.minecraft.client.Minecraft -> dyr: + net.minecraft.client.gui.screens.Screen screen -> y + 1937:1938:void loadLevel(java.lang.String) -> a + 2435:2435:net.minecraft.client.Minecraft getInstance() -> D + 2826:2826:net.minecraft.client.gui.screens.Overlay getOverlay() -> az +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:254:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> eeb: +net.minecraft.client.gui.screens.Screen -> edw: +net.minecraft.client.gui.screens.Overlay -> edq: +net.minecraft.util.thread.BlockableEventLoop -> auz: + 100:105:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> avd: diff --git a/src/test/resources/launcher/legacy-mappings-1.19.2.txt b/src/test/resources/launcher/legacy-mappings-1.19.2.txt new file mode 100644 index 00000000..ef6a8dad --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.19.2.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.19.2; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/8e8c9be5dc27802caba47053d4fdea328f7f89bd/client.txt +# Source SHA-1: 8e8c9be5dc27802caba47053d4fdea328f7f89bd +net.minecraft.client.Minecraft -> efu: + net.minecraft.client.gui.screens.Screen screen -> z + 2029:2029:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> u + 2400:2400:net.minecraft.client.Minecraft getInstance() -> I + 2804:2804:net.minecraft.client.gui.screens.Overlay getOverlay() -> aD +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:52:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> elr: +net.minecraft.client.gui.screens.Screen -> elm: +net.minecraft.client.gui.screens.Overlay -> elg: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> ept: + 57:58:void loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> ayz: + 100:105:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> azd: diff --git a/src/test/resources/launcher/legacy-mappings-1.19.3.txt b/src/test/resources/launcher/legacy-mappings-1.19.3.txt new file mode 100644 index 00000000..976b839c --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.19.3.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.19.3; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/42366909cc612e76208d34bf1356f05a88e08a1d/client.txt +# Source SHA-1: 42366909cc612e76208d34bf1356f05a88e08a1d +net.minecraft.client.Minecraft -> ejf: + net.minecraft.client.gui.screens.Screen screen -> z + 2063:2063:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> w + 2449:2449:net.minecraft.client.Minecraft getInstance() -> N + 2850:2850:net.minecraft.client.gui.screens.Overlay getOverlay() -> aK +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:52:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> epg: +net.minecraft.client.gui.screens.Screen -> epb: +net.minecraft.client.gui.screens.Overlay -> eov: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> etq: + 61:62:void loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> bbc: + 99:104:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> bbg: diff --git a/src/test/resources/launcher/legacy-mappings-1.19.4.txt b/src/test/resources/launcher/legacy-mappings-1.19.4.txt new file mode 100644 index 00000000..5231b5e6 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.19.4.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.19.4; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/f14771b764f943c154d3a6fcb47694477e328148/client.txt +# Source SHA-1: f14771b764f943c154d3a6fcb47694477e328148 +net.minecraft.client.Minecraft -> emh: + net.minecraft.client.gui.screens.Screen screen -> z + 2080:2080:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> w + 2465:2465:net.minecraft.client.Minecraft getInstance() -> N + 2862:2862:net.minecraft.client.gui.screens.Overlay getOverlay() -> aJ +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:255:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> eti: +net.minecraft.client.gui.screens.Screen -> etd: +net.minecraft.client.gui.screens.Overlay -> esx: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> exx: + 62:63:void loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> bco: + 99:104:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> bcs: diff --git a/src/test/resources/launcher/legacy-mappings-1.19.txt b/src/test/resources/launcher/legacy-mappings-1.19.txt new file mode 100644 index 00000000..152b2125 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-1.19.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 1.19; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/150346d1c0b4acec0b4eb7f58b86e3ea1aa730f3/client.txt +# Source SHA-1: 150346d1c0b4acec0b4eb7f58b86e3ea1aa730f3 +net.minecraft.client.Minecraft -> eev: + net.minecraft.client.gui.screens.Screen screen -> y + 1991:1991:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> u + 2347:2347:net.minecraft.client.Minecraft getInstance() -> G + 2737:2737:net.minecraft.client.gui.screens.Overlay getOverlay() -> aB +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:255:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> eko: +net.minecraft.client.gui.screens.Screen -> ekj: +net.minecraft.client.gui.screens.Overlay -> ekd: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> eok: + 57:58:void loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> ayc: + 100:105:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> ayg: diff --git a/src/test/resources/launcher/legacy-mappings-22w11a.txt b/src/test/resources/launcher/legacy-mappings-22w11a.txt new file mode 100644 index 00000000..4867db9f --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-22w11a.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 22w11a; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/dbb05f0a348f2c76df6916b6aedcf691fb8c11f0/client.txt +# Source SHA-1: dbb05f0a348f2c76df6916b6aedcf691fb8c11f0 +net.minecraft.client.Minecraft -> eam: + net.minecraft.client.gui.screens.Screen screen -> y + 1970:1970:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> t + 2334:2334:net.minecraft.client.Minecraft getInstance() -> F + 2724:2724:net.minecraft.client.gui.screens.Overlay getOverlay() -> aB +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:254:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> egd: +net.minecraft.client.gui.screens.Screen -> efy: +net.minecraft.client.gui.screens.Overlay -> efs: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> ejy: + 55:56:void loadLevel(java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> avp: + 100:105:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> avt: diff --git a/src/test/resources/launcher/legacy-mappings-22w13a.txt b/src/test/resources/launcher/legacy-mappings-22w13a.txt new file mode 100644 index 00000000..3f26da50 --- /dev/null +++ b/src/test/resources/launcher/legacy-mappings-22w13a.txt @@ -0,0 +1,19 @@ +# Selected lines from the unmodified Mojang client mappings. +# Minecraft 22w13a; retrieved 2026-10-04. +# Source: https://piston-data.mojang.com/v1/objects/6c24f90a6b2653803072e82d26814aec59b79eb1/client.txt +# Source SHA-1: 6c24f90a6b2653803072e82d26814aec59b79eb1 +net.minecraft.client.Minecraft -> ebq: + net.minecraft.client.gui.screens.Screen screen -> y + 1970:1970:net.minecraft.client.gui.screens.worldselection.WorldOpenFlows createWorldOpenFlows() -> t + 2334:2334:net.minecraft.client.Minecraft getInstance() -> F + 2724:2724:net.minecraft.client.gui.screens.Overlay getOverlay() -> aB +net.minecraft.client.main.Main -> net.minecraft.client.main.Main: + 51:254:void main(java.lang.String[]) -> main +net.minecraft.client.gui.screens.TitleScreen -> ehf: +net.minecraft.client.gui.screens.Screen -> eha: +net.minecraft.client.gui.screens.Overlay -> egu: +net.minecraft.client.gui.screens.worldselection.WorldOpenFlows -> ela: + 56:57:void loadLevel(net.minecraft.client.gui.screens.Screen,java.lang.String) -> a +net.minecraft.util.thread.BlockableEventLoop -> avz: + 100:105:void execute(java.lang.Runnable) -> execute +net.minecraft.util.thread.ReentrantBlockableEventLoop -> awd: From 9fffb57b5d201f4cd9c9c854426d08bf86908417 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 20:47:27 +0200 Subject: [PATCH 7/9] Replace server browser table with responsive server cards --- .../server-browser-compact.png | Bin 0 -> 43828 bytes .../native-launcher/server-browser-dark.png | Bin 0 -> 63034 bytes .../images/native-launcher/server-browser.png | Bin 39248 -> 63475 bytes docs/native-launcher.md | 6 +- .../autoplug/client/ui/DashboardPanel.java | 230 +++++++++++++++--- .../autoplug/client/ui/DashboardTheme.java | 38 ++- .../client/ui/DashboardPanelTest.java | 128 +++++++++- 7 files changed, 363 insertions(+), 39 deletions(-) create mode 100644 docs/images/native-launcher/server-browser-compact.png create mode 100644 docs/images/native-launcher/server-browser-dark.png diff --git a/docs/images/native-launcher/server-browser-compact.png b/docs/images/native-launcher/server-browser-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8196a2d26386e19d740b683dfdf180cb15a1ab GIT binary patch literal 43828 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 Oh?t!NgzA|;Z~qtS;;*3q diff --git a/docs/images/native-launcher/server-browser-dark.png b/docs/images/native-launcher/server-browser-dark.png index cf55060af4553604d9c5ca5e4eb3adeb3ed03172..b81a5565126f530d304d6cd0917c1f29a1ac3c90 100644 GIT binary patch literal 62331 zcma&ObwE{J7Cx*XB`w`u(%m5;(jZEQbl0U@q(xe~K}xzCq~p>pDRJqROUHLWXXc&X ze0Bc3oU>!?mCt%Mp~{NVsLu(XKY8*5RpyQ4+b2(+l|Oj`%Y_I7{6gI=Kl|j#$0st9 zuim-o?JXj>VQ>10`fU32La&$8%BasEhB|C{VN2A{VEmrF$y^eALH<-62In)z8^nMu za)E4D>HuY_lU&`#SixSG)tGwBd518P-U^4k#7kc@eRh=J!z@K{)pI9lo4@xsuZIOq zmd|l~+R~ZNz4wXyLmr<#%*Q91_X9aK<->FG79~LP@zMM27xm{oId+T}kFU8i zz>7b=MakMN_U7@e^;~?!(8t%Bv0*9x43=Q{zk_`T`yI6h2cP*GE*N!sA$&RV^;&;N zNzeoT8nFlIb(l~<(xZn(4IBHC6W{bjg+@lE3V4lMFJ}fg zJdN(8g-0jk)NK`%4Dj(f*JX#ZoXaC*;vM{~+Z3Us%J&6!p5VgSqB`-rLP z($5hPn{qV8%!ho~{IY}RaUq@-Mmq*`ZD z|L4F?TgDmvjy;N~37c1vXFq-sh)`(!-@RvDzg)i^-Ptn|L-*%BA`A+2X3xI=+885- zp*S$<%@38EQ*wSpe*}p)|1*{y`DscT--m!Up)tD3NYS7uq3S(~k*rXmAfaCm2c6n~ zCzeR9a2(qBxoY`trex{CH6iX_{bevLfu*LpdT+J?EczixryXgpK~boRDvLGu;oY5Lqz9M?pz-lTDXlTi3#CcBUujV}nVD(1K zZEyBCFE4LnV`I_t>;gev)cNYPT_U(EZ^!#uF;yru?nmaYv?iCFImp~xYHq_^R;|tQ z(&%U=Nv%X(roHJ=>Ma7=uRa8Hl5_$tBAQD^H69+GRq`w3EfMHm(Tq;37eB4YtFOPL zRs?GBtlYv46QD!`_6E$%C7wm+p}g-0rc8qe1+`TDW8N3dm`lg%s~;^yQAtNq`j+Zd zsTI+tiu$%1I_5U2kM7mh?#eJ&Xh=6@EzBGQ)wnz-+HWw{w7s1w!eiCL4n|GJ`qaX~ zfw!|OpTb_%Y&a3e2<7WLxxs0jE|a!p>?|zVH!tb7)@fjH|A7S+0T>a+S=M}PXElB8g9@2xBA>a_UhfXUx;@PbY!2Mon5X(uPTRxA>tV7 z%HP)D%(fcQ!Tk85*&af?J8dV11OxjbWF@9iDYZJY0N(*lDaU9nIxkB56mPA_6WDo` z*$Cw!^RVV;=wP7h(!0X4TB~!?b@_J^t>Y22ZKZ&e`=_*QI*jri&YFV*csoRGCHHT2YsMIbbKV>p?avl-Pq^!H0_tr19Y6$ti6&4ckV^sNK zew*PRjSdqvAn}_ zy*ZuY!eiAH-vx|*I1xujUteFXRmHRD+byb<$8)RwLfzVrZjl13rD^Fm;(KkRorN}s z^cj6~aoSXW-8B$w=p1~=CEaG<)^G#`A#YXS!@(8k8b zaWjwrEw`kuw$^sBR@Z9~CAzY-l!c2)+_!P`a;2bo0fbPPZ*JDxFgHIRjf4t0vEpiR zYnU5LPX3L@@@y!*Nys-4Sa&I4N-k<(aDq0zCgKpK?N18SRVD}#V;Ai;(exaH{QU2} z=$r&r{fLmy$LNWqm?Two9?O8?0RAd(1Z7;klZGPmbx)Ut9YM{#2TFczOU{B}(Bk3$ z;X~?6orEbr-^rxr<0qCn~HRAE;%Rx=A* zz21FSxq&jdqP%-rA_aLbnCBB5xF1L;P@+4+HLON{QvAk%Q6a$7RCPqj zPsb7*pq6Ge4~!Ets6zeL0-oMsHV>ad(0OhMt`T$~`ZBACE4T*GPa!cF~i0 zr}U*;qt~90-Tmz1V}VT7s=fTf1eC17q3n6RiPY$)NuT+D!;b6B!J9qnxMa7udPWlu z7xo*HjAm|YF&4o941F*z9}l=|&8*|RIEX|vLz^vJM|&hnQiwlF3WgAnR?HTz011eP z;k%DsxR0aT`TrT+==&EWPSfE;Q8`Xa$6>^Plp>eUdrrr1Z6rFmD}1)L92)Xq52&jS zOgK9og1#h)@KRnbT*_%t=mpjc7)KsF69>1nGl;ZO#G3Y?5pqh1@IB_41`ng=4JC?# zV=Yx%ND+g>ktc0e-&_BzFk7ZzmQ_d=Q7T=2KQ|`Om@p(CnbTJ1z70y-A23eod`v~r z@K;2wy)fXAiC*T2|2CLX6FV<^vKt3PEyehPCl<_3LgN4 z?t}2xc$|^k8XqCP{gmKQrkvG4J%-C8AwfD%l|UZ z1peuWM+>*$?EALuJtHx@L%iDT?4)r{rH)~fm!&nq0Gep&Fxpb@k|+Ls!CpPQ9BZ^U)LFt*_CGLnQ#*UR~oGZMb+xO`KHC8VN1tolSkIwFZw zTJK0aD5B~2Q=VH|D;k~wS9P+<=Lzd2;{(y^&QsxKlZ(!D7*|7z#B3ej8v6m7>+d;A-TO!wu7Jbn~+s584@yj_tV(uE93D z?!_;*v8JW<$%%_hfVg%@LHr=ixI`+&$E{c?N3& z{*Wh&Bf1}C_yvtNeT&kDEIxWuj8(vXVRLit=NU8D%d zcK*GvCFtneNB5xR7hJ^oDz0Q4W#y8d2&SgP&r6zX4`kmM4~#l+e(HR|s#`iSfHi*b zOsb?@LLgASbRm~fUtO&bN3XC=fK|X|_TmTNnl)zr?86K}JmbmzMP=fb8%$)v!;$7O z*4?V>O6(V-gyvY)D02uU0ks^pON;PV7s1j!wE4NcT{HpGl0(R0h-qYsEziTh?TMc}61JuakFwEb+<}K2~*BwV_B|1UU0$KdNvA1t4ueEEtnP4vt94 zdf$^fu<2|CcD`SfOx2i@QC+>EmK7au6=M-!QD`Nd)CdS>D3r8MSyoGia z?Ko?04@6~GKZa_dns}%zId$(~xcnH*%1RF1`g7YM3%^m;Qm?L0uldiSP|ew^Qx+0` zQyCepu0pms_{jud7TZNYgjSEDXTe8Y9Q+Zj3SIt^tgb;h<6xzT9AID}b#As4#fkp& zBd$bKe|S=2>I+g#nvuBv%RdX4(6D-3K)cx1ctjdsS_R*-C_M8v%=!SFZJ`R(!X z(_^i!J{hB&e9RcM-^|XzjSOa_l~0+2Tw;khrMy`w+sejiGO0#M_NekJrhfr$;^33t zXs*T25ht0UfjCzOS70H9+XSFr6%!Xj1M0Yh$Su$2hN{^ip_OSI998S$I}xOZR0N(1 zBh~Eyny~-}nnTqH#pyfJT0^6)iZt`==aR`Z2v7 zWia#&*${f9PI8l%QForOXAziJZG8ihBWZ0|Mv%z!;1QZWkULq(ov4%Xy>raH+kx)R zXlu_~?(P(wlMQR??QuH9>-^+&qQY?558ft04!Ff-ENd-;?+{+*vOReb-%uuFG*D&i zxy~{oUHv1cIh1(%Rz!BBuUSXi>f&D6S-ljyM2loVFZS}U&hwatJWMytZF=DV`_Se zBE3JQc-xe0f379JrNz5{Tt~v)O>)xDAK|zIsK@K3tyc9`0g;WQ3D%KYW$C=K|0RXw z%>jSV|F6@cXut*BH=Af%rlinZf4Uf7RwZZ3c0x7Q4gw+sE)GI<0|r4x^j~K9l&ZOv zkJdv)7=Mmbk4hCd>R0uAHS6aw*OxIw45)4U{;jU_N1Ls))l4Z#Nntd&3YSGMwaR!ZncIYjcMdVYJpQO} zYmH73NIg_a$+z_1B{*52%-XWdYd3ZMU3A_kki_*o07Gy6j#zPD_O_LoR^7K`J=;@0 zd=@cR5btY}#nBJi#0Z=XfSbDO*h4ee!*t%w&G;U6QN2{0K79thizgP5ZNjhUsaw29VvTe%vP`ZDq{c|$=W&;+2&Knn@{}NViQoMpoIATI1)Ke{^97KLY_SEWPFC*Q>xWT|Msea(B zE1K>Mt8r3`Hf9}+yCs6r!WctC<@i9S<^a$)RADq$aZHaC`DLlm=6b3~Jta9=t&Dk0 z-=B}K6a(6AHKrfuGp3(aEa+X$Cw&V)1|SM2v<|__^v#PO;Ys4B0UUpCb@GFWneVl@4nyU$PKuBhO*#gsGDVoRjEPFDA_zsNF6BR*Aq zf;?T%P1c*x`Aw)$LFq4n{e>}}>J*Cyw=*vZBjj@vaAq!u8ni^xf`MeXhNX^+Yj8Wc zJ#ie`&!~p`LD;ujR%K=Hr=!DhsMU1*2VrmwQr|zS!5;Iuy4KsIyYKR4%F}5gT9sVtHa&50C$yeU3wlvK$KR#0 z77&B*a$CF_Xx|c_RNY;euLpcH9)n&o9yBU8RAx2oS!mcS+H?I&$QK+KF>(&=Vu+9- zOXKmA#EAG2fSkGXw z4M06%RJ*LNwJ}p9b+FX|JnLJl5E!)Hr}CA2$DEhBM%8@g0|G7Sumy#$9BM>ATPRkRt@ zICqX&|1$t^!y16A1_a~JEjyOi3ziw?>?#@~#I0j?k%^euLG29A!q=&ddO!0@eQ%N) zBi3#pln}7?PGgNYD(IK5Xc=znS?ks5t?2jN`_|P`0mHF$N{!ajh?CBQsWSfCDZw=T zPnIJQwMoO?`zSdZE*rQjF{pJBVTUodr3aT&e3F)YCm(!; zS+KV|RTGiAVIXG{<^>gnD$ zKzivUtHXq|yNFw{dgPIzq^v5)%Xe>dMQ?PSz2#Dp<=SfBYHAkY4tU~B7xMo;&v+^2 zoJQkvVD1k%_u=viKJ8mCLQ-g;3B+}1TVWS5Pt|<_iUw}Nh=yke_v(l;(4YohqZ2oK zU4noZ-rqP5;ObrL*qsL@Ha4DTd)&_`O2k33glK{C^cmou_ayuv?8}!wK~FncZxILy z2{AmNb_7!{))p3vHJ*`f%XwZJ6O3P-^CL6epoFPTo29xZbss5ljAFy(3v~BmOd8Bf zt54ywOv69SspWA$U7X2U8r#2V&fSj4i-Qi)@D}^*=E^0of5~9!<(ir7@2WIu zF}Mlwp>Xs`yFhn{FwNe_tJA~yf-E#8(Q9$xz>7vg_cCAotOICw!hpKEOZ;p@4r-pG zzF=pNaGQX6P6Ur?UHtP?9GATX=j{^{Nmd&kGNKH(i=*g`4b!fU<{O-ogEx`0bCZ+C z9&aD~{ziw?NrSb{d&9Q_$7^(2+S(2@t2tJ0NcsX4;-wZEClBizK*-s0nhjS?XeR~= zj~)nS{RiN(1ervCXuNBFe#}Jq()87I2M|qi%CB6gd2-w4IL$_;Cy9}{t)5NPa+HKB zN`eGkZUQbOvujA;Buu;=`%#OQ8<}{~Ut#a^6{@xWN7YUp$i2MQs}paMxy@{?ZEsXH z7lZi)Tj^%Dh2PtJRvtT&v4tx24!-%i8x{M28j)-W^3y*B;)E#1mCgI#FIE?Z>84Tw zvdfnZp=enlfj;p{@E%BioqJMv`An|BIkhxg*?5}B_}9{9auJ7o=9x16k7)|Yjl>z7!ru}QcyH~ z^C3@m2|~p@8yMiVY||shI=9D1Y|0Vz{uaDf$HZ%Q8&o;K{2quGA+Ad?gMZQ@DKdl( zg&AAQ(92;k0pH6HgQo$5pVb-^4>9?V9LRi^N3Dy08LkVg8w16L%!t#0mDwyt270v_ z`z=b=tpGkE$vze68`W|*J9&oaz`F1a8lDnoh;TO;pA?hL>Mmj4pLa#SSCEdF!Z#5zZ z1g%FRf~s~I@rb<*wgULCKo#I-sd?03DO$<2FDItOBO#2W+{~}PuGM@wLhhCI(4>O- z=7T4wpRjV$9J}UcUqFL_2CY%m&>Fi<;$0t<;K}SBwFMc`(&hp}S1rv0XEzJE4xNyMkItKOdM4F}#QBpd zxPr7Q8(s$8!L}2Ej;rR)N$x@O{P;5u&kZJH1!E-Yc^X~B_78|VT|S(6+iWEOd_exa z?%~Lg@X)Y?&4G2VEkq}T>pqL(N0g>%>skyE);q5UH?^R0fv(v4PKRtf;Ax#d*4w06 zlcA(#Yl{|cTT@w+-2^ykpU@YAu9Fix7sKFoS-=1vgqrsnsv2QP68XMP)RM1*7iE`! zzAZ&%so8oYGGYHxra!Qb$`O6_JI4M7^Fl>~Obe;b`!~~Sy(}Yw{LC04>@@teRBiej z`Jg=t)qmCJW3gtmMTc*=hU5DCN8$b~m*1M}v4q@O6AKaJb~yV)_gd*3RkPT%q$kB{ zq}4C(XCV3)oe@(lK#T-&pFC}ZnB{sB1D$mLn>Uf5wVx18#o%z^!T z28p*gxj{dlLi2Z0M3$AW+gD4Lak(MCs72fpU4Pwosb0HIn*S_rzC+iHBaxsRj&pr5 zeU25t4cJ*WH|(r4uHI&df4E703DzC*%YlIpPYJXS$$!cYH~Y;e#e8iDaAz!KciXdK zH44P_LWk@2bBStKk)v|kl$ zR`(AE8J`Lh1B-5??VkYfL7mAxN^4F~9l2mW{Uw>0Pn42}o&TXLDnbio;^IgqM2#>_ zxb7f4i|!ggZ!d&kpB>Tq9-1L zJJ3vf=<$FEA1cMaoFTEV5{6CzM z*HuDYkIbRI{~03i5A&$c0w8?Uu>Bz)@uR|0G{oCJ>j;e(U$WdY2D~ ziliJ4d; znGS}9$jB=y$jB)vjAR~&5oObirJKKRC=3m0MtCguP4&r%4>s{qL!>E#4G{Y!z@&y; zV2Oq9%P$$EFG$le6%RSaIXFT+o&{mS;{@TtCkpMP26fKESIZd6T57!8o9*`lP4ttJ zaPTux((-c))3Q(qQCjM0NN(NO@1RvvXua4ERg;>}4uqJ}QJ%m*oK!O%h6sn-c=OTh zdi81F)+~S4Z~u+KGyHzRR)5^_QU3`CiFEeai=3#u450$QMEbO&D_oCCsi*F{8~MMKdVI zXE|Ox^j@%xN2jRFu8)-|nvqZJR{s$E90F?jdJ0!%n&P!hnMVZ|7?{Fqw^VJRdKQxl zfn-d~f`DWvh{B?%wP{{jA8mybhYna{-X)mRN98XTM+hx#Enc^ciWMK~9^5FCtG*L(R&**aGN7!ogPV1O;?| zsYQ^2;iq!Mi?2i+Sr%l@+!#SicXRmOXA`Y&dhWzR;uKOCwY9V$&siS4QbEdt`{Luo zC}k`H8Udk7Lq2YO)G8cK3t#q|&J28-JrDh|jPlRx7LY8gt;J;^)4GvpzxVBup4$}^ zd@r;6akVC*`g!`RZfVQ7eF-~_W72H0ezon)5-i`zneLP!9;_AT22j+zfB)Wsz;(%i zm)FV1;rQjV?)OFNBS>ky6QCSxa6B_T13lA=si?2zYk3MO<)lJ%#+nBwpFb2P?PVI0Twq%x-pZOMH%x3jY&>21R< ztZ1&$wPbly^BwwI9T&gWFc*MRsHClcI_;c{j~+C0bJPdaU29*YBS_QmNd01t3bu@T zBkHQFzuMBrmX+s|U%yvZ-{s8Gp-eoBhV@fs8}b2od?fK9I0PgBRF~8l92wG)SpTe= zXzu&QY{k~>h2!Qhz%;>1K_e0I+8ESqh~S${Z<(4QB&ukwHBOt;S1(N@RrYGA>Nv-wS4={r z^RtgYNm%PT_S|)U$?+0oqhWlyQ$w@AzrUJ*UQ?pM?|SDY=`;v14K+q8nh`wD(_0Wx z@a+It9?Up-zxJ_OSz8+qlO*hog-2t0w$jJx@n7u-+g^tGC=@+}0wHI9mn#eEs2WJ4HkojsC zkRG^9g&g}eos(KyTN83KY*}`4+t5~fn{n5|Ka<{{ZD~7@6_&+iW)?$In=Cf}iPzvD zH70O7R_=T`P@~~)oyamtH#1>z2o-r`md_Oo^exmt zK4WyJt0`4Bp>*q1rtU zg5GuNB>ZOmM{WbSB)2_D?WzFCNhxvf>H%xVY?L%mRgInYkd7dh8nCpreTBwE&tz$C zo=8T@FoPL9-mwI9n#yz<0JdrG>BlSNdYAp=S!4?=ZS^uuD?aRpWRYgXX+xrGuxcyOWWq2_elcG7Xm30 zOWUe<^XA`93PKgWCHvIp1M7XG67#k7Tbs90QyX+;k)pcDnHiubmUGY~6j76y=@skF)h>R~?C#R>B zkWhTxj;K|#A5Y+{+T3`Gp!wRFDG5P)vOh0UBF6zo$>v zMG`^SiI(Ajoi1L@ei{{n(9F49ps_#HuVN2p2=}-<(3j|lWUlO;y)gj- z*x?$C-zeP&Suaib*LNXs;Xs3bD*^h`Tl0AX)hUSw#%;)wWJb1GxVKF(P?;fN!5ST# zx6!y4VcfGV3%g%g8+xG00wy%qbcnIRTjQ*rjm4=_+5CZ-!@$MXKzh^K?Ncp`#A_u9 zTI>30#88W$K_yqt!d7hyEqsCq{0RMKok6JE@$*bs2AD-N#XsM^4@{&JaY{(5diKg{ zCA&MX9R+~87IZWlexB$lcdAVw2KQIH&E#TmuojmW;OC1ec2dh@_t4Rf*An<5 zwmr3Jo;cLWT#+& z+*~39T#uGp0&&j}vb=B|)0mrlAi<88zZ`gZ*Xn_CI&{U?c zO&9R?SiXauivW?_W?`&o&Cf-Uh*F3o(5p|AZv%PEv$Qac#Dq3+>>c#D_-OZ)4yiAw zw`PbC*d5o3;0ptf2IP6^g?%zaLMqn57D4P=5^%-8VxehjvZ9l z>!%>4lU_I}TI{eIuC1ZbVRM_u8MOiYm*Lpt4cfWMVvGb_Lxc8~CR8MAa=X@Dg8Y;~ zRG6RHd)gYh80l?3z1IM=y-OLHxxM|#++X~=_^V$cTEZ`oDpI5B@9HVir{6IcH3Vu} zBRYhEKc(P7slG}1#Huw^_=nphUOLcd3UvFri}mjUY!@uX*C$FtOOfnl+)SdcaVt3-R7(K$JnNn`O29T6j^XTu)Zp!S{ z^_~C#7NE}08$ssG!}Cn^v60tw$6J!x79Q;|H><8)fRmI=FJXnv($~2J>HMbMoCl<(G=;6}!()fRxs?%fV0x3AwE{A0_?+3OMpk znKWWcWh-E-{xicm=4=sP^P$Xc&e!VGkOIDWZ{z-1nKw)ki*(fUqu+mJA$ zcelV|iBai`th;%slzm2-zGGm}%=|B5KjkCfoT!BaC>|gtDuDX@FQkEg)6sw0-fjLP zkBqzwYS?G)+l5RNO%oqUd64BFcRDc%Ss&&n zArueI0}mpgz(hw)W}{%kjRfR3VAk=)9g{uOvPUt&7bU*&nN3K%q-XYfNFFWa2`Lsn zVxf92#~-w);U&EIj_xpWfRcP78`Z+(C;=o&h7j^FjifP5>}JITC6H|lmWuIxxWI1vMJ+T}2-L0{EZo~R=3GlC zU$f9~Clk=c6@&ERo0i~FDBR6|t`WiZemO-Z+2VXpy7f2^K+XNx>sksBxEdtMQ?*Na zgoJz!XI?gZ(otQKRNSZ*yMXq30mS0dBrf&;eB%D=jW59F{T(HCkr6o1o&Rl1s zT~;d0!3zBaxI}v(h3sYS%opvJ&l4~!u;{4XZleJYJ0RkbBHewQ_*<~W@A|^%`^zIX zU?j&9F?zeos*Onf_dXYuC;CzYzQxM5HAHo1&dsduX4{i4t#@-)<(X5-|Ye791Mlpoljw7 z>w0s=r*nH#a<5-R{&!YCwkXz24efu6{6Q-j4NVz<&V8_4A5hfr8EZ)bD4XTQ|H|_vdI;iGYM2B0!MNH zT~viJY;E41p!5e&yu9ww6$FS zXy9{}-(J@6hCBe_`Bw{I*x%;IG1N%$}*R8peck&84yF`L=)-$}!H}_1@=$qqst9+DgxBd`` zAOgB6sD4`!uFnY_BqM>b?e@*>9MQgTHs70}^GUBQv;F`Vy&%TF*I+@eESQK*_f=TI ztwpE$xi<gKxzm`Iu=4yb z&c2Wq{H!Aeo?DvYu^#~6AJOuKG{891ui{l6?$|s){*PhA|x9UI${1r{||=W!%#Gk{OhG&u{UTBAPDe)TmiI@{Qv0>nZWs?iwITUW39n| zIXXwzCymj>(Y6OVjsPiYEs&`o`9QJNH|%?{nA>OQ0`)mNerV) zi4l~GvzXy7p@_N8KH9cr(y(i@rT6FJaO{S0yq=f(4Lf#*8%<6zy9$h=3@8zog)b&J?4B;_k^A|dO!q@ zM9p~X1EKoj)~fpT;Y`dwLRxYXNfUH0-=O)iU?Bza7pX8_AORxU zYRUH{A4$6bU28gcao6*$H_Hfg zkx{?nt~Ika%7q?|^-`kwq13T8{Fh}6iy zqPG%Cz`=0mc;-hunzpwO8=TqP@jE)kRPD@OmFP4=h)iceKmn<4DV#C@*)5}MqYX-c z?S59p+Bz46;Anh(=HdFy`l^mF27I6-C4XP&C!r_*d9kFZ4xx>7Yc2K#pY4i{kfAO> z7j%n#_@@91(Q?4$gJVCW{=#P7t-{f&t>sdm^eDg4lArg?91?4=pq-a4w~e(|J@23H z(!XlZ`HAx@x4$d___VK^pC9Au5{_u_&A6vkBmI*q%xH|bJ zy=qnp$9c0_+h$y2Hy-$toN7K!&nhM`9DnUVQ$5Tj^r6Mqz?Xm)FyC zrUIG@$9l^Sk$Tvj=g1F4{Z87inZ(+Y*U{iaE-x#y=K9%#=kM$Qtv#7I8zrb4 zVb8sUwD7R~$!{g12zk_(cZb3SoP*FM!Iy1%4`RmK9QR}67M6&>ST`7bNQQriZB4IZ zm_(^+S8T=!TrOosmHSFT!;4xQFbn*XL4geJD!Z+|h}z)v?@0{;Dy5m28FF2+?a(xG zb^DJu9uJOIhZvRu$__7HMj1@sQic$*0NtJ2lY^YlBI?8jAl4OUomi;`XQNqWx3+d{ zeaUPoo1&r@5pvzjMkZ2re>*I6$@d8t(KG6Q2NTZtDi%=vlV}{{@-;Qws>(cyned0^$NuYV*)iUd?S_eMNqbA7sd&VKHYj2gbP2+h zgX0D{cO_|w@ei6H4OJg;RIr@C=MsHN1`ZgU9Wof~Yp& z>!HK=RUKu@9#tcwT%(1}Sp0U|_+*y`kUz))=n3}XBer}d&OSYLMU;Bcxh7Hdx&+t} zu(1eTHtiw{k6`=xFg%ru49-croOY^dOw2Y9!R?jAk8yzLtO8FyXC)&heWI^;<Q9(VsZw3Xbe*UZju2=|L=(R7U)xRuEhzDahHNzvTb#1Cn#A|I) z=~;2kGYH6JN8-;E@K*pckHetj4(Cc>*7AxuCpLai8nOo_B1`AA9qX=aDVvGxPyPL# zQD&s)vyX7T3zb^7E3+rPxzp)^Nf0Mt-(Q_}Hzn86t-XfUiTd0QMe4c#K4)z`(;G?( z!qfLg|7$wR`VM;JItEAqj1m34)cMg8U;S2G5t)}+a+Z!KGMoFZ4l#x`Nc7KQbDH#9 zD(|GF^Gd(q1m-=?d>h@c7KK#TVs8M**0IbcdZd8vuSw9+_Ja_e0P0Hfc~4V@&i$EE z-JVE9oD^72B{9C``NQODiAcH#uvzNBluS;lv>o_wGj6N`9t=7=qS+`TR-g63|Aqao z7UN@N+6OlAdWT5B7MIlbY@rCaYZ(Cod=R5F$t2g_^&}^&=>4v1*HvG?qn_vQoYC39 z)$JoE@WbtBsKBKY$HbnQ*5i!s_LWz!l|50y(fbOEW`SFF#|H{O1Z0DfTU00i;RfB` zkps6g&%kzG_E#XH>F6sIJ5(Gy8Y%v16$EY-{Wj0n!-VfbltwzQ`hPQzw4P4$ww-fL zcdk~cq{lT4+Y6}X0XG|>p5?=J;Da@K*Ni%E3(ADJT#AWvtuH(>Bb8)-)dxBr)BAiF zHCg$$?+txOeHJ+|f_j)FPv@MEteti$KgHN+lr6mXcYbiy53}zA-oSfuoxkk<481Sh zUwXvtZsyQ>!R3PY@Ww%0Owx9Yw)jgL2fB05MKGm&>&1?zsOQ0yi4=~ZH1YS1!J17U zXuJmAPrLCieH#&E_g6iK19hb1&%uNwfln1FKXa14)o?-g^+HRm<2IoIB{pA_DOZw03s zR(vtK^QrA*_iC%CuLUQesmD$a@?B^xgN&H>S0YSU`A(45$hK2EVf$Xu#Hr z8H$0o&WTJ#Gt57$xvtudGP970$$Ng;1#5oc*@0Lffu5VXv0#>zB}I?+C%3t2a_r$z zAFo9hZD;b1uD$&)TJyy}93s|PMYd`0%oGGcT8<_zLjsAo z%fxalDDI=lTtb!mTEVh+htX9Fi+)v~x!TjZ!~~kNA-~a^{s6^Eke4+OxWAB)&w1X? z!dMV=v5m>f%jar?mFhWm1NO%*cNO2*w`)t4K>nE*=KTN!#+1GPvT_%{t(?b=l^e>I zF`zio0>|R67rNR9!*BE5t>db9@;$5DR$lV=@C^ZI3%m9{@%(eQf|xu)6}WSZq^ZOWwS@hj_>2QVuejW0e;hsY|lNSJE(HDfk{_Tg;gR(P4Xh%4F{_cn?TFI|}46#@N z;wuUaB;iAKF2L-aF#DV4qdx20d&cBOYznHaZoo+FZ{F{U`Q}Yg$0$9YSQcZ83`Xm2 zz|%uM(;$*Z|4@Q(6ci0x_NloMHFAlIPQFDl2NNku-eRn{99pdMe}Eo8oiwPFBn|oxtt_gze)e(UPfl7Z-uFxZ{1t&#Y`xZf4B(`80t~_;CTEF zZmjYRDn>oHwWj$8_PIaCx=_^r_yC2RM!_5UkfWO@kxM`&=pC0@jRC0IN2>kwu)7>} zs$|Pk$!(p~sD7q(xr|j+Zz=W0YJJ8*c?;yJ!-FNPAZcvw`YxTS6CvAdpw+%;5-iWC zEW*4#lalwDy;+wq-(?hjmmstHsNOb%+d2O-c_OjPI_<<`2oBUR=b)T`cat5eL!?uB zWfRHPAY1|yG?Kf4oAZhQ)z3o>6!#@Dn&j7{`qS2wL6E4v<2VV&tQHiq@785?wp*LZ zt`7Qmx(}I&{xtg-(^>8895Osdrw$K*>^aErQILyM?4-d^h3z+v=0X(X-kde(?cDPU zCKDCR1*t93j8{Zm@>qBInTt~*tgnJcrdq7bh$e;}46w3A(QV%b zoaUk-_s-3__TMHQE^m9H52;w;78W5JfQ$g`*rYDrL5O+lp5PdMa)f`j#F}6WIHLn%*yFI&(k;2KIk|*Alq~E=Ar%kw)r*T*bg@ zk1F-vnV%$gGR?0bm{x`Ai)Ad6dk$*mGHQ{EgwC%EGN@*{Z@@ue(?9`fQN53-D2Dqs{^&w)QK!8w{HEdR~^7XmAit61@=v-Wmc9 zaatAn?S(V*`uFRb%&J1i#$E2j(hNK(kIebHS6x|tXfeooY<`=UC(C=4>hOXsU5mlT z>-3X_Gyk~eJfOyeF3IV4nud<&T;h@MB``xuHfKF^s-SUwW$>d6=Sj;OLmql?7E@6j z6ev;~{qFBH%egQc#?VwoVj<12dzDiqs$IdhvGBb0VbjYBZ$Q@ygC(N`wJze@%-Lkbl2|?!YY*D0~6&|*=etbDyblH`j z+%A3Q_w)F3#`o!EF#)(ah~Wnza@?^HMSP^xOCwMu5;elX@1X8B4RcN`%3NbO@3Hql z?*?j+1y#0PRsJUZ*#j1pA>XQK%~z5G1&4FFP}8(|=`}nsSJTLy)d)Y-R2jdLGW$Wl zTOtqhwpg|KJ|w6V=`FA8cI~oJp&9beT$B)U*wL#%Nh*lkbF`nK2ZYGBx)(hoP_3bb zr4~(P6IYVAMOBvyzVg5WdqTpG6 zRa=kl_c9zZ29?%xWd>^RY(V+xZ3jpnbD@d_UeE4KP3%=42>D$Q36tnEXixBL0=Du3 zk6WSX1s<~;FOR*nY7LQIlDx|o24>yrcgd~wUto;8Ni93r={>3@svOB zMcybnp1ITj*3;#>=Xy-7R3ELh8KT@mcl+b^+Uf8WtvB6XJy*gusY?x1`TfPu!BwBK zmb~MYRlpw8SXGp^G8LGg847y@YDuI^8N7*`? zw)xMp+QOr|$3%af)D#7lfPm+J87riy6jnRqTmO}RUfyW|bV}_Cfx3X{9Kb8=?*5H_CnRI-e|(qoo#fVhCD9aQdG!Jnil$L!AltQ zoSXS31%E|7*~H+zNxIkglbf(AROq>t?b6Yl9k=8^X+A%{e%uI@WE}kmaWR61FBZWW zjtdj7r?5P6xZqC%-0)15la&oj1J6~}hvtl!$o{WxnE!h=Ev@(K<=-Xb2QGu~l^x(W zAPXGFTTw~Y{4vDn@!Q$|H&b%M4ZDW{9!OM=TR1xS1w5IF@E;-#j!k|OY3jeB2E1MD zV|(SXV3eC=j-vklmC*A?6ns2RL}bfyOMeORi!f^BHpRHr^oCytAgn~u zkO2IY!4;aGRkpxN?;kEPAJmt2IT$OWmNe+UGw0YHvWisPq0E zHiXIRx;&}{Hhf4VGunkOOJ#!3cihw6>VEC@uGVMO4E3H`h)8+G6tntM1SDa|;xh}* zH~PJSCm#Z+E++k5!-TDc@47KZ&8M@NUNY3w0_nx5@Bb27`$Z}ovk>(5-bD2xilM

6ni_9kqvD2_NEeGJEv%vG{K4qPD3uP-b8V6oqYhUtx5;?S17 zUG-}QzB%>286nII1q+B27t{d}zw-JvL02Ey!wwE~$3_6~89=o{5k03!zrMjMiToCg zW=2ET<(e9O_Nuj-%1V*Vv+Z41vl(&g@nLwcprn>YKx}IGwuj~Wkc&x7JwE%EZAA`e zq-{Q($*T;rQ<5@r0ai&L+4jO??I=C#i!Y0yrfkSh`7JMoK96Hf!TMxhw(v-cLoSJW zowe#n;zkwYtlRs#CUFxyA~PM{yIHR}6fQ7yu%*Q{Ek?_NnX zMJMhGG&;fVl8hcXrRb$OBYtG-a@m2#joG=$gxB7%xG~>BrVC+~%@QR*<{oEQTk5m1 z%*zpN4e~{D_Y3>U@QRkxs#QH*HI+v-mPZo(YTwWMDr~M!D)f9>bG9#yih4w(6xSm` zI7T25&HVWuz|IdvD27}89i;|Lt=sapU83L9RkTbUP{QVZbp&08#=hm1Pj5UC%)44K zUQYT1+Y9{Rr${?qR^bCX&sn?^9FZ|_A=nzCui$Hm-zZ6;RXH0 zn*8bwA_^7?mCzk2L_hmT-%g4rSc<-#M51bsr70AIZr^>9V*M(@#u|b1WQnV znX{QQCm(N9>rVJi{HD6DWr_C2`$6?phl{BeCs4E2(B{ypJW?KTURI)`Gaw7|3hC`! zUu%L%-Q~H<+?tZoeNaNeM=hrk#!~o<&?KE#-yys~PUk~V*MJ2*N1u#?b*WI@r3Say z)a%<-aRl$hC=kKBZ-4aoMMvysq+oX`nq{qz`3zZ5dx| z-FiAhlSQN=;83!^ed@D=i`V@6a-hQduwo%aX}MR345d%swvgsIC&iV2RO`6U5y^-` zU!Yjh*}x?=VjEQaxU=|xu~|ve8#QdBTol!^cU0I!PPfD3v9h9UuI^xxEeWUX#<4cJ zf?h5S;OsP}xXOGEr6g9jJ4C*zC-CpdDVB88q78nGtvpy`{8ryiH8Pw)C09Ov+`wT~ zKH=z#Hq4#iz)2npDga$Vkj5V}q6fW2&po(G&=xH~F}ezgwKiJkgi+uJIXjoR>7^Pe z-xY2UUC2cz!>6FX4WuCZ5XDGIefZPV>y}bE+J$~;vt2y2+Vkt~ z+ggEaS;DwXISBp3SspDlUV{UY%um({yzlzrmA(v753`ki+f2|t$ELa#**hF0N@HN3 zb$j}Flcl1h%N9%~JL{Pl#gyBJqqJS<(T^lSyo@s4PX>K&@XwE=O-ggzC%Rm);{o4) z@Qq+L-0r!1EEU#!tyb+3Uu5Bl<h7mY!@D9F$9 zu~bK{I;m--ot;)JJzTF0TYea|9hD|#^=g0QcF=@=I&l#{4^Yac`=!srYx}5AtENkZ zrhZD=BHGYkvYi08NSv;A#E7|`_p^WeO&Ql(?pBB&m8KP&s7nH!Rlej5~3un zZfCQojoHug+P$~L9Z}%7Dd6<%$Z~lBjLT@Ehvj2qrfre_n~xt z)T6I8m4{w)d^Mg(YWUT0;dQCeu?R|l?VBvciddgy@BNL8czHGJUmdM#!=sdWnYbb} zxSUg-Ss|0Q@eUXdbnCq@MZyAsa+-AK9++Cv&brHIdMxO89X6ZAQ-3qtrtuGjs-`)U z(+g@Jue|EJW#6(gIaeC*C;@2;? z_iW?gQ)pE{r!MGa4%+horTy_U+EAMrr*ufHIsK=cL{HqK=9YT_+@nIt$|o0+tuvn~ z6F-8-o|W9Q5q!~LM+$-9B?{GIUUo`%*aJ+%D6 z^;$pBk)WAUTP_;O=mL2P6743XX?*+7fN9qkrsW^XbUOOR__2TAU(BiGn zM_^Q6?66R#5d|sX|G~nKC~U`yD9rVx4+Z{P7Sj()=e}RRCiKc$B3 zhF?q0)JATLua1~seB%~yYbg7?KyyX8qMgXEzm{t+WSIgRWxFrne?9Ok0IxzShfmDc zqW@};;jmkjStUpQsyvcr#DITn#o-how@Fm(ivi>VcrYZ8xkx(p@1dD#CZ090* z$7$>t5!^cYuGc$JkSy~v(sFp6{h}ay@)^-8Pg;DssgcXjQ`40ByMfQJEtnIjdIZ~@fL1&O2PSZ z-1{i+z_W@({s z?p0*3-|IhdXn*1CA~|h?2|6=JLJ4?N~Foi205=k_DLs=Q-Zw zkFS2wznAyV7`?>bwIaJ+bo6x>*oz+6&xkuDG0}(9rB>S4>`yn!jAIH)XT6@!*Ia~x>16Sp zfXC;+;F_$57?q788@3)mAR<7a{9jOP707miS%w^+Mi2NMO?d96oW|EzDvb+O%`I~s zE}aJz^7bW`Pv&WLxM*aF;;)r=1gv{RCUDKT!=#7&m)?EK?bU#dQ!}%3PP;X*Lz1SZ zhp3nAUgN8h@jLVy8HSXSyX!VD+ZkBM0h@~){vLyjw9^H~q&A-DkCAv9P-NmFIO@%kiqcomqkh2a^(XC~7pizDTbv02a9 z7Dq}!rV(&(rGCC}xhWo5X<^zjGv+6A&@Zu7t#O{a0&!AaigV4tlIJbD8zSMP5oHO@RdecIAZj{y(x{g?_wUg}YjjW3RG-HX~p* z^uki)ShEamg50~($%i(9d2~iE!AD^v;U`7l+#X(O&SCCBgH1u0M|lV(P3FfK+Kv77G{|{hCnX9Q@*-ZiQL@ydE*yTrtEAmrycFOyV1U;f_8&gjYhokd?rHp6#H~iiNIZR>7X9>OWuC=LV`P@~pCIpjX(yMqXL%`&`x`Pt%isk9O z0KWC{sM8e`Z*ed2dOdOhf#exerap+rnXu>L+Cw7-at44U(suZ8Ys=$%**$FQ&RaTf zwSU(dl-XD~Hgt)hif>ewQMFY($G2wOI(2P)yX`{q# zGQeY!mAabCqp1pu%~))ma?QdR@H}0Y+_m7~B3rfL{Z76(Om1wls2y0qG2`dp7};jE zMvy%xL=@N;9dh5K`73;tY_AP}rSf_+jIaZnn|$leBf|T4a=v;vAi_7j`eZymP_LHP zFv`~Gx`T#BpjRbNz1GEBj*r-$mje;xo&*AfRH`04y`_l~hiXe^4Bf4x z(8!`FD*b_V<^J5SV&krD@hCU572%glKvjUZEww>d$o!pJ=0O!*4YI?QlQpI*D@bJ2Rw$jSJA zcsxJCty_c`VA2sOcOLb*PJg@HVg>6~n0M&cya^C#z|)qtCw$)6j6;Au#Q{5r`P$@* z;FBHU-twTdU23!Pn8aw5Tu1pnR@l^2$%AaPvjuysCxsct?;tn~uPDv`Vrw>ol z3ni67R3J_{UIa83`FjWDI5#wVJQ4F}uat)D^5+k(bn;P>>L--WV?;}(SN?d#@w20g ztOh(L!VSctQ!ke~3T9|R$ON_J-*PaM?y4O|9Qm*wRoraJ03m=Mp8CSgQL0eqkZ#{z zrbkegV(S8d;rXzk^>@0KA1}fkYAa};cWoZ;-(L)J_lV|ibObi6pD_qE;H>@Vsjr}H z#n-&QPr_IQ?0ybB8{2>g>>r&E=$qSx4R&(@e0<>U)tvDuJ+~Hlyh;X+lco)QLCyP+ zprf;jlBK(XM*LWQKR_74ktt~6qW{BZuAl_)jd8y@okalP$-hdSH+7fas_7W|=v2mc7m@6P29J5D`hrw1rt zcE>xjf6Xu2jN5F!W8=YJ2w+Q!Qq*^YX>j!?LFoP+f&O>d;T*oI|!Mv83 z)}oNnDI?GJVv@8(x#fh-Q$@F>vsZMGaqS)#qF=S$N4a5z?^N$LwdlX@3!j_PN9dhl zhX;*4U&|2;+*kO>9(^`8heI(IbBd)O<)?djlm1zXvmw%&FRgY`Snm}#9d@2uZSTgb z)+lm6=S$cy8mc;HLb!BJnMvxf*WPi%PUofj+a}^~6uW*lu>Ga47;>MSVEANCOwIXA zc8oU=fM$y=dh zu>AwFnV}OBdSE-D35Cc%G~E_xhBMs@F97fuwdGwAeGV!s3l1JD=m>fjzT9fu z{aO&)UEZaf-1@k6zR;w)^rtE^&Z?esLHUPjach3p(#o^g0{Q`22W3UEq2o#NK@!cE z#wxz0KK5{=!7H!mXS(+nXpn|)FeY#^6{e$%rzP!100X-g#;DyW;RMI}hc5t7-^2vE zS2Odyqn`?Hriz;^Hlc(4ow8b+$~2`GUa}S}5UcqVdYjxYKPgukxoxi4(PZk+gOTY* zcQ$KC%PhU|uy9TqIh2(vh(0n)9y4Cv`N>1zL2Qn(?%6A6nerUMk&vg9SXL7z+|}lU zH%F_3ewaGwxvRPGhNDY4`?Gk8TFWOViq|_9;bXI|n~T_Bvqxo2*zdZvHR+7YI>ce| z@up0CHCrjZpyp1)=%-b9MBkWwJx_fkBeop=saAcNoW%Unuq!mWd0W8!kID)yIjwSum!ZsH3%@^?ih~axqf%PW*5!MNg0FD>c!ybs9>;C18 zxHg`o`2FN1=#@69?|!r|y)2epCJG7NI0{6KTOHIR8toHucB5#G)6DV-KmwfY1| zZhDQA&-%OMyQ#XU@x>Oe9H~m0oF`c?#B$H*ILCchkF8M@q@w z;nPSclJR;MMgpxyK(F?Gqq4;HqF(irg(~z#SAfi+^Tb9NVsE8qo88MdRP}d*zAL(2 zOtF9b0S#XVCRDhWF*R`M9iOHJdceJe4&ZuNkd^PY<)7EbA32lKEuJE%7NdX4KWV~U zGcrXF;LEH>#PqJ&dv@nT;2`fHU>SV5lj*Pu8MS0sqx7^P{7;*1LjYewE<&+o!*^)` zV)@VL2YYF?e63s3X`b&v9C7PDy5F9}am$clSDCgTbgR)!5H`}%=HMw|mXkN@zNeyE z@6;z%TBJTR^R^`5~5ee8%0H*BXAjwCRVmMgnm&{*YB83i%2TIhI<#XKr1((3B z@1=wU#QV@}Y?ACpY9M{>l>6TN>MWGZPa*5sog8_{9Co+H-$##aC`f>)D6hAMr-jze zY9k)#7hhhb%~ohM9->!JC@zvduWi`py!-89wDvo450PcBy~#3qpEtBD4dSIRW-rg) zs01^;Y(71jq{kFZxO@4MAG#OLjT$c6`*w1-|8?uOr*Zs@_r)^ia9=@c4ff2?Hzwpr z{bH+ndCGV1HVFl0lzyb0%SGAjxQcRUpJv83k8{%{eLxiEJmvwPwL<;N9|5X(;UUQ< z?@I#@1(}x1y^miePcooeo3qnRFmDaxrz7dDQ?idNt%c5z$$hF|#o%}lUIESJ+k=#t zs@J>ftrvMovkYj7`d0^8N$;5YAr*YlA(m;*Bn9RY5VH=(d~41@UQzMq2DVp*rJCtR z>nUibGtf>S_pQMx8p0V@gAKK=6uf(Y;*7o-q|m=;F|eCRTSaKj5XHtmO~C;9 zcO|kQ0NvuPmr-pm&l#nmYJmg|4pZwxg}9?}CWhp_X>I%0tJN+DY)JI*%R#LaACG!j)z<>e=zN=r+h$ylk!K&;f*An5;&ucmt%$(C zAhhI8&Z3WV?wSsIAU)=8fBIVwF~j^1r!$8Yg+HYeZQ>Q_o;+SWgm}XM?R|!*xj-@i z>7y@M=9;|@Wy>kewAbAaZ20QNec>0)WwqmaG&e2(^yS;0>1uhk39$D67AqEtk4o#J z5bNC{uyB~C6R z2%E?;GQ6^OPtLYr_s%@s=I%x5;O%xVcZ4X7?`?l*&fSs6DS<*FNW#?KLH%oYgcmlo zXWjSDT|iiSu2%cz-|d3Exv4FVzJ1bOl;v}IDet{Mxx(ec$z^~FnX~;jlM2jK&ZunX zF0v(?2{HTQf03$v)_z#`k#8vCe{-a81{YY5e~8roFH#mT%)cLZ*c3{RO=R`dVTrJL;<|`Uu^>MgAuM$)6>8MyxWB@4rQu(iu8hU@65B1!~45MaT8xe{5NNc zaYG;9x@GoyQ)q3SG(A35z|$HF6X(?(_Nsrnxat3SxHhsd4i7yYA6upwD$DIZY$g^8 z@WZ!mrGJ}7n5T&H4M`T2#;B7wf6AW5UIcH#bMW{P)}IC%k=w=?!5JGzwSQtZ1<&2$ z*8@`n_Xqg~tq0Qwdk)rjaPB;UH|bkNNP&fxIrC-6OuXZ1VPU>WzS&O%%G~-qqI|cl zomHfSfBI(e!x9prxFKxq9v}*{5dNJNK)e3nFTA6 zH5V;}9ci?n!vEhL;WvAsSw61yYky67Ua7rV^P^@Hx;gO*N8p=k;B{w7!F?B1;FW&0nlNMm!5%#sm%zxkl~ zl`jXnnw}3uRkeU+sO(w|Qe-l_iRt6!13A!cGcr&cB)|T6Q_;SnI-G<`ohCWGXbA`{ z@>8?rPcyKPE|7|9q3j9M6dE%FP8yIYXN)hXEJYYg_;(SfUN~-`rDk_76~KLz&@QVi z#nBN)8+joY&o^)ee?i%r8c|sJAcIUqW?qbY5=mn>j)bYi)??4GExtY;p_^`U;hDpF zLRTiP@L7xK6trP~w1dFXR_tl3bb?Bi>+#E(Ikj$U#Xuw#&!bCkZ4>r8vuv^6s3FRhZYGUVS~khynD!5gWAuYX&WtsB=wz*E97= z)da`&rMnDtkev}iBC^^&`$cUzm&^k>x>Ve49Zxzcfg+x_PMqVFyI-kz8hbs$&!1`o zPue7-Ij+6QGgD^ihDX+_FboWMI^V41Gnoq9LeV{ti1|zkR0rc=?_LIeLVPM2-h*Wh zTF0}xxg4XyH`xD6+j2B@E$h^$FPsnFG_?&9YpuN3Xysym9EbLrsLY(c*;!+k=ztX2 zktv*3pj@XlYVb|pu%zaXho?wg)US!g9Yrs~gpVKM!f{s=RsI<6|)6W05pID?uJR~Hc3Xxz)>Eu#=Pp>fAx0Y??{u_3KswG^x$ zFrgqySDe)m3e#vrV;+1_qN6fUP0{FEi_K0wQGcc)?fKG)c+-0D=zH>yUY9Iq4f4%p zZJUp)Njk7t9z~U|10ZQyPUR*7j&Jyk;r2BkjH+aZ5TN_-f^E3-8NN?3VIj$1_d3t! zjr?6d-}28L&*v`qoy)-V>wiZR%|7cTes8JzU`V;IE<9l_hah7cw^viVqEN5quC~RqkS=uBD@H;Bx#>5`UJy!9F^kFU%cB zJj5_mcFi?(#GG_(lOEz-w%n^1R)^<^tRc8AZ8Af6>(-PXFe?3;it!|_x&I_&z$Csl zd72I42=aLk45vs{Xzvn?pA!kIzLeDYpr!eTg0GgG_Go$&OK8%)Xtwb+5`-Z*eKzj0 z$uC(WCP)~|j`uR3Ix|1lP#c3XC9E>`LF&!{1E5}OOT*9`>2<7-Zb?|0>f2v;Z-mRO zyRIkQX)>yePUJD0Gl>8fwZX^x0dKix$yu2~(2guOL#2zR9_ggkmR0UEHf-evy-z+P zEUNSE65dH{4>b8yT{r8pa6p0CdRr^Wc5UtRr^!gw+7?}(!_fPy2Zp7EdH!N*2ELjt4l=&tdCdP$&BxQPyJUz-?e#e!GnL_|!-be^aq% zGKZ7XeYlUYQgM2>x{fc+k7)@iR0@epPccJvKiclLrQ1{)R(+L@!R=o7k_iPn*n)#^ zf?8Isi}OWQEblwa?5E5+lP7cEI`_Yf1|MaHDttWb`0FT^vkm0=sNC3qCpmmlU)2ht%tdVA<(bt_w)?$8^F zMu13C(eI9b`BJuZNhtwA*yw&d^4j(i5o&x4l6Dm$X25D0#QnTiIyq_5;QRu&yXfq! zK)ZI^T=h@{w*K+p-m?S(<>;ZDEq&FMF-?bD4&MCxBHBYqwz+J&Z*OZYF6Akag{WhE zU@fX4-h?RqRM$A-vm$F0ZJh^EpWU3wvhUB`WW^Mc#Ow|I!=0@1?lL#*v-DC^g~P1- zS)}_T3aX4z-;smDiJ51K9C=iv;+B_rmB*9m?#TeMU4ZFXaF^I}FMCijd$*0!{<2c3 z58zO5lAtfMh)D4s{P0IiM(SnmWy^9WMG07W);R?Gm10$m#ixDzv|MNL#-ghzPalM+ z<=S(|hO3-=;Y%CRf8z7_MET^gh+3Ev3u7ZDfjY=l6sA(u^8)%IzdEIfB1-LZyk}4Z zS~lk~1j-mr#?bKCxo_N2!BMPiq-zsX`0?O*P67{JnU9v#(1P|%rqTg=q?$k$t@X6J z@FLNxw>E58gU>+*NjeZPv({exp%HF)_)D~oAO5Za#tSQ#tn3id;J)$+SE11|G{d-% zaKM*f_BS}=W^ZjSh68xd=i@v2JRxrZc_E=@ zMWyO>Qku%47|m@Z{(={&DAGX-nU74q*-k$iZX&LHyCOE{P@4Lp*M}{&c=^rNor}}Q zGi0>odUd6r?Soldkl#v=$3`YJzlPn~6!hsP-6hmGHe)O)Q||nDF2<_cbVVvAFxLp4ZK2Yqb6wt-JF5qz4t;ppD3GAV}8)n7>^~_N~cA)UX3{ft~N3gukhXKU6T}j z9=*J&82Mn++En&hOXoW4Z8ExuqfBv=i(a?#GQ|={nnI;Yj-u4JjZ>m=!pf8@AsPY< zJcc+UW=vI6BkA~!(Svg{xJhS`(pPxw6+zZ{KG?=7T#GPcYa+{QXA(u*mdl8lQo6gn zi*((8#2PBbhUwRggMzH3et2YA6kq*sqS;T#oDJ^^DYS^yYM~LJ z7(#KK^$|#U+jP6|LF-ucAJEg&&RdVGv$bEGUWmRujSorm=tC_}6Eo7uJ@3$N>6S6Ay>%|Y+&`0pls33;Q8SP$KPE-B`!HdN6`v*R3p3XP~?{emn>iJ+x=i-VYRVctGM>fL-GK~m8rNH6$T(4k` zm6Dz3QYW*Io;a?RRK@<4mwG6U7|`?3I^H6<#@TO%9bdi&1SE7NZmjzKjnL)`r;E%- zEhovkpMU8n8BgPjX6QEfm8#tP-81f*u0k-I6p-lnwPTK*`<)2;{}EWrcj%A3ac<{C zcW*8G`Vmk$HLQ?R+>}Bmug?BMdgP;Zf+}nclzE;0VL%t3Iqz!+?8m!(9#rgpOc|A_wr>|8yZe`nic>_oPdU+4oBT4T zdsXZ*xeWRPU~b6oT9~a>q==(Wd?_c35<*Tj2dO)`v$;JcY0~tN&W`!}+vpXv3qi3U znE14sksL9AU?6%h7)d@G;K&$v9S1@x{NE)yYetNxnMtZOZt|JkTts*#eBOcz%080* z6-0tqN;|21&j!2(lg{D&`hu{jj_^7*uoRqQHTCQCbI!e?;FwSX z+CAa1(k)*=yLIsfq@AX_o*e3TO?uefy5+zrCHg`In{Lm;pT`BotLR(2dad`>xJ&ge z;McCOcqVq5(%1!)#{32TL}}`*suYeo9n;j?F0;p3WW2AXzs|?uH{Gs(eVOrgGU|Zs z=>Fen9VH2wua5OxU6qkzWY%?VCcuZReVV>xvPSf;*5acg?60g$*~y6*TNF;uxmxu< zItzA}J88UR zih^)%i*d}B`)DD2ch>9V-U!PDSeTos-;DZ7#v~{TeWqsj$V?x$vvPe3ioZ%$u9i*1 z-WVaY37(y$T}v=#(Z#?1srEm)DO}Y=^;!Yw-o3EE?nCF!#4PV~5rYA$5yFdy|LS45 zUZk_tRQwPlXAT!ncg#L(Fx5wLsw2yb8o?M&QgI4rSIP$ROZ-$Y$ag_W;M(PRx%``Q zG8l$aPKh=yGhVCf1gs_WXM`7+|7zLs@$Tn(yve_`Q>RqwBL&UTcUOR&3yojnek7~r ze*Tl8UgH$_emqdj=oaE#fQeub3X+jcoYs$TWPtTia^+F~FTehu718ryKSvOQp1QgQ zuUJpXd}Ornwgm$`&Gg}LQmeE+{KgEcuWr)wWCNXG2K16fku_cZ_*xQEpLRm~P&Oq- z6rv89s34Yt`N4C_pp=ddkYfiiicoyE^cBiHUJN|tt4q*`9c({b_2G$voRH+zag79= zoWa!hta@JLYYCX*b3o$hc|tQv-;tw;P_oUqU+sr8w-ng|LNhY{@nf;Bpc>@GJMF5J z>w;J)FNhb?wg_4o9~9dIvlC%wAtpnQ4eIKEbSH;?amZbWRUR5*V{^;m7tvJ= z9%gj<8D)M?ysf@Z5{yu%O~tQ&pE+S2)bJBIu8ECnpA|xBN&T=oQG8$lZ|dB*^H#W^ z*KaC(Vvl!yl8y(_2R@s-vP%-vp(h8G3&fB=d~P^6Ra`fG)B|3-+gY55c=3T!gjc9-NITs`c2wG$d7jZkPXG&fQ-6ly5sX((-IzmbmO^vdq>P4k0Nq=cxe z0+hhq*f9dG*2Vd9eh6OhNZop7bC@QW$I$igNE>9vvJ`~oH+CzbT@Fbem-Oh9_F2&x zF)Unkk!`myQJeiRM1vQNK1-evPT9am`aVzyg(*nrS0DPmTx433QMQM_G`lr%)5}I(zZqmaavShk+4&vUm?q!?cvAgoz_0|I)lzVwKD(%rfzm`oH8haT9_@d9t zzsnpixi9X{(RORB;j#CH7rmKTnUg#iE!S^yBue^Z#|nAZ_a)|e46cOm*q8OO|9T8j znA+a>$tIVzW$pDdpD)5K;TRI)3pziEQFZ-h>YlKNSh)N4e2i?N{skB7!>o;zAh_b%Q3_G`%Y43)4mAJ>1nKK=EU~${4 zRpdz4&`~ErD&r_AvHha;&I`%xjGtVD$w*tIBV&*)q_J~9$HBg%ZfpjbsZ7XoziiK0 zxe@2ja)kM#lz|rpG5;#kgrhcolz@fR!`YT}C!J>1;IsMTwmfDA*Jgfpf{POgjP>F5 z$6-9dQFwp@0s`t1A|!p-w~LEb9lG1i&4xoN5k*?`f|H%Srn;uE!0Z4iosx1sDsXi*e;wF>NZTae3Hqv_*;Y)x+N4q0rOQZ@V>( zeu*(=)M+Zn_Koz|I(t2`{Q_PA9>yC0FQEivs?^%M;=NASOsd}{rRVvZA{6XI$O!W? zjad}O^Dw>r%B7j^UFh;MrjNTDbiNzLbt$3!O@2VPdsH8`Z?Z(|B$&P; z+^QWzId#zlJ|Eb9fIlA3%4s`6VtXB#5*VIHbEuKzl1oAq8o|ZGEnyZH29`s`LZOL~ ziFTfmyF=n}pZk8SiAv{eQ=ndnHEaZnT>^lPIeSpfimb(!qYp#`7ApG#4JhV4n^9c+ z&EDqU5KhZO(^LSau3rjiIL|6cav!o?R2K-PDAcQ7^>FXocfFADYgpDT0h+oUN^+o0 zpTwm7(juB|eyVe=uy7@JVPOv*R9~<8sFin6qPi>!6{jFAPcm@};EW_-*Ge5T$3Oj} zF}LsJ%*~Usdzm^~8(KmNer1O`bl0!{?kE_Pui zv{xtkjLR^G6cd7r^XV+;XgR|bIGG87L!94h3YS9Q^ zLc2@w>W30kFj0%`(e>3ul+UJ`rb2?#?}>M{TGiSO;OyhmKIF0~O#bL8R#Ruzc{(_- z7!y$SD=)>tk+bAE8_th?cEX*A7&x}`t%ui0QedUZf)6nz^@Y&&w!RuSkuL+Ewah6X z(LZ1->{NR0wF;T0yH{F?0Srv-<6tFAEpd<4+U}+IKNis)L3{hRxv!(XuUjjv%Z2$f@t&Ra;WP_BqZeD4?Qy8VMPhpOb93I*`qfqr-?aw)(=!qaYRmI1z+;rRq^EQ3LjnLn^D)93-t0+bU;z?w{lk}N8Q5un@z4yJ`9znPn`huT7OU!@m13&_(KO}4vD12hlYj*@TTSI3*{-d zvJc2$U%c9U^UH?=@sFZuJUPS)5kj#=1C|I2r5d}lhf|NQs`OkWt@!q= z%(s}BrE+cNNHM>?&tF8&wQCMIPaKS&y!mOX@7sf;+OKOQUoUmlBJ(lIi- zec(j~8x9)x)k*d%c~Ei>{EaPm0qfH7^zxY`qBgj72Lx*Dny9>xc;rI@Iq9SfTxQD`Ye{-l$cuLFZ_#? z=T6nqC3*%DGwBQF|ZY_-~x@0PY*5 zp=Yb2#r`jta}Wk@T&;1)jX@{*op3onqsEg>aXEnF4BQ)>k%rXQCz<>ZKPfrAYw-mn z8=?1;7XljP{FE77CEzdvt`frS*X@Ix%5`l0UcxunO3q(B>tzv0{w?6f(cVAW$e_7F zJGt%qtgoJU-rwPb4|h!XCN;!fH17>Xy$c2mK*!bPU47V-%~>}j2jo9c(6XNE`INlZ zV?lA&SGFoTmhPrH!b-*}vb8PaO5{!^=l))(Qp4P&x!p~EF?Ku8;4KsUY55}%g!lek zY@*Frwj_|ca`+7|l@1;JYa%kS*nt?q2XVm5W>3eT4dXjWPCIYLS^R^?Q2(E4tUoy3 z?0@CA{$5z06nbtL3z59jeCLSp8f{;n(c@3pR}4Z!U>tyzzIE&Qy&KU#g8$pM>i>D+ z=sA{n`Ewi80B)13EC3impbHc2HUguJB|~oe5TSe2m|1g93^RjYy45c@a6ssX6_MZJ z*Ka2N;QD<9|0U7?zP6VY6fv!KDRJRMF36t&leu|z4PtH}+r4P>$!G2nmLJxXN)*Dp zAk@)VXGinmt-jNN|7}Xo^Hz8b=q+EUf8y6_mcr%NM_qRSM8ki# z{3nF}`Ar18infmSk9w>w+(;JhPgw2n|D#)ODlBNZ@Qt}pyg0|t0fehU=PzJjDY-fL?@v(chc4{w%& z(7IV(vU~A%d(&@~8d(%NyO5k6XnEElAGrjB8wHRrrq&|!czJ*EADyO<_u0)hk3xO) z&wesKk4!01{JqK>uPO5NU1p=d=IEUrQNSDcOkd4c_>WXj1E9}hk)zO-VE5q{Z(WoL zY5j3NT_1&#+n_gl^wyD8H3-q++vx9N;{tGS0~5eQ&#}S$QU7Sce_c@2M-nEtqBy#} z2F{7ybU+RCjuO~+KakaZ8hM1_W^|OELxwFP@#Zp{D90^loT$wd9o*T22KGIoU;kQ= z$3-Ce!`?iUI{Z}1R9XQqa1mZ-`RWNuKoF;~%B{g{#eUg&0kA4UKA?tN{Ed*gIj;E2 zxi1J)4|)l*M8W+mfYo8aK@=9bx4p9c1G7E&l`)B*p|98sZ!b&$yn6AfmtEJ_R z&9pNe)wPiIoo1yJ%i_$M1Kt0_+FM6ey|w?MY*9gx5Co)4x|D7Zk?w9px}_ULK}1Tr zK{^*mHwY-*DJ|XIuwdP}!2NFDeSYVjGw!(mIMg-2GoSd(r{i}r{d=yFn0$3t>3Qc~O->CGeiQOi=0yeCoQ#`A zV}%Ox(g*tuwT=XSDepAwbFT#R^Kzu4^6dIJX%}Ks3$U zhXN78n5)=d+Nj7d@bUTxB=fUnv%lN%FtYBWhL#UC@3$D+E6Zu+!ejJ0r&Bfsg`%oQ zI}>S#a-h&Rsp8MIeaT64??W~?pk0|#Fps_YnH;V>X*~X`reh+Q(^99}%O4I70+y8H zQR@)nzQxIT%+8!ferGRtm)nj^@r<#*sPE^$7gn}%NvR{L4p7`np{H+TqSIyPRv&NB zGWk8zyMXS#gAj}zL5eutCO?-MdAeBk7|gDQoGNV#mNLHz#e|q7PJ~QBRqZs%y_Ne| ze04d{q8Mf|C>NJmw2I$!*t0X%=G@%`R+HTQ9w?*o42uO?z2ZAX;xMJ-S);z@a0wsf z11kyIJJTe+TEr&&;h!z@QFoNGds3^uBR<|E>v#_$_);0NfM z&xVHE#ecUiN-c-QdeM|_h(3yzT=XZhPiIM<&?Ocf^k|~|V{anuNBp&j^tO*B%Z(OA z9ak^?VfhuKs(pA19!!iHSFbM6#tUd|h@vJrEz`y(Hnn>=(&&wzm!cApyTzJpwm(z8 z>Ke)KJmxX^{=X6gA@sqVm>2{4$7Sg_(WT9fCgrPFuqI>zfXkQf7@f(*(C2<;ajV-` zzlHAG$Za2uPaTXewUnW-kOS=+WYOaHww-^1&BUNBohv1u_Uby;|)c4}qdSC(x^bMfkCUFd8)Zi6VY_SHTvR6*Gml7`~oibcy zsgE?v9pKMPC44RJg1kuh#v@ty)LXKPKQtjLd&| z*%H2nt^E;91PO*V7j~MV7Zt7eVsX2iCcRfCDkDXmoiwPT=m%vZ2OYx?)(?`8P!yI%2}W05=3?zdU(aGy_|jcv z1PKYvDCj_;VrLZZ_erGwExB(tqtH?}8krR;K=wP^T5J{dkNJW&R=x7*#N0sS{Ldna z*z9XxzsG-{a#_Fr1o}HW`djaaw|}0IsEo`%7ZZkOt4tp#Yiz!DPtSD&z(P1;Bp*RvjewyQlt{{q*n# z2;%=6trp+vGTUDbif-ku0jnNJYlS!dQfo@|GM`pcX`u5HbLA#TT7oN!TOed51e7%H zX%CVT{}l8o4(lPd0Oz%?t_d7fD2q>H$A%P`dcMqOXgFL4&K002QwIjTvoXUJF(Z_~ zO$HWt4S4up(9>(`4bbHy#Q{Bgt@_B*7uFh8p^dNM!~Y`HG#bzhWd3$|qj~Wsz#NBz zq;J5(Dr#A0TDhvTpd7e2UMn&C^o0dX%royg_{ZO9O(E=+37q!;wuSQ%BR4xE3*84; z3nZU1U#rz zfa#APG5R1@_qtPvme1Gv1Am+KaPwKu3v@Ql%6@vA@ggoeiHm)FC+BlQZf5Wi{Crt~ zg^Nw?j_@Ze!e*TGZ1>E8Xg(0siS0&?{lRJZUVZmQGM5qV$uEvLEr}754w8( zw9{y9o2%ARPf@Xk)Ivd7TDz%YD{Tq9_r64>5D^)kRh{0es;H|=hQB#e%1OoKvskEW zuyWnwJ0WD_4?uP!`xY8Sb`4J3PRu5=q?*!_2=RN*y~_y*9y>*eJJ%|;xBD@gE*9$O z3}{nm=kHzW5#r)xaa$>z25+x`*Kxo@VU(GfX}Szqle}tYV!R|Xyo&1Tx_j%bU1^k3 zMuJC2M_bXng3*1ZxyR*49Nd(UoT{qa+<;?#kBp~uRI0}~ctrG~jti~98)HR7IXFz3 zS!m;8^Zz>?UiAduAg* ziB%&29!CQi-}I&Sh1%7UVOa&6(!#Gx2tQcLtvIe9n&IEuvYVU#k=dn|gYUp?CtF_R zk?)GitXKF*OKFJp<;8H>0|g43o^kv6c$*Grf!|7>7E^nM7 z7R}>_*b$Z1^)Bweemx&>*&8%UGj7T97-`_Kv9Pc(it{?&oTkPX`SD#vSzFOMjpUPb zCzN)LEksH@?W2^<#`=1i!GhW1JeE;;`PeGN{OP_};yXL6AH*72ABB^;DkCG7#0{6q zEyfJvye1|lzPB66#89kc(-P#&nCrGc?o584WYj_tx#$6Z^khMM@`xAF1#NpOBN-DC z5{xqU#n`_1j$1ECnT9+f#%4q(5&&=}0yheC<@ z*Sn080`nDvO)vZ>A$UT!8LNx(=tm|Ik5>WWGet;i^kGZt+a}^vm0pb>?M^^p32#C8u2d00URvx>o!r9=4P^Mgq2paWHY)9%sY1f z;`l1dv-@F@-_fIDAnJI9AOD(f@fl%fFJp>vR~UYXV*M#FFs9B;*P*HTpr(yg#JTVC_ zQYt<1b>;I`!29niXg_Y()%}6jY2HrktXja8L=H{#V=^8+5L%tvA&HkR`XwCi^K`04b>=HAY%sIy^$!MO-bYJL z8;B8UU)+#)fy>5X0l#=E=EN%UV&Wir>?8VBxz^RsZ?nw_j5-`RdW;k=P*An3^YZdA zquh_TwaQ#_J?i8wv5k0VJMq^=yo79@kCH1$*v9V+F11G~U*yf~$LGYV?@2T+P|JRj z+a4Lc+FDZ;lhyVrWG18an`xzdl8c|ipj{?nS?{nGUdIxT8KK9&CaKYz4EaGxnI`Hh z%^m)swUw#z76QT{u@tExP=WtIg49&AyUl}xB?W$gv_jolU*!v8X~lhETzC5w8>aCc zqZuwImD2ZHzf@sUG(tqmZDMR(djKtbpByYH0RrxR0b9k;%O9`v*D1`;gYDId9%{i) zywQmT@bynRrPs^Qg2dkFEsoY)n5xE$zZk%y)|8Bw%|F!S47MvnR5`wyEanXta!qiCwKtFrDxTI4>h>WJ!nf~`-?#lvQVxG6vT z`}?iypPQV?_W3^9i`HEz@E+TSo~d~+7f$0RMqcbItTn2P<}|ctR8*)!@%S}{mfBm! z&GIVpX3R$!wxAWUP8**iy(g!`u=EDcqDtqpbJuKUx#;k7LwCFn@D3Mc~!D{7|=&|~||G@H|vdPkJe75H7i8Op*dRu;+mzznNiMyjvw z%^Z2=_$R3tmKBrS4+D_O&UkEkHJt`+GdyX7g@N?8#q8x%rV3HwURkAb=ABPtzVrc&GA{c8s6;XQwtj*jwve7hbT)hu#AX@@%)hOF* zAj^%;79D{ttusAzU*Fh32_?qzc1LJ_2#4b5{MXP`RoeqE3-KRpYx@FJkwN&v*-uAb zl2D0+M1k?H7}$qF!2Jn|OqSXk2rv<0g)6Q$s)o!`Ut7q0R8`9w(o}FD<)^o#Q%C@q zM!uDLuirbHJZ(XVm1O}loIL$?;zfNr=ojG<36lPOmM1F;8&c%<`7RQG&Bef*)yg&d z`Tq*q-&jjUZXhwdLj>6y%>Vz}4}-wKSL2^zV~Sb-j`#5r77h--o*$j76nv~zl|Ka0 zy$mMJF*jIxh*(OVJf+qA*3m!+NQOLc>)`-}KuQ;I_wH`DBoEm_84j6|NnTir_JVAR z5r|*{QKkHFq_#D7X~l|qH3T0ssbatL2#IssJ2I-YM-^^otHSwxB?(Sud;d;P!$?bH zkY#D>xtml}SpfcSy~FNd^Y~D!%wdoGQD}1|Q}?*&0VXK_sOu~?461+~?I&bfwpiRU zq0%+4!sVm3>d!&Yf*VwS+1+fMC?~Ji!=>QZvZzkUz1wT>i0+~J5#HLP+q81biTqYm zBC`)vU^EpKXhf{lAQM2L(8`^!+ak}7zG&QQ)$%ZuI(`gvcOBRPr%WA@eMJyXLT6EP zaeECEm&3Pi@XlQGaiJgTN;X*9a89Plx8(Jz(6yX!-nWxjLNy{V(mxud5c{1kUt-t3 z`fZG{n(gq7t>aKqwpgF`!Qnj>V&!sp@;dz($pbvrIF6*6ewUn6bA^`&AW2^Fy(cwO zfE&+u5MKz-Luoj$1hsblO0`|dvr!x${N~1G{?*uGE*E8tz{XSPy+Tq*?<Ztpm-klBxbE5{Roz}k_T{KBg-=}Sb9;(L>O2EasC)^{WkY(tya3$v8 zN_|IcJdd`hHbU)9B$~|SschhA0sJ}(4^)Bk8jlL8vcU5i%Ps2(k)m_C&x(oal?zoK z^n)lrViB_oAK+tuu5t04e2)t%rF{rRF>g3wprx0qP{8gTo5II^oLuz^HR^{|ev;n` za7&l8MeZ~%qt(AMr^8ia z8=8B~YRAK4^I6fScc9D0c)7%b4yjKC&cVGH6TT2GWYm(;V;Uc7n90^YlyWPtE|^wfH!H{_KWnXbXfI-ghTip>_23>$xHTZR zLD@L>sF1XNU+W!oPEp_Yr0gA{5hwxVD+*ls<=ooZo=fM5)eGlaZM4sc=8WeT6xnzFZ?lQ@lU>{dbQ$z*XoWii>>(+t4{4?n43vPs<>-SorDKRA2m%LU}csjH&)4t z0S20`M`<7(X<&O_X#a&no(wTomRdQ~a^_PHsFzt(-pJZX9eGQo>1uG?7Uc*%75_!Y zlB(o;c&Ky3mxvPkr|15==)pD(7l-E%^u_lD@EQLu_p_HIp{AnRNug_9S9DI8zH=D+ zaN#}YHc$CMyQ>!aI05=51E1X3r!?cHCf4{rXTMAedwL1P5Up3i&#$50kQ|7ZC~c+u zParvF>|eKUB!wA+gru-Rd{^8JQw_-eGpS^6w)Du8#cGfN&pGR^I&`k?F)HizQ5Fzu z@qVd_4chSo(iIEqEq>kS_x$a~@(GeF;7hrhA?Hb&sAwafn&6IQLRV0psoPk6sXzr^ z1U&1fyb=hol(Zu};m&-bq-ve1hmf2`vEtIN1s_;4xb7F>EwekqIwbS>l$9y>pA`Km z2=KCD8p3l9u2^#6+oE`LKtv#D-vQb+W5wr920KQ`A)<3cP5&`g2Flpp@%df%yWLvF z)ti!&r0Cua;C;edbMe!4puif!7v>v-Qv4tF05=u8>Q{`StOS(OPpO;%$_MSX5&kr% zoj=7uJBefC_tE{!E$F6l-S-_H7*fBOs0`5}zw<|%K@3{T7fOf$-J~6%6p*)TiHjH^U{lN89i2d+BRkD+yO6 zt@nMc?QG;b+*0KEWkGX<)k?VCDd-Whn9P!EH_@*HU-lAhDZ45hvPhYG*6q1F0Im_hpM8T8Rv-P@5|kQ~{W!s9Akoon zlo^ulmBZ-slXVil)}jZSG<+u=g(=++G(rW+G)<^INXyStb;?= zhX;K23&+86vB%K-K||`ZKDsFLFghu{c`WRX+=vzEfimqpv|X{d{_54nEL!;`1`|ts zP%d@Jz{qhy6UF}6whPQ@VFl6$+nt*Zxi@41yz4v-=PQ{6XtxJ{mfm8f-A$gBGasr+ zojBms%8F(j-10$@O1kRWg;~bLj(o6{MnE8Zh&)GC{0MnSvO>yhQsE>fZDj0ltAVtg z3k)^B<|(XWg^thn`f#ast8zU>j!`f1GYgZmA}D7p=Ex~X$ax+T{1=aNsq5TCeGR|J zl~jrBdZS6?o0nm#bBtWVHke8-`F9Y$fm_VfljvKiB2_P}1f{jyUkGBe;mNc{h8-!X z)=UsT*(*9L-4R`s9+A7#Zo9Gh6O_L0J!*k{9W}W;3BoL-8KkSb`n@22Noe`J4>#k1~mGtB1ahXiKaF6+h~iiKqlBztG;c7`u2^hN|PYmCP$NKk${ z9-jU{Qv4QX?;LEs{A*N#$bDTx=0I)R(q+B+_CirjwgxnlSI$s9eKM@namA+mY{w?) zM{7m1cS_oJM=ttCaO(?_shT&FtbP*U!P3Os>>_r_u99G+?q`mi2ef_jIb#EFE(fx; z&=bQDt3S1+z-$MD&g>XeBrZa!?|#kmYUS+uTCZDSa*?a{J!96U!MIGfC*1MQ9qd%4?~2#4Zn55x z7k2g6Sg~Jerq)?qxm}&>PKP_AUU0npvGMDQ^0#5teoF_V9edsJBNcm)m@N16cx7>? z@LjVjl@qqWlv0O$1{dMZDl&?;G6C3&AD|r5g_cQiF(llzbMr?+O5Le$c;Byw=~~I& zYSnMv3yjss?o%{k6H_o%XKt0v%60;LJzi2m^$~4{8I|YZNKvs z52+lnHb5SzH|ouhXRTsWGA zeIrFe47Xcy**mX9j9ZEta;~!>9P@@cwsjGRi1kiytpqTQh%rxjpDvCi+mG$U;EaDE z_)*95j_%ue!O@_D9DnW_v?sb|8Fx8mZ#CI?5A$cdz*+sG&^>HLh;2-_oVQ@X9W6P$ z$V5HZ;YOZcg5iCQ8J`Z<(b7XZQxe$Wh*(1?g;U-&JFD2VFG42u zJW@D24oY`i(hkb=t*I>VLToV82aZ3*deqMz2Dy>9S=V?WAk=&kLgozE5~^yPD;gvZ zEppIWT3hya*k#S40IcQ)=t67@7WtW_cXVd=(3zRF+jM+Wm3f@JO|AjzHKN+LB_cuO z);0yQL0aocH%h520$n$`0tLoKX-vkOb#)eS+n5E!dl*YX3J_D7z6_aMJ}|`(XL0JA zlM45^|B0WuaNCUN%>}Osy5}3I=9WB&e-IAr(zE!e_{#BMCW7VaVr3gLYsIY299d^B z+FJ}?vcOj&0&7k$CT7#FQXBuQ5cl2FF@lq1Ho?j@mo%8g*aB~KYD#%Md6w*~jhlz( zEB?{Hc|yVxNqB|V_s26Y|EHdZ4&%egjUzl2Zz?v!+i+BErabFXP9l6cH&UogWHi6J zIZv*5OZU)+w-S)>^LppY9G|myRjdW?ujQk13Y;_0+7C`GO&)no+X`-RNo^bmZgSgo z?8USN8A$M+Xf{ZauuglZD)s=fl#Q$I-*ozQdW2-v*qfwmcG;f8^vy77xHvm`n2xbg z-L2D)_qYr#R!5%7HFqsymfA#)MH70`=uzoue)jr+woRa-u~XiTTNpEGi=kc~2nzh7 z_#^g_=|i8w=i)r!u10%HE<+6wjD3v}4tcy68Y*qp=i{=oPe#?gFP?hYCl2)a9I21( zY#iM}_=XFY&=rXKtG5W1)Fw+=TBW^DhI`IK8@-@sBz@X8ohf`$_>^RX0`A#sLpFwp z{GP{l=_dMTug9+>`}SQejzqb$zidvtmwTeC$~d)XLT|(GlxQ?EdXkZOwKmouE7!qz z{!6mn7d616)uswEZY#nPbY!7`In*k}5cc{zU~NzAS3r6ERFX3f7ot2{9QHqA$u*Fh zbXc)2dmPsBtFf`@tvH+N>~C?7&q$i%p3V(1YqvCO1m~7zPtN6?~+qiu6|zQ=e(Exx$#~nE_8YR{Daje817!+aPa<$ZrA|utt6q-F zZ0(L`Ei*EUZ1%}r)EYP%I+O*=lGwb{Oq}{p^V=lISS+RY=@yG8S0Cf>JCuWlt4W3t z1usZ_Fcj#HZ|V1W7%Hov0Gu@w0O$Q;p`QkNbm@8j30e&7}3`I_WWI78L}s%ixLzAg(XY@Qp$Cy}HAdRR~8^^;kX_)|it%U+qj5d_H)` zh*?w)uW6yE>FiOIyX2=lBU&>DIJ%$LQIFKaKwPx-^uFuuchL`reBOAs=w-en)?2IS z9O^+|`vn)u|19}88&AOtfeU3^pBxeL3*29^|FrpA{rzWF07&e^;6ajK+WtX8B$k(x zAvKMUAPrOxnH*R`f~X8S+ueBRb^ckWuTbn9sxRKOXxmfBYxnv^&dVRE&m#s5rTN2x z|5&4e&zrX=0&^LexHq6GX@-Dp^=5I`!{H*k`~K5>K1(Q;RgAhg=QFFA+JBDX9uGz< zrJ*5?a=Sq#-e>l%gW-zsHEac`0pq1W1PZ4ewno*pdZ4Y;8;nxFhgnvci$J0f}ga(`=*%ov(mJm`tmln zVS(f(A<}e8QhyzXgBGAx?9>m454`b5$!orY{}q`6{P%TrQ3T(IfGBQkoz3DL9qFQ> zM=xw3?6=5j?p=TN@1~d@q=boK+=ar#@Hgkz_TULB34#-Ni%fRS3B~3u+Y3Z` zm!)&6EeEu$xa$JNCc9c^;Xa6D{6}k`k5r25cF$@vNfY%kJT`}(Pe9fYe(lxI_|ch>z=3P6`qb}}MSKN{J$w&ov^iVuF91+g;0hW#ZNGJ*>FxUK)Gw^=ea&O=es z0`0Fe6E54v_CwjTY~IIPO-h^>=v`r!uIu|^tpWZ5RgQB`T8St579q*C)Sj~1Zn3dE zyz+{tSgd!ytO+W--$m4HM1Vfb?nOp#T-N>rztP7` zyY}eSbYXfMGry(l@m4Cj^@&_}h<(kvj|9l{Os<LBfSh^BOG+8!#8*C0w2AbEBy3MAv&M zwu+PvY_b|ls`#HE=BNa6@Vo9^_D2@agpzuhWVBtj6^bJ~=CLcV+#B0+ndQ2KLR8l% z+E}tSuX<7q(@COX*e%c=p^m5Fh8{2RE#$OnZG%C_VPD9-dlHn%Iv8gN>>Nnz++b^3 z<4SbPkd0jr=D-zB#v>J*8TWbJt{CnGlla+1GaaP&)#0OiR&Dwk))-+-Z-sn_P2N`qAV;Qw9R|p)*5s=eJ6Tmlgw<<&?H-M;MaQG!v&%(@P9_*J7-M3sfu@K!uC*?W;4&8Qgw5XNEoJ;I+oF5 zwq}X4bedICtP@D#2~ffHdV#KMc=m+C0EklZiGnFR`HE%&Cz2RQ-T0~T>to1=l|iqi ztDz27T;tFbjdD{ZaFYl>Uo5J4$Wuq)rWagE(8%Sr*VL|{)Dtb^F4wLLyR>&6+u|{I zuy#4;9iQb*X1W{vxc;I(aErNtgwra-Dq8-Ln?W+)F+nt|``+?dzEfcQ(j;|cH$6=u zc6zqz57)8pn`Q(}40an=Ll>bsR=^mL(H$`A1iwG1L9_~}*P|Q=IkXoijP3+wVi=(0 zFJQ7{);pa!#aVQAzYM>N?)640#WXX2-y8c%?OWgA8Yeaaf_2z)Qr|!fWP_mFjetw^ z3fwJa-jh2k`dKyr`L388B_L|>TC)k*6{b&DSt+RE4zp$_Xr7skrJ_XC!PZg+!sGR( z&Y|eSiarAx75m^?5$WVvL&jbyu4x`^<-X7sdW)$<2KP4W@{;VKb^(QJ=fn`lyQ5Fw zK3r-jtW_)Um3Sk6#v3~EzCtfFUfx=Sc{0F_64KY{wk_b%;ZodOE)tUQD()ojWYWlZ zxL}m1pa2{HP(_`7%woRE!7cSLfi5i&t~sxjWAkGJ!_*0E-b1Cc2ouK1L)o@2c|-Mz zfrBGD%)SEtBQW+_CO7 zxQaSF0(xUm>3rk4TXqssU)MW_bJqcD98?=R1cY}&H_};ps-K~6Wn1?WIVZ)$QA+KI zAYP@`)lVthMZ#6hl5w!TyJ4{gQTSGmD+85_$?ppz)Xd8di)flOXySF;dfgoIx9i z(BmD)OSr)n;n4WMfy)1iwBX?Ao&d&v68w3Rx8wqn{rZ=N%J`Cd;EHv!N^Mz|lkTJN<_tbsMahw)i||B& zikyssyc*-)DNTOkH-o-HRKN?98(;@1ir7VUAM(QDt0KZtCswEMFeb zzwdg)5|*4KdAK>C0aEDr18?N+7heUemCf!H=W}Y5D;blot4}f|n-nV^*)%4`Jh>aG z)>~MR$3$0w^xu%CE66!GthSe@`e*rS^~-1(x?d zT1$M-?%sLLayJBZp;Gm(a8`sw?svL#Q0Sc$AAa4s-TYWdiB~S0!8uIoO&wFxeR9U{ zk{s4EC5Gd6R&!~THKpEUs+gks1tOzln-;eagxG#7_YXpkMN^eaj5dy)X1$l0)idPw zC?X}B>9wQU?~A;a`D3XL>=+!-D}OJotziBx+jJ6%1Z$>uM_}8jlZbO*2tK>m-b8+Cg_YIfh4WklKSg+njb4Va zlY6N9kpgNcnV5pIiF}kV;Yslolh|BsAF^DiL9M1>>fnYKc3wY$Dpvu!k#rnvTrwqT6<70-kEBP2U z%hT=s5P!cjI?)-cJ7BHmujA zP_kcgpYgpN+*g6w-$x9sr3RINQfGK%I;?G-+uqS%$X77{4>_htofZjc##L>WI8xMA zl4o_uN;vm>Slr#<#+f?s@Mw+gg7Nea)uCj;iR=oax~YKE(Tj?ZKk4lrKL)-x&*kmh zJu$Sa>?lEPm#Y@oo}Twkda5OSM?}yLK<+xD9+{au%Us!7W={{}N^c6Y2Y`7Mf>+*ZjH{CO)44Es zK*`pkr2F-llbw$%B`%pGDcb(#Wr=>DuRFgE4{ewBKjvV%kv@P@q{FUYZfIBg-tHl= zi=||x#Xi_skvGXG->D6bYkLZ8$L83Ut@?J`#$ebtNpJmtCqia1Y&3E5;iq(aX^VM{wLn&_5oUU2#fARL8_Sr5!-wyI@-{Z)G13bs1f{lhtf;Jd;M z`5(k>i3=;V3G#H${F3jYv?#!@?idHZ1qlFmPUm#i4+zscMD^<{Dbk<&1 zv|g{{6MYC$g#p~Br1ObTb;N$Tq7mv8=SaY@j^+i301bQeXMB;fR!|GmYMjg@uLF7c0;%Ex+f;nV9d3?%eZW ze{jQ6|5!yH8zB2?D%f_s^9u|HdFtU`l@)nPr%t=`7D(V+T52hrYq+q?*s6_*j85X} z-BvhVBlin%?k|()x3p2;8&D!3h=2%wV61s;U_8Qf+0op%9=U|0Sf~B2p^)3&;=Q;- z>gP4X!LQ2XWMZ?#Y`4R`g^LWkDz;d==pEhF{B#4F#@^j7!N05bH?K!v+|t)P|HlZrLy*Eqv1ATB5kEyxP zApUI#=>MD;VDBVZWjEj{e2qaeT`rdD9&tWNuPc#k782PJ>G;Ls_dlwCOZ@O8rQ&SM znTfdr0+?-6Bh+xNapM6FYQ|GqxlfUb{3mz)4JVlwRWK2=q9RqshND%w<8@imrDiSH zQXVXwpiR79DeKaPn`{A`(hN8rY4 zs7&MYHIx&}Z5xX!Shk1x$m10cZIPaE^wm8$oPHe&>TAxDM{rZJ7qJOEYZHGD9wB-Y z23~=lD{pwANAj7^RK&~9Nng@S0x6z+C3FYv8v%HRi@Jd}IF9{r~upC=~{pq#TJBQ>ak?B4ftv zb?nBwtpC$E&6vpE_?(Bq&vP%aN*DZB(8PP;r{#t?e%VQ^?$lgDQehqHi2MYDT+;6` zvYxx=F2Q@nMQZ(5irc#d5@zWpz;?bU9S@J_`p!3g-g#HOq6sl#-%t%Y(e>Nno!ftF z?z7iDyuB7N$}G8Vx*X|_gydM&r>l^GLAXu#Ki`$$MKcy}1{?WLfkGv?_b4&kc2Gkk zJCozN8$5Q~i$SOeXuXPR$jYGgdi-%0S~YlblL^y-6lylre>ztkV1~5_5q!$62U7;^ z5bFIc1B?t3V>uL#J8t&$9h$EvQq}|M&K|m)#Tio224kmQj%IS9swtP}wkQooR%R$; z#D8vjb=++9v=(-fGY*##@D2}UOZbVS1^z>tUtwPpho5BznB6&Vga5vo#5enlwMOJW zq&u^%aVH9KcD@n`P}f_Mj$?I>-!l;gB_Ja5=KWXJZ+N4!GwP4cvINdk_;}`jv*mwX z@8DbZzcIG|TMp<;w-bf4Fg>%ERCH2M>@AyNsuhnG#_@$=0ekr&^0mfUbppG`Iop6V!`=$4HE9&b1XSD*RBQkLd!} zfQmIou-uOz91!TgRdXKbsY1P_Nt+r>yWBA0fBM<>uo>~5uMJ6UVag{fw`nj3azHP@ zoL3W%CfJY>95;Tx$$QV&S<5>&<;ZA0=tmo~_b_yg6FmhwRMN8}5g0`3AO}0tSh23S zKh27HSOZQ+1Qa#{Xw-q7$jc*Fqd|&%JUBGDW8vrgSY0~V-q-X}SioTV|AF|C^cDkR!gz+OC^$-9;6FY(Xe z0CR!89hFK4h1+K|L8<_!@SdOyHO*Sx!7ql*4_${SGeD>g%^H9|Kc#8)j6?c?ooA4I zu7{^!Kt^%?aGl*wehey%Kg;bX6=E`My}CQ&8ySsAZQZ#yDC1vX0-5y`CUz#SF|ANX zVt{BcBRR)6hPS>j*>2yPN8RbxEF0OxW4oCQ#XlAhwV}DTCj-476{#fN4l)5ypZes* zLUO9%OFd^~67MT&ZmAivQT^c546Xf~*W9MwdnRTDuu}_rob)AyHk(B*t8VEHjX?-- z->k?$o@wdgJsks&Rx_6Jx$e~uu$umxDyTMygr8X*(=B*|nqg~S7V}Ha5`qA-78#1V zkjq@@o5Di2CL1313Ky@oE}IxQ`8YrA(Jj$ApE5u7P#h0W3@AMzs*hi!Xsq|XY9O?nI(goD z`bp+OmbxB#+46D&UERHK>bQZAm`}%qf6Vq9E2rkttL@I|R_D1`BBtrBDv#_JXo~|* zzx;JMfgovzTh#!TZLzbXQoT7OLT7@&Ma5R2pfQf}IlAwi z%s|5#<39dw|H1uVdqu%$JV!ZPGqSd-Qv|y* zAX#v3eNJ9BwfmH~foCYZHd zhE{GqU2%a<+}Tw3!y=i_wZwjh*UsbUyk}&i@&a$1@H?R^tX3=|qp71B>``nmW_|ao zWtt!`F=DRMhQx+fYnpMIC5aG|m{v|Sr%hLri^5C94@-|8se&}|_B&2)3j82X8ca+i zLHtg0-8)PP27BB>maFsC^m8-TmCmLwi`r&=_)5cL&b_qp8U{pk?%ix=(vl>wxu^~I zW0E`@Q|ZTH%pGrrt6mFIB)pHM5cD_<8&FD%8K;rhIUGl!<;H@rYWnR72er};nRGq( zcwIrb5|U!QF`l{CvteEdGSh5DvvEf#{@xyC(#;F=pj;bMn)qkgMJETrgUNAvKgTWt zJt98kpEpR0RU{fX9*icHCpdMIBKogPdGEeyiJo3wAtMs2KzmKh${iE=upinX0Mq7)MhWFunILxzO>_bK-WOzX_%F4~3)NSE+6B4vItf#k3 z4BKvl6zsE;ki^H4iM-w&nil?%i2?g#o6m+8PxqrNI`EQrcFXQB_=zthU;01!3Yo52 z=$*c((QMlzVs7K(db7Lwqf1SxM6a6U=h{oh#@)NkO%mf5p}K`Tr(5aNjk?8qZ?`e- zf%t-hcTv0!?%BQC7LPg0OXQF#d=;M06=)sx#S2`D3S!?s80-#2)p_h+vJayZF&(sC zhT$VVJV(B}aREv2#yDiCp`7qN*}^?My6g3t<_?ko3Ib_b4J`(m9D)1h_qEn6;{c}C zl_x(U!^fR>ri*M$bK+~2R|xa#?j`qG;isfTf;a$P*Q}Hvo4IcByXB z4m(U{$_%{OxwY7&W*4%-DnPsbp#n9w`PNgBB?xWKb%Y16Ogl{j!h(Zk<`2gMJrQej zwsB{KT((6I#y5gr%yi;CWdoke7d0=QoQ?zXRn;qXD7CKKV->Ef9@}4PposB0Z$O(@7{OtH z&LDp&0s_xV(oNOd&2PrNe!Y+GYe>?lhk{#KQ1of4nZMj@_!pN$==9aST+h1N;G~^o z*TcmzT`IN#$G5S#gw&JbRcm_0WPkCRS8YPZv(6cXK=87j z&;8fWsFWiqHc<{)HuOB)LYvdmjhd`Jh<(7=1vO;W_EdL64LElz>}Jf(TL3FRR z%laC_n1w@xEl$yRJ#5uq@n_A}PNtz;mB&f|VONk~=)u&d0X36kQ^paujwTsHqH(w2 zzY4354o9?R_#Mx}9(^_M;&qcY<8#{%saxGit}>S9f5Lq+yyVX^(X7JDqoY2lEo!0{ zvuUEp|MBQ2M{R>{+dk8jCAZgHgDtdokAB6P?PRThW25-!CEHn}=q1O&K~{Ol+A02- zD~e;zNx~Kq**D7dg>>P|TijRQ;=6Hj?Js*NLhh{Mw4pc`uzstocO0->IQ5<*WFF7Z zQ3&|+V~g5je-xN6HE4v0(Ci145$250=@91! zCe3=K3eS=_*`7EWMt5|*&%w1m`s;Jht;-ok1TZSA!`FW0fQ5M*l@K^<(zXy>u4+48y4?o%gD``$3# z!8w@lQzV z3-s{yP%ILW6J1ZQ*PJr|mQ&@*;s+SL;_bVCEK*JyJsS6vAMc*0xRr6!7 znP}s|u9b}r+a#B9PXmsUUWr6wfhf$kQWQ_H@ukrL(S|MG00>$bvp8m3*;h$ez@N}1 z-T2o5n0}rf9I$sb%qHheJ`b67s;k4b1!o7?0CnNQ*l=M4AU;E>C%jQeq25MNl(Lj7 z)zD<<&^qHzXA`hlbZ-SNR4@069`pG3O+^Rr1=Ck(flYs+0Rn~iY=m>Ic*Zv#55;95 z7@SaONpshy9k+Qm>NV)65Vn`Qbj{ch_h~hhhbs9|S>(>xd)NK3%ZElAC!I|jdlGiq z^>6B}y0Hmnqu-~T5E#pDoerLAsz+=xXC6SYCxadW!t2YRDoyyCx^;I_lwo@|CaTOa z<>BF8d&|25Nh8Mm$D?N6v+;dAA?dTmUNisNWd#xv>~-AsJsth<=pnWBzFE^Sc1}%) zziKjD)^7HB2Lf$-SsH9Gx@qz3h%(`@YyGF**n&%%RVrc8*ec$yzChg<2ilkO>){UL z*RJcd1QBwK<2|ns@na+vlu>pMX!*=g>||4qdq}-K^phn;bm62y+3Ajr`PHEo#hs4U z_RU|gDWCvCk|9!rVHVSL<7o5$Pi0pg5A_!I6@?_yYHKK4WY4}$u4EWnrDPhqb}4&l zY~|7-%h*K?6_G3x!w`cK#*#h6*vdMM82iq9exrLo_r0I@pLhP8-#O2D&iS45obU6T z?{j{8qrT0yP?wGkO&pE4B)6Y33NP>tu!9%Au(l?2DC0&7PLM~x4XKJg30rtSeon~M zO)GFVWx(r3087cOmVIRTJn~>t9bs2-<=M)k-S!bSR%0JHCbnY*#gzc>ChHB2#D9H= zK%*^M41)F1pj)y0$#}lgC#qP@U=^2n1YNk zIu%vIpUQPS#jR*^w@>)U!}WKH(Ipkdaun6>1a=R3<1O(y!g$$v*?2r{aofwXoT_xT zoOANm~rtI!Q{Yy)TUagHE&ELnouQr^p?f+`n8w{3eOuTa4l-)pl#Fx~z zx!w{$!*y$;Bhzc|-|uW_;>y)uduWDRr!=HM>LyKbeJw>Q>JhyJPb^bx-t zdz|e(!^#bdN5v*3%kV{VOoW%QFc~XQ*@9s>1@LMm36Cc;Uy^Yu@(iV7zZBICSAiMkb9*C+4qp&J$FpyJXs(fPpty(!)?vPUKN?pMZE*@il%ya=W{t zj=L4@S&;Q98*eq4bPV?j&nmu6^X^8l60bDJ)nBTCZw6Ofx)?@wW+c4@KDb1z&K-GX zx~KA)*k+;nQqSUwdV85!V8C_!cGBlQWBjXL*Uk7D64HHUZ&T}hUTVFz51$KJYSP@77H8Xw)J!ko5V?Cztn_(ORdV>G|bDuHe{Kh9>iwc0LGYT<320j38p4+6icnxE~U-NFF{ zk5dHkdTM9mvB|9KqYDXZ5<>%z=J-BX;VbBJww$|!QlP?Yq4ZOen?Jx{V^gb8z!Hr- z&ZIh_zdL!d6OQGUd*swE;nLd0CVT3C`TctM_@FBrQ+ou%Hw%TGn>r@jqXoDzw?B8{ z!F;n12(K_I*5013Zcfbj+P;?kmZ!$`F#mt*L4nQxpHIgkz(#JK(vU#U%mshUXo8rv zKnByo%Llu^)0i(^nl}PusV*59+Y=Jz;+)YU3Q(Sz;9UFU{t4i#tigpwo8#iO&i|`w z>$*56ubRwh@27*4%-}1ftsr8**$sK0Z6Uk&h2j?l`BYT3l&XsE|B$HYVcm!;F}`U{ z1^dW94M=c5O{+@Ql)(5HS|j?ogW|Z+Lhi>glp3z)ZivMLNFY*e@RdGV$o+#lCx!2j zZcTqMeZtg$IzK2Eav=g^ymNoSLMfd2Pnf&dLcchY50_%|b2Z_81}TXBnmRMnTpc|i z9628UmDI6PBhVoPWOC!mz|}xNy|uLmqvuY|#Su6z%^7u&6L%?}nm39iWF9a$Q9A=% zc;H6oHU-nOJpULv9^a=UuMu=_`oX9s_#cc;th3lIW80KaCEV}^O_y<|;J)85reUwx z*n!rRcx69*$8+afGJ2uX4^mHlKz1bC7X>3QJiTQL{HS2oYT->Dg&&WxhRC#M7G}w@ zDq8Y+H`-9?Z$P*eV%CTxA=Kj{#1O`FDJ&{s?vib49B2O%Lv=$LO;-(Su`SIbILm)J>egMh)EdIHLSwqD+ z==l@J*glc+T27O$1``em?nH9LsGiW%2hL)>(n?i&;u_K~;ot6CnvAbJ-PM5c8g7bSXh7_lKa`m(sEV=M7;T11 z4`1ZDDbi=~G3Hr1!Bj}!@d#2%8viaoS+Rr&2uOdkfoQyWBISs`IvM)Zaq%Z87DxtJ z<_kD8Kbqi7EA@C_r3VS~PzqB^eXpo#Iw52O#@<*~8lQ?nU6FV7Ylr|>o>jYae%5^y zyUW3n_j+b@*us?Tm?1-^CU?sf?|b_V8ckmm>B=(tShF`wlPAE3uR|mQ9Oj{~S)ec9 z!g~KH!XPH4Atl&NK>xnNB|NX;k3mh>@R-ugT@0RETgjLkUnn(*4zpKBhX|8`<;d$X z=IeM#u?*AkxYtlo+f)`> z_kLg-^{!ZSd1oelX)BQS0%xz6ukyeK;oo%R#r<^?H2df}Ak7qHO(N};$n%)? z_kmf?LX46fL(hkO3OjZ8h5AJ@1YV&c?JWR@$cbnGDY^NXpKS>Fr6onq=)~=X-3;w= zJCf_)W$k{IKWgj_4e2RHr{{aC$z z{_WLiLYWp%3%cBEUAV60H&q%W2_J+zU)F zfxCSh8=hF{MBM+PY-~C`lSno_X;noXOwaT+LBmuXj7ZqTe47*JlrG2)1bpl7JDNDF z;ZVU%4)?mXKfFFt;H-}5DrO(h{mEHeSZ)~~ThDF48>W<%Y0Oz_Ipt4tv-z^0?t} z{tD@LkUAmaNzISBZDZ>&r7o4?ZZ|atY07a@!H438(v57? zRuC_Kt02+ob`ehI)8b04dU{s8&-b;Em6pU7(n(7Fn(nx}mc@)<&6&EFvTZ#P=Sb7~ zx64vZpoA%=lZHFPsOZ#MOeE%8ez009p%7=zECi9iyskA$I)ievDs>LiZf{fyHq&i- zlB^-sBN#X0-7}q)_)F5p`*M_1e$ddQ2emFFM$xyK;$;{`Ze3;}l$c&Gzf*Ot#fmht zFd}YRn6t#EB|0yHq&Nx=Dfe_yu=X3*20u9Fs-KLEwGer0aHgnE6NOU`CY*WY5yf{1YaFnxBTXQ>!FopO2SN9m9#XE z`ImL{_+iIh9{(uxTYs~mGm%Z!)|Hjq6slwTFCX@M7m1^A;mE>wv*>H;H1M)Tss}J_ zs-EA=iGB-v)>7o3^bDLq^w?>St(*bxo7)^1$UA&&qJ7C4mLu5zP^fyQfyG$E9C`t^ zpyfTfK8r? zh;B+-tkt(EzK#06wT)eMT7Lv4!UhhpDT1xxGk7_Xc0WBd-Ijw=%r6Glgpf^B?OWyo zhUo)b;2ZWR+1^{z3ZtSxHLic*R9w8(T z)ty^mnyMLtbaw4w?Y2YM`ofePFs{lZ@1J!c*pv&c1MVQ374tfybKnC0s7zq1rzP!t z@UY|zdgW+oJ2R9}DQZS)2H3b=AqFnQMUz+Hh=GX+Y>nxmq> zL6C;m^j$me9FfS5gw&yK08ctN1*tv9twrQ~J_Xx;bk zCovNtl7AxI`{&%ic(-zcLEQ|?0oh*R7)0j$mzAGr*#fuihvQeP2J3pDuF15ZD`XW@ zHZ{=d^WW5QmE4%~A|Z$o`qir9^ENkz6|JxooVBkG2dxTXJqW!9yVX8*?x&BrV2#S9 z;HFf2{p6r-E@<wa;42hd;9}Sg)xqTg&Vo?SSc6g{5|B;Wa=# z?xQ>Pz+Tt0HK*ZNmVw&+eK_Ka=MiYXlW>kXuopJy_qD&TyX~vrc%#i4TG0*$%;t^NdrOOBfJEB_g64Os@JC!!2s22ri9SkUN4 z*%e}tS*~*Sp|eH~5#JXCPRa;tcy@SISVM)m`9G#BRBFRafUq@x76Y}c3vvc7>7 zWO^N!K`h#cO{*2%kx|<^ggg92z{ewsYuf=?3$cQ)QduAN!`AaH0D^=$a>Qj8DxVj0)}E-@jQ9@A5ZMa@C>Kb z9W@5FWU>X9;z82F!2ai9>fug9u1BNOzaCba!`1BX#J$8+_vb-uHgH z`-2}2d#^R?w`R@E`pt|X3UcB|@VM}Q{q+};q=cx_Uw^$S|LZR(R@j%oFYmf!X8-!@ z^IwvpLMkqLzn5TK@Me7IEzKU!o86C=Zy%kT8=X_>LQ)f=$chwFqa+k{GvTQ&mfvF( zDuiW9givS0OPkN+IEtx2f&TQ;Pg0pZAQlKV{AWTf3~lQy0~7+DE@w}kWQEE5d-wCS0i$SJZz>rSLH%kd3`4_ zuoTd8C@JqaRc+c=2ivYmQx)kIl-N!VvtA@l zD;o$e_s3!n^Tf7^h^I~H1rfuy1Idb`IbCg%k=Nj>_V=e zN1HAGRxx217@kaK9ny=qDP5|ZwW&OSnCA7oGI}O~J9Z4%itdoADCqEwnYvzCPFEZF zzPvb`7rgh+Tdrf^b!Ekl8aOBktbrOBBt;=b7*b#&_LscCv!2W(5In(MFwP#V^I2Jf zzh)41pr7WCrkTkgx8lI|iO8fyGFKEg2|s^e*S&F^?DLJca|4G80h`e9vG*hFGhT_E z5nrQfeh|S11^D~ttS%$@iA;#RktSu~cxSe0YHSkyd0H^}yU8fOT^1LM>3Z>NCOE23 zIJ=3O5bgr!jL5Ock2b809<(WIOm@lcNOGd0#wOUp10ohUP$aIwc~AzclcU*DSHIah zu-N%xPP_d=`CUImhP|qWo_|H>cOgWRQF2z|-0I_#p~wXHDN*wzq)&0I0xfcE4IwjM z{_pX5aEXEh`RRGZntP|9DL|k~erVxJ%sQwwqYh!;4keo--=75ryV|+NMDC2+MqJ2| z@CSZs!rB>KXI3sVpMQ>aZcJv!R0m7kV<++cH5A_6L-Nz-TLf~1Vj0WCDzGPdBndv> zXuG0)Y?PGX?1rI24|~yq-#L$}ePpV~3Fu9D^)+JCmc{iA@(W~t4+od8H^H`k=xAuJ zum6Z)@UvW!#Gv2@$0wVQVjdT`EgT;S=i%uBoucvV2RrA0Re7uwtgNA~3a;85W4i_l zJ%5aVn6a5r^Yv*@jC>g1RXAL=lXG2sdr^%&FAE+7U_J?vgxDnVqQJZi^6Tj}N@3$f zLyN2f?1{yR2JzQHS{KS~B(BqcK8UG4%iqy(EtW|Og7WETGumJp#!UefSDO(vs>X#D zmE3HT|Hn>kifiv*T8Iba9HtErO;NqF@i#WaHk>YBdAl|LNcFU&h}Z33i!Hg16Ij9V z2MD3(0bVZ;w#u0{eJUmAxI#CC_d@gp#Fz=$=z^X$e1i@fwoj{=2)1fu-UdOSkl_*? zxu*pj6qZvzz{A61%P<0}JMU-GLdB>8Sx;RM@SqUzD>ZnEFYmEYqE)#}I^eVayRuy& zVuypE-6aHn6#AOxo3uBuD115Tn-sr|^kKrNBBF+RwQHcqUS2|I?X*WC6xE!DYxZY& zj#`)Ui)bim;kOl|IW27fg|}`a%B8TVa3R)lk(2aG_XNAI)!k@%wXe<2(ghr>(7BXSoy?6ZIvkGdl(;;Jtd8Zbw_;Y;%yfY>&Zzph&-NXP~W>rLB`) zwjU`vq6+u!aM}*1`#suhr(%Cm(w?WU#=H^XmBoP7IV6+uo)iBz2?dXv{yoCvqM8zQ z{3VrTb?rq|DQaWJ;b8sgc6^xz6~nBy+Ez)6*DvVxMBaf!Lc%O47!*eb2U`8eJer6v z;e1}}uhOoz=(JM_*iQ7;OSJ3EEiAC;wP@8*7hRNuTT`Hx>}H=7c-hzITXEODASdfP zV<-4SS!Q%tzy5~G#EUr1EDs-rmW;}#KyM9`+x_j@2mw{lFSd<#V)#TZr(0r^TB z{6s>YiD<7f8%gC-&WbD6jrXpott}~$EnUQ_cHgu?G2!D9OPu4H{gM*XsW`C=AIjbr zTIBx2UR~3|B3VaBeMps_?xW6}OR4n#XlaECv4>zZ+-9#CqqO5gV}FpecntMaslbZr zmG{j2yqEdy4uh_N(i6Ug*W#7}-UAoA`c_9C-+Aw>>uXa>YFF;sF50ZLw@0j?LSuz( zExd$WMIh}(<5NWl$ZaWUXl+bnvs6D38v!$nux(j^?nmkZpwp3s^n8+}q06o4gG&6BIC ztxYQ}4VRV>mISu*kk8$ExoK{3QKz~*$Yvg^S`h2p}GnCTtRO+a@$*p>6 zWXmLPr&p{5Q{~((Iy<}cf7oPHR!Y6y!xg#|i2it+1)iIo;| z=jdIjjH*prb$vIOTAJp6?K%PdKd9UCpz^b`zH@n2a2!~oa+p@>6?M==Lh5DgFA{LV zCM{Ct-4cqGfU9z%*E!$9ZJm{OqiABwv93v5%4w~uctd+al`w`KG5Aq&^t^mM4#Ies zPxnJO@#>*SD&q%TYj(B}Z_`~dgz+MqZp)w9=bp9xJ5zOXM|X^PU$^K>Ui)0JW)3;O zwM%gZQD6V;7{`4CM$f~$YrwbE>_eEEO%J#g*Ven{0W%Vo{DrBxH*FJ{h~Mu128p)D zb-y+|JpAk{t>S5WKTIE1xJ~^3d;Fl?xpF%$#zfQyKnYMlnUt$LlY= zIXE+$166}NP3|JNJynh`5@+ohE@w+prj%PLJ=iw{$riY(;xF9P1< z#me&*hFZ)pSicReuCC5CGbP}1lPT5&@bXU}ThE-0-r6$V+?}&lRn1fI&ChE2Q~(xU zf-#;^&XeO{W$oRck;U8TV-lWjSCgtc`ev3$a#8+4#6Vjcud;$N22bcRdoqtw0qWdt#YCch=Xn9;FK{O>x{xmP zM?_{(+eo?DTa>Ti7sbp%EeZnMFAoIV&NM76EDS3l(uj~@P8|&P!ccF!5T~|%4sZ&; zZfZ&rxJk>1k5}yc{2cIe6P~!ru?Kh3X=_P*yzYmKK7KIoGftGJ7y7%A7RJU%CDL1~ z+wFGjTkew5X>5^$lrZau$xH9>vY#yV=?n4TImai^(Sj>M*g z)n0!{E#gIC;oe(_YLX|6e^yU8pew{@<^s%x^t1ExPOGaVC-t(fHOQ9=)6qt+@V>Ac zX5FITe=B?WMdhm|bfUu2!Y0k>s7|6LLI(kxZ%3`22D;4^cdWBRV~h2!jZjc*%@7$! zvD4vH(Tq)dXEz1roPbersahjD6f)j(Xr@7f3ZBirYlwGSa9_>W$@Bi?EWZdCZU&vE zYAg4yNiJLH*iF?)5llq?^{fn{#Y1>G`BuvXhpK&+l=a+O$^v5g&CKpD2HHcZC`zKH z_w{yz=>iosci9$5`K#p$=iNjxMeR+HQaZ>F$gwxQx-bEu7bLL~&bA)cwZL1ii1vJL zyVhHCM%BCw3`Gxl+12Tkc^>^%?_ra>BRJqm-y=iU8SA5!A~x zX&A!Kg6oHdhLAbn0VlCZs|T_k_)w;#G%=D=@X5lWBQ3bBl*Ex3oqfT2y+r!Jx3Rw; zO;<`PcE$0V`u-oU`x)P5W2Zvy7KIVhl2Vj6G(1fI$H$Yt=vYc#JB~Lz*-HxuSPW_W zx&(*$X!y0U9Z8(Q65uH_^G=R8sdSV()E3FoV2y*tSl1#nQKqo4LJS8Bmeuk$;Lh9> z5b$#C=g(0*$Me)AZFhI~)hkUqSq?;8HZorJtdFPRq4A}?_CphgX@^clSw<%i53^^O z!7%M*$Vh3NJUEx+i75Ugjj>JsoOO?qo3g@+SF1{!1j1+tBEMG<&(J?|1U*HgCeQ{W zIowNoF`2&lyM0VbR&x!q9>3(8ml_-`MwUI7S_F23{&rwLQMCxQ26)k6u{vpphR2pL z>2*nG97LooiW=lxOI?$6?QQmVb`mhsHp(lTsO@@veU1@AV+T6!QnM^di7}yL9X*ju;G1J#I_Q*zqW>h(~;g?K3$H^ zHn1b5|GwvxOA*WHXY1U_F1{I$qt$AW^ZY^W9bH<Lga?z*86lV_>gT@zxN5~c+!Xwoy$2aS=~f2liY@Hpq5{#u== zUu|`~QviM5oOK-498BzT(z2!!m%+Z0zGQ@k)xhTS!p6G(`d7T*_9Ca6*5dj zWDlps^X-mX>xpHj9-*?_zj3vLZ+ydP@(R8Lg-~pdmS*(R6%q!fbeV zd(IlmfI^X?&-0w6%sL--->c8}_)BG}zja6%sTule%C#Tg1cw{@N ztuhWVKX_Z0H*7U|1#UU5t&<(x`p;{c8yE}MYPl5N6bqTucYeoTC~5XMS_l~i&!1oY z1zi7nC~~^Y%3Pmr(-+@FKGOWTlq#Z|q)ZP8l(1X9Bp>DOtJqAP2iD<|f+*!h8D5J?qZrl&p-U#xLt$+w=# z9ABoRj1XTkzgk?`@x~8QOjb129v3&=`8B7bdk8oc+0r3@Boj`E(O@RKoqf8auLb?j z9UX|rSY111()>j}Ly-^>5N7ckE6&a_K5I}P$ zA%WfGLHlD%<_!9&oP6UhS#}{p*I^CG<{1}CMNm*83kwUIH!W=kf>#)~b6?$O5R-YS zD&FzC4;=@{qHH#utY*q@aBkF%;(kQ0Mx2K!@vj}PTfQg6!+e7i{VgsLBRv5hgJ8fy z%k3{*9N92v@n@+wezhA-hU!>7DgFNbqu>um_kbiTM6gLCN`C0aftn&aH8A7;bcwe4 z^)J%A{LKWlfmB^imBpl_WE%M?+94VjLz&C?cd^ol{WS&FzRC18!RUwIUq4I7&Rl=j1cxUSIjSKZqsNDF(Ptd z@%a?e>~9MOr%cQ`Ff3pLUQ;_LJeeeJJg$gp_^JmxWyt)arP6?S(4gu-k4#cgoPMj~ z%7Ghx6pe*+!;<}Z5DrhQXL42?sjGRRb1U9*j{eJMk~PwMZ(A_oTZ>Av)mQ6+IhszT z`RupMq*8B(;pN9Cr+VHU6lWMU`kH*++NQUW?$gSR%QI$BA3(w9KeXX%knP>*r$4w3 z2#uc-{vDx}mJnG~uzU}8!TOutjo955bXgs>Wt*kdOJh*is5SS~TH86HR&=?zdtYNS z;zLSG5h$C0n{i7gwB(k=dL&Y+r(f*#lErLJtLE+|tl^qzSEO4GB~+%~?I2JqEyb0A zvM?ZZoZQ&XB>uv~UNTWjL*1JNL~joqGK6&&rjq~H^do|t+{VKtjWcKmJ3FI#6Ynut z$#i7-^I1%zAO*unT{-3%ZWArn(^OsAq)9~~g>`@39*KQi368do%`*oW(!%|*;iyYB z@zUSpX+gtZ#=N=|n+w9o!4Rir+&?UJWY3uyu}-C3bCP+rz`^${PbfML`RmwLK!>f_ zSpi`$iW7{lg!)~XcK0GQcJ{uetvG1u zt!Ik<=E+@UyrJ8Zs<0+M_-&A?qgJQmc7ZY(UBouhpu}-;lK~x&S5Xb>F@41e|3S+> zYa$%KXi~33EcLu|=hLhYdhC?O8o;6KS+nDFyD{^bXJDGW822K3M->2R=5u zf3v@W64UK}QVttTi2lZOKoBIJjxAuI20DCBKlEn90Y6h6!nC*j0+{zszCYjjlT`Co z$1$Ns1^qWUi6+87I`Bj~{_h_`0Vg|p1;_HnR$g?YNbHqtL~ywL^YQNQ?au{gWQ^*3 zWMxfVOcND7%lCw(Ln$#q^xq(Pz=VbBkxeGTh%ZJws${9M4|aPkN0Fk!S!3hdXO`M? ze8&EnT~cx+_^T{7i*4YdLuDC16B9ExKOHFzKNA--#+e7HBBLY&umT*?a?&#-_ zV)a%b!FTvjB$}a*uiDEH(@@c3p9~;+JR^rk+wb~Q)4(CJJq*rN8>O|$cDTR^M2ch& z=nJZ}|&p(8M@%)zuc9E212GiXG?4Mpebk z$(a+17A+r(^fiCRWH#E^3BXX>)iPyeSF6wu4r{){x ztOlDviOUi2(Q%oHCj$!z#^)qvWaZ?=LZ8KX5?|m|`?aF&m@OP6_*?$bYD`B6MS56s zcwXJYC^)hLdAV0sQWl^>WBp|7hSOU|=jKA(t=7gDHz_-tbynoRGmT~2@c@{W0GMf) zH3z+mYg$|Xm6cl%FoBM6D&HLJqNa1JHhyzz7zb;8igmC&cC0v7Kf_4JzZQZWvWvu4 zmY}In=g5SBo-tO$6xn!`Ja1P4yAC3UA8Dzq+P&yLEfc5bVI{U<-m`2u_-?q;YCdp{4FTB5*B2EF(FTfY%~Oi2UZ9 z;D1oWo2O$NYGaZb8MOPAlo^CfwA zwX?qaSX!$?`=-LU3|!OepC7F|@4LGjf+r>yg0<;F-yxF87^yn$|5t%-=f>&yL7F$j zm>8eSV7m0nJqI4{{yyGxF+&{9525Rs+x~OAdNsG{c1?SH9S1bh*t_$6=Y#ng`|aVy zO_~jO@GQWvuIJR-xe`fANzzc!(b3Svo7Lz2aIpuqhE3zy^sjYBk93Q>-=eh5?Un?h zFK*O>dE74+Gs&bkA$mT#bjy{h^hcy0>k!3zC`oCw<=DDKai0k{b(V}oK}zHaz;Ku9 zw^kGtFE(FNECtG1((CgaTfspu?deUdJutsYEn%QxpOozSfV)I&Da)7lM@W z7AB_Ky+&<`7spivKR9`r&Gke#zQnrPz2O^hY7f^V{XFYjznOc0oP8Q-VJj%_<~5 zn_r+`qi(L{LXm(pjU9ehZqfi;A`MN^2Dhg;lD{X+-}vFK9QmL^L(9qamKBt@%4F|&C zS%Sfubq1k2%jkS?{w5}y1M0;w1Mck|KIKR3GtL$lM93Z8q~LoJ?3C?cxua!x_2ILw z8+Vgb2~QXlLK!*PiP)@Hn+-BM$Jq6_upLKw>|)9HlL&nYDE@|S0FJza{lk$(=V(vf z9OWr`6lC)nZtoG7MM!H^>C=*}8ta(Rd4z-dclwlQNZ)IM zVR+5*ruGMb6p9Snj&;7+np>GmZY{^3*mHgvI^6tZX#m?|q^8&Uy0P~~9{h<%YGTKXON?TYci5+Ii%b=10VaAI4DrI*M3?=QPjfNUL9902A&eGCSMZIW=>@9up7cSSz zHx{Mbj?^G(t;R91IyMHLx~^w#O^xF~?HkARO$>9aUChdrNK*0YL@d_q!=ml>;! zw_LQ7yOW}o{@HJNY3F}X>D2R^F>C!5X5Y}jO)pe`yqmi|BxN)`71FQBWZQW8yV>=W z97q*m@aVjHmlM|bFl9q#JohcgH(k$QOMxWqSED3sC$^7WzxLx6m z68b_QW`i>y-4{N!+Jp-mhWu zqO5=uOZpTclh3ehrcuFceS1Nmp@!s@&}g!+hWL4$xsow8F0!EX)eFnZ!=+$j`>mjO zb(IhP{_SiQGqEu-!}_SPKpJC9th@6|EGMG>o|Ec)l5a!NEWR*R8UkjU|E#N7vhqyv zQc8nqz2@jgiT3$}s6m5Sm(DRF;lA*tn)p&gl%&Y$#*68a@b7)6UG*ht*QwxUk^JTA z&E3Q~%0BI8)1@2Viwma|#8VK6=}^DMlx~ZV(`9GAWUlpjPH_2PW?&is_~?4Cdoc%{m+P4TVHYs}esGjr(Cm{vT3wS%3Uw#)uc_D0N6X6k`sp={;?3~kO|a8W*ASD= z`n&Vj3Eh$6Yhy+|;Kh6qgSJ3n$NhOY*GQut`QFfkP9P}H2BIj&qH0YK8Ha%>=LvRQ zJXW`@pFjJUXd-9?R9EhHYxli18gBP9bMaF;IZ)Jz9y44%dI`lQ4N2__XsAqc8Q<}` zMgm475{@Iy+tX~~puMUrc*Gl?C5l~bc4Z2m({As3MHMRYiH*4jzbTbEx>ZAS)yYL6 z=}1^&Ms>)u69bBRx+BsfgWc7Uh&X<&uA$4y4v|s}w#<#rx?a{gKcWq$;$k))tyTbZ zE2U;7h={D;=9T7H3$5L+dEcS=8iT_^$7IHn+0hR&40@%snZGPMX+Ml=YE+}a!DPkh zHadmWb=h=$hq3?lCW^7bXj?8O*y7U%;pUfN^c+q@y0!S|RolbrSZL)1m6gmJtY5>N z4(9{lDLef&pdi?LMjt5D))`Uz)mz4?84DBi3Mo!HE7RZ7luT&Epx4u4< zlam7^G#l&J3}@Q zn{JPeRpr2osl(^6TK2UGaPYy0rF=_aEMk-e`#~ZkKTf|~s8}k@b}TH?|3u-06@Sp%sq}pmy6FjEu50Y=l%~^0EX! z+Mz|q2vXKO#XRlL-0}@I>YH5`e$@7FOcP9Ly*e>~kH|)F0Zs@Zr-R32XZdg==?BM` z8#nXy^PlLuMry=5lsS8g*3r~)q%fZcgf1xtdNyuLDmnHXb zLY~0RfVSrRiOEF|j#fIs8X(8&P^6Ss6QCjG&#hTUV`*hYx6}fKZoe&_zX^fg%rgpX zbNBNFs5Nb$(bdoZ?$jg?)h1VIZFhGML%Sb*OS=#~8J)W}ksw8VW8r#VolM<&?xp#8 z@@0We+$mvK;ksankoosAPnC7!z&{oz#>BMC4G5A9A2cM)Ya!A@_8{epLjk+<`SXhC ztpdj+Z7ufrn4u7v1BbV;&M^m#URhq_U-QLbh27@95*Zm;S2Bl@$Je#2j)TJL07$9fVxS}7tcUbbP0G1~Zok%BOqZe`;r0!^ z1i5~>#FixYauVjpBeFdUDlam81jwksh~&g(V@GZ6+nrUehEp7)lad9R7VdW%ddXE2 zjmlCA!FoXMP`~<}dTMM;)HLvnkH5jm@-W5?$LDj~+*9SHrJbK$UM5WbmaiSl9rpT? zXs1C80c4`9+uY&&wNcl=@jQ`6y;MxBXA8?xVPF%ZU%uzvb$=%HNfo+X^o0~LYs*=_ zTppkP8j90YQjLVe`e~+us$*eG3qKv7vNjhRUzPH8R0brh?N1i&dzOL#Gc^N9tu(o` zfXn@Sz6S8j#o}}^6o=Xyzn9*#FKKtady3-dfO4fc!dLCzPgvgAST94S0)oA{?fjZ@&xfJ%5c?4!2PqQ|+J_Y{2bgIa8`T3lp@U`UzoEH}zBN z_~3k_I>e?H*t@357Iy!>#PB4Oh1xgOcxj;>fjNoJ-U)ht_K(r>_Zi(%TF3;N_;oI=3*Vtff*$F1GveoB`RPq4^`!ewvtcxsec}-1y|lW};k_ z_+=8-D_h}IxmzTk`r2A2T`wQ4w5X);*OASUH=RKeXnphZ3q>Q7Kw@*9tMu}&~WK* zL4Nm!zjD{JV^r!>JP_r$Qd}T&v-`A;Zthss+Qyc?i`l&@hxe>acaB1la9u;1xM$oz z>h;87dVV4o=U-AI^r;ex=%vBxk5541UDXz4y4P>Wr6nOs* zZ|CMtP_5x+I-L;0vOyje93COB;#JYi%f?nqFDMOB)9EPDzR=I2u`H@OO(d9HMlru#=D<)wHKUZByW zEbGD0VG<-$a*%(8O-hT4#6T-RVK?P$vXqf5K+vzNDwd9?53x>3<8ud(t>@Ui4*DOW z=6Ox>K=o-_!nbcRz9hse5*hpf=!khZPvi{5bynQPtx*&|D?4Vg3^|dKBe$HGo1cnI zHk@OFn)TPq7Cs442Z5);J^?uYs4UAYRm9_2qN5kh~$}y&x za?WkAl*^x-9mctR9cQV^G(r!Hh~zWM0}cMTp?vv~>XZPqWseCYXT{{+GAoJ#7{;b8*8HOwP_W6YVDFyj%W`$Yd(y z;Grd^23Twrhhp~`f^(6Nl&n~|NC2&7jQb801@MeDKL}u3c_}GBioFDgNe|Tzqi4Z8 zS8vIT%uI|;lNB$?np^VLFG>gypPJ>W|$Cw@!837JXx{WV#;kg7^ zQvYuJ`y(v&dFN~*XZE|!A4-y7<=$oT;p%4n0C8GS1(6(60EwbKLF1E?+H%?KtS?;RK)y-7Zn*^7DbXaY;f^gN^Ejutn4yu z53)FF51P0#e<%6hxe85LeP{ri=qRc6su@K6*)xSQ5Y|iVG zNadFzTfk9B$ByIu1ja=}J4bC$b|~D@f(c9TO;cM?93UB`elD7h>Uc`XX81NO65wlY zdJ6A;$J^H=#s@T_TRtJVYO|lmaJ4dHEB1F(uD|0HFrmnf+*rYvWsIfYKQt3}9CN&W zXiJF`FnWxSelG{=;=5(Sak;_MKvFT&KRDP8c8Q8x)uCkP!`M(}t16E<*DEd1(=J4e z=yhB|dt!vshL;tsQ2dr8_SiUKlJMh61{;-EUUVY-+TQB*rU2$c-_aUt%S?W6#^WSb zxQKx#A|4j|3VI}+k;PziXBTqwjOFtSp?c~Lt#+{0qQr=jv;-~XlE`m1SZq9OV>U&s ze*!1;soBDC5&vZQ!*KY;3)0+PZ#-ap`zP7HT*49I;J8gLUobv2T>VKF z3IQjrL7-t{Llq79S)r7Ph3&=wT6j;K5W)Y{o|=)qZ+@EcpKtb+h&w^(W@JeCeby*% z&|F~~bR3#cSWuM&AV4L%wkQ0rDE~X$YX+a-;G35XI_gjcy(uxD*D@f5fN<9SnZHy6 z`;}mg0TT*TzRPH+m%M6soElGm0VpKg*hxP@CCdw-S|oNxL{!uhhTy0J(SI`HDO=`& z@x->AUuzNHtqPQmi8T6mVji(_A0jn!&?8%P-yG@{I zNO;(KP7|ObR7y1hLIJEl2%`G*(sYlYOS-qVbt9zsp!LDheH&^aTQVNiF!O&GCuRzk818?sjE8Y%3}4hq zTT14|>;`Auz(0`s`IJX|O~6c2d6V93dexo_Xr_zJ7=_(0bTk~nR-a`kPgu7%XB0cC zXZJGB*sx(p_&{=vorI3%|H!hTMY`^AjJkhE5t8?Pc-8!6amryJ@1?;=tH{+FMeP^u zoAwssmn7s5UIEO_cTp|AkH_JHoQ7_K3LBqSH(rqJLXn%eA+uwpe3hl)AwG)rL7Ujh zwoZ)l{N0ukvB^#WvV;30gwBvZA(H>{w4%{sTtZ4xOcW+s0nr*7T0J};+zt8}HP~1< z9p0a>wST9;dXE1llrF3LBA`o`?6JCg`p);wTOKd)ZO@bx9N4U-#3T2te#Y`Z;Gody zRJ``6Wn9+tAkgwc@M^_A_BKMG#xqAk|1@K&c3@=w;jH4I<}&79sBdJYlE6zU@u&GC zB++V~-vswuF&s{`U%)F{1#_RH9#8GVwIDV(F{RWaWQD;uvz%r8kP86UcWmLwN&-C- z8*w~4sxg;vImkVq^Im4CJ54H9z+pG{WpRT*bs6eHDZH7C1s)dhWlI=+@UwRuCJH=>{R_gyNFlvCH)$a1BX zwIVtH537a8jpp;@MI@SXCt^ebMiQY%x0ML;cL_M=h-oQk>CJ&hNN*I6gv)$ex^j-t z-QJxq+5*a;>3DWZtOP~tFafo# zb@EaUKb!LhD>9hel-m0T&js%RRd}R5i@8HDq$96cjE(Z>A9UQ- z2(+qps{*C9_g5UX_A3?lYosPOr#!Vlw}AP`otCRuw39O(*p8$4XTQ%V^`qUi(!+i6 zihSy~&ha&bfN@iAFDXkrR9(;Gv z`dgoQkiSUgagQM9IIDH`VT5|&Xjz@!JqdK7rBxnd|OY-DlpbMwZs>eY*^!5Vk)M5bVUG9eec35a3qT(`xS5FKdHl z<{+iB{MUmQ`S;R+y)J;NOnK=iE-w^#T-)exH#>ScW>p4~Va0rkZZvp3jpQ#B39)Fx zpp2*gcBw|nMRVEqzHak>!A#^w@z+~W%%e%i+GKkll7E?DErdeq%ma-Ld!)SheS`8< zd3v*nwu>CqwOz(RL43^4`Ef_*1Ach7zDs_BewB9c| z5>Cx!Z94Two8aI4**s0?-INeE+jaK8GFNky0|bK)4Ydfn)oBuA)>AO;<< zo&*OGl+8Ix&{LydH;yMEY;%29T#t>YXmfi`IQLJWfRVu~=o@c$gO7rjPaUGGb&bw_ z2MLIIB*#`P9Y(moy&4(#4e&YnN6!;z5dSVI`Wi*SgxVnVM;e*J#|&Y53Q+6%IH#Y_ zC=TG{^6tsw@h0dT*Nw?~r;5weFBY5G-$BIa9VcJ#V*>pRX2RF^fibeTHbHKA`pCa7A ziyF()hp}M8rrKh{0+qY!p1HXh85zyZ%`FdGC%-5}>)j2+>Qox<$<_Bs%x)J$-AqQ7 zEJQ%o8%p8?tL{GEn!@W~+HJ>@w>H#I*FKdy}xey`Hb<811(j(%wE?iuT&x}8{Xbx z)GG1}iphfZoB=3`QDNzT$kpgaG7^#m?LNob?#?dpu1-4L+9seuWzddc@JC&YG~&ga zIqxX0DCQb~!%snp`(byewI4gO*qCqiy*Lb~xUO4!!9U%~*^8?dyafi_i#Cr@w&zc! zpckf`^fO#Wj;BW&2={zbPDBza^sg7G#+R%gJ`A*a>9d{ZmM~26X2qmG#I@+KeX2VU z(69Eq3W3y5TR--*?|)Fgj_{tS85W0+4brFo?RIsyuZw|yh=O)b4`}8+A#BOwlkjnI znD62+T#Gg|=NYT$y_;P$D%?i`La~?>^}UtvRXhA(P%^TCelswY8461kmLAZ4Q&Mv9 zd(NKf)9!p2y?&&+wzfM^xp#AOQ?ejcU8O>PIXBkev3+? zC)6u0nWD4MIUQXiRWGBWX>vW?dVqpKQ%*hjD-y;2pY3Y)K_!JMwrNX3fY8<%SZPp9 z(~gV-wPFKnM8kj)tW^G)dkf#%ph$IBCg9BXmcz01q+^t?w$*D{l@ctOcc`jtJwF6z zeJ4akRH>?8T6$4+tA2Z(S}OD7LQ7pzEDVBrxgMvzQ1iXxo+NX5bDT441u7%~M_YQJ3|lS2Fos4jn7CF&W&%Fe#N)-9V{BfYDZ>FM%I zEH&Y$>}|y$(4|;Gu}8Z&UBWPW81=z49f|NubC=b?w3Xq@5m@`F?V19ON72Da6>ESa zb*_aH3^DasEf%-&j?nsmbX0CXh)1{SQEnpGndF!qV7*w%?Y4c`B{>_Sk0bOKbwz!W!reQ;AoaIXYe& z)-@TcI9V_H940Hfx5&cAMoC3U+fHs5U-I)T00C>Vz7Tw=S;w{1ktH5spsqZ@d^{=o zAli=Dn#_Xcxk+KD!?Kw6C0a=dA(Y*b`Y3gpXW<2iXbU(vA5H`lQetmcGZ!F5X#ZYx zJ`m%7FiaugI49y)VjfrLSXRG^1?3z&AN`{iC<43Giq_sYv$nFSm)11)jz_A6Kpe+> znLgvhcNe7E-?5PH#AkUQ0yzc(vQH;?EZeOMYy%&>gY&WKS%*ImJ9HZmzpb>#B;cCI zs6Zy-qK5D40P@GbT1rdxkOUOe^hlymd`AH#<~g8}Zj8~ISnHs4FYjyygDotIC>5>g z=;-!z2>d+N_BlO*H*(`tQn>@7@EjczN{f`2>v-2ULO6?X(i1$cjw6BejbiJ>!*mWf zbWh~pRbwY=9s?Kt|6O&t9kI;(Vs+IC`l3ZqSQs_@ND&hwdu8v3ROCLud@!Oq-Rbm6 z(6eNj??4^5L7=1tVMR@!nT5*EQ+t(+BS_-u>Du z4FbXx*I=uVpp#f#n)K>M3y_2S46Pq&=IF>y=xA_x~4E zMFm`;GO+;FdQ}bZ-g#RrDWE~ou1?*SVjZQNiV8F?1>NJ$KB>1~I2`~x;^u>+`^s*2 ztt+&~C84$DFFaKQ6X;u7{(**!kEGKIN)1ac_G=fTluG$7P{%jtc*AMIRY@f!{dF{0 zbb7c1cEzwz#O zGyINewftx1Pnxz(zI^j#g!Wm{& z>pfaJ-Bh_Dej))|VY;{ap1&PhxYm9OZIYG&rK#=rwNXlb{m2%24Gxl%od-8zcnvuY zC?OsR(gcp5n}2!ER{Ed{M@v05^?w*6xMmA^=9cjFufO9}*%ANdir$X_oQo#0$Ipku z#Y;U^`c6ntgyoS}em1#Gu)ghQZ-#QmhsBF+c}oG04)!KdqN0tMSm&;b{>J`WA8YRq zjSqLt5V+0S^p-it7uZ&wQ$PnYUCW2thoXKC=(Tw31!O))Yw#=yz+%oy4&K}_9C}i! zBxo$xP-r}2ogO7`TK;Wr%0K)ojREmuowtCY4A4_9EiG+jWi{3+gRfj@y||3oj`_q=G$SpCCJjG7wy?=GxW%hJVGM z!O%9=$$5^%*ZtSZ9#|K*kZ1EKg7?KhVBV(Sg=!+c~DPjOW0I z1g$}Zda*yEy$kHe-KOineB-he&*q)kdPuN}ZhT-|1A!UftF&sfwm~2mY zoMS`kS{+(nNr-yEdLp=C*Do-wBKeGhf&W55!tj&v7If2FlJh8z_UD-#&H*-f8qWV$ zCP!@D5>?9`xU~{YC;a(H3sXtr^vXgU<`CL|;5VHm|5Wgi>tJ5#2= z(oiCrCjH;iK8Ifd>=*di1EHcOw#lXwiF%-n-F-M6c27h+ak?qYT4dl3#hA|NHL! z?qeVO%Y0zgT6ekHd0ywbhc;=j4?(6{*63xq;aorK(0R+x{ymGx7B9I)4tqNFc*F`o zgJL${`fKb!`Oy?Qj%m~iz_Gyib(XKNTmx#Ig+)gw5cEn7jVF%Acdll;1rHkrG3_up4YW_2g&Sngl> z{Y_SFsLaWIya6!zE`S{J;Mf6wmx1P<@u!Qe$M7=iyWL*!{)}Pg>-C+>GN7gw3!ZCE zU=lW{mvY4k!4AynhC9gY(wj}}<;$w1)G)F#v2Za10%Y-9($YA?;EWRqh7W1dy9SE4 z%o!i-8K+82MQHKGpTq@qe*i45G7CWa_kd0T6&$<09)04~bqE8Py;rTclCERY(({K& z5|n~=oy8u!4lgZ%_eKvJb5`!!Z`)%#&^kO_m9mL)!8AJUr7k7`j+=lc>g6>-rKRtU z?fDIx=53K(haccMNllC-*Ho_;MA1>Fv$}jE5>R;3ivdT@6s&~(eXnc!ef9f17f$;P zS__iM`0F!)D#eR%+i!ellkH>;kYypH=U4ids(0{S{b<+U>&Ij1G&{;PM z(X!5OQ{DG}=S(ir$eY?czh^j7;mMdH2Eyriu6*ZDuK07Yz3j4W%&*H9D-U^oto*m- z%7H7*EcYuJ32=VTUO0}(-*4IcL7v%u^K-)h=8$Fh)(L(IEgs#~vQX5OJL`RrS(`+6 zcv6sD*LT0+8itfqer|J}H!-vix-EX4F8wBmPd60>-a!%!7@p8Y8P2;XhU4q~E=Pe? z{sIRn?#+P0S9evr{&T&4%yRuE*FzN)>4c1GQ||wBHw?f!!})@`6|P?#&`!_6GP3ey zEo0xB{hNFj_A6)bg~`Ko@82ibI{7`ed|hA~RNB*y{)`MCf7clQrzk;3&1})2vT>5K zXvEKSsB(ZDe`@3Z$SrFax#%weqrH1(b_V5xP{5lMNWL=QJ%ImRw4f4lpzkCfj~B^$ zt@-W>9vb-Y2dDa%_(Q5g1$RRp*yjVi`yitL3Bhk*VJp7*@I>Kzi;4RDu+O4yJxOY` z@&3g%6ku^Kc^+Qj2YR})j}xB=)Yl#)^HG=*;%%eO%p+_gqp9><~P6&!_sL>Tc`w?6dRT2i)|ZK3@ssRKue1kep;XF6FaGF zU}JlUBFKN`P^}qbLX5cO7SB*%i|$mZ0A(5lTa^vtvkb4!D0`e zWw-d#Y=`RLlE2x1<>CV$1x-6$+|q>adkD=5xZE~2c9uJ>a8jCTjt#gw_=!{+k~4&r z>FYKoR8;#+9Laptvy?frlTr3~#-SMHxc-yxw(-QSNxZUtOHPT&FfI>w3gwH z-j{?TJGb7s6(@lf*4#)!un&Cw9W0p7I5k$U>CCyUR%+_$1i2{Rpb@?*=PI z{Q=N$d?fF>4bq)GEm37c#23%Q4pQUyG2<$1mP^2`f;Mx&3vU)nNNynuvBDiucV&+O zqFYi4{R@r~z`AmB1_gH%DMZ~XmD>K1^r9w_lxj-q4$hQe=E3K1?UzDl38hU_&s+~b z`1jYSz|c@(*8Mv&f&D`U6;z{uy#+}gklB^<%{<32n5>wINx@X?$}Mv|ZKB;xwxd*a zJ;lV4F_B_ci??}25PYEx5N%h$%iwHZ%Ekh}&OQ&F_PXeO|E*_JAw)RM!}9dBoXNzz z8iL4U4A;(cVpy!JUzB{WIgdAoREH8v<~P~JZK zvs>zq!QxqOi95Z3MRr?YF?mM!Aydm*kX;Kch{*SrF&TQLisvz9w5 zmd!UArVb7)usWvjaz9}z097ta8IR-vxxMXZjjw(UU+#<}eKA69hY+=1u0G%^{% z(pg4z8TZJ}s#=KrAuv^DZGFqL!IXr6C8n*EreRN%W8i7i{oS8!xm@hhTAyH+`}vk% z!)ftceBQn{T4x_REK2kKw*LxS9cin0_k+Nbw5q5$@P+Bzoz<9E1gm6UAuGv#<@qbW z;H_8tNPz|4)d3KCsm4vk@ZD)g(Vj6i%fl``57I4efHw9UU7d92_!hqDrt!5=v+eVT zCryQm2A3*T7l|yH2L%k9m`w5$wwjoWUwC^7TxE7;6e;3U=X|!w3^KKB=ay}re{>lP zF`PT9VK8|>nqH4X%q`$^KD^nG!5(?YQC+pkwv#U1F8#}&M=_6^Yh*AMn*Rjmf6+vE ztd#l=aODmO+-05}tKbXGKeiJXo~ls^Z9pW(w|_m5FFbmITUZK&1sVPF@*_M{1v++e zWyq+Pe8%$Q;On$iEwQsG{v6#$h1D$WLHJIQe5tW1Wml+dZTtj0!dv74j@Q1|CK1$h zGV3PZfJCnM5~sEOh|SV`ms zYHv7U?jFDBBj{B&cz1VUKx%LDcp&}x7xcixn(*)VJJrwEH`B%H8#)w}7AAZmcuh4g zfWrU;c0?qQLmi5!ScXrE~SP!%HB*!AWxkwBO;Syhx zY2$)^1qSyz35;te$l&+#Qjq5t=pLUY!sYCi^E%#oI>7EJ?oD~!8qJbiGeMaS-1cyK z5;#3%#DqUVhldC>b7GMbL&+jf{yTlf zD#~N6Kr@nv0kl5ZivE6Py^|obHR|(J-8<&aYJv>in6%H%(sbXmuaasLR*LD(W2or( z1DgC0I$)9;%JP~Yetc;V z2-qP9LY=YNMAip56fl}%%~r@KM+&{tYF5FuC`bx>s;9FzZW{M4hTtPEKyZ`XXa+ zW7yum$FK>tivan!n6(jAFlxG>B$riu&*Bp9O@rHy65UxHzXO_j0sg zZIy?E=UjVu{^HNkZ=>RR7DQ?}iI{_m`?LIp*^Z25=K&|tFx*WM6q89aiMO%sLKe55JacH zb404_>he3)q9xW2Q#m3TM6xGvd2Dwq;#RXWO<{naMg=uSyVmTlPQpaoD>b32pe{gr zuu^m_dMF+OdhWyvO#XCU93trudMEBlx246NBwx-GRto0WG>F6!DM&fb8YC{(s z>o-*u#u;MRnzZV-I;y)N`RsAjqMo00rVhf^)6aW2Dl9o%W|043zbkEH#>kGXh5uf4=|-wI%4qWy0g7IO?+!|>u`nq}18H)GwT zj|oyTu-nH28gXD(cb~hUw7?fyXKj25l+PY3a?uJo*o~hhgD) zJ*^>Qw4c8z_x^feDl!RhW~yi%my5uc_~c*P1K>Lg=(fJ+ud@ggh%)qkC;*H`4#EpB z4*1K2?Mz7tkD2ll`me8G4Zhbx@4uuN>(&78(JJ+D47Ty^e5PvaJ6y>SymcCmBDt|= z_5C$>>oL8t(Q)N{)eYdBhVcH2<0|f!qh1jX0@wV2prEp*v#!o?3z@)A)&g5Y|1CG6 zbwA0H%UH+ta2&;y~; z>W-WrrJ#l!%rsv6bRrH{z<+!nj3b#)&$#U9vt9&7A3)uFO)&w>uh&aNkzPw(%C2Wu zDL#bLp2@^i_1Ye+rh=Kt^FM0CJZ#C$VVZC34}gP9uc4L)z#;97;m#txlJnaPlf^qRIXNheEgcnXiMGU>lMt!Tgfip*$w zn)HXQ!=5ank(tpe>vGa#ZlWZ3K80DkF573p-Pj7a?b->s>w!nwmMy*F;V zKPAEG*f7*fb@%q%Jv|+HS-6R4N>=gH*j{I$@ zFu!pu4?rTgtA9vg>Bjxly>!}(JD;$Qxmfq^ELMZfaelS3cBoHBT(|n_9HEt(Tyykb zmp6?gv!Dhf7tm5=1C4XA>sWKR z7>Jar5+H+LJz312MwkFI239R1g(n%1>Kgo~nDKCNH*Os>b1|T=tJ8+v`keM-u;1(W zZYLw-_HdUxNPuuY`_PU+bmfW#KuyU4Qp)4vESWPMg1;Yf_(9?!c6chUHSp4gnvRvH zxs2vB4`x~s+UK-gSLw~?;o(cYh}PD1A&Vi8c8`(E)ibeH3yW@63qNeh_t<1FGiX&Y zrEwyiNP0{OaYE%-@kpp{+`=QoQKaOf$1M*NtF;haPSo~lsuF4B6FJ|$biMG_og9lf zca7JXFWD_zD?tbgL&3oLO^pQe4e82HPntM@KjVISa2b-Z62}UngtByHd!@+VioKZia(Drqv;>~lOm9iAAa}R_?EOiAeBtcYeWCZy0lIW<6 znbWgvkzh-He6db1;89$i3v$MI%Sh60bV1~=9R?>mo1Z{lX`V?mW>9~vnvmBr=?zy{ zfv4BYKxmS2)@;2C)3h1f7N{(f5kHOq|J!xsgz@ zck=u|K7A>TS7q!82N8Aa3pQls__DOEV!fS!*x)zg&ESO=XCz27?W`-4g}ZB|SZl!Z z0k?X<#ttL$fcqG9d!lEDs8VD_5%UFk@Cpax6KJW`n}fN=z^UpYwz|S^B-^3 z${TeQl!eJR|C&(jWL&Llw>{L=#98}ZKf1?`Q60*IBMA+jp_$%t_^PRkOfLNO42z?= zlPfmKjLnxr%U{F7mwT0Tl(>FI9jy$`IRsch5I%3Z*FWBXl z$uY3E&XvslYSlFI*Kpb~44LNMoETd5YGgN6toi1D5XW+(5#l!K=_ug7`l0dq+)(Xx z`K}9lyiEghD?)SJ!zQcY3595Fq*OJH+Dztwam8Y9Yw|1~0t@dJCKGKZk>Bve&pXWI zap`XQ39^HtHg=l_S?o^4mx?;aea_8@Ji|^a_957b(d-`RrA-Xit+m4$1>Y#i^&i@6 zSRT38=1yfq=zjz9$^OOop6N>Jr=gh2i@3v)=&Rw0KEkH`4GJ|mU2kQz#KPc#h3%P~ zLxJRU9|;Mt$+q3kA@jRLUh@x#zJ$R zIyj4>sfJ3Y(n)cemp#VL=bhb9KQZG&Jb(LyFE`tt#a%5_%=&^^CLzer>20W1C^hfS zugYjc+u}0@1rA?6??Z77OTFa*vyczT6`# zZP^}ufIfTDeOv3Yb^0!YD~-_5Tv{T7#48fKMII&sf7|n%&3KKfm@|zn;SvycBEuQ5t*R)lZzkPK4*b(|B8+Iyz13 z)g93N5-mlwJaK$FPoeHbZ6^KLVw!^A}jLLWrzcErNiIyr?xe2*aC1Wi7(GP0Y}-tZmNujY4qUF zn7>iD68pb28DSCH2*xCp7%WaPL}%*~m@!@`UmdY7M44KDbpJ#t;qK2!0_oZ$cNykI zVC`$mVPy)ZiQ|DAWN-IzJY1@2lVh>a94t#QLyzgcx-v!o@@3qfIpvLoSlZ&=d*j3tvz&8^4TC^0S((eEBjhmQE7=kzbNHDgCCj9KZjd&N>si*(C`oI2Ho^Ser zo{7Y0g%h3!lf>}be`UfbI+hEUz>vVp57tWm(j2Le^I&xoje(&PuGqv)f=4O?JUmDp z_$UWqGPQ?F;9*3520o5u8Ko0Q@oq4x0UzHk@%-`lfI&z<0zRe;S8&@erC#%enD>Bv z$hY7Ba}7n0U-{&F)h^{p$Qd&I4!c4ajBxPSn6;kbiGb;m0E^j_xbFQg>KsQe`$Pi1cjcZ4dgdFI2sY`_Wq9)E7n#JYWnS zc6)0e$M9l}_=Mi)sZpn6v!Cp;0)?pORaLsrL0AlpU2CdhOMQzH95 z3FdqB3me9xy}OdJOARtCwo?!ZJl^}l2Hgd^nx9pH zh+F^ktQmj1+xAepBTU3?H4GT3k_)=Ik+*>s?4=6oOC$UuptBAEbYN~lFWk*{M$9uihB&?HaH0_u60Txc>pDqs zwO_U+ma|5Ig_LkVQZJEigMExzIN#9Hb)}1>-t@5Oc!}N^Vq?Q;7n22!Nz*Ku6xi(i zu9C~`{jv=FnBn}OLYw3a@&nCg)n%%3P#eS0%e99gNvRK?J+2Zviq!=d^7JaKqRePoR0S7^nr1BRxq-u*)#xfUp)7*+CP?5x|S z^6DR+D8r53fNk%YR6pM)CuKGU-cM*NR&a6iJtOvgYS0q>J4j4r=s*r;eLa@jmP6a8 zWmeZxOBvb3PmiFF#*jAN_zt^ICcWfKuoh+0A!ebA+pD^C)UEDoY!M(ReGh`!+0Wk2 zgfYb{Un$6cFc^U+_jN(MZ6>lmlh@=pO>Q8CLE#$?6cMq0 zc%Fd+<4#nBhmcZs}y)L|~BuyEJ& z4`XF+SGo*2I0ZK2gbLeVL}8DG9`FqyhuFGqwhQ$^HOEEkhWGPrrZs(vYThb!i61YU zRI#4HBKEjS+z#GQ1!cHR>2W>9h?w^*CVZuE6ukcY4QA$#)|puq)Q|9=0%zTS#(vAx zkYHjy3919F#+M}=;jF_VvI957?J|Vl^YgP`Yj+{*d_3Mvbyr}}HX4ZNHnGo8;dI`3 z{;}&@43|gImr|o~#U5wtt(WU<%#L%^8-Dx127%DOLNc=u13pAliEOvmxEGdOi`TzY zVH(ZaeH_D6tYQ z6;$;?hMky=uFbQ}o=`S2K(PQ{cxX3$un!L+l?TEJJQ}CNK{?to%d1A+6{lLd#FpnlPu*UhWgKbiS ztQw#7!J1N|iX4^@#YeKL@RUY&Gp+QnMmV!Wk%I`o40KH%q0iTuak71W$~LIua<0Zqsdy}U~)dbzkE>u_H5bkB|#v4IE`2RGuBTXmIw zEWOdaotH$FnoPV^kpp@4an`T_HbQxkIeL4f#H!YIVH1lDUNV~;vDCRkdI@JLq}F2? zeOEl!v_9tdda~bZlUO}{iq}!-OVTER;SBq~xfmzallgXuU_;MG5aRk$-3wE&Qz26bB zaHc((|G=l{i|6zs+w7c{njVQM-*;PyTgmAcOEkd&*A;)0n%hM#lwKZhE2WR(qC zIG8z88*>-iMsMI#*>RNw8nqDB-!0zDXtPa0Nm+>DL@c)&c}z6%g3{CkJufxWpZC<0 zQ^*N5zjaN{-HjaUej+Io#b?wKbCRAPJI@!gCNGpVT+=8{)-1C(Q8MB^8R{8Df!8!xa8W25-HV)r^=3LwA$i z&pVyrO5%n0(2cjhFN4V7^^>!$0_Y%=pXjsEu88&L**Dus3s|ClXxdGcfS+`0S~7DX zmGHzYZc5hoQw}L<8Z>@-djl=uh z8hpMV$FjrH**#>|3|$IFPnw<4c?6m}F_MjTA44JiT^a-#;mu1qq7D;};NN@v)WJCD zptZrU?>#(YcO^^FYKBj36Ll3rj1u}h+fYQ*M-B~Q&J!m4f|oRL7D{=*7JYH~ct`k% zl5@2HFxzzSoa+31jjkihT+3-n=j5FWSU?Olu5N@XZiS<8Mx^ z*!+}-D;rFc$RSj&dzH<+ZdW?%ApMDH6@HRVM74?1+5&XJC;DJ>9^(JI{iwd6B0F~c zyuOi4Sg8R3ejjqlq33?(K!8IDfS$6-GYK@lU`d)yU_0s)SQzJqSy=<&r;*5DgF;{; zpDLDjv$y1A#W-43ea&G3$Pnu0Ulg*=9?A?=-2>Z=p4Q%Dr%=>3_7QCMZSI__KT`%6 z-aJ@ood%Cffv$oNlOoSi~f^M>F&lR^>j0gvP@bu)@ zve;o=NPTgHblJ~FRzEY_cDVJymb>;H3g^%Egjg1hT$h=rO})T# zGYR0w+Eu!!1p|kPQ^xnteKYhdN_f{3hLT{4+;y?BueD$?t$j()oXW` zeUjN&h%Yxoi`jVCVuc%ze2D8THD_dFT)UD}1ckx*?PCfn?DlM7_KgH<$s@6IbeX=b&`Sv*lYbVr zUUMoG7$rba`e!o>m5QFK88o@N?aZ@9DI+`YMHF_Kqb69dA`^y!+Ll`dB4n!{UT;Zr zDz|i$9D%<*EwB;H7Iu^jsameBn&_ECnl);~5%paGyP-&{diQRYxgBx>CoP-!kmv)C zlXzE+7T05>t3GaU);idB#z%6&?UnIF1p;as%hxi7mLe@&ze~fhLgt>i80k>6?^^dP ztjx7{Rmqcli~lJ)=u>5mZfVN_1UcZA%^5#sd#>E4RF9bxmTqZhPTfg|;OR71i7iq< z!uRB$D3|Vs8*Z;A?m51`XSF6(7xvnBqnP1V#4=RSn!YOol(t6Cxf@we9?=L)i0Y?x ze;(_XG_hw0L5Rm&v+?^^hpXwYk~;%Fz^|&F(9!V_C@|jPJ+OR2(_QVfGeB%8265TQ zzj$VF`Cnc#vXWkSsZ}tVYaTC6e zswU`&A3LEy#o~oEpWE^JiMU6 z!eG(!BZ;(FI7nLSjGFpkQ-9y|?$Efv4IXCTDm?$^q;q#n$#GTm0Yj-a0CUw52l$#` zWB@?6&UGF~DWT?Yc=J>35R3yJl3(Z0NMu;ta;ALp?s5-110P$`pURKt;fLf8v|)jm z<;0jwm|AWpAEh*I|CG8y6+E++9h}Q=K3@T%oPn6D26{*eqnH$r)cn5?GAFH{Jq89N zb`k>~E}>lS`1uWtYT871!*W|jTEjPU1uEA7{BLOgU*MdF&%(Pb;epr-M&s_Y*s9`m zPXgf1_5dG;F_m6|Wwf+$bV^#_`B~z}7X*ieHVApIodypqda<%qa^fi+!854{oI?es zy2CZ&k$tQ8WSxD*zc3vk@(Ze699YM%zz=$ zhi}PfGg@;n`@MnaNPi@udS%Q;Oo0)z`!5P+%j?SpNwI{WFR~8^#t)wH_T^jFuaLN} z`v^W!Mw;uCTuPu}rZ5v>7!D;ty*CK(vXxs=d~=3~`=Lfp^)g00(Q? zuCY7`b`@L7&Yk?G>J?#7T8}pETnZ~hNafME(uO8u1uRDg8XFoMIyxd`OOIT zK3JjaJnqY|Hc@pa?ORU@6$D_%Qvkck!M)&p;ymDkNI=H5M7*MdztZ@=J6Wi4KH#NH zFSu$|_6B6r>p2~Gg{vv9C>Ph3#>gC=MHgG{g_NI6}qA3ao z3G%p_UH7sEeF9y!$PEG8PQgbYzZXPylX?+TM~gW4#f;uEPYhfy;k?-crt=~`n9B1X z@33}j4ATT}p5u*IbgF32*sLcWU})9ZMhytLcI%(8%YDeb*3Q*~34oS)EAfo|S| zmxNuu*^Fr7eS~odFe>lSLX0Gj=D(7CiU73VT$F}y^wgi+P=2tkJeZLpE0m04KaQls z%)BF$ts<)Gqt$#X&#KVScfGSJez{g71t@8lJ#vAKzAkCz9kNktB5Ey=tIc1L3%c+J z4=A<;?RO==Gi!kmlL`YlaFBlamKnR;Tg_C34-G&C^-?>^AUnsC>F18Ul}%J`_Hc`A zN=#nAp#^<8w9>ll?yN=*Z2gkFMuYz(T1`P6>!WU;d1(2;8=$zlPb>%7yl=^U0+kwS zlNp+bNQUJZFbDW_Srer-u*x0?&g{v271Km9gF|n<2aZd|cpoHH8{v0bwC5{$n`i7hD@>Vuh?UFU=Z zkGGy>7Dl=|)gBvNovLS5_~z21&z?~QrF4B^#(KEmD(53pdN`7bW`nbs-BmJN<0aYh`3#X# z%MK&#)GL76?BeAZbh54(Jw2J5Idm93AG01)&E=je-*XRZScc8i#fpg^1`g>lM2mGy zkxEqk4rBn=PI-u)UO(kD)%YZ6^wYvrv8oUwn7b7p$zH6vY6ozJR1R^LM&AI0t0b-yC+`_!Nvdtb9 z0@$7Gj2EH5XFA!J2gy5-k_PM6#m-DI;8e$c($A@ZkMjlW8!FuAfc_J;%bl~l!^1WN zhrkZ>T^6buvV!mb?*c2jV=;Yrw{SpRd5>iJ?^P%C3%# z13ZHt36T_ID29t0NKk!z*mvVZycm!1@Sk}D-}%GvMgWbYYnOWc`(L!=cxMrt%o5lD zWsiZe@SBUJy$%~8O4QMD|3})L42ZocKr0I4*y2QDs&+ObCUkCPY+Jc`8TtN3U{n?R zy82%nIP*V`+@{Bi?#zDaI81)?{`(Ydp;pvOs0Kx@z~ z|EL4V;VFW<^)i|}ni7De$JxVXLR9Za`s}^iv9?}cE zZ&o&-yC7EpFgTQr^?{pxuz?->o5?n391}R3I_yk!D_!sqadkJpVqzCLP8)V3yeEXB zXg!mH{Wz0R$`k(%LA6n|o+26W{3n1%{(QO@r-VUVCcu`s3TqNciO5p0D^bi_eAi z$DJxGb%x?zefe`2D-;WIAhsa^=Wyy$*Xf4yshkD@Gk=YEJLfHU;aKu*+B9vi<;<~S z*iqrn z;6GU`O#}?cRTf>w& zV&Erje`yl$$kty&_w|%2iVgp8uk+CWb z99S}(fRCKS68qf!bVK^zu=E?>{`2tbxCg}Szqa@fa{4<)0Vqg&1Iwsr@F&K5l6Q8D zG5W@2PDc<73@)}$5<&YwZ|tx60iiw|_|3U7w&xKf|KDQyY5xC2G#AAFPSjY7DIZIO zUtnQKN+>m<{I|ol$@oNN_i!9xMFKa-i1g^aXn%x%gBGd=PoAq2XFkrME}Gs zkS?xdhEaM?WS_eRAEpB7=D|0_=c>W{z+@G6Lq>KlkAvpyLG#`7de5-4()K51ZX}oB>G&Jc?qN$MPau zZ%?0_tVP_GEe1xzmz%$@PBy`0%J3H?k?CMD^xZ$0&?>6@+?U(0?^JqOG9#kWaH0~W zqu!0cC*kUNiHSzv38x`v4IK>kmJBQ`8R{V$e$((ChjB^y*i3y@&T(osH1R z4D#AQ^L~L8gCt3!TlzMJ-*1TpEdW`EzI6PEskhFaYjElh$6BY}1?>o!rf_l-Y4DrI z_eU?N?M`s3E@i<@;7U3i9scgeYLo^hFsp5J({$wcU1k^)l2lBoNwEg|x+ zEKF!Nbpl8%JJEAVr|V{97pwW8PLt)~9Df#{!mKM@{@(1?bktXU=+sE%cxCnmsaSjd z)0rO;gRMVLTXHXYLauFWL}0Na?W6UcsA@QHGfS~*W@*hSKEc8$ zk-Uq?Z1NT7y*<7IBP|ajyA}is674IA0&y9hl3v%!KCAmL>PuT)k6i$@&~GD;OLB4{ zHdA`bDGuyK@-}Dwa_$(EdGS;?{P}JkBbc{jB&B@u^a(llY zfIk{qyFJG3$n3onue!{*I|h$b^jn~aZ)YtPCZS0ktBtigBF#Pvi9mNgzcU`(B66jz zy;o&Ymbt1+WYBu$d^#lw&8pimj#02EGpMML1T)8#&L*qA%H6YG>-DG0GOOTsmoB}7 z6VYEFXprT06XWZ&U%82Me>rV40|6=Dwc&LCfa^T6W*U|OD4$8cmsz9#upnDwY?)F+ znfCXE+#GRMMSK5{K%jZ0TiT2xh&1&1xS#0o%P`iDq?cV)0FC6rN?rA(dKB~# zH_Q%=?wo*!Ce20wD+v@CQL3Y0dwGEA_U9B=H_>)YDe+-MqITuSGAh(wi`pi}=rbtw zBy771)`X~vyQ~hB`UGy;3Oh6Cc^rg0L^v-rOHRFsyF2wMwX0F)_QL*Q1<-Kc47-t` z(TCeEmjnbUJpc>=6pd0(x03R}?lrweY5!0t*-?45zxQlhrJ)9phPAycMgH(lCDD zjb@%a$@6Vh(Vp)9YI?G$PrEfa42>NS&`> zvaM-jOOvrs#pH+l_$IfGItMEEPRGlO?-HdH?uh}UDlrDcdQ;-GNofpYnCzNde9^If z_s+r0+w3SHeM0Ng*$A~6ZRR~B^o(m~MM5}hxA+IfbAf{ssrraD^sVRFWfpE>gpZE+ z4SOz)LxF#GNZ)2WoDv4!EQ$Re$WXEy(`aLS9{p>$;1dL>j+8KdNpsQRNks%xORQA5 zF!uLTEpV{DR3ZJR{*c7R1@uZhkrY62d3{fyLRk}e!JM38DAb24fJ*#>L;*Qft)1RL zADH28tl}^;_WjV`daY{^`v+S8m!#?cP%u&bgWn<~f_Mm|7`N|SmuBX;?aDuSzyGP8 zWLXU+)wBux28sLu{ZSL5jY9GkN^|P-0G3ggfmD>5{BJ0E<#lu z10+en;H*F1D+8qCe}l~^AAvp5uMF*y-*=z@iXDX;4Gj9(+YG8}i*u4OQ=(}iLc*xE!`pNI>)UTRuhDmFj=<=GjU@C3Yb zW)0paS0Di`DTOJgd+-sr} z5v{uV5<};uvT^%IjR2(5X6JD;;T5puYs%3#+p2HU99bmI%h5~s3iCofxiDFm5VSmggltHR$ZpmpR;xeRh@F=$3`+`auLQEN)t)H+fbeo>l||ir zuds>rwMs$nsciv_^`V_RvExod$HYAPTi5U9kjBGYbm9kMr~+Uc@0!fi^Lz(F0X5lw z;cS%MYxTK0CoR~Qj5qqeWqTPFC|uH5qFnoj0VRzQ`h{Mv8wwkovtBPOstMV3&(yNE-R+0%2 znmbb-8(!S8pwzck_1xEc{`|=&KBzw5CV+KiR#V7c z+bGZp{?Lre(t7f`DCmTQIEvM6pFjO)k@AnZ`@B*11TlFKDFFQCqls0O+ZjJ|8Z1 zxS3JL7oOHQZT)KlVAZpW#XF#vtIU<{8zXGb@7+Ua+QcVySi7bIDd?&}$1R+fsN%|W zK12+c1~-f$l{*%wXZz8Ov1X}85Z{;zjZRISTAh0wVqaz5;rp*NKH6|4wdnO8zNGD%@VOKEtyOmQUQ;@cSX|)(?fF2ZKjya_4*_(8{gj|l z@1XV1%$P>Wb`{HcoM}(JY96Llh_c&$n2jEufD^KF>bJUm?~}E*1MN~Rd#(=TPZF#h zt|sp_lsr13Mug{;&dqx4doMgUDQ-k|FKb574eC{^-qO$d^is(8@T;a$Snt4X6@@sU z>g9N*xq+mo5va$1ujK!PM4T9ix7GfDrcWFa5L&v_eO8y9QmXpWDc&|}Do(%wHr)rk zrsAYz*J*6UuaF?R;$qEo!l&^-7ZC7QK=f31H9Y3gCy-1-2uR}u)&XhUv#9kzX3Wf4 z@*(rBmm92;ROnCHdcOM=ocwcJ$Pe{RB}+%sGq{yyKNo>=W^fYpS)un?D|ye9>I83* z00ZUtX{+PrJP>L!yx~m9ObT=s`&t}M1l=x3o6Yi-u@SI8stzW)9@KeVuuvtLY0Az5 z4shWR>~!SK0`|8wNh-Ybz`uM^a+xa&rPaM5+G6HBKY=E@f?UFVA&8%&LJ9)%0~tTI z0p<{Net5D6LXVHtuc}oUo%>yT+~`n?BZn?-dv?r{SA@7H>TGgkCw>Sf>v^>k!J=kh zSGU0Sc-r>C5V0(F`$TR;Zo=8+kE$tEhi8y#IJw)JXY<>~C&6@8fJ^M8vQ^f;V&LB# z5qKU)4OFolV?|DDbnBc8j}*cz2`*6!7KzY7gUYilnmw%r@4VPN;BLCqqONsIIa+{> zq6Lsdx}%7Wq7K_TvgffZ?EUMd(L(yMpR}98{s{&}thrR;^6&KSrLudGi91~!u z95>j_ijI_q*hFyKe})bH8Z>CoHZ-b>d^S?~;%ePEnTJ~svSLgJ;D47#OVqtbo)U^ZEb1!u$VqIrK-5?f}UCJ^lafTmL6V z)83zQ&}Oq*Yg7Uyb74|>vi+i0C37R}` zK+>#smFyqo&Y@$dvqqoy!ROs)?|t^Zu5-?H{r*GezVEfxH$UH4YrW>eq<^&Z zm3eJhgw}=in8W_4h!9E9uUuVC292A*ZO=9wqgky|k1<&gbYbir*PS$K2{Da59wD=$ z>_v$?hNx~1P_b@BWq!Mf=7NyD1JE$IySv_Y8|F5@4Q3|wly!my>4Tz)WbAW}M5{#7W&1QtsfRZpe}eQ8}TfbihO05K4dWevoJVdCe4A|s`j720(6 zCey}_Yl)%S&m5OF#Z-zLaYV>V4Zbdw-@7^k#DMN9m9~5=0r^%CjL5Y`xwr-W^ zsEFL;RC@Tc78m{B-~EpHt_-FS3Oc>ZP4=Gn%cbzKwibObXt2#P>A%U!P(gn??K_XX zJuIgK8#I=hy>pMctA=#aVH{2$XB)8(io(Sm9$_)v2L;U{hry3TT4)kwu{Mng{rPW1 zw%ef6{$-JOT{{06+b$9;ghn}L%FQYoj z0)xO!IZOyQ`}R`g#uQbg(LftM1ySo{MSi<=3klBqY6vSX@DNyOxDBoWvH=hx!z^y& zj;QCnJfM~VW>v31;Z&~a+{fIj2IC(n$e4Oqn+&zNrflK0F3X6#0@dTD9TK@gHOg{- z*_PYTPX&CDpas=XS#^V^jDJ~MoRK521991a_%`&w@ypIaMZ6eZU1T~OPrB_bq~?ZKDCKA7M%_-OEKhQON{zbav%+XbyTt{WOb2_6 zz!n|A`o9-5Hb7QX80zxUph@XI1zCelmi>)Qirr5uh=@ZpeF~%p z@=7~imZ}h1P$#D)i9+)t4as>uW=T>ycgLr*t!g3!Og`p5M`69*5OykDZ=&FVfEv6TGp7i%0);E$bN@GFNz#M($ z`z-f@X0`N^m5U?*RY>2LA^iI*jd)-R*dZCLSQqPtGjeD^@#9v->j<$X#(o9 zNW+kUC8p{=hvPe{nvyG^@w`TMfMs+q5x#fql8ElXQ2~1M!2NBPW|os^e#OzNf{!_6 zG}WM?pz!mXIa;i*T|HhrN^Bq%$AU@48F+QY1Em#6ayOBDqz9k)DyL)IHwLRV-SP@s zj0ltmDZUqoolta}e=a%574djbdN(>WpkqQ33q0=JxUIqI4(k(SUzBbleAK@H(hZ3v z_q=tQ+sH8~tGkC!2jpWbl-Sv#qGX51hNf-CTNHg7TG~IEw6=+y^Zb~G{ZXJJ5hNP6 zG1<^UJSjzoof^%}pn`=G>-(wCtbg2qu0_zx27#tc@`JR1zJWwM?o0vhn`mieZJV8={jXVQ(4d$7h!A9`lqw2} z8ZzxgqRVV&e~cF8I?t}NPz5?mLwI~S$iNNa0J!*G$FSoby=d1}eA1&#{ZmNZ*b9c3 zBVY*^;_E=gJ12#gZE*)e#`UjS>Vn>|iv&#f6E1|V`THTL%#wgDuCd_)s|`>ct;w33 zw*Vf#3IBYg+y6y1@zYKocvbHL#>GuC{oaiDjB6h3mKd7bsv%E*5Rwq^)m-Mjkc zHW{xXwr2>YGe86sJ3P7TuHs`s#2LYc!80cVz5(3kU!_T={||p6vY=m~;iJDTeU@;< z6umIzTwM>KeHZ>NMo5F)@|oNFuYU@ZKc{zyb%0$wn0ke~g9EPmocG&X16^KGs?-ZA zbhQFvhirlJtu5R)*l%%lA8v=(v(UE|AOD(-xY zX&ad0nIiQ~)YrFbDQ0b372jw<%A;qI(IkYT8ZMn_F` zRY}DsstVes>J3AYB{Mczk_=i;{Ce{2x%@)07p0Av(cP;;mp;6#qrit}#%EP1V=;9P z8#CXt!;Gaz;+u#UbVF0fpl+fzaoY-=HlAdV$*W6MdST*tO_Yh$+;MGx?8y7`&9%Xg z^x++|WVRm$Cb*3P9~dWxLE6ca!2D?;I{%u#1SS{E!h_f0!mi6Kd>D9s9UCLopf(J< z2OIFMAaQ9KmV3+Tvj;ZrB^_TTd@rNE{Y0KmD3qpS8jsoceFhAw5WaB>Oyt#k z7^c;!P7eqmo>9S~_{Mt}0hExcdJN|n76jPQ(%jE2#3@Z8Fwk2ZANak43G0XqjakR7 zi9cUIN9rrFGK7@4`6J-OvWI(TxlFlfa+YghkHf=F&s6;_3}GT>2~qyV~E5Z z0kRgZV?V>?;(P&ihMYkEK%r_opsct_YuyQ)A}cRTWX()O z$qg5Ff17W=`5f{23q<%^~k5yV!)ikF-q(2Q%6t}df=BwvLxF82< zt^*PHb^=6TM2a4)diNa|=K*FM4zldzPT1b+!uXm7XC@s&+j+ktKpRB_Mne`Dyj9y% zX(G38Y!%u0HQb!TBNwC6lkH;0_-%IwufXqh`D%`>^xQf%N@_YfFP?uA=)&Q>bUZFS z0dsR!3vUD*vwi?Lw#$lH-EwTEo(3=&fu~-DxwpxpY4@iBj*qAJgzq2kpENM4 z`b$$NvZyZ9;gO0;6gO&w(3&|dA|s!jJ7&73$hB;=xI>9)r|1jSQ&BS@${+sP>9&|0 znzuJC!fN`)zw(J(pQj{1wZJ%&&EwWtxx@6s(cR0~^Bd@?!zej;neIo;5^&>bE6Tg> z6~c@A9F_m)j@a9F(O3AZOB6i@Ua}iT-06ZsFE>3F<)xrnngiDa%+A%l3D}9YJV)n$ zaPxp5LM8~=?v9H7MH5Z>qiFvTW(-kWL1;#eaRM~7`29~KtmKp=l=dZz++8Qv%5;uf z%aBJKqbZ~{$F(grWh%$d$80Q)SLtfx-TM)AiH*zB#rX!!L00#(b8_N^a^$$QTB8f( zERUAFo0Zey+*|VE->8}%2j-;znC*QP5r6N|Cp!&;%y@7Gb(h8xn3zpLhC)08xH(m= z+3M!u$?F@x>*X#A-J8M!*jA;ws@$C z1CFjQ%TE66T0>jZt`cgwlRtJxTS9b<`&eeWVV}2TkQ&Wyz)Kl1Q zKaQou0G-#mD|0g^0O)qimZDs|f${Q$Zp@Y;fiAn_Xs^wtX^h2?0EhG@ho=4F604~h zV3NXLOp?ZvLL&XQQKyUSM{7D-v!@Pk%_t8J8YND?Xr!!5$UBCCo{0cg3E_~z5Y_?% z^!%iu9>Y#iQ)t@TTY`Pc-9_h3<}P=(U-y62>F~%iAaF)E(ANQXrNJMgB9q9+S6EH0 zfVAGnNUI(8#}K5-x<`lO-IHxIwS#zx%9hhs`$47qFxa7At)m%Nc@(EpHEiFOh3^#l zBqBpjIk{S=)GbXDVbsB{49dQ)FENW9>F=BViw&>v-NM3X0>cVBJjVsOfH8_c5DPc3 z5Z)9#ePM13r04=zs{m&3%h-AmR${#IPHkUW8(h>57O>TX4!@RBk>}UdjC!mNXj*e< z0K4^iAgV3*L*YKUn42>eNbAH`py!IoRfQ+t-~3<|@Ctk&WWD}u@@%1!V4>=iO^;(U z5qh8A5@TFl2cfTc%}&#L=johFRkzt*%`wub(((jph`jDP3343E9yabK-%iDst1SD& z>#9q6Vlb<|vn(_B$Q|yarKP3*D7vO!%9F`tQ)KuSe+7Xxb583ZD0I>YW?G^VO^->O zn48mGX#-L0)^r4uc+%%V;A(XaBVy8jiCBZAS65@%^*7}h_x80pusVIiy zrJeLEn}d>}8P>01P3{E+1u=%IMviOWP!ibVnpnZiV5gn%q!k|&^X)@SP)sCA<^SVI z|8uiE#?s@02KXr+5<*}8nGJMzE(bhb$ZlTC1Bhe$rO2@JsM@kkJLaP5(1#5bcJtZU z+4%w|D;~QSO6Y*H|6Ik|IPQKX8hn1;=NS7VvGWnO`M~qZxBhYd*9sr~0z}wTe|`1y zO_KA?D$@Xl=`LRLyliWcxlFBz|@n-6hXaUAAxoOt=z& z_q|d2{)XVCui%Cs38#O3U7a?-|JphLgnobcNA8I;|9DA)g3v3pzFE?T_fm!9Ql~IS zjixF#U30i$E4adP2R#RL>U|mB_ZaYTe(>>+qyVaZ`)R?xuFpI%$3mBp{#Cl}0r3kA z(gbKg`907q?bDt^TA_n<$0L4VA3b z(eEuPvh`l?%R>G4FR$Xw7|O>UmPMS%*ZPhoU(opd2{H5!$}3TU@;0>-C1e25D3G)~ zz7TwsVA2nh_E`E*7)$sY-}wC|(iH%#?z65OV~`c4Ee2U>;1(d63;_tVgn7aGO$cm1 z*i0l38vMdhuk*X`>gWIz@Y#9(^|Adf6_6Z^p{w><_e*>weI-BAtkfq77X7is({PB_ zX|HNaE=QqzxZ=Pz$fTQ1FwIWLm*z1^Mu=C~f_~xXW6wE4Sqwb!<^BsoV!(oREDxSk zw~4N~f-`_><80aoRZnVv6TxQ<(9V@r~U$F90(!G7g%MQhNp?@L5*Ibx+A9)oj9%4BIMgUIE zN6B%p!*zcn;-2Y7#p=awZkV~cDoj#Q&&Gcu!y}br@mZzC0N(X~f$h?JL+|`YpeF#D z{erJG7`ZUN1i}<~LMu>?+{YXRbJo#|31$A1W?v~9{1j?zy*rZv|H%XY#k>E_Phca+ zNUnSSJ;A-u6JrRdwDHdJi;$7D9sw}1lMi~oQfhx42Qftt!>haagW5n#seJR(F6PmT z;8747y8C5jGA!l^H!f&lLDaqFD%|~2Ywywf`s~xzmt+IZs`xcIx}!qbf$Bj62VP^8Yo0J^*XeceK4WjL zTq*BtdgnyJ)24~02jkiLr(n7kRU|!!=OO1~l$+4unjy9Wgg#|ioWinu_f*S!N-LwXdxLd z^9h?;yHw?Wess;v>mEKH0S_6wgv;mJT&)3Zd-ui*5c+om+WYrMa^KI@C_mrxp>sSq z+y$!?OP&8ZQ**xu&1QfFIoD_WSiKWVe`Jp)Rb1e8x*zC|HfO&9;#mm9Q<4-M!!>l} z*FW&N#Li#B*HZ?;IoK6dzD@R+-d7&9se{KRd+yVFk?~`W{(wNdW&iD^QaMmWrv-g~ zf5*C+Lx>sDjt4?-&70Cv&0d_-_8I-1 z2vW%RdtF$#b#zDWjdTuyOI`ZwAk)76j&@vv!R+h1YRMEr2m~v9@j0ssTwMh0CgEEp zEup#!(baIlXC|vlKS$)72ofKbgYM4;Pnd9-=XPlmM!x9$1Rs$hhS1;RO>9YJSI+q* zbZ#8Q`TV5Vkd?>3$n>1vYh9XqH;P3z#7qCxTVv=-#D@YS2*fLbKsEg(+}v=WKjRg| zlX&r$$ZU%ITF{6?$npsHljxh^1fFg+9*C!In29RuX#Vk|b!V{8?ELQq0sW?PTp0Z* zJ?8mcQ=9s{Cs}B-YWkQeZOS$Q6+~Cy_uPSoSX5qExUKsf`7H~bjRQJC3|dwPJbc9& zz$732nq(vrv!`n)bALPk_|gsw5#$3)d5yl&>$rbD^DLSb`;wi=_Rn4)2pJ>qY|HnY zr%ez@RrfDWlRu^pq=h5%T@z}6*p&nd!omKtvv~j-PJj792>F21{Eyc#LWPGhs!R*N zNPs!f#RrpMx%jsPewD;zi12@}2lFRAkkNlp0rMvr#>#qMKS$tOc=McI@iuMj9WF7E z+7Fq9<*Atl=OFtEbHs2l1ClWKgJf+ta1;wfy6Z3L+*b5U@=@k1B6=@dWV@-<%iEBi z$`T@r13@-dGZg!^G4Mt-xiJ>M7w^C04>D81AAakPs28~Gt?K0FD&E|e5KeQ6OhNk@ zYwWF=u6(S8lud;J3nAxeyDg%I^zwpr$cG98*06&IM&uH_3_#Urerw(HCTu;;!;`Ev zA&zSuhe@&Kr*f)xDrQGmB z)Ynw+pO*mV$uxO$n#Ov@Ixhof^)JG`;UycH{UXUXxa_+&ZO;b?!ojAd(}o4ik7XFu zqh!Zhe^B`i7ul|yHL3n?*UUV@77-!1GHN@D26F!K90go&+oTcL`@iSCa8B>^idf*V z*RqJwc6Z#B$_efk==*c{;&2Uvx7``EzxF}`8O7LztF(N#&g_Ctrh|XYi;aez#82v1 zi{E%TqhGhbmtkFK6@=gu{@;!B?$nO}`GbE0#(9pxGaBs4^L&^3n*sJ-&z`<2{TMO; z&N=!pi^zL-6z3l1c%Z+g z&|>LTs57z|)=Lr?XTxLN6SAF7CzTO0AV=ye;#i#<{`6#DN~PGjRaHe9+(OTFS4#zR zagM2D^-)pH`EAA5n^8N81Nj;S*P1#9EJk;5jRv%E6mYHiJw1tsKpOq;32WfgCCv86 zFP#)soQ&#*fiq8z?^y!6FM3(8RUfb)v}qJR>rW7Oe`Kj$d;xl&-{{ z*e27Z(k;rP%{LvS+)IpH=-ZlF6j7hXiVV#*i&xZ?m6czMqA z_2*V1*q+L~u6Ek^xwLtAjs#)BJD+?&M3EgIPfa>9qy6JDYm3v;(o*nsv1pz3aSnLP zHWeQS$J4&S!Pa1q8seq<(LQstw@)>N$848Ir&8DTD!U8_ zz!y{Q_F{hwy~6xtdT3)>NxRa#B9fFwwA^9T@n*H-%)957V%!<@~6{RcBm)pQSwp(UDxMYd)g(8F}>}GOM?r1HROFgPOQad!j;_ z{|S4-{v}Ql zVqeU`VE>ZS!}E1BFQu8Q!NFV+NVgSbx;%K}y>eK+Y&gr((sE;3y4v&d8d0MkE&atU zbLH&IOG-Vw!8Bqn$HO^qq?A65X_gpdnaATbu))iz{Bm4YA|8`pcoDaeFAg91xV2GFDlKQ;&M0k zI-J^jKXFhMw`f&q4|594mW`;zvEcDIrFdA~y>7KOT&xx>QuCn+-F5HRmXR}!+~Xiq zfb(m;32Ii(==W&CIgHKHRs+XKJPuRiyGoO`u)k?%licmP!I4v=Usk+?wT? zJ&_@Q%5z7UG@Vjv3?O=GBa5`Rr=DL5^%5 z_qkj85cxI368oyGOJQN0y}Z2R*RGOW7ft1_IHrNM?<5VeR`G78UQ7Z>r;q#xVoqi8 zQV5c)nx%#qh>6W>`dh%Yk%j&Cdc#6w`L##JSz$<|8UJX1oA;f3R-{N zA&hlVPBY+F$(oSKR+4_R7~#sMkPsP%LqwUDZd|#e|M|%e@~i^Wqoax0)|jn^D(&1Y zLvAa9r%Cp!<#zM=xe3*|E1Ek-3U=5mhr_PoVken{W4Tq~PU+Y2c9f<-1|Z03WpA>d zBQzqzZLc!tSu&|+wLRSai_xm^@^}O%=|5yO3vy1+e5J|lV3kSiZAEu|{Ja{zvieVQ zslDzvXCmLF%a%*VC*G)<*zf!N3I{JM&EIqn?FT=bZj6y{Xs`QuX~#BUhHB@wl+Ny^ zQ|~_4vmO1DI&!{g4Lw%*B-7^#iTw9fvbpEYi#T=?@38-fDtLJ~cza*OX}VQ5s6}mW zmCv+~jWb9dz1AGa)k3l`ci`SxY|@JtKF;H;cXp>Rc=Vx+M5*IT8`*# zcqQ7!KjyM5+cI%@@n~R?cxr}OUIR2C0pt=2!8aOfQf7-8l^eI_o$Utsk`S(>7UW}9c zr;EiP;#~sYYO zP|$Ce3Ov+qP{HNk1jl58wo288FbBtAs7>*8awx@U9e zrwU6C{T6qI&w0Y}!In_(;CtR=Z+Y49?I;psoFX*b)r#Mgr~lhq=k+MP$vnmWcwPvf z%`$ULaf7mA$C5(A$fD!tmgM&kZE6E~9ke;tSGn^HkQb8Dy36PFLcXU;9@rAyiLdtE zmgTt8ad_$2DD9?j{ka9FQSA*YUZ%3z5p$b*BgrOQ$${;(P6|ld1F#D6->YbrTsS3| zdM(ayetm-xu!B(e9D&r;>|x2F3S;%9&}Lg|#zZ|VslYPmrJr%XM&6_>I3WU2#Wh;5 z^9&ark~uQqV-5KLQQ=s?XU5mNVdq^)d`c_jUJB7=^(KSleqaiv_x;#LPzS46mN7kT zL@%E@&x8krTce&1g!LQ9zkEs8A)B06FqEoS-_UV^KEg#7@|xxM`sgL`@53+qGJ0rL zY{#Gc_}I>x(;SDshqXOysyvrpaXL#!2iuy5@ZN+ju4+Wny#Cgr<#Li((!|()x#id=s&wqGbF?h_eEAL z?^NIrA?Qe3=nR$C!il%FIWr%=N`FXUlC(}EyszkuBpUKQTXL^=p*(n(hu129=KFq@ zEFz*q;4x*vI0v*{qb5bAR&s>#b}wVVou^JDv`06-p>WJ4|K`B+eQzFz_guG`QWd(5 zsdeSPNi`ExI2cbXQm4kC#I?$%Q!l&<~SWVJDV#OO!*eZS7}Jm+0glt1N7w$2& z%S0t$-sSXQSa&wPo{dXYMf^muqfsc-^|kv57nIta!Pu&gR$ODwyc9JP)H}G=`gLz? zj66Ydy%o>=Ox!SwHB{2|r(!e=7axUSNiH1YE_$o55T||4W^NLA959Hgb(;TtVeZzb zI%wqtJDpV3R;YYJg;YaEeqYPQt#on;w=II~3p0`n@xrgrb;P{a@0e!0o}k}NL~P7yetjdC zcslG;aKfBHNh^`Ld(atSlyARBC|Kr6e*t#j8FZ$^gc@XyYXZWB-`nWfD4eoozN$S! zctmPYRn^upPlg1a)U!UpYhWg>us-ZA^`T7tVxW2YGsdf)`uf-R+}h%9TUgU4%4KfG z2G3k7=2mtpo5bNAaW$ilom)P*qOf?A%3k>eqQs71fFZmK*CIBak%ws;tVI5>bx|_I zDOPKyW0@yOs!>+mJ8W==3QNB%g(Y98ynFqJiMsI$jUuk>;9YaFVFB3&z8G^`*2MeE zOqF96*P@Si-aKe9R24f=6n=I|QK8{Lv}il~+dg z`6DIxn;gd{T1|N;kDqx|^x5QX=FC!)42Zh+bLg!n;vw@UT(%#z4|Zsghrp~q{YW!5 zX!psmLT0*5U2lR?3pkD0wD%4w6hC>g#Ml#XA(^LYb0eh3_i{RCgoJj%(bD>Gk?%>0 zgW27?u%Z3Lo{k`7NYn<{d5PFtVyg6}dv%=OBi2~(es*OZR@pj^UpOsZR7poJFH)QmuCJPNrSVgO0p7 zt8l)?3hHGbWE8n0DlQcb2a1UFQi7{=wJ)4!CyK>y)+cgX3rEab4urHMXHbT{K&Tv& z@=;ht2B8K{#raJ#&-c$EjO{k(76wdBZ}|X?kR_I(7;rz9?fI&SLZC~=BM4ycwiyn> zdsUvo>}#8@&5U{Li0j@xGf{O^zKO2s&?hZKaz*@+k!%^M3Pn%WB;+Kl4ji)rSj_eo zbU2m{qZGrU_#VzlKaE3HY*452UKdSos^DPI-~LQQ9{$ddw8jobq0lLKyEjb@{gKa* z8k$T}6jYpEmckV+mhZHEe=6bbTI!vlrUqQ17Y0CW=B?bjzo@+}cbd0p?#}r^P4XDZ z`TFR=oyU33jl4t8Y-M97CC`C{^Q3RfOfYq9{RU$>vKJ?XSx)6t^x<* z8+7y|=M(^@*hkVBpMsgd#WPA{CXIjQ!!f?c_wOP9?Wbk{pBe!Qwt#bThbna z(I1}C0HZLBXRhquhK-~1?as>bA)29pkn#V!Tm8p(OylVTn^(rT%j{(I9;homKnI4% zs)uPh)z7y2e4wL(;Qv9Pbv(TXbweE{>=EMP#H8M$SC%%gJn7HoL}*O*=t0Iq=DFoN z=*(v9ONr@p9FTR)#DA0R`3oN&J#$?WhQv++tZM8tD%DZ?-iEs=_r-|bIud2@B>Rht zd6#^XcOT2qL~@tiD`t7iiGMh|M6uZ~q;I4&!C%o2bahuk}(8oRmV)iB%CC-LM7H^=?joM{}_|ul<2Y@>9M4@^+-nsI-gWkJq+_ProUML zY*8jh)6=rt0}=L9EpO}kAdj9seiqnD!+|txNcE&3-tu@W^Jfk(69+!R(AuSdB?ETR zrIjLs?lz?Bj4r&K_{H}_<<>5??MEARI^i)QNl+Ztntvx! zsi7_MNmUOk%7$eYwSLk92Qz%V53i?^Ml1`O2eN9#s;&LV26KaWyPF898N%DBguJO<$DdlCiGT;E(vH5M;OeJnQLrax>=2 zhc;jw7oSiGCsWCA@b3^zdlCt1KG3MM%9@^36&vy`0wKC`CPX8m_=se(_ki*VL(~;3@3&P> zP4E&sFYE;8lh1=Yg?ZhVV5n4T+lh?<*VCfI!DJTUWG=_nBNdPVI7yyW?f70*fbte$ zKVkIA$DVg=j%D#*u)wu*^+vPA zs-+-8xdT;aBk%&Y=AjK+lekNAqWtx1vZ&y{jb4bOml1lZ=Q8+~`jpxKOUfp4yuhBH z#cbCEx4qoJ?PJV~-*~I{d`CFy=APg)=|%Jkew0lhDk!?vSgH8)sJW4L80%FH_HR ze4Hqut)Vr6TK$F>@oPsh;c=%mQ*) zASxIZ+p}*@_EqG}zGM@7^Hgrk6CBPyO1)CET>Ef?AyhV+D5iCO9v7=x&`1Jr}$QhtR?|37%7LI>|c*H^DpYsSvCvvM;W z_Yl6>s(DcR5>%3|pRMtKGO_3JczSy^*zW~s%2f{xSGSTok#2&5Wsg}gLE8ZbbSVfa zgK}DuX@6HOhrPEC_)*5ZX3b!&!q`d4V(oz={SqcpzHx^`~gr+lz3ix1<5+&}a0{iTvl zh|Qc;JnjW&|H~#n>Wy1WlMo|1F2%BPZ{>DnXxt|IFku-SX<~z1~?|QYwoz9 zol*6AP-b~^Y`@{8BADXl*XLm2S&>LR31VV698)>5~jYXz#W+%Q_kWJ*A zf~~N8VAcl1mF~O?Bl}bR;JgR}&66Lkepcc?03(!*m?KopMXwZ2H_P@L=Zh^|KO8i$ zb!~vk3t<_*=@9F+=f<%Qn;0LT?2C$9?$;r`t~@iY)d|Qdxq*J$6VZ_4a+G5KVcYcO zIJAQ;RI-%RHZpw<5fcIDoBg^tYWv}Ba|7Lj3*|4wESGLT>io}aNGWk$q8~Rh@6`Rd zrs~&ftI+47Xa@Sz?Lc#kP*AIIzq;gyyRueggb8)#p4@X0z#q!Z`YiG;uyv$*&-^$* z2RGzIg&U{sFsZO=1)azSrK@6{Dsx)BZp^yBn@<+9HooUFtLE1kxg$%LRq(LS{kS!} z!ERmrmOL%aJ;5_j4TLmSkX|ire!G99EurqZJFd~3+{=nZ>kQT^vXF5SfR z0l5W=up3d$B6XZ(8TR;V}U5@lok$N3+>#GPUp~^kmR9^v<5Z|jKbEqT= z5rYyFao>U2AARuj`%yJg5x+xxI`imx3*3w}!Ak`D!_Gf6>_#~5Tr>?r2{08;=Var1 zS~gZaq3~TrosGqm;6&~M=M#0tu7l5IAgE6xV7d7a6T&p~_~CVq4L`GOsj5Q7nG9d% znsB~V^%Pz;Hxcn*&=Ga&71-Hd>Ft9&;Pg9a*ChD>E(R?85Gj`&?PkT=C^}D_m z(VNKxz0r$Rkgqgnf_u?7@tVXt5w|tVgOnJ=CF&CsJO~fPS-e5#OqNu8P&jw6+|nqK zRQ@6g&iBv?0(o@iz?PUuL5MwLfGidNvn$!klY)5r-*K`J8(Ts^AS7qdrjEwwuwfUSDYx$JZ)zTuPV*bF-nFV} zZQyzfEpUVm-5-Dv%;cx(kF8OFfMP2)yWk={wgCf?7p`kD`v6PX0xpelGs=XntfwDW zZp&y?8Z7pIMvdm)~szkq)at^w}HvO#<)-zTv?&o-?#;>Kq~Fv(o*r%f-6 z48-rc9)0R(DUPwA5{Iciuzx>MRv*8+JjUlR5H8;XyX}8}>_H4_E*{l(y?Y6wS^H&>4j! z%_#^=3R*w-=A~TLx>OSZcm6S2*^nx0LD8lOfZ4wGF&$u3ghfm3zDB?r2V!ca#(Z4d zIIE}i?qH6#K}b?I>FRYcK?EhFg#Jt(L8@!~azxSQEWdq#YRqHaydnEcWrHFSs*6#! zUw&4!CD$Im-rs+j<A8W`&VU7k4TE3 z765=wZI8)3$*|jZbi!9Ujy*zM4XKTbjNNuu50Tn6hb7Ym0wmXc`=9E7NjHqG~w@7W1i{FC>QiE$7$5uS+vF=f0%*XHg8OU$N-Y#c2 zO6S%rKwaap@9~ZjnbjU{NKB}G<=6H&$+_&pbzj-R)hO14vR75m;`_!e%;&~~4$}h# z(az58#e>i_kHK|Pts@utC(p7PQ|8wm?zFFTUG+sP%RpY=|3fW6(#kgdu?sPkaw_Ul zN25zokO(?WWnSe|KT!i5HHg8xv`f6H(F0R)DGC5Jc} z82FxAdKpE;gu+bT)H&;XLgs?I^GN@979TjzA*S0V&p^2PAEIYqbH-iw=zzh!Qj|79 z3lX>dgJOL6X&d=!2#jsK&!Eu*IzBwlEC$E}tlRLVZBrDCyDyo7YDSlAX&9%WD*_+l z*7kel7#Ia3fM1@Wc+Kxjuo$CyBVmsP-7Z7Mv^6g?*PK_w@txCfbF3Zh*<8_D)>=K* zQod~~pJQau;X6FYUYiX=%OG(ediTy!CNF%fe~R8LbLMbd2sw}4#7`_KXruj=koRCR zM}nA6qBU{xN|am9+%f>e-2`<5jybz@jx?3bcu_WsQA==H{$&fup9q?~gFd0cDdptl zH+q9ZPjZ9J{WmQs^R44>8|7#aGOBH@I5>H)PsN8YVmCm@uK$BH8Z(#cKxD32aAf+m z@JWXp7{D9OG0wk5@?PM&pnYlX+;Gl#WB$Vj8BGTEwUT%;Rx02!_;N&FPq9;fM6$u*Z#%nW;LsF(DUGS2lSEJh^4jK)3Eag; z9vSF1X3lsq5hm7p&Ecu?CDxh(N%8#5tP_qWo z8uSS%T4r{A=2>u3&_*&?6a`3bKCn@}23WVH4;w(<$L=Ros*iH=*NZKDox4i zp|SJ{q)?PEu|7ndA>Dpfpt;P*LxT9D&sm(7$9;eqWZ+YJ+bTeVFZjL4;V|Lz_octgXEQLL)ysH+*yYk-FdT^0 zABpz(^LiOcSrPNONfk~JU}yUH(@{dbKAh%e5!cCUu_9V(Y+0EM3C9@eIGaCtLn5!@uG@*MWn@2e7wf_niJg zmW5*~se&#EhAV*S#5CGuJOy|YHpsq<(w#AbqOP157mnm~pKGSy(F4hf2j5myutd1D z%GBblC*Ic{i}+2rQWgwr{SLuI*7{X$qITsc;(vgxj_lcZmh z0ZLnVS3x^J-(^#Ir&kR$5!k<1h$7aswR(Q^;W({qW}@D>_0!Ly1agoU6tqv53$8gF z`l6tClXn|CN8PPA?FN$&s?eD+u|3hJI#t|0#R5w+<_JGr&-Js^Eby~8 zOxV2UBPT+~7JKx2)O++*LNG|V(mYh8VhU5ppgYRBzd&z);i@VYFTTCdNUgGD#CA`oV?WubYH+VzZ|UR#T6*y2F2WnlAvf)SK0d+12R=XNHh0D z3H^hNAW1>4qso+3BG@tU}0=@$IsMECMX!a6f@9a>@c z467ylJuVbKfUE1#+FucCFRV&UxAX{_j@hgzPF=1;M*c`c=n>VWe>V<*OwX>m%hOZek0QY<@i*mPY%Jg@@|Z>0p+F(KqfCzW-$vQF zE*Tpd8^u!uHWWh;yP*XY{jdGJ(7N7JD zl)AkgjPoTHx|kG^L=cO2e*=RXm%X1=a_GOV5!zAt1&6MG&j{&*V%-}((~cI5^85br z4v>!jJcb7?R`_6(4#xN3Uj|P?AUwp9?|6VU2Y>edzx$u^Ip?R~c9g2_r7v-Ddgt6> zQ$-W>2}{e%ctK4>v2N=h6rP&C)oe<@;aH0t&&$n@-pJxhZe+e-iu~>X4+N`(K;(Ma zC0_{YPwh~b85Ejzeya#jT_Ub)7D$k~Aa$Q>=EMijIl>s+pZiT@(N&8TXe?$`B{JX) zswX+Q*&R(CoCTRHiIJRqVeW^h320_f(bCVf9Lol$hz8nL-Qnz=qO_{G6~;sUTRj=4 z$A^1(^Ky|Ja~4&G;!Q1UjB70jwBdCzSax=$%eU};OEQJ{FXh#r>axW147tC<6U2?1 zqs#=rPbdp(_(CJbs`I{AydOJSTtzx6T40>e@5S8UHy?IbZ}N}G z=n(c8E44#?t8c7oG-}f-QBuFbC|u#*OZ&y4aUwYE$(m9?fJBvhh8%A1{H?s4oY6wV zj6iP9$|8e%kS+3?TQ-N>RQd487jcU}_r4pKHSq=^N;9JqnAJb;f zmAYl@Bz{A;iws(fO{5u{Ix4^%9D+0_HMq0of#yI!szIFtpRdR+?L~UK`pVJ98e&s% zI-~i6hIwTh8!63j&0+_Y5G)&-73q~?z{{%FH9ya7F;P=h{fW2esmIOwlH6`dRYyu2 zHLfbx&S9mV*2Ksj5!j}^<`Nm|BI4JCru11`KiJv75A4MYA{g3C9Do+&Ol;L+-ETnb zd>T3bOG0DQzjzlO7x1Nnz<;Lv<|=h9^2XMaW4jT76MAGf@u**?jlDl8kkMz#is<=CA5e>)WQ^h{BrNN1?KXoEjA;4eg_7bN4~aR0>mOz5*@zsRY|` z23%o3Qs>97YD_hku+Bf4+Ji3FXq4OfO?!$Ldt|?n| z^H8!hOb{}63ypFoVt2mRaS#wQYkfJR!+|YrmYJKSCjmLNII4glc}4ktaZ%MCmkuK7 zuA9`m8W16e901=EZQqx5>IYVqEp~%Z%%b4rt7>w|tE%VqWM7s|zi97On#6bM>lMmIPE4z@Tp>-Uq`F9j%-HsB6Lo3?vJ3?{bA1ZxUAXR+_^PGCEr zqTFW25|`KtjJSsvYTOBi)aJBSuSsy`x^1S6RZUMGAngMkRUIAe@!k|itGR7#y7b3P z==&ode!rztyQjJ;FstJxVS~N|U+iPD96hlk54px4z3jjr;V^e=yyW=nyzQ$W%e&vx zE{H=@6dG*5BOPDw-*}{xSe3H(91$~CjqR+qtF8YoqyoAJF3F`8gQ_X$Zp0{I8GN{CucTUW zp-)U<;{Gl5{&nRyo0j({LcgFcMF?1I92cDQebzvdXt@lEdx#nROqd*XB`tA44x5p8 zrinF>cR-Of`)kze1AK;)kKr_YHl=&oPW;Gb<+PLZ9YN?6{<*>aERerKK>-w~6 zMjN&~j6}C_K_EY{Nf*T+AgSIDtpGfvG{>Y99KQ3zg-iT)-WKDM&bO{!O^9?wavc#NBcxJrEtA~11 z;o-zaq{Pw5RD36+BVE-PP>i=*hek6&YO~XHGn`@7$`xCa8uO=KBt?k9@k%83%VJsF z+C{R(8uyLyL3d*&l*4XPIV+xNtY&$KYk^2;Q6;GBH%xxU@{8CL?wHcFJ=al1=Nxde zYM%0V=d@O*@Kw%*8TD&VU8_WrYIH3`YWeJ)pMJ4H)@s{sk)*~r;4+BMO^kyRSs8th z4#8nIQ@OKPW?Y&T^0>9DL%m`pDCOQh?B(#in4*oqH_1XA``WglK9ytb)zh9S%gZ}r z2%v>H ze}U(?fu#i7h-y&mRs1o&_S3~1lX*eLQ#cW8?B;mqMdHk(#@fjax`7lrV0=g8@Cmo5 zQO;0GK;`y#z>{*fPyqy)eFq@k3*|u|>yJPk>H+cbP>*a|)GB_tPrkG)0N;Ok&$Cq# zvX3=xL=&Sjb^h^f7*DI+;uyTM*HFnF7piI7dV!#doodQQPjD8j7e1VO;-f*1m2=$S zlixVGCE5>OGRCVfgbCwnaBn!)FbfaP&GeIDulW~Sk01oERjmSTbqb0Cp*4oqI%1t! z{A1D~DU{D7EiBKm*W(XJG4P!*pO$vOTuaQ)QFxQb+ewGIm2m?2e*dQ{W$W30*F*4n zl8vl=hquq`ih60~9xFf>t8es8j2Y-WU38$e4CJFg8iar8GN@`HqBdY-%Lu!ImP=XZ zxh)~ts`)+x7|Lm!-qp)EX^`mr!;jgwz$)rZPM&VxOTha8R(<_`Y|RxZqx91LvGWwG zt!*kWm1iEyh_6PGeUG*YWtR|S{JDE%LG+eM3RTp#4X<47ypwZx_{@5w=?Hfw#`-79 zstZ-{&wpy;6uQ-_CRj>VQ4x7TDVS#}A zuJ#*b;!uUGKieyZbu|)4bDMJ^@ZUloYZeuy0o}FWSbd-}0jH%#O9KdEdh6Ib1R}I5 zJ~b}xR;BV(fGdu5fcPV84XRhy{=du1bs;z+6q%#>lg^3T+bwHnz}ZJ#JcW z7*X}e&Z(VeHfqPj1l%HVqp#}};YP@-51sTV%mc;G$(+Bv{nYznb1-Q^o>b}CKCX=t zVWw`Ez2Xh1`(Zcm=FJ(*{z&hMp8}iFI|Toml(o+f+r=)~l}n)GCnGe2`H4SKF~51%XMt zusfY{wJ4M4XQRim6&g0PGbp;$kN#5sJ?pyJx#*agtur-Y-T$Rp4dvb=TSj;8VyF?6 z{UkvGhuhq_k?^HmqWy$COZaof4Hro8SLrqQapPw&vt9>dRK`}1tJ$L*#CKdNGB_3qF33XMb zeocNPbJN``{MJ@TA2FS7rPVhVR)_LS`WqX$yJ3QPf?Yk&CUUV${Ec>OOyHe$P!g!2 zm_T$+D32{LNP&-N@&Esy>2YCaoCCL9_tT)-Jn4JsDs6uH>qCvtl;?M`b70_3smSrf zeoUa)iIvIcWF3pT3Q)~dk;4=A-p$3yXz1mEUssN?h1dGsGkr?_Kd@@Y(Rze;FHsY; zXl)*L|7GuJ!yyGZI_#rUD6wr6{N}U8{mZ|;0&nEmb=rCNm9pnuN47G!dT4q3K%-Zj z;e3e6>a2U1FI*9A%?sUO$PN zsEK7kJ59ZO(=a;LG`u*Q2(luU22K6u3a5QVPd8G#44X5V_L4?))YbeirG8Tha%H^P zziYBi5PTwN6;^?lysr`O%tG%e0~BD6S9=ZqGE_3WXDDFpPT@fyw~M#($0nz3pmx0h zC%G5YZLCdwgXX$h=#4|FjzcAVB%=paB`+o{WCh)mT@#z{QB*4RDybkL#9O`}no?@I zwBEKj7!cA<2Vfe0;hol>rjnkNzLt*2n9g8_1m~~-HAmP(MQMoymKh&PMxil%`i#NeIdw#LB%|Y$9$jr!}!D!ECo4rxJ+J(fH$ct0O( z+QA-a4`$EYN!H722K1d|dTB5$R~%d{uPIjn0x{B6PSss^d8*AzuM#^?n4UMWTV-d@ zH%hZmsdRiC8JB0Td)tD4NN+8{H!-x2ff58lxSGm<7eyovDAM7Wf+gZpbRMoWhBn0KGJ6&8Ynk+9 z)3^~QnZ#&!1W_1`Gk{dP^IXYCbIHe9(fbK00dta^HtwGpd`!GSLXI-4NK&Hw9?Zk*C`bdD950vh|&?-P+{1TM!cxo5P!QBBM`ubnb)_k|jIC>MQ zf2obdHlLI<{V5T|5r8uOwkY%lQa}HH5TzePNazteGgXOjoTE^RSd`O&h5|l%^N&*{h)HPJ8Q3Udc-Ye4&Dz2OP2r5Eugh1) z0;Gu|9#y>4;Vdkr-` zn*B>Jle&dEpyj(_U~W#`KFN7^FJ}aMTKuN7x+~{VwNGgp{&Vk+_Fx?1z640xFX(t1 z@TYE)f^IAI$*I{$;swrSg%b^f$?=6%B;T>vu~=qmftj@ zdxcvESVz>SnRDsPfun?UA${!rsvYMx|o@vjjYb5^JklPFwTZU zQrDfGodx7Ak5htltg6NHmtpPg*~)H<+xv=dmlNkium{*LJWu(Cny+opP?Fbz7aO<6 zfz`D?=i6)WAWWGk-^|kIplEa z-$aEwDb&^c_GFL6MnR>IUR}DgS}hIwmxJ4CLsm1fHsLDS+od~k9;SxSdqSp$tT}fA zM~dOSCrmt;PsXJb4T~wi)gJL&9n7lGwS!fqElP;hnHi4?G5_4cMRUz zetDfjh@IDbuSeLUs#@uJPlPa&vs(O4;ZmzvgTlByga-X*C9)H=k>d>7IwG4SmQ?R` z&Fyz+I9;uu+Z0t)Tr92SBSY+)jQ9DQ0n?5DXAX{E} zb=?$HfPTb_blv_i*}+1#@0OE}NPB&Kj*L~C0uiwii#&$}ExX%vu z9_GC6GfSnuflw6F81+VA?DDOl@b>-6YlS^Ctm7);_G3@p|#wXYMYBvt1gW6+vAybKkE zP+DmhPD~UNJ|t%y+Ss1saG8tf@WYRp^%AG>GXV+=GN@+BL1k_I9^6FkhG-nRwi}{> z8<9fH89>zdGvzglPKI@>`_&4cwyv^Z=~+%w%C@dJ-!yYL*{B|Duy|s4pRgnx7ECUE z^Ts(d&Z|M<)rZlvO5rM?BP{{yTbOATc%4PI`Lp!LXD=`MEzml`^o$zwxHxexBusFX zM?eeyBJbtMNa4A+Qjz>MWp(#8{x z)FS^Iw}uqpFAWw)y~bCP!H>X%0R^z7Re+ARk7NBJpqh;8g~d_jnWC={-<7pI*`a&9 zW#~@J=`k^zazxYwuTC#w&+6lG5sIeY+K-}|<)&mtVMO_|rmZ zO%z#(FiCa&7(~s6^nqbZ-a>O}cy1@1NK@(EXeqaslyMC?k$BXIkFSIKo5yUc53kQ^ zipsW;0QTMbYwJ%i0V(6GWQm%Qx__q@|KO6)d~>Pk$K$YNt{{OUw1e2G$8|)lW@h1S z7y7kf2fR=(-@ctzt6yAH)FGm-OAtoTS^6^uOAqHqXz?bp%(N|RIXZ@1mZb(pUKc%U z8l#G{Nx^YU2viY801ihh${_?RmuLd4lR|^{9F?NqYL1Ls?HNA;Zuayj#Pc;!l|!`6 z2$4%1U8`IGsN&=L{)W7^7i7YAOd5HZ{9k~$jHPZ z&nde%pT+JOzT~V!0gxf$cqul$n9eK>=a^MZ2fY48o;S*~-G95+%vUV!ql@HBf%Rwu zS*I&KSZ<9>#%%bx8d5e|Pwm#ROBxF%Y8pMTBFBStnp7~>iION@h8)1t-#ohi(2CUD zA1Q%LPWVsI9UYwMZt3&1aI?rOF*plE>MAOJQP0vlFzz?V`+mkGs(Pz~ zU0qfpM$8ziJbx*G}UPU-G$5u`&Jq(n-jyFogoySrN&HhgQV=e+0K z_ul*O+yC6`XFY4pHP@VDjyaaWax&sb2)GD;{q+};#A^|Szy5ku^4DK5EbtG(H!nJ* zr~dlu-Cq(Sf=aGBd-HIv&yDWjjy`{RZiYaO5cs$+bz%NqM)a}hg9mt3ZSRSxLx?}W zXNjVIjh1y0G4ePI9i9L&n1YHGUIISjg@BN|&CmORrewWD7w7Wn7s+&si$C2?q!-*= zjL*H`4j~Kim)Ry8&(NTsD3p_!%eO9MspuP&A1T(SE)_>H>!-`04hQq0Lpey-W{OPB#Vx&^FkoR~n z)o|9&=BR7*Y&W~BV^+gxOfmaHC7YI^i_+>D7D$YV(UtrB;)RJ`aC%&7pw$=BWtA2r zzggIeNKZx1?wa?;r43)#@Y2A~yW{W?{FBso^8NC*cP#vN>cz61_@n5+(6dV$cGo}s zJ26;7*G0(}kDx{=T9YI0ALtP$U9<38!$0QIGiHM!2{oeqGiCC?hk80Xf(qv69hWR_ zg|ch#b3DN>)lUl7;a3qpb)0;OwsD0TS=F8jbz_r;>DbH+r}jiBy&J8@jlMm*r#hbO z|FM<~fuP5bq{OT_o--SiXPgh%QLIU>ChYy~9{(u~XBW@BocU^YO-u19xatM>-QGBw&UyNm;zgq^e=ibv z6qcPJF>N7hof+?OJ9?&gBwJOy-Liyoftua^Or?gDkdRQL`sm962-tpb=9boDBZ;yn- zaanCq?fgfmQ>?o`k|5!-Of`B`o3_NXI+@E(9N~8eyMrMc+#LKn*{o)Q*p++dWl}hf zPe)}ljkbm|W`@@`ole$zOw!zPB;%<4V39`Zg58f=;P@e@ik6=@!`T;V^x9x84d#Z@ zR*t^sOmTcjJx*aV=(MVycV6_m2yP1q3|y552AI64b=+2{ww~XaDAX)B{vi=Vkv-K! z=vIK3TXiO&NoKs+`{qBke(Wnp<8@P{T|ZRzw&ndx#T=yqwd32XpG-_lan#D6*lh^U zt1KoD7Ca7lop#26sf(NMu7`%??5Ns1La`V^tV&NO+2m}RA#4x7PnVmZak^g|gk!eT zy+Ga1%2r;<$`lJ1(rPL8xHu5~6cQRbsw*9Gz!?(Ab9>aLr>6&Yt>ZkJTuQpW@oFQv zJ1OV`nDa;k1%Gjs)oky)$l2~B3T10&B9j5N($}F<1940K(;;E6oAWm>2flwwYn^ai z;Rt#Uxw+^{tS}!(D6h3!6-yx~m0K(XF9a6nwp|jiw=Xj-b>cly!;!Jt^{o=?pNO0N zI}VY<3fZG!JreTL65OAwMNe9;nze2#0;|E~%mRm?+gA;eDc>OHyjxfu;>4psTK6W6 zM;-s0Y&zcx@r>SCSFv(_yslp3M?ix#Cqg7+O47peo$DgTl%5Q4)&rSsn%kKq@@lB=B{bWtTtNs@M4TH{s zO130M)CYR)x-8b-!Kd@>G~UdlLNrGIbHxt*O%0>$BZT?Ut67*9_y|l)0UDVz+*7 zB-^lAPBHTE+}<2EH*e=8M-cLwbHr9@=P6_(6L1AZCXpyi$L&M?xT6rr9W z31X;gPmy>eA@=OSe0`{P1WG}nVq(N*`5@oyXFFe` zJnYg&K5y4WaC31uxxl=0d6uQ+VSa-WE8c%}MEajIc;;JTv)BYLbj|QakoRgWX2t_q zzMF)h@pR+|`(l`A^Eo@Bv_tE=2QWj0P_N+gzI7eVc@yRHk*i(&1l0^RJk8^vc5BOY zH$y7(RCT1zX;-`68E0mF)71UgzWVd$&(PS(YCe|8<@8N=xt@G|Guvs@Cnj8_-sMni zb!R-kH2h=0zSV41Fmz?xFD=7O)YPzrh`Cm`SQ)bmVKL2kl08JJCz8^cH z|82|vD_^v43vf7i_+Kz}K8!E^8~FTAycuasm?fT-f8z~o_|)ZG8aIX{ed4j%F8xw9 zTFlT6{W!ZGDT}1ghkAz#jb|h~G(XCfvE#08Qrm? zzH$t&Xc#Ej`T3jwf;0RxMyVQAL3pW9Cl^k>k=qlibQ&n^(wVPwIwSd}-w|SGcWf_9 zX=rS0HD9+6vRT9Z-OYMq#HemsMiB@tPtYl5c4&!0q~mx{H`bQ;R8LNxK2t2yUs1?3 zh_RFY1rCV7dyL(1){TF}oZU3P7)LX~Rl+I!SS)jA#=} z?c)u}eZqYO&T~68trnbwzz@ zM>>K^g1Em&zFb$x9@F}`V2|f&=@*jq&t}H#S7YP80?#y4Y@w&j`5O#Ywa&+xNV(;b-4OQ44r3`l^SE{081DVKM5V(e3T;Pix=h~al2-w4%ml6oP&ac_ZJ#HKyJ4+%=&Q$xiK*`oY_9y zPC@pc=Dd3C?`ic5kawf4IJNd$Ucmbg^85?~Na353#G5zVK6gSN5HLhSZ&?{t+djgS zN-mmG4KL5t{*2^3Pqa(VCUjl$Rm^P-Za!DDCs- zw_ZMl^Mk%>*)}ZC&y9_Y?l<}GnGS}=f$x6xNtJ7svY4x}iZJacx3PpkOF8GQxuoL?+1TNRFfN!3>X~ zcr$_Pak`apSX_C-iJHH6_=(k`YC@;pdH+o^8zp7#-h6$rpdYNp&E+w=B>`NL)#iZq z#hgRr1c&=6wr1)Z&Ap1j6iz9N0&uiOviqK)$2^2V!B+Tk$D#9mTOg<_Em-2&BD3T# z-w|zH!I3g`Goz!K75M5UWdZ>H zIlh*6f*$c)wM}!p6@b)qkfPjlZ;jbXy*9BzZHrR}VwLGd<$7nULdf2*zh3d78v1ip8@z`iZWcii(-^NKTw2cT_b2Q*xNfXQ(9Q5TA((3%JJo!YVqA# zjBEq}H$Ch4r4z-qb(O|m#cG3wftXlM6Tb}g#RW3*LR8u9L-G|*Qtw~;7v)Eauj!qj zOe`{xC!ZM*Z?&hi-WwMaqu8E#x<5V5Ig@d^AAmkR1F$w-A>{Vzsm4vM!)E0<_d!i& z_iAD^_pWA0!wI$WH`8z?rcw>==-eWY;e=)NKeek?P72KO$vVyHbf-6+T8SKwWO{4_ z5ej;^uP>aVS2&YIGtJAF>K2oCbB}krh*Yus=KHJCid(n5Vg4R~kx6+Kv*hFqamJ)BIBE!NE zk&uuO*WSjv>3w7x!?s1N=fSG7jYy&2giQejWon!QvFC9IR^{7QdaWY0ZHY{a76bq! z)8i6(U+NVeS5E5GyB?3^DJ};zlbdqLfI6x|+Yb(9V!@Zw?c{kO1Z)Q){8U8n?gBKyU{U{k@-GW@hH-$jHgb$#WGP zELa@j@CRKb21iVfPa13^BuhiMp&|63mSEvzq7k=^Pr#>?+OT*$s<8@y5kg11#x>+@6 z6PlG`{8B1fWrlf89kw6$XI(x=Hu+5eieW^B!V=(G%RNzu-Khss?#G_gP>=O%{?4!C zDEwiQRmZkh4TL}9d~KV29@)!$pzpjDW)6GSi9kkyk_nQQ?^&tcc)z`s9s(oU$)0UQ z@7FyP4v-`S9?#=Q%Pha% zT+yj*zMt6mk*r#*(`Y{aO_t}l{hM;WqJl!@K#dY~+D5)da!S{A@7^}CZE=KQi1nZT z^v^Tf2H@CpK5y=+;=5o*h%4UaSK8izcYvgE3pqjbUrPbjG4(wHP$QPxl_lYE>*Kp9 zf?Scl(!jm%L3(p*En(mj5y3_uuf8sy2rmt{*==NG@f`#ep2sj5fjvDv<36u;mRkJQ z`Jgkf{orHTc4ub4LBh?bkInAJC@d@td@YQ|NX6|r#lz7SPJ8ufTwCCWvMmBz6L&w; z@1;|@_K%jydU{^Ie3=L0lle?VUOX&~@;Aq2p|D%3$c-|A8Y|Ve7)`nriND8$fq}Ww z5n+ER{V2!JVXdr;73#2Q?|p{~&87z{HU?5D`P)Z1K|Z5(dF9Pz3hH$GCA%T?%y9&xu$ zgTu#j{HWfynRSmmo$5;G#S@FXQjzgMOmBgNrFRk(JX6Z+m$$Y)0Q(b&LUgwrNaTI9 zUk%6t@zALb^;famzbuXbD^$&9zxFlfP4a^CtQGs5ZQC36dB-jS7rQ=crPyfnu0 z$0t|1;{ZHs*VAEfVIiTg`lo%tl;q#E4tz=b{)vcJyfc1Z%H}J?+En)&s9i zqplwa)efoi2^FU8)H2(TA-kNvIyftjf=J`d``4Yb;z{p{a?4#8zZiyVC2jteRnR7| z+8ItMo%q(YU4llXpvGxerI4JRy&51zfZq&~bi!0z=A9<%51VM3h{sM5)~S2&^=>UD ziy*B}8M^lc1qDGNmG;VHpgW3;i58E|lJQg?VUvoNx6$qAMkLQkke!R(cDhpOH?@m* zkma)GYPCO>e)tQ07(ltSd;wQ&EF-5&>22{<9ezA;42ItTuOUFh`+`i!6J!Jd4jB}d@mR<*^YQGIg{OcX z1`Q&Id`_3R0YLG|tQI+y1zNQypdz#Z8GC)eNd7vXxlyQAl383l0>4FlE$fBx8{O9d z0em3`2!V(=3YF%{s|T(2N5S371#mNmmOeJ6|8~4;1b^>3X)19(?s}F`zj4a5bTsqo zak#?p>NAzw$d}vG6O4IkW$9*_IX_s)X~lYa6zOxnHZM%Q!KoDGO!%B-NIlyY3kR1U z{)LS|UiV`GBre+OO0wG>5?6nnhj)24p(DyK=ZyfHW1$Pz7C=RJvz&X$g6nNg7ttUT z6u#UR*bK5j5WcS083uEI^W7PPWwq5T8>P4xD<%P;3<8N&0Rsilc4(k(t^Inc%YvX3 zfZ&+)T3-p!DFM!lz_ml@b8l)zCKHcn*i7>Pr#T!AYlF8id7##T7qh$lepS!6ju1fjOaEu-hjTzTTv5ECp;Oe+-;Z1h2@*x*US$FC~2{xFQ}}-|SD{*AZY8zc8U@cT}!Uc$AN_*P!NR z^vOxkEMMLaKj_=y;`OdtpUH$yY7q~w%KRm-q}B6rgW6B9$GZr9a5W2`3M-U_1Km@R z`G)vLD~tW~glXu|t4xQ5Zp`?Rs3*l3MBXPRCT2?|=-=e!rg4GD2`aKuKn0r*FPC-^ zhK7fyG8w>DMHvoFl^S#fAmOdZqf}RY` zjQUlaxLKv60GVIUfqzWlzYMIC1Tc0s+Lxl^+@!a zt^=-j&o%ki2%bM~*>+UPG-Wzh!!)sYnP*dRHqJaFIq!I7y~XHxX=@q8PBoCuPc#eA z?DG~fR#uGgpBq2Q&uqQS!g<|KT@M>CtedVjo?_8&&8{Os*ksIueC$K-d@mL}Y(S-# z`Q^(V(S&!LVT2suraVBUA-#wef`C-%Njf2Brg{lzQkR1{b(R^Q-fOE`6MK96T$xk= zrn&4ORfKAWCO0r1;4q`$u}POUWT;xO_ZfsKjo2M%ID||SCq~4X$v)3P@iHDrG21Fw zoRC~p=hr&aKt3=s?geka)I#kNwTtL0TieOkJBU{{wPP_^0wGJJqcz5sC|md3PGwfw((I z7Ai&V2**yWCz(5^DnxO~#d8Z?Gb>9l`%vJ6&4z!K@8^7-X#8T-%F^?E+60C7bO_Yx zMTHv-It`Z~psRpnP-+WWNGEN9NO%E_pelUU+)DsWB};GnOn86Lcb-ZPq;QUc^Z|k; z*`tuiBJEoH$4MnQ+3ivZ*PvO(fjaz{WcsuuN0mxdVgvpI{#1rA9Dg6tTdfLHv=w!8 zbMx1)y8$2IE4Ih%1yPB;Gbi%7JqA4>8e_k=Tq-%dOu?_M=`P$T8z=yh_{!lM%g}4i5`PJ$eE78haJHbw<|CiDglN}m=QcOOBE5px`a+6KQes22+ z(+zw6yoLDNiiSP%ExF%bIAo1q9URK+er`fj!mIXA8Us_fwal}teR=Vc zJ3x`2uXoBYJwD`l4&f7&LQ^kfrq0211{SU4{Eox87D@T4s^ zyp#fY5}B8giHXfjg&AO{AlGNfOa=k2n{-n2qYprZc=CK5A3oo^h@R;pFyF@VhDPP; zZ3bB7v!`>np6ipgPB2(x7bI8?Z33^|e}j)p&(CB=*Em95eUZLH)13O8@;Se1)R(=S zs1y77^h`I!^2`oJY(+PUUZu##ducYYHWL~y!5v!#jXSg49kb`{+&pMx5ZcA5gAH_P6g(MxJLI%bw-m-d`1-m2@=nEUx{oo#GDM^ly6vv6;e>c@lkneNV7Hc4yzO zZa5=&?RiRu8#Obc#c$i%N2qnsY5p_!2$T|fmczYVTCUGkw1_N4f;UAfvmNJjjbrJ4 z6M6jNH~ISpbc?I^^TvUMrX2N6KQqb3QG&N;JA`u%*$6R{P`$VyU#*MzvqW^Ns_s!g zr^w2&b1|sEWZjV<^D(roUr~T+6GKx7?_BnkG{STsT3bzz9}X_=xBL2?0(;v37I$A# zU`S~1wY?N$V`BHQj@Q!f(<$nv^D z_EFe3pA2in`OobX>XF;+zo+@TD8@T@P=-PlU>5`TikX?2i)*Gv!8lG_kCc%hg)AYi z@Q?ct!IQAd;xy=JTQ5w@)|MvQA?=vBZA)7c#{~z@@xO*pL}qTr?bcI=)9S*mF2S5t z@ZHd*lN5~Jd~!biNX=Vhy_&1LERMwR;@fQTpqwtXC9k>}tArV&fY+ZJ7<>y>(ZcRO)>L1!Zb$ZaEd{rbLs8{g2L{?NB_4D()ifFfIkbdyH?tU|k^DE)X z5BQ?`QlExho7H`Xcj^c}9k=~hcdYo4i7c2r?|gT%`D=5N*;TUTD$E!r9Fb|A#i4}L zYP?RTGpdiW=K$YXTx0FcxYhnEUmv1x-nd5@B)#1~cBDQ`joW`YIb5D-#EK~lXKhmQ zaauX?j2ZQ1oU~_O&0XEF3C1pc(VyEyHfDxR4%i84LNO8^Qc_yl{u&+Q+A7A!iSTaD z9O6bw=f5g&GH}vaXt@@3KZnieTaI0f5n?~fzH`^c8ozo}*#Ynnr^n3|1xixQ{1j5D z+}=);w3pXOK+#S@EG)jN%lz1z?Z#eLLo~G18gL4F1rp=cOH4=6*6^ETOo=+-GW|Mi*48lbIqe_q8Z^Nw|KXW_Gdq%v_`j?bDfh{ju~{IPBRwcRV)r!j%<7BFnPQV# zUY2p5&o}R|=Ih)Yv?A->!UoR18AV#@vq+3|9?x^Q-Qoy-xy(Wri!-H}ABrmqZwRB4 zi;Y`BMN_Q9$0O}^pL>493O8R-i4P>(yI8n7Swt6d+%pffb-?R zW5Ei&9;8leCfC;%ID%8m1ji+RF1+W6It;e+5t-j{3zc5M+JmvSUJhVQ4h{}3E-pH{ z@VvIi9|Sw)48Ak%Vc(LrJ=y%~uRI5JPu-J18Z&gTziHk8 z-;Z-of2)+D`WR88J-{!akJ#h<-+YN37wU%Ef${C{)(0HuHvaGTR%K=7h>M5?1O&js z!X6mJ6)*;1ON3F1DHEELk}kG@Wp_+IBuQ{7D5GLm-#$67Qq+$iB_mTLNY31wdw&!Z zw6wIewY61IQPI%A^Fg_+6M;$Z63OdmqNsA;Hee+b;*S4Y6tR-*ASizmMj2Jhlhtd;W*@e z1IAWaF9UDyJAgEN)33$islr}~X{J3SB|YqfP66v-#%LcmX5Y5`G<1~F4|btpEJ>L| zLqio6ECz>P5Tc6hRy)1Dy)W}3eL$HgNanqBT~_eHuG6&d-!pNvcI(oQ%hIYES>NAx zoc@#v+U+Y%Dt$EKj43)SWk>p{oME`1W)`)#TIPakRti6O<%tbva3#3-j>1tx9#G5kB+_y}g}%7C?^$*Q#D_Yz64l&!4~7 zWVU}W#Ky%nw=}}YwJdZ@y$n1WQw;BdFbY}^mU?+`mzvwm)g1djK@Tf5QjyWh@H4u6 zo~~kFzl}eQtDxz0v?Lhy7rW)uJEYs^SE&0TZN8|&zW1oCHVd~=;)F~G&gIne!LL&P z*=8_RP;UZiqj*l|8Tk|c7)sfNdY9tTO2hRP0X64bntHMunQ4t}u49yz0Wa&_b7%eW zgLYv_1tUkUtfmJruqixlBSR6G6?n`Uzo(GxWfc|=In{l!>Pp<+`H@5zs7=i0_KlV6 z&`r1=i-;_QgRl`w1G6knIxDj&gHUCZ70{?1VbtWhf zdrD&gaF$3(M}Vc!kP;K?1PZbDouHqkr&-z{$7a;~yuxy-M6iJgMWSbM(dYVfdurgv zkNHNA3jpGQH#uJ(>6K#TYBsvF5|%mdYd}1%Fd1|Jp}-%y4^&MI>Sd4cl9H0tUdp6$ zIRWfH6SvitSXBswPf|3ZbxJA72_)`Cn$^}|qeJ#b&BQTtU*W40V$wQy2)3iCV>@w=nPZ}LWkwR*t}<%OG)@xAAC0U(GHkemz?t&;AR%_P>L0HdamE|jWs1qZpvcy{ z>0|I1&(|f299J2cy6Gmn2VIT3?cD4sou*rptA?t0m&cDE15T)$vs)&CL07B~5cyGV zA3uFOK24_%3l0`!;j&xt*AJG4SJiI}W#RBRw>(yppQ<+#&S~CGv3vFM!pfpT|vrgeDuc%o<$h(kHBO@cd?a0yK zW<`@-$C;?J+|dYHl&8^@X&%d*>KngzbL+^v>*l}$+l$S34h0=5+sN#a3G&da{|S*i z#1NYMIaO&n&1^|V1nPFhS)*&zLO`HJ0P4OSDc}YH>*XD%sYmJYpwHdUz3KAHN&kI7 zZhS5UV!0rMCr_TZEVyk#B}69&^@j^UngujqZT#q?qj4(R=${K&zD^~QX$or?CK>Ys zmF5+O3Sf(ww7v{8x;t$2=c$$ID<~*PN=ky`)_$M)B9amLeF0UINjGD&y-A_vn<8hb z(cl=AuRcM3M*lvd8Sj*B`r->q6a+)+*W)!S;)eQ)D_RyH&9Fc-Ck1-h+!|sLxG@Im z2o|~xzH?K#viy+Yl8a;;SUoaUIw|d(FdUln;ky%Li-hrfRkCH`4iKl`G|&cU)H@gI z_o%AP3?woMr^i+l1idqK9esHYXvE@>^&9FE2#|zX)Z05a*xdpnktDxK=L0OL{0$#o zJKO1`jxh_8{|WozmIp39#sd^t>V5^&=f%o1T&d26knIYxzP9%qzUwbl0>8lYRqPcz zp53FGPZrVLp+wO3qzp`S9#YQkJgt7ukp<-=Y%gsu_5aP%pYn?AbCSBLj&K2)tF2gzA z>v^vaXiR_7+Ly~grzDcQM}_NiLqKTJcMu7X9vlM6nAP|< zCs&bJ-DL!|*}rO=y^Fmyi@Vpg#l&F045a(qaRO>l_NznBkrhg)is)u-m1OXk~_xs1IT|^wV0;L6w(u4VNP4Z1+1l-OAy3K?ph=_>K zy`*JL+<%;>Q($I-pw{8Uj6Rb`s#qM#B+mh9L4Qy1sjuDnfW>MLL-sk*krc_o`P?6t2DtD-u+bIyqor5L_%CH5{-&S33 ziI4ws+S-5t;BJAq@aM-PVdC6a)iA% z0T&A^uoFmoO%Iotc~iGpS4q*X+E5fu?xQl0CZ z>Qsl)fo-$Vl>-1iox`B;pyJ_$dca`0U7wmkbRbNXRw4<&^>$pBez79dY!hMDUMM-EbIZ~IY6sIh>lLCvBno5 zKR#GIr%rPdlRuTnarI87f13}~8z;Q$MDVX15H@ba3!cK?y)}0PP3pM%^((J$A1Pbs z^kA7H6W{c|G*(GFAO*SvWCAw)W0d@G;0Z+K#)Ha{sCFB*o1c`6v~ZYYJ@swBzw_O> z!1QGA9i&CoX>k0-$Zhne+DzpyPL!V|)cd`E|Iy)NC}<~9>CgzvXx7@3$BU?)2FVWZ zEjAM+QFCxiu_PK98;zE zqW5l%nvFt+@2%bDm4`O{Okb5f#kAsL)|XHlKj`;efGH2=?C96`UYDpIjPosN z0DXQjadA9V(siZRrnh~EO>#BswyQlZ26;52v)r7V)5S+f{tK$u)!naSILqQnLuuQ( z9#=|J^{U{Wu9wC21P3)}a>BJ<-J!ik#;C(af9%Eub{+F4jclD)6Dqu-0+cmLy=lIc zDlNf;qB1N79m~0vle*R)0h-9{X`bxyb!GL9PZ1DuWK!Kh=$XDkOxui4%v37pwC6H7 zoGyoJLE*2&yv+w-nhEzf#!QYr0dh|vB4VA*1GAj*6-v~2S`BIH88bC^fa;0ikq|se zB&v@~2EGLl7{B%l4i4@lpe?4Ev#eQPyD15a9o~m3tASow)^j=Q0z-_JwAC{rWnd~t z7cV9?mDhZXikryjblQIX-bP4dO$7*J=#L`zILI}SpRKVnHYXan?d%^#2_&W}+OBn@ z(LP93TPszIz_MnXGp?DgIOMf|u&~fUExz$JjG0YJm;UblO;FIBxEpLM#$5)|O>WQ2 z_YJTcSmm^`jRc^~bf672rsexbLsa8v9H+nR-1_E&=2LcT>sQkOpATK`g7m_r07ZEWuH8p)pe7}T{KZa0^ZcRO> zv3_&MzOdjd*)MNsn6B z)Od1xcgWNj?ct+PP2#1lBF;TQG{8?){g!A!Rq4v^vO)qXFFFaviwy zm7J8C9{b5}mg^ObZqw>7LE-D~?{WGz{9`TM|V}b@mm!%bf zL~E~9M!afQX-{{14Qp6kx?jH1t6aj^d4e5kcvdOc#mDv4E>r;C>4utDmFp4jdZ6y2 zGER+*M4y7t0M$KiQ5EeIl~>9@OcDqYQ|D6-5<1TZ)SX*tbWHBpr2&QsOUWD zIlHq6>b(qGOH+185PXFwZGa69)o4Qj?_Au3|f z$}SQsX!a`fZV6MtL(cb*U%4?xEdm51{*+#mJ(D`1qi0NWo6{677W{OhF`)m@}E=7lL}qn{dDm3 zO>8|JRa{-Z4V*G<$L@4&-q@bJv&i)<~&jZ4cD+rH;{EPk$QQ}vB5_xa@T1z z!m%+}aopEbx!gVq9$vV@O#_SQ{9W}rU5;#I09!gU-&hYPlZOAwe2}l)cA?&uxOe;w=>pj8hf$>$#gB^Tm5S@*ks8BhN~_-SG9Q*VZcvq#rI^v)+D@?!j{QuJk*%1<1zdbR~> zcKzLv?r$e92jBf#m5H8P*dNOR;eUXy9LIme(X@lK{RGCSKZB-YbEgEsb%|+@aSzC7 zN2d?WuRY>>+Gj8b?=SLx)YtZs;!KCAVd2u|pOO0oUZ+9t%{cnG7q8~t{&^*P@INmE z95MZ$rht+LAf4O(xO5yQtk4PLpQM}(nhQLjmjI1~@@Akrfb!>r{QZc#@9q2dYbmFp zNvZ=mx*;;nTN$>;t_ZHAu3RS$&`^H@PlyhMdomxy{r&x6VNXy-Jc1-PmhX*- z2_Bxk<0?5nlDTcKnrrb|%Ig_S059qOQR_r3E%63m)C~*21%y|jS9AxPPjKLQXKE3} zn?;RX47=+UZ*KR?F{^z}!roa`eAYhLLp~Z?+mr$uxVACJg_?#C859&2?f1wHsh`1E zJ#&lC`!JZX&n zNSX_Of}5z@U&eFh%!umF!YR`8@xuCkEh(Oi{|T2zd&yHe(=MHhe*cr7zs&1kO#ly- z_j=182K+w8aKJV(!m%wyK_9vKy)g3_NUs_iu&VqaGbi=3LvXz7jq6h0O;Fdf9w>xa zZt}WWgBR3+{RLP-B)Zxm;{SX?5=iCeta!69UYT?|^LfZ)x@MN&&3OATc^C|U%>UTN zlDUTWoR4j(5XVEMn}B7-A$ZEwPFnRNH;3S#!6SS>_Ts=~$VLgrF6cfP_PHq#4a9-0 zYcm>LNQ%@{#kh-RcYH>1|I*ylmSb?U1DU`==H*Aqw;FYp%q_~ ztPfYxttS+-&EW&^`wCVloivcD5lo3BnvSOgIRhDwXb^{%S?{Pe6XneFaS4h0m%;s! zr|-Z&aKcvxG4A3}!}kNyn^CnBPrVTqF8eZ4r!EgCtt!Rb+J=xO-|Z{=z%EfTXWTh5 zUtK}3fz)!s3Q>dZAfG6*y!*8(yy&yG!BtfmcAU8;ok`=}$b$*@PfbFux{(v6JaLYg zvzNhEBJEqPS%C%**?`?tEMnOa=S8}oi-Z#V?G-wN@aWO69{TW~ulCY`-`B##asOTj zFT@1CQus7KBSs|Z$<+fYCvk(o%xY}uFmCBDdypmDY2(B>jO#=*zjH<_+JoD7n#2qwJ!8^ zZr{8u-mVTS;;6w$os~UwxwLofN`g7qnsbCi@eZ>^r==o6oa@cJN|{W5JU49h&CkUi zFeT>Kg+^-j%~ao`E{tTn%Dp3{{D^Sf%g<)Xk%3`pXIjaTrQw(r2F16i)S!n7wHs_e zvv80!mCo_#X95o^2tlj5hmW`C_gNPwv-9@vE?Bp9DlDHUc)9Ve_k|N=NYUADZ$I3) zS9m+DB%I)!{j)GeRMJD)2~LSWEysRxOiXhX=^7p z@~`en%wi4B-aqx$$D=cK8Dt5{rTE)gR=y<{AA{lTqlQc2y{E9xA(mEHRm1O{_c~zR zaS6HgZ+Tu+JCq(zEi~|=&W>Ugw4SeDKDYGYwl4DIN`i8vFMNH6a@&n{qB3Li=A%ds zW%hqo4{8Lt*gS*|Q(MmcKe6`bHvw1jmyJDAMCUio%vDj>h&D(VHsqq*RUkkN>)sz( z)q4vEdbI?W@-Eezfwj#v?Fv{1;$J`APp&3nOc{v%=Y=mev-fCp^0; z6Z5#fz#q2Q8%uvE96@(O{@1MHCM3-2!K|qu^o6rAg(rtYB*u2j=wWn&Z6a4uSR-#cU(!I`NRA;>mJ6?h)=g#yEX|AM34xU25}3^nViuJMIV-wu`Uq(KBe4xGW7ZX zJG<&&z)M{sko2pS?D$#xm0skxpdam)lsc3gcd)Ng^lMRbRk&vMWli_JqFvfx310w;o1;$&(;5+ zmGzGNhk9Z?O-9dY(+T(Hz8VEi^#$X^(+18>U4B3*A>leDV7m&BXdLY7ysxl-H6z*p zx)7-z$l@gpw#U8peHL*Vfk$7TUSfowOnagKK|OBARRU_!&B9ctI9#Qpn{5@k&De}p zeX5H<`?}=CX{!Ymg8H<2|LzUTC)id4pH#EiyhDd#uQK2#g=lD{$Du?^?-FQr<%Mzn zo@Uo9nC7ykaMX29zjko=zK76I%}W7D{d-fv`sKnbrKUe+LvJV+Y%8J^xJgykrdY_u z=DqBpT0l+j6PSHSwVVoZy82q`hjL}>Y(Q1xhL0wR= zwjNKWg$MsLF32JHa{IH_0IU!^Hx6Wc>4|LPQ47=uAI_RSDL3?C{6Gm1j2vE{e6W3$?z>1-wqNb}CN6yf=_j5*o3jD_~kM6wpy5cmCUS%AG z>U9?~0{;u!doP+C5vKM`rIOnLdf8Wg`+G0KE=@sM$wV~PTW41{AW;FB%L4GmOU){P zF}$Y{gT95__Y6ZtUCpBBDIAJ!!}nJ+zs6DjPW{xPP~R)<;~&_dzC<)_ zCs}bz!~o3&)EH_OdL85pZI*h(S@wV);%K*r;^80JYs@sa!a(B_bKeK(a}km3hZb}N zHETwRbox=2Vecm68!F;|mvCOa(9-MD8(Ic@VfL%URM9$N?#HY~_6G{TyzOaw|9?s$ zD25WgOSmupJ>+Yz4pEJO>6Hmz#uqP6C51v#NV_fGdNcK%jLm{uS;M_ts1b`rSw?yM z>)Oyc@U?n8T+RdPm2N6d(T|hgf0spmzC)SQPyE@P6x|^Ox0u=B?f?#_B%oeqbZfH{ zN|U`_`%&G-y2Oce48|Vx#ll2MDg;EwzT zWCVY}yaW#BsSn6)qQ?aW;&9I%LsVFi?oi)aR%fq^7_A_$kC7YH>+BbgB~mBM#Xzwy zfvYUBe@t#`Bq2Aw$&-_ZiR%5uJlp3?0C|oIxC*P1Q;mEoLmdQk7a$!FHB796!xXLW z<}N>ue2Ht2swoOByUD5?>}>1h51@{#r-_VEnz%FDlK?hYqX0o-V*>-9%MrWBw;0_W zy`N&^IRMvjl=Gm&5NV7H&)r{5QS`3FVn&sqqRQv2{Fo$Ll*TP#$T_~UZP~%xHjW!w z@73ZJBlx?;O9O20D))a#d&_{Twk>QJ0Ra^OK?S6{L0Y6yxfir&rOG8{O{90>-$jC zjBQNLneauGVel0>__U7uuD@=m&NIyf%dv{;uco$h6n3@)a_c6qBLvm9im<1066t&NZ&CamMPkAhKFW(1I+8PIA-}ElQ z#jbK`goIZvg_Vy!6x2jA3ybLXcaU7{Bv|C|@P1H9b@- z62oWHvGm4f`)Jr^Q+a{7K!v~VVbFricy`u9v9ljK4^@t3#aA>>8cjLy_Ro%6qu8+Q@OglKQX7n*Z(rLkje8C#u*I;*(bCz0Ua$nQ3mqg=-W}yKo*fk`3>i zNQIo?ryVxYm!+g^u{h1fr`HP%)y_Dk?an)PtbjpNJEEgextG7h@*m{vFauQtho!ZO z(nXer`vH~b&61F##VqV`$7lqwB8jQjnHUn5#O9zB z&zMWwO7Xv3=64rb%8Sj#PdM(S7fVqsFw`w};ho$?E^JVGYWI z^0V`g^9j-Egu@3hUwq)a&7k(8g6nEC3 z!-qT^ay#u+#?InT1ra%hxAPk8RU4Ual-kY~TV33TFz<}tG&?)Y_q6uPZ7e@{UVsQ4 z?IvAncQ@;Q3NOB6MOL()W>B7!#1M>G4Y?LS$WP1$11oDg^*}4rGx;oqZ33=80+r^t zO)^<0g$(K1aSAF+en-X`RkdJ2y?2ZgRp20t(lfvQ5O)t!qc9^ZCfi$K4nl|! zPvlE7AOGPiaIuh78-wx(%$qksS);zJjI3f`Z+j<=vj0D=QFnpRj3l5#Uf(&R5mX9{ z{V%_?MUE9g49?Z@Iv96Y7PEgp@mHd;c~ZMS*kPN0DwD}P#~6X>yZ7J@(rI2hK8OEJ zZ>;?(6ds*B2cMWwQ?I=8{-FMFRA&#h8wa>Hrd&&L@xN!#0Ckcr-^Z*~v4(YF-7^6kg8og>*(S^<@TIVm?DmCA2zEAH@U z+E24puX_s{BPgVmIyXaydW}68rHg#Qa(VfWVKn^+H~9o1soEOTDFLByR}$~?>4PUkgU%bk;1^Xvr2q8jcB+hnEK~f@O0fj1&^-r@EgH}H z%`FhA$ab|y;L=^Ux8D{Kg+=QNr5ND<>>6IAS4UPiYB#&yvQ6o%NK_7ac#7Og?b&X& zl-+M&-2OVBgXCpe4nJ4kaHO~nJ^@!$e6kt#7#;s?Sm*O8&R}qG;)y)J*Wh|xsPIR` zHnx=fOGgAQcdW}QUxs|jfZ$;+?i#nvUbSd9!MU`u!La=?j}0wtrZ>OQPfvZ!yCnSl zoJ{%6$3wy{_XPqN+IS?KIRlkWNJ!}-DfLkDWM;E5WdLR`L`A4UtymFrw@x}#Ix zXbr8HdDu?g`>S>7cv0NMe11=(2;f4b4nDHS@mKQd%Avx$C^HLtO)BKEyl?-uXm&*6x&f#p%lSH-#(gOCfXNvVyczxtr$QwK3hDR5$EPWD@D@){?iM_)bAPf)$^ zfP^^FCC&w9H0{ST&13G?Z9x6r{wxbgIV5*RC@9$3`M!=9vM{T@m}}FQ)n0)XZ?+jq zr_|LukJ;OMb5YXqa`UpSCn-ZG$c`~<6%#8-*I1YY(2N{+nIY$#ck6bBU$1sCYnv~eTnyP zwTjpGjk0)5?*CB-KA z=_ndzh#ieK|86^r>bAjWd7t^httfL2={uok=ff0B<)@&&-q6IYE9XKJw0%g&_|cG8 z=7ng{bbpb4$bGg!e|)ShAG5n zAKZ7uR>51DtP#BrrS1*+Qi2jNXi;cpU1fxZ*>)H?qFcFX$hTeUa!iLpvPLX0K6@XJ z@li|j61UYsww9HEq`5}XlY+H9_)m#Fw86dRiy5`eyOLN-+n z(K$UIZfV!)8q3S=KJax3bzgn$7GU=*{1)U~@os(!oMe9!ci)(uzFoU(^e`dzDB75Y zlZk9ss_xvJ8D2+aK^s9%mQnmSTmEl5~;^3hr6buoYYFOl-;Bc$|d}G zwQK&CtR@+BJ4{XO(GHvs_=J6GIh_eU4Ho4P2h}67yQBoc3YRJjD1wI^=;vB!DJd zX=uVhhfU6XI>U|@!O&u{8U7Q8TqDeWoY!Z0(7=yjd2#U>*qnGz;tFOzPglx$bq=`b z4B4BQjD|reKRP2EpBR5JDozSw+PnX8#cXA=A_Uk%Lu}HpdsC$x;7B;&dw6CaVhwRQ z8G2>6t#3nOq9d8MZ&sLaAiibSSGS9~&Hs+!zznsX%px$JubP2&fW>t~Y_uqQhP>Vz z3@Ds(A%GC>LMRR_&wgX-HzKwomjundNYPRg!c!uw-F8#xOt+A({%FP4cV{(_k+$?i zeyppGXFNz`m1&!L%!KkS!5+6GG3J~&>^fV!dO1;tyTe>0czJ1BZmBe}VYj!DWy6p|#GKFPNOf?v#Q*BZXs;Sr%ra7C`Q`jx@MRZSU8U3$G*#a66fY?l_4gdlpltjG@k-GO){x3!YtAdPj*@ z$x*E3+Dok7!=mx`kxVtM_Z#lsgnUUB!$LtpKAc*dvoT!5Gga+3nvW~-QH+S{fCU_Y z{BFga4X?==%m1DPlp36e>_+a3XCy@#jE8t|0|n*BK9)aLc|T@T*&cnWbO9dA6T$CF z2m_4s&*0Ht?&uQ!#J-QU4vw>jj<{Ae(ZL`4Xz-}JvHX9gwTUJ*#)<#E&4U$HGKZXYcWaC4O+5`k2MSb6xwVQH_4ZzX*do_2%&Nkp#`|)PKV94-Aym zo^bd0{LZ5Ntdn(Jb^9C0*wWm^#{whme@p!ok3KsiD@%V=6%(}#c=7l)Sl?YMRZ>b^ zObOwOwSxxifA&ONdBM(J=*F?-KO9D%G;}(?_0qy*_=|w9Ya6U?Ebin9LR*49I2%U~ z9jC1ES)M%v1x2ri*B9?a{Ua>+#!6VD{fkx2`&_MvDa{wua5B$@1Ca|C2fJb2N3C9o zugJ=8G`YckNdBT+7tBB$Vxs&Q!Sa7YjA}$+CUO2*LaGpYC#Y+2<&J)UUSB)cqaHFF zmg=oVoTSIa&ef^wRjpd1yKL68fqCs+bu~9tXLaB&!{+r*L&5?T)x7P@m$Au2w_EI< z@!JT#+DMLBAmQG$wG2+Ke=L~&!;$o)#^$^zLiHgi*uxas>lIr9}S0mSrjiYSF&ZWA7Z?4zkCb|i- z*spJmTL?;J8aA+nM6DDIyQYZPhnV`+)qKF$kF_5!#Le37w$0=hk_e1*k9C{2UmEI9YtV|JbIu#Y@Ut=wnzL zK3Ig+6t_>!I#)^Q3`F5|rqV1Wbt^prF`2r}Xb~F#A(6|_Ml+!^isk-^T^5tmn9djgg_ z+UtqOMO~70*0U)!5Hc z%-zl>E?Ov4$2+?_r>a)ouv%*7mu%MD-EGQup?e|vz{+; z2|`6&+8WdAjDJrZ5y!+VSZnVmOWo3m{7y?^Sm)5@r7&g9nW91wM)hM?UMey_`KfE= zFk$h;g~S+Dkf!|@?$TqKK-2Pv_Q${8mJLu#uaCRF?Oa-K)s=$p-xdhnpeC>qNJ>L) z%R~rg;&u#FzCU{{Sytn;({lxzw8kyNa(Baot>($YM^w%o z7z?v{%p7!bWQs!hPl@WFr?aPQ+YM7Yt%Vy#1k3X1kq2oandTy)wrBmWoP0CAoly(& zv5#@P2O+R&_2Rn;1}}A}5I9Nn?#eDHbvEVCzv6gH5f8LK$=a;^f|(W8hWG23Bf}t~ zuuVxX+{3Cz(5=tQZNiJRvaXpjpW^Z8MO88|s*$&r?6BZZR78tO72mJ!$ll2)-z>aR z-(DzD@3nEF^?kgi2B&C6NBPl!G~a#b62ddQ!9I&02a0pFYu?g5dw3r3TN#${$a25; znf&Nh|5VZ%F+D0ToRY+49R)?K;X6IvUcj30i{s`4bB_vZqVx8<>4qx%4htGC2a6wU zJww_%ch_`DaxdHCf&GVV_I`b8eN$2ux6G&-2L)v~=nkrpw)RrXV)XH`|8PYYfCeWw z={~e9y`i~sZ_@FK@v8CK-nHwCA!0czwXOYOb0~-hyqLwfko^xu&kXY1^Yak-x9+9o zmTSEDZX6Eaj&=s7LZm-;$A;*HV z60#y{V3L2@0r+PzdKiq~BmAGZ=EsQd3uT9&nJJua{=hIKxS^*vGh10>LQSUHXDKgG zZa_m#MLQ4n9V%wzslEH9ze=+rZ{_53%C^vI^Kd@Q>{KM(G`~@v*w6x>`3fjJ&45@G z8(3g(75i=u*pS>n*@*<83Lt`d!{Mnv$m`cE5LI>7w-kOc#Dfp5)0qioJ>G&W%COQ~ z*%^%}IL@S<)f#<<71Jv$F-ymld)8y=8E=jEDcbwss^^`;iG| zWTz-C>PZQZOvv}YxXYGBeCV}dLo0=ra~5jQ)%cg9ac2<~^3R7|neJ?I2}iGd){1Z^ zcrVC2l|I3Tit>x@8f~r~lw(Rj)B4-HI6R6>h6O!w;-WPwHXk&&Sa)-iVIX~!U^HXQ zMk4B3)Rp(&B&@p|l3f3ylBnz8ebb<1ewDL_t-_Q6jmx%jce%lOt5^G@3d7m+IYR=`o?cl!zt}C>}7oE8}B+z>94N1qm}4`KV4+H zMz=pF*XIDEN?^{;f5bC~9=P7j!1m%)DY4S{N4xg2{CFw<)>1N!X+^A`u2M!(gW*9i zz$3YZ3l^+oz*Y|QxTpf8Wm}8uS-LFo`Ewy5wFho87oN;1M$2Z_N`t|NkKVWfh#p11u3@W;ugU)7BmGDe0kurP9NlNVUu%JAC^M_MIe zTv7ppq5WX9{Jaf8HwDys|NOJ}k%YB4fdYx9jp(;*A}vGWE`V6P`+Sd5)_EBDp^SZ+ z(|KLL&>Y%A?5Yx??=Y0Y z@Np=g^HyHbIm2{!cVM7mSt5Yx+f*Pp5u(6?S3E>TJceZ$s8-V@6)|`^Uv9zVL6I83 zkeNmJ@AK?u-TM#kV>r>42)iX^SKXDg!Z!a|8!Ps79LLhE$KXSYnTK*Zbzp;S@jcGc zz(^ACt&OA^?8#^UzM}KCl*Tt5j&HhBhr?+6G{%K^~O%XSAB^SH%;FgMA@Q1ADIn2fTwtABDeT59r; zge*lE8URaK%R_!Nv_hs!$DLLh^Bix<2J`k`<>uf--mb0Z+=9UsObAWlMVz-_q2AKj zdX0AVJ&u3J86~8Ptv#$x5Qy{n{g3~EB3ZqMzc8i>|6rHJsF_m&(ntmEoqx^vguY!r zGESl_9%k>d*-AD6jx9bGQ+m55_tC$aPxxbgaXhd62*0dSLZw?XW_FYKGcuIrkY&v zB=vbuRYTfR365+QtJ|3I)a#-#0osNEFM{U>i;}VYqs)=uTj9GY6=Fqn;RG=wUhmbG z_*?2n%5o6{hSjMgRb)G^j1E-r&phOU4&ty}ikWakJT6DRqVHUH#X+!UfI^J+r$9xX zM|61fNw*JhX@Oy;>;a z;M75MSvgs(*SA3-ybu9>d$MrpoKX6zu+gNXeL~lj*wj+5#5ky;OSu6W;LeLz8|owZ zu1G!ZCkS{9>Kvr!0IMSQS|MA{n#3Yx*O>;sMMljv{0~*Yv#0Ha;2z>(*+lq~8 z!Xx7`ai~{4nQuR_FW9ozJj%WrrOjD&u#|G*Wq#X~?c{E9utufnbmNquRU~=~NYBr7 zcQX}qI5xNTor4)!581v6yI4@KZhV$ivB}w813h^@_yjVsoNchN|1;NgWUy!qOJLjY zXqJna1G2A%DWC+sH{|5qVimWxuW__0sw8zhS(5ACh(BewHfHAv@&b)i zT?_AuR6_DFLdrKK9N-?KWzKb|RKoBX?+=;#v33YJ!RFLk6368xGfQF~^D6%w-S`@a zPti)k{@DG|=S&?w+5$J%=K@cFq%6#rWJ|n`OEqUF^o4Z-E|v*$bE-^xTmoJ8_Wp{$ z-(fCrA}Qss8mXio9c$}}ldqq={p44=b#>L22rXO~6W^u|9+pfcplUpym4q3Re)CCQ z2_>Es)*ng==u!woB1f<1`%wDj_c@`F`MnX{u(Qmd(yn|z20}0vxHorXmd~l0bcb(b z|HXlVEBsw=Ds;k+S4FWYgLEEXC%?At_{uj)1MD$>sSWUb%EoqM(9VRms(r$ zXG=E^11{H}+SPO^(jLm`Rr|a^ zz~24^Tkko%)xn;fn8#z(K6&HKl2lgBIb`Z!a{zLdd4QeX;zb%@2lYv7=nMgSIiwXu z`oTl=CalzJ0;x~cw`3RMV!XKc0l&y`@AD{>ARRy5zoAVRuGILpXVoP1YcYR5-gb4QUjf36owqO@kQQZ+l*XKW9SvVZ%F1qhMGECsG6eES3kIo=qaewJ$w{$ zBb1r-@0?(X#;LA6pWGXd#Rx?Si*{mKE3ZsP01%gMmA`vvzr?M6v9)fm)pr(8C-=P7MAbQZvzHwD2sdcjsG5Sg3UxX#t zYkqLH^rAzFl^jEn*{$l!sa&wv0*__`A9eg|O3B%%Mn;PC!zq}Pd!~=xrib5bGUA1< z@0C~7%dXz*(*Hw_=1P|FqK>j726YITeDOfM_jh8H`(GoMrhNY8nt8q2Bmja1|BGS0 zhjq{VUkk^PhGwLvr{^OcNKW;O_z(9;iN|;Ej|Sf(!y+JvDl6MRxPPNB{3J$uG<#P3 zFANFL@DFE+M_64}8v6)}X9o-dbiBNqWy#ckYXo2%l%Mz@@Zi4+JnEzxL=vC>o67vhkHUDdvFgb}?sAc6eYYB(o2xFX{UJO5^~CKCY{Dqj-wOmUhuAI5 zRwA%xDqUo5MDrz>t)mINayXB70XJE*CV3ET2YvWf}{;G(FY%~FzpaE1GmVfeF zHk$Q#9JIC`Esw`ri&;qlPaFA`K}2Y0vDB3%I3Xg-wWm6FCzIE*#2UIQ73)GT+~I#O zKciw#qEr1O*B%w++uC)9$_T(4{1rn3Xcms67Wz*44qs1Px+<8E7Hm%yh6t5;>a4QW zm#6578Jt`wiq8`zGN_7J#}uc1lK4i4es#6996^tQ@-@^Nl?w7@7LD%Z#p8ysqC%#PB?QHK5wt{Xlay~|1rS%^dS-3DaR$c zm$x`vNb>B&ty+5ukXX@TF3s$gX!P;Xv`ie=n|HN%x4mK@RA*jFRu9cC=0m z+>HB-$!+w^*ay~u3Iz+0$Nj2Qd@$pth;=t>PG8T>B>#6Aso_D_%91+ToZB2Xb ze97D$-Ar^T4&^~j4Tem2n>i*jIcY*0JOX_19C+3e6J5`%&=54@ch+cxGoedZ%*OGe z720Yq2Tnp9`drEHe@uLhA?BnfuEVmnc^v`0lhd0HcKaR zI<91cWy`h=2n`7837uU>EK*TcM$Km%?O^F5h2)7-pSyt z`M%(4?ug3nO%#^KIl#XnG$t@iB~Vi}WhvcL&Bf1b+8Aa1@NrFd$&LvmDp`AbSRxTc z=eL$y!v{1k_kzaqx?VL{7^%32`9|&Ckz?DmXV+pFvqNvXk#3$+^G2H)xCr?l{b8y) z`&wCN4NqlVm!DDVY zsZJ!&Xpq5Uuc@H!rqvPgolzu*KU}>X;#sruiT#LtMn>zY%kO7XMp`L>M|UeZ0a^99sm6huZD`5g__W)L)27vH3?|G@8`Cp+ zx06Ji=F8kM`t%j5y_SLX(AdwmQesk@iQ1 z_!mA$8FpJtEBfWU=7WhbdqE9u@WbISE(A`(Y_0jY6?QD-Ey}wrf`7V%zj0Bw{F7;S z?cvMbWeA>!#V_L?S}NCgne@bZC%BT!3Aw8j-gmarW-YIG?laQ9JJ%Rx!Sl!)#G=&& z?r5-Czc#?V$0VtSudukMuH!vm&g#*nkzd?Ml+Z@!Fof!Eio6=OfqOj*t!a;*Gi9X>#xV=-GBWr5@0=MwzVJ|p^B#~1iQ^j8sLMip^X zKj`ACElW#He!0=zNX*5hfLu*FnvNbGyKgmvuB#Qnx~{mSBC}-(`FDAuE!lImE%{Zh zJ|=pwC6ZR6ZhlqHtY$ASd3|VK6@jg%SjXcsXA6b;;U&B1$q-eFn3LxoCb=mB@UaQ^ zDEG$D6r~6udTn{1<|#nl+O-Z2dd_j0IDiz((s7mY<=KqER01$`W*D}Y9joQ(jgRt% z)=i4%x?i$Y+pV;NI};Q}d!_`Idk2xW>Er`sTLxbDGhM1Lg7dG|lsw{R@Hlzxi-8*` zUzPqB;rC8#RrrJC5)D0D^oL*8%~@TY@M|+~<-o+EV#3QBq_%L%+&!$Zc7oX9S57`X zcKX=*R4aBSJ-cBhwU2S+Hw$A-MGXg^ipGykk1$q7)+iBMPe~FB;{9d(%G1wxJ%>|G zD<>=Gj#XDU*0TAmEp^Vj0KlJXU0^Ej(zN?Jmy+A9Qz71}szWdpEXKId4Gf8#l0gKt zn1Rzc`T5NSd>yNfpVLEwMRq}n5~EunL{LtEnlH7whPcQ}+A`+^1|_(VvsTtQtowAd zH{|Lv#N)AKKf>ZuOHSejUdWvj zz83aud%IG}6&eE}G}18fsg)t3|9 zk|fD%k9R5-_9`+h;ZWzk`Rdqli2mZ)lCH^u^4jUwTm{D5R%Otm#@JCG2}Tun;89(-ke{=hhaQ?emb#2}QO4>S9%_1uma5lS z0Hq_)nS_6?DVlpqYzz3zC=PvosM+wiN(#=tMtpSqow5AW^f?PBWxvfEn89D!jtq_G z%gNGBx8yckEj@WmqEz@l&f6>53a%%h($d(tZ%>)wkO}9yJ|5x_hmtJo!n_EAYeoDJ zqQu@V#yE7cJ5!DPb^yHONt(|mxrWKmPnQX5z?OTfRw{>kE>}@d6d3@lx3MVzn4a^h znt&3|Blt5XOws!xaBKxLkA}()>nO$=$_;gf@#nsA1oecl@NGn>mm%aHr0W811;*yo z8Imy3Oy3Ow_EZ~lJ*7Spi&=htKI)8^mTU!j&z31;!E%l)I&|oPNAX2hnt-e9r!P8r8!h z2p8~oQdi+vLQUkL+`ixtY&x%cSW`u|<Y)5olmL9xBFOYOy_Vvx8NzX z`2iCP-BBMbVgvG11~e2vDIm*Ouu3)b^Df65mK3v#=!umf*BeC%W*rmU0(M(IQVoASsbxcYf;V-g(iwU$M;12uHr+O$A^Us19`Fx>t=HM7zKLYFX;v+v+!?R%nT(Z z+nnc_5%t{m#RJpDB2>QF)C$QBE-raHJE#cA5bp%LXT5sgS=szryJH#MSh$b+`ruwp z7hfeVm9au<)&7Gl$|!{#1Op0;ru5BFub)&OAcTy57nsFz^6>vlC}hcaFhg#WQ~wt= zUmdcgFC8LB*$o@uK$=81_C|h2-8uIcbJAxne^?YHr{og>GRPj%Fvu~qXlPjjO3VxW z_Sfo(T;IHM<2ZxJTB69uWxuO{);|bv40vYKjVz_M@GN1dXKmDNM~o@F*F{r&7l^<^ zX1duPHl9a-0G3wxaOBJt{LL9G;w%NMu$3{G zp2ghgDuG*bvM?1Y$jU0p$jB%wADwtDEiI{wGymy_Jv*FW&BB5fF+t-*i-O`G0f_cp z{})%HAZW^>!&C_ZG&HP@;^I#c3d~ z6n+QI4HU`^V8#Gb#a->DsWTP7<}vDchqzwvy^nq_xM6N>ZPc_sT2hID!Hjkp|K#7E zchMX?!ay8+TYAXlR)cvElzijOix5jLv{(tE$@tj#Sx6xSM@QBYtr zQDz1X#&c6<+1=fJ@ZiBH8L7O96#g`RK}0)Q_$l6jCy>DS9|?qt5&bpzB?26c`0c~x z9yrEO%k>Rw2(j!N`4TB=*KbT)K<-A!6g)dSJM`Q0FuWb?c*A%zZx|WikFpwl-%RD^ zZDUvQeT>_bfZm8mFDu&v=K}8y)l&Te&Du;=DN6K$L#TrTUP;{=9V$VQ{;g+93r-fk z?IrZ{(Jf_Qq75E^);T$uSOk@o@BK&XFXU7#M?TrAr)*lz+-I-4bB^&Gd914p?Npgr zkn^)2nVd8ejox*M`aU}RJUKk(v^bJn<59{YObZ)B*F<4iOPw*AR~wWPRg5hwuvw;ny~$ zx}?44@1cM79vqpH0s$A=%T^p8Rzq!P9=@^cmH`n)gmUYvTS8J1ioT{zt-*g)5m~HSWi(&8wMU6qLVvOwc*@*(4 zN`3e{DDm3yhTelo_rTId_?9sLat+T*tL9JMlo0*VZWIl!tC6cc9tiWH6^)9DDoj9Q z2_X)=hXqEZpNmZ)GL3k%({Plb!Y7Nl-m3$KcVMjK_kec^C{=VExIM1KWkha4+IX5+ zU>h8X+SS>)m_59HO0PS0rO^@OSn^%W%E>}>9lk662Gm!K70Z6UaxFJ%Y8#ITUf#RUs2vkXgs*g?90AZl5!eYE}GdVi=+XHu|P?*J||<0bY&-dbe`Dd3?4@i zX?la>zH__58M;1l!aH@TpEr?vv`z-s-;6hY$JkNM%S*y)atU0w9GU9baYe^=+H@xJ zQQnOO(qlOAeX|<@>+G`E6c#M5rH=2fSC7eFQ4{8>tfdYZ!8J1iL*#bMsiw)xAOy#D zTE5^ivb0=_YdpvVm*3XHW?j3rKJQzMJmSMwr{=~($os)EE35S_&tzC#rG)978&#@W zT#%MG>HkI!hXvZcrNlmCOK&k7iRnIrA-o&%Tq7cvPS=e>I_KUN(r2a(dXVZD%t(k< z6}6{Ai~?!JEaP|><6lIkdYCh6mrjUK*?2uFxZMi6{s{c>4$&C8gcuc`hXM_n(K|!t zeOF#c1|{6Z`8>3^_M#?vB>sh*)RrNxb&(bf$A%E$EQJFCDkgA+o(jbG4LI=^pW9`7 zwlJAk$JL4TE=eGB?6^sS6DgmzoQYJL+>60i>W`(2Yq$Zbc-MB#4u@I3p)A-JPBTx6 z)!gPXQg-&%_HsV|@Ik$=r?{wF@L;U@D@$xG+SCW12I_zsS_X#d??;L_oWxEdw6Mv@bn8&@KX;Vmwf=B(JyCoiSO7TID3SLh2|BOLzP{E@J^NgohLF^ zhgh0BD%2r2JWt$lF@RThdF_sb;p#ph_I>dgk&g@R^fL7E>6y|+V+ZC^vPbi^#uFd+ ztY&(7p!pdJUwLGe4#272JY07*cs*#hWpeym^B=ccv|^W$M0lMlQo(_bB9anzEF zW7ns(96mZvQ}>~k_Llw~ekBhY=|OPDI5?uWyr!n6+J4SwqqOZ&B1Zlr;Yj8o_5AMc zlq8Vk#=c_v556EUny^f-6u%@I9L8Vq{fLYk&MZzWJAR2{1nwfR5ZRC4_BpCMnu9=s zzV3m0jrmx?(CldQj_as==kBW8T$#puS9OSCRCut=Yf}yrG>56b=ZXZkHNcbAr>GM$ z{G2HYfkl&#WmQ>;6dTXiEGFhQ=XrA7*pumSlPrNxsS;%p}zRm@uie8dxR*`%!Xd2KRmjB>s#7dWUY&L zv6=2T-aED}B1n z;zRcZA`+D-&}atQ@GOzislQf+qeVgu_8AAArkJ2)g3cFaKaf58NXp4tF0Bn^(_!6#fSjqL)2mhqh`ad?C_0#vUhbMd+5zaOWK|{V) zPS<6EN;RGF(|4!PFJ`Z9)-oPG2Yx{5x9QmXB8J5eOv$us<5Ro~i;DmH;oyPhS+n&B zbZggg6oP?lj+^$5i8gr`^~9qa)`Z@ch2Wcv=Z{FS?tJb_=TpCI6%|U&`!MpiIM|AqSxYaXkVE=5d7NWR33 z^rE~^>q1>^nOA0$$FqNwu?wb8odv__kkmrAcv)s8yI!2#eA8`}wepSSn9v(CMR zpKE`J+i|F9<|YuHkaBEe8A`0#oA|$)25*~uu(?{owCg3r_BUG^QN9W48kQ)UdkRnu zjkI&mtaA!3Qs}^|@2WcnH6Q*c!;Wn!VGT61EqK^*CD8k{q(P^NjYp!ydqY<36!zFz9Ujgm?7HvA367{ zi9ErJjn-}gl`rGKGblXDWkQV!n%C2+ zxSG~o9RCLo)cLoLy*`*BM3H;$n|tKaE?gnyPkR4PSDnSD()^CY)xk)n2Cqyg_MiFx zs|V=uvh?fnFG-NSeC5`r)kUr}N8#VJiW+R=Kk9VP7tijG9(@8^_*#L)!N&{<*P25K zESKW7%HRR_MUO7Qk&{!f^FU*|qv*SP9reOP>QCLDx`T>eEVnUUr3O`;ebiN zQ@EbzWuJ!kCG>u-d{D)D(tw)X>?p&%YiACo`j*#vc4y(Nz&-zR!IxL`Y;AtaJCcyK zrrxUIEV{Nrrp{)>Rh(ep-`)_mU!~nHL|i}`rplbRc2#2)uRy*65f=i~hM@q5j+9YR z*2>+Wg7od;i!e-Dc#M8cmi>c4cHPXdgW+oG)dN|eW#ph1KY`~7o`#x6ra>Kx=shK! z*^(#2HDg~XF4Q0(PQH4YUw@*+c_rnNTDSWAqO>BDMcoAUdntk9;yiErGA^@7`E1|@y0l(lcwrb}w`36Eudzb{ zA)~xzZ&zQr{R?(^^bWnH=}w2V$6?HlllK(6rQvDH$eaRANUR4MT4XvN_+p~@r!D^k z->72Bb71t?fZw_0+dp$qZxrdiT0$EewEr;9uW4%;x+s>@xbjvQSdc$>9u_1r8(#<@$-T|=DuuerHNsgn+H2*-`dHcpUqlG>QO$e;- zL9Cuq9O7fjSzemUo3cV(W=%eup7Bae=IyhszCpJNWk~Mac%!tB+!wVIdWtWEf(aB~ypLd1H(}S7{uTAOvF?q8&r^;Dlonn@& zq}Mu%Tn)=bf+o1AyVfIl(OPEb6DH@tPY-+~zSY>}w(ovW)3}6UGH)#@NLCVo%Ss6S zYs}yfp;x4aWN&(KA+YWCn=9;z$xnoq$E5Nu-#(mj=qI~1)I~HXYnkD z-ab2XOJjD?S(c!jfY>Oo@Nt1ZL-)`I#ODI3NYexEwGDlZe`Qqc|LC#H zeig6%ctm|QLX=!`lU|npH{ouX>e2*IOh|{3!G@hS z&qpBA1`$ZhHcPB1`5%vZeHd+@&sp4y>3$XfLdU2S7%nz-hH2xKwVDNGO~4HRdtLTh zDVEonlB+|Z!)py`p6fyJ6Vf~zXy1(QziAq3nsu-SEPOK3zTsgtd`l}sG<)*;Q;(B=hW z2zyy)WMyn4iW4aN0#ny#o74RNnEUFmsJpdY6crQ%1(6P=R3xOkluqeJq#LATKmSxDJ0YGrw5tS@o=E-S_>3hK2$<&7Wsw zK0#if0uhiC|8oJT3?JXraT3GT6%QmsKj&8%{K#NzApwp#4e$aMkRU%?J+Qx--#N;^ zm`eTQN!`e4(~wfpI%e*=cDZcZS5#MXPBThg*`(iIWLRT}j=_>}5qPARizhhi+Y`{Z z^uj>3k{_zuu5>b?T^Va=6%So=l5Y6!wFjMzMIh}H$Z_s+q+X|5Mi*3*ky7usm(U2) z!oRf0G~EqhXTTg9YQ{sSmKE3b7~ULOm(;g1eFE2mWEJ(Sjf2ECNf)O}*6wq}N$0y+ zp1Wz}1?pw6QDkO$qPn$K+v!|ME2~YAR?TC}o7{boCF!Uczj5oAH}&i9II@WIP!e&&uSq zF38S4Ou9HCAJY4oEHpMY23%N>a~s2e?$QD>s^~sj%-2)$?xVM8PQKGz<>~o)B1NOb z7sQc#zN*@!Ko3%H=S)>?7JT8bR?(cOvbLU58Bw`x;+Rm<-BWMpJeiUuB@ zA2eNzf#?JI#Ws18^Y7b3g%1blHwzFG73Ntwj+>K5#sVj?xx{Gspio(!$F!zLD{`K> z@HO}X$ZWO?5`BAa2k1sX>g-qEo)i1~`udtFA1+u6}k zuP4LB>uI2OjO}^&(w`NXHBeOax(oSOi@8BMR5sndA8nwPr+k~w8*fIMr)VX$*#6 z-(Smp2?93W*!(8bR11np$Ach8y%L(8?XvsYFui{@0K@PC3c9T*J_4+c^FV~J_7KzOHnp?`=@b1}e&b^5 zh7AaM`8puYp7LH2yJehNESq`M0=j4)4Dp&C@+I3y7OfBcs~`Y0gDtZnc3x zJKUTrV!<$p9|BUB1@%S}$_3rRBFWZ>V$@|=8gKG!ay|Mob1Lebx!a? zS*qJYa$4XF1m1X3xO#+acDCGTg~i^aCWkeZxr`fGAb(U&?c}vN3Q<4WMCaeDLwU$Z z+x8E9<<7JaezVQwW1f&nh36+kjF#|Oke*Ok)@?paOzA@4bQT+d08@mtqhqCQS8grC zo5-UT& zz;Si*KRS&(pLp22i?f5?I5w%M!`vw~!Oo6Gk?v-08XDNB`PQ#*W@~+EV$@2fI|3JF zgFKGwCSxN<8Fy&8xVTmqvINddhrSU&Gum);9hjoIc?8aO2M`GBi+yY4$g9de^0>dV zi69>XS?DDyT|n-lp0L7F*v=sW7-Slx$scsaEs!<-R)v#=oIToFW>*%4sR^4OtO zRP=;>2`Cvt^w02}4kVoqrW!eyO5Dm%G^;cl>fn4sfp2xv@2nFCg+69nP$BS_a`-9b z;!<;;l3F;4$EjyDA}s8+mLf>#xC3%y9_vllyS%lDP-5}RHyAq3jHw_Jye6x2HzDs2<)ZN zo&qB*3HKDtjE*~tGHZ)&A|J|EjlOFv73iLfk0?o5Sryht3})$on&{@+{cUD0{fO55 zc@?ri+uX)}Ph}`Sa;f{v!B!&T3oJsTW`X;p96 zG_H*lb#``jNlT$galM=WG=7Y1=W3S9h4BjW+$Djt0Ri=@F-r)domM%(mC8JD9ywAI zG@l}uZ_`=@QuGSL7}S5;&i@>;K%Jcn5g;Qc*Huyi4nw+17YYC(aLD+tD)2WDMg}Z---4aNfnNt9g z1+q0dzC+G8d0{wm@th@kEw_}dXN}`~7`y3lzLu7jf>0%y>++)^#JG9UN*!m&w6ZCQR!PjP_g|kdc;ymR1bnJ~;V}8F6tobD^x+4S&Ga zp&!CWD0vl z!J(u+77Zm&zc5wPXwxw>7t@JS>lyyE*O|SiRa3-vv*2);Nh95TMM{@>HP_p4zH($# zn5X*nIjF97w`_tY9UUFDlqPrEl!_#5(LR8GXuxJ1$}B68*8Wil_LF8epsZ9N8Q#QtBOg`)BT;K zi^)TbJD~BaK%+MGz-Aszg0tLJQ(mSB83dx)7Xw@1v^ae%>2#i!RyMvEGffAyE12#M zw?jOidmjOhX1o#NHpgSMt9=?&FIgwu*?63?8}<3~ojHs*9v3Gw#2d;%bv93dTXC}K z)N}&e6Aj0ZfPgal;=oB~f!vJjf~i`E6X54Co-J@}p$Qy*`|5=n)P%0EG@Kh(R8Gk6 zUX3Yg^=kyU1i;6Ln~7Zgckj($Lq|u)>MTTs^7A%3ucxPMgF2qn;2&QXGa$brS5<5L zFIPA{ohqr<_zbS%EvctB3)Y&U0|Wk}`S9WH?$Uecm!l}<-`!`BC|j`cXKBw{D)Ofn z$3+)r=P$9kYX}a$*Lq#<8zjq~mJUPlq8l;o{)DOM1uh{B+i)V~k|lH96AfVZ!5Ok- zrTbT}Fx?kXQUBL_rex2*ygNU2S@Uf8uXYVnh57Y}-IW1^ZXQg4HvNygpZ%DQPF=VC znbfex@%1hM-vZ&QU6dnu#A!73qeqXxCSqwP4D+gH@@k)GLx&>rb5>7kgjoJ}!hs;jNb%{v+|{MedKDY# z9{G!hLPng9wc>nPSNV`Z)by(;A=)}m#Axo$FCZGECZ1-|f5H<^%34z)pu)9}vPL}C&qKgg!tbAiNsw_A$5uJri2D0Z z>*Y1C8@%nOq9CQFojou2T+wn8b?m)%{qLm^=I*GUTGBsbFb5#hT&HE0+~VTFdSz=s z$=3!2?x6?91JD;_z;vR)^R#~c?vZKv-~nkm&pxaHNN)fjokdZ9yZmDQeoAmQlM-QI@{7=G{i6<=>4OC1~P-wgR(6 z%S~&mMD2l7L~@om53$c>NHXH+!+Nz;R8(r`sln59Y!$v~p* zzf{2+o#vf8S81b$LJBf_H7Qr9@e!jvjExZIbQ{VN+p4U86Y ztjIIdJNwdKCjhdv1vi0{@G4NEXj{RejnC!M-a}Q$X=9si@0h^DW!%GPUs=4*jR~85 zwol@GQ6uYZ;C$5hR>B1SgOp>xG!R%Jvqziy{(*{7&-o}-+UvIyXj%N{K6(NU0@W`mmGObh^rkRkS}vU&t;;Msl&zD(HZ*V%bT3Z}@!|p53`43Dja3xa1jhZ>1%ojR$utgt=8%O!Xk* zegVP-m8p~<8<{>4m9rFVX9V%KDuu&Z`67*lXz$?_oC+B>-gvJ2tW3{sPf_S7M*wGV zMk{xI3BOyTeio42dWQ{!K{oX92{3}09Npda93|udVZ3h!a4EX>qTPb!Q^d2Zxm{=$ zGRRt}amieoxVs(6ne^r(L^!OBc#@j6tbwMELe6CO)6nBaz>L-0V)$%%wQC+GKXoY{j95*E$<*z)M$ZJW0v0&|?>_zBSbg3Ii>3qNbE@k(=dR~3jLFg% z9_0evClK$!PYJt1%_6I!8 ztX|!@BE!AK1|U@u=0^S6Za8(X@^7;X2Z3jdM`xioj=-?xRF-E!c2iZLq*Yik(2M;L zKe_rT6(l%RUs%ow2+C6H3&)S0G0IsYpLh~!OXoJ~bA;3^D1n>osq@Uew2zWeTq*?U z*xmmAJAGit0T~j>=CH{MAqZyw#nb2dF;y02TC#rpX-d_1ZI~Pq-~Jq}0;8f}wOP+X zbV1>dtWeqURHbN|t!R55J$%7&?^XFovIGu~n2fgj(zLgFLq>72eRJ1BKd0j{P9*K$ z`;q>KbK~2Q-}Gmg8}CxTjin?3!=@S;H@hJWzr978e(l-Qf>BUdFh_-5WcA(#C*Bk| zSHH_KPYann{6(HwWipg;?2>lOtK)-2LBAKjTHL|H^q%659>w##+dhWMg5EW(;8ag} z0Z-ZRD3^IB&uYmxI9^uvSyt4w^ofWTn&lY0-N)mzkj zLcLbf!1<@(4)U-Je7pEiJ^VkvHS*oZ5J9Cy9S{TE^!=hgi1*pProi0RjX~F{gzPp|Gtx?&4ktn0$m^7;dBm5%Dc~gLQrX>rKP>o)(*F4Mv!Wx3e?~iUqQK zI(K~h!t-_}s#0@lHcI%{%n7)HNo0c6m+XWg<$4ji@(9=`LcUZQ>V(>uFS-%$j*d(B z>UOP=V5rKVYo7tNaSc!#8^YrK4ES^GdeLV;3&q`Z`YN+4^%i{-n860w)IbeO(#O0n z!|c?`+)W=@lXnJ?@L2wFCg|Zv?Zi(c9y}9ej3L327|^tTqWc5S zuU}*`BZI9#67bKnWT!Mqr{}X8bG}{Y%>)lwWq;GWdt|=5{~x+NL6te}*^{;5Joe4J z{?R}taCyztG;E8I&*k-6;Y*NzMn_A*$}K7?(@9vvG3iRTN0N`Ol>^L;fN(>^=c4B* zE2Q4Nlgd8jCjs)*(0%@#7osJvR%?;r?%eI1j>!z*P z$VnP3{-feYogM8erwo9~K&y~M5pHCmz|qPaA_@PdxL7p$46o)hSl792X+&0;pP6zv=I<18lgto& zG;DmX*;!8bV!6rsyvL+b#}8wq6&pnma<#x2Un5f_wjG5wj_?Y6fMc##g|oZF5n z)5B9GfMh4x5dRLv4 zI|4649CBRGR(jqDB!XP5fkcpK5>kX`1Bmb_=+?WsMRUM1AogkH`K7}sR#On9Xrw-_ zta`9@BWpueQ}~^BSsebLOS`yX)iZMN{$0{1;p9v2TfG`77{dt`nOmWL1Xa>M^?=gh z=8dm`Y~e14`JxppGsIeU!$nEO%2kzJVj+RgFKLCz251^7!1)YTKL@#;*XnCK4b2`# z>5ZO4vw;XA!RcA!it(VF!GsLC01C<;awc%*xwo&ax_6{AB+xw-oUSA@wnoJ;v=UPZ zhT3be)C2h+lZnEI)ga_@RJZiC6?=^2ddhmK{giCZgJ_lIH3!qMuN0BZznOD@*bh@^ zS&WlvjWE!jnnFyYrUKV5ENZ8H!R+q&PVQoU%H7 zQ5fj{_F&-tuKswx7_lhm24+Bk%gQ4x;|$Q+l)knxJ_-A=2^gN~=N7HmKxs5`C>;y( zW3qNao-!O5!7ku+6<mL;$Xm4!X zjno5Ha+_%cJ+5&<=vJ|7XDhZ*!pVvLioQpU^PVHu`RIz&E*!1jI-)DCgKJTJpl$_E zN_z!}6H1$ak^2sDhi8}cY(I_^cEWDyWZ&p`c39c+vr5D0yZjRTi-$WnPF$NqLrHE# zt{K*7!V|PUwmHLMAIRKv5sETti%8!LzmVI1+UQ$n2&rF4Yj&9LJVU}fYKMiR#+}U$s zuJUxTqFf3LliT9veywtek@fb*MS3@vI)nH&TLswNR};^~y8K8&O3oB(p`G`k%Rp(~ zpNM(0%((kFezj%yW1)~ZH`LY;Vd%DLPRFxH@_a>!e4RNj*l$Jbi+h+_(*5wcwQk#2 z(RbG>3kCXjZURRC4dFuxSG49sk+H18O2Y(R?I#!ug%Ht6kBe|`82^Q>)!|(a=slQh ztml&VOT%jo`n_VXu(|{Cu!SO$8W*uc{Wq1q@2sZB{Lti}&NX^#WYHP*4imN!BT)s> zeA*|NA@;84HNR8lj3q`x+l<|t>D^UVcXR_36dp#XJ^t}&FUVTL^9N! z*`nEkaBy3E!bUFGrRS6Mt%Eu0HwK=+ww$&sAmis;Z+`~_!`}?z8uFXNt;Qp5w-Z8- znHo~i@cis#J9?(z(atOnd7E0RPZwzIt&N1zibLWps_$X;wN50H`Vjv#2)b>nY z!T_EQIK={+&AKNigG1M+iC7nF7Gcmi+Fr??u~NGx4{)+eh2?e611jqk3K9gCE8*q3 z8J`88Q)b4&BZEXirS9V{*>A9%x|<3L03;j^I7}Ci$P%pHFlnLYBW~m?)@vTO@d-%U zrEHK$>MtYfkyOQSUI-@hJ`Ra-(waaS$U^KRw$TsBGM2mS}ugR8g7 z?|M?k&+Ov+!K7Wo`S%3bYmwebxh%59;%+v7fSvfTaE!tCeuy5MBBqmtRFUq_FmQha zB$@| z+XX3eq|IFzH{Wr?l)A4F^Vb`GrwKaq zE2GZ3Tw)v~qbWpF`%hfwxbWJ(5#HXgVNxNu2_te2#-9Ar1T0>F_WOL>WUd+&GInUHq< zm9lkxq9G@v0uVQ$m*_YYY-IPjgin5b30`;m((~TBciB9^wMXFvPJGh;olC!yp}QOb zw;tur<=dq7jrsYSF489BagUCXrKJK0QqW1HRT&%hWnmChOl&M?*WUAxy%#H4`Kgl3 zHmvjF5N=?A)5{9#X>ddKPwA%;33wdN7rV}^3&;B#W|n37(D37nLj68}M#b@)&*JZd zQ_bzI3-knj+ng6?)^o@{-zrf=C<=hez6AgXP}hO}X;d-l9g7)qTcQFbO>K`D{Be|IeCf7#JOo6c)4U@P^0aWzp$L!haeOyF^J)WW-z|;iSxtx z7H?Y1nZ1-6yOj=^<6na%cJN0}6+Bk`Qh5~|`ME7VTV`ohxNLwVCDJB=AT3Q88X5V_ zg4d(tlve}-kQA-)E*I-nzsC}1(ZIO$0OSt3L}nfu8t)V^$DZavp!=eT`gcZ+N~;U8 zn$i-k9f*sPhY{;E%OLGX28LsAe6xr2nv5k|;fgmGWg#}JqhS#F&+ca%LB~}(Wi5)l#*pex}u1UA-JKs zQ)WJ%d6i*y@15GvIZM8_o^Sd|a zQ60G;q*M66zGhVxvBN|`F$F?NNDGvd-OR}2Fxr@QJN#J^9vQ@ukP1YuYLbC6$;X1R z;RIB%-uj(yDcWQNh}}S6{AcFWnpj_$COBqp+CR{jwc+sH8IVF}{%d9%jQ~$Hdf0(B`;tb!=X@OL4cs$Itm6L!A^2sO6#_ zFiv&cqZ@&vvo+QowzSaZ<2r23@lL4r#IU@1SMxb^Af8h;!7`OZSIIvH^kN*ZtNK#= zdj^2jyrQCpHQI8F@+2go&C~Me*f6hhee9y77k#iTSr3fmHShSt-0%C}tG{0M+!CWPT za25`~?b)xOyEmz-I(;!Z3WmMW-C-A|7#7ownaYj!2kKddGhX`8Rx0y$^IttWEil;x z^4ddE7IyNb#7f7v1s%`&m6y3}ilyc3&u7FW$OZxNLHs8<8B-YzGtUfqox?Y`43Wzr2)HrGIL2{#&{7 zQ5R_P^a{_3${?=K7?3DS4Ie7OF-BAQLRDyrZLfUk+p^7jwYt8E;h0%DWik^dk2#E5%$ZVD>YS4G*@E3|YX}HBpe?m^k>;h&?JK6c7iTXO@i*4xf zu68tL#d6iA`>*Y7$|RTVuB;!6i8V!q5f$e##=5R9?Phbo>fEqLgxc22^6TG?2S{13 z?0@${k7Z&v>I%mIdfx|{=9K};YfhUNOsx;CCs9)@x-^R4_G1Lp@-oe9>BTxUO&43O z+EVeF=*AQFu&h!c)q9yW&)G?M?XU^Ot*h-mjR#hd7k@O4YPl8=}&TY zJx5#9Lru~8V~dzMWAuVlkjYk5F3}0No0eAwj>3q@wsV5dzMWc}s>I!s)*#m|w>V3{ z#)?ECM_7G+yfWq)k2wWqns=Rk#H5DV90sd-#VUnM-)&cSU-=FOJnI8QllMqe818kw zI4+w*pXa3qkeD=b9GE2u7i_W&uV_YP_LFfquiH!!v|ArN7>T@T9HEzU1u9a^!qrORH>#?6G7HK5%}zLAc@nl6Ugo^m&?DD;YUBog6lyY-4NeMpiQIG`ZhigCZ-M+2y08wvRt! z;-F%YaM~>Ye1skT(W<`&^AT!II@Ys3g)G36yY$A9Q;ePJl6ZA(dKRC32Io_?j;P;z zc!a^EoncIGLeTw9nL{zN%#(4nU*;-$t1d%6StiPK7^5OZ^;)1U8F~HkP~P zZ^0aoDM>vXb^Q0s)$6%WYH6=?n;iK*0BpY^IvyULd+4M3LXW>-(t0cSS7dkqN=^Fp zKb>-VDrRgt369Suz74p3wahFm;rqd_(%Nm9pG2x@uBw8vKl?Ki83CXIx8V`s&(ArG zu?YRv<3MxQxPo~`p<=h2Ls6BhW`_F7lB36PVI zOg$-9AIec%H=Th@q9yvRaU9>e7Kf&apU~M_E41eoH4;Jibd;M(g;4~F{#ZS;#!Ftq zFkA0%;;yCJ1i9JMV2m?@$F2PtQq)j--Nwmt!9n^&NtHsar)iyXC#WwfoS)g6Lcdwn zuF&M{go%-r2s}&yBjn28h|;tIRQNQ%g~wmUe&>7#YMPy$-I{upG}vRk_Ga5kI5`r_ zwFlE~8Er)#dwGC$&gXtue1@I{s(Eag8m7T&P418nScgi;%?}y^V>gXcOCwiji^hfLdg!(Wwy|GvqHUl(cPqEvt z?T0G|WZ_KZn-&+AoFSojr*^Z=zWXng1DbH`j0`3L^mAx%uuX2vYV(T)DIFk4;$01Y zR$NaCR*i5t1zVhjy?eD@Pvu9ug}WkNAETYvwZ;zYLWnGfhquy@f}A$k8}iZ-eFe#xA&_d0Eg zw`?{#yqUPaV6y{en=)fC&omuuLe+p&Um%K*Cb;7Zz@W}M-5eZR06?#4cag7Q5lKML zhN_p&YH~W@QLYHgFwsR&B{4Gv1MwdxjC?tCMiGC#%SZ&voX2(7U;gvXKRO7|$3^g^X7*#u9{4s!jM*H$ob}Wh zs?z(`vju7XfY_?))Y{%Mo?=fIrHC*(9r6RXHB}|n#s)UzJmL_fo1(sSybycU8^pgb z>3zW5t(!Sx=wThb=R|!M$wg1b`!ffEnS`n1;1f;woN$wRSj({M?(!pvv>G_R<)?dG zahm>8J+>}w!@u*XC@Db}-bzD5!<#p6Hl1x)>&trIwN>qZQ)5QSvSSQpx)o%k4fy7< zi?^B|%vb-kR+%rZSm=zdssTQIw^^c6|8Gyf;?&gNrJW2X(+7=CEq6J}O)WU4>=i9c ziyt*g20kgec5@$(Rk0XhU87a^HXzxVfX&*J1@HDc=W*Fr{1%fZOlONMdz_W!uN zjFF@It@iN3x%)_V1pN;n2DA382;IogkZld(zs*W0{xMuA=etE?_TT2w-pL`ZG#xH` z2|2e(Nm~UV1@L2yj+ulf$__03Zk*!M;a&!u+NhDsL<$9eU-|LySC^XX1e+s6HgP3$ z{&Am@-zqiM@0Jt2*y)7m;@hjh`^PbG&-G6u?5C24oPTqL~M}$E= zyunI;aX7+4Atr)WgxkZ435xjqMpo7e7}+S(c!XM8!mr=5j6YVCT4PlS%r8=aj`W`q zu}7EV7DSCvoRM+W|5@~_4R!6J6J%ITgZ7d*o`_;8Ltnsl{SlOE zQBX};(X*C9{vmo37BVV^u1=Qp41E+gx!_O04#dk|Isl!HBj0ONU_7DxnAb0ejlA2&T$Q_rgdr|>8m#Oef{h-%@ej!hZH0>C|hQtb<>sVk~$t7_bb;zJCT z6E+FKbtZgBhWgxZ#Ojv9SVNA(WsLAUF1m=Mx{~HQj-3-oDh4Nd@6kUo@1= zZwOOK#CtIvjzOBuj&8Ow-if+t#$Z#0WJDEsKZh7zd*1nLtKnN|t^hq0-0=GHhEp%5 z{M>zE2TMKEg&aFPL?;CV2}Lmd2V45k&RYc(HS4mdt>KrP@vrmKyW1d4C~-yf7 zKf>>*+<1xT+*&z$^Xo(X^ECsI$qprS-(ZCflAZd!$-r7vN;68d7)eE%dj@+p^26m|Ka~Kh(_|JmvkjYB@D^844fI?Jnx5*Pt`gGjqAZKq+uOU(O=Oq^3W8rGpcJio$!J ztL;~#V@j@Q7KPgO^lQ*Y2A7V>&ykL5zR?I~D;$8~ng4Sgtg4MwB2&B<(BB1rUoQE= zx&ue8BCkzt;C@^nR2?zBTMue{dCmp!v}~jvTKN-k3AQuu4=OhXuroOLtU*cq0h1B< z&JY+$2qVa1b|j95fw6=&?IL_WOn6qLa&;<(J-xVX}dIbD8wZh+j-xUA${uHE)ly ze573l13$rFol@4uUwYnI4l7g ze@AF{V0v`T5~YMU^ftz4I;wO&HkZw#0H9yIbN)@M%#VkhGl%`7E*d!qN^SBgcUn&t%ELo9dSHIfEr1 z!lJf)M8yQV(I!VoU~D1>=s@4ER<6d(mJo^5g!>uN|K{~lPCcpzG5CdimYdYWRzZdH zOpl1G?A?SNr+0p$+da_ly^KDAM6r73L)#{G2gU>%YTeYsB$1TAt7Y>_YM;d z+~Co@^ZS(R4JBp)^Lg~@Xn}4Yk6$S^>GgJmO*nd*Oqt%|THDud_-N>Uu9IpYJ7%}P z<5k?MKR2JH^p}W3(F}e6>ebHs(SL7h))kwcoIs@W>$qbDd2f1F+3-#p z?uC0m&TsqMezqK6SAhIcQ&23yYkWssdW&?! zcBDKctotrwYGtO;+uEFq*Fu6~hCSz5$3l}T@8bV^L-s9ikE;2rflkIg(@)r5TQCM< z(v84;b$g_Hi*W@@l=D?`viOoT02Nsbnw0zPZ<4WaJH&v{oKAH^YqA?TnJJmeqLytm z+Q(_zi{$##olUQ;v=D(XTb=_F=GC!i1Gy@Xv>;S_EM(5w_e%d9hDj#Uu??>jqE1dk z6orH&-YgtTKOH&@z<)8Y1LR~vIseQEpF1~ZX^G&L6VaD3vEhagUI%bq7rzIbk1NrRbfW*K|Hk>;XeK}X1@j}{q$6hRirYEx^z`PZh#fCCE%Ruh zndm{18C|oY9^*4RP7aJ{*~tJ-gu#iJ!14C>9PP{dg>;cuYOzY;p@N({HTaEZ3Gg=9 zh0!Fl*{&KykeTaN))Q2{&suHxO@}|Cbu{EjbE`J(>kE}cDUhq5f{gI>*`wbGEK=_E z(VCOoyh83MJK_EKcE-b&?u!8s(}8zK2jY4gBYj+N*ok*>w8-&^W6{+v99)=D~v~kYrV*RNh6z@X5R2)yah(!Q%0Cv!BV2bT5ua z4Ci7cdUf8lQy)x?XjcL<;l*YIPz*CL+))nT5 z|8~88W1nY!_cktV`%mbCg&2FDr+%8-!HL_hb8EW_&tZ5z}N?boMTmo$e;yvV> zwRLOCs@e|w1F2Gs4fZ3O4OceQh3pMUMKgp4{qha1QG`wdGV=~4`I4GgIbsW#(7K^P zl3lX%LumtxdB{ea(Vn%ADzVf=t)*Bv{?OwqL77|$B??RkKTOMIA+j^7ftpxksng)% zrlowiAO2$=)gpC#Gk5cB3s0M0Z&=TGbb@QPBa7UBIA>))jSGs2$-6Q_C-ySd>BtEO!jIT`=EE^hg7{7CodTg?N; z0f~u?Tbt9An=U5vr__0S*Zf0)lR|CXkafVZ;-6)-KJN5{Kn$B~JPfks)!ORd^5&Dr z6SBpOSbSmu?7Gr-o)2+YO`tWp`mDd<-`+qPsE_c4LQ)UXiL7-!Ug%oy(!vyNcGJK* z{Y(NR0fl!Jd7ga%W9;-78V3*eTWUYg)$X#!kB*8A9*=Zem=5_#~m>6?A z=-kijp3ri2l$Jl47T9v~bZWrlSo-0zDBJ!Hhmks6S$V|wu>mbM<10rjBG!4J0?@cw z+cds4z4+v+&bzU8IFx{J<_x;@>2B7=!_S+k(B28b!^2OesEKhN%uQPsLhbRY)5B;~ zA36~W{;yf4)hg8CRkkaSOluE_S!@^S@V=Ry$@41A_NUILDd<1EV1vzgf7{+$R9@QL zec~$T8gS&Q&tIYrWx0crEO8st=O>BcTe?|Gigm=-P<&nOoCDg3PQ;Ie6ap-%>>ER& z$yT`E#4=#d&&>my(7g2pf_eC|#QNO&HM>TLcl^7d@xb+zd3=us&+8|h;?nb#NxQ9a znY!!v!mvcS0Li2{R@D!`i*J|p;ziyhRweH3(Qxm5Nl8x3Z+Q5f3#O-^S-*SOwzAo( ziN<}lawIgD2tWNAD$+R|+lfC>Q#$j&qF!@!;adt~`Op-j<5_NCVi0b35T1GE)R4Jz zNGnXe6^Ggo--uDIuK~Uc&KPxTto+uWa_X|{!RVa!iD=L|_lW!?1d13m4|aEb6-I&S zxS@8(VJYD}9KmX2=porfJ-mGyxqDE3;j;m(<+n3?E=ER+xoc+{wn7KS9RuiHlBWr5Y`Yl;lF0N4} zd{(O;TE(O>*pJ`FgbYrG4uw2-%5NoJeD1z>F4o$C7c1n1zz85GVLI=s`OTqX*;sM% zH6GVE$ipCvmWRWlJ8FYAG0v8`$wq&Xe{8yb=PX&#m&QD2SSr|(Vyd9z{zAN_Tyz%m zh1T{2+^Az8oPkdqyBoAo5xSm5@ddqvMx-Ttxo(JRk6NIuwng`~Cj4a-B0mI{2b9RICQf(zh`jj0{ zna7?D%7xA`=C=dPlxnvd}>FnYJKq$iQ);uh;(05zu z2olP=BQvbfZKqEr?qqK9ifd_j0ROo*9q|uCd;_;1ah8?*x>nEA%2WGE#lW#|fYG(N$>+Y2sm%;DFHKzxi*x>1b?0@f$8KlW zf{6LXz&4i|f_h%93^d|{o0Lk~NffQBz7qSqT&_kJ_Z1C$g7|7t8faTqnn~9J5r#>6 zv83-gyhf8R+s;NxY)K zWN!=+A4an-nDS69nst@YXFyB(aWd*y>#Et?RgEqPzdJ`?ZO$)HJNFYYNPr=~hU|heq8DrIa4dF*_F(Tgs}24w zfW)|48(dh#q2OZou#p;<%?!c2Gi4uK!G)D;Ubbn!E{4B|NUhjkL6C?Lb=ndYEQoN4 zY~saD1UD7ajO`4j*8p4(kLK2xXR!S>*N{11v0Rq8=!Oa=O@ZN9|98wXo2WHiHPdOd z&-(Xj1+Glww}Ld$0T3P%2H-nqV)U$D?Pqy@{fG{yVR!`F_d1C)TAB()q0DeD4tF7-S(C1 zngYQSwZh?Z+b^)w>)1F_W5J{v5)#i4AfnDDxgOSTyFO6M=e%w#*WKa3^H^p*ttE54 zi{B*paapbX0!>XVSm!^;XqV0ERihl#C!5Pwcbc*J77+Tw;#M|=5N9WYO%q7>d zugU(^2^Y9NvqsIaf|ipDbMsxSyd2qO&ObiViuJO3XgXY)6^(L`u)A|wC8mOWCuNy- zAU#Q?b^jo~mP^Y?&(@{-Yx1$Gj394F9-3|}D5SJ+ zAI6~dPic^wz3VB+>UCea8yj^(=Fy>L%e`-E^+hhI9)+0!h<31-lp1u6yS0&sM6G}> z#l|mzXR!(;MPu7&<9|~0wazUh6ypVXMG)w!{W}a`j$-LRh;p`$lb{V%s5^1*r|B9o zFlv}5G4#GpFCoe5oBZVQd6JH`iqun221eFS002I=u=gP9A7Ncx9o=JN%b2}c+_1(d4Y@>*5CCJXK}qr z*brhT*SP|>oXI0cgn?#~-X5~#?F}oc7{@rcXNQiG69~pW2vvx5t^KHHxd~FNG}aw# z0l#7|tx=vVU#Gm0jd0B|-l zWTXJ6MV&Q)Qa^*=3rV_2ZGhPpX#NXeLZ z=d2dF&H9;|is2K<1`shBc#qVFRaJ&o@C5Gp*T0!JRMgTb&{aY{L_?+AOCB7s1W4vq z%Y9lVJh+7+^=z*b$n67cg}EpNriWuvu}0M4k;u1F!S0)z51ak#ndTQBF+#T*g!s9U z2O878- zT7o+~Pz4#L&a#US0Esx`#<#S;eSRYjJK1$-vPltT&R$2F4yF7-yCJlPDosKmyq@Np zOjeC}>RlfkR>Sn)rOyb{a%)xaFE29@f(}v@Ntgwk^Xq|jD$T9j{N3=4X!8!T(1McC zdZS6&K*WyE>zmE1@(EPJo0qi_{LHe6tD@qD|5pHda0tZEz@I{_K@}8{eNN^K9#>d6 zEB!k8w{Q>{(xND#3RHCoPcfGbvPAIF*NA23qd%Ih?TKgpM&x?Cc&$&aPPMK%k|Lw3 zC@4u#dCES~>%rei5+JFs@1rj+E*cpd8ygu}?PdQH(^EiIC-GsRT{eLI-eNpMUkibm z*_uEH#(GD=$PTh?Q23*Wv3S@D4`3E%YpZte-T^rh1Ojp0OVHA?;0(LHbv&JJMZPw& z#}J)RJj4om0}yQ=T2n;ij5(ctfD9v_K%p%@@6U`YDb54rU4R4>ZJf-|&!jp2pNtvfTcN^I^b5;)iOY+dl+50HmN zq37?`sLz+B4V3RAPZFtjr;{t%1p(?Nmo8_I^WHGqeEhSpBz81`S!Bcr<-Ll~?~tBX zDnNkT#l>ZRGOCTHr9HV8Iu5%muPVi)UA=}Jl9vDu$o&Plan%itjnS@Ob2E`L2%j~O z*Ost+2Xb=iT{bD*qir$c$3VBdE4@K?(1cmbSza0WdrBfD@&V$i;C9QY+M&czoEhY; z1+8Ail`rlMvyU#{Mn2%ZeFjUIa==YtaF;&P_E+hF1eNS*N*`awHw4G~W80p66jb{g zu;wa2^WNa+*A%LLd z>{u6Gcv)sCSq+oRE%iA&POnk0~so%He_itNRvmC8>C-oI8e>PdT!%vv*;{l}>R^GX&;i$zcu3Nr}R+W#{jCdR$ za=;LYPll$kj|KJ%KZH)=uvDOBTyQvjTvh*;8>EX}CX#b%qch8AR04SR3RF75YG!dk zn>UBVYT%*S(b(#Mz!dgi)GV415L4DTjU;hau85hF-L!{h-|?sH+m?g2hKxyqKCkFT z$Ii-yD!c&XH%{j9P^~G(5REbb_2I(x^+Ts+2c!Dsd$GT*X&Ja^;-7xlzxGeF1G)(_ z!>=w5^m$gp^@ILeKM|eUwN)S>7$sZ3q7nZMyNO9FnrFPJB$2vfUlwht@3Fk;n4S)O z{?*=#o1lnY37c-$?aOT2;LMDC{~c#YQ4qOKsuVLb(ijRJWoQ~gh6OAXIT)Wq3vc_~ zioA4BjU}yUZaF>3yVOJ{`^0{jMLVC4rW;eu|HdIUViy%9Q_8Li_(Y$RC&I+dtkk^?^>53p0S5W7Lz5*6bhDC(p?iQY)RPRTOB^lYOMk(Nu9 zvXz~4qK6;vZ&?k;y4jf}EwVzdq<@$gUy9#I7dlfbqnkdNs)-_X*w#UlUTe>0rxittE4j#t`KpQG-$c zSg_{2$XxG)-kwKORa6uLlw|my9mAOwsDnqieE(q`5Y5Zcs>W%Pb+|x<`gXW=E)u0e zE2x8gltd7}f^p;GztAjY^iLq>BT67To}_TXGr!)Oa$xd#K3{Jj<4oMrHg>zbQ1pR# zX6*Rxz<};S8s|(;AT;G#HWIo)&A$x3P2LHxi*~az$>BFhbf<>|*@mk8@mJVTeQtUZam?B|j*voym1UAe2EP-KsDwbb` zDQmcz(G2*svRAKO8&A{i4EC7yWXtXIrP8InN~wKvti}Lzy~JhnC$mu+r-jmcRq9s`lZ=<=*$+C%x6ACx~?ybp!r8qk*9hLL4IR9K?eq? z0EjFa7!1JdY#MBE@0;9Q9l&ndW>)(Tj6Xy|W9G&vLCp@kvoCVPL82y8V4y$9NU&I} z@Wm1T=#SQwPT4}wGLZ|nzMk?3u-F-|{}@=+X79~q10!>gOe8rL0V|I5tSm=oXN;|% zkn%0o+NrPp1D;(~Cp!L|u{3HT4z9dYr6H6EY&P3O)lJ&}uPfCw_8jCP@(4mH*Ngj2 z1(ZH0C}?$Mg`KaRauIM)p=#sqz~SwYWl7j|Uj6UFY-|3KIxc&=K;%$*y_uIP@T;Sx z$EV6jd@yGqU}c-UaK@LpkvIOOJjXQgyTJly_iRZ-%iIA;i(TmF+P*0@h7K{S;@?)Z%#r#+Ha6VO?SKkH^LG^Iugl$25Qh^%ckoGjdH6%1@iLT*ain z0p(e5Xa(v*vVIst~D?Xb(so3#sUP0Sd0aPS`E#1%85o zhEJIsO=E`@tL6cPd0kbK2H21pd9(Ef;8_Q%Tn;fv1Tz~AL+xS{z!njA(Q@06yRY^$ zo8i+UnrORcp0&G_SvlwACA2U{OIVg#=-xm86&(cp7?>DLz#3jlr>sA#`_kWLG(rum z*;a>gaIpJd-!%kqer)am%Dr>{|0gs;QTQnJn);meaVO4*TZoFXo<4F`s-5D*O)bTm?)9e1HgCbm6^|rf}s% zq{{AV^SoIkT+I>rWGP(b6Uj^eQ!i?r|MLb+NbIcaP-|4qW(j-)i}N<;NNBfT{s2u) B?wbGr literal 63475 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 KkGk>Ih<^ZA0^k7v literal 41230 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ڭ-<9 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 SO4bOUFdlAR2TEOkxcD!Ay^XT~ diff --git a/docs/images/native-launcher/settings-dark.png b/docs/images/native-launcher/settings-dark.png index 44893e28e47d651ced485dfe91ed4938fcd2c814..394d9959094cceb44b68bf64cd03c38ce3b5039b 100644 GIT binary patch literal 51754 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 a5d7|6{LVZJfLwGK7z%RW2gNcke*F(+IZA&3 diff --git a/docs/images/native-launcher/settings-fullscreen-compact.png b/docs/images/native-launcher/settings-fullscreen-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..50bcde132c19b740b54d372c0bf16adfbfc590f8 GIT binary patch literal 42569 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 XN*rtiD>dr-9WCPmDLAZ+xv4Whi@KR5j_~>1tA# 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 V{`Aw%6Hef#2uj}+nWc9*=s)?0BGv!^ literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png index 5c199b3cb2c71060518eb8b5b56e48a0260634b1..1574e409dbed90f5eba495339f0975bbe06d29b8 100644 GIT binary patch literal 52936 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 H-PivGChRb2 literal 51580 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 diff --git a/docs/images/native-launcher/worlds-compact.png b/docs/images/native-launcher/worlds-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2046e4f085b5cd3ad3603cb6deb6a5cb02bd3c GIT binary patch literal 55533 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

LZk5*mCZYT*hrnJy#^rk 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 z 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 literal 70822 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
nvZ{e#g(Vtv%PxRfQJ-NJX-XeHF4MY$TJ6vtu1 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 diff --git a/docs/native-launcher.md b/docs/native-launcher.md index 895b335a..612b52d7 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -8,20 +8,24 @@ AutoPlug targets Java 9 or later. Minecraft runs in a separate JVM selected from Enable the existing system-tray option in AutoPlug's general configuration and click the tray icon to open the dashboard. Closing the window hides it; it does not stop AutoPlug or its running worlds. When the operating system has no system tray, the dashboard opens as a normal window. -The header names the current tab, and common actions have icons with text or accessible labels. Long operations show their current step and animated progress; downloads report measured byte progress when a total is known. The current source URL can be selected and copied, and **Activity details** keeps a copyable history of steps and download sources. Download URLs also appear in logs with sensitive credentials redacted. Settings keeps account and sharing controls visible in two compact columns; **Advanced** expands optional runtime overrides. +The header names the current tab, and common actions have icons with text or accessible labels. Long operations run in background workers. An overall progress bar advances while work is active and reaches completion when the operation succeeds. **Overall progress is an estimate**, not a measurement of all remaining work; the tooltip separately reports current-file bytes and percentage when known. The current source URL can be selected and copied, and **Activity details** keeps a copyable history of steps and download sources. Download URLs also appear in logs with sensitive credentials redacted. Settings keeps account and sharing controls visible in two compact columns; **Advanced** expands optional runtime overrides. -1. **Profiles** starts with a playable `Default (VANILLA)` client and a matching `Default` server profile. Defaults use the configured Minecraft version, initially `1.21.1`, and do not download the game until needed. An existing usable default preference is preserved; a template or pending migration is replaced as the launch default without changing that profile. Version-specific defaults are reused rather than retargeting an existing profile. Create additional client profiles with type `MODS`, a Minecraft version and a loader. Vanilla also uses `MODS`, with loader `VANILLA` and an empty collection. +1. **Profiles** prepares three defaults for the configured Minecraft version, initially `1.21.1`: `Default (VANILLA)` client, `Default` Vanilla server, and `Default (FABRIC)` client utilities. Creating these entries is offline; game files and the Fabric utility collection download only when selected for launch. An existing usable default preference is preserved; a template or pending migration is replaced as the launch default without changing that profile. Version-specific defaults are reused rather than retargeting an existing profile. Create additional client profiles with type `MODS`, a Minecraft version and a loader. Vanilla also uses `MODS`, with loader `VANILLA` and an empty collection. 2. Add mod or plugin JARs to the profile's collection directory, available through **Open folder**, or use `.profiles add` below. Provider identities in `collection.json` allow version-aware update checks; `.profiles add --modrinth` records a Modrinth project ID or slug. -3. In **Settings**, select an offline player name or sign in with Microsoft. Configure runtime overrides only if automatic selection is unsuitable. +3. In **Settings**, select an offline player name or sign in with Microsoft. Minecraft starts fullscreen by default; the **Fullscreen** preference controls subsequent client launches. Configure runtime overrides only if automatic selection is unsuitable. 4. Use **Launch client**, or select a server in **Server Browser** and choose a compatible client profile. If no client profiles exist, the dashboard prepares defaults before continuing. The browser shows Minecraft version, MOTD, player count and latency through AutoPlug's existing status ping. A server's reported version is not proof that every installed mod will be compatible; review the selected loader and collection. -Server Browser presents favorites as responsive cards, with a generic server icon, address, connection state, MOTD, player count, reported version and latency. Each card keeps Join, Ping, Copy address, Edit and Remove nearby. Search and sorting help navigate larger lists; keyboard navigation and accessible action labels remain available. The generic icons are local UI artwork, not fetched server logos. +Server Browser presents compact favorites with a server icon, address, distinct online/offline state, MOTD, player count, reported version and latency. The status ping supplies the server's icon when available: AutoPlug accepts bounded 64 × 64 PNG data and uses its local fallback icon for absent or invalid images. It does not follow arbitrary image URLs. The generic imported name `Minecraft Server` is displayed as the server address. Each entry keeps Join, Ping, Copy address, Edit and Remove nearby. The initial sort is **Last joined**, newest first; search, alternative sorts, reverse order and keyboard navigation remain available. History is recorded after the client process starts for that target, which does not prove that the multiplayer connection succeeded. The browser imports favorites from the standard Minecraft `servers.dat` when the dashboard starts. Importing reads the vanilla file and keeps AutoPlug favorites separately; it does not rewrite the vanilla file. Favorites can also be added through the dashboard or CLI. +Joining a server or launching a world opens a chooser with large profile buttons. AutoPlug remembers a ready profile per target and falls back to an eligible configured default or the world's selected client. When a preferred choice is available, a visible two-second countdown starts it. **Wait, let me select something else…** cancels that countdown and leaves the choices open; selecting another profile uses it immediately. Closing the chooser cancels it. Deleted, template, pending-migration or incompatible choices are not silently reused. Existing singleplayer saves still require a Vanilla profile with their exact recorded version. + +Native client preparation downloads independent libraries, native archives, the client JAR and assets with at most eight workers and a bounded queue. Verified cached files are reused. Retryable connection and HTTP failures get up to three attempts; invalid metadata, file-system failures and cancellation are not retried indefinitely. A failed or interrupted batch cancels outstanding HTTP requests and workers. Loader installers can run their own download processes; their source URLs and output appear in the same activity history. This describes background preparation cancellation, not a separate general-purpose Cancel button in the dashboard. + ### Dashboard previews -These previews render the actual Swing components in the default light theme with synthetic fixture data at 1200 × 820 pixels. They show the layout and available controls; they do not demonstrate live Microsoft authentication, server connectivity or router sharing. The fixture data and rendering helper are in `DashboardPanelTest`. +These previews render the actual Swing components with synthetic fixture data at 1200 × 820 and 950 × 620 pixels in light and dark themes. They show layout and controls; they do not demonstrate live Microsoft authentication, server connectivity, gameplay or router sharing. The [reproducible fixture helper and instructions](testing/README.md) include the sample data. Icons, logs and progress are synthetic; the progress preview uses a fixed estimated position, not a download measurement. **Profiles:** isolated client and server collections, reusable templates, and migration controls. @@ -39,7 +43,13 @@ These previews render the actual Swing components in the default light theme wit ![Server Browser with fixture favorites and action icons](images/native-launcher/server-browser.png) -Additional Server Browser previews show the [dark theme](images/native-launcher/server-browser-dark.png) and [compact 950 × 620 layout](images/native-launcher/server-browser-compact.png). Settings previews show the [dark theme](images/native-launcher/settings-dark.png) and [compact 950 × 620 layout](images/native-launcher/settings-compact.png). +Additional Server Browser previews show the [dark theme](images/native-launcher/server-browser-dark.png) and [compact 950 × 620 layout](images/native-launcher/server-browser-compact.png). Profiles shows the full first-launch utility summary in its [compact layout](images/native-launcher/profiles-compact.png). Settings previews show the [dark theme](images/native-launcher/settings-dark.png), [compact account view](images/native-launcher/settings-compact.png) and [fullscreen/sharing controls after scrolling](images/native-launcher/settings-fullscreen-compact.png). + +**Managed console:** each selected managed world has its own console, command entry and lifecycle controls, shown with sample logs in [light](images/native-launcher/managed-console.png) and [compact dark](images/native-launcher/managed-console-dark-compact.png) layouts. + +**Profile chooser:** large profile buttons and the red countdown-cancel control are shown in [light](images/native-launcher/launch-chooser.png), [dark](images/native-launcher/launch-chooser-dark.png) and [compact](images/native-launcher/launch-chooser-compact.png) component previews. + +**Activity:** the current step stays readable above the overall progress fill, with a copyable source URL below it. See the synthetic [light](images/native-launcher/overall-progress.png), [dark](images/native-launcher/overall-progress-dark.png) and [compact](images/native-launcher/overall-progress-compact.png) previews. ## Profiles and migration @@ -57,6 +67,16 @@ Mark reusable packs as **templates**, then clone them before playing. A clone ha Modrinth and CurseForge identities support target-version checks. A generic GitHub, Spigot or custom update URL may not describe game/loader compatibility, so it cannot by itself establish compatibility during migration. The existing provider integrations still handle ordinary updates where applicable. +The Profiles tab links to [Modrinth](https://modrinth.com/mods) and [CurseForge](https://www.curseforge.com/minecraft) for browsing additional mods. These open the provider in the browser; downloaded user-selected JARs still belong in the chosen profile's collection. + +### Default Fabric utilities + +The additional Fabric client uses a deliberately small recipe from the requested utility list: **Fabric API, Sodium, Entity Culling, ImmediatelyFast and Mod Menu**. Required provider-declared libraries are included recursively; the current Minecraft 1.21.1 selection also needs **Text Placeholder API**. The preset adds no map, shader pack or gameplay-changing mod and does not require these utilities on the server. A server can still enforce its own mod rules. + +On its first launch, AutoPlug resolves listed stable Fabric releases for the exact Minecraft version. It rejects server-required dependencies, conflicting required versions, declared incompatibilities and server-only artifacts. Optional dependencies are not added. The complete dependency plan is resolved before downloading, and every downloaded JAR is staged, size/checksum checked and inspected for Fabric metadata before any part of the collection is activated. Duplicate dependencies and cycles do not cause repeated installs. + +If a compatible release is absent, the provider fails, a download is invalid, or activation fails, the launch reports the error and leaves no active partial preset. Existing user mods in an uninstalled default are preserved and cause an explicit conflict instead of being overwritten. After a successful install, normal launches do not query the provider or re-seed removed mods; deliberate customization remains intact. Provider identities are retained in `collection.json` so subsequent changes use the ordinary **Check**/**Update** workflow. The Fabric marker and version make default creation idempotent, including after renaming the profile. This recipe does not promise availability for every historical Minecraft release. + Profiles in use are locked against concurrent update, clone or delete operations. Deleting a profile moves it into recoverable trash; profiles referenced by saved worlds must be detached or their worlds removed first. ## Commands @@ -116,7 +136,7 @@ Use the first command in a running AutoPlug console to keep sign-in within that ## Existing singleplayer saves -**Worlds** scans `saves/` in the standard Minecraft directory: `%APPDATA%/.minecraft` on Windows, `~/Library/Application Support/minecraft` on macOS, and `~/.minecraft` on Linux. Its bounded `level.dat` reader exposes name, recorded version, modded status, last-played time, enabled datapacks, cheats and hardcore settings. Cards also show a validated `icon.png`, save size and Quick Play eligibility where known. Size scanning does not follow links and stops at its entry, depth or time budget; an incomplete size is labeled **At least**. Datapack display is capped. Refresh rescans the folder. Discovery does not copy, convert, rename or rewrite saves; malformed or linked entries are skipped with a diagnostic. +**Worlds** scans `saves/` in the standard Minecraft directory: `%APPDATA%/.minecraft` on Windows, `~/Library/Application Support/minecraft` on macOS, and `~/.minecraft` on Linux. Its bounded `level.dat` reader exposes name, recorded version, modded status, last-played time, enabled datapacks, cheats and hardcore settings. Cards also show a validated `icon.png`, save size and Quick Play eligibility where known. Local saves and managed worlds are ordered by newest known activity, considering recorded last play, creation and file modification times. Size scanning does not follow links and stops at its entry, depth or time budget; an incomplete size is labeled **At least**. Datapack display is capped. Refresh rescans the folder. Discovery does not copy, convert, rename or rewrite saves; malformed or linked entries are skipped with a diagnostic. A problem reading the local saves root does not hide valid managed worlds. Choose **Launch** on a singleplayer card to open the original save using Vanilla Minecraft and the account selected in Settings. The recorded game version is preserved, including the exact pre-release or release-candidate build. A save with no recorded version requires you to choose its original version explicitly; AutoPlug never chooses an upgrade automatically. Saves marked as modded must be opened using their original modded setup to preserve their contents. @@ -138,7 +158,7 @@ Use `--version` only to supply a missing original version; an override that diff ## Managed worlds and sharing -In **Worlds**, create a managed world with a server profile and a playable client profile. Matching defaults are prepared when needed; they do not accept the server EULA. The profiles must use compatible game versions and mod loaders. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available, and the bounded save metadata appears after the world has a readable `level.dat`. +In **Worlds**, create a managed world with a server profile and a playable client profile. Matching defaults are prepared when needed; they do not accept the server EULA. The profiles must use the same game version. Non-Vanilla modded servers also require matching client loaders; a Vanilla server can use a modded client, including the default Fabric utilities. Each world owns a separate save directory, even when multiple worlds use the same server profile. Mod/plugin JARs are materialized from the profile; world-specific configuration and saves remain separate. An existing world icon or server icon is shown as its thumbnail when available, and the bounded save metadata appears after the world has a readable `level.dat`. Read and accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for the world before launching it. AutoPlug does not silently accept it during profile creation or server installation. The CLI flag below records that explicit choice: @@ -152,7 +172,13 @@ Read and accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for the world `--accept-eula` is also supported by `worlds create`. After acceptance is recorded, subsequent launches need no flag. `worlds launch WORLD_ID --share` additionally requests sharing, subject to the settings and account requirements below. -Launching starts a background dedicated server bound to `127.0.0.1`, waits for Minecraft status readiness, then connects the native client to it. The preferred port from Settings is used when available; an occupied port causes selection of another free loopback port. Closing the client sends the server a graceful `stop`; startup failures and application shutdown also clean up owned processes. +Managed worlds require the packaged `AutoPlug-Client.jar`; running the parent from an IDE classes directory produces an explicit packaging error for this feature. Each world gets a copy of the current AutoPlug JAR under its own `server/autoplug/` directory. That child runs the full legacy server wrapper in the world's isolated working directory, with independent configuration, console input, logs and server process. The wrapper uses the parent's Java 9-or-later runtime; Minecraft uses its separately selected runtime, including Java 8 where needed. The installer's exact argument vector is preserved, including paths with spaces and modern Forge/NeoForge argument files. + +Launching starts the child AutoPlug wrapper and a dedicated server bound to `127.0.0.1`, waits for Minecraft status readiness, then connects the native client to it. The preferred port from Settings is used when available; an occupied port causes selection of another free loopback port. Closing the client sends that world's wrapper `.stop both`, allowing its server-saving shutdown hook to run. Startup failures and application shutdown also clean up owned processes, with a bounded graceful wait before termination if they do not exit. Restart tracks the process generation so a previous server exit cannot stop its live replacement. + +**Server Manager** selects a managed world and exposes **Play / start**, **Stop**, **Restart**, **Back up**, **AutoPlug help**, **Server status**, **Configuration** and **World folder**. Its console accepts one Minecraft or AutoPlug command at a time and displays the latest 64 KiB of that world's output. Refreshing a console or switching worlds does not route commands to the parent's legacy singleton server. Configuration opens that world's `autoplug` folder; backup and other optional legacy features use its own configuration. Backup is initially disabled and can be enabled there. + +The parent owns managed-session lifetime and pinned versions. Child self/Java/server/mod/plugin updaters, recurring update checks and scheduled restarts stay disabled, with comments explaining the policy; use the parent's profile update workflow and the selected world's Restart control. Child startup also disables its own tray, start-on-boot registration, automatic EULA acceptance and crash restart. World-specific keys, backup preferences and unrelated configuration are preserved. Existing authentication checks still apply to optional AutoPlug online services; an unconfigured key does not authorize a remote connection. The local AutoPlug-plugin listener binds loopback and selects a free port independently for each child. These child settings do not change the parent's normal legacy configuration. Sharing requires all of the following: @@ -175,10 +201,11 @@ The default data root is `~/.autoplug`, where `~` means the operating-system use | `profiles//` | Profile identity, collection metadata, configuration and mod/plugin collection | | `worlds//world.json` | World identity, profile references and recorded EULA choice | | `worlds//server/` | Dedicated server files, world saves and `autoplug-server.log` | +| `worlds//server/autoplug/` | Copied AutoPlug executable, exact server command metadata, and this world's legacy wrapper configuration/logs | | `worlds/world-/local-world.json` | Metadata-only ownership reference to an existing singleplayer save; its files remain in Minecraft's original `saves/` directory | | `cache/` | Shared game downloads, libraries, assets, installer artifacts, content-addressed JARs and runtimes | -| `servers.json` | AutoPlug server favorites | -| `settings.json` | Launcher preferences and account selection | +| `servers.json` | AutoPlug server favorites and last-join history | +| `settings.json` | Launcher preferences, fullscreen/default-profile/account selection, and remembered target/profile choices | | `accounts.json` | Credentials only when account persistence is explicitly requested | | `trash/`, `worlds/.trash/` | Recoverable removed profiles/worlds | @@ -186,7 +213,11 @@ Artifacts use hard links when possible, with symbolic-link or copy fallback. Aut ## Verification and optional live smoke checks -The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, defaults, bounded world metadata, ownership references and CLI aliases, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. Dashboard tests cover progress, concurrent downloads and synchronous layout invalidation while measuring Settings. Settings and world-card stacks use GridBagLayout so wrapped text can invalidate its ancestors without clearing BoxLayout's in-progress measurement arrays. Fixture previews check light and dark layouts at 1200 × 820 and 950 × 620. +The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, three defaults, transactional Fabric dependency installation, bounded world metadata, newest-activity sorting, ownership references and CLI aliases, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. Additional tests cover bounded server icons, persisted join/profile preferences, the chooser countdown and abort, parallel download retries/cancellation, estimated progress, and per-world console routing. Wrapper tests verify configuration/JAR preparation and real isolated fixture-process control; these tests alone do not prove that the full packaged legacy wrapper or Minecraft game has run. + +The final-review automated run reported **189 tests: 188 passed, no failures or errors, and one Windows symbolic-link capability skip**. Java 9 release compilation and Maven packaging passed. The separate packaged-wrapper smoke started two real AutoPlug child instances around fixture JVM servers, verified isolated console commands, restarted one server, stopped it gracefully, and verified that a raw stop of the second server automatically exited its wrapper within 15 seconds. That last check exercises the shutdown hook without holding the server lifecycle lock. No Microsoft sign-in, live multiplayer join or gameplay result is implied by these checks. + +Dashboard tests also cover synchronous layout invalidation while measuring Settings. Settings and world-card stacks use GridBagLayout so wrapped text can invalidate its ancestors without clearing BoxLayout's in-progress measurement arrays. Fixture previews check light and dark layouts at 1200 × 820 and 950 × 620. `DashboardDisplayableTest` additionally creates hidden native Swing peers, validates the actual window/scroll-pane hierarchy, and resizes both themes repeatedly across the Settings column breakpoint. It checks Advanced controls, preserved field edits, scroll reachability, world-card bounds and uncaught event-thread exceptions. It requires a desktop environment, skips in headless mode, and never shows a window or contacts game services. This is automated window-lifecycle coverage, not human acceptance testing or interactive gameplay. @@ -195,7 +226,7 @@ Legacy automatic entry is checked with exact-version mapping fixtures, forked co From a checkout with Maven and a suitable JDK, run: ```text -mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,LauncherDefaultsTest,LauncherCommandsTest,LocalClientLifecycleTest,MinecraftLauncherTest,LegacyWorldLaunchTest,DownloadProgressTest,LegacyDownloadProgressTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,LocalWorldStoreTest,WorldServiceTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,MineStatJsonTest,DashboardPanelTest" test +mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,ProviderCompatibilityTest,LauncherDefaultsTest,FabricDefaultProfileTest,LauncherPreferencesTest,LauncherCommandsTest,LocalClientLifecycleTest,WorldActivityOrderingTest,MinecraftLauncherTest,LegacyWorldLaunchTest,DownloadProgressTest,ParallelDownloadsTest,LegacyDownloadProgressTest,ModrinthArtifactIdentityTest,MicrosoftAccountServiceTest,JavaRuntimeManagerTest,WorldStoreTest,LocalWorldStoreTest,WorldServiceTest,AutoPlugWorldBootstrapTest,ServerProcessObservationTest,MinecraftServerInstallerTest,UpnpSharingServiceTest,ServerBrowserTest,ServerFavoriteHistoryTest,ServerIconTest,ServerStatusIconIntegrationTest,MineStatJsonTest,DashboardPanelTest,DashboardServerRowsTest,LaunchChoicePanelTest,OverallProgressTest,ManagedWorldPanelTest" test mvn -DskipTests package ``` @@ -205,7 +236,15 @@ On a desktop host, run the additional window-lifecycle check explicitly: mvn -Djava.awt.headless=false -Dtest=DashboardDisplayableTest test ``` -The dependency-inclusive executable is `target/AutoPlug-Client.jar`. A live download/client smoke check is optional and contacts the official game/runtime providers; it may download substantial assets and opens a Minecraft window: +The dependency-inclusive executable is `target/AutoPlug-Client.jar`. After packaging, the standalone `ManagedWorldPackagedSmoke` test helper can exercise actual packaged AutoPlug child instances around offline fixture servers. From the checkout on Windows, replace both paths below, using a fresh scratch directory: + +```text +java -cp "target/AutoPlug-Client.jar;target/test-classes" com.osiris.autoplug.client.worlds.ManagedWorldPackagedSmoke "C:\path\to\AutoPlug-Client" "C:\path\to\fresh-smoke-directory" +``` + +Use `:` instead of `;` between the classpath entries on Linux or macOS and supply absolute paths for those systems. The helper creates two isolated wrapper copies, checks readiness through loopback status responses, compares fixture PIDs with owned descendants, routes commands to the correct console, restarts one server and stops both gracefully. It also checks retained managed-policy comments. The fixture writes its own PID/command evidence into the scratch directory. It does not load Minecraft saves, accept the Minecraft EULA, authenticate an account or contact an external server. A passing result establishes the packaged wrapper lifecycle, not gameplay. + +A live download/client smoke check is optional and contacts the official game/runtime providers; it may download substantial assets and opens a Minecraft window: ```text java -Dautoplug.home=./launcher-smoke -jar target/AutoPlug-Client.jar .profiles create "Vanilla smoke" 1.20.1 VANILLA --type mods diff --git a/docs/testing/FinalUiPreview.java b/docs/testing/FinalUiPreview.java new file mode 100644 index 00000000..92704096 --- /dev/null +++ b/docs/testing/FinalUiPreview.java @@ -0,0 +1,164 @@ +package com.osiris.autoplug.client.ui; + +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.FlatLightLaf; +import com.osiris.autoplug.client.browser.*; +import com.osiris.autoplug.client.ui.LauncherActions.*; +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.nio.file.*; +import java.util.*; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; + +/** External offscreen renderer. All accounts, logs, icons, states and progress are fixtures. + * No Minecraft launch, downloaded artifact, public server connection or account operation occurs. + */ +public final class FinalUiPreview { + public static void main(String[] args) throws Exception { + if (args.length != 4) throw new IllegalArgumentException("Usage: FinalUiPreview "); + Path output = Paths.get(args[0]).toAbsolutePath(); Files.createDirectories(output); + int width = Integer.parseInt(args[1]), height = Integer.parseInt(args[2]); + Path data = Files.createTempDirectory("autoplug-final-ui-fixture-"); + FixtureActions actions = new FixtureActions(); AtomicReference dashboard = new AtomicReference<>(); + AtomicReference chooser = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> { + if ("dark".equalsIgnoreCase(args[3])) FlatDarkLaf.setup(); else FlatLightLaf.setup(); + dashboard.set(new DashboardPanel(actions, new ServerBrowserService(data.resolve("servers.json"), data.resolve("servers.dat")), false)); + }); + DashboardPanel panel = dashboard.get(); + try { + await(() -> ((JProgressBar)find(panel, "activity-progress")).getValue() == 100); + SwingUtilities.invokeAndWait(() -> { + SavedServer newest = new SavedServer("Quiet Cove", "cove.example.invalid", 3000); + SavedServer generic = new SavedServer("Minecraft Server", "skyline.example.invalid:25566", 2000); + SavedServer pending = new SavedServer("Weekend Adventure", "weekend.example.invalid", 1000); + Map states = new LinkedHashMap<>(); + states.put(newest.address, new ServerStatus(true, "Build together, explore new places, and relax.\nWelcome to our community survival world.", "Paper 1.21.1", 12, 40, 767, 38, "SUCCESS", fixtureIcon())); + states.put(generic.address, new ServerStatus(false, "", "", 0, 0, 0, 0, "Could not reach the server. Try again when it is online.")); + panel.displayServers(Arrays.asList(pending, generic, newest), states); + }); + for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Settings"}) { + SwingUtilities.invokeAndWait(() -> button(panel, view).doClick(0)); + if ("Profiles".equals(view)) { + SwingUtilities.invokeAndWait(() -> table(panel).setRowSelectionInterval(1, 1)); + await(() -> ((JProgressBar)find(panel, "activity-progress")).getValue() == 100); + } + render(panel, output.resolve(view.toLowerCase(Locale.ROOT).replace(' ', '-') + ".png"), width, height); + if ("Settings".equals(view) && width < 1000) { + SwingUtilities.invokeAndWait(() -> { + Container defaults = find(panel, "settings-defaults"); + JViewport viewport = (JViewport)SwingUtilities.getAncestorOfClass(JViewport.class, defaults); + if (viewport != null) viewport.setViewPosition(new Point(0, Math.max(0, defaults.getParent().getY() - 6))); + }); + render(panel, output.resolve("settings-defaults.png"), width, height); + } + } + SwingUtilities.invokeAndWait(() -> { + button(panel, "Server Browser").doClick(0); + ((JTabbedPane)find(panel, "server-browser-tabs")).setSelectedIndex(1); + ((ManagedWorldPanel)find(panel, "managed-world-console")).select("cove"); + }); + await(() -> ((JTextArea)find(panel, "managed-world-output")).getText().contains("Preview fixture")); + render(panel, output.resolve("managed-console.png"), width, height); + SwingUtilities.invokeAndWait(() -> chooser.set(new LaunchChoicePanel(actions.clients(), actions.profiles().get(1), true, + ignored -> { throw new AssertionError("Fixture must never launch a profile"); }, () -> 0L))); + render(chooser.get(), output.resolve("launch-chooser.png"), width < 1000 ? 460 : 610, 350); + SwingUtilities.invokeAndWait(() -> { + button(panel, "Profiles").doClick(0); + panel.importArtifact(actions.profiles().get(1), "fixture-utility.jar", "fixture-project"); + }); + if (!actions.started.await(4, TimeUnit.SECONDS)) throw new AssertionError("Fixture work did not start"); + actions.progress.accept("Preparing utility mods — fixture download 37% · https://example.invalid/fixture-utility.jar"); + await(() -> ((JTextField)find(panel, "download-source")).isVisible()); + // Presentation-only position for this synthetic activity; the real progress estimator is tested separately. + SwingUtilities.invokeAndWait(() -> ((JProgressBar)find(panel, "activity-progress")).setValue(48)); + render(panel, output.resolve("overall-progress.png"), width, height); + System.out.println("Rendered fixture previews: " + output); + } finally { + actions.release.countDown(); + SwingUtilities.invokeAndWait(() -> { if (chooser.get() != null) chooser.get().close(); panel.close(); }); + Files.deleteIfExists(data); // This fixture directory remains empty; never recursively remove data. + } + } + + private static final class FixtureActions implements LauncherActions { + volatile Consumer progress = ignored -> {}; + final CountDownLatch started = new CountDownLatch(1), release = new CountDownLatch(1); + public void onProgress(Consumer listener) { progress = listener == null ? ignored -> {} : listener; } + public List profiles() { return Arrays.asList( + new ProfileInfo("vanilla", "Default (VANILLA)", "1.21.1", "VANILLA", "MODS", "sample-profiles/default-vanilla", false), + new ProfileInfo("fabric", "Default (FABRIC)", "1.21.1", "FABRIC", "MODS", "sample-profiles/default-fabric", false, + "Client utility mods install on first launch: Fabric API, Sodium, Entity Culling, ImmediatelyFast and Mod Menu, with required libraries. Exact-version availability is checked before launch.", true), + new ProfileInfo("server", "Default", "1.21.1", "VANILLA", "MODS_SERVER", "sample-profiles/default-server", false), + new ProfileInfo("friends", "Friends server", "1.21.1", "PAPER", "PLUGINS", "sample-profiles/friends", false), + new ProfileInfo("template", "Exploration base", "1.21.1", "FABRIC", "MODS", "sample-profiles/exploration", true)); } + List clients() { return profiles().subList(0, 2); } + public List worlds() { return Arrays.asList( + new WorldInfo("fresh", "Fresh start", "server", "vanilla", "sample-worlds/fresh-start", "", false, false, "1.21.1", + false, -1, 0, true, Collections.emptyList(), false, false, false), + new WorldInfo("cove", "Quiet Cove", "friends", "fabric", "sample-worlds/quiet-cove", "", true, false, "1.21.1", + true, 1791140400000L, 597688320, true, Arrays.asList("vanilla", "file/terrain"), true, false, false), + new WorldInfo("local:cottage", "Lakeside cottage", "", "", "sample-minecraft/saves/Lakeside cottage", "", false, true, "1.21.1", + false, 1791072000000L, 184549376, true, Collections.singletonList("vanilla"), false, false, true)); } + public SettingsInfo settings() { SettingsInfo settings = new SettingsInfo(); settings.account = "Offline · Alex"; + settings.defaultProfile = "fabric"; settings.fullscreen = true; settings.upnp = true; return settings; } + public String serverLog(String id) { return "[Preview fixture — no live server]\n" + + "[AutoPlug] Isolated instance: Quiet Cove\n[AutoPlug] Configuration: sample-worlds/quiet-cove/autoplug\n" + + "[AutoPlug] Started server process for Minecraft 1.21.1\n[Server] Preparing spawn area\n" + + "[Server] Done (3.842s)! For help, type \"help\"\n[Server] Local bind: 127.0.0.1:25565\n" + + "[AutoPlug] Ready. Sharing is disabled until explicitly requested.\n"; } + public void addArtifact(String profile, String jar, String project) throws Exception { started.countDown(); release.await(); } + } + + private static BufferedImage fixtureIcon() { + BufferedImage image = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); try { + g.setColor(new Color(0x24577B)); g.fillRect(0, 0, 64, 64); + g.setColor(new Color(0x61B5CD)); g.fillRect(0, 42, 64, 22); + g.setColor(new Color(0xF5D47A)); g.fillRect(43, 8, 12, 12); + g.setColor(new Color(0x39795F)); g.fillPolygon(new int[]{4, 28, 51}, new int[]{45, 10, 45}, 3); + g.setColor(new Color(0xE9EEE9)); g.fillPolygon(new int[]{20, 28, 36}, new int[]{22, 10, 22}, 3); + } finally { g.dispose(); } return image; + } + private static void render(JComponent component, Path destination, int width, int height) throws Exception { + SwingUtilities.invokeAndWait(() -> { + try { + component.setSize(width, height); for (int i = 0; i < 8; i++) layout(component); + BufferedImage bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g = bitmap.createGraphics(); try { g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); component.printAll(g); } + finally { g.dispose(); } + if (!ImageIO.write(bitmap, "png", destination.toFile())) throw new IllegalStateException("PNG writer missing"); + } catch (Exception e) { throw new RuntimeException(e); } + }); + } + private static void await(BooleanSupplier condition) throws Exception { + AtomicBoolean ready = new AtomicBoolean(); long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); + while (!ready.get() && System.nanoTime() < deadline) { SwingUtilities.invokeAndWait(() -> ready.set(condition.getAsBoolean())); if (!ready.get()) Thread.sleep(20); } + if (!ready.get()) throw new AssertionError("Preview fixture did not settle"); + } + private static Container find(Container parent, String name) { + if (name.equals(parent.getName())) return parent; + for (Component child : parent.getComponents()) if (child instanceof Container) { Container match = find((Container)child, name); if (match != null) return match; } + return null; + } + private static AbstractButton button(Container parent, String text) { + for (Component child : parent.getComponents()) { + if (child instanceof AbstractButton && text.equals(((AbstractButton)child).getText())) return (AbstractButton)child; + if (child instanceof Container) { AbstractButton match = button((Container)child, text); if (match != null) return match; } + } return null; + } + private static JTable table(Container parent) { + for (Component child : parent.getComponents()) { if (child instanceof JTable) return (JTable)child; + if (child instanceof Container) { JTable match = table((Container)child); if (match != null) return match; } } return null; + } + private static void layout(Container parent) { parent.doLayout(); for (Component child : parent.getComponents()) if (child instanceof Container) layout((Container)child); } +} diff --git a/docs/testing/README.md b/docs/testing/README.md new file mode 100644 index 00000000..148765e9 --- /dev/null +++ b/docs/testing/README.md @@ -0,0 +1,19 @@ +# Dashboard fixture previews + +`FinalUiPreview.java` renders the actual Swing dashboard offscreen, using synthetic profiles, worlds, status responses, icons, console logs and progress. It does not connect to public servers, download Minecraft, launch a game, authenticate an account or open a router port. Screenshots demonstrate layout rather than live gameplay. The progress screenshot uses a fixed estimated bar position and a fictional current-file message; it is not a download benchmark. The chooser uses a fixed fixture clock to keep its two-second countdown visible. + +Build the project package first, then run these commands from the repository root using a JDK with `javac` (Java 9 or later): + +```powershell +javac --release 9 -encoding UTF-8 -cp "target/AutoPlug-Client.jar" -d target/ui-preview docs/testing/FinalUiPreview.java +java -Djava.awt.headless=true -cp "target/ui-preview;target/AutoPlug-Client.jar" com.osiris.autoplug.client.ui.FinalUiPreview target/ui-previews/light-1200 1200 820 light +java -Djava.awt.headless=true -cp "target/ui-preview;target/AutoPlug-Client.jar" com.osiris.autoplug.client.ui.FinalUiPreview target/ui-previews/dark-1200 1200 820 dark +java -Djava.awt.headless=true -cp "target/ui-preview;target/AutoPlug-Client.jar" com.osiris.autoplug.client.ui.FinalUiPreview target/ui-previews/light-950 950 620 light +java -Djava.awt.headless=true -cp "target/ui-preview;target/AutoPlug-Client.jar" com.osiris.autoplug.client.ui.FinalUiPreview target/ui-previews/dark-950 950 620 dark +``` + +On Linux or macOS, replace the semicolon in each runtime classpath with a colon. No test classes or additional dependencies are needed with the packaged JAR. Theme colors and fonts can vary slightly by platform. + +Each output directory contains `server-browser.png`, `worlds.png`, `profiles.png`, `settings.png`, `managed-console.png`, `launch-chooser.png` and `overall-progress.png`. Compact runs also capture the scrolled fullscreen/sharing settings as `settings-defaults.png`. The chooser is a standalone component preview at 610 × 350 or 460 × 350; other screenshots use the requested dashboard size. + +The helper uses an empty temporary directory for favorites and removes that exact directory afterward. Profile/world paths, the favicon and all `.invalid` addresses are fixture data. Review generated images before copying them into `docs/images/native-launcher`. diff --git a/src/main/java/com/osiris/autoplug/client/Main.java b/src/main/java/com/osiris/autoplug/client/Main.java index 776d9d95..3d6d2744 100644 --- a/src/main/java/com/osiris/autoplug/client/Main.java +++ b/src/main/java/com/osiris/autoplug/client/Main.java @@ -81,6 +81,9 @@ public static synchronized LauncherServices getLauncher() throws Exception { * - test: enables test mode
*/ public static void main(String[] _args) { + try { + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.configureIfChild(_args)) _args = new String[]{"skipSystemCheck"}; + } catch (Exception e) { System.err.println("Managed AutoPlug world could not start: " + e.getMessage()); System.exit(2); return; } LauncherEntry launcherEntry = new LauncherEntry(); if (launcherEntry.isLauncherCommand(_args)) { @@ -134,6 +137,9 @@ public static void main(String[] _args) { system.checkReadWritePermissions(); system.checkInternetAccess(); system.addShutDownHook(); + } else if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { + // The parent already prepared the world; retain graceful stop even when skipping network/system prompts. + new SystemChecker().addShutDownHook(); } // Set default SysOut to TeeOutput, for the OnlineConsole @@ -298,7 +304,8 @@ public static void main(String[] _args) { } try { - if (generalConfig.autoplug_start_on_boot.asBoolean()) + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { /* Parent owns child lifetime; never change global startup registration. */ } + else if (generalConfig.autoplug_start_on_boot.asBoolean()) new UtilsNative().enableStartOnBootIfNeeded(new UtilsJar().getThisJar()); else new UtilsNative().disableStartOnBootIfNeeded(); } catch (Exception e) { diff --git a/src/main/java/com/osiris/autoplug/client/Server.java b/src/main/java/com/osiris/autoplug/client/Server.java index 54e57ee8..39f671f5 100644 --- a/src/main/java/com/osiris/autoplug/client/Server.java +++ b/src/main/java/com/osiris/autoplug/client/Server.java @@ -40,13 +40,21 @@ public final class Server { private static final AtomicBoolean isKill = new AtomicBoolean(false); + private static final AtomicBoolean isRestarting = new AtomicBoolean(false); @Nullable public static AsyncInputStream ASYNC_SERVER_IN; - private static Process process; + private static volatile Process process; + // Guarded by Server.class: once exit is chosen, releasing the lock must not admit a new start. + private static boolean autoStopRequested; private static Thread threadServerAliveChecker; private static boolean colorServerLog; public static File getServerExecutable() throws NotLoadedException, YamlReaderException, YamlWriterException, IOException, IllegalKeyException, DuplicateKeyException, IllegalListException { + List managed = com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.childCommand(); + if (managed != null) { + int jar = managed.indexOf("-jar"); + return new File(jar >= 0 && jar + 1 < managed.size() ? managed.get(jar + 1) : managed.get(0)); + } File serverExe = null; while (true) { serverExe = new UtilsJar().determineServerJar(); @@ -101,6 +109,7 @@ public static File getServerExecutable() throws NotLoadedException, YamlReaderEx } public static synchronized void start() { + if (autoStopRequested) return; try { try { colorServerLog = new LoggerConfig().color_server_log.asBoolean(); @@ -129,15 +138,17 @@ public static synchronized void start() { } } - public static void restart() { + public static synchronized void restart() { + if (autoStopRequested) return; //Before starting make backups and check for updates AL.info("Restarting server..."); try { + isRestarting.set(true); stop(); start(); } catch (Exception e) { AL.warn(e); - } + } finally { isRestarting.set(false); } } /** @@ -287,9 +298,12 @@ private static void createProcess() throws Exception { // but messes input up, because there are 2 scanners on the same stream. // That's why we pause the current Terminal, which disables the user from entering console commands. // If AutoPlug-Plugin is installed the user can executed AutoPlug commands through in-game or console. - List commands = new UtilsString().splitBySpacesAndQuotes(startCommand); - for (int i = 0; i < commands.size(); i++) { - commands.set(i, commands.get(i).replaceAll("\"", "")); // Processbuilder does not support quotes + List commands = com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.childCommand(); + if (commands == null) { + commands = new UtilsString().splitBySpacesAndQuotes(startCommand); + for (int i = 0; i < commands.size(); i++) { + commands.set(i, commands.get(i).replaceAll("\"", "")); // Processbuilder does not support quotes + } } AL.debug(Server.class, "Starting server with commands: " + commands); //TERMINAL.pause(true); @@ -333,32 +347,44 @@ private static void createProcess() throws Exception { if (threadServerAliveChecker == null) { threadServerAliveChecker = new Thread(() -> { try { - boolean lastIsRunningCheck = false; + Process lastObserved = process; + boolean lastIsRunningCheck = lastObserved != null; boolean currentIsRunningCheck; while (true) { Thread.sleep(2000); - currentIsRunningCheck = Server.isRunning(); + Process observed = process; + currentIsRunningCheck = observed != null && observed.isAlive(); + if (observed != lastObserved) { + lastObserved = observed; + lastIsRunningCheck = observed != null; + } if (!currentIsRunningCheck && lastIsRunningCheck) { - AL.info("Server was stopped."); - if (new GeneralConfig().autoplug_auto_stop.asBoolean()) { - AL.info("Stopping AutoPlug too, since 'autoplug-stop' is enabled."); - System.exit(0); - } else { - AL.info("To stop AutoPlug too, enter '.stop both'."); - } - - if (process.exitValue() != 0) { - if (isKill.get()) { - isKill.set(false); + boolean exitAutoPlug = false; + synchronized (Server.class) { + Integer exitCode = observedExitCode(observed); + if (exitCode == null) continue; // A restart replaced this process while we were observing its exit. + AL.info("Server was stopped."); + if (new GeneralConfig().autoplug_auto_stop.asBoolean() && requestAutomaticStop(observed)) { + AL.info("Stopping AutoPlug too, since 'autoplug-stop' is enabled."); + exitAutoPlug = true; } else { - AL.warn("Server crash was detected! Exit-Code should be 0, but is '" + process.exitValue() + "'!"); - if (new GeneralConfig().server_restart_on_crash.asBoolean()) { - AL.info("Restart on crash is enabled, thus the server is restarting..."); - Server.start(); - } + AL.info("To stop AutoPlug too, enter '.stop both'."); } + if (!exitAutoPlug && exitCode != 0) { + if (isKill.get()) { + isKill.set(false); + } else { + AL.warn("Server crash was detected! Exit-Code should be 0, but is '" + exitCode + "'!"); + if (new GeneralConfig().server_restart_on_crash.asBoolean()) { + AL.info("Restart on crash is enabled, thus the server is restarting..."); + Server.start(); + } + } + } } + // Shutdown hooks may call synchronized Server.stop(); never wait for them with its monitor held. + if (exitAutoPlug) { System.exit(0); return; } } lastIsRunningCheck = currentIsRunningCheck; } @@ -370,6 +396,19 @@ private static void createProcess() throws Exception { } } + /** An exit belongs to one process generation; a newly started server must never inherit it. */ + static synchronized Integer observedExitCode(Process observed) { + if (observed == null || observed != process || observed.isAlive() || isRestarting.get()) return null; + return observed.exitValue(); + } + + /** Reserve automatic exit while holding the lifecycle lock; actual JVM exit happens after releasing it. */ + static synchronized boolean requestAutomaticStop(Process observed) { + if (autoStopRequested || observedExitCode(observed) == null) return false; + autoStopRequested = true; + return true; + } + public static String getFileNameWithoutExt(String fileNameWithExt) throws NotLoadedException { return fileNameWithExt.replaceFirst("[.][^.]+$", ""); // Removes the file extension } diff --git a/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java b/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java index f2fcd814..69b18b19 100644 --- a/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java +++ b/src/main/java/com/osiris/autoplug/client/browser/SavedServer.java @@ -2,9 +2,15 @@ public final class SavedServer { public final String name, address; + /** Last successful client launch targeting this favorite, in epoch milliseconds. */ + public final long lastJoinedAt; public SavedServer(String name, String address) { + this(name, address, 0); + } + public SavedServer(String name, String address, long lastJoinedAt) { this.address = ServerAddress.parse(address).toString(); - this.name = name == null || name.trim().isEmpty() ? this.address : name.trim(); + this.name = name == null || name.trim().isEmpty() || "Minecraft Server".equalsIgnoreCase(name.trim()) ? this.address : name.trim(); + this.lastJoinedAt = Math.max(0, lastJoinedAt); } @Override public String toString() { return name + " (" + address + ")"; } } diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java b/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java index be23fb05..c1a48490 100644 --- a/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerBrowserService.java @@ -29,7 +29,8 @@ public synchronized List list() throws IOException { JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); for (JsonElement value : array) { JsonObject entry = value.getAsJsonObject(); - result.add(new SavedServer(entry.get("name").getAsString(), entry.get("address").getAsString())); + result.add(new SavedServer(entry.get("name").getAsString(), entry.get("address").getAsString(), + entry.has("lastJoinedAt") && !entry.get("lastJoinedAt").isJsonNull() ? entry.get("lastJoinedAt").getAsLong() : 0)); } } catch (RuntimeException e) { throw new IOException("Could not read server favorites. The original file was preserved.", e); } return result; @@ -37,8 +38,25 @@ public synchronized List list() throws IOException { public synchronized void add(String name, String address) throws IOException { SavedServer added = new SavedServer(name, address); List servers = list(); + long lastJoined = 0; + for (SavedServer server : servers) if (server.address.equalsIgnoreCase(added.address)) lastJoined = Math.max(lastJoined, server.lastJoinedAt); servers.removeIf(server -> server.address.equalsIgnoreCase(added.address)); - servers.add(added); save(servers); + servers.add(new SavedServer(added.name, added.address, lastJoined)); save(servers); + } + /** Record only after a client starts; a ping or selection must not reorder recent play. */ + public synchronized void recordJoined(String address) throws IOException { + recordJoined(address, System.currentTimeMillis()); + } + synchronized void recordJoined(String address, long at) throws IOException { + String canonical = ServerAddress.parse(address).toString(); + List servers = list(); boolean found = false; + for (int i = 0; i < servers.size(); i++) { + SavedServer server = servers.get(i); + if (server.address.equalsIgnoreCase(canonical)) { + servers.set(i, new SavedServer(server.name, server.address, Math.max(server.lastJoinedAt, at))); found = true; + } + } + if (found) save(servers); // A removed favorite must not be resurrected by a late launch callback. } public synchronized void remove(String address) throws IOException { List servers = list(); servers.removeIf(s -> s.address.equalsIgnoreCase(address)); save(servers); @@ -68,6 +86,6 @@ public ServerStatus ping(SavedServer server) { MineStat ping = new MineStat(address.host, address.port, 3, MineStat.Request.JSON); boolean online = ping.pingResult == MineStat.Retval.SUCCESS && ping.isServerUp(); return new ServerStatus(online, ping.getStrippedMotd(), ping.getVersion(), ping.getCurrentPlayers(), ping.getMaximumPlayers(), - ping.getProtocol(), ping.getLatency(), ping.pingResult.name()); + ping.getProtocol(), ping.getLatency(), ping.pingResult.name(), online ? ServerIcon.decode(ping.getFavicon()) : null); } } diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerIcon.java b/src/main/java/com/osiris/autoplug/client/browser/ServerIcon.java new file mode 100644 index 00000000..4248b0ce --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerIcon.java @@ -0,0 +1,37 @@ +package com.osiris.autoplug.client.browser; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.Iterator; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.MemoryCacheImageInputStream; + +/** Bounded Minecraft status favicon decoder. Never fetches a URL or creates disk cache files. */ +final class ServerIcon { + private static final String PREFIX = "data:image/png;base64,"; + private static final int MAX_BYTES = 96 * 1024; + private ServerIcon() { } + + static BufferedImage decode(String data) { + if (data == null || !data.startsWith(PREFIX) || data.length() > PREFIX.length() + MAX_BYTES * 4 / 3) return null; + try { + byte[] bytes = Base64.getDecoder().decode(data.substring(PREFIX.length())); + if (bytes.length < 24 || bytes.length > MAX_BYTES) return null; + byte[] signature = {(byte)137, 80, 78, 71, 13, 10, 26, 10}; + for (int i = 0; i < signature.length; i++) if (bytes[i] != signature[i]) return null; + try (MemoryCacheImageInputStream input = new MemoryCacheImageInputStream(new ByteArrayInputStream(bytes))) { + Iterator readers = ImageIO.getImageReadersByFormatName("png"); + if (!readers.hasNext()) return null; + ImageReader reader = readers.next(); + try { + reader.setInput(input, true, true); + if (reader.getWidth(0) != 64 || reader.getHeight(0) != 64) return null; + return reader.read(0); + } finally { reader.dispose(); } + } + } catch (IOException | RuntimeException invalid) { return null; } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java b/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java index 633608b9..680a226c 100644 --- a/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java +++ b/src/main/java/com/osiris/autoplug/client/browser/ServerStatus.java @@ -1,12 +1,20 @@ package com.osiris.autoplug.client.browser; +import java.awt.image.BufferedImage; + public final class ServerStatus { public final boolean online; public final String motd, version, message; public final int players, capacity, protocol; public final long latency; + /** Validated 64x64 PNG from the status response, decoded off the Swing thread. */ + public final BufferedImage icon; public ServerStatus(boolean online, String motd, String version, int players, int capacity, int protocol, long latency, String message) { + this(online, motd, version, players, capacity, protocol, latency, message, null); + } + public ServerStatus(boolean online, String motd, String version, int players, int capacity, int protocol, long latency, String message, BufferedImage icon) { this.online = online; this.motd = motd; this.version = version; this.players = players; this.capacity = capacity; this.protocol = protocol; this.latency = latency; this.message = message; + this.icon = icon; } } diff --git a/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java b/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java index de83c804..92be3bc5 100644 --- a/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java +++ b/src/main/java/com/osiris/autoplug/client/configs/GeneralConfig.java @@ -57,7 +57,8 @@ public GeneralConfig(boolean save) throws IOException, DuplicateKeyException, Ya } try { - if (this.autoplug_start_on_boot.asBoolean()) + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { /* Parent owns this isolated instance. */ } + else if (this.autoplug_start_on_boot.asBoolean()) new UtilsNative().enableStartOnBootIfNeeded(new UtilsJar().getThisJar()); else new UtilsNative().disableStartOnBootIfNeeded(); } catch (Exception ex) { @@ -209,6 +210,8 @@ public GeneralConfig(boolean save) throws IOException, DuplicateKeyException, Ya @Override public Yaml validateValues() { + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) + server_start_command.setComments(com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.COMMAND_POLICY); return this; } } diff --git a/src/main/java/com/osiris/autoplug/client/configs/RestarterConfig.java b/src/main/java/com/osiris/autoplug/client/configs/RestarterConfig.java index 3103e819..6bf7848b 100644 --- a/src/main/java/com/osiris/autoplug/client/configs/RestarterConfig.java +++ b/src/main/java/com/osiris/autoplug/client/configs/RestarterConfig.java @@ -128,6 +128,10 @@ public RestarterConfig() throws IOException, DuplicateKeyException, YamlReaderEx @Override public Yaml validateValues() { + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { + restarter_enabled.setValues("false").setComments(com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.RESTARTER_POLICY); + c_restarter_enabled.setValues("false").setComments(com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.RESTARTER_POLICY); + } //Get the config string list //Split each time up into hours and min to validate them diff --git a/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java b/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java index b38a6ac7..74f86216 100644 --- a/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java +++ b/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java @@ -242,6 +242,10 @@ public UpdaterConfig() throws IOException, DuplicateKeyException, YamlReaderExce @Override public Yaml validateValues() { + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { + for (YamlSection section : java.util.Arrays.asList(global_recurring_checks, self_updater, java_updater, server_updater, plugins_updater, mods_updater)) + section.setValues("false").setComments(com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.UPDATER_POLICY); + } String selfP = self_updater_profile.asString(); String jP = java_updater_profile.asString(); String sP = server_updater_profile.asString(); diff --git a/src/main/java/com/osiris/autoplug/client/console/ThreadUserInput.java b/src/main/java/com/osiris/autoplug/client/console/ThreadUserInput.java index 3fd88698..7775c2e7 100644 --- a/src/main/java/com/osiris/autoplug/client/console/ThreadUserInput.java +++ b/src/main/java/com/osiris/autoplug/client/console/ThreadUserInput.java @@ -34,6 +34,18 @@ public ThreadUserInput() { @Override public void run() { super.run(); + if (com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild()) { + // Managed instances have piped stdin; a terminal line editor can swallow pipe commands. + try (java.io.BufferedReader input = new java.io.BufferedReader(new java.io.InputStreamReader(System.in, java.nio.charset.StandardCharsets.UTF_8))) { + String line; + while ((line = input.readLine()) != null) { + for (Consumer listener : onReadLine) listener.accept(line); + if (!Commands.execute(line)) Server.submitCommand(line); + } + } catch (Exception e) { AL.warn(e); } + finally { System.exit(0); } // Parent pipe closed: invoke the normal server-saving shutdown hook. + return; + } try { //Scanner scanner = new Scanner(System.in); // Old LineReader lineReader = LineReaderBuilder.builder() diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java index ff81435a..76350d85 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/LaunchRequest.java @@ -15,6 +15,7 @@ public final class LaunchRequest { public final String serverHost; public final int serverPort; public final String singleplayerWorld; + public final boolean fullscreen; public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, MinecraftAccount account, String serverHost, int serverPort) { @@ -23,6 +24,16 @@ public LaunchRequest(Path gameDir, String version, String loader, String loaderV public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, MinecraftAccount account, String serverHost, int serverPort, String singleplayerWorld) { + this(gameDir, version, loader, loaderVersion, account, serverHost, serverPort, singleplayerWorld, true); + } + + public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, + MinecraftAccount account, String serverHost, int serverPort, boolean fullscreen) { + this(gameDir, version, loader, loaderVersion, account, serverHost, serverPort, null, fullscreen); + } + + public LaunchRequest(Path gameDir, String version, String loader, String loaderVersion, + MinecraftAccount account, String serverHost, int serverPort, String singleplayerWorld, boolean fullscreen) { this.gameDir = Objects.requireNonNull(gameDir, "gameDir").toAbsolutePath().normalize(); this.version = safeVersion(version); this.loader = loader == null ? "VANILLA" : loader.toUpperCase(Locale.ROOT); @@ -43,6 +54,7 @@ public LaunchRequest(Path gameDir, String version, String loader, String loaderV if (singleplayerWorld != null && this.serverHost != null) throw new IllegalArgumentException("Choose either a local world or a multiplayer server."); this.singleplayerWorld = singleplayerWorld; + this.fullscreen = fullscreen; } static String safeVersion(String value) { diff --git a/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java index 18a2faf8..5f7efe51 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/LauncherFiles.java @@ -4,6 +4,7 @@ import com.google.gson.JsonParser; import com.osiris.autoplug.client.utils.UtilsCrypto; import okhttp3.OkHttpClient; +import okhttp3.Call; import okhttp3.Request; import okhttp3.Response; @@ -31,8 +32,10 @@ static JsonObject json(String url) throws IOException { catch (RuntimeException e) { throw new IOException("Invalid JSON metadata from " + DownloadProgress.sourceUrl(url), e); } } static String text(String url) throws IOException { + Call call = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()); try (DownloadProgress.Transfer transfer = DownloadProgress.begin("Fetching metadata", url); - Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { + ParallelDownloads.TrackedCall tracked = ParallelDownloads.track(call); + Response response = call.execute()) { transfer.redirect(response.request().url().toString()); if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + DownloadProgress.sourceUrl(url)); if (response.body().contentLength() > 32 * 1024 * 1024) throw new IOException("Metadata too large: " + DownloadProgress.sourceUrl(url)); @@ -80,6 +83,25 @@ static Path download(String url, Path destination, String sha1, long size, Consu } } private static Path downloadLocked(String url, Path destination, String sha1, long size, Consumer progress) throws IOException { + for (int attempt = 1; ; attempt++) { + try { return downloadAttempt(url, destination, sha1, size, progress); } + catch (IOException failure) { + if (Thread.currentThread().isInterrupted() || failure instanceof java.io.InterruptedIOException + && !(failure instanceof java.net.SocketTimeoutException) + || failure instanceof java.nio.file.FileSystemException + || failure instanceof HttpFailure && !((HttpFailure) failure).retryable() + || attempt >= 3) throw failure; + if (progress != null) progress.accept("Retrying " + destination.getFileName() + " (" + (attempt + 1) + + "/3) from " + DownloadProgress.sourceUrl(url)); + try { Thread.sleep(attempt * 200L); } + catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + throw new java.io.InterruptedIOException("Download cancelled."); + } + } + } + } + private static Path downloadAttempt(String url, Path destination, String sha1, long size, Consumer progress) throws IOException { if (valid(destination, sha1, size)) return destination; if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); Files.createDirectories(destination.getParent()); @@ -89,9 +111,10 @@ private static Path downloadLocked(String url, Path destination, String sha1, lo long total = 0, expected = size; try (DownloadProgress.Transfer ignored = transfer) { if (progress != null) progress.accept(description + " from " + DownloadProgress.sourceUrl(url)); - try (Response response = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()).execute()) { + Call call = HTTP.newCall(new Request.Builder().url(url).header("User-Agent", "AutoPlug/10 native-launcher").build()); + try (ParallelDownloads.TrackedCall tracked = ParallelDownloads.track(call); Response response = call.execute()) { transfer.redirect(response.request().url().toString()); - if (!response.isSuccessful() || response.body() == null) throw new IOException("HTTP " + response.code() + " fetching " + DownloadProgress.sourceUrl(url)); + if (!response.isSuccessful() || response.body() == null) throw new HttpFailure(response.code(), url); if (expected < 0) expected = response.body().contentLength(); try (InputStream in = response.body().byteStream(); OutputStream out = Files.newOutputStream(temporary)) { byte[] buffer = new byte[65536]; @@ -106,9 +129,18 @@ private static Path downloadLocked(String url, Path destination, String sha1, lo } } if (!valid(temporary, sha1, size)) throw new IOException("Checksum or length mismatch: " + destination.getFileName()); + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Download cancelled."); move(temporary, destination); transfer.complete(total, expected); return destination; } finally { Files.deleteIfExists(temporary); } } + private static final class HttpFailure extends IOException { + private final int status; + HttpFailure(int status, String url) { + super("HTTP " + status + " fetching " + DownloadProgress.sourceUrl(url)); + this.status = status; + } + boolean retryable() { return status == 408 || status == 429 || status >= 500; } + } } diff --git a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java index 905c1831..f4928bde 100644 --- a/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java +++ b/src/main/java/com/osiris/autoplug/client/launcher/MinecraftLauncher.java @@ -18,6 +18,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.concurrent.Callable; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -30,39 +31,55 @@ public class MinecraftLauncher { private final Path cacheRoot; private final JavaRuntimeManager runtimes; private final String manifestUrl; + private final String assetBaseUrl; private final LoaderInstaller loaders; public MinecraftLauncher(Path cacheRoot, JavaRuntimeManager runtimes) { this(cacheRoot, runtimes, MANIFEST_URL); } MinecraftLauncher(Path cacheRoot, JavaRuntimeManager runtimes, String manifestUrl) { + this(cacheRoot, runtimes, manifestUrl, "https://resources.download.minecraft.net/"); + } + MinecraftLauncher(Path cacheRoot, JavaRuntimeManager runtimes, String manifestUrl, String assetBaseUrl) { this.cacheRoot = cacheRoot.toAbsolutePath().normalize(); this.runtimes = Objects.requireNonNull(runtimes, "runtimes"); this.manifestUrl = manifestUrl; + this.assetBaseUrl = assetBaseUrl; this.loaders = new LoaderInstaller(this.cacheRoot); } public synchronized PreparedLaunch prepare(LaunchRequest request, Consumer progress) throws Exception { - Consumer log = progress == null ? value -> { } : progress; + Consumer log = ParallelDownloads.serialized(progress); if (request.account.needsRefresh()) throw new IOException("Microsoft session expired. Refresh the account before launching."); Files.createDirectories(request.gameDir); JsonObject vanilla = version(request.version, log); int major = requiredJava(vanilla); Path java = runtimes.resolve(major, log); - Path client = downloadClient(vanilla, request.version, log); + Path client = clientPath(vanilla, request.version); + // Forge processors require the client jar before producing their merged profile. + // Vanilla, Fabric and Quilt can download it alongside all other game files. + boolean installerNeedsClient = request.loader.equals("FORGE") || request.loader.equals("NEOFORGE"); + if (installerNeedsClient) downloadClient(vanilla, request.version, log); JsonObject loader = loaders.clientProfile(request, vanilla, client, java, log); JsonObject metadata = loader == null ? vanilla : merge(vanilla, loader); String id = metadata.get("id").getAsString(); Path natives = LauncherFiles.child(request.gameDir.resolve(".autoplug").resolve("natives"), safeId(id) + "-" + osName() + "-" + System.getProperty("os.arch")); Files.createDirectories(natives); - List classpath = libraries(metadata, natives, log); - classpath.add(clientJarForProfile(client, metadata, cacheRoot)); + List> downloads = new ArrayList<>(); + List> extraction = new ArrayList<>(); + if (!installerNeedsClient) downloads.add(() -> { downloadClient(vanilla, request.version, log); return null; }); + List classpath = planLibraries(metadata, natives, downloads, extraction, log); Path assets = cacheRoot.resolve("assets"); - String assetId = assets(metadata, assets, request.gameDir, log); + String assetId = planAssets(metadata, assets, request.gameDir, downloads, log); Path logging = null; if (metadata.has("logging") && metadata.getAsJsonObject("logging").has("client")) { JsonObject descriptor = metadata.getAsJsonObject("logging").getAsJsonObject("client").getAsJsonObject("file"); logging = LauncherFiles.child(cacheRoot.resolve("logging"), descriptor.get("id").getAsString()); - download(descriptor, logging, log); + Path target = logging; + downloads.add(() -> { download(descriptor, target, log); return null; }); } + ParallelDownloads.run("Minecraft files", downloads, log); + // Native archives can share output filenames. Keep the publisher's extraction order. + for (Callable extract : extraction) extract.call(); + classpath.add(clientJarForProfile(client, metadata, cacheRoot)); List args = buildArguments(metadata, request, classpath, natives, assets, assetId, logging); List temporaryFiles = new ArrayList<>(); if (request.singleplayerWorld != null && !args.contains("--quickPlaySingleplayer")) { @@ -176,11 +193,13 @@ JsonObject version(String requested, Consumer progress) throws IOExcepti static int requiredJava(JsonObject metadata) { return metadata.has("javaVersion") ? metadata.getAsJsonObject("javaVersion").get("majorVersion").getAsInt() : 8; } - private Path downloadClient(JsonObject metadata, String id, Consumer progress) throws IOException { + private Path clientPath(JsonObject metadata, String id) throws IOException { if (!metadata.has("downloads") || !metadata.getAsJsonObject("downloads").has("client")) throw new IOException("This Minecraft version does not publish a client download."); - Path jar = LauncherFiles.child(cacheRoot.resolve("versions"), safeId(id) + "/" + safeId(id) + ".jar"); - return download(metadata.getAsJsonObject("downloads").getAsJsonObject("client"), jar, progress); + return LauncherFiles.child(cacheRoot.resolve("versions"), safeId(id) + "/" + safeId(id) + ".jar"); + } + private Path downloadClient(JsonObject metadata, String id, Consumer progress) throws IOException { + return download(metadata.getAsJsonObject("downloads").getAsJsonObject("client"), clientPath(metadata, id), progress); } static Path download(JsonObject descriptor, Path path, Consumer progress) throws IOException { return LauncherFiles.download(descriptor.get("url").getAsString(), path, string(descriptor, "sha1", null), @@ -196,6 +215,19 @@ static Path clientJarForProfile(Path vanillaJar, JsonObject metadata, Path cache return jar; } List libraries(JsonObject metadata, Path natives, Consumer progress) throws IOException { + Consumer log = ParallelDownloads.serialized(progress); + List> downloads = new ArrayList<>(), extraction = new ArrayList<>(); + List classpath = planLibraries(metadata, natives, downloads, extraction, log); + ParallelDownloads.run("Minecraft libraries", downloads, log); + for (Callable extract : extraction) { + try { extract.call(); } + catch (IOException e) { throw e; } + catch (Exception e) { throw new IOException("Native library extraction failed.", e); } + } + return classpath; + } + private List planLibraries(JsonObject metadata, Path natives, List> tasks, + List> extraction, Consumer progress) throws IOException { List classpath = new ArrayList<>(); if (!metadata.has("libraries")) return classpath; for (JsonElement entry : metadata.getAsJsonArray("libraries")) { @@ -204,7 +236,9 @@ List libraries(JsonObject metadata, Path natives, Consumer progres JsonObject downloads = library.has("downloads") ? library.getAsJsonObject("downloads") : new JsonObject(); if (downloads.has("artifact")) { JsonObject artifact = downloads.getAsJsonObject("artifact"); - classpath.add(download(artifact, LauncherFiles.child(cacheRoot.resolve("libraries"), artifact.get("path").getAsString()), progress)); + Path target = LauncherFiles.child(cacheRoot.resolve("libraries"), artifact.get("path").getAsString()); + classpath.add(target); + tasks.add(() -> { download(artifact, target, progress); return null; }); } else if (!library.has("natives") || !downloads.has("classifiers")) { String relative = mavenPath(library.get("name").getAsString()); String base = string(library, "url", "https://libraries.minecraft.net/"); @@ -212,8 +246,14 @@ List libraries(JsonObject metadata, Path natives, Consumer progres if (base.isEmpty()) { if (!Files.isRegularFile(artifact)) throw new IOException("Loader installer did not generate required library " + relative); classpath.add(artifact); - } else classpath.add(LauncherFiles.download(base + (base.endsWith("/") ? "" : "/") + relative, artifact, - string(library, "sha1", null), library.has("size") ? library.get("size").getAsLong() : -1, progress)); + } else { + classpath.add(artifact); + tasks.add(() -> { + LauncherFiles.download(base + (base.endsWith("/") ? "" : "/") + relative, artifact, + string(library, "sha1", null), library.has("size") ? library.get("size").getAsLong() : -1, progress); + return null; + }); + } } if (library.has("natives") && library.getAsJsonObject("natives").has(osName())) { String classifier = library.getAsJsonObject("natives").get(osName()).getAsString() @@ -221,16 +261,25 @@ List libraries(JsonObject metadata, Path natives, Consumer progres if (!downloads.has("classifiers") || !downloads.getAsJsonObject("classifiers").has(classifier)) throw new IOException("Native library missing for " + osName() + ": " + library.get("name").getAsString()); JsonObject nativeArtifact = downloads.getAsJsonObject("classifiers").getAsJsonObject(classifier); - Path jar = download(nativeArtifact, LauncherFiles.child(cacheRoot.resolve("libraries"), nativeArtifact.get("path").getAsString()), progress); + Path jar = LauncherFiles.child(cacheRoot.resolve("libraries"), nativeArtifact.get("path").getAsString()); + tasks.add(() -> { download(nativeArtifact, jar, progress); return null; }); List exclusions = new ArrayList<>(); exclusions.add("META-INF/"); if (library.has("extract") && library.getAsJsonObject("extract").has("exclude")) for (JsonElement exclude : library.getAsJsonObject("extract").getAsJsonArray("exclude")) exclusions.add(exclude.getAsString()); - extractNatives(jar, natives, exclusions); + extraction.add(() -> { extractNatives(jar, natives, exclusions); return null; }); } } return classpath; } - private String assets(JsonObject metadata, Path assets, Path gameDir, Consumer progress) throws IOException { + String assets(JsonObject metadata, Path assets, Path gameDir, Consumer progress) throws IOException { + Consumer log = ParallelDownloads.serialized(progress); + List> tasks = new ArrayList<>(); + String id = planAssets(metadata, assets, gameDir, tasks, log); + ParallelDownloads.run("Minecraft assets", tasks, log); + return id; + } + private String planAssets(JsonObject metadata, Path assets, Path gameDir, List> tasks, + Consumer progress) throws IOException { if (!metadata.has("assetIndex")) return string(metadata, "assets", "legacy"); JsonObject descriptor = metadata.getAsJsonObject("assetIndex"); String id = descriptor.get("id").getAsString(); @@ -239,38 +288,20 @@ private String assets(JsonObject metadata, Path assets, Path gameDir, Consumer { - Thread thread = new Thread(task, "Minecraft asset download"); thread.setDaemon(true); return thread; - }); - java.util.concurrent.CompletionService completion = new java.util.concurrent.ExecutorCompletionService<>(executor); - List> downloads = new ArrayList<>(); - try { - for (Map.Entry entry : data.getAsJsonObject("objects").entrySet()) { - downloads.add(completion.submit(() -> { - JsonObject object = entry.getValue().getAsJsonObject(); - String hash = object.get("hash").getAsString(); - if (!hash.matches("[0-9a-fA-F]{40}")) throw new IOException("Invalid asset hash."); - String relative = hash.substring(0, 2) + "/" + hash; - Path artifact = LauncherFiles.download("https://resources.download.minecraft.net/" + relative, - LauncherFiles.child(assets.resolve("objects"), relative), hash, object.get("size").getAsLong(), ignored -> { }); - if (virtual) linkOrCopy(artifact, LauncherFiles.child(assets.resolve("virtual").resolve(safeId(id)), entry.getKey())); - if (resources) linkOrCopy(artifact, LauncherFiles.child(gameDir.resolve("resources"), entry.getKey())); - return null; - })); - } - for (int done = 1; done <= total; done++) { - completion.take().get(); - if (done % 100 == 0 || done == total) progress.accept("Minecraft assets: " + done + "/" + total); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); throw new java.io.InterruptedIOException("Minecraft preparation cancelled."); - } catch (java.util.concurrent.ExecutionException e) { - if (e.getCause() instanceof IOException) throw (IOException) e.getCause(); - throw new IOException("Minecraft asset preparation failed.", e.getCause()); - } finally { - for (java.util.concurrent.Future task : downloads) if (!task.isDone()) task.cancel(true); - executor.shutdownNow(); + for (Map.Entry entry : data.getAsJsonObject("objects").entrySet()) { + JsonObject object = entry.getValue().getAsJsonObject(); + String hash = object.get("hash").getAsString(); + if (!hash.matches("[0-9a-fA-F]{40}")) throw new IOException("Invalid asset hash."); + String relative = hash.substring(0, 2) + "/" + hash; + Path destination = LauncherFiles.child(assets.resolve("objects"), relative); + Path virtualTarget = virtual ? LauncherFiles.child(assets.resolve("virtual").resolve(safeId(id)), entry.getKey()) : null; + Path resourceTarget = resources ? LauncherFiles.child(gameDir.resolve("resources"), entry.getKey()) : null; + tasks.add(() -> { + Path artifact = LauncherFiles.download(assetBaseUrl + relative, destination, hash, object.get("size").getAsLong(), progress); + if (virtualTarget != null) linkOrCopy(artifact, virtualTarget); + if (resourceTarget != null) linkOrCopy(artifact, resourceTarget); + return null; + }); } return id; } @@ -357,6 +388,7 @@ else if (metadata.has("minecraftArguments")) { if (request.serverHost != null && !quickPlay) { args.add("--server"); args.add(request.serverHost); args.add("--port"); args.add(Integer.toString(request.serverPort)); } + if (request.fullscreen && !args.contains("--fullscreen")) args.add("--fullscreen"); return args; } private static boolean supportsQuickPlay(JsonObject metadata, String placeholder) { diff --git a/src/main/java/com/osiris/autoplug/client/launcher/ParallelDownloads.java b/src/main/java/com/osiris/autoplug/client/launcher/ParallelDownloads.java new file mode 100644 index 00000000..bbd9517b --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/launcher/ParallelDownloads.java @@ -0,0 +1,112 @@ +package com.osiris.autoplug.client.launcher; + +import okhttp3.Call; + +import java.io.IOException; +import java.io.InterruptedIOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletionService; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +/** Bounded work queue shared by libraries, native archives, client jars and assets. */ +final class ParallelDownloads { + static final int WORKERS = 8; + private static final ThreadLocal CURRENT = new ThreadLocal<>(); + + private ParallelDownloads() { } + + static Consumer serialized(Consumer progress) { + if (progress == null) return value -> { }; + return value -> { synchronized (progress) { progress.accept(value); } }; + } + + static void run(String description, List> tasks, Consumer progress) throws IOException { + Consumer log = serialized(progress); + log.accept(description + ": 0/" + tasks.size()); + if (tasks.isEmpty()) return; + if (Thread.currentThread().isInterrupted()) throw new InterruptedIOException("Minecraft preparation cancelled."); + Cancellation cancellation = new Cancellation(); + ExecutorService executor = Executors.newFixedThreadPool(Math.min(WORKERS, tasks.size()), task -> { + Thread thread = new Thread(task, "Minecraft file download"); + thread.setDaemon(true); + return thread; + }); + CompletionService completion = new ExecutorCompletionService<>(executor); + List> pending = new ArrayList<>(WORKERS); + int submitted = 0; + try { + // Never enqueue the entire asset index: keep only one task per worker outstanding. + for (; submitted < Math.min(WORKERS, tasks.size()); submitted++) + pending.add(submit(completion, cancellation, tasks.get(submitted))); + for (int done = 1; done <= tasks.size(); done++) { + Future finished = completion.take(); + pending.remove(finished); + finished.get(); + log.accept(description + ": " + done + "/" + tasks.size()); + if (submitted < tasks.size()) pending.add(submit(completion, cancellation, tasks.get(submitted++))); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new InterruptedIOException("Minecraft preparation cancelled."); + } catch (ExecutionException e) { + if (e.getCause() instanceof IOException) throw (IOException) e.getCause(); + if (e.getCause() instanceof Error) throw (Error) e.getCause(); + throw new IOException(description + " preparation failed.", e.getCause()); + } finally { + // Interrupting a Future alone does not interrupt OkHttp's blocking socket read. + cancellation.cancel(); + for (Future future : pending) future.cancel(true); + executor.shutdownNow(); + boolean interrupted = Thread.interrupted(); + try { executor.awaitTermination(5, TimeUnit.SECONDS); } + catch (InterruptedException e) { interrupted = true; } + finally { if (interrupted) Thread.currentThread().interrupt(); } + } + } + + private static Future submit(CompletionService completion, Cancellation cancellation, Callable task) { + return completion.submit(() -> { + CURRENT.set(cancellation); + try { + if (cancellation.cancelled.get()) throw new InterruptedIOException("Download cancelled."); + return task.call(); + } finally { CURRENT.remove(); } + }); + } + + static TrackedCall track(Call call) { return new TrackedCall(call, CURRENT.get()); } + + static final class TrackedCall implements AutoCloseable { + private final Call call; + private final Cancellation cancellation; + private TrackedCall(Call call, Cancellation cancellation) { + this.call = call; + this.cancellation = cancellation; + if (cancellation != null) { + cancellation.calls.add(call); + if (cancellation.cancelled.get()) call.cancel(); + } + } + @Override public void close() { if (cancellation != null) cancellation.calls.remove(call); } + } + + private static final class Cancellation { + final AtomicBoolean cancelled = new AtomicBoolean(); + final Set calls = ConcurrentHashMap.newKeySet(); + void cancel() { + cancelled.set(true); + for (Call call : calls) call.cancel(); + } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/network/local/ConPluginCommandReceive.java b/src/main/java/com/osiris/autoplug/client/network/local/ConPluginCommandReceive.java index 298bf3cb..fab904e1 100644 --- a/src/main/java/com/osiris/autoplug/client/network/local/ConPluginCommandReceive.java +++ b/src/main/java/com/osiris/autoplug/client/network/local/ConPluginCommandReceive.java @@ -44,7 +44,8 @@ public ConPluginCommandReceive() { while (local_server_socket == null) { try { AL.debug(this.getClass(), "Binding on localhost:" + port + " for AutoPlug-Plugin..."); - local_server_socket = new ServerSocket(port); + local_server_socket = com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap.isChild() + ? new ServerSocket(port, 50, java.net.InetAddress.getLoopbackAddress()) : new ServerSocket(port); AL.debug(this.getClass(), "Success!"); } catch (IOException e) { AL.debug(this.getClass(), "Failed to bind on port " + port + "! " + e.getMessage()); diff --git a/src/main/java/com/osiris/autoplug/client/profiles/FabricDefaultProfile.java b/src/main/java/com/osiris/autoplug/client/profiles/FabricDefaultProfile.java new file mode 100644 index 00000000..222d80a8 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/profiles/FabricDefaultProfile.java @@ -0,0 +1,197 @@ +package com.osiris.autoplug.client.profiles; + +import com.google.gson.*; +import com.osiris.autoplug.client.tasks.updater.mods.ModrinthAPI; +import com.osiris.autoplug.client.tasks.updater.search.SearchResult; +import java.io.*; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.time.Instant; +import java.util.*; +import java.util.function.Consumer; +import java.util.zip.ZipFile; + +/** A deliberately small client utility recipe. No shader packs, maps or gameplay changes. */ +public final class FabricDefaultProfile { + public static final String PRESET = "fabric-client-utilities-v1"; + static final List ROOTS = Collections.unmodifiableList(Arrays.asList( + "fabric-api", "sodium", "entityculling", "immediatelyfast", "modmenu")); + public interface Catalog { + JsonObject project(String id) throws Exception; + JsonArray versions(String project, String gameVersion) throws Exception; + JsonObject version(String id) throws Exception; + } + private final ProfileStore profiles; + private final Catalog catalog; + private final ProfileUpdates.Downloader downloader; + public FabricDefaultProfile(ProfileStore profiles, ProfileUpdates updates) { + this(profiles, new Catalog() { + private final ModrinthAPI api = new ModrinthAPI(); + public JsonObject project(String id) throws Exception { return api.projectMetadata(id); } + public JsonArray versions(String id, String game) throws Exception { return api.versionsFor(id, game, "fabric"); } + public JsonObject version(String id) throws Exception { return api.versionMetadata(id); } + }, updates::downloadVerified); + } + FabricDefaultProfile(ProfileStore profiles, Catalog catalog, ProfileUpdates.Downloader downloader) { + this.profiles = profiles; this.catalog = catalog; this.downloader = downloader; + } + /** Caller holds the profile lease through preparation and the launched process. */ + public void prepare(Profile profile, Consumer progress) throws Exception { + if (profile.builtinPreset == null || profile.builtinPresetInstalled) return; + if (!PRESET.equals(profile.builtinPreset) || profile.type != ProfileType.MODS || !"FABRIC".equals(profile.loader)) + throw new IOException("Unsupported default mod recipe for this profile"); + Consumer report = progress == null ? ignored -> { } : progress; + Path stage = profile.getDirectory().resolve(".updates").resolve("fabric-default-" + UUID.randomUUID()); + List activated = new ArrayList<>(); + byte[] oldProfile = Files.readAllBytes(profile.getDirectory().resolve("profile.json")); + Path collectionPath = profile.getDirectory().resolve("collection.json"); + byte[] oldCollection = Files.exists(collectionPath) ? Files.readAllBytes(collectionPath) : null; + try { + report.accept("Checking complete Fabric utility pack for Minecraft " + profile.gameVersion); + Resolver resolver = new Resolver(profile); + for (String root : ROOTS) resolver.resolve(root, null); + resolver.checkConflicts(); + if (Files.isSymbolicLink(stage.getParent())) throw new IOException("Profile update directory must not be a symbolic link"); + Files.createDirectories(stage); + ProfileCollection collection = new ProfileCollection().scan(profile); + if (!collection.entries.isEmpty()) throw new IOException("The uninstalled default profile already contains user mods. Use an empty default profile to avoid changing that collection."); + Map ready = new LinkedHashMap<>(); Set filenames = new HashSet<>(); + for (Artifact artifact : resolver.selected.values()) { + SearchResult release = artifact.release; + Path destination = collection.resolve(profile, release.fileName); + if (!filenames.add(release.fileName.toLowerCase(Locale.ROOT))) throw new IOException("Conflicting mod filenames: " + release.fileName); + if (Files.exists(destination)) throw new IOException("Utility pack would overwrite an existing mod: " + release.fileName + ". Use a separate profile."); + Path download = stage.resolve(release.fileName); + report.accept("Downloading Fabric utility " + artifact.name + " " + release.latestVersion); + downloader.download(release, download); + // Injected downloaders also pass through the same integrity/JAR checks in tests. + validateDownloaded(release, download); + ready.put(destination, profiles.getCache().store(download)); + CollectionEntry entry = new CollectionEntry(); entry.file = release.fileName; entry.name = artifact.name; + entry.version = release.latestVersion; entry.modrinthId = artifact.projectId; + collection.entries.add(entry); + } + // All releases, dependencies and bytes are valid before any mod becomes active. + if (!new ProfileCollection().scan(profile).entries.isEmpty()) throw new IOException("Profile collection changed during utility download; retry with an empty default profile"); + for (Map.Entry item : ready.entrySet()) { + if (Files.exists(item.getKey())) throw new IOException("Profile changed during utility download: " + item.getKey().getFileName()); + profiles.getCache().link(item.getValue(), item.getKey()); activated.add(item.getKey()); + } + collection.save(profile); + profile.builtinPresetInstalled = true; + profile.migrationSummary = "Fabric client utilities installed for " + profile.gameVersion + ": Fabric API, Sodium, Entity Culling, ImmediatelyFast, Mod Menu and required libraries. Updates use this profile's collection."; + profiles.save(profile); + report.accept("Fabric utility pack ready (" + resolver.selected.size() + " mods and libraries)"); + } catch (Exception e) { + profile.builtinPresetInstalled = false; + for (Path file : activated) try { Files.deleteIfExists(file); } catch (IOException rollback) { e.addSuppressed(rollback); } + try { restore(profile.getDirectory().resolve("profile.json"), oldProfile); } catch (IOException rollback) { e.addSuppressed(rollback); } + try { if (oldCollection == null) Files.deleteIfExists(collectionPath); else restore(collectionPath, oldCollection); } + catch (IOException rollback) { e.addSuppressed(rollback); } + throw new IOException("Fabric utility pack is not ready for Minecraft " + profile.gameVersion + ". Nothing will launch. " + e.getMessage(), e); + } finally { + if (Files.isDirectory(stage)) { + try (DirectoryStream files = Files.newDirectoryStream(stage)) { for (Path file : files) Files.deleteIfExists(file); } + Files.deleteIfExists(stage); + } + } + } + private void restore(Path path, byte[] bytes) throws IOException { + Path temporary = Files.createTempFile(path.getParent(), ".preset-rollback-", ".tmp"); + try { + Files.write(temporary, bytes); + try { Files.move(temporary, path, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, path, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temporary); } + } + private void validateDownloaded(SearchResult release, Path path) throws Exception { + ProfileUpdates.verify(release, path); + try (ZipFile jar = new ZipFile(path.toFile())) { + java.util.zip.ZipEntry metadata = jar.getEntry("fabric.mod.json"); + if (metadata == null || metadata.getSize() > 1024 * 1024) throw new IOException("Mod has no bounded Fabric metadata: " + release.fileName); + try (InputStream input = jar.getInputStream(metadata)) { + byte[] bytes = new byte[1024 * 1024 + 1]; + int length = input.readNBytes(bytes, 0, bytes.length); + if (length > 1024 * 1024) throw new IOException("Fabric metadata exceeds 1 MiB"); + JsonObject mod = JsonParser.parseString(new String(bytes, 0, length, StandardCharsets.UTF_8)).getAsJsonObject(); + if (mod.has("environment") && "server".equals(mod.get("environment").getAsString())) + throw new IOException("Server-only artifact rejected: " + release.fileName); + } + } + } + private class Resolver { + final Profile profile; + final Map selected = new LinkedHashMap<>(); + final Map projects = new HashMap<>(); + Resolver(Profile profile) { this.profile = profile; } + Artifact resolve(String projectId, String pinnedVersion) throws Exception { + JsonObject pinned = pinnedVersion == null ? null : catalog.version(pinnedVersion); + if (pinned != null && !pinnedVersion.equals(string(pinned, "id"))) throw new IOException("Provider returned the wrong required dependency version"); + if (projectId == null && pinned != null) projectId = string(pinned, "project_id"); + if (projectId == null) throw new IOException("Required dependency has no project or version identity"); + JsonObject project = projects.get(projectId); + if (project == null) { project = catalog.project(projectId); projects.put(projectId, project); } + String id = string(project, "id"), name = string(project, "title"); projects.put(id, project); + if (!"mod".equals(string(project, "project_type")) || !Arrays.asList("required", "optional").contains(string(project, "client_side")) + || !Arrays.asList("unsupported", "optional").contains(string(project, "server_side"))) + throw new IOException(name + " is not a client-compatible mod usable without server changes"); + Artifact existing = selected.get(id); + if (existing != null) { + if (pinnedVersion != null && !pinnedVersion.equals(string(existing.version, "id"))) + throw new IOException("Conflicting required versions of " + name); + return existing; + } + if (selected.size() >= 32) throw new IOException("Utility dependency graph is unexpectedly large"); + JsonObject version = pinned; + if (version == null) for (JsonElement element : catalog.versions(id, profile.gameVersion)) { + JsonObject candidate = element.getAsJsonObject(); + if (compatible(candidate, id) && (version == null || Instant.parse(string(candidate, "date_published")).isAfter(Instant.parse(string(version, "date_published"))))) version = candidate; + } + if (version == null || !compatible(version, id)) + throw new IOException("No stable Fabric release of " + name + " for exact Minecraft " + profile.gameVersion); + JsonArray one = new JsonArray(); one.add(version); + SearchResult release = new ModrinthAPI().compatibleResult(one, List.of("fabric"), profile.gameVersion, profile.getDirectory().resolve(".not-installed")); + release.modrinthProjectId = id; + URI uri = URI.create(release.downloadUrl); + if (!"https".equals(uri.getScheme()) || !"cdn.modrinth.com".equals(uri.getHost()) || uri.getUserInfo() != null) + throw new IOException("Utility artifact is not hosted on Modrinth's HTTPS CDN"); + if (release.fileSize <= 0 || (release.sha512 == null && release.sha1 == null)) throw new IOException("Utility artifact has no verifiable size/checksum"); + Artifact artifact = new Artifact(id, name, version, release); selected.put(id, artifact); + JsonArray dependencies = version.getAsJsonArray("dependencies"); + if (dependencies != null) for (JsonElement element : dependencies) { + JsonObject dependency = element.getAsJsonObject(); + if ("required".equals(string(dependency, "dependency_type"))) resolve(nullable(dependency, "project_id"), nullable(dependency, "version_id")); + } + return artifact; + } + boolean compatible(JsonObject version, String projectId) throws IOException { + return projectId.equals(string(version, "project_id")) && "release".equals(string(version, "version_type")) + && (!version.has("status") || "listed".equals(string(version, "status"))) + && contains(version.getAsJsonArray("loaders"), "fabric") && contains(version.getAsJsonArray("game_versions"), profile.gameVersion); + } + void checkConflicts() throws IOException { + for (Artifact artifact : selected.values()) { + JsonArray dependencies = artifact.version.getAsJsonArray("dependencies"); + if (dependencies == null) continue; + for (JsonElement element : dependencies) { + JsonObject dependency = element.getAsJsonObject(); + if (!"incompatible".equals(string(dependency, "dependency_type"))) continue; + String project = nullable(dependency, "project_id"), version = nullable(dependency, "version_id"); + for (Artifact other : selected.values()) if ((project == null || project.equals(other.projectId)) + && (version == null || version.equals(string(other.version, "id")))) + throw new IOException("Provider declares incompatible utilities: " + artifact.name + " / " + other.name); + } + } + } + } + private static boolean contains(JsonArray values, String value) { if (values != null) for (JsonElement item : values) if (value.equals(item.getAsString())) return true; return false; } + private static String nullable(JsonObject object, String key) { return !object.has(key) || object.get(key).isJsonNull() ? null : object.get(key).getAsString(); } + private static String string(JsonObject object, String key) throws IOException { + String value = nullable(object, key); if (value == null || value.isEmpty()) throw new IOException("Provider metadata missing " + key); return value; + } + private static class Artifact { + final String projectId, name; final JsonObject version; final SearchResult release; + Artifact(String projectId, String name, JsonObject version, SearchResult release) { this.projectId = projectId; this.name = name; this.version = version; this.release = release; } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java index 3da203c3..aab8c650 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/LauncherServices.java @@ -16,12 +16,14 @@ public class LauncherServices implements LauncherActions, AutoCloseable { public class State { public SettingsInfo settings = new SettingsInfo(); public String offlineName = "Player", selectedAccount = ""; + public Map launchChoices = new LinkedHashMap<>(); } private final Path root; private final Consumer progress; private volatile Consumer progressListener = ignored -> { }; private final ProfileStore profiles; private final ProfileUpdates updates; + private final FabricDefaultProfile fabricDefaults; private final WorldStore worlds; private final LocalWorldStore localWorlds; private final WorldService worldService; @@ -53,6 +55,7 @@ public LauncherServices(Path root, Path minecraftDirectory, Consumer pro }; Files.createDirectories(this.root); profiles = new ProfileStore(this.root.resolve("profiles")); updates = new ProfileUpdates(profiles); + fabricDefaults = new FabricDefaultProfile(profiles, updates); worlds = new WorldStore(this.root.resolve("worlds")); localWorlds = new LocalWorldStore(minecraftDirectory, this.progress); runtimes = new JavaRuntimeManager(this.root.resolve("cache/runtimes")); @@ -60,6 +63,7 @@ public LauncherServices(Path root, Path minecraftDirectory, Consumer pro accounts = new AccountStore(this.root.resolve("accounts.json")); state = Files.exists(this.root.resolve("settings.json")) ? json.read(this.root.resolve("settings.json"), State.class) : new State(); if (state.settings == null) state.settings = new SettingsInfo(); + if (state.launchChoices == null) state.launchChoices = new LinkedHashMap<>(); if (state.settings.javaPaths == null) state.settings.javaPaths = new LinkedHashMap<>(); account = MinecraftAccount.offline(state.offlineName == null ? "Player" : state.offlineName); if (state.settings.rememberAccount) for (MinecraftAccount saved : accounts.list()) if (saved.uuid.equals(state.selectedAccount)) account = saved; @@ -95,6 +99,7 @@ public LauncherServices(Path root, Path minecraftDirectory, Consumer pro } Profile client = profiles.ensureDefault(target, ProfileType.MODS); profiles.ensureDefault(target, ProfileType.MODS_SERVER); + profiles.ensureFabricDefault(target); if (selected == null) { state.settings.defaultProfile = client.id; saveState(); } return info(client); } @@ -156,35 +161,66 @@ public void addArtifact(String id, Path source, String modrinthId) throws Except } @Override public List worlds() throws Exception { List result = new ArrayList<>(); + Map activity = new HashMap<>(); try { for (LocalWorld world : localWorlds.list()) { LocalWorld owned = world; try { owned = worlds.ownedLocal(world, false); } catch (IOException e) { progress.accept("Could not load ownership for '" + world.name + "': " + e.getMessage()); } - result.add(info(owned)); + WorldInfo view = info(owned); result.add(view); + activity.put(view.id, worldActivity(view, 0)); } } catch (IOException | SecurityException e) { progress.accept("Could not list local Minecraft saves: " + e.getMessage()); } - for (VirtualWorld w : worlds.list()) result.add(info(w)); + for (VirtualWorld w : worlds.list()) { + WorldInfo view = info(w); result.add(view); + activity.put(view.id, worldActivity(view, w.createdAt)); + } + result.sort(Comparator.comparingLong(world -> activity.getOrDefault(world.id, 0L)).reversed() + .thenComparing(world -> world.name, String.CASE_INSENSITIVE_ORDER).thenComparing(world -> world.id)); return result; } + /** A bounded background metadata read: creation, modification and LastPlayed all count as activity. */ + static long worldActivity(WorldInfo world, long createdAt) { + long latest = Math.max(Math.max(0, createdAt), world.lastPlayed); + try { + Path directory = Paths.get(world.directory); + for (Path path : Arrays.asList(directory, directory.resolve("level.dat"), directory.resolve("world/level.dat"))) { + try { + java.nio.file.attribute.BasicFileAttributes attributes = Files.readAttributes(path, + java.nio.file.attribute.BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); + if (attributes.isSymbolicLink()) continue; + latest = Math.max(latest, Math.max(attributes.creationTime().toMillis(), attributes.lastModifiedTime().toMillis())); + } catch (IOException | SecurityException ignored) { } + } + } catch (InvalidPathException | NullPointerException ignored) { } + return latest; + } @Override public String launchLocalWorld(String id, String version) throws Exception { + return launchLocalWorld(id, version, ""); + } + @Override public String launchLocalWorld(String id, String version, String profileId) throws Exception { LocalWorld world = worlds.getLocal(id, localWorlds); String selected = localWorlds.launchVersion(world, version); + Profile chosen = profileId == null || profileId.isEmpty() ? profiles.ensureDefault(selected, ProfileType.MODS) : profiles.get(profileId); + if (!chosen.type.isClient() || chosen.template || chosen.migrationPending || !"VANILLA".equals(chosen.loader) || !selected.equals(chosen.gameVersion)) + throw new IOException("Existing local saves require a ready Vanilla profile with exactly the save's selected version."); // All standard saves share one game directory and its settings/native files. // Retain one lease for that directory until the child exits, including preparation failures. ProfileLease lease = new ProfileLease(world.gameDirectory); try { MinecraftAccount current = currentAccount(); PreparedLaunch prepared = launcher.prepare(new LaunchRequest(world.gameDirectory, selected, "VANILLA", null, - current, null, 0, world.saveName()), progress); + current, null, 0, world.saveName(), state.settings.fullscreen), progress); LocalWorld fresh = worlds.getLocal(id, localWorlds); if (!fresh.gameVersion.equals(world.gameVersion) || fresh.modded != world.modded) throw new IOException("The save's version metadata changed while preparing Minecraft. Refresh and select it again."); localWorlds.launchVersion(fresh, selected); LocalWorld owned = worlds.registerLocal(fresh); Process process = launcher.launch(prepared); trackLocalClient(owned.id, process, lease); + try { rememberProfile("world:" + id, chosen.id); } + catch (IOException e) { progress.accept("Minecraft started, but the launch choice could not be saved: " + e.getMessage()); } if (prepared.arguments.contains("--quickPlaySingleplayer")) return "Started Minecraft " + selected + " with Quick Play for '" + world.name + "'."; return "Started Minecraft " + selected + " with automatic entry for '" + world.name + "'."; @@ -210,7 +246,7 @@ void trackLocalClient(String id, Process process, ProfileLease lease) { if (server.type.isClient() || !client.type.isClient()) throw new IOException("Choose a server profile and a client profile"); if (!server.gameVersion.equals(client.gameVersion)) throw new IOException("World server and client must use the same game version"); if (client.template) throw new IOException("Clone the client template before attaching it to a world"); - if (server.type == ProfileType.MODS_SERVER && !server.loader.equals(client.loader)) throw new IOException("Modded world and client loaders must match"); + if (server.type == ProfileType.MODS_SERVER && !"VANILLA".equals(server.loader) && !server.loader.equals(client.loader)) throw new IOException("Modded world and client loaders must match"); if (server.type == ProfileType.MODS_SERVER && server.loaderVersion != null && client.loaderVersion != null && !server.loaderVersion.equals(client.loaderVersion)) throw new IOException("Pinned world and client loader versions must match"); return info(worlds.create(name, serverProfileId, clientProfileId)); @@ -225,9 +261,40 @@ void trackLocalClient(String id, Process process, ProfileLease lease) { if (share) progress.accept(session.getShareResult().getMessage()); } finally { worldAccount.remove(); } } + @Override public synchronized void launchWorld(String id, boolean share, String profileId) throws Exception { + VirtualWorld world = worlds.get(id); + Profile client = profiles.get(profileId), server = profiles.get(world.serverProfileId); + if (!client.type.isClient() || client.template || client.migrationPending || !client.gameVersion.equals(server.gameVersion) + || (server.type == ProfileType.MODS_SERVER && !"VANILLA".equals(server.loader) && !server.loader.equals(client.loader))) + throw new IOException("Choose a ready client matching this world's Minecraft version and mod loader."); + if (!world.clientProfileId.equals(profileId) && !worldService.activeSessions().isEmpty()) { + for (WorldSession session : worldService.activeSessions()) if (session.getWorld().id.equals(id)) + throw new IOException("Stop this world before changing its client profile."); + } + world.clientProfileId = profileId; worlds.save(world); + launchWorld(id, share); + try { rememberProfile("world:" + id, profileId); } + catch (IOException e) { progress.accept("World started, but the launch choice could not be saved: " + e.getMessage()); } + } + @Override public synchronized String preferredProfile(String target) { + String id = state.launchChoices.getOrDefault(target, ""); + if (id.isEmpty()) return ""; + try { Profile p = profiles.get(id); return p.type.isClient() && !p.template && !p.migrationPending ? id : ""; } + catch (IOException e) { return ""; } + } + @Override public synchronized void rememberProfile(String target, String profileId) throws IOException { + if (target == null || target.length() > 1024 || !(target.startsWith("server:") || target.startsWith("world:"))) throw new IOException("Invalid launch target"); + Profile profile = profiles.get(profileId); + if (!profile.type.isClient() || profile.template || profile.migrationPending) throw new IOException("Choose a ready client profile"); + state.launchChoices.put(target, profileId); saveState(); + } @Override public String shareWorld(String id) { ShareResult result = worldService.shareWorld(id); return result.isShared() ? result.address + "\n" + result.message : result.message; } + @Override public String serverLog(String id) throws Exception { return worldService.serverLog(id); } + @Override public void serverCommand(String id, String command) throws Exception { worldService.serverCommand(id, command); } + @Override public void stopWorld(String id) { worldService.stopWorld(id); } + @Override public void restartWorld(String id) throws Exception { worldService.restartWorld(id); } @Override public void launchProfile(String id, String host, int port) throws Exception { launchClient(id, host, port); } private Process launchClient(String id, String host, int port) throws Exception { if (id == null || id.trim().isEmpty()) { @@ -239,10 +306,11 @@ private Process launchClient(String id, String host, int port) throws Exception if (profile.migrationPending) throw new IOException("Review and apply profile migration before launching"); ProfileLease lease = new ProfileLease(profile.getDirectory()); try { + fabricDefaults.prepare(profile, progress); MinecraftAccount current = worldAccount.get(); if (current == null) current = currentAccount(); else if (current.needsRefresh()) current = microsoft.refresh(current); - PreparedLaunch prepared = launcher.prepare(new LaunchRequest(profile.getDirectory(), profile.gameVersion, profile.loader, profile.loaderVersion, current, host, port), progress); + PreparedLaunch prepared = launcher.prepare(new LaunchRequest(profile.getDirectory(), profile.gameVersion, profile.loader, profile.loaderVersion, current, host, port, state.settings.fullscreen), progress); Process process = launcher.launch(prepared); clients.put(profile.id, process); process.onExit().thenRun(() -> { clients.remove(profile.id, process); try { lease.close(); } catch (IOException e) { progress.accept("Could not release profile lock: " + e.getMessage()); } }); return process; @@ -260,7 +328,7 @@ private synchronized MinecraftAccount currentAccount() throws Exception { copy.java8 = state.settings.java8; copy.java17 = state.settings.java17; copy.java21 = state.settings.java21; copy.javaPaths = new LinkedHashMap<>(state.settings.javaPaths); copy.defaultProfile = state.settings.defaultProfile; copy.port = state.settings.port; copy.upnp = state.settings.upnp; copy.microsoftClientId = state.settings.microsoftClientId; - copy.rememberAccount = state.settings.rememberAccount; copy.account = account.username + (account.offline ? " (offline)" : " (Microsoft)"); return copy; + copy.fullscreen = state.settings.fullscreen; copy.rememberAccount = state.settings.rememberAccount; copy.account = account.username + (account.offline ? " (offline)" : " (Microsoft)"); return copy; } @Override public synchronized void saveSettings(SettingsInfo settings) throws Exception { if (settings.port < 1 || settings.port > 65535) throw new IOException("Port must be between 1 and 65535"); diff --git a/src/main/java/com/osiris/autoplug/client/profiles/Profile.java b/src/main/java/com/osiris/autoplug/client/profiles/Profile.java index a840c299..87deac2c 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/Profile.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/Profile.java @@ -9,6 +9,9 @@ public class Profile { public boolean template; public boolean migrationPending; public String migrationSummary = ""; + /** A bundled recipe is installed once; later user edits are never re-seeded. */ + public String builtinPreset; + public boolean builtinPresetInstalled; private transient Path directory; public String getId() { return id; } diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java index 5859ca98..b696676b 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileStore.java @@ -55,6 +55,18 @@ public Profile ensureDefault(String version, ProfileType type) throws IOExceptio public void save(Profile p) throws IOException { validate(p); p.setDirectory(directory(p.id)); json.write(p.getDirectory().resolve("profile.json"), p); } + /** Creates metadata offline. The complete compatible utility pack is prepared on first launch. */ + public Profile ensureFabricDefault(String version) throws IOException { + try (ProfileLease ignored = new ProfileLease(root)) { + for (Profile profile : list()) if (FabricDefaultProfile.PRESET.equals(profile.builtinPreset) + && version.equals(profile.gameVersion) && "FABRIC".equals(profile.loader) + && profile.type == ProfileType.MODS && !profile.template && !profile.migrationPending) return profile; + Profile profile = create("Default (FABRIC)", version, "FABRIC", ProfileType.MODS); + profile.builtinPreset = FabricDefaultProfile.PRESET; + profile.migrationSummary = "Client utility mods install on first launch: Fabric API, Sodium, Entity Culling, ImmediatelyFast and Mod Menu, with required libraries. Exact-version availability is checked before launch."; + save(profile); return profile; + } + } public Profile cloneProfile(String sourceId, String targetVersion) throws IOException { Profile source = get(sourceId); return cloneProfile(sourceId, source.name + " " + targetVersion, targetVersion, source.loader); @@ -64,6 +76,7 @@ public Profile cloneProfile(String sourceId, String name, String version, String try (ProfileLease ignored = new ProfileLease(source.getDirectory())) { Profile target = create(name, version, loader, source.type); target.loaderVersion = Objects.equals(source.loader, target.loader) && Objects.equals(source.gameVersion, version) ? source.loaderVersion : null; + if ("FABRIC".equals(target.loader)) { target.builtinPreset = source.builtinPreset; target.builtinPresetInstalled = source.builtinPresetInstalled; } target.migrationPending = !Objects.equals(source.gameVersion, version) || !Objects.equals(source.loader, target.loader); Set skip = new HashSet<>(Arrays.asList("profile.json", ".profile.lock", ".updates", ".autoplug", "logs", "crash-reports", "saves", "world", "versions", "libraries", "assets", "natives", "launcher_profiles.json", "accounts.json", "usercache.json")); Files.walkFileTree(source.getDirectory(), new SimpleFileVisitor() { diff --git a/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java b/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java index 7d20e765..44235edf 100644 --- a/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java +++ b/src/main/java/com/osiris/autoplug/client/profiles/ProfileUpdates.java @@ -198,7 +198,7 @@ private List compatibleLoaders(Profile profile) { default: return List.of(profile.loader.toLowerCase(Locale.ROOT)); } } - private void verify(SearchResult result, Path path) throws Exception { + static void verify(SearchResult result, Path path) throws Exception { if (!Files.isRegularFile(path) || Files.size(path) == 0) throw new IOException("Downloaded artifact is empty"); if (result.fileSize >= 0 && Files.size(path) != result.fileSize) throw new IOException("Downloaded artifact size mismatch"); String expected = result.sha512 != null ? result.sha512 : result.sha1; @@ -210,4 +210,8 @@ private void verify(SearchResult result, Path path) throws Exception { } try (ZipFile jar = new ZipFile(path.toFile())) { if (!jar.entries().hasMoreElements()) throw new IOException("Downloaded JAR is empty"); } } + /** Shared provider download and artifact verification for first-install recipes. */ + void downloadVerified(SearchResult result, Path destination) throws Exception { + downloader.download(result, destination); verify(result, destination); + } } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java index 846d93cc..e42a40f5 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java @@ -74,6 +74,41 @@ private HttpURLConnection openConnection(String path) throws IOException { return connection; } + public JsonObject projectMetadata(String id) throws IOException { + return metadata("/project/" + checkedId(id)).getAsJsonObject(); + } + public com.google.gson.JsonArray versionsFor(String project, String gameVersion, String loader) throws IOException { + String query = "loaders=" + java.net.URLEncoder.encode(new com.google.gson.Gson().toJson(List.of(loader)), "UTF-8") + + "&game_versions=" + java.net.URLEncoder.encode(new com.google.gson.Gson().toJson(List.of(gameVersion)), "UTF-8"); + return metadata("/project/" + checkedId(project) + "/version?" + query).getAsJsonArray(); + } + public JsonObject versionMetadata(String id) throws IOException { return metadata("/version/" + checkedId(id)).getAsJsonObject(); } + private String checkedId(String id) throws IOException { + if (id == null || !id.matches("[A-Za-z0-9_-]{1,128}")) throw new IOException("Invalid Modrinth identifier"); + return id; + } + private com.google.gson.JsonElement metadata(String path) throws IOException { + HttpURLConnection connection = openConnection(path); + try (com.osiris.autoplug.client.launcher.DownloadProgress.Transfer transfer = + com.osiris.autoplug.client.launcher.DownloadProgress.begin("Fetching Modrinth metadata", baseUrl + path)) { + int status = connection.getResponseCode(); + transfer.redirect(connection.getURL().toString()); + if (status != 200) throw new IOException("Modrinth metadata returned HTTP " + status + " for " + path); + long total = connection.getContentLengthLong(); + if (total > 8 * 1024 * 1024) throw new IOException("Modrinth metadata exceeds 8 MiB"); + try (java.io.InputStream input = connection.getInputStream(); java.io.ByteArrayOutputStream content = new java.io.ByteArrayOutputStream()) { + byte[] buffer = new byte[8192]; int count; + while ((count = input.read(buffer)) != -1) { + if (Thread.currentThread().isInterrupted()) throw new java.io.InterruptedIOException("Modrinth lookup cancelled"); + if (content.size() + count > 8 * 1024 * 1024) throw new IOException("Modrinth metadata exceeds 8 MiB"); + content.write(buffer, 0, count); transfer.update(content.size(), total); + } + com.google.gson.JsonElement result = com.google.gson.JsonParser.parseString(new String(content.toByteArray(), StandardCharsets.UTF_8)); + transfer.complete(content.size(), total); return result; + } catch (com.google.gson.JsonParseException | IllegalStateException e) { throw new IOException("Invalid Modrinth metadata", e); } + } finally { connection.disconnect(); } + } + /** * Exact target-version lookup for both upgrades and downgrades. Unlike the legacy * timestamp comparison, this compares artifact hashes and never treats a failed diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java index 17ad6e87..7c06558b 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -24,6 +24,7 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { // FlatLaf caches shared borders when the first controls are created. { DashboardTheme.installDefaults(); } private final LauncherActions actions; + private final Consumer launchChoicePresenter; private final ServerBrowserService browser; private final ExecutorService workers = Executors.newFixedThreadPool(4, runnable -> { Thread thread = new Thread(runnable, "AutoPlug-Dashboard"); thread.setDaemon(true); return thread; @@ -32,39 +33,52 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { private final AtomicInteger running = new AtomicInteger(); private final CardLayout cards = new CardLayout(); private final JPanel pages = new JPanel(cards); + private final Map navigationButtons = new LinkedHashMap<>(); + private JTabbedPane serverTabs; + private ManagedWorldPanel managedWorldPanel; private final JLabel status = new JLabel("Ready"); private final JLabel navigationTitle = new JLabel("Server Browser"); private final JProgressBar progress = new JProgressBar(0, 100); + private final OverallProgress overall = new OverallProgress(); + private final javax.swing.Timer progressClock = new javax.swing.Timer(400, e -> { + if (running.get() > 0 || this.activeDownloads > 0) progress.setValue(overall.tick()); + }); + private boolean operationFailed; private final JTextField sourceUrl = new JTextField(); private final JTextArea activity = textArea(5); private final JLabel serverEmpty = new JLabel("Add a server or import Minecraft favorites to get started.", SwingConstants.CENTER); private final ServerGrid serverCards = new ServerGrid(); private final JTextField serverSearch = new JTextField(18); - private final JComboBox serverSort = new JComboBox<>(new String[]{"Favorite order", "Name", "Address", "Status", "MOTD", "Players", "Version", "Latency"}); - private final JToggleButton reverseServerSort = new JToggleButton("Descending"); + private final JComboBox serverSort = new JComboBox<>(new String[]{"Last joined", "Favorite order", "Name", "Address", "Status", "MOTD", "Players", "Version", "Latency"}); + private final JToggleButton reverseServerSort = new JToggleButton("Reverse order"); private final Map serverViews = new LinkedHashMap<>(); private String selectedServerAddress; private final DefaultTableModel profileModel = model("Name", "Minecraft", "Loader", "Type", "Template", "Ready"); private final JTable profileTable = table(profileModel); private final JPanel worldCards = new WorldList(); private final Map serverStatuses = new HashMap<>(); + private final Map serverPingRequests = new HashMap<>(); + private long nextServerPingRequest; private List servers = Collections.emptyList(); private List profiles = Collections.emptyList(); private List worlds = Collections.emptyList(); private int pingGeneration; private final JComboBox typeFilter = new JComboBox<>(new String[]{"All profiles", "MODS", "PLUGINS", "MODS_SERVER"}); private List visibleProfiles = Collections.emptyList(); - private final JTextArea profileDetails = textArea(3); + private final JTextArea profileDetails = textArea(6); private final JTextField java8 = new JTextField(), java17 = new JTextField(), java21 = new JTextField(); private final JTextField extraJava = new JTextField(), clientId = new JTextField(), offlineName = new JTextField(); private final JComboBox defaultProfile = new JComboBox<>(); private final JSpinner port = new JSpinner(new SpinnerNumberModel(25565, 1, 65535, 1)); private final JCheckBox upnp = new JCheckBox("Use UPnP when I explicitly share a world"); private final JCheckBox rememberAccount = new JCheckBox("Remember Microsoft account on this computer"); + private final JCheckBox fullscreen = new JCheckBox("Launch Minecraft in fullscreen"); private final JLabel account = new JLabel("Loading account…"); private ServerConsolePanel console; private SettingsInfo loadedSettings; private JDialog signInDialog; + private JDialog launchDialog; + private LaunchChoicePanel launchChoices; private final AutoCloseable downloadSubscription; private int activeDownloads; @@ -72,7 +86,11 @@ public final class DashboardPanel extends JPanel implements AutoCloseable { /** The legacy controls can be omitted for a standalone preview without initializing a server. */ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boolean includeLegacyControls) { + this(actions, browser, includeLegacyControls, null); + } + DashboardPanel(LauncherActions actions, ServerBrowserService browser, boolean includeLegacyControls, Consumer launchChoicePresenter) { super(new BorderLayout(0, 0)); + this.launchChoicePresenter = launchChoicePresenter; this.actions = Objects.requireNonNull(actions); this.browser = Objects.requireNonNull(browser); setBorder(new EmptyBorder(12, 12, 10, 12)); pages.setOpaque(false); setPreferredSize(new Dimension(1100, 720)); @@ -94,7 +112,8 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo DashboardTheme.navigation(button); button.setPreferredSize(new Dimension(170, 43)); button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 43)); button.setAlignmentX(Component.LEFT_ALIGNMENT); - button.addActionListener(e -> { cards.show(pages, name); navigationTitle.setText(name); if (name.equals("Worlds")) refreshWorlds(); }); + button.addActionListener(e -> { showPage(name); if (name.equals("Worlds")) refreshWorlds(); }); + navigationButtons.put(name, button); group.add(button); navigation.add(button); navigation.add(Box.createVerticalStrut(8)); if (i == 0) button.setSelected(true); } @@ -103,8 +122,12 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo add(navigation, BorderLayout.WEST); add(pages, BorderLayout.CENTER); JPanel statusBar = DashboardTheme.surface(new BorderLayout(10, 4), 8); status.putClientProperty("html.disable", Boolean.TRUE); status.setName("activity-step"); - progress.setName("activity-progress"); progress.setPreferredSize(new Dimension(140, 10)); progress.setVisible(false); - JPanel step = DashboardTheme.transparent(new BorderLayout(10, 0)); step.add(status); step.add(progress, BorderLayout.EAST); + progress.setName("activity-progress"); progress.setPreferredSize(new Dimension(140, 34)); + progress.setLayout(new BorderLayout()); progress.setStringPainted(false); + progress.setForeground(new Color(DashboardTheme.dark() ? 0x254B78 : 0xC9DEFF)); + status.setBorder(new EmptyBorder(5, 10, 5, 10)); progress.add(status); + progress.setToolTipText("Overall progress is estimated until all steps finish; the activity details show measured downloads."); + JPanel step = DashboardTheme.transparent(new BorderLayout(10, 0)); step.add(progress); sourceUrl.setName("download-source"); sourceUrl.setEditable(false); sourceUrl.setVisible(false); sourceUrl.setToolTipText("Current download source — select and copy the full URL"); sourceUrl.getAccessibleContext().setAccessibleName("Download source URL"); JButton details = iconButton("Activity details", "activity", () -> information("Activity & download sources", activity.getText())); @@ -150,7 +173,18 @@ private JPanel serverPage() { list.add(serverEmpty, BorderLayout.NORTH); list.add(DashboardTheme.scroll(serverCards)); content.add(list, BorderLayout.CENTER); JTextArea note = textArea(1); note.setText("Server details come from live pings. Join uses your local profiles and keeps version checks in place."); DashboardTheme.tint(note, false); content.add(note, BorderLayout.SOUTH); - page.add(content, BorderLayout.CENTER); return page; + serverTabs = new JTabbedPane(); serverTabs.setName("server-browser-tabs"); + managedWorldPanel = new ManagedWorldPanel(actions, world -> launchManagedWorld(world, false), this::openFolder); + serverTabs.addTab("Favorites", content); serverTabs.addTab("Managed worlds & consoles", managedWorldPanel); + serverTabs.addChangeListener(e -> { if (serverTabs.getSelectedIndex() == 1) managedWorldPanel.refresh(); }); + page.add(serverTabs, BorderLayout.CENTER); return page; + } + private void showPage(String name) { + cards.show(pages, name); navigationTitle.setText(name); + JToggleButton selected = navigationButtons.get(name); if (selected != null) selected.setSelected(true); + } + private void manageWorld(WorldInfo world) { + showPage("Server Browser"); serverTabs.setSelectedIndex(1); managedWorldPanel.select(world.id); } private void addServer() { @@ -187,18 +221,20 @@ private void editServer() { } private void pingSelected() { SavedServer selected = selectedServer(); if (selected == null) return; - serverStatuses.remove(selected.address); serverViews.get(selected.address).update(null); - int generation = pingGeneration; - run("Checking " + selected.name, () -> browser.ping(selected), ping -> showPing(generation, selected, ping)); + int generation = pingGeneration; long request = beginServerPing(selected); + run("Checking " + selected.name, () -> browser.ping(selected), ping -> showPing(generation, selected, request, ping)); } private void showServers(List result) { displayServers(result, Collections.emptyMap()); int generation = pingGeneration; - for (SavedServer server : servers) run("Checking " + server.name, () -> browser.ping(server), ping -> showPing(generation, server, ping)); + for (SavedServer server : servers) { + long request = beginServerPing(server); + run("Checking " + server.name, () -> browser.ping(server), ping -> showPing(generation, server, request, ping)); + } } /** Render a snapshot without network work; also used by deterministic preview fixtures. */ int displayServers(List result, Map statuses) { - ++pingGeneration; servers = new ArrayList<>(result); serverStatuses.clear(); serverStatuses.putAll(statuses); + ++pingGeneration; servers = new ArrayList<>(result); serverStatuses.clear(); serverStatuses.putAll(statuses); serverPingRequests.clear(); serverCards.removeAll(); serverViews.clear(); for (SavedServer server : servers) { ServerCard card = new ServerCard(server); serverViews.put(server.address, card); serverCards.add(card.panel); @@ -208,10 +244,21 @@ int displayServers(List result, Map statuses) return pingGeneration; } void showPing(int generation, SavedServer server, ServerStatus ping) { - if (generation != pingGeneration) return; + if (closed.get() || generation != pingGeneration) return; ServerCard card = serverViews.get(server.address); if (card == null) return; serverStatuses.put(server.address, ping); card.update(ping); arrangeServerCards(); } + /** Called on the EDT; a newer manual check supersedes an in-flight check of the same favorite. */ + long beginServerPing(SavedServer server) { + long request = ++nextServerPingRequest; serverPingRequests.put(server.address, request); + serverStatuses.remove(server.address); + ServerCard card = serverViews.get(server.address); if (card != null) card.update(null); + return request; + } + void showPing(int generation, SavedServer server, long request, ServerStatus ping) { + if (!Objects.equals(serverPingRequests.get(server.address), request)) return; + showPing(generation, server, ping); + } private SavedServer selectedServer() { ServerCard selected = serverViews.get(selectedServerAddress); if (selected != null && selected.panel.isVisible()) return selected.server; @@ -222,7 +269,8 @@ private void arrangeServerCards() { List ordered = new ArrayList<>(serverViews.values()); String sort = String.valueOf(serverSort.getSelectedItem()); Comparator order = (left, right) -> 0; - if ("Name".equals(sort)) order = Comparator.comparing(card -> card.server.name, String.CASE_INSENSITIVE_ORDER); + if ("Last joined".equals(sort)) order = Comparator.comparingLong(card -> card.server.lastJoinedAt).reversed(); + else if ("Name".equals(sort)) order = Comparator.comparing(card -> card.server.name, String.CASE_INSENSITIVE_ORDER); else if ("Address".equals(sort)) order = Comparator.comparing(card -> card.server.address, String.CASE_INSENSITIVE_ORDER); else if ("Status".equals(sort)) order = Comparator.comparing(card -> card.state.getText()); else if ("MOTD".equals(sort)) order = Comparator.comparing(card -> card.message.getText(), String.CASE_INSENSITIVE_ORDER); @@ -268,34 +316,41 @@ private void navigateServer(SavedServer server, int offset) { } private final class ServerCard { final SavedServer server; - final JPanel panel = DashboardTheme.surface(new BorderLayout(0, 12), 16); + final JPanel panel = DashboardTheme.surface(new BorderLayout(18, 8), 16); final JToggleButton select; - final JLabel state = DashboardTheme.badge("Checking…"); + final JLabel state = serverStatusBadge(); + final JLabel icon = new JLabel(DashboardTheme.serverIcon(), SwingConstants.CENTER); final JTextArea message = textArea(2); final JLabel players = serverDetail("Players: —", "players"), version = serverDetail("Version: —", "version"), latency = serverDetail("Latency: —", "ping"); ServerCard(SavedServer server) { this.server = server; panel.setName("server-" + server.address); panel.getAccessibleContext().setAccessibleName("Favorite server " + server.name); - JPanel heading = DashboardTheme.transparent(new BorderLayout(10, 0)); - JLabel icon = new JLabel(DashboardTheme.serverIcon()); icon.setToolTipText("Saved Minecraft server"); heading.add(icon, BorderLayout.WEST); - JPanel identity = DashboardTheme.transparent(new BorderLayout(0, 3)); + JPanel thumbnail = DashboardTheme.transparent(new GridBagLayout()); + icon.setName("server-icon"); icon.setPreferredSize(new Dimension(96, 96)); + icon.setToolTipText("Server icon (shown when supplied by the server)"); + icon.getAccessibleContext().setAccessibleName("Server icon for " + server.name); + thumbnail.add(icon); panel.add(thumbnail, BorderLayout.WEST); + JPanel details = DashboardTheme.transparent(new BorderLayout(0, 6)); + JPanel heading = DashboardTheme.transparent(new BorderLayout(0, 4)); + JPanel stateRow = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 0, 0)); + state.setName("server-status"); stateRow.add(state); heading.add(stateRow, BorderLayout.NORTH); + JPanel identity = DashboardTheme.transparent(new BorderLayout(0, 2)); select = new JToggleButton(); select.putClientProperty("html.disable", Boolean.TRUE); select.setText(server.name); select.setName("select-server-" + server.address); select.setHorizontalAlignment(SwingConstants.LEFT); - select.setFont(select.getFont().deriveFont(Font.BOLD, 16f)); select.setMargin(new Insets(4, 5, 4, 5)); + select.setFont(select.getFont().deriveFont(Font.BOLD, 18f)); select.setMargin(new Insets(2, 5, 2, 5)); select.setToolTipText("Server: " + server.name + " — " + server.address); select.getAccessibleContext().setAccessibleName("Select server " + server.name); select.getAccessibleContext().setAccessibleDescription("Arrow keys move between cards; Enter joins this server; Space selects it."); select.addActionListener(e -> selectServer(server, false)); select.addFocusListener(new java.awt.event.FocusAdapter() { @Override public void focusGained(java.awt.event.FocusEvent e) { selectServer(server, false); } }); identity.add(select, BorderLayout.NORTH); JLabel address = serverDetail(server.address, "address"); address.setName("server-address"); identity.add(address, BorderLayout.SOUTH); - heading.add(identity); panel.add(heading, BorderLayout.NORTH); - JPanel body = DashboardTheme.transparent(new BorderLayout(0, 10)); - JPanel stateRow = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 0, 0)); state.setName("server-status"); stateRow.add(state); body.add(stateRow, BorderLayout.NORTH); + heading.add(identity, BorderLayout.CENTER); details.add(heading, BorderLayout.NORTH); + JPanel body = DashboardTheme.transparent(new BorderLayout(0, 2)); message.setName("server-message"); message.setFocusable(false); message.setPreferredSize(new Dimension(100, 40)); DashboardTheme.tint(message, false); body.add(message, BorderLayout.CENTER); - JPanel facts = DashboardTheme.transparent(new GridLayout(3, 1, 0, 5)); + JPanel facts = toolbar(players, version, latency); players.setName("server-players"); version.setName("server-version"); latency.setName("server-latency"); - facts.add(players); facts.add(version); facts.add(latency); body.add(facts, BorderLayout.SOUTH); panel.add(body); + body.add(facts, BorderLayout.SOUTH); details.add(body, BorderLayout.CENTER); JPanel controls = toolbar(primaryButton("Join", () -> { selectServer(server, false); joinSelected(); }), iconButton("Ping selected", "ping", () -> { selectServer(server, false); pingSelected(); }), iconButton("Copy address", "copy", () -> { selectServer(server, false); copyServerAddress(); }), @@ -306,7 +361,7 @@ private final class ServerCard { action.getAccessibleContext().setAccessibleDescription(action.getToolTipText() + " for " + server.name + " at " + server.address); action.addFocusListener(new java.awt.event.FocusAdapter() { @Override public void focusGained(java.awt.event.FocusEvent e) { selectServer(server, false); } }); } - panel.add(controls, BorderLayout.SOUTH); + details.add(controls, BorderLayout.SOUTH); panel.add(details, BorderLayout.CENTER); bindServerKey("LEFT", "previous-server", () -> navigateServer(server, -1)); bindServerKey("RIGHT", "next-server", () -> navigateServer(server, 1)); bindServerKey("UP", "previous-server-row", () -> navigateServer(server, -serverCards.columns())); @@ -315,7 +370,7 @@ private final class ServerCard { java.awt.event.MouseAdapter click = new java.awt.event.MouseAdapter() { @Override public void mousePressed(java.awt.event.MouseEvent e) { selectServer(server, true); } }; - for (Component child : new Component[]{panel, heading, icon, address, body, stateRow, state, message, facts, players, version, latency}) child.addMouseListener(click); + for (Component child : new Component[]{panel, thumbnail, heading, icon, address, body, stateRow, state, message, facts, players, version, latency}) child.addMouseListener(click); } private void bindServerKey(String key, String name, Runnable action) { select.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(key), name); @@ -326,8 +381,10 @@ void selectionChanged() { panel.putClientProperty("AutoPlug.selected", selected); panel.repaint(); } void update(ServerStatus ping) { - state.setText(ping == null ? "Checking…" : ping.online ? "Online" : "Unavailable"); + state.setText(ping == null ? "Checking…" : ping.online ? "Online" : "Offline · Unavailable"); + state.putClientProperty("server-online", ping == null ? null : ping.online); state.setIcon(DashboardTheme.icon(ping != null && ping.online ? "online" : ping == null ? "ping" : "offline-server")); + icon.setIcon(ping != null && ping.icon != null ? new ImageIcon(ping.icon) : DashboardTheme.serverIcon()); String detail = ping == null ? "Checking this server’s status…" : ping.online ? Objects.toString(ping.motd, "") : Objects.toString(ping.message, "Status unavailable"); message.setText(detail); message.setCaretPosition(0); message.setToolTipText("Server message: " + detail); message.getAccessibleContext().setAccessibleName("Server message: " + detail); players.setText("Players: " + (ping != null && ping.online ? ping.players + " / " + ping.capacity : "—")); @@ -336,16 +393,37 @@ void update(ServerStatus ping) { for (JLabel fact : new JLabel[]{players, version, latency}) fact.setToolTipText(fact.getText()); } } + private static JLabel serverStatusBadge() { + JLabel badge = new JLabel("Checking…") { + @Override protected void paintComponent(Graphics graphics) { + Boolean online = (Boolean) getClientProperty("server-online"); + boolean dark = DashboardTheme.dark(); + Color foreground = online == null ? DashboardTheme.muted() : online + ? new Color(dark ? 0x94E2B0 : 0x17643D) : new Color(dark ? 0xFFB0B0 : 0xA5262F); + Color background = online == null ? new Color(dark ? 0x303D50 : 0xEDF1F6) : online + ? new Color(dark ? 0x173E2B : 0xE1F5E8) : new Color(dark ? 0x51272C : 0xFDE7E9); + if (!foreground.equals(getForeground())) setForeground(foreground); + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(background); g.fillRoundRect(0, 0, getWidth(), getHeight(), 12, 12); + } finally { g.dispose(); } + super.paintComponent(graphics); + } + }; + badge.setBorder(new EmptyBorder(3, 9, 3, 9)); badge.setFont(badge.getFont().deriveFont(Font.BOLD, 11f)); + return badge; + } private static JLabel serverDetail(String text, String icon) { JLabel label = new JLabel(); label.putClientProperty("html.disable", Boolean.TRUE); label.setText(text); label.setIcon(DashboardTheme.icon(icon)); label.setHorizontalAlignment(SwingConstants.LEFT); label.setToolTipText("Details: " + text); DashboardTheme.tint(label, false); return label; } private static final class ServerGrid extends JPanel implements Scrollable { - private static final int GAP = 14, CARD_HEIGHT = 322; + private static final int GAP = 12, CARD_HEIGHT = 246; private int previousColumns; ServerGrid() { super(null); setOpaque(false); } - int columns() { return getWidth() >= 800 ? 2 : 1; } + int columns() { return 1; } @Override public void doLayout() { int columns = columns(), width = Math.max(0, (getWidth() - GAP * (columns - 1)) / columns), index = 0; for (Component card : getComponents()) if (card.isVisible()) { @@ -381,7 +459,11 @@ private void joinServer(SavedServer server) { ProfileInfo base = preferredBase(clients); if (ping != null && ping.online) { ProfileInfo match = matchingClientProfile(clients, targetVersion, base.loader); - if (match != null) { launchOnServer(server, match); return; } + List compatible = new ArrayList<>(); + for (ProfileInfo p : clients) if (p.launchable && !p.template && targetVersion.equals(p.gameVersion)) compatible.add(p); + if (!compatible.isEmpty()) { + chooseProfile("server:" + server.address, "Join " + server.name, compatible, match, selected -> launchOnServer(server, selected)); return; + } JComboBox baseChoice = new JComboBox<>(clients.toArray(new ProfileInfo[0])); baseChoice.setSelectedItem(base); JTextField target = new JTextField(targetVersion); JPanel details = fields("Server version", new JLabel(ping.version), "Base profile / loader", baseChoice, "Target Minecraft version", target); @@ -396,13 +478,38 @@ private void joinServer(SavedServer server) { } if (option != 1) return; } - JComboBox choice = new JComboBox<>(clients.toArray(new ProfileInfo[0])); choice.setSelectedItem(base); - if (!form("Join " + server.name, fields("Local client profile", choice))) return; - ProfileInfo selected = (ProfileInfo) choice.getSelectedItem(); - if (!ready(selected)) return; - if (ping != null && ping.online && !versionMatches(ping.version, selected.gameVersion) - && !confirm("Version differs", "The server reports " + ping.version + " but this profile uses " + selected.gameVersion + ".\nAttempt to connect with this profile?")) return; - launchOnServer(server, selected); + chooseProfile("server:" + server.address, "Join " + server.name, clients, base, selected -> { + if (!ready(selected)) return; + if (ping != null && ping.online && !versionMatches(ping.version, selected.gameVersion) + && !confirm("Version differs", "The server reports " + ping.version + " but this profile uses " + selected.gameVersion + ".\nAttempt to connect with this profile?")) return; + launchOnServer(server, selected); + }); + } + private void chooseProfile(String target, String title, List candidates, ProfileInfo fallback, Consumer selected) { + List available = new ArrayList<>(candidates); available.removeIf(p -> !p.launchable || p.template); + if (available.isEmpty()) { information("No ready profile", "Create or finish migrating a compatible client profile first."); return; } + run("Loading your previous launch choice", () -> actions.preferredProfile(target), remembered -> { + ProfileInfo preferred = null; + for (ProfileInfo p : available) if (p.id.equals(remembered)) preferred = p; + if (preferred == null && loadedSettings != null) for (ProfileInfo p : available) if (p.id.equals(loadedSettings.defaultProfile)) preferred = p; + boolean auto = preferred != null; + if (preferred == null && fallback != null && available.stream().anyMatch(p -> p.id.equals(fallback.id))) { + preferred = fallback; if (target.startsWith("world:")) auto = true; + } + if (launchDialog != null) launchDialog.dispose(); if (launchChoices != null) launchChoices.close(); + if (launchChoicePresenter != null) { + launchChoices = new LaunchChoicePanel(available, preferred, auto, selected); + launchChoicePresenter.accept(launchChoices); return; + } + JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this), title, Dialog.ModalityType.APPLICATION_MODAL); + launchDialog = dialog; + LaunchChoicePanel panel = new LaunchChoicePanel(available, preferred, auto, profile -> { + dialog.dispose(); selected.accept(profile); + }); + launchChoices = panel; dialog.add(panel); dialog.pack(); dialog.setResizable(true); dialog.setLocationRelativeTo(this); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosed(java.awt.event.WindowEvent e) { panel.close(); } }); + dialog.setVisible(true); panel.close(); + }); } private ProfileInfo preferredBase(List clients) { if (loadedSettings != null) for (ProfileInfo profile : clients) if (profile.id.equals(loadedSettings.defaultProfile)) return profile; @@ -427,7 +534,12 @@ private void finishJoinMigration(SavedServer server, ProfileInfo cloned) { private void launchOnServer(SavedServer server, ProfileInfo profile) { if (!ready(profile)) return; ServerAddress address = ServerAddress.parse(server.address); - run("Launching " + profile.name, () -> { actions.launchProfile(profile.id, address.host, address.port); return null; }, ignored -> status.setText("Launch requested for " + server.name)); + run("Launching " + profile.name, () -> { + actions.launchProfile(profile.id, address.host, address.port); + try { actions.rememberProfile("server:" + server.address, profile.id); browser.recordJoined(server.address); } + catch (Exception e) { receiveProgress("Minecraft started, but the last-used choice could not be saved: " + message(e)); } + return null; + }, ignored -> { status.setText("Launch requested for " + server.name); refreshServers(); }); } static String gameVersionFromStatus(String version) { if (version == null) return ""; @@ -448,6 +560,7 @@ static boolean versionMatches(String serverVersion, String profileVersion) { } private JPanel profilesPage() { + profileTable.setName("profile-table"); profileDetails.setName("profile-details"); JPanel page = page("Profiles", "Isolated modpacks and pluginpacks, reusable across worlds and servers."); JPanel content = content(); typeFilter.addActionListener(e -> showProfiles()); @@ -455,6 +568,9 @@ private JPanel profilesPage() { button("Check", () -> checkOrUpdate(false)), button("Update", () -> checkOrUpdate(true)), button("Refresh", this::refreshProfiles)), BorderLayout.NORTH); content.add(tableScroll(profileTable), BorderLayout.CENTER); JPanel bottom = DashboardTheme.transparent(new BorderLayout(0, 8)); + bottom.add(toolbar(button("Modrinth", () -> openLink("https://modrinth.com/mods")), + button("CurseForge", () -> openLink("https://www.curseforge.com/minecraft")), + button("AutoPlug mods", () -> openLink("https://autoplug.one/installer/mods"))), BorderLayout.NORTH); bottom.setBorder(new EmptyBorder(12, 0, 0, 0)); bottom.add(DashboardTheme.scroll(profileDetails), BorderLayout.CENTER); bottom.add(toolbar(primaryButton("Launch client", () -> { ProfileInfo profile = selectedProfile(); if (!ready(profile)) return; @@ -477,6 +593,7 @@ private JPanel profilesPage() { ProfileInfo profile = visibleProfiles.get(profileTable.convertRowIndexToModel(row)); profileDetails.setText(profile.directory + "\n" + (profile.launchable ? "Ready to launch" : "Needs migration review") + (profile.migrationSummary == null || profile.migrationSummary.isEmpty() ? "" : "\n" + profile.migrationSummary)); + profileDetails.setCaretPosition(0); String assetFolder = "PLUGINS".equalsIgnoreCase(profile.type) ? "plugins" : "mods"; run("Checking profile content", () -> { File folder = new File(profile.directory, assetFolder); @@ -485,8 +602,10 @@ private JPanel profilesPage() { }, empty -> { int selected = profileTable.getSelectedRow(); if (empty && selected >= 0 && selected < visibleProfiles.size() - && visibleProfiles.get(profileTable.convertRowIndexToModel(selected)).id.equals(profile.id)) + && visibleProfiles.get(profileTable.convertRowIndexToModel(selected)).id.equals(profile.id)) { profileDetails.append("\nNo " + assetFolder + " added yet. Use Add JAR to build your pack, or keep this profile empty."); + profileDetails.setCaretPosition(0); + } }); } }); return page; @@ -636,8 +755,7 @@ private void showWorlds() { JLabel quickPlay = DashboardTheme.badge("Quick Play"); quickPlay.setToolTipText("This version supports direct singleplayer Quick Play."); badgeRow.add(Box.createHorizontalStrut(6)); badgeRow.add(quickPlay); } - JLabel name = new JLabel(world.name); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); - name.putClientProperty("html.disable", Boolean.TRUE); + JLabel name = new JLabel(); name.putClientProperty("html.disable", Boolean.TRUE); name.setText(world.name); name.setFont(name.getFont().deriveFont(Font.BOLD, 18f)); heading.add(badgeRow, BorderLayout.NORTH); heading.add(name, BorderLayout.CENTER); details.add(heading, BorderLayout.NORTH); JTextArea description = textArea(world.metadataAvailable ? 4 : 3); DashboardTheme.tint(description, false); @@ -647,11 +765,12 @@ private void showWorlds() { description.setToolTipText(world.directory + (world.dataPacks.isEmpty() ? "" : " | Datapacks: " + String.join(", ", world.dataPacks))); details.add(description, BorderLayout.CENTER); if (world.local) details.add(toolbar(primaryButton("Launch", () -> launchLocalWorld(world)), button("Open folder", () -> openFolder(world.directory))), BorderLayout.SOUTH); - else details.add(toolbar(primaryButton("Play locally", () -> run("Starting world " + world.name, () -> { actions.launchWorld(world.id, false); return null; }, ignored -> refreshWorlds())), + else details.add(toolbar(primaryButton("Play locally", () -> launchManagedWorld(world, false)), + button("Server console", () -> manageWorld(world)), button("Share", () -> { if (!confirm("Share this world", "Share “" + world.name + "” beyond this PC?\nThis may open a router port using UPnP and expose the server to the internet.\nOnly share the join address with people you trust.")) return; + if (!world.running) { launchManagedWorld(world, true); return; } run("Preparing world sharing", () -> { - if (!world.running) actions.launchWorld(world.id, true); return actions.shareWorld(world.id); }, address -> { showShare(address); refreshWorlds(); }); }), button("Open folder", () -> openFolder(world.directory)), button("Minecraft EULA", () -> { @@ -696,6 +815,21 @@ private static void nameWorldActions(Container container, String name) { } private static boolean knownWorldVersion(WorldInfo world) { return world.gameVersion != null && !world.gameVersion.trim().isEmpty(); } + private void launchManagedWorld(WorldInfo world, boolean share) { + List compatible = new ArrayList<>(); ProfileInfo server = null, prior = null; + for (ProfileInfo p : profiles) { if (p.id.equals(world.serverProfileId)) server = p; if (p.id.equals(world.clientProfileId)) prior = p; } + for (ProfileInfo p : clientProfiles()) { + String version = server == null ? world.gameVersion : server.gameVersion; + if (version != null && !version.isEmpty() && !version.equals(p.gameVersion)) continue; + if (server != null && "MODS_SERVER".equals(server.type) && !"VANILLA".equals(server.loader) && !server.loader.equals(p.loader)) continue; + compatible.add(p); + } + if (world.running) { manageWorld(world); return; } + chooseProfile("world:" + world.id, "Play " + world.name, compatible, prior, chosen -> + run("Starting world " + world.name, () -> { actions.launchWorld(world.id, share, chosen.id); return share ? actions.shareWorld(world.id) : ""; }, result -> { + if (share) showShare(result); refreshWorlds(); if (managedWorldPanel != null) managedWorldPanel.refresh(); + })); + } private void launchLocalWorld(WorldInfo world) { String version = world.gameVersion; if (!knownWorldVersion(world)) { @@ -708,8 +842,14 @@ private void launchLocalWorld(WorldInfo world) { version = choice.getText().trim(); } final String selectedVersion = version; - run("Launching " + world.name + " with Minecraft " + selectedVersion, - () -> actions.launchLocalWorld(world.id, selectedVersion), result -> { status.setText(result); status.setToolTipText(result); }); + run("Preparing compatible local-world profiles", () -> { actions.ensureDefaultProfiles(selectedVersion); return actions.profiles(); }, result -> { + profiles = result; showProfiles(); refreshDefaultProfiles(); + List compatible = new ArrayList<>(); + for (ProfileInfo p : clientProfiles()) if (selectedVersion.equals(p.gameVersion) && "VANILLA".equals(p.loader)) compatible.add(p); + chooseProfile("world:" + world.id, "Launch " + world.name, compatible, null, chosen -> + run("Launching " + world.name + " with Minecraft " + selectedVersion, + () -> actions.launchLocalWorld(world.id, selectedVersion, chosen.id), text -> { status.setText(text); status.setToolTipText(text); })); + }); } private String profileName(String id) { for (ProfileInfo profile : profiles) if (profile.id.equals(id)) return profile.name; return id; } private void showShare(String text) { @@ -766,6 +906,7 @@ private JPanel settingsPage() { DashboardTheme.tint(note, false); note.setBorder(new EmptyBorder(10, 0, 0, 0)); identity.add(note); JPanel defaults = settingsGroup("Defaults and sharing"); defaults.setName("settings-defaults"); defaults.add(stackedFields("Default client profile", defaultProfile, "Preferred server port", port)); + defaults.add(fullscreen); upnp.setText("Use UPnP when I choose Share"); defaults.add(upnp); JTextArea sharing = textArea(2); sharing.setText("Sharing is always explicit. UPnP opens a router port only after you choose Share."); DashboardTheme.tint(sharing, false); sharing.setBorder(new EmptyBorder(10, 0, 0, 0)); defaults.add(sharing); @@ -845,7 +986,7 @@ private static final class WorldList extends JPanel implements Scrollable { private void showSettings(SettingsInfo settings) { loadedSettings = settings; java8.setText(settings.javaPaths.getOrDefault(8, settings.java8)); java17.setText(settings.javaPaths.getOrDefault(17, settings.java17)); java21.setText(settings.javaPaths.getOrDefault(21, settings.java21)); StringJoiner extra = new StringJoiner("; "); settings.javaPaths.forEach((major, path) -> { if (major != 8 && major != 17 && major != 21) extra.add(major + "=" + path); }); extraJava.setText(extra.toString()); - clientId.setText(settings.microsoftClientId); account.setText(settings.account); port.setValue(Math.max(1, Math.min(65535, settings.port))); upnp.setSelected(settings.upnp); rememberAccount.setSelected(settings.rememberAccount); refreshDefaultProfiles(); + clientId.setText(settings.microsoftClientId); account.setText(settings.account); port.setValue(Math.max(1, Math.min(65535, settings.port))); upnp.setSelected(settings.upnp); rememberAccount.setSelected(settings.rememberAccount); fullscreen.setSelected(settings.fullscreen); refreshDefaultProfiles(); } private void refreshDefaultProfiles() { String selected = loadedSettings == null ? "" : loadedSettings.defaultProfile; @@ -861,7 +1002,7 @@ private SettingsInfo settingsFromForm() { catch (RuntimeException e) { throw new IllegalArgumentException("Other runtimes must use major=path, separated by semicolons."); } } ProfileInfo profile = (ProfileInfo) defaultProfile.getSelectedItem(); settings.defaultProfile = profile == null ? "" : profile.id; - settings.port = (Integer) port.getValue(); settings.upnp = upnp.isSelected(); settings.rememberAccount = rememberAccount.isSelected(); settings.microsoftClientId = clientId.getText().trim(); settings.account = account.getText(); return settings; + settings.port = (Integer) port.getValue(); settings.upnp = upnp.isSelected(); settings.rememberAccount = rememberAccount.isSelected(); settings.fullscreen = fullscreen.isSelected(); settings.microsoftClientId = clientId.getText().trim(); settings.account = account.getText(); return settings; } private void saveSettings() { try { SettingsInfo settings = settingsFromForm(); run("Saving settings", () -> { actions.saveSettings(settings); return settings; }, this::showSettings); } @@ -878,7 +1019,7 @@ private void run(String description, Callable work, Consumer success) if (closed.get()) return; int active = running.incrementAndGet(); if (active == 1) { sourceUrl.setVisible(false); setActivity(description + "…"); } - if (active == 1 && activeDownloads == 0) progress.setIndeterminate(true); + if (active == 1 && activeDownloads == 0) { overall.start(); operationFailed = false; progress.setValue(overall.value()); progressClock.start(); } progress.setVisible(true); try { workers.submit(() -> { try { @@ -890,18 +1031,18 @@ private void run(String description, Callable work, Consumer success) }); } catch (Exception e) { SwingUtilities.invokeLater(() -> { if (closed.get()) return; - finishOperation(); setActivity(description + " failed: " + message(e)); error(e); + operationFailed = true; finishOperation(); setActivity(description + " failed: " + message(e)); error(e); }); } }); } catch (RejectedExecutionException ignored) { finishOperation(); } } private void finishOperation() { - if (running.decrementAndGet() <= 0 && activeDownloads == 0) { progress.setIndeterminate(false); progress.setVisible(false); } + if (running.decrementAndGet() <= 0 && activeDownloads == 0) { progressClock.stop(); if (!operationFailed) progress.setValue(overall.complete()); } } private void receiveProgress(String message) { if (message == null || message.trim().isEmpty()) return; SwingUtilities.invokeLater(() -> { if (closed.get()) return; - setActivity(message); progress.setIndeterminate(running.get() > 0 || activeDownloads > 0); + setActivity(message); java.util.regex.Matcher url = java.util.regex.Pattern.compile("https?://[^\\s<>]+", java.util.regex.Pattern.CASE_INSENSITIVE).matcher(message); if (url.find()) { sourceUrl.setText(url.group()); sourceUrl.setCaretPosition(0); sourceUrl.setVisible(true); revalidate(); } }); @@ -909,7 +1050,8 @@ private void receiveProgress(String message) { private void receiveDownloadProgress(DownloadProgress.Event event) { SwingUtilities.invokeLater(() -> { if (closed.get()) return; - activeDownloads = event.activeTransfers; + int before = activeDownloads; activeDownloads = event.activeTransfers; + if (before == 0 && activeDownloads > 0 && running.get() == 0) { overall.start(); operationFailed = false; progress.setValue(overall.value()); progressClock.start(); } String label = event.message + (event.complete ? " — complete" : event.finished ? " — stopped" : ""); if (!Objects.equals(status.getText(), label)) setActivity(label); if (event.sourceUrl != null && !event.sourceUrl.isEmpty()) { @@ -917,22 +1059,20 @@ private void receiveDownloadProgress(DownloadProgress.Event event) { sourceUrl.setText(event.sourceUrl); sourceUrl.setCaretPosition(0); sourceUrl.setVisible(true); } boolean measured = event.totalBytes > 0 && event.downloadedBytes >= 0; - progress.setIndeterminate(!measured && !event.finished); if (measured) { int percent = (int) Math.min(100, 100.0 * event.downloadedBytes / event.totalBytes); - progress.setValue(percent); - progress.setToolTipText(readableSize(event.downloadedBytes) + " / " + readableSize(event.totalBytes) + " — current download"); + progress.setToolTipText("Overall progress is estimated. Current file: " + percent + "% · " + readableSize(event.downloadedBytes) + " / " + readableSize(event.totalBytes)); } - if (event.finished && (running.get() > 0 || activeDownloads > 0)) progress.setIndeterminate(true); - progress.setVisible(running.get() > 0 || activeDownloads > 0); revalidate(); + if (event.finished && !event.complete && running.get() == 0) operationFailed = true; + if (event.finished && running.get() == 0 && activeDownloads == 0) { progressClock.stop(); if (!operationFailed) progress.setValue(overall.complete()); } + revalidate(); }); } private void receiveProgressValue(Integer percent) { SwingUtilities.invokeLater(() -> { if (closed.get() || running.get() == 0) return; boolean measured = percent != null && percent >= 0 && percent <= 100; - progress.setIndeterminate(!measured); - if (measured) { progress.setValue(percent); progress.setToolTipText(percent + "% of current step"); } + if (measured) progress.setToolTipText("Overall progress is estimated. Current step: " + percent + "%"); }); } private void setActivity(String message) { @@ -941,6 +1081,7 @@ private void setActivity(String message) { if (activity.getDocument().getLength() > 100000) activity.setText(activity.getText().substring(activity.getText().length() - 80000)); } private void openFolder(String directory) { run("Opening folder", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Opening folders is unavailable on this system."); Desktop.getDesktop().open(new File(directory)); return null; }, ignored -> {}); } + private void openLink(String url) { run("Opening mod downloads", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Open " + url + " in your browser."); Desktop.getDesktop().browse(java.net.URI.create(url)); return null; }, ignored -> {}); } private void openEula() { run("Opening Minecraft EULA", () -> { if (!Desktop.isDesktopSupported()) throw new UnsupportedOperationException("Open https://aka.ms/MinecraftEULA in your browser."); Desktop.getDesktop().browse(java.net.URI.create("https://aka.ms/MinecraftEULA")); return null; }, ignored -> {}); } private void error(Exception e) { information("Could not complete action", message(e)); } private static String message(Exception e) { return e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage(); } @@ -1005,6 +1146,8 @@ private static final class WrapLayout extends FlowLayout { } @Override public void close() { if (!closed.compareAndSet(false, true)) return; workers.shutdownNow(); + progressClock.stop(); if (launchChoices != null) launchChoices.close(); if (launchDialog != null) launchDialog.dispose(); + if (managedWorldPanel != null) managedWorldPanel.close(); progress.setIndeterminate(false); progress.setVisible(false); actions.onProgress(null); actions.onProgressValue(null); try { downloadSubscription.close(); } catch (Exception ignored) { } diff --git a/src/main/java/com/osiris/autoplug/client/ui/LaunchChoicePanel.java b/src/main/java/com/osiris/autoplug/client/ui/LaunchChoicePanel.java new file mode 100644 index 00000000..1dcd00b8 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/LaunchChoicePanel.java @@ -0,0 +1,69 @@ +package com.osiris.autoplug.client.ui; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.LongSupplier; +import com.osiris.autoplug.client.ui.LauncherActions.ProfileInfo; + +/** One large target per choice, with an explicit, cancelable remembered-choice countdown. */ +final class LaunchChoicePanel extends JPanel implements AutoCloseable { + private final Timer timer; + private final LongSupplier clock; + private final Consumer choose; + private final ProfileInfo preferred; + private final JButton wait; + private final long deadline; + private boolean waiting, finished; + + LaunchChoicePanel(List profiles, ProfileInfo preferred, boolean autoLaunch, + Consumer choose) { + this(profiles, preferred, autoLaunch, choose, System::nanoTime); + } + LaunchChoicePanel(List profiles, ProfileInfo preferred, boolean autoLaunch, + Consumer choose, LongSupplier clock) { + super(new BorderLayout(0, 12)); this.clock = clock; this.choose = choose; this.preferred = preferred; + setBorder(new EmptyBorder(16, 16, 16, 16)); + deadline = clock.getAsLong() + 2_000_000_000L; + waiting = autoLaunch && preferred != null && preferred.launchable && !preferred.template; + JLabel heading = new JLabel(waiting ? "Launching with " + preferred.name : "Choose your client profile"); + heading.putClientProperty("html.disable", Boolean.TRUE); add(heading, BorderLayout.NORTH); + JPanel choices = new Choices(); + for (ProfileInfo profile : profiles) { + JButton button = new JButton(); button.putClientProperty("html.disable", Boolean.TRUE); button.setText(profile.toString()); + button.setName("launch-choice-" + profile.id); button.setHorizontalAlignment(SwingConstants.LEFT); + button.setPreferredSize(new Dimension(470, 54)); button.setEnabled(profile.launchable && !profile.template); + button.setToolTipText(profile.migrationSummary); + button.addActionListener(e -> select(profile)); choices.add(button); + } + JScrollPane scroll = new JScrollPane(choices); scroll.setBorder(BorderFactory.createEmptyBorder()); + scroll.setPreferredSize(new Dimension(500, Math.min(340, Math.max(62, profiles.size() * 62)))); add(scroll); + wait = new JButton(); wait.setName("abort-auto-launch"); wait.setPreferredSize(new Dimension(500, 52)); + wait.setBackground(new Color(177, 40, 49)); wait.setForeground(Color.WHITE); wait.setOpaque(true); + wait.addActionListener(e -> { cancelCountdown(); heading.setText("Choose your client profile"); }); + add(wait, BorderLayout.SOUTH); + timer = new Timer(100, e -> tick()); + tick(); if (waiting) timer.start(); + } + void tick() { + if (!waiting || finished) { wait.setVisible(false); return; } + long remaining = deadline - clock.getAsLong(); + if (remaining <= 0) { select(preferred); return; } + wait.setText("Wait, let me select something else… (" + Math.max(1, (remaining + 999_999_999L) / 1_000_000_000L) + "s)"); + } + void cancelCountdown() { waiting = false; timer.stop(); wait.setVisible(false); revalidate(); } + private void select(ProfileInfo profile) { + if (finished) return; finished = true; waiting = false; if (timer != null) timer.stop(); choose.accept(profile); + } + @Override public void close() { finished = true; waiting = false; timer.stop(); } + private static final class Choices extends JPanel implements Scrollable { + Choices() { super(new GridLayout(0, 1, 0, 8)); } + public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } + public int getScrollableUnitIncrement(Rectangle r, int o, int d) { return 24; } + public int getScrollableBlockIncrement(Rectangle r, int o, int d) { return Math.max(24, r.height - 24); } + public boolean getScrollableTracksViewportWidth() { return true; } + public boolean getScrollableTracksViewportHeight() { return false; } + } +} diff --git a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java index 00938998..18422d35 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java +++ b/src/main/java/com/osiris/autoplug/client/ui/LauncherActions.java @@ -26,9 +26,17 @@ default void onProgressValue(Consumer listener) {} default WorldInfo createWorld(String name, String serverProfileId, String clientProfileId) throws Exception { throw unavailable(); } default void setWorldEulaAccepted(String id, boolean accepted) throws Exception { throw unavailable(); } default void launchWorld(String id, boolean share) throws Exception { throw unavailable(); } + default void launchWorld(String id, boolean share, String profileId) throws Exception { launchWorld(id, share); } /** Starts an existing singleplayer save and returns the backend's launch status. */ default String launchLocalWorld(String id, String version) throws Exception { throw unavailable(); } + default String launchLocalWorld(String id, String version, String profileId) throws Exception { return launchLocalWorld(id, version); } + default String preferredProfile(String target) throws Exception { return ""; } + default void rememberProfile(String target, String profileId) throws Exception { } default String shareWorld(String id) throws Exception { throw unavailable(); } + default String serverLog(String id) throws Exception { return "Start this managed world to view its AutoPlug console."; } + default void serverCommand(String id, String command) throws Exception { throw unavailable(); } + default void stopWorld(String id) throws Exception { throw unavailable(); } + default void restartWorld(String id) throws Exception { throw unavailable(); } default void launchProfile(String profileId, String host, int port) throws Exception { throw unavailable(); } default SettingsInfo settings() throws Exception { return new SettingsInfo(); } default void saveSettings(SettingsInfo settings) throws Exception { throw unavailable(); } @@ -89,5 +97,6 @@ final class SettingsInfo { public int port = 25565; public boolean upnp = true; public boolean rememberAccount = false; + public boolean fullscreen = true; } } diff --git a/src/main/java/com/osiris/autoplug/client/ui/ManagedWorldPanel.java b/src/main/java/com/osiris/autoplug/client/ui/ManagedWorldPanel.java new file mode 100644 index 00000000..f31f747e --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/ManagedWorldPanel.java @@ -0,0 +1,101 @@ +package com.osiris.autoplug.client.ui; + +import com.osiris.autoplug.client.ui.LauncherActions.WorldInfo; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +/** Console and lifecycle controls always address the selected world's isolated AutoPlug instance. */ +final class ManagedWorldPanel extends JPanel implements AutoCloseable { + private final LauncherActions actions; + private final Consumer start; + private final Consumer open; + private final JComboBox worlds = new JComboBox<>(); + private final JTextArea output = new JTextArea(); + private final JTextField command = new JTextField(); + private final JLabel state = new JLabel("Choose a managed world"); + private final ExecutorService worker = Executors.newSingleThreadExecutor(r -> { Thread t = new Thread(r, "AutoPlug-world-console"); t.setDaemon(true); return t; }); + private final AtomicBoolean reading = new AtomicBoolean(), closed = new AtomicBoolean(); + private final Timer timer = new Timer(1800, e -> { if (isShowing()) refreshLog(); }); + private String wanted; + private boolean updatingChoices; + ManagedWorldPanel(LauncherActions actions, Consumer start, Consumer open) { + super(new BorderLayout(0, 10)); this.actions = actions; this.start = start; this.open = open; + setName("managed-world-console"); setBorder(new EmptyBorder(12, 4, 4, 4)); setOpaque(false); + worlds.setName("managed-world-selector"); worlds.setRenderer(new DefaultListCellRenderer() { + @Override public Component getListCellRendererComponent(JList l, Object value, int i, boolean selected, boolean focus) { + JLabel label = (JLabel) super.getListCellRendererComponent(l, "", i, selected, focus); + label.putClientProperty("html.disable", Boolean.TRUE); + if (value instanceof WorldInfo) { WorldInfo w = (WorldInfo) value; label.setText(w.name + (w.running ? " · Running" : " · Stopped")); } + return label; + } + }); + JPanel top = new JPanel(new BorderLayout(8, 8)); top.setOpaque(false); top.add(worlds); top.add(button("Refresh", this::refresh), BorderLayout.EAST); + JPanel controls = new JPanel(new GridLayout(2, 4, 6, 6)); controls.setOpaque(false); + controls.add(button("Play / start", () -> { WorldInfo w = selected(); if (w != null) start.accept(w); })); + controls.add(button("Stop", () -> action(w -> actions.stopWorld(w.id)))); + controls.add(button("Restart", () -> action(w -> actions.restartWorld(w.id)))); + controls.add(button("Back up", () -> send(".backup"))); + controls.add(button("AutoPlug help", () -> send(".help"))); + controls.add(button("Server status", () -> send("list"))); + controls.add(button("Configuration", () -> { WorldInfo w = selected(); if (w != null) open.accept(new java.io.File(w.directory, "autoplug").toString()); })); + controls.add(button("World folder", () -> { WorldInfo w = selected(); if (w != null) open.accept(w.directory); })); + top.add(controls, BorderLayout.SOUTH); add(top, BorderLayout.NORTH); + output.setName("managed-world-output"); output.setEditable(false); output.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + output.setText("Each world has its own AutoPlug copy, console, configuration and server process.\nChoose a world and Play / start.\nServer and mod versions are managed through Profiles."); + add(new JScrollPane(output)); + JPanel bottom = new JPanel(new BorderLayout(8, 6)); bottom.setOpaque(false); + command.setName("managed-world-command"); command.putClientProperty("JTextField.placeholderText", "Server command or .help for AutoPlug commands"); + command.addActionListener(e -> submit()); bottom.add(command); bottom.add(button("Send", this::submit), BorderLayout.EAST); + state.putClientProperty("html.disable", Boolean.TRUE); bottom.add(state, BorderLayout.SOUTH); add(bottom, BorderLayout.SOUTH); + worlds.addActionListener(e -> { if (!updatingChoices) { output.setText(""); refreshLog(); } }); timer.start(); + } + private JButton button(String text, Runnable action) { JButton b = new JButton(text); b.addActionListener(e -> action.run()); return b; } + private WorldInfo selected() { return (WorldInfo) worlds.getSelectedItem(); } + void select(String id) { wanted = id; refresh(); } + void refresh() { + submitWork(() -> { List result = new ArrayList<>(); for (WorldInfo w : actions.worlds()) if (!w.local) result.add(w); return result; }, result -> { + String previous = wanted != null ? wanted : selected() == null ? null : selected().id; + updatingChoices = true; + try { worlds.removeAllItems(); for (WorldInfo w : result) { worlds.addItem(w); if (w.id.equals(previous)) worlds.setSelectedItem(w); } } + finally { updatingChoices = false; } + wanted = null; if (result.isEmpty()) state.setText("Create a managed world in Worlds to get started."); refreshLog(); + }); + } + private void submit() { String value = command.getText().trim(); if (value.isEmpty()) return; send(value); command.setText(""); } + private void send(String text) { action(w -> actions.serverCommand(w.id, text)); } + private interface Operation { void run(WorldInfo world) throws Exception; } + private void action(Operation operation) { + WorldInfo world = selected(); if (world == null) return; + state.setText("Working on " + world.name + "…"); + submitWork(() -> { operation.run(world); return world.id; }, id -> { if (selected() != null && selected().id.equals(id)) state.setText("Command completed"); refresh(); }, + e -> { if (selected() != null && selected().id.equals(world.id)) state.setText("Could not complete action: " + e.getMessage()); }); + } + void refreshLog() { + WorldInfo world = selected(); if (world == null || !reading.compareAndSet(false, true)) return; + try { worker.submit(() -> { + String text; + try { text = actions.serverLog(world.id); } catch (Exception e) { text = "Console unavailable: " + e.getMessage(); } + String log = text; SwingUtilities.invokeLater(() -> { reading.set(false); if (closed.get() || selected() == null) return; + if (!selected().id.equals(world.id)) { refreshLog(); return; } + if (!output.getText().equals(log)) { boolean follow = output.getCaretPosition() >= Math.max(0, output.getDocument().getLength() - 2); output.setText(log); if (follow) output.setCaretPosition(output.getDocument().getLength()); } + state.setText(world.name + (world.running ? " · Running" : " · Stopped") + " · latest 64 KiB of console output"); + }); + }); } catch (RejectedExecutionException e) { reading.set(false); } + } + private void submitWork(Callable task, Consumer success) { + submitWork(task, success, e -> state.setText("Could not complete action: " + e.getMessage())); + } + private void submitWork(Callable task, Consumer success, Consumer failure) { + if (closed.get()) return; + try { worker.submit(() -> { try { T result = task.call(); SwingUtilities.invokeLater(() -> { if (!closed.get()) success.accept(result); }); } + catch (Exception e) { SwingUtilities.invokeLater(() -> { if (!closed.get()) failure.accept(e); }); } }); } + catch (RejectedExecutionException ignored) { } + } + @Override public void close() { closed.set(true); timer.stop(); worker.shutdownNow(); } +} diff --git a/src/main/java/com/osiris/autoplug/client/ui/OverallProgress.java b/src/main/java/com/osiris/autoplug/client/ui/OverallProgress.java new file mode 100644 index 00000000..2d20a721 --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/ui/OverallProgress.java @@ -0,0 +1,10 @@ +package com.osiris.autoplug.client.ui; + +/** A monotonic estimate for work whose complete byte/work count is not known in advance. */ +final class OverallProgress { + private double value; + void start() { value = 2; } + int tick() { if (value < 100) value = Math.min(95, value + (95 - value) * 0.008); return value(); } + int value() { return (int) value; } + int complete() { value = 100; return 100; } +} diff --git a/src/main/java/com/osiris/autoplug/client/utils/MineStat.java b/src/main/java/com/osiris/autoplug/client/utils/MineStat.java index 1097e16f..6e67ff53 100644 --- a/src/main/java/com/osiris/autoplug/client/utils/MineStat.java +++ b/src/main/java/com/osiris/autoplug/client/utils/MineStat.java @@ -55,6 +55,7 @@ public class MineStat { * Minecraft version the server is running */ private String version; + private String favicon; private int protocol = -1; /** * Current number of players on the server @@ -202,6 +203,7 @@ private String stripMotdFormatting(JsonElement motd, int depth) { } public int getProtocol() { return protocol; } + public String getFavicon() { return favicon; } public String getVersion() { return version; @@ -526,6 +528,7 @@ public boolean isDataValid() { public Retval jsonRequest(String address, int port, int timeout) { serverUp = false; protocol = -1; + favicon = null; try (Socket clientSocket = new Socket()) { long startTime = System.currentTimeMillis(); clientSocket.connect(new InetSocketAddress(address, port), timeout); @@ -566,6 +569,8 @@ public Retval jsonRequest(String address, int port, int timeout) { protocol = jobj.get("version").getAsJsonObject().get("protocol").getAsInt(); setCurrentPlayers(jobj.get("players").getAsJsonObject().get("online").getAsInt()); setMaximumPlayers(jobj.get("players").getAsJsonObject().get("max").getAsInt()); + JsonElement icon = jobj.get("favicon"); + if (icon != null && icon.isJsonPrimitive() && icon.getAsJsonPrimitive().isString()) favicon = icon.getAsString(); setRequestType("SLP 1.7 (JSON)"); if (!isDataValid()) return Retval.UNKNOWN; diff --git a/src/main/java/com/osiris/autoplug/client/utils/UtilsMinecraft.java b/src/main/java/com/osiris/autoplug/client/utils/UtilsMinecraft.java index f02f3d5d..ff52e775 100644 --- a/src/main/java/com/osiris/autoplug/client/utils/UtilsMinecraft.java +++ b/src/main/java/com/osiris/autoplug/client/utils/UtilsMinecraft.java @@ -163,7 +163,7 @@ public List getPlugins(File dir) throws FileNotFoundException { if (found) break; } } catch (Exception e) { - AL.warn("Failed to get details of " + jar.getName(), e); + warnUnreadable(jar, e); } } return plugins; @@ -222,21 +222,7 @@ public List getMods(File dir) throws FileNotFoundException { // name = jar.getName(); //} // Don't do this, because the jars name contains its version and generally it wouldn't be nice String version = obj.get("version").getAsString(); - JsonElement authorRaw = obj.get("author"); - JsonElement authorsRaw = obj.get("authors"); - - String author = null; - if (authorRaw != null && !authorRaw.isJsonNull()) - author = authorRaw.getAsString(); - else { - try { - // Old fabric.mod.json authors was a string array - author = authorsRaw.getAsJsonArray().get(0).getAsString(); // Returns only the first author - } catch (Exception e) { - // New fabric.mod.json authors is a json objects array - author = authorsRaw.getAsJsonArray().get(0).getAsJsonObject().get("name").getAsString(); - } - } + String author = fabricAuthor(obj); // Also check for ids in the config String modrinthId = obj.get("id").getAsString(); @@ -245,10 +231,30 @@ public List getMods(File dir) throws FileNotFoundException { if (found) break; } } catch (Exception e) { - AL.warn("Failed to get details of " + jar.getName(), e); + warnUnreadable(jar, e); } } return mods; } + private String fabricAuthor(JsonObject metadata) { + JsonElement author = metadata.get("author"); + if (author == null || author.isJsonNull()) { + JsonElement authors = metadata.get("authors"); + if (authors == null || !authors.isJsonArray() || authors.getAsJsonArray().size() == 0) return null; + author = authors.getAsJsonArray().get(0); + } + if (author.isJsonObject()) author = author.getAsJsonObject().get("name"); + return author != null && author.isJsonPrimitive() ? author.getAsString() : null; + } + + private void warnUnreadable(File jar, Exception error) { + String message = "Failed to get details of " + jar.getName(); + // The standalone launcher scans collections before the legacy logger is initialized. + synchronized (AL.class) { + if (AL.isStarted && AL.STRIPPED_OUT != null) AL.warn(message, error); + else System.err.println(message + ": " + error.getMessage()); + } + } + } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrap.java b/src/main/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrap.java new file mode 100644 index 00000000..be58e14f --- /dev/null +++ b/src/main/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrap.java @@ -0,0 +1,113 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.Main; +import com.osiris.autoplug.client.profiles.JsonFiles; +import com.osiris.autoplug.client.profiles.Profile; +import com.osiris.dyml.Yaml; +import java.io.*; +import java.nio.file.*; +import java.util.*; +import java.util.jar.JarFile; + +/** Each managed world runs a real, isolated copy of AutoPlug's server wrapper. */ +public final class AutoPlugWorldBootstrap { + public static final String CHILD_ARGUMENT = "--managed-world-child"; + public static final String UPDATER_POLICY = "Managed world: automatic legacy updates stay disabled to preserve the selected profile, exact game version and runtime. Use the parent launcher's profile update workflow."; + public static final String RESTARTER_POLICY = "Managed world: the parent launcher owns this session. Scheduled restarts stay disabled; use Restart in its server console."; + public static final String COMMAND_POLICY = "Managed world: informational preview. The parent launcher supplies the exact argument vector in managed-server-command.json on each launch."; + private static volatile List childCommand; + private final Path sourceJar, wrapperJava; + static class LaunchMetadata { public List command = new ArrayList<>(); } + + public AutoPlugWorldBootstrap() { this.sourceJar = null; this.wrapperJava = null; } + AutoPlugWorldBootstrap(Path sourceJar, Path wrapperJava) { this.sourceJar = sourceJar; this.wrapperJava = wrapperJava; } + + public ServerLaunch wrap(Profile profile, ServerLaunch server) throws Exception { + Path source = sourceJar == null ? Paths.get(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()) : sourceJar; + if (!Files.isRegularFile(source) || !source.getFileName().toString().endsWith(".jar")) + throw new IOException("Managed worlds require the packaged AutoPlug JAR. Run the built AutoPlug-Client.jar, rather than a classes directory."); + try (JarFile jar = new JarFile(source.toFile())) { + if (jar.getEntry("com/osiris/autoplug/client/Main.class") == null) throw new IOException("The wrapper JAR does not contain AutoPlug"); + } + Path java = wrapperJava == null ? Paths.get(System.getProperty("java.home"), "bin", System.getProperty("os.name").startsWith("Windows") ? "java.exe" : "java") : wrapperJava; + java = java.toAbsolutePath().normalize(); + if (!Files.isRegularFile(java)) throw new IOException("AutoPlug wrapper Java executable is unavailable: " + java); + validateCommand(server.command); + Path config = server.directory.resolve("autoplug"); + if (Files.isSymbolicLink(config)) throw new IOException("World AutoPlug configuration must not be a symbolic link"); + Files.createDirectories(config); + Path copy = config.resolve("AutoPlug-Client.jar"); + if (Files.isSymbolicLink(copy)) throw new IOException("World AutoPlug JAR must not be a symbolic link"); + Path temporary = Files.createTempFile(config, ".autoplug-copy-", ".jar"); + try { + Files.copy(source, temporary, StandardCopyOption.REPLACE_EXISTING); + try { Files.move(temporary, copy, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } + catch (AtomicMoveNotSupportedException e) { Files.move(temporary, copy, StandardCopyOption.REPLACE_EXISTING); } + } finally { Files.deleteIfExists(temporary); } + LaunchMetadata metadata = new LaunchMetadata(); metadata.command.addAll(server.command); + Path commandFile = config.resolve("managed-server-command.json"); + if (Files.isSymbolicLink(commandFile)) throw new IOException("Managed command file must not be a link"); + new JsonFiles().write(commandFile, metadata); + configure(config, profile, server.command); + List command = Arrays.asList(java.toString(), "-Djava.awt.headless=true", + "-Dautoplug.home=" + config.resolve("launcher"), "-jar", copy.toString(), CHILD_ARGUMENT); + return new ServerLaunch(command, server.directory, ".stop both", ".restart"); + } + + private void configure(Path directory, Profile profile, List command) throws Exception { + Yaml general = yaml(directory, "general"); + general.put("general", "autoplug", "target-software").setValues("MINECRAFT_SERVER"); + general.put("general", "autoplug", "auto-stop").setValues("true"); + general.put("general", "autoplug", "start-on-boot").setValues("false"); + general.put("general", "autoplug", "system-tray", "enable").setValues("false"); + general.put("general", "server", "auto-start").setValues("true"); + general.put("general", "server", "auto-eula").setValues("false"); + general.put("general", "server", "restart-on-crash").setValues("false"); + general.put("general", "server", "version").setValues(profile.gameVersion); + general.put("general", "server", "start-command").setValues(displayCommand(command)) + .setComments(COMMAND_POLICY); + general.put("general", "server", "stop-command").setValues("stop"); + general.put("general", "directory-cleaner", "enabled").setDefValues("false"); + general.save(); + Yaml updater = yaml(directory, "updater"); + for (String name : Arrays.asList("global-recurring-checks", "self-updater", "java-updater", "server-updater", "plugins-updater", "mods-updater")) + updater.put("updater", name, "enable").setValues("false").setComments(UPDATER_POLICY); + updater.save(); + Yaml restarter = yaml(directory, "restarter"); + restarter.put("restarter", "daily-restarter", "enable").setValues("false").setComments(RESTARTER_POLICY); + restarter.put("restarter", "custom-restarter", "enable").setValues("false").setComments(RESTARTER_POLICY); restarter.save(); + Yaml backup = yaml(directory, "backup"); backup.put("backup", "enable").setDefValues("false"); backup.save(); + } + private Yaml yaml(Path directory, String name) throws Exception { + Path path = directory.resolve(name + ".yml"); + if (Files.isSymbolicLink(path)) throw new IOException("World configuration must not be a symbolic link: " + name); + Yaml yaml = new Yaml(path.toString()); yaml.load(); return yaml; + } + private String displayCommand(List command) { + // This is informational only; Server uses the exact persisted vector for this child. + List parts = new ArrayList<>(); for (String value : command) parts.add('"' + value.replace("\"", "\\\"") + '"'); + return String.join(" ", parts); + } + public static boolean configureIfChild(String[] args) throws IOException { + if (args == null || args.length == 0 || !CHILD_ARGUMENT.equals(args[0])) return false; + if (args.length != 1) throw new IOException("Managed child accepts only its world-local command file"); + childCommand = readCommand(Paths.get(System.getProperty("user.dir"))); + return true; + } + static List readCommand(Path directory) throws IOException { + Path config = directory.resolve("autoplug"), file = config.resolve("managed-server-command.json"); + if (Files.isSymbolicLink(config) || Files.isSymbolicLink(file)) throw new IOException("Managed command path must not be linked"); + LaunchMetadata metadata = new JsonFiles().read(file, LaunchMetadata.class); + validateCommand(metadata.command); + return Collections.unmodifiableList(new ArrayList<>(metadata.command)); + } + private static void validateCommand(List command) throws IOException { + if (command == null || command.isEmpty() || command.size() > 256) throw new IOException("Invalid managed server argument vector"); + for (String argument : command) if (argument == null || argument.length() > 32768 || argument.indexOf('\0') >= 0) + throw new IOException("Invalid managed server argument"); + Path executable = Paths.get(command.get(0)); + if (!executable.isAbsolute() || !Files.isRegularFile(executable)) throw new IOException("Managed server executable must be an existing absolute path"); + } + public static boolean isChild() { return childCommand != null; } + public static List childCommand() { return childCommand; } +} diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java b/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java index 154f41e2..477df99c 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/ManagedServer.java @@ -11,21 +11,40 @@ public final class ManagedServer implements AutoCloseable { private final Process process; private final long stopTimeoutMillis; + private final String stopCommand, restartCommand; private final AtomicBoolean closed = new AtomicBoolean(); public ManagedServer(Process process, long stopTimeoutMillis) { + this(process, stopTimeoutMillis, "stop", null); + } + public ManagedServer(Process process, long stopTimeoutMillis, String stopCommand, String restartCommand) { this.process = process; this.stopTimeoutMillis = stopTimeoutMillis; + this.stopCommand = stopCommand; this.restartCommand = restartCommand; } public Process process() { return process; } public boolean isAlive() { return process.isAlive(); } + public synchronized void command(String command) throws IOException { + if (closed.get() || !isAlive()) throw new IOException("This world's server is not running"); + if (command == null || command.trim().isEmpty() || command.length() > 8192 || command.indexOf('\n') >= 0 || command.indexOf('\r') >= 0 || command.indexOf('\0') >= 0) + throw new IOException("Enter one nonempty console command"); + process.getOutputStream().write((command + "\n").getBytes(StandardCharsets.UTF_8)); process.getOutputStream().flush(); + } + public void restart() throws IOException { + if (restartCommand == null) throw new IOException("This process does not support in-place AutoPlug restart"); + command(restartCommand); + } @Override public void close() { if (!closed.compareAndSet(false, true)) return; List descendants = process.descendants().collect(Collectors.toList()); try { if (process.isAlive()) { - process.getOutputStream().write("stop\n".getBytes(StandardCharsets.UTF_8)); - process.getOutputStream().flush(); + // Serialize the final line with any console command already in flight. + // Do not hold this lock while waiting for the child to shut down. + synchronized (this) { + process.getOutputStream().write((stopCommand + "\n").getBytes(StandardCharsets.UTF_8)); + process.getOutputStream().flush(); + } if (process.waitFor(stopTimeoutMillis, TimeUnit.MILLISECONDS)) return; } } catch (IOException ignored) { @@ -34,6 +53,8 @@ public ManagedServer(Process process, long stopTimeoutMillis) { Thread.currentThread().interrupt(); } finally { if (process.isAlive()) { + // A wrapper restart may have created a new child while graceful shutdown was waiting. + process.descendants().forEach(handle -> { if (!descendants.contains(handle)) descendants.add(handle); }); descendants.forEach(ProcessHandle::destroy); process.destroy(); try { process.waitFor(1000, TimeUnit.MILLISECONDS); } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java b/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java index 875ee633..044687f5 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/ServerLaunch.java @@ -9,9 +9,14 @@ public final class ServerLaunch { public final List command; public final Path directory; + public final String stopCommand, restartCommand; public ServerLaunch(List command, Path directory) { + this(command, directory, "stop", null); + } + public ServerLaunch(List command, Path directory, String stopCommand, String restartCommand) { if (command == null || command.isEmpty()) throw new IllegalArgumentException("Server command is empty"); this.command = Collections.unmodifiableList(new ArrayList<>(command)); this.directory = directory.toAbsolutePath().normalize(); + this.stopCommand = stopCommand; this.restartCommand = restartCommand; } } diff --git a/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java b/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java index 3c906750..c5a3a79f 100644 --- a/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java +++ b/src/main/java/com/osiris/autoplug/client/worlds/WorldService.java @@ -22,6 +22,7 @@ public final class WorldService implements AutoCloseable { @FunctionalInterface public interface Probe { boolean isReady(String host, int port) throws Exception; } @FunctionalInterface public interface ProcessFactory { Process start(ServerLaunch launch) throws IOException; } + @FunctionalInterface interface LaunchWrapper { ServerLaunch wrap(Profile profile, ServerLaunch launch) throws Exception; } private final ProfileStore profiles; private final WorldStore worlds; @@ -36,6 +37,7 @@ public final class WorldService implements AutoCloseable { private boolean closed; private int preferredPort = 25565; private boolean sharingEnabled = true; + private LaunchWrapper wrapper = (profile, launch) -> launch; public WorldService(ProfileStore profiles, WorldStore worlds, ServerInstaller installer, ClientLauncher launcher) { this(profiles, worlds, installer, launcher, new UpnpSharingService(), @@ -43,6 +45,7 @@ public WorldService(ProfileStore profiles, WorldStore worlds, ServerInstaller in launch -> new ProcessBuilder(launch.command).directory(launch.directory.toFile()) .redirectErrorStream(true).redirectOutput(ProcessBuilder.Redirect.appendTo( launch.directory.resolve("autoplug-server.log").toFile())).start(), Duration.ofMinutes(3)); + wrapper = new AutoPlugWorldBootstrap()::wrap; } public WorldService(ProfileStore profiles, WorldStore worlds, ServerInstaller installer, ClientLauncher launcher, @@ -94,7 +97,9 @@ private WorldSession startWorld(VirtualWorld world, Profile serverProfile, Profi ServerLaunch launch = installer.prepare(serverProfile, directory); if (!directory.toAbsolutePath().normalize().equals(launch.directory)) throw new IOException("Installer returned a different world directory"); configureLocalServer(directory, port, authenticatedAccount); - ManagedServer server = new ManagedServer(processes.start(launch), 15000); + launch = wrapper.wrap(serverProfile, launch); + if (!directory.toAbsolutePath().normalize().equals(launch.directory)) throw new IOException("Wrapper returned a different world directory"); + ManagedServer server = new ManagedServer(processes.start(launch), 30000, launch.stopCommand, launch.restartCommand); Process client = null; try { long deadline = System.nanoTime() + readyTimeout.toNanos(); @@ -126,7 +131,8 @@ private static void validateProfiles(Profile server, Profile client) { if (server.migrationPending || client.migrationPending) throw new IllegalArgumentException("Review the profile migration summary before launching"); if (client.getType() != ProfileType.MODS || client.isTemplate()) throw new IllegalArgumentException("Select a playable client profile, not a template"); if (!Objects.equals(server.getGameVersion(), client.getGameVersion())) throw new IllegalArgumentException("Server and client game versions must match"); - if (server.getType() == ProfileType.MODS_SERVER && !Objects.equals(server.getLoader(), client.getLoader())) + if (server.getType() == ProfileType.MODS_SERVER && !"VANILLA".equals(server.getLoader()) + && !Objects.equals(server.getLoader(), client.getLoader())) throw new IllegalArgumentException("Server and client mod loaders must match"); } @@ -170,6 +176,26 @@ private static int availablePort(int preferred) throws IOException { } } public void stopWorld(String worldId) { WorldSession session = sessions.get(worldId); if (session != null) session.close(); } + public void serverCommand(String worldId, String command) throws IOException { running(worldId).server().command(command); } + public void restartWorld(String worldId) throws IOException { running(worldId).server().restart(); } + private WorldSession running(String worldId) throws IOException { + WorldSession session = sessions.get(worldId); + if (session == null || session.isClosed()) throw new IOException("Launch this world before using its console"); + return session; + } + /** A bounded tail of this world's own AutoPlug and Minecraft output. */ + public String serverLog(String worldId) throws IOException { + worlds.get(worldId); Path file = worlds.getDirectory(worldId).resolve("autoplug-server.log"); + if (Files.isSymbolicLink(file)) throw new IOException("World console log must not be linked"); + if (!Files.exists(file)) return "No console output yet. Launch this world first."; + try (java.io.RandomAccessFile log = new java.io.RandomAccessFile(file.toFile(), "r")) { + long length = log.length(), start = Math.max(0, length - 65536); log.seek(start); + byte[] bytes = new byte[(int) (length - start)]; log.readFully(bytes); + String text = new String(bytes, StandardCharsets.UTF_8); + if (start > 0 && text.indexOf('\n') >= 0) text = text.substring(text.indexOf('\n') + 1); + return text; + } + } public Collection activeSessions() { return Collections.unmodifiableList(new ArrayList<>(sessions.values())); } public boolean isProfileInUse(String profileId) { return sessions.values().stream().anyMatch(s -> !s.isClosed() && (profileId.equals(s.getWorld().clientProfileId) || profileId.equals(s.getWorld().serverProfileId))); diff --git a/src/test/java/com/osiris/autoplug/client/ServerProcessObservationTest.java b/src/test/java/com/osiris/autoplug/client/ServerProcessObservationTest.java new file mode 100644 index 00000000..e8f0dbd1 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ServerProcessObservationTest.java @@ -0,0 +1,69 @@ +package com.osiris.autoplug.client; + +import org.junit.jupiter.api.Test; +import java.io.*; +import java.lang.reflect.Field; +import java.util.concurrent.atomic.AtomicBoolean; +import static org.junit.jupiter.api.Assertions.*; + +class ServerProcessObservationTest { + @Test void staleExitCannotInspectOrStopTheReplacementProcess() throws Exception { + Field field = Server.class.getDeclaredField("process"); field.setAccessible(true); + Object original = field.get(null); + StubProcess stopped = new StubProcess(false, 7), replacement = new StubProcess(true, 0); + try { + field.set(null, stopped); + assertEquals(Integer.valueOf(7), Server.observedExitCode(stopped)); + // The checker captured stopped, then .restart replaced the global process before exit handling. + field.set(null, replacement); + assertNull(Server.observedExitCode(stopped)); + assertNull(Server.observedExitCode(replacement)); + assertFalse(Server.requestAutomaticStop(stopped)); + assertFalse(Server.requestAutomaticStop(replacement)); + assertEquals(0, replacement.exitReads, "A live replacement has no exit value to inspect"); + assertFalse(replacement.destroyed); + } finally { field.set(null, original); } + } + + @Test void automaticExitReservationBlocksNewStartAfterLifecycleLockIsReleased() throws Exception { + Field field = Server.class.getDeclaredField("process"); field.setAccessible(true); + Field stopping = Server.class.getDeclaredField("autoStopRequested"); stopping.setAccessible(true); + Object original = field.get(null); boolean originalStopping = stopping.getBoolean(null); + StubProcess stopped = new StubProcess(false, 0); + try { + field.set(null, stopped); stopping.setBoolean(null, false); + assertTrue(Server.requestAutomaticStop(stopped)); + assertFalse(Thread.holdsLock(Server.class)); + Server.start(); Server.restart(); + assertSame(stopped, field.get(null), "Releasing the monitor before System.exit must not allow a replacement server"); + assertFalse(Server.requestAutomaticStop(stopped), "The exit reservation is idempotent"); + assertFalse(stopped.destroyed); + } finally { field.set(null, original); stopping.setBoolean(null, originalStopping); } + } + + @Test void intentionalRestartSuppressesStoppedGenerationUntilNewProcessStarts() throws Exception { + Field field = Server.class.getDeclaredField("process"); field.setAccessible(true); + Field restartingField = Server.class.getDeclaredField("isRestarting"); restartingField.setAccessible(true); + AtomicBoolean restarting = (AtomicBoolean) restartingField.get(null); + Object original = field.get(null); boolean originallyRestarting = restarting.get(); + StubProcess stopped = new StubProcess(false, 0); + try { + field.set(null, stopped); restarting.set(true); + assertNull(Server.observedExitCode(stopped)); assertEquals(0, stopped.exitReads); + restarting.set(false); + assertEquals(Integer.valueOf(0), Server.observedExitCode(stopped)); + } finally { field.set(null, original); restarting.set(originallyRestarting); } + } + + private static class StubProcess extends Process { + final boolean alive; final int code; int exitReads; boolean destroyed; + StubProcess(boolean alive, int code) { this.alive = alive; this.code = code; } + @Override public boolean isAlive() { return alive; } + @Override public int exitValue() { exitReads++; if (alive) throw new IllegalThreadStateException("Still running"); return code; } + @Override public int waitFor() { return code; } + @Override public void destroy() { destroyed = true; } + @Override public OutputStream getOutputStream() { return new ByteArrayOutputStream(); } + @Override public InputStream getInputStream() { return new ByteArrayInputStream(new byte[0]); } + @Override public InputStream getErrorStream() { return new ByteArrayInputStream(new byte[0]); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/browser/ServerFavoriteHistoryTest.java b/src/test/java/com/osiris/autoplug/client/browser/ServerFavoriteHistoryTest.java new file mode 100644 index 00000000..21722667 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/browser/ServerFavoriteHistoryTest.java @@ -0,0 +1,37 @@ +package com.osiris.autoplug.client.browser; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import static org.junit.jupiter.api.Assertions.*; + +class ServerFavoriteHistoryTest { + @TempDir Path directory; + + @Test void oldFavoritesGainPersistentJoinHistoryWithoutLosingItOnRename() throws Exception { + Path file = directory.resolve("servers.json"); + Files.write(file, "[{\"name\":\"Minecraft Server\",\"address\":\"EXAMPLE.com\"}]".getBytes(StandardCharsets.UTF_8)); + ServerBrowserService browser = new ServerBrowserService(file, directory.resolve("servers.dat")); + SavedServer original = browser.list().get(0); + assertEquals("example.com", original.name); assertEquals(0, original.lastJoinedAt); + browser.recordJoined("EXAMPLE.COM:25565", 1000); + browser.add("Friends", "example.com"); + SavedServer reopened = new ServerBrowserService(file, directory.resolve("servers.dat")).list().get(0); + assertEquals("Friends", reopened.name); assertEquals(1000, reopened.lastJoinedAt); + browser.recordJoined("example.com", 900); + assertEquals(1000, browser.list().get(0).lastJoinedAt, "An older completion must not move activity backwards"); + } + + @Test void lateLaunchNeverRecreatesRemovedFavoriteAndBlankNamesUseAddress() throws Exception { + Path file = directory.resolve("servers.json"); + ServerBrowserService browser = new ServerBrowserService(file, directory.resolve("servers.dat")); + browser.add("Minecraft Server", "[::1]:25566"); + assertEquals("[::1]:25566", browser.list().get(0).name); + browser.remove("[::1]:25566"); byte[] afterRemoval = Files.readAllBytes(file); + browser.recordJoined("[::1]:25566", 2000); + assertArrayEquals(afterRemoval, Files.readAllBytes(file)); assertTrue(browser.list().isEmpty()); + assertEquals("example.com", new SavedServer(" ", "example.com").name); + assertEquals("My Minecraft Server", new SavedServer("My Minecraft Server", "example.com").name); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/browser/ServerIconTest.java b/src/test/java/com/osiris/autoplug/client/browser/ServerIconTest.java new file mode 100644 index 00000000..a7058be9 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/browser/ServerIconTest.java @@ -0,0 +1,32 @@ +package com.osiris.autoplug.client.browser; + +import org.junit.jupiter.api.Test; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import javax.imageio.ImageIO; +import static org.junit.jupiter.api.Assertions.*; + +class ServerIconTest { + @Test void decodesStatusPngAndPreservesItsPixels() throws Exception { + BufferedImage image = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB); + image.setRGB(7, 11, 0xFF23875A); + BufferedImage decoded = ServerIcon.decode(data(image, "png")); + assertNotNull(decoded); assertEquals(64, decoded.getWidth()); assertEquals(64, decoded.getHeight()); + assertEquals(0xFF23875A, decoded.getRGB(7, 11)); + } + + @Test void rejectsUrlsNonPngWrongDimensionsOversizeAndMalformedContent() throws Exception { + assertNull(ServerIcon.decode("https://example.invalid/server-icon.png")); + assertNull(ServerIcon.decode(null)); assertNull(ServerIcon.decode("data:image/png;base64,!!!")); + assertNull(ServerIcon.decode(data(new BufferedImage(65, 64, BufferedImage.TYPE_INT_RGB), "png"))); + assertNull(ServerIcon.decode(data(new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB), "gif").replace("image/gif", "image/png"))); + assertNull(ServerIcon.decode("data:image/png;base64," + Base64.getEncoder().encodeToString(new byte[96 * 1024 + 1]))); + assertNull(ServerIcon.decode("data:image/png;base64," + Base64.getEncoder().encodeToString(new byte[]{(byte)137,80,78,71,13,10,26,10}))); + } + + private static String data(BufferedImage image, String format) throws Exception { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); assertTrue(ImageIO.write(image, format, bytes)); + return "data:image/" + format + ";base64," + Base64.getEncoder().encodeToString(bytes.toByteArray()); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/browser/ServerStatusIconIntegrationTest.java b/src/test/java/com/osiris/autoplug/client/browser/ServerStatusIconIntegrationTest.java new file mode 100644 index 00000000..8ce8580e --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/browser/ServerStatusIconIntegrationTest.java @@ -0,0 +1,61 @@ +package com.osiris.autoplug.client.browser; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Base64; +import java.util.concurrent.*; +import static org.junit.jupiter.api.Assertions.*; + +class ServerStatusIconIntegrationTest { + @TempDir Path directory; + + @Test void browserReadsEmbeddedIconFromTheSameStatusResponse() throws Exception { + BufferedImage image = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB); image.setRGB(1, 2, 0x336699); + ByteArrayOutputStream png = new ByteArrayOutputStream(); ImageIO.write(image, "png", png); + ServerStatus result = ping("data:image/png;base64," + Base64.getEncoder().encodeToString(png.toByteArray())); + assertTrue(result.online); assertNotNull(result.icon); assertEquals(0xFF336699, result.icon.getRGB(1, 2)); + assertEquals("Welcome", result.motd); assertEquals(3, result.players); + } + + @Test void invalidOptionalFaviconDoesNotHideAnOtherwiseOnlineServer() throws Exception { + ServerStatus result = ping("https://example.invalid/untrusted.png"); + assertTrue(result.online); assertNull(result.icon); assertEquals("1.21.1", result.version); + } + + private ServerStatus ping(String favicon) throws Exception { + ExecutorService executor = Executors.newSingleThreadExecutor(); + try (ServerSocket server = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) { + server.setSoTimeout(4000); + Future reply = executor.submit(() -> { + try (Socket client = server.accept()) { + client.setSoTimeout(4000); DataInputStream input = new DataInputStream(client.getInputStream()); + int handshake = readVarInt(input); assertTrue(handshake > 3 && handshake < 512); + byte[] data = new byte[handshake]; input.readFully(data); + assertEquals(1, input.readUnsignedByte()); assertEquals(0, input.readUnsignedByte()); + String json = "{\"description\":\"Welcome\",\"version\":{\"name\":\"1.21.1\",\"protocol\":767}," + + "\"players\":{\"online\":3,\"max\":20},\"favicon\":\"" + favicon + "\"}"; + byte[] body = json.getBytes(StandardCharsets.UTF_8); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream packet = new DataOutputStream(bytes); packet.writeByte(0); writeVarInt(packet, body.length); packet.write(body); + DataOutputStream output = new DataOutputStream(client.getOutputStream()); writeVarInt(output, bytes.size()); output.write(bytes.toByteArray()); output.flush(); + } catch (IOException e) { throw new UncheckedIOException(e); } + }); + String host = server.getInetAddress().getHostAddress(); + String address = (host.contains(":") ? "[" + host + "]" : host) + ":" + server.getLocalPort(); + ServerStatus result = new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")).ping(new SavedServer("Fixture", address)); + reply.get(5, TimeUnit.SECONDS); return result; + } finally { executor.shutdownNow(); } + } + private static int readVarInt(DataInputStream input) throws IOException { + int result = 0; for (int shift = 0; shift < 35; shift += 7) { int value = input.readUnsignedByte(); result |= (value & 127) << shift; if ((value & 128) == 0) return result; } + throw new IOException("Invalid varint"); + } + private static void writeVarInt(DataOutputStream output, int value) throws IOException { + do { int next = value & 127; value >>>= 7; output.writeByte(value == 0 ? next : next | 128); } while (value != 0); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/launcher/ParallelDownloadsTest.java b/src/test/java/com/osiris/autoplug/client/launcher/ParallelDownloadsTest.java new file mode 100644 index 00000000..7c30c973 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/launcher/ParallelDownloadsTest.java @@ -0,0 +1,358 @@ +package com.osiris.autoplug.client.launcher; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.osiris.autoplug.client.utils.UtilsCrypto; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static org.junit.jupiter.api.Assertions.*; + +class ParallelDownloadsTest { + @TempDir Path temporary; + + @Test void completePreparationCombinesFilesInBoundedQueueAndReusesVerifiedCache() throws Exception { + try (FixtureServer server = new FixtureServer()) { + JsonObject metadata = baseMetadata(); + JsonArray libraries = new JsonArray(); + List expectedClasspath = new ArrayList<>(); + for (int i = 0; i < 12; i++) { + String path = "test/library-" + i + ".jar"; + JsonObject artifact = server.descriptor("/library-" + i, bytes("library " + i), true); + artifact.addProperty("path", path); + JsonObject downloads = new JsonObject(); downloads.add("artifact", artifact); + JsonObject library = new JsonObject(); library.addProperty("name", "test:library:" + i); library.add("downloads", downloads); + libraries.add(library); + expectedClasspath.add(temporary.resolve("cache/libraries").resolve(path).toString()); + } + metadata.add("libraries", libraries); + JsonObject clientDownloads = new JsonObject(); clientDownloads.add("client", server.descriptor("/client", bytes("client"), true)); + metadata.add("downloads", clientDownloads); + JsonObject objects = new JsonObject(); + for (int i = 0; i < 4; i++) { + byte[] contents = bytes("asset " + i); + String hash = UtilsCrypto.calculateSHA1Hash(contents); + server.add("/objects/" + hash.substring(0, 2) + "/" + hash, contents, true); + JsonObject object = new JsonObject(); object.addProperty("hash", hash); object.addProperty("size", contents.length); + objects.add("sounds/" + i, object); + } + JsonObject index = new JsonObject(); index.add("objects", objects); + index.addProperty("virtual", true); index.addProperty("map_to_resources", true); + JsonObject assetIndex = server.descriptor("/index", bytes(index.toString()), false); assetIndex.addProperty("id", "fixture"); + metadata.add("assetIndex", assetIndex); + JsonObject loggingClient = new JsonObject(); + JsonObject loggingFile = server.descriptor("/logging", bytes("logging"), true); loggingFile.addProperty("id", "fixture.xml"); + loggingClient.add("file", loggingFile); loggingClient.addProperty("argument", "-Dlog4j.configurationFile=${path}"); + JsonObject logging = new JsonObject(); logging.add("client", loggingClient); metadata.add("logging", logging); + JsonObject version = server.descriptor("/version", bytes(metadata.toString()), false); version.addProperty("id", "fixture"); + JsonArray versions = new JsonArray(); versions.add(version); + JsonObject manifest = new JsonObject(); manifest.add("versions", versions); server.add("/manifest", bytes(manifest.toString()), false); + MinecraftLauncher launcher = launcher(server); + LaunchRequest request = new LaunchRequest(temporary.resolve("game"), "fixture", "VANILLA", null, MinecraftAccount.offline("Player"), null, 0); + List callbacks = new ArrayList<>(); + List events = new CopyOnWriteArrayList<>(); + PreparedLaunch prepared; + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + prepared = launcher.prepare(request, callbacks::add); + } + assertTrue(server.maximum.get() >= 2, "Downloads must overlap"); + assertTrue(server.maximum.get() <= ParallelDownloads.WORKERS, "Active requests must remain bounded"); + assertEquals(18, server.artifactRequests.get()); + assertBatch(callbacks, "Minecraft files", 18); + expectedClasspath.add(temporary.resolve("cache/versions/fixture/fixture.jar").toString()); + assertEquals(String.join(java.io.File.pathSeparator, expectedClasspath), prepared.arguments.get(prepared.arguments.indexOf("-cp") + 1)); + assertTrue(prepared.arguments.contains("--fullscreen")); + for (int i = 0; i < 4; i++) { + assertArrayEquals(bytes("asset " + i), Files.readAllBytes(temporary.resolve("game/resources/sounds/" + i))); + assertArrayEquals(bytes("asset " + i), Files.readAllBytes(temporary.resolve("cache/assets/virtual/fixture/sounds/" + i))); + } + assertTrue(events.stream().anyMatch(event -> event.sourceUrl != null && event.sourceUrl.contains("/objects/") && event.complete)); + assertEquals(0, events.get(events.size() - 1).activeTransfers); + server.stop(); + // All metadata/artifacts have been cached. A second preparation remains offline-capable. + assertEquals(prepared.command(), launcher.prepare(request, value -> { }).command()); + assertNoPartialFiles(); + } + } + + @Test void mavenAndNativeDownloadsPreserveClasspathAndOrderedExtraction() throws Exception { + try (FixtureServer server = new FixtureServer()) { + JsonObject metadata = baseMetadata(); + JsonArray libraries = new JsonArray(); + for (int i = 0; i < 2; i++) { + JsonObject library = new JsonObject(); library.addProperty("name", "fixture:native:" + i); + JsonObject nativeMap = new JsonObject(); nativeMap.addProperty(MinecraftLauncher.osName(), "native"); library.add("natives", nativeMap); + JsonObject nativeArtifact = server.descriptor("/native-" + i, nativeJar("native " + i), true); + nativeArtifact.addProperty("path", "native-" + i + ".jar"); + JsonObject classifiers = new JsonObject(); classifiers.add("native", nativeArtifact); + JsonObject downloads = new JsonObject(); downloads.add("classifiers", classifiers); library.add("downloads", downloads); + libraries.add(library); + } + for (int i = 0; i < 8; i++) { + JsonObject library = new JsonObject(); library.addProperty("name", "fixture:maven:" + i); + library.addProperty("url", server.base() + "/maven/"); + byte[] content = bytes("maven " + i); + library.addProperty("sha1", UtilsCrypto.calculateSHA1Hash(content)); library.addProperty("size", content.length); + server.add("/maven/fixture/maven/" + i + "/maven-" + i + ".jar", content, true); + libraries.add(library); + } + Path generated = temporary.resolve("cache/libraries/fixture/generated/1/generated-1.jar"); + Files.createDirectories(generated.getParent()); Files.write(generated, bytes("generated")); + JsonObject installed = new JsonObject(); installed.addProperty("name", "fixture:generated:1"); installed.addProperty("url", ""); libraries.add(installed); + metadata.add("libraries", libraries); + List classpath = launcher(server).libraries(metadata, temporary.resolve("natives"), value -> { }); + assertEquals(9, classpath.size()); + for (int i = 0; i < 8; i++) assertEquals("maven-" + i + ".jar", classpath.get(i).getFileName().toString()); + assertEquals(generated, classpath.get(8)); + assertArrayEquals(bytes("native 1"), Files.readAllBytes(temporary.resolve("natives/shared-native.bin"))); + assertFalse(Files.exists(temporary.resolve("natives/META-INF/ignored"))); + assertTrue(server.maximum.get() >= 2); + } + } + + @Test void transientHttpAndCorruptBodiesRetryWithoutReplacingExistingFileEarly() throws Exception { + try (FixtureServer server = new FixtureServer()) { + byte[] original = new byte[]{7, 7, 7}, wanted = new byte[]{1, 2, 3}; + Path target = temporary.resolve("artifact.jar"); Files.write(target, original); + AtomicInteger attempts = new AtomicInteger(); + AtomicBoolean originalPreserved = new AtomicBoolean(true); + server.server.createContext("/retry", exchange -> { + if (!Arrays.equals(original, Files.readAllBytes(target))) originalPreserved.set(false); + int attempt = attempts.incrementAndGet(); + respond(exchange, attempt == 1 ? 503 : 200, attempt == 2 ? new byte[]{9, 9, 9} : wanted); + }); + List callbacks = new ArrayList<>(); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + ParallelDownloads.run("Fixture files", Collections.singletonList(() -> { + LauncherFiles.download(server.base() + "/retry", target, UtilsCrypto.calculateSHA1Hash(wanted), wanted.length, callbacks::add); + return null; + }), callbacks::add); + } + assertEquals(3, attempts.get()); assertTrue(originalPreserved.get()); + assertArrayEquals(wanted, Files.readAllBytes(target)); + assertEquals(2, callbacks.stream().filter(value -> value.startsWith("Retrying ")).count()); + assertEquals(1, events.stream().filter(event -> event.complete).count()); + assertBatch(callbacks, "Fixture files", 1); + assertNoPartialFiles(); + } + } + + @Test void exhaustedRetriesPropagateFailureWithoutPublishingCompletion() throws Exception { + try (FixtureServer server = new FixtureServer()) { + AtomicInteger attempts = new AtomicInteger(); + server.server.createContext("/unavailable", exchange -> { + attempts.incrementAndGet(); respond(exchange, 503, bytes("unavailable")); + }); + Path target = temporary.resolve("existing.jar"); + byte[] original = bytes("previous file"); Files.write(target, original); + List callbacks = new ArrayList<>(); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + IOException failure = assertThrows(IOException.class, () -> ParallelDownloads.run("Fixture files", Collections.singletonList(() -> { + LauncherFiles.download(server.base() + "/unavailable", target, UtilsCrypto.calculateSHA1Hash(bytes("wanted")), 6, null); + return null; + }), callbacks::add)); + assertTrue(failure.getMessage().contains("HTTP 503")); + } + assertEquals(3, attempts.get()); + assertArrayEquals(original, Files.readAllBytes(target)); + assertEquals(Collections.singletonList("Fixture files: 0/1"), callbacks); + assertFalse(events.stream().anyMatch(event -> event.complete)); + assertEquals(0, events.get(events.size() - 1).activeTransfers); + assertNoPartialFiles(); + } + } + + @Test void permanentFailureCancelsBlockedSocketsAndDoesNotStartQueuedFiles() throws Exception { + try (FixtureServer server = new FixtureServer()) { + CountDownLatch blocked = new CountDownLatch(2), release = new CountDownLatch(1); + AtomicInteger requests = new AtomicInteger(); + server.server.createContext("/failure", exchange -> { + requests.incrementAndGet(); + await(blocked); + respond(exchange, 404, bytes("missing")); + }); + server.server.createContext("/blocked", exchange -> { + requests.incrementAndGet(); + exchange.sendResponseHeaders(200, 1024); + exchange.getResponseBody().write(1); exchange.getResponseBody().flush(); blocked.countDown(); + await(release); exchange.close(); + }); + List> jobs = new ArrayList<>(); + for (int i = 0; i < 40; i++) { + int index = i; + jobs.add(() -> { LauncherFiles.download(server.base() + (index == 0 ? "/failure" : "/blocked"), + temporary.resolve("file-" + index), null, 1024, null); return null; }); + } + List callbacks = new ArrayList<>(); + List events = new CopyOnWriteArrayList<>(); + try (AutoCloseable ignored = DownloadProgress.subscribe(events::add)) { + assertTimeoutPreemptively(Duration.ofSeconds(8), () -> { + IOException failure = assertThrows(IOException.class, () -> ParallelDownloads.run("Fixture files", jobs, callbacks::add)); + assertTrue(failure.getMessage().contains("HTTP 404")); + }); + } finally { release.countDown(); } + assertTrue(requests.get() <= ParallelDownloads.WORKERS); + assertFalse(callbacks.contains("Fixture files: 40/40")); + assertFalse(events.stream().anyMatch(event -> event.complete)); + assertEquals(0, events.get(events.size() - 1).activeTransfers); + assertNoPartialFiles(); + for (int i = 0; i < 40; i++) assertFalse(Files.exists(temporary.resolve("file-" + i))); + } + } + + @Test void callerInterruptionCancelsActiveRequestAndRetainsInterruptStatus() throws Exception { + try (FixtureServer server = new FixtureServer()) { + CountDownLatch started = new CountDownLatch(1), release = new CountDownLatch(1), stopped = new CountDownLatch(1); + server.server.createContext("/interrupt", exchange -> { + exchange.sendResponseHeaders(200, 1024); exchange.getResponseBody().write(1); exchange.getResponseBody().flush(); + started.countDown(); await(release); exchange.close(); + }); + AtomicReference failure = new AtomicReference<>(); + AtomicBoolean interrupted = new AtomicBoolean(); + Thread caller = new Thread(() -> { + try { + ParallelDownloads.run("Fixture files", Collections.singletonList(() -> { + LauncherFiles.download(server.base() + "/interrupt", temporary.resolve("interrupted"), null, 1024, null); return null; + }), value -> { }); + } catch (Throwable e) { failure.set(e); interrupted.set(Thread.currentThread().isInterrupted()); } + finally { stopped.countDown(); } + }); + caller.setDaemon(true); caller.start(); + try { + assertTrue(started.await(3, TimeUnit.SECONDS)); caller.interrupt(); + assertTrue(stopped.await(7, TimeUnit.SECONDS), "Cancellation must stop a blocked socket read"); + assertTrue(failure.get() instanceof InterruptedIOException); assertTrue(interrupted.get()); + assertFalse(Files.exists(temporary.resolve("interrupted"))); assertNoPartialFiles(); + } finally { release.countDown(); caller.interrupt(); } + } + } + + @Test void fullscreenDefaultsToEnabledForLegacyAndModernLoadersAndCanBeDisabled() throws Exception { + for (String version : Arrays.asList("1.16.5", "1.21.1")) { + JsonObject vanilla = MinecraftLauncherTest.fixture(version); + for (String loader : Arrays.asList("VANILLA", "FABRIC", "FORGE", "NEOFORGE", "QUILT")) { + LaunchRequest defaults = new LaunchRequest(temporary, version, loader, null, MinecraftAccount.offline("Player"), null, 0); + LaunchRequest windowed = new LaunchRequest(temporary, version, loader, null, MinecraftAccount.offline("Player"), null, 0, false); + assertTrue(defaults.fullscreen); + List args = arguments(vanilla, defaults); + assertEquals(1, Collections.frequency(args, "--fullscreen")); + assertTrue(args.indexOf("--fullscreen") > args.indexOf(vanilla.get("mainClass").getAsString())); + assertFalse(arguments(vanilla, windowed).contains("--fullscreen")); + } + } + assertFalse(new LaunchRequest(temporary, "1.21.1", "VANILLA", null, MinecraftAccount.offline("Player"), null, 0, "World", false).fullscreen); + } + + private List arguments(JsonObject metadata, LaunchRequest request) throws Exception { + return MinecraftLauncher.buildArguments(metadata, request, Collections.singletonList(temporary.resolve("client.jar")), + temporary.resolve("natives"), temporary.resolve("assets"), "fixture", null); + } + private MinecraftLauncher launcher(FixtureServer server) { + JavaRuntimeManager runtime = new JavaRuntimeManager(temporary.resolve("runtimes")) { + @Override public Path resolve(int major, java.util.function.Consumer progress) { + return Paths.get(System.getProperty("java.home"), "bin", JavaRuntimeManager.executableName()); + } + }; + return new MinecraftLauncher(temporary.resolve("cache"), runtime, server.base() + "/manifest", server.base() + "/objects/"); + } + private static JsonObject baseMetadata() { + JsonObject metadata = new JsonObject(); metadata.addProperty("id", "fixture"); + metadata.addProperty("mainClass", "net.minecraft.client.main.Main"); metadata.addProperty("minecraftArguments", "--username ${auth_player_name}"); + return metadata; + } + private static void assertBatch(List callbacks, String label, int total) { + List actual = new ArrayList<>(); + for (String callback : callbacks) if (callback.startsWith(label + ": ")) actual.add(callback); + assertEquals(total + 1, actual.size()); + for (int i = 0; i <= total; i++) assertEquals(label + ": " + i + "/" + total, actual.get(i)); + } + private void assertNoPartialFiles() throws IOException { + try (java.util.stream.Stream files = Files.walk(temporary)) { + assertFalse(files.anyMatch(path -> path.getFileName().toString().endsWith(".part"))); + } + } + private static byte[] bytes(String value) { return value.getBytes(StandardCharsets.UTF_8); } + private static byte[] nativeJar(String value) throws IOException { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + try (ZipOutputStream zip = new ZipOutputStream(bytes)) { + zip.putNextEntry(new ZipEntry("shared-native.bin")); zip.write(bytes(value)); zip.closeEntry(); + zip.putNextEntry(new ZipEntry("META-INF/ignored")); zip.write(1); zip.closeEntry(); + } + return bytes.toByteArray(); + } + private static void await(CountDownLatch latch) { + try { latch.await(5, TimeUnit.SECONDS); } + catch (InterruptedException e) { Thread.currentThread().interrupt(); } + } + private static void respond(HttpExchange exchange, int status, byte[] contents) throws IOException { + exchange.sendResponseHeaders(status, contents.length); + try (java.io.OutputStream out = exchange.getResponseBody()) { out.write(contents); } + finally { exchange.close(); } + } + private static final class FixtureServer implements AutoCloseable { + final HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); + final ExecutorService workers = Executors.newCachedThreadPool(); + final AtomicInteger active = new AtomicInteger(), maximum = new AtomicInteger(), artifactRequests = new AtomicInteger(); + final Map bodies = new ConcurrentHashMap<>(); + final java.util.Set delayed = ConcurrentHashMap.newKeySet(); + private boolean stopped; + FixtureServer() throws IOException { + server.setExecutor(workers); + server.createContext("/", exchange -> { + String path = exchange.getRequestURI().getPath(); + byte[] content = bodies.get(path); + if (content == null) { respond(exchange, 404, bytes("missing")); return; } + if (delayed.contains(path)) { + artifactRequests.incrementAndGet(); + maximum.accumulateAndGet(active.incrementAndGet(), Math::max); + try { Thread.sleep(80); } + catch (InterruptedException e) { Thread.currentThread().interrupt(); } + finally { active.decrementAndGet(); } + } + respond(exchange, 200, content); + }); + server.start(); + } + String base() { return "http://127.0.0.1:" + server.getAddress().getPort(); } + void add(String path, byte[] body, boolean delay) { bodies.put(path, body); if (delay) delayed.add(path); } + JsonObject descriptor(String path, byte[] body, boolean delay) { + add(path, body, delay); + JsonObject descriptor = new JsonObject(); descriptor.addProperty("url", base() + path); + descriptor.addProperty("sha1", UtilsCrypto.calculateSHA1Hash(body)); descriptor.addProperty("size", body.length); + return descriptor; + } + void stop() { if (!stopped) { server.stop(0); stopped = true; } } + @Override public void close() { stop(); workers.shutdownNow(); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/FabricDefaultProfileTest.java b/src/test/java/com/osiris/autoplug/client/profiles/FabricDefaultProfileTest.java new file mode 100644 index 00000000..87152e26 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/FabricDefaultProfileTest.java @@ -0,0 +1,177 @@ +package com.osiris.autoplug.client.profiles; + +import com.google.gson.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.security.MessageDigest; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.zip.*; +import static org.junit.jupiter.api.Assertions.*; + +class FabricDefaultProfileTest { + @TempDir Path temporary; + + @Test void bootstrapIsVersionSpecificAndPreservesRenamedCustomizedDefault() throws Exception { + ProfileStore store = store(); Profile first = store.ensureFabricDefault("1.21.1"); + first.name = "My utilities"; store.save(first); + Files.write(first.getDirectory().resolve("options.txt"), "fullscreen:true".getBytes(StandardCharsets.UTF_8)); + assertEquals(first.id, store.ensureFabricDefault("1.21.1").id); + Profile other = store.ensureFabricDefault("1.20.1"); assertNotEquals(first.id, other.id); + assertEquals(2, store.list().size()); assertEquals("My utilities", store.get(first.id).name); + assertEquals("fullscreen:true", new String(Files.readAllBytes(first.getDirectory().resolve("options.txt")), StandardCharsets.UTF_8)); + assertEquals("FABRIC", other.loader); assertEquals(ProfileType.MODS, other.type); + assertFalse(first.builtinPresetInstalled); + } + + @Test void exactClientPackIncludesOnlyRequiredDependenciesAndInstallsOnce() throws Exception { + ProfileStore store = store(); Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + fixture.add("placeholder", "optional", "optional", "*"); + fixture.dependency("modmenu", "placeholder", "placeholder-release", "required"); + fixture.dependency("entityculling", "fabric-api", null, "required"); + fixture.dependency("placeholder", "fabric-api", null, "required"); + fixture.dependency("fabric-api", "placeholder", null, "required"); // Real cycle shape; each project must be visited once. + fixture.dependency("modmenu", "unwanted-optional", null, "optional"); + fixture.dependency("modmenu", "unwanted-embedded", null, "embedded"); + prepare(store, profile, fixture); + assertEquals(6, fixture.downloads.size()); assertEquals(6, new HashSet<>(fixture.downloads).size()); + Profile installed = store.get(profile.id); assertTrue(installed.builtinPresetInstalled); + ProfileCollection collection = new ProfileCollection().scan(installed); + assertEquals(6, collection.entries.size()); + assertTrue(collection.entries.stream().anyMatch(e -> "placeholder".equals(e.modrinthId))); + assertTrue(collection.entries.stream().allMatch(e -> e.modrinthId != null && e.version != null)); + Files.delete(installed.getDirectory().resolve("mods/sodium.jar")); // Deliberate user customization must not be re-seeded. + int metadataLookups = fixture.requestedGames.size(); + prepare(store, installed, fixture); + assertEquals(6, fixture.downloads.size()); assertFalse(Files.exists(installed.getDirectory().resolve("mods/sodium.jar"))); + assertEquals(metadataLookups, fixture.requestedGames.size(), "Installed presets must launch offline without provider lookups"); + assertTrue(fixture.requestedGames.stream().allMatch("1.21.1"::equals)); + } + + @Test void noExactStableReleaseOrPinnedWrongGameCannotProducePartialPack() throws Exception { + for (boolean pinned : new boolean[]{false, true}) { + ProfileStore store = new ProfileStore(temporary.resolve("profiles-" + pinned)); + Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + if (pinned) { + fixture.add("library", "optional", "optional", "*"); + fixture.releases.get("library").add("game_versions", array("1.20.1")); + fixture.dependency("modmenu", "library", "library-release", "required"); + } else { + fixture.releases.get("sodium").add("game_versions", array("1.21.2")); + } + IOException error = assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertTrue(error.getMessage().contains("exact Minecraft 1.21.1")); + assertTrue(fixture.downloads.isEmpty()); assertEmptyMods(profile); assertFalse(store.get(profile.id).builtinPresetInstalled); + } + } + + @Test void serverRequiredDependencyAndServerOnlyJarAreRejected() throws Exception { + for (boolean inMetadata : new boolean[]{true, false}) { + ProfileStore store = new ProfileStore(temporary.resolve("profiles-" + inMetadata)); + Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + fixture.add("library", "optional", inMetadata ? "required" : "optional", inMetadata ? "*" : "server"); + fixture.dependency("modmenu", "library", null, "required"); + assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertEmptyMods(profile); assertFalse(store.get(profile.id).builtinPresetInstalled); + if (inMetadata) assertTrue(fixture.downloads.isEmpty()); + } + } + + @Test void interruptedDownloadAndFailedCommitLeaveNoInstalledSubsetAndCanRetry() throws Exception { + AtomicBoolean failCommit = new AtomicBoolean(); + ProfileStore store = new ProfileStore(temporary.resolve("profiles")) { + @Override public void save(Profile profile) throws IOException { if (failCommit.get()) throw new IOException("fixture metadata failure"); super.save(profile); } + }; + Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + fixture.failAfter = 2; + assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertEmptyMods(profile); assertFalse(store.get(profile.id).builtinPresetInstalled); + fixture.failAfter = -1; failCommit.set(true); + assertThrows(IOException.class, () -> prepare(store, store.get(profile.id), fixture)); + assertEmptyMods(profile); assertFalse(store.get(profile.id).builtinPresetInstalled); + assertFalse(Files.exists(profile.getDirectory().resolve("collection.json"))); + failCommit.set(false); prepare(store, store.get(profile.id), fixture); + assertTrue(store.get(profile.id).builtinPresetInstalled); + assertEquals(5, new ProfileCollection().scan(store.get(profile.id)).entries.size()); + } + + @Test void providerConflictAndExistingUserCollectionArePreserved() throws Exception { + ProfileStore store = store(); Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + fixture.dependency("sodium", "entityculling", null, "incompatible"); + assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertTrue(fixture.downloads.isEmpty()); assertEmptyMods(profile); + fixture.releases.get("sodium").add("dependencies", new JsonArray()); + Path custom = profile.getDirectory().resolve("mods/custom.jar"); byte[] bytes = fixture.jars.get("sodium"); Files.write(custom, bytes); + assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertArrayEquals(bytes, Files.readAllBytes(custom)); assertFalse(store.get(profile.id).builtinPresetInstalled); + } + + @Test void malformedJarStillAppearsInCollectionBeforeApplicationLoggerStarts() throws Exception { + ProfileStore store = store(); Profile profile = store.ensureFabricDefault("1.21.1"); + Files.write(profile.getDirectory().resolve("mods/broken.jar"), "not a zip".getBytes(StandardCharsets.UTF_8)); + ProfileCollection collection = new ProfileCollection().scan(profile); + assertEquals(1, collection.entries.size()); assertEquals("broken.jar", collection.entries.get(0).file); + } + + @Test void emptyProviderReleaseListAndCorruptedDownloadNeverActivateSubset() throws Exception { + for (boolean emptyProvider : new boolean[]{true, false}) { + ProfileStore store = new ProfileStore(temporary.resolve("profiles-" + emptyProvider)); + Profile profile = store.ensureFabricDefault("1.21.1"); Fixture fixture = new Fixture(); + if (emptyProvider) fixture.emptyVersionsFor = "sodium"; + else fixture.jars.put("sodium", new byte[]{1, 2, 3}); + IOException failure = assertThrows(IOException.class, () -> prepare(store, profile, fixture)); + assertTrue(failure.getMessage().contains("Nothing will launch")); + assertFalse(store.get(profile.id).builtinPresetInstalled); assertEmptyMods(profile); + if (emptyProvider) assertTrue(fixture.downloads.isEmpty()); + } + } + + private ProfileStore store() throws Exception { return new ProfileStore(temporary.resolve("profiles")); } + private static void assertEmptyMods(Profile profile) throws Exception { + try (java.util.stream.Stream files = Files.list(profile.getDirectory().resolve("mods"))) { assertEquals(0, files.count()); } + } + private static void prepare(ProfileStore store, Profile profile, Fixture fixture) throws Exception { + try (ProfileLease ignored = new ProfileLease(profile.getDirectory())) { + new FabricDefaultProfile(store, fixture, (release, path) -> { + if (fixture.failAfter >= 0 && fixture.downloads.size() >= fixture.failAfter) throw new IOException("fixture connection lost"); + fixture.downloads.add(release.modrinthProjectId); Files.write(path, fixture.jars.get(release.modrinthProjectId)); + }).prepare(profile, ignoredMessage -> { }); + } + } + private static JsonArray array(String... values) { JsonArray array = new JsonArray(); for (String value : values) array.add(value); return array; } + private static class Fixture implements FabricDefaultProfile.Catalog { + final Map projects = new LinkedHashMap<>(), releases = new LinkedHashMap<>(); + final Map jars = new HashMap<>(); + final List downloads = new ArrayList<>(), requestedGames = new ArrayList<>(); + int failAfter = -1; + String emptyVersionsFor; + Fixture() throws Exception { for (String root : FabricDefaultProfile.ROOTS) add(root, root.equals("fabric-api") ? "optional" : "required", root.equals("fabric-api") ? "optional" : "unsupported", root.equals("fabric-api") ? "*" : "client"); } + void add(String id, String client, String server, String environment) throws Exception { + JsonObject project = new JsonObject(); project.addProperty("id", id); project.addProperty("title", id); project.addProperty("project_type", "mod"); + project.addProperty("client_side", client); project.addProperty("server_side", server); projects.put(id, project); + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + try (ZipOutputStream jar = new ZipOutputStream(bytes)) { + jar.putNextEntry(new ZipEntry("fabric.mod.json")); + jar.write(("{\"schemaVersion\":1,\"id\":\"" + id.replace('-', '_') + "\",\"version\":\"1.0\",\"name\":\"" + id + "\",\"environment\":\"" + environment + "\"}").getBytes(StandardCharsets.UTF_8)); jar.closeEntry(); + } + byte[] content = bytes.toByteArray(); jars.put(id, content); + JsonObject version = new JsonObject(); version.addProperty("id", id + "-release"); version.addProperty("project_id", id); + version.addProperty("version_number", "1.0+1.21.1"); version.addProperty("version_type", "release"); version.addProperty("status", "listed"); + version.addProperty("date_published", "2026-10-01T00:00:00Z"); version.add("game_versions", array("1.21.1")); version.add("loaders", array("fabric")); version.add("dependencies", new JsonArray()); + JsonObject file = new JsonObject(); file.addProperty("filename", id + ".jar"); file.addProperty("url", "https://cdn.modrinth.com/data/" + id + "/mod.jar"); file.addProperty("primary", true); file.addProperty("size", content.length); + StringBuilder hash = new StringBuilder(); for (byte b : MessageDigest.getInstance("SHA-512").digest(content)) hash.append(String.format("%02x", b & 255)); + JsonObject hashes = new JsonObject(); hashes.addProperty("sha512", hash.toString()); file.add("hashes", hashes); + JsonArray files = new JsonArray(); files.add(file); version.add("files", files); releases.put(id, version); + } + void dependency(String from, String project, String version, String type) { + JsonObject dependency = new JsonObject(); dependency.addProperty("project_id", project); dependency.addProperty("version_id", version); dependency.addProperty("dependency_type", type); + releases.get(from).getAsJsonArray("dependencies").add(dependency); + } + public JsonObject project(String id) throws Exception { if (!projects.containsKey(id)) throw new IOException("Unexpected dependency " + id); return projects.get(id); } + public JsonArray versions(String id, String gameVersion) { requestedGames.add(gameVersion); JsonArray result = new JsonArray(); if (!id.equals(emptyVersionsFor)) result.add(releases.get(id)); return result; } + public JsonObject version(String id) throws Exception { for (JsonObject version : releases.values()) if (id.equals(version.get("id").getAsString())) return version; throw new IOException("Unknown version " + id); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java index ff218c94..b06bbbc5 100644 --- a/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherCommandsTest.java @@ -36,7 +36,7 @@ class LauncherCommandsTest { assertTrue(services.getProfiles().get(id).template); LauncherCommands commands = new LauncherCommands(services, output::add); commands.execute(commands.tokenize(".profiles clone " + id + " 1.20.1 --name Downgrade --yes")); - assertEquals(4, services.profiles().size()); // Two version-matched defaults plus the user's source and clone. + assertEquals(5, services.profiles().size()); // Three version-matched defaults plus the user's source and clone. assertTrue(services.profiles().stream().anyMatch(p -> p.name.equals("Downgrade") && p.launchable)); } } diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java index 66270dca..f19af2ae 100644 --- a/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherDefaultsTest.java @@ -14,11 +14,14 @@ class LauncherDefaultsTest { @Test void firstRunHasMatchingClientAndServerWithoutAcceptingEula() throws Exception { Path root = temporary.resolve("autoplug"); try (LauncherServices service = new LauncherServices(root, temporary.resolve("minecraft"), null)) { - assertEquals(2, service.profiles().size()); + assertEquals(3, service.profiles().size()); Profile client = service.getProfiles().get(service.settings().defaultProfile); assertEquals("Default (VANILLA)", client.name); assertEquals("VANILLA", client.loader); assertEquals(ProfileType.MODS, client.type); assertEquals("1.21.1", client.gameVersion); assertFalse(client.template); + Profile fabric = service.getProfiles().list().stream().filter(p -> "FABRIC".equals(p.loader)).findFirst().orElseThrow(() -> new AssertionError("Missing Fabric default")); + assertEquals("Default (FABRIC)", fabric.name); assertEquals(client.gameVersion, fabric.gameVersion); + assertEquals(FabricDefaultProfile.PRESET, fabric.builtinPreset); assertFalse(fabric.builtinPresetInstalled); assertTrue(Files.isDirectory(client.getDirectory().resolve("mods"))); LauncherActions.WorldInfo world = service.createWorld("First world", "", ""); Profile server = service.getProfiles().get(world.serverProfileId); @@ -38,16 +41,16 @@ class LauncherDefaultsTest { assertNotEquals(original, requested); assertEquals(requested, service.ensureDefaultProfiles("1.20.1").id); assertEquals(original, service.settings().defaultProfile, "Choosing a server version must not overwrite the selected user default"); - assertEquals(4, service.profiles().size()); + assertEquals(6, service.profiles().size()); LauncherActions.WorldInfo world = service.createWorld("Other version", null, requested); assertEquals("1.20.1", service.getProfiles().get(world.serverProfileId).gameVersion); assertThrows(java.io.IOException.class, () -> service.ensureDefaultProfiles("../escape")); - assertEquals(4, service.profiles().size()); + assertEquals(6, service.profiles().size()); } try (LauncherServices reopened = new LauncherServices(root, temporary.resolve("minecraft"), null)) { assertEquals(original, reopened.settings().defaultProfile); assertEquals(requested, reopened.ensureDefaultProfiles("1.20.1").id); - assertEquals(4, reopened.profiles().size()); + assertEquals(6, reopened.profiles().size()); } } @@ -66,7 +69,7 @@ class LauncherDefaultsTest { assertArrayEquals(metadata, Files.readAllBytes(profile.getDirectory().resolve("profile.json"))); assertEquals(Collections.singletonList("keep-me"), Files.readAllLines(profile.getDirectory().resolve("options.txt"))); assertEquals("1.19.4", service.ensureDefaultProfiles("").gameVersion); - assertEquals(5, service.profiles().size()); + assertEquals(7, service.profiles().size()); } } @@ -98,7 +101,7 @@ class LauncherDefaultsTest { assertNotEquals(unavailable, selected.id); assertFalse(selected.template); assertFalse(selected.migrationPending); assertEquals("VANILLA", selected.loader); assertEquals("1.20.4", selected.gameVersion); assertEquals(selected.id, service.ensureDefaultProfiles("").id); - assertEquals(5, service.profiles().size()); + assertEquals(7, service.profiles().size()); assertArrayEquals(metadata, Files.readAllBytes(service.getProfiles().get(unavailable).getDirectory().resolve("profile.json"))); } } diff --git a/src/test/java/com/osiris/autoplug/client/profiles/LauncherPreferencesTest.java b/src/test/java/com/osiris/autoplug/client/profiles/LauncherPreferencesTest.java new file mode 100644 index 00000000..4073b560 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/LauncherPreferencesTest.java @@ -0,0 +1,129 @@ +package com.osiris.autoplug.client.profiles; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.osiris.autoplug.client.ui.LauncherActions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.*; + +/** Real persisted settings/profile state, with no game, authentication or provider network access. */ +class LauncherPreferencesTest { + @TempDir Path temporary; + + @Test void lastChoicesAreTargetSpecificPersistAcrossRestartAndDoNotChangeGlobalDefault() throws Exception { + String vanilla, fabric, selectedDefault; + try (LauncherServices services = open()) { + selectedDefault = services.settings().defaultProfile; + vanilla = services.createProfile("Personal vanilla", "1.21.1", "VANILLA", "MODS", false).id; + fabric = services.getProfiles().ensureFabricDefault("1.21.1").id; + services.rememberProfile("server:play.example.test:25565", vanilla); + services.rememberProfile("world:local-world-1", vanilla); + services.rememberProfile("server:play.example.test:25565", fabric); + services.rememberProfile("server:play.example.test:25566", vanilla); + assertEquals(fabric, services.preferredProfile("server:play.example.test:25565")); + assertEquals(vanilla, services.preferredProfile("world:local-world-1")); + assertEquals(vanilla, services.preferredProfile("server:play.example.test:25566")); + assertEquals("", services.preferredProfile("world:unvisited")); + assertEquals(selectedDefault, services.settings().defaultProfile); + } + try (LauncherServices reopened = open()) { + assertEquals(fabric, reopened.preferredProfile("server:play.example.test:25565")); + assertEquals(vanilla, reopened.preferredProfile("world:local-world-1")); + assertEquals(vanilla, reopened.preferredProfile("server:play.example.test:25566")); + assertEquals(selectedDefault, reopened.settings().defaultProfile); + } + } + + @Test void deletedTemplatesAndMigratingChoicesAreNotOfferedForAutomaticLaunch() throws Exception { + String deleted, template, migrating; + try (LauncherServices services = open()) { + deleted = services.createProfile("Delete this", "1.21.1", "VANILLA", "MODS", false).id; + template = services.createProfile("Make template", "1.21.1", "VANILLA", "MODS", false).id; + migrating = services.createProfile("Migrate later", "1.21.1", "FABRIC", "MODS", false).id; + services.rememberProfile("server:deleted", deleted); + services.rememberProfile("world:template", template); + services.rememberProfile("world:migrating", migrating); + services.deleteProfile(deleted); + services.setTemplate(template, true); + Profile changing = services.getProfiles().get(migrating); + changing.migrationPending = true; services.getProfiles().save(changing); + assertEquals("", services.preferredProfile("server:deleted")); + assertEquals("", services.preferredProfile("world:template")); + assertEquals("", services.preferredProfile("world:migrating")); + } + try (LauncherServices reopened = open()) { + assertEquals("", reopened.preferredProfile("server:deleted")); + assertEquals("", reopened.preferredProfile("world:template")); + assertEquals("", reopened.preferredProfile("world:migrating")); + assertTrue(reopened.getProfiles().get(template).template); + assertTrue(reopened.getProfiles().get(migrating).migrationPending); + } + } + + @Test void invalidChoicesCannotReplacePreviouslySavedPlayableChoice() throws Exception { + try (LauncherServices services = open()) { + String playable = services.settings().defaultProfile; + String server = services.getProfiles().ensureDefault("1.21.1", ProfileType.MODS_SERVER).id; + String template = services.createProfile("Template", "1.21.1", "FABRIC", "MODS", true).id; + services.rememberProfile("server:example", playable); + byte[] before = Files.readAllBytes(temporary.resolve("autoplug/settings.json")); + assertThrows(IOException.class, () -> services.rememberProfile("server:example", server)); + assertThrows(IOException.class, () -> services.rememberProfile("server:example", template)); + assertThrows(IOException.class, () -> services.rememberProfile("server:example", "deleted-profile")); + assertThrows(IOException.class, () -> services.rememberProfile("invalid-target", playable)); + assertThrows(IOException.class, () -> services.rememberProfile(null, playable)); + assertEquals(playable, services.preferredProfile("server:example")); + assertArrayEquals(before, Files.readAllBytes(temporary.resolve("autoplug/settings.json"))); + } + } + + @Test void fullscreenDefaultsOnAndExplicitWindowedChoiceSurvivesRestarts() throws Exception { + try (LauncherServices services = open()) { + assertTrue(services.settings().fullscreen); + LauncherActions.SettingsInfo settings = services.settings(); + settings.fullscreen = false; settings.port = 25570; + services.saveSettings(settings); + assertFalse(services.settings().fullscreen); + LauncherActions.SettingsInfo detached = services.settings(); + detached.fullscreen = true; detached.javaPaths.put(16, "not-saved"); + assertFalse(services.settings().fullscreen); + assertFalse(services.settings().javaPaths.containsKey(16)); + } + try (LauncherServices reopened = open()) { + assertFalse(reopened.settings().fullscreen); + assertEquals(25570, reopened.settings().port); + LauncherActions.SettingsInfo settings = reopened.settings(); settings.fullscreen = true; reopened.saveSettings(settings); + } + try (LauncherServices reopened = open()) { assertTrue(reopened.settings().fullscreen); } + } + + @Test void olderSettingsWithoutNewFieldsMigrateToFullscreenAndEmptyRememberedChoices() throws Exception { + String selected; + try (LauncherServices services = open()) { + selected = services.settings().defaultProfile; + services.rememberProfile("world:old-choice", selected); + } + Path settings = temporary.resolve("autoplug/settings.json"); + JsonObject old = JsonParser.parseString(new String(Files.readAllBytes(settings), StandardCharsets.UTF_8)).getAsJsonObject(); + old.remove("launchChoices"); old.getAsJsonObject("settings").remove("fullscreen"); + Files.write(settings, old.toString().getBytes(StandardCharsets.UTF_8)); + try (LauncherServices reopened = open()) { + assertTrue(reopened.settings().fullscreen); + assertEquals(selected, reopened.settings().defaultProfile); + assertEquals("", reopened.preferredProfile("world:old-choice")); + reopened.rememberProfile("world:new-choice", selected); + } + try (LauncherServices reopened = open()) { assertEquals(selected, reopened.preferredProfile("world:new-choice")); } + } + + private LauncherServices open() throws Exception { + return new LauncherServices(temporary.resolve("autoplug"), temporary.resolve("minecraft"), null); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/profiles/WorldActivityOrderingTest.java b/src/test/java/com/osiris/autoplug/client/profiles/WorldActivityOrderingTest.java new file mode 100644 index 00000000..8e01dd2a --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/profiles/WorldActivityOrderingTest.java @@ -0,0 +1,42 @@ +package com.osiris.autoplug.client.profiles; + +import com.osiris.autoplug.client.ui.LauncherActions.WorldInfo; +import com.osiris.autoplug.client.worlds.WorldStore; +import com.osiris.autoplug.client.worlds.VirtualWorld; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.*; +import java.nio.file.attribute.FileTime; +import java.util.Collections; +import static org.junit.jupiter.api.Assertions.*; + +class WorldActivityOrderingTest { + @TempDir Path directory; + + @Test void newlyCreatedOrRecentlyUpdatedManagedWorldAppearsFirst() throws Exception { + Path root = directory.resolve("autoplug"); + try (LauncherServices services = new LauncherServices(root, directory.resolve("minecraft"), null)) { + WorldInfo first = services.createWorld("First", "", ""); + WorldInfo second = services.createWorld("Second", "", ""); + WorldStore store = new WorldStore(root.resolve("worlds")); + long future = System.currentTimeMillis() + 120_000; + VirtualWorld fresh = store.get(second.id); fresh.createdAt = future; store.save(fresh); + assertEquals(second.id, services.worlds().get(0).id); + Files.setLastModifiedTime(Paths.get(first.directory), FileTime.fromMillis(future + 10_000)); + assertEquals(first.id, services.worlds().get(0).id, "A newer update takes priority over creation time"); + assertFalse(store.get(first.id).eulaAccepted); assertFalse(store.get(second.id).eulaAccepted); + } + } + + @Test void localSaveLastPlayedAndLevelDataModificationAreBothConsidered() throws Exception { + Path save = Files.createDirectories(directory.resolve("save")); + long future = System.currentTimeMillis() + 120_000; + WorldInfo world = new WorldInfo("local:save", "Save", "", "", save.toString(), "", false, true, "1.21.1", + false, future, 0, true, Collections.emptyList(), false, false, true); + assertEquals(future, LauncherServices.worldActivity(world, 0)); + Path level = Files.write(save.resolve("level.dat"), new byte[]{0}); + Files.setLastModifiedTime(level, FileTime.fromMillis(future + 20_000)); + assertEquals(future + 20_000, LauncherServices.worldActivity(world, future - 10_000)); + assertArrayEquals(new byte[]{0}, Files.readAllBytes(level), "Ordering only reads metadata"); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java index 8b984702..3089f68d 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java @@ -56,7 +56,7 @@ class DashboardDisplayableTest { assertFalse(window.isVisible()); assertFalse(window.isShowing()); }); - awaitUi(() -> !required(dashboard.get(), "activity-progress").isVisible() + awaitUi(() -> ((JProgressBar) required(dashboard.get(), "activity-progress")).getValue() == 100 && findNamed(dashboard.get(), "world-local:fixture-7") != null, events); for (int width : new int[]{1200, 950, 1200, 950}) { @@ -109,7 +109,7 @@ class DashboardDisplayableTest { textFields(required(dashboard.get(), "advanced-runtime-fields")).get(0).getText())); onEdt(() -> button(dashboard.get(), "Worlds").doClick()); - awaitUi(() -> !required(dashboard.get(), "activity-progress").isVisible(), events); + awaitUi(() -> ((JProgressBar) required(dashboard.get(), "activity-progress")).getValue() == 100, events); settle(frame.get(), events); onEdt(() -> verifyWorlds(dashboard.get(), frame.get())); events.assertClean(); diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index d8585c19..31461663 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -29,6 +29,42 @@ class DashboardPanelTest { @TempDir Path directory; + @Test void firstLaunchUtilitySummaryAndActionsFitCompactProfilesPage() throws Exception { + String summary = "Client utility mods install on first launch: Fabric API, Sodium, Entity Culling, ImmediatelyFast and Mod Menu, with required libraries. Exact-version availability is checked before launch."; + ProfileInfo profile = new ProfileInfo("fabric", "Default (FABRIC)", "1.21.1", "FABRIC", "MODS", directory.toString(), false, summary, true); + LauncherActions actions = new LauncherActions() { @Override public List profiles() { return Collections.singletonList(profile); } }; + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> { FlatLightLaf.setup(); panel.set(new DashboardPanel(actions, + new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false)); }); + try { + awaitUi(() -> ((JProgressBar)findNamed(panel.get(), "activity-progress")).getValue() == 100); + SwingUtilities.invokeAndWait(() -> { + findButton(panel.get(), "Profiles").doClick(0); + ((JTable)findNamed(panel.get(), "profile-table")).setRowSelectionInterval(0, 0); + }); + awaitUi(() -> ((JTextArea)findNamed(panel.get(), "profile-details")).getText().contains("No mods added yet.")); + SwingUtilities.invokeAndWait(() -> { + panel.get().setSize(950, 620); for (int i = 0; i < 8; i++) layout(panel.get()); + JTextArea details = (JTextArea)findNamed(panel.get(), "profile-details"); + assertEquals(0, details.getCaretPosition(), "The background empty-collection note must not hide the beginning"); + assertTrue(details.getText().contains(summary)); assertTrue(details.getText().contains("Ready to launch")); + JViewport viewport = (JViewport)SwingUtilities.getAncestorOfClass(JViewport.class, details); + try { + Rectangle first = details.modelToView(0), last = details.modelToView(details.getDocument().getLength()); + assertTrue(viewport.getViewRect().contains(first), "Directory and readiness remain visible"); + assertTrue(viewport.getViewRect().contains(last), "The complete first-launch summary and empty-collection note fit"); + } catch (javax.swing.text.BadLocationException e) { throw new AssertionError(e); } + assertTrue(findNamed(panel.get(), "profile-table").getHeight() >= 100, "Profile list remains useful"); + for (String label : new String[]{"Launch client", "Add JAR", "Modrinth", "CurseForge", "AutoPlug mods"}) { + AbstractButton action = findButton(panel.get(), label); + Rectangle bounds = SwingUtilities.convertRectangle(action.getParent(), action.getBounds(), panel.get()); + assertTrue(bounds.x >= 0 && bounds.y >= 0 && bounds.width > 0 && bounds.height > 0 + && bounds.x + bounds.width <= 950 && bounds.y + bounds.height <= 620, label + " stays visible"); + } + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + @Test void progressKeepsLiveStepThroughOtherRefreshAndReleasesSubscriptions() throws Exception { AtomicReference> listener = new AtomicReference<>(); AtomicReference> measured = new AtomicReference<>(); @@ -43,27 +79,33 @@ class DashboardPanelTest { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> panel.get().importArtifact(new ProfileInfo("test", "Test", "1.21.1", "VANILLA", "MODS", "", false), "example.jar", "")); assertTrue(started.await(4, TimeUnit.SECONDS)); listener.get().accept("Resolving libraries https://example.invalid/library.jar"); awaitUi(() -> containsText(panel.get(), "Resolving libraries")); SwingUtilities.invokeAndWait(() -> { - assertTrue(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate()); + assertFalse(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate()); + assertTrue(((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() < 100); assertEquals("https://example.invalid/library.jar", ((JTextField) findNamed(panel.get(), "download-source")).getText()); findButton(panel.get(), "Reload").doClick(); }); awaitUi(() -> containsText(panel.get(), "Account 2")); SwingUtilities.invokeAndWait(() -> assertTrue(containsText(panel.get(), "Resolving libraries"))); measured.get().accept(37); - awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 37); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getToolTipText().contains("Current step: 37%")); + AtomicInteger beforeRefresh = new AtomicInteger(); SwingUtilities.invokeAndWait(() -> { assertFalse(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate()); + beforeRefresh.set(((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue()); findButton(panel.get(), "Reload").doClick(); }); awaitUi(() -> containsText(panel.get(), "Account 3")); - SwingUtilities.invokeAndWait(() -> assertFalse(((JProgressBar) findNamed(panel.get(), "activity-progress")).isIndeterminate())); - release.countDown(); awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + JProgressBar bar = (JProgressBar) findNamed(panel.get(), "activity-progress"); + assertFalse(bar.isIndeterminate()); assertTrue(bar.getValue() >= beforeRefresh.get()); assertTrue(bar.getValue() < 100); + }); + release.countDown(); awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); Consumer stale = listener.get(); SwingUtilities.invokeAndWait(() -> panel.get().close()); assertNull(listener.get()); assertNull(measured.get()); stale.accept("Should not appear"); @@ -75,7 +117,7 @@ class DashboardPanelTest { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}) { findButton(panel.get(), view).doClick(); @@ -105,7 +147,7 @@ class DashboardPanelTest { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { findButton(panel.get(), "Settings").doClick(); findButton(panel.get(), "Advanced").doClick(); @@ -151,9 +193,10 @@ class DashboardPanelTest { SavedServer first = new SavedServer("Same name", "first.example.invalid:25566"), second = new SavedServer("Same name", "second.example.invalid:25567"); Map statuses = new LinkedHashMap<>(); statuses.put(first.address, onlineStatus("First", "1.21.1")); statuses.put(second.address, onlineStatus("Second", "1.21.1")); AtomicReference panel = new AtomicReference<>(); - SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false, + choices -> ((AbstractButton)findNamed(choices, "launch-choice-ready")).doClick()))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { panel.get().displayServers(Arrays.asList(first, second), statuses); findButton(findNamed(panel.get(), "server-" + first.address), "Join").doClick(); @@ -178,9 +221,10 @@ class DashboardPanelTest { }; SavedServer first = new SavedServer("First", "first.example.invalid"), removed = new SavedServer("Removed", "removed.example.invalid"); AtomicReference panel = new AtomicReference<>(); - SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false, + choices -> ((AbstractButton)findNamed(choices, "launch-choice-older")).doClick()))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { int oldGeneration = panel.get().displayServers(Arrays.asList(first, removed), Collections.emptyMap()); assertTrue(containsText(findNamed(panel.get(), "server-" + first.address), "Checking…")); @@ -203,7 +247,7 @@ class DashboardPanelTest { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> { FlatLightLaf.setup(); panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false)); }); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { SavedServer first = new SavedServer("Literal 雪 — A very long Minecraft favorite name", "first.example.invalid"), second = new SavedServer("Other", "second.example.invalid"); Map statuses = new LinkedHashMap<>(); @@ -220,7 +264,7 @@ class DashboardPanelTest { AbstractButton button = findAccessibleButton(firstCard, action); assertNotNull(button); assertNotNull(button.getIcon()); assertTrue(button.isFocusable()); } panel.get().setSize(1200, 820); for (int i = 0; i < 5; i++) layout(panel.get()); - assertEquals(firstCard.getY(), secondCard.getY()); assertTrue(secondCard.getX() > firstCard.getX()); + assertEquals(firstCard.getX(), secondCard.getX()); assertTrue(secondCard.getY() > firstCard.getY()); ((AbstractButton) findNamed(secondCard, "select-server-" + second.address)).doClick(); ((JComboBox) findNamed(panel.get(), "server-sort")).setSelectedItem("Name"); assertTrue(((AbstractButton) findNamed(secondCard, "select-server-" + second.address)).isSelected()); @@ -246,16 +290,16 @@ class DashboardPanelTest { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); try { - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); try (com.osiris.autoplug.client.launcher.DownloadProgress.Transfer first = com.osiris.autoplug.client.launcher.DownloadProgress.begin("First asset", "https://example.invalid/first.jar"); com.osiris.autoplug.client.launcher.DownloadProgress.Transfer second = com.osiris.autoplug.client.launcher.DownloadProgress.begin("Second asset", "https://example.invalid/second.jar")) { first.complete(20, 20); awaitUi(() -> containsText(panel.get(), "First asset — complete")); SwingUtilities.invokeAndWait(() -> { - JProgressBar bar = (JProgressBar) findNamed(panel.get(), "activity-progress"); assertTrue(bar.isVisible()); assertTrue(bar.isIndeterminate()); + JProgressBar bar = (JProgressBar) findNamed(panel.get(), "activity-progress"); assertTrue(bar.isVisible()); assertFalse(bar.isIndeterminate()); assertTrue(bar.getValue() < 100); }); second.complete(30, 30); - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> assertEquals("https://example.invalid/second.jar", ((JTextField) findNamed(panel.get(), "download-source")).getText())); } } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } @@ -315,21 +359,24 @@ class DashboardPanelTest { @Test void localWorldLaunchUsesRecordedVersionWithoutProfileEulaOrSharing() throws Exception { CountDownLatch launched = new CountDownLatch(1); AtomicReference> request = new AtomicReference<>(); AtomicBoolean onEventThread = new AtomicBoolean(); - String result = "Minecraft 1.12.2 started. Select Singleplayer, then Old cottage."; + String result = "Minecraft 1.12.2 started with automatic entry for Old cottage."; + ProfileInfo vanilla = new ProfileInfo("local-vanilla", "Vanilla", "1.12.2", "VANILLA", "MODS", "", false); LauncherActions actions = new LauncherActions() { @Override public List worlds() { return Arrays.asList(new WorldInfo("local:cottage", "Old cottage", "", "", directory.toString(), "", false, true, "1.12.2")); } @Override public List profiles() { - return Arrays.asList(new ProfileInfo("newer-profile", "Different version", "1.21.1", "FABRIC", "MODS", "", false)); + return Arrays.asList(new ProfileInfo("newer-profile", "Different version", "1.21.1", "FABRIC", "MODS", "", false), vanilla); } + @Override public ProfileInfo ensureDefaultProfiles(String version) { assertEquals("1.12.2", version); return vanilla; } @Override public String launchLocalWorld(String id, String version) { onEventThread.set(SwingUtilities.isEventDispatchThread()); request.set(Arrays.asList(id, version)); launched.countDown(); return result; } @Override public void launchWorld(String id, boolean share) { fail("A local save must not start a managed server"); } }; AtomicReference panel = new AtomicReference<>(); - SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false, + choices -> ((AbstractButton)findNamed(choices, "launch-choice-local-vanilla")).doClick()))); try { awaitUi(() -> findNamed(panel.get(), "world-local:cottage") != null); SwingUtilities.invokeAndWait(() -> { @@ -346,16 +393,20 @@ class DashboardPanelTest { @Test void unknownLocalVersionIsVisibleAndManagedWorldKeepsItsOwnControls() throws Exception { CountDownLatch managedLaunch = new CountDownLatch(1); + ProfileInfo client = new ProfileInfo("client", "Client", "1.21.1", "VANILLA", "MODS", "", false); LauncherActions actions = new LauncherActions() { @Override public List worlds() { return Arrays.asList(new WorldInfo("local:old", "Old save", "", "", directory.toString(), "", false, true, ""), - new WorldInfo("managed", "Friends", "server", "client", directory.toString(), "", false)); + new WorldInfo("managed", "Friends", "server", "client", directory.toString(), "", false, false, "1.21.1")); } + @Override public List profiles() { return Arrays.asList(client); } + @Override public ProfileInfo ensureDefaultProfiles(String version) { return client; } @Override public void launchWorld(String id, boolean share) { assertEquals("managed", id); assertFalse(share); managedLaunch.countDown(); } @Override public String launchLocalWorld(String id, String version) { fail("Managed play must not launch a local save"); return ""; } }; AtomicReference panel = new AtomicReference<>(); - SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false, + choices -> ((AbstractButton)findNamed(choices, "launch-choice-client")).doClick()))); try { awaitUi(() -> findNamed(panel.get(), "world-managed") != null); SwingUtilities.invokeAndWait(() -> { @@ -426,7 +477,7 @@ public static void main(String[] args) throws Exception { }); calls.await(4, TimeUnit.SECONDS); // The empty local import finishes before injecting render-only examples; no server is pinged. - awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + awaitUi(() -> ((JProgressBar) findNamed(panel.get(), "activity-progress")).getValue() == 100); SwingUtilities.invokeAndWait(() -> { SavedServer online = new SavedServer("Quiet Cove", "cove.example.invalid"), unavailable = new SavedServer("Skyline Survival", "skyline.example.invalid:25566"), checking = new SavedServer("Weekend Adventure", "weekend.example.invalid"); Map statuses = new LinkedHashMap<>(); diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardServerRowsTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardServerRowsTest.java new file mode 100644 index 00000000..64576015 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardServerRowsTest.java @@ -0,0 +1,151 @@ +package com.osiris.autoplug.client.ui; + +import com.formdev.flatlaf.FlatLightLaf; +import com.osiris.autoplug.client.browser.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicReference; +import static org.junit.jupiter.api.Assertions.*; + +class DashboardServerRowsTest { + @TempDir Path directory; + + @Test void repeatedPingsKeepNewestStatusAndIconAndNeverUpdateReplacedCards() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, + new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); boolean[] ready = {false}; + while (!ready[0] && System.nanoTime() < deadline) { + SwingUtilities.invokeAndWait(() -> ready[0] = ((JProgressBar)find(panel.get(), "activity-progress")).getValue() == 100); + if (!ready[0]) Thread.sleep(15); + } + assertTrue(ready[0]); + SwingUtilities.invokeAndWait(() -> { + SavedServer server = new SavedServer("Fixture", "fixture.example.invalid"); + BufferedImage oldIcon = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB); + BufferedImage newIcon = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB); + ServerStatus old = new ServerStatus(true, "Older response", "1.20.1", 1, 10, 763, 50, "SUCCESS", oldIcon); + ServerStatus fresh = new ServerStatus(true, "Newest response", "1.21.1", 2, 10, 767, 25, "SUCCESS", newIcon); + int generation = panel.get().displayServers(Collections.singletonList(server), Collections.singletonMap(server.address, old)); + long first = panel.get().beginServerPing(server), second = panel.get().beginServerPing(server); + JLabel icon = (JLabel)find(panel.get(), "server-icon"); + assertFalse(icon.getIcon() instanceof ImageIcon, "A pending check clears the old favicon"); + panel.get().showPing(generation, server, second, fresh); + panel.get().showPing(generation, server, first, old); + assertSame(newIcon, ((ImageIcon)icon.getIcon()).getImage()); + assertEquals("Newest response", ((JTextArea)find(panel.get(), "server-message")).getText()); + int replacement = panel.get().displayServers(Collections.singletonList(server), Collections.emptyMap()); + assertNotEquals(generation, replacement); + panel.get().showPing(generation, server, second, fresh); + assertEquals("Checking…", ((JLabel)find(panel.get(), "server-status")).getText()); + long latest = panel.get().beginServerPing(server); + panel.get().showPing(replacement, server, latest, new ServerStatus(false, "", "", 0, 0, 0, 0, "Offline")); + assertFalse(((JLabel)find(panel.get(), "server-icon")).getIcon() instanceof ImageIcon); + panel.get().close(); + panel.get().showPing(replacement, server, latest, fresh); + assertEquals("Offline · Unavailable", ((JLabel)find(panel.get(), "server-status")).getText()); + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void rememberedCompatibleLoaderIsOfferedEvenWhenGlobalDefaultHasAnotherVersion() throws Exception { + LauncherActions.ProfileInfo global = new LauncherActions.ProfileInfo("global", "Global", "1.21.1", "VANILLA", "MODS", "", false); + LauncherActions.ProfileInfo previous = new LauncherActions.ProfileInfo("previous", "Previous", "1.20.1", "FABRIC", "MODS", "", false); + CountDownLatch launched = new CountDownLatch(1); AtomicReference selected = new AtomicReference<>(); + LauncherActions actions = new LauncherActions() { + @Override public java.util.List profiles() { return Arrays.asList(global, previous); } + @Override public SettingsInfo settings() { SettingsInfo result = new SettingsInfo(); result.defaultProfile = global.id; return result; } + @Override public String preferredProfile(String target) { assertEquals("server:remembered.example.invalid", target); return previous.id; } + @Override public void launchProfile(String id, String host, int port) { selected.set(id); launched.countDown(); } + @Override public ProfileInfo cloneProfile(String id, String name, String version, String loader) { fail("A compatible remembered profile must not require migration"); return null; } + }; + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, + new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false, + choices -> ((AbstractButton)find(choices, "launch-choice-previous")).doClick(0)))); + try { + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); boolean[] ready = {false}; + while (!ready[0] && System.nanoTime() < deadline) { + SwingUtilities.invokeAndWait(() -> ready[0] = ((JProgressBar)find(panel.get(), "activity-progress")).getValue() == 100); + if (!ready[0]) Thread.sleep(15); + } + assertTrue(ready[0]); + SwingUtilities.invokeAndWait(() -> { + SavedServer server = new SavedServer("Remembered", "remembered.example.invalid"); + panel.get().displayServers(Collections.singletonList(server), Collections.singletonMap(server.address, + new ServerStatus(true, "Welcome", "1.20.1", 1, 20, 763, 20, "SUCCESS"))); + AbstractButton button = (AbstractButton)find(panel.get(), "select-server-" + server.address); + Object key = button.getInputMap(JComponent.WHEN_FOCUSED).get(KeyStroke.getKeyStroke("ENTER")); + button.getActionMap().get(key).actionPerformed(new java.awt.event.ActionEvent(button, 0, "join")); + }); + assertTrue(launched.await(4, TimeUnit.SECONDS)); assertEquals(previous.id, selected.get()); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void rowsDefaultToMostRecentlyJoinedWithRealIconsAndDistinctStatusColors() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> { FlatLightLaf.setup(); panel.set(new DashboardPanel(new LauncherActions() {}, + new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false)); }); + try { + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); boolean[] ready = {false}; + while (!ready[0] && System.nanoTime() < deadline) { + SwingUtilities.invokeAndWait(() -> ready[0] = ((JProgressBar) find(panel.get(), "activity-progress")).getValue() == 100); + if (!ready[0]) Thread.sleep(15); + } + assertTrue(ready[0]); + SwingUtilities.invokeAndWait(() -> { + SavedServer older = new SavedServer("Minecraft Server", "older.example.invalid", 1000); + SavedServer latest = new SavedServer("Recent favorite", "recent.example.invalid", 2000); + BufferedImage favicon = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB); favicon.setRGB(1, 1, 0xFF237C42); + Map statuses = new HashMap<>(); + statuses.put(older.address, new ServerStatus(false, "", "", 0, 0, 0, 0, "Connection refused")); + statuses.put(latest.address, new ServerStatus(true, "Welcome", "1.21.1", 3, 20, 767, 40, "SUCCESS", favicon)); + panel.get().displayServers(Arrays.asList(older, latest), statuses); + assertEquals("Last joined", ((JComboBox) find(panel.get(), "server-sort")).getSelectedItem()); + Container grid = find(panel.get(), "server-cards"), newest = find(panel.get(), "server-" + latest.address), oldest = find(panel.get(), "server-" + older.address); + assertSame(newest, grid.getComponent(0)); + assertEquals("older.example.invalid", ((AbstractButton)find(oldest,"select-server-" + older.address)).getText()); + JLabel shownIcon = (JLabel)find(newest, "server-icon"); assertTrue(shownIcon.getIcon() instanceof ImageIcon); + assertSame(favicon, ((ImageIcon)shownIcon.getIcon()).getImage()); + for (int width : new int[]{1200, 950}) { + panel.get().setSize(width, width == 950 ? 620 : 820); for (int i = 0; i < 6; i++) layout(panel.get()); + assertEquals(newest.getX(), oldest.getX()); assertTrue(oldest.getY() >= newest.getY() + newest.getHeight()); + assertTrue(newest.getWidth() > 500); + JLabel online = (JLabel)find(newest, "server-status"), offline = (JLabel)find(oldest, "server-status"); + paint(online); paint(offline); assertNotEquals(online.getForeground(), offline.getForeground()); + for (Component child : buttons(newest)) { + Rectangle bounds = SwingUtilities.convertRectangle(child.getParent(), child.getBounds(), newest); + assertTrue(bounds.width > 0 && bounds.height > 0 && bounds.x >= 0 && bounds.y >= 0 + && bounds.x + bounds.width <= newest.getWidth() && bounds.y + bounds.height <= newest.getHeight(), "Controls remain within full-width card"); + } + } + ((JTextField)find(panel.get(), "server-search")).setText("older"); assertFalse(newest.isVisible()); assertTrue(oldest.isVisible()); + ((JTextField)find(panel.get(), "server-search")).setText(""); assertSame(newest, grid.getComponent(0)); + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + private static void paint(JComponent component) { + BufferedImage image = new BufferedImage(Math.max(1, component.getWidth()), Math.max(1, component.getHeight()), BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = image.createGraphics(); try { component.paint(graphics); } finally { graphics.dispose(); } + } + private static java.util.List buttons(Container container) { + java.util.List result = new ArrayList<>(); + for (Component child : container.getComponents()) { if (child instanceof AbstractButton) result.add(child); if (child instanceof Container) result.addAll(buttons((Container)child)); } + return result; + } + private static Container find(Container container, String name) { + if (name.equals(container.getName())) return container; + for (Component child : container.getComponents()) if (child instanceof Container) { Container found = find((Container)child, name); if (found != null) return found; } + return null; + } + private static void layout(Container container) { container.doLayout(); for (Component child : container.getComponents()) if (child instanceof Container) layout((Container)child); } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/LaunchChoicePanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/LaunchChoicePanelTest.java new file mode 100644 index 00000000..91dda4d3 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/LaunchChoicePanelTest.java @@ -0,0 +1,90 @@ +package com.osiris.autoplug.client.ui; + +import com.osiris.autoplug.client.ui.LauncherActions.ProfileInfo; +import org.junit.jupiter.api.Test; +import javax.swing.*; +import java.awt.*; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import static org.junit.jupiter.api.Assertions.*; + +class LaunchChoicePanelTest { + private final ProfileInfo preferred = new ProfileInfo("first", "First", "1.21.1", "VANILLA", "MODS", "", false); + private final ProfileInfo alternative = new ProfileInfo("second", "Second", "1.21.1", "FABRIC", "MODS", "", false); + + @Test void rememberedChoiceWaitsTwoSecondsAndLaunchesOnlyOnce() throws Exception { + SwingUtilities.invokeAndWait(() -> { + AtomicLong clock = new AtomicLong(); List chosen = new ArrayList<>(); + try (LaunchChoicePanel panel = new LaunchChoicePanel(Arrays.asList(preferred, alternative), preferred, true, chosen::add, clock::get)) { + AbstractButton cancel = named(panel, "abort-auto-launch"); assertTrue(cancel.isVisible()); assertTrue(cancel.getText().contains("2s")); + clock.set(1_000_000_000L); panel.tick(); assertTrue(cancel.getText().contains("1s")); assertTrue(chosen.isEmpty()); + clock.set(1_999_999_999L); panel.tick(); assertTrue(chosen.isEmpty()); + clock.set(2_000_000_000L); panel.tick(); panel.tick(); named(panel, "launch-choice-second").doClick(0); + assertEquals(Arrays.asList(preferred), chosen); + } + }); + } + + @Test void abortStopsAutomaticLaunchButAllowsOneDeliberateAlternative() throws Exception { + SwingUtilities.invokeAndWait(() -> { + AtomicLong clock = new AtomicLong(); List chosen = new ArrayList<>(); + try (LaunchChoicePanel panel = new LaunchChoicePanel(Arrays.asList(preferred, alternative), preferred, true, chosen::add, clock::get)) { + named(panel, "abort-auto-launch").doClick(0); + clock.set(9_000_000_000L); panel.tick(); assertTrue(chosen.isEmpty()); + assertFalse(named(panel, "abort-auto-launch").isVisible()); + named(panel, "launch-choice-second").doClick(0); named(panel, "launch-choice-first").doClick(0); panel.tick(); + assertEquals(Arrays.asList(alternative), chosen); + } + }); + } + + @Test void closingChooserCancelsQueuedTicksAndButtonEvents() throws Exception { + SwingUtilities.invokeAndWait(() -> { + AtomicLong clock = new AtomicLong(); List chosen = new ArrayList<>(); + LaunchChoicePanel panel = new LaunchChoicePanel(Arrays.asList(preferred, alternative), preferred, true, chosen::add, clock::get); + panel.close(); clock.set(9_000_000_000L); panel.tick(); named(panel, "launch-choice-first").doClick(0); panel.close(); + assertTrue(chosen.isEmpty(), "Disposing/closing the chooser cannot launch after it is gone"); + }); + } + + @Test void choicesAreFullWidthAtCompactAndWideSizesAndLiteralNamesStayLiteral() throws Exception { + SwingUtilities.invokeAndWait(() -> { + ProfileInfo literal = new ProfileInfo("literal", "Literal name", "1.21.1", "VANILLA", "MODS", "", false); + try (LaunchChoicePanel panel = new LaunchChoicePanel(Arrays.asList(preferred, literal), preferred, true, ignored -> {}, () -> 0L)) { + AbstractButton choice = named(panel, "launch-choice-literal"); + assertEquals(literal.toString(), choice.getText()); assertNull(choice.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey)); + for (int width : new int[]{800, 360}) { + panel.setSize(width, 460); for (int i = 0; i < 5; i++) layout(panel); + JViewport viewport = (JViewport)SwingUtilities.getAncestorOfClass(JViewport.class, choice); + assertNotNull(viewport); assertEquals(viewport.getExtentSize().width, choice.getWidth()); + assertTrue(choice.getHeight() >= 50); assertEquals(0, choice.getX()); + AbstractButton cancel = named(panel, "abort-auto-launch"); assertEquals(width - 32, cancel.getWidth()); assertTrue(cancel.getHeight() >= 50); + assertTrue(cancel.getBackground().getRed() > cancel.getBackground().getGreen()); + } + } + }); + } + + @Test void pendingOrTemplateProfilesCannotAutoLaunchOrBeSelected() throws Exception { + SwingUtilities.invokeAndWait(() -> { + ProfileInfo pending = new ProfileInfo("pending", "Pending", "1.21.1", "FABRIC", "MODS", "", false, "Review migration", false); + ProfileInfo template = new ProfileInfo("template", "Template", "1.21.1", "VANILLA", "MODS", "", true); + AtomicLong clock = new AtomicLong(); List chosen = new ArrayList<>(); + try (LaunchChoicePanel panel = new LaunchChoicePanel(Arrays.asList(pending, template), pending, true, chosen::add, clock::get)) { + assertFalse(named(panel, "launch-choice-pending").isEnabled()); assertFalse(named(panel, "launch-choice-template").isEnabled()); + clock.set(9_000_000_000L); panel.tick(); assertTrue(chosen.isEmpty()); assertFalse(named(panel, "abort-auto-launch").isVisible()); + } + }); + } + + private static AbstractButton named(Container container, String name) { + for (Component component : container.getComponents()) { + if (component instanceof AbstractButton && name.equals(component.getName())) return (AbstractButton)component; + if (component instanceof Container) { AbstractButton match = named((Container)component, name); if (match != null) return match; } + } + return null; + } + private static void layout(Container container) { container.doLayout(); for (Component child : container.getComponents()) if (child instanceof Container) layout((Container)child); } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/ManagedWorldPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/ManagedWorldPanelTest.java new file mode 100644 index 00000000..bbd92eeb --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/ManagedWorldPanelTest.java @@ -0,0 +1,196 @@ +package com.osiris.autoplug.client.ui; + +import com.osiris.autoplug.client.ui.LauncherActions.WorldInfo; +import org.junit.jupiter.api.Test; + +import javax.swing.*; +import java.awt.Component; +import java.awt.Container; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.*; + +/** Headless Swing tests: real EDT and worker queue, no frames, processes, network or Robot. */ +class ManagedWorldPanelTest { + private static final WorldInfo ALPHA = world("alpha", false), BETA = world("beta", false), LOCAL = world("local", true); + + @Test void serviceCallsStayOffEdtAndLocalWorldsNeverEnterManagedConsole() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); + try { + drain(panel); + edt(() -> { + assertEquals(2, selector(panel).getItemCount()); + for (int i = 0; i < selector(panel).getItemCount(); i++) assertFalse(((WorldInfo) selector(panel).getItemAt(i)).local); + for (String label : Arrays.asList("Stop", "Restart", "Back up", "AutoPlug help", "Server status")) button(panel, label).doClick(0); + return null; + }); + drain(panel); + assertTrue(actions.calls.contains("stop:alpha")); + assertTrue(actions.calls.contains("restart:alpha")); + assertTrue(actions.calls.contains("command:alpha:.backup")); + assertTrue(actions.calls.contains("command:alpha:.help")); + assertTrue(actions.calls.contains("command:alpha:list")); + assertTrue(actions.calls.contains("log:alpha")); + assertFalse(actions.calledOnEdt.get(), "World listing, log reads and commands must run in the worker"); + } finally { close(panel); } + } + + @Test void slowRefreshPreservesASelectionMadeWhileTheListingWasInFlight() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); Gate gate = new Gate(); + try { + drain(panel); actions.nextList.set(gate); + edt(() -> { panel.refresh(); return null; }); gate.awaitStarted(); + edt(() -> { selector(panel).setSelectedItem(BETA); return null; }); + gate.release.countDown(); drain(panel); + assertEquals("beta", edt(() -> ((WorldInfo) selector(panel).getSelectedItem()).id)); + assertEquals("log from beta", edt(() -> output(panel).getText())); + } finally { gate.release.countDown(); close(panel); } + } + + @Test void staleLogCannotReplaceTheNewSelectionsConsole() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); Gate gate = new Gate(); + try { + drain(panel); actions.nextLog.set(gate); + edt(() -> { panel.refreshLog(); return null; }); gate.awaitStarted(); + edt(() -> { selector(panel).setSelectedItem(BETA); return null; }); + gate.release.countDown(); drain(panel); + assertNotEquals("log from alpha", edt(() -> output(panel).getText())); + edt(() -> { panel.refreshLog(); return null; }); drain(panel); + assertEquals("log from beta", edt(() -> output(panel).getText())); + assertFalse(actions.calledOnEdt.get()); + } finally { gate.release.countDown(); close(panel); } + } + + @Test void queuedCommandsRetainTheWorldCapturedWhenSendWasClicked() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); Gate gate = new Gate(); + try { + drain(panel); actions.nextCommand.set(gate); + send(panel, "first world command"); gate.awaitStarted(); + edt(() -> { selector(panel).setSelectedItem(BETA); return null; }); + send(panel, "second world command"); + gate.release.countDown(); drain(panel); + assertTrue(actions.calls.contains("command:alpha:first world command")); + assertTrue(actions.calls.contains("command:beta:second world command")); + assertFalse(actions.calls.contains("command:beta:first world command")); + assertEquals("beta", edt(() -> ((WorldInfo) selector(panel).getSelectedItem()).id)); + assertEquals("", edt(() -> command(panel).getText())); + } finally { gate.release.countDown(); close(panel); } + } + + @Test void commandFailureFromPreviousSelectionCannotOverwriteCurrentStatus() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); Gate gate = new Gate(); + List statuses = new CopyOnWriteArrayList<>(); + try { + drain(panel); actions.nextCommand.set(gate); actions.failCommand.set(true); + edt(() -> { state(panel).addPropertyChangeListener("text", event -> statuses.add(String.valueOf(event.getNewValue()))); return null; }); + send(panel, "failing command"); gate.awaitStarted(); + edt(() -> { selector(panel).setSelectedItem(BETA); statuses.clear(); return null; }); + gate.release.countDown(); drain(panel); + assertTrue(actions.calls.contains("command:alpha:failing command")); + assertFalse(statuses.stream().anyMatch(value -> value.contains("alpha command failed")), statuses.toString()); + assertEquals("log from beta", edt(() -> output(panel).getText())); + } finally { gate.release.countDown(); close(panel); } + } + + @Test void closeDiscardsQueuedCommandsAndLateResultsWithoutTouchingAnotherWorld() throws Exception { + Actions actions = new Actions(); ManagedWorldPanel panel = create(actions); Gate gate = new Gate(); + try { + drain(panel); actions.nextLog.set(gate); + edt(() -> { panel.refreshLog(); return null; }); gate.awaitStarted(); + send(panel, "must not execute"); + String before = edt(() -> { panel.close(); return output(panel).getText(); }); + gate.release.countDown(); + assertTrue(worker(panel).awaitTermination(3, TimeUnit.SECONDS)); + edt(() -> { panel.refresh(); panel.refreshLog(); return null; }); + edt(() -> null); + assertFalse(actions.calls.contains("command:alpha:must not execute")); + assertEquals(before, edt(() -> output(panel).getText())); + assertFalse(actions.calls.stream().anyMatch(value -> value.startsWith("command:beta:"))); + assertFalse(timer(panel).isRunning()); + } finally { gate.release.countDown(); close(panel); } + } + + private static ManagedWorldPanel create(Actions actions) throws Exception { + return edt(() -> { + ManagedWorldPanel panel = new ManagedWorldPanel(actions, world -> { }, path -> { }); + panel.refresh(); return panel; + }); + } + private static void send(ManagedWorldPanel panel, String text) throws Exception { + edt(() -> { command(panel).setText(text); button(panel, "Send").doClick(0); return null; }); + } + private static void drain(ManagedWorldPanel panel) throws Exception { + // A completion on the EDT may enqueue a refresh and then a log read. + for (int i = 0; i < 4; i++) { + worker(panel).submit(() -> { }).get(3, TimeUnit.SECONDS); + edt(() -> null); + } + } + private static void close(ManagedWorldPanel panel) throws Exception { + edt(() -> { panel.close(); return null; }); + assertTrue(worker(panel).awaitTermination(3, TimeUnit.SECONDS)); + edt(() -> null); + } + private static T edt(Callable task) throws Exception { + FutureTask future = new FutureTask<>(task); + SwingUtilities.invokeAndWait(future); + return future.get(3, TimeUnit.SECONDS); + } + private static Object field(ManagedWorldPanel panel, String name) throws Exception { + Field field = ManagedWorldPanel.class.getDeclaredField(name); field.setAccessible(true); return field.get(panel); + } + private static JComboBox selector(ManagedWorldPanel panel) throws Exception { return (JComboBox) field(panel, "worlds"); } + private static JTextArea output(ManagedWorldPanel panel) throws Exception { return (JTextArea) field(panel, "output"); } + private static JTextField command(ManagedWorldPanel panel) throws Exception { return (JTextField) field(panel, "command"); } + private static JLabel state(ManagedWorldPanel panel) throws Exception { return (JLabel) field(panel, "state"); } + private static ExecutorService worker(ManagedWorldPanel panel) throws Exception { return (ExecutorService) field(panel, "worker"); } + private static Timer timer(ManagedWorldPanel panel) throws Exception { return (Timer) field(panel, "timer"); } + private static JButton button(Container container, String label) { + for (Component child : container.getComponents()) { + if (child instanceof JButton && label.equals(((JButton) child).getText())) return (JButton) child; + if (child instanceof Container) { JButton found = findButton((Container) child, label); if (found != null) return found; } + } + throw new AssertionError("Missing button " + label); + } + private static JButton findButton(Container container, String label) { + for (Component child : container.getComponents()) { + if (child instanceof JButton && label.equals(((JButton) child).getText())) return (JButton) child; + if (child instanceof Container) { JButton found = findButton((Container) child, label); if (found != null) return found; } + } + return null; + } + private static WorldInfo world(String id, boolean local) { + return new WorldInfo(id, id, "server-" + id, "client-" + id, "world-" + id, null, true, local, "1.21.1"); + } + private static final class Gate { + final CountDownLatch started = new CountDownLatch(1), release = new CountDownLatch(1); + void awaitStarted() throws InterruptedException { assertTrue(started.await(3, TimeUnit.SECONDS), "Worker did not reach controlled operation"); } + void pause() throws InterruptedException { started.countDown(); if (!release.await(5, TimeUnit.SECONDS)) throw new InterruptedException("Fixture gate timeout"); } + } + private static final class Actions implements LauncherActions { + final List calls = new CopyOnWriteArrayList<>(); + final AtomicBoolean calledOnEdt = new AtomicBoolean(), failCommand = new AtomicBoolean(); + final AtomicReference nextList = new AtomicReference<>(), nextLog = new AtomicReference<>(), nextCommand = new AtomicReference<>(); + private void record(String call) { if (SwingUtilities.isEventDispatchThread()) calledOnEdt.set(true); calls.add(call); } + private void pause(AtomicReference next) throws InterruptedException { Gate gate = next.getAndSet(null); if (gate != null) gate.pause(); } + @Override public List worlds() throws Exception { record("worlds"); pause(nextList); return Arrays.asList(ALPHA, BETA, LOCAL); } + @Override public String serverLog(String id) throws Exception { record("log:" + id); pause(nextLog); return "log from " + id; } + @Override public void serverCommand(String id, String command) throws Exception { + record("command:" + id + ":" + command); pause(nextCommand); + if (failCommand.getAndSet(false)) throw new IOException(id + " command failed"); + } + @Override public void stopWorld(String id) { record("stop:" + id); } + @Override public void restartWorld(String id) { record("restart:" + id); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/OverallProgressTest.java b/src/test/java/com/osiris/autoplug/client/ui/OverallProgressTest.java new file mode 100644 index 00000000..f284818b --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/OverallProgressTest.java @@ -0,0 +1,23 @@ +package com.osiris.autoplug.client.ui; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class OverallProgressTest { + @Test void estimateMovesForwardAndSlowsWithoutPretendingToComplete() { + OverallProgress progress = new OverallProgress(); progress.start(); + int previous = progress.value(), start = previous; + for (int i = 0; i < 30; i++) { int next = progress.tick(); assertTrue(next >= previous); previous = next; } + int earlyGain = previous - start, laterStart = previous; + for (int i = 0; i < 30; i++) { int next = progress.tick(); assertTrue(next >= previous); previous = next; } + assertTrue(previous - laterStart < earlyGain); + for (int i = 0; i < 2000; i++) { int next = progress.tick(); assertTrue(next >= previous && next < 100); previous = next; } + assertTrue(previous <= 95); + } + + @Test void completionStaysCompleteUntilAnotherOperationExplicitlyStarts() { + OverallProgress progress = new OverallProgress(); progress.start(); progress.tick(); + assertEquals(100, progress.complete()); assertEquals(100, progress.value()); assertEquals(100, progress.tick()); + progress.start(); assertTrue(progress.value() > 0 && progress.value() < 100); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrapTest.java b/src/test/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrapTest.java new file mode 100644 index 00000000..1f09a588 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrapTest.java @@ -0,0 +1,94 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.*; +import com.osiris.dyml.Yaml; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.zip.*; +import static org.junit.jupiter.api.Assertions.*; + +class AutoPlugWorldBootstrapTest { + @TempDir Path temporary; + + @Test void wrapsPackagedAutoPlugWithExactArgumentsAndIndependentWrapperRuntime() throws Exception { + Path source = jar(), world = Files.createDirectories(temporary.resolve("world with spaces")); + Path nativeJava = Files.write(temporary.resolve("older server java.exe"), new byte[]{1}); + List nativeCommand = Arrays.asList(nativeJava.toString(), "@libraries/forge/win_args.txt", "-Dnote=space and \"quoted\" value", "nogui"); + Profile profile = profile(); + ServerLaunch result = new AutoPlugWorldBootstrap(source, java()).wrap(profile, new ServerLaunch(nativeCommand, world)); + assertEquals(java().toString(), result.command.get(0)); assertNotEquals(nativeCommand.get(0), result.command.get(0)); + assertEquals(world.toAbsolutePath(), result.directory); assertEquals(".stop both", result.stopCommand); assertEquals(".restart", result.restartCommand); + assertTrue(result.command.contains(AutoPlugWorldBootstrap.CHILD_ARGUMENT)); + assertArrayEquals(Files.readAllBytes(source), Files.readAllBytes(world.resolve("autoplug/AutoPlug-Client.jar"))); + assertEquals(nativeCommand, AutoPlugWorldBootstrap.readCommand(world)); + assertFalse(Files.exists(world.resolve("eula.txt")), "Wrapper must not accept an EULA"); + Yaml general = read(world, "general"); + assertEquals("MINECRAFT_SERVER", general.get("general", "autoplug", "target-software").asString()); + assertTrue(general.get("general", "autoplug", "auto-stop").asBoolean()); + assertTrue(general.get("general", "server", "auto-start").asBoolean()); + assertFalse(general.get("general", "server", "auto-eula").asBoolean()); + assertFalse(general.get("general", "server", "restart-on-crash").asBoolean()); + assertFalse(general.get("general", "autoplug", "start-on-boot").asBoolean()); + assertFalse(general.get("general", "autoplug", "system-tray", "enable").asBoolean()); + Yaml updater = read(world, "updater"); + for (String name : Arrays.asList("self-updater", "java-updater", "server-updater", "mods-updater", "plugins-updater", "global-recurring-checks")) + assertFalse(updater.get("updater", name, "enable").asBoolean()); + } + + @Test void repeatLaunchKeepsUserConfigurationAndDoesNotTouchAnotherWorld() throws Exception { + Path source = jar(), first = Files.createDirectories(temporary.resolve("first")), second = Files.createDirectories(temporary.resolve("second")); + AutoPlugWorldBootstrap bootstrap = new AutoPlugWorldBootstrap(source, java()); Profile profile = profile(); + bootstrap.wrap(profile, new ServerLaunch(Arrays.asList(java().toString(), "-version"), first)); + bootstrap.wrap(profile, new ServerLaunch(Arrays.asList(java().toString(), "-version"), second)); + byte[] otherConfig = Files.readAllBytes(second.resolve("autoplug/general.yml")); + Yaml general = read(first, "general"); general.put("general", "server", "key").setValues("fixture-personal-key"); general.save(); + Yaml backup = read(first, "backup"); backup.put("backup", "enable").setValues("true"); backup.save(); + bootstrap.wrap(profile, new ServerLaunch(Arrays.asList(java().toString(), "-version"), first)); + assertEquals("fixture-personal-key", read(first, "general").get("general", "server", "key").asString()); + assertTrue(read(first, "backup").get("backup", "enable").asBoolean()); + assertArrayEquals(otherConfig, Files.readAllBytes(second.resolve("autoplug/general.yml"))); + } + + @Test void unbundledDevelopmentLaunchFailsClearlyBeforeMakingAnInstance() throws Exception { + Path world = Files.createDirectories(temporary.resolve("world")); + IOException error = assertThrows(IOException.class, () -> new AutoPlugWorldBootstrap(temporary, java()).wrap(profile(), new ServerLaunch(Arrays.asList(java().toString(), "-version"), world))); + assertTrue(error.getMessage().contains("packaged AutoPlug JAR")); + assertFalse(Files.exists(world.resolve("autoplug"))); + } + + @Test void independentRealConsoleProcessesReceiveOnlyTheirOwnCommandsAndStopGracefully() throws Exception { + Path first = Files.createDirectories(temporary.resolve("first")), second = Files.createDirectories(temporary.resolve("second")); + Process a = console(first), b = console(second); + try (ManagedServer one = new ManagedServer(a, 5000, ".stop both", ".restart"); + ManagedServer two = new ManagedServer(b, 5000, ".stop both", ".restart")) { + one.command("say first world"); two.command("say second world"); one.restart(); + assertThrows(IOException.class, () -> one.command("say invalid\nstop")); + one.close(); assertFalse(a.isAlive()); assertTrue(b.isAlive()); + two.close(); assertFalse(b.isAlive()); + assertEquals(Arrays.asList("say first world", ".restart", ".stop both"), Files.readAllLines(first.resolve("commands.txt"), StandardCharsets.UTF_8)); + assertEquals(Arrays.asList("say second world", ".stop both"), Files.readAllLines(second.resolve("commands.txt"), StandardCharsets.UTF_8)); + assertThrows(IOException.class, () -> one.command("say closed")); + } finally { if (a.isAlive()) a.destroyForcibly(); if (b.isAlive()) b.destroyForcibly(); } + } + + private Process console(Path directory) throws Exception { + Path classes = Paths.get(ManagedConsoleFixtureProcess.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + return new ProcessBuilder(java().toString(), "-cp", classes.toString(), ManagedConsoleFixtureProcess.class.getName()) + .directory(directory.toFile()).redirectErrorStream(true).redirectOutput(directory.resolve("fixture.log").toFile()).start(); + } + private Path jar() throws Exception { + Path file = temporary.resolve("AutoPlug fixture.jar"); + try (ZipOutputStream output = new ZipOutputStream(Files.newOutputStream(file))) { + output.putNextEntry(new ZipEntry("com/osiris/autoplug/client/Main.class")); output.write(new byte[]{1, 2, 3}); output.closeEntry(); + } + return file; + } + private Profile profile() { Profile p = new Profile(); p.gameVersion = "1.20.4"; p.loader = "VANILLA"; p.type = ProfileType.MODS_SERVER; return p; } + private static Path java() { return Paths.get(System.getProperty("java.home"), "bin", System.getProperty("os.name").startsWith("Windows") ? "java.exe" : "java").toAbsolutePath().normalize(); } + private Yaml read(Path world, String name) throws Exception { Yaml yaml = new Yaml(world.resolve("autoplug/" + name + ".yml").toString()); yaml.load(); return yaml; } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java index a4b73ec6..ecd73d1b 100644 --- a/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java +++ b/src/test/java/com/osiris/autoplug/client/worlds/LocalWorldStoreTest.java @@ -160,13 +160,18 @@ class LocalWorldStoreTest { try (LauncherServices services = new LauncherServices(temporary.resolve("autoplug"), minecraft, ignored -> { })) { LauncherActions.ProfileInfo server = services.createProfile("Server", "1.21.1", "VANILLA", "MODS_SERVER", false); LauncherActions.ProfileInfo client = services.createProfile("Client", "1.21.1", "VANILLA", "MODS", false); - services.createWorld("Managed", server.id, client.id); + LauncherActions.WorldInfo created = services.createWorld("Managed", server.id, client.id); + WorldStore store = new WorldStore(temporary.resolve("autoplug/worlds")); + VirtualWorld managed = store.get(created.id); + managed.createdAt = System.currentTimeMillis() + 60_000; store.save(managed); List worlds = services.worlds(); assertEquals(2, worlds.size()); - assertTrue(worlds.get(0).local); assertEquals("1.21.1", worlds.get(0).gameVersion); - assertEquals(original.toString(), worlds.get(0).directory); - assertFalse(worlds.get(1).local); - assertThrows(IOException.class, () -> services.launchLocalWorld(worlds.get(0).id, "1.21.2")); + assertEquals(created.id, worlds.get(0).id, "The most recently created world leads the combined list"); + assertFalse(worlds.get(0).local); assertFalse(store.get(created.id).eulaAccepted); + LauncherActions.WorldInfo local = worlds.stream().filter(world -> world.id.equals("local:Local")).findFirst().orElseThrow(AssertionError::new); + assertTrue(local.local); assertEquals("1.21.1", local.gameVersion); + assertEquals(original.toString(), local.directory); + assertThrows(IOException.class, () -> services.launchLocalWorld(local.id, "1.21.2")); } assertArrayEquals(before, Files.readAllBytes(original.resolve("level.dat"))); assertFalse(Files.exists(minecraft.resolve(".autoplug"))); diff --git a/src/test/java/com/osiris/autoplug/client/worlds/ManagedConsoleFixtureProcess.java b/src/test/java/com/osiris/autoplug/client/worlds/ManagedConsoleFixtureProcess.java new file mode 100644 index 00000000..6948c74c --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/ManagedConsoleFixtureProcess.java @@ -0,0 +1,19 @@ +package com.osiris.autoplug.client.worlds; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.Collections; + +/** No server, network or real world data: a real pipe target for instance-routing tests. */ +public final class ManagedConsoleFixtureProcess { + public static void main(String[] args) throws Exception { + try (BufferedReader input = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) { + String line; + while ((line = input.readLine()) != null) { + Files.write(Paths.get("commands.txt"), Collections.singletonList(line), StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + if (".stop both".equals(line)) return; + } + } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/ManagedWorldPackagedSmoke.java b/src/test/java/com/osiris/autoplug/client/worlds/ManagedWorldPackagedSmoke.java new file mode 100644 index 00000000..bb8a2aad --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/worlds/ManagedWorldPackagedSmoke.java @@ -0,0 +1,92 @@ +package com.osiris.autoplug.client.worlds; + +import com.osiris.autoplug.client.profiles.Profile; +import com.osiris.autoplug.client.profiles.ProfileType; +import com.osiris.autoplug.client.worlds.AutoPlugWorldBootstrap; +import com.osiris.autoplug.client.worlds.ManagedServer; +import com.osiris.autoplug.client.worlds.ServerLaunch; +import com.osiris.autoplug.client.utils.MineStat; +import com.osiris.dyml.Yaml; +import java.nio.file.*; +import java.nio.charset.StandardCharsets; +import java.net.*; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** Offline packaged smoke helper; invoke after Maven package. Runs actual packaged AutoPlug wrappers around test-only JVM servers. */ +public class ManagedWorldPackagedSmoke { + public static void main(String[] args) throws Exception { + Path repo = Paths.get(args[0]), root = Paths.get(args[1]); Files.createDirectories(root); + Path java = Paths.get(System.getProperty("java.home"), "bin", System.getProperty("os.name").toLowerCase().contains("win") ? "java.exe" : "java"); + int firstPort = port(), secondPort = port(); while (secondPort == firstPort) secondPort = port(); + Path first = Files.createDirectories(root.resolve("first world")), second = Files.createDirectories(root.resolve("second world")); + Profile profile = new Profile(); profile.gameVersion = "1.20.4"; profile.loader = "VANILLA"; profile.type = ProfileType.MODS_SERVER; + AutoPlugWorldBootstrap bootstrap = new AutoPlugWorldBootstrap(); + ServerLaunch a = configure(bootstrap, profile, java, repo, first, firstPort); + ServerLaunch b = configure(bootstrap, profile, java, repo, second, secondPort); + Process pa = start(a), pb; + try { pb = start(b); } catch (Exception e) { pa.descendants().forEach(ProcessHandle::destroyForcibly); pa.destroyForcibly(); throw e; } + try (ManagedServer one = new ManagedServer(pa, 15000, a.stopCommand, a.restartCommand); + ManagedServer two = new ManagedServer(pb, 15000, b.stopCommand, b.restartCommand)) { + ready(pa, firstPort); ready(pb, secondPort); + long original = child(pa, first); + if (original < 0 || child(pb, second) < 0) throw new IllegalStateException("Both wrappers must own a real test server process"); + one.command("say first world"); two.command("say second world"); one.restart(); + long deadline = System.nanoTime() + 90_000_000_000L; + while (System.nanoTime() < deadline && (child(pa, first) == original || child(pa, first) < 0)) { + if (!pa.isAlive()) throw new IllegalStateException("Wrapper exited on restart"); Thread.sleep(250); + } + if (child(pa, first) == original || child(pa, first) < 0) throw new IllegalStateException("Restart did not replace native server process"); + ready(pa, firstPort); + if (!Files.exists(first.resolve("stopped.txt"))) throw new IllegalStateException("Restart did not gracefully save the fixture server"); + one.close(); + if (pa.isAlive() || !pb.isAlive()) throw new IllegalStateException("First stop crossed instance boundaries"); + ready(pb, secondPort); + two.command("stop"); // Native server exit must make the wrapper auto-exit without its lifecycle lock blocking shutdown hooks. + if (!pb.waitFor(15, TimeUnit.SECONDS)) + throw new IllegalStateException("Second wrapper did not automatically exit after raw server stop; possible shutdown-hook deadlock"); + if (pb.exitValue() != 0) throw new IllegalStateException("Second wrapper automatic exit was not clean"); + two.close(); + String secondLog = new String(Files.readAllBytes(second.resolve("wrapper.log")), StandardCharsets.UTF_8); + if (!secondLog.contains("Stopping AutoPlug too")) throw new IllegalStateException("Automatic wrapper exit path was not exercised"); + String firstCommands = new String(Files.readAllBytes(first.resolve("commands.log")), StandardCharsets.UTF_8); + String secondCommands = new String(Files.readAllBytes(second.resolve("commands.log")), StandardCharsets.UTF_8); + if (!firstCommands.contains("say first world") || firstCommands.contains("say second world") + || !secondCommands.contains("say second world") || secondCommands.contains("say first world")) + throw new IllegalStateException("Console commands crossed world boundaries"); + for (Path dir : Arrays.asList(first, second)) { + if (!"graceful".equals(new String(Files.readAllBytes(dir.resolve("stopped.txt")), StandardCharsets.UTF_8))) throw new IllegalStateException("Not gracefully stopped"); + String config = new String(Files.readAllBytes(dir.resolve("autoplug/updater.yml")), StandardCharsets.UTF_8); + if (!config.contains(AutoPlugWorldBootstrap.UPDATER_POLICY)) throw new IllegalStateException("Managed policy comment was lost"); + if (Files.exists(dir.resolve("eula.txt"))) throw new IllegalStateException("Wrapper created EULA acceptance unexpectedly"); + } + System.out.println("PASS: actual packaged wrappers started two isolated fixture servers, restarted one, preserved the other, then saved and stopped both; raw server stop automatically exited its wrapper within 15 seconds. No Minecraft world or remote service used."); + } finally { + for (Process p : Arrays.asList(pa, pb)) if (p.isAlive()) { p.descendants().forEach(ProcessHandle::destroyForcibly); p.destroyForcibly(); } + } + } + static ServerLaunch configure(AutoPlugWorldBootstrap bootstrap, Profile profile, Path java, Path repo, Path dir, int port) throws Exception { + Files.write(dir.resolve("server.properties"), ("server-ip=127.0.0.1\nserver-port=" + port + "\n").getBytes(StandardCharsets.UTF_8)); + ServerLaunch launch = bootstrap.wrap(profile, new ServerLaunch(Arrays.asList(java.toString(), "-cp", repo.resolve("target/test-classes").toString(), "com.osiris.autoplug.client.worlds.WorldFixtureProcess", "server"), dir)); + // Disable animated terminal rendering for this redirected-output fixture only. + Yaml logger = new Yaml(dir.resolve("autoplug/logger.yml").toString()); logger.load(); logger.put("logger", "tasks", "live-tasks", "enable").setValues("false"); logger.save(); + return launch; + } + static Process start(ServerLaunch launch) throws Exception { return new ProcessBuilder(launch.command).directory(launch.directory.toFile()).redirectErrorStream(true).redirectOutput(launch.directory.resolve("wrapper.log").toFile()).start(); } + static int port() throws Exception { try (ServerSocket socket = new ServerSocket(0, 8, InetAddress.getByName("127.0.0.1"))) { return socket.getLocalPort(); } } + static long child(Process process, Path directory) throws Exception { + Path file = directory.resolve("fixture.pid"); + if (!Files.exists(file)) return -1; + long pid = Long.parseLong(new String(Files.readAllBytes(file), StandardCharsets.UTF_8).trim()); + return process.descendants().anyMatch(p -> p.pid() == pid && p.isAlive()) ? pid : -1; + } + static void ready(Process process, int port) throws Exception { + long deadline = System.nanoTime() + 90_000_000_000L; + while (System.nanoTime() < deadline) { + if (!process.isAlive()) throw new IllegalStateException("AutoPlug wrapper exited before fixture readiness"); + if (new MineStat("127.0.0.1", port, 1, MineStat.Request.JSON).isServerUp()) return; + Thread.sleep(250); + } + throw new IllegalStateException("Fixture never became ready; inspect wrapper.log"); + } +} diff --git a/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java b/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java index 4422b03c..6e2cc5ee 100644 --- a/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java +++ b/src/test/java/com/osiris/autoplug/client/worlds/WorldFixtureProcess.java @@ -11,6 +11,7 @@ public final class WorldFixtureProcess { public static void main(String[] args) throws Exception { if (args[0].equals("client")) { Thread.sleep(60000); return; } if (args[0].equals("exit")) return; + Files.write(Paths.get("fixture.pid"), Long.toString(ProcessHandle.current().pid()).getBytes(StandardCharsets.UTF_8)); Properties properties = new Properties(); try (InputStream input = Files.newInputStream(Paths.get("server.properties"))) { properties.load(input); } if (!"127.0.0.1".equals(properties.getProperty("server-ip"))) throw new IllegalStateException("Fixture must be local"); @@ -20,8 +21,11 @@ public static void main(String[] args) throws Exception { try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); String line; - while ((line = reader.readLine()) != null) if (line.equals("stop")) { - Files.write(Paths.get("stopped.txt"), "graceful".getBytes(StandardCharsets.UTF_8)); server.close(); return; + while ((line = reader.readLine()) != null) { + Files.write(Paths.get("commands.log"), (line + "\n").getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.APPEND); + if (line.equals("stop")) { + Files.write(Paths.get("stopped.txt"), "graceful".getBytes(StandardCharsets.UTF_8)); server.close(); return; + } } } catch (IOException ignored) { } }); diff --git a/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java b/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java index d9f4fd61..db15b9d9 100644 --- a/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java +++ b/src/test/java/com/osiris/autoplug/client/worlds/WorldServiceTest.java @@ -61,6 +61,20 @@ class WorldServiceTest { } } + @Test void moddedClientCanJoinVanillaWorldButNonVanillaLoadersMustMatch() throws Exception { + Fixture fixture = fixture(true); + Profile server = fixture.profiles.get(fixture.world.serverProfileId); + server.type = ProfileType.MODS_SERVER; server.loader = "FORGE"; fixture.profiles.save(server); + Profile client = fixture.profiles.get(fixture.world.clientProfileId); + client.loader = "FABRIC"; fixture.profiles.save(client); + try (WorldService service = service(fixture, port -> { throw new AssertionError("No sharing"); }, fixtureInstaller(), realProbe(), Duration.ofSeconds(10))) { + assertThrows(IllegalArgumentException.class, () -> service.launch(fixture.world.id, false)); + server.loader = "VANILLA"; fixture.profiles.save(server); + WorldSession session = service.launch(fixture.world.id, false); + assertTrue(session.server().isAlive()); + } + } + @Test void timeoutStopsTheRealChildAndDoesNotLaunchClient() throws Exception { Fixture fixture = fixture(true); AtomicReference server = new AtomicReference<>();

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 Oh?t!NgzA|;Z~qtS;;*3q literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/server-browser-dark.png b/docs/images/native-launcher/server-browser-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cf55060af4553604d9c5ca5e4eb3adeb3ed03172 GIT binary patch literal 63034 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 z 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 serverSort = new JComboBox<>(new String[]{"Favorite order", "Name", "Address", "Status", "MOTD", "Players", "Version", "Latency"}); + private final JToggleButton reverseServerSort = new JToggleButton("Descending"); + private final Map serverViews = new LinkedHashMap<>(); + private String selectedServerAddress; private final DefaultTableModel profileModel = model("Name", "Minecraft", "Loader", "Type", "Template", "Ready"); private final JTable profileTable = table(profileModel); private final JPanel worldCards = new WorldList(); @@ -120,19 +124,32 @@ public DashboardPanel(LauncherActions actions, ServerBrowserService browser, boo private JPanel serverPage() { JPanel page = page("Server Browser", "Your Minecraft favorites, with live status and matching local profiles."); - JPanel content = content(); - content.add(toolbar(button("Add server", this::addServer), iconButton("Import Minecraft", "import", () -> run("Importing favorites", () -> { + JPanel content = DashboardTheme.transparent(new BorderLayout(0, 12)); + JPanel controls = DashboardTheme.surface(new BorderLayout(0, 6), 10); + controls.add(toolbar(primaryButton("Add server", this::addServer), button("Import Minecraft", () -> run("Importing favorites", () -> { int count = browser.importVanilla(); return count; }, count -> { status.setText("Imported " + count + " new favorites from " + browser.vanillaFile()); refreshServers(); })), - iconButton("Refresh status", "refresh", this::refreshServers), primaryButton("Join selected", this::joinSelected), - iconButton("Ping selected", "ping", this::pingSelected), iconButton("Copy address", "copy", this::copyServerAddress), - iconButton("Edit server", "edit", this::editServer), iconButton("Remove", "delete", this::removeServer)), BorderLayout.NORTH); - serverTable.getColumnModel().getColumn(3).setPreferredWidth(220); + button("Refresh status", this::refreshServers)), BorderLayout.NORTH); + serverSearch.setName("server-search"); serverSearch.setToolTipText("Search favorites by name, address or server message"); + serverSearch.getAccessibleContext().setAccessibleName("Search servers"); + serverSearch.putClientProperty("JTextField.placeholderText", "Search your favorites"); + serverSort.setName("server-sort"); serverSort.getAccessibleContext().setAccessibleName("Sort servers"); + reverseServerSort.setName("server-sort-descending"); reverseServerSort.setIcon(DashboardTheme.icon("sort")); + reverseServerSort.setToolTipText("Reverse the selected sort order"); + controls.add(toolbar(new JLabel("Search"), serverSearch, new JLabel("Sort"), serverSort, reverseServerSort), BorderLayout.SOUTH); + serverSearch.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() { + public void insertUpdate(javax.swing.event.DocumentEvent e) { arrangeServerCards(); } + public void removeUpdate(javax.swing.event.DocumentEvent e) { arrangeServerCards(); } + public void changedUpdate(javax.swing.event.DocumentEvent e) { arrangeServerCards(); } + }); + serverSort.addActionListener(e -> arrangeServerCards()); reverseServerSort.addActionListener(e -> arrangeServerCards()); + content.add(controls, BorderLayout.NORTH); JPanel list = DashboardTheme.transparent(new BorderLayout(0, 10)); - DashboardTheme.tint(serverEmpty, false); serverEmpty.setBorder(new EmptyBorder(20, 0, 20, 0)); - list.add(serverEmpty, BorderLayout.NORTH); list.add(tableScroll(serverTable)); content.add(list, BorderLayout.CENTER); - JLabel note = new JLabel("Server pings show version and players. Mods and loaders come from your local profiles."); - note.setBorder(new EmptyBorder(12, 0, 0, 0)); content.add(note, BorderLayout.SOUTH); + serverCards.setName("server-cards"); + DashboardTheme.tint(serverEmpty, false); serverEmpty.setBorder(new EmptyBorder(40, 12, 40, 12)); + list.add(serverEmpty, BorderLayout.NORTH); list.add(DashboardTheme.scroll(serverCards)); content.add(list, BorderLayout.CENTER); + JTextArea note = textArea(1); note.setText("Server details come from live pings. Join uses your local profiles and keeps version checks in place."); + DashboardTheme.tint(note, false); content.add(note, BorderLayout.SOUTH); page.add(content, BorderLayout.CENTER); return page; } @@ -170,34 +187,187 @@ private void editServer() { } private void pingSelected() { SavedServer selected = selectedServer(); if (selected == null) return; + serverStatuses.remove(selected.address); serverViews.get(selected.address).update(null); int generation = pingGeneration; run("Checking " + selected.name, () -> browser.ping(selected), ping -> showPing(generation, selected, ping)); } private void showServers(List result) { - int generation = ++pingGeneration; - servers = result; serverModel.setRowCount(0); - serverEmpty.setVisible(servers.isEmpty()); - for (SavedServer server : servers) serverModel.addRow(new Object[]{server.name, server.address, "Checking…", "", "", "", ""}); + displayServers(result, Collections.emptyMap()); + int generation = pingGeneration; for (SavedServer server : servers) run("Checking " + server.name, () -> browser.ping(server), ping -> showPing(generation, server, ping)); } - private void showPing(int generation, SavedServer server, ServerStatus ping) { - if (generation != pingGeneration) return; - serverStatuses.put(server.address, ping); - for (int i = 0; i < servers.size(); i++) if (servers.get(i).address.equals(server.address)) { - serverModel.setValueAt(ping.online ? "Online" : "Unavailable", i, 2); - serverModel.setValueAt(ping.online && ping.motd != null ? ping.motd.replace('\n', ' ') : ping.message, i, 3); - serverModel.setValueAt(ping.online ? ping.players + " / " + ping.capacity : "—", i, 4); - serverModel.setValueAt(ping.online ? ping.version : "—", i, 5); - serverModel.setValueAt(ping.online ? ping.latency + " ms" : "—", i, 6); - } + /** Render a snapshot without network work; also used by deterministic preview fixtures. */ + int displayServers(List result, Map statuses) { + ++pingGeneration; servers = new ArrayList<>(result); serverStatuses.clear(); serverStatuses.putAll(statuses); + serverCards.removeAll(); serverViews.clear(); + for (SavedServer server : servers) { + ServerCard card = new ServerCard(server); serverViews.put(server.address, card); serverCards.add(card.panel); + card.update(serverStatuses.get(server.address)); + } + arrangeServerCards(); + return pingGeneration; + } + void showPing(int generation, SavedServer server, ServerStatus ping) { + if (generation != pingGeneration) return; + ServerCard card = serverViews.get(server.address); if (card == null) return; + serverStatuses.put(server.address, ping); card.update(ping); arrangeServerCards(); } private SavedServer selectedServer() { - int row = serverTable.getSelectedRow(); - if (row < 0) { status.setText("Select a server first."); return null; } - return servers.get(serverTable.convertRowIndexToModel(row)); + ServerCard selected = serverViews.get(selectedServerAddress); + if (selected != null && selected.panel.isVisible()) return selected.server; + status.setText("Select a server first."); return null; + } + private void arrangeServerCards() { + String query = serverSearch.getText().trim().toLowerCase(Locale.ROOT); + List ordered = new ArrayList<>(serverViews.values()); + String sort = String.valueOf(serverSort.getSelectedItem()); + Comparator order = (left, right) -> 0; + if ("Name".equals(sort)) order = Comparator.comparing(card -> card.server.name, String.CASE_INSENSITIVE_ORDER); + else if ("Address".equals(sort)) order = Comparator.comparing(card -> card.server.address, String.CASE_INSENSITIVE_ORDER); + else if ("Status".equals(sort)) order = Comparator.comparing(card -> card.state.getText()); + else if ("MOTD".equals(sort)) order = Comparator.comparing(card -> card.message.getText(), String.CASE_INSENSITIVE_ORDER); + else if ("Version".equals(sort)) order = Comparator.comparing(card -> card.version.getText(), String.CASE_INSENSITIVE_ORDER); + else if ("Players".equals(sort)) order = Comparator.comparingInt(card -> { + ServerStatus value = serverStatuses.get(card.server.address); return value != null && value.online ? value.players : -1; + }); + else if ("Latency".equals(sort)) order = Comparator.comparingLong(card -> { + ServerStatus value = serverStatuses.get(card.server.address); return value != null && value.online ? value.latency : Long.MAX_VALUE; + }); + if (!"Favorite order".equals(sort)) ordered.sort(order.thenComparing(card -> card.server.address)); + if (reverseServerSort.isSelected()) Collections.reverse(ordered); + ServerCard firstVisible = null; int index = 0; + for (ServerCard card : ordered) { + serverCards.setComponentZOrder(card.panel, index++); + String text = card.server.name + " " + card.server.address + " " + card.message.getText() + " " + card.version.getText(); + boolean visible = query.isEmpty() || text.toLowerCase(Locale.ROOT).contains(query); + card.panel.setVisible(visible); if (visible && firstVisible == null) firstVisible = card; + } + ServerCard selected = serverViews.get(selectedServerAddress); + if (selected == null || !selected.panel.isVisible()) selectedServerAddress = firstVisible == null ? null : firstVisible.server.address; + for (ServerCard card : ordered) card.selectionChanged(); + serverEmpty.setText(servers.isEmpty() ? "Add a server or import Minecraft favorites to get started." : "No favorites match your search."); + serverEmpty.setVisible(firstVisible == null); + serverCards.revalidate(); serverCards.repaint(); + } + private void selectServer(SavedServer server, boolean focus) { + selectedServerAddress = server.address; + for (ServerCard card : serverViews.values()) card.selectionChanged(); + ServerCard selected = serverViews.get(server.address); + if (selected != null && focus) { + selected.select.requestFocusInWindow(); + serverCards.scrollRectToVisible(selected.panel.getBounds()); + } + } + private void navigateServer(SavedServer server, int offset) { + List visible = new ArrayList<>(); + for (Component component : serverCards.getComponents()) if (component.isVisible()) + for (ServerCard card : serverViews.values()) if (card.panel == component) visible.add(card); + for (int i = 0; i < visible.size(); i++) if (visible.get(i).server.address.equals(server.address)) { + int next = Math.max(0, Math.min(visible.size() - 1, i + offset)); selectServer(visible.get(next).server, true); return; + } + } + private final class ServerCard { + final SavedServer server; + final JPanel panel = DashboardTheme.surface(new BorderLayout(0, 12), 16); + final JToggleButton select; + final JLabel state = DashboardTheme.badge("Checking…"); + final JTextArea message = textArea(2); + final JLabel players = serverDetail("Players: —", "players"), version = serverDetail("Version: —", "version"), latency = serverDetail("Latency: —", "ping"); + ServerCard(SavedServer server) { + this.server = server; panel.setName("server-" + server.address); + panel.getAccessibleContext().setAccessibleName("Favorite server " + server.name); + JPanel heading = DashboardTheme.transparent(new BorderLayout(10, 0)); + JLabel icon = new JLabel(DashboardTheme.serverIcon()); icon.setToolTipText("Saved Minecraft server"); heading.add(icon, BorderLayout.WEST); + JPanel identity = DashboardTheme.transparent(new BorderLayout(0, 3)); + select = new JToggleButton(); select.putClientProperty("html.disable", Boolean.TRUE); select.setText(server.name); + select.setName("select-server-" + server.address); select.setHorizontalAlignment(SwingConstants.LEFT); + select.setFont(select.getFont().deriveFont(Font.BOLD, 16f)); select.setMargin(new Insets(4, 5, 4, 5)); + select.setToolTipText("Server: " + server.name + " — " + server.address); select.getAccessibleContext().setAccessibleName("Select server " + server.name); + select.getAccessibleContext().setAccessibleDescription("Arrow keys move between cards; Enter joins this server; Space selects it."); + select.addActionListener(e -> selectServer(server, false)); + select.addFocusListener(new java.awt.event.FocusAdapter() { @Override public void focusGained(java.awt.event.FocusEvent e) { selectServer(server, false); } }); + identity.add(select, BorderLayout.NORTH); + JLabel address = serverDetail(server.address, "address"); address.setName("server-address"); identity.add(address, BorderLayout.SOUTH); + heading.add(identity); panel.add(heading, BorderLayout.NORTH); + JPanel body = DashboardTheme.transparent(new BorderLayout(0, 10)); + JPanel stateRow = DashboardTheme.transparent(new FlowLayout(FlowLayout.LEFT, 0, 0)); state.setName("server-status"); stateRow.add(state); body.add(stateRow, BorderLayout.NORTH); + message.setName("server-message"); message.setFocusable(false); message.setPreferredSize(new Dimension(100, 40)); DashboardTheme.tint(message, false); + body.add(message, BorderLayout.CENTER); + JPanel facts = DashboardTheme.transparent(new GridLayout(3, 1, 0, 5)); + players.setName("server-players"); version.setName("server-version"); latency.setName("server-latency"); + facts.add(players); facts.add(version); facts.add(latency); body.add(facts, BorderLayout.SOUTH); panel.add(body); + JPanel controls = toolbar(primaryButton("Join", () -> { selectServer(server, false); joinSelected(); }), + iconButton("Ping selected", "ping", () -> { selectServer(server, false); pingSelected(); }), + iconButton("Copy address", "copy", () -> { selectServer(server, false); copyServerAddress(); }), + iconButton("Edit server", "edit", () -> { selectServer(server, false); editServer(); }), + iconButton("Remove", "delete", () -> { selectServer(server, false); removeServer(); })); + for (Component child : controls.getComponents()) if (child instanceof AbstractButton) { + AbstractButton action = (AbstractButton) child; + action.getAccessibleContext().setAccessibleDescription(action.getToolTipText() + " for " + server.name + " at " + server.address); + action.addFocusListener(new java.awt.event.FocusAdapter() { @Override public void focusGained(java.awt.event.FocusEvent e) { selectServer(server, false); } }); + } + panel.add(controls, BorderLayout.SOUTH); + bindServerKey("LEFT", "previous-server", () -> navigateServer(server, -1)); + bindServerKey("RIGHT", "next-server", () -> navigateServer(server, 1)); + bindServerKey("UP", "previous-server-row", () -> navigateServer(server, -serverCards.columns())); + bindServerKey("DOWN", "next-server-row", () -> navigateServer(server, serverCards.columns())); + bindServerKey("ENTER", "join-server", () -> { selectServer(server, false); joinSelected(); }); + java.awt.event.MouseAdapter click = new java.awt.event.MouseAdapter() { + @Override public void mousePressed(java.awt.event.MouseEvent e) { selectServer(server, true); } + }; + for (Component child : new Component[]{panel, heading, icon, address, body, stateRow, state, message, facts, players, version, latency}) child.addMouseListener(click); + } + private void bindServerKey(String key, String name, Runnable action) { + select.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(key), name); + select.getActionMap().put(name, new AbstractAction() { @Override public void actionPerformed(java.awt.event.ActionEvent event) { action.run(); } }); + } + void selectionChanged() { + boolean selected = server.address.equals(selectedServerAddress); select.setSelected(selected); + panel.putClientProperty("AutoPlug.selected", selected); panel.repaint(); + } + void update(ServerStatus ping) { + state.setText(ping == null ? "Checking…" : ping.online ? "Online" : "Unavailable"); + state.setIcon(DashboardTheme.icon(ping != null && ping.online ? "online" : ping == null ? "ping" : "offline-server")); + String detail = ping == null ? "Checking this server’s status…" : ping.online ? Objects.toString(ping.motd, "") : Objects.toString(ping.message, "Status unavailable"); + message.setText(detail); message.setCaretPosition(0); message.setToolTipText("Server message: " + detail); message.getAccessibleContext().setAccessibleName("Server message: " + detail); + players.setText("Players: " + (ping != null && ping.online ? ping.players + " / " + ping.capacity : "—")); + version.setText("Minecraft: " + (ping != null && ping.online ? Objects.toString(ping.version, "—") : "—")); + latency.setText("Latency: " + (ping != null && ping.online ? ping.latency + " ms" : "—")); + for (JLabel fact : new JLabel[]{players, version, latency}) fact.setToolTipText(fact.getText()); + } + } + private static JLabel serverDetail(String text, String icon) { + JLabel label = new JLabel(); label.putClientProperty("html.disable", Boolean.TRUE); label.setText(text); + label.setIcon(DashboardTheme.icon(icon)); label.setHorizontalAlignment(SwingConstants.LEFT); + label.setToolTipText("Details: " + text); DashboardTheme.tint(label, false); return label; + } + private static final class ServerGrid extends JPanel implements Scrollable { + private static final int GAP = 14, CARD_HEIGHT = 322; + private int previousColumns; + ServerGrid() { super(null); setOpaque(false); } + int columns() { return getWidth() >= 800 ? 2 : 1; } + @Override public void doLayout() { + int columns = columns(), width = Math.max(0, (getWidth() - GAP * (columns - 1)) / columns), index = 0; + for (Component card : getComponents()) if (card.isVisible()) { + card.setBounds((index % columns) * (width + GAP), (index / columns) * (CARD_HEIGHT + GAP), width, CARD_HEIGHT); index++; + } + if (previousColumns != columns) { previousColumns = columns; revalidate(); } + } + @Override public Dimension getPreferredSize() { + int count = 0; for (Component card : getComponents()) if (card.isVisible()) count++; + int rows = (count + columns() - 1) / columns(); return new Dimension(0, Math.max(0, rows * (CARD_HEIGHT + GAP) - GAP)); + } + @Override public Dimension getPreferredScrollableViewportSize() { return new Dimension(800, 520); } + @Override public int getScrollableUnitIncrement(Rectangle visible, int orientation, int direction) { return 24; } + @Override public int getScrollableBlockIncrement(Rectangle visible, int orientation, int direction) { return Math.max(24, visible.height - 24); } + @Override public boolean getScrollableTracksViewportWidth() { return true; } + @Override public boolean getScrollableTracksViewportHeight() { return false; } } private void joinSelected() { SavedServer server = selectedServer(); if (server == null) return; + joinServer(server); + } + private void joinServer(SavedServer server) { ServerStatus ping = serverStatuses.get(server.address); String targetVersion = ping != null && ping.online ? gameVersionFromStatus(ping.version) : ""; List clients = clientProfiles(); @@ -205,7 +375,7 @@ private void joinSelected() { run("Preparing your default Minecraft profile", () -> { actions.ensureDefaultProfiles(targetVersion); return actions.profiles(); }, result -> { profiles = result; showProfiles(); refreshDefaultProfiles(); if (clientProfiles().isEmpty()) information("Default profile unavailable", "AutoPlug could not prepare the default client. Check the activity details and try again."); - else joinSelected(); + else joinServer(server); }); return; } ProfileInfo base = preferredBase(clients); diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java index 510bd91b..232feaf7 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java @@ -57,7 +57,19 @@ public void paintIcon(Component component, Graphics graphics, int x, int y) { g.setColor(component.isEnabled() ? component.getForeground() : muted()); g.setStroke(new BasicStroke(1.6f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); String key = action.toLowerCase(java.util.Locale.ROOT); - if (key.contains("play") || key.contains("launch") || key.contains("join") || key.equals("start")) { + if (key.equals("players")) { + g.drawOval(3, 2, 5, 5); g.drawOval(10, 4, 4, 4); g.drawArc(1, 9, 10, 11, 0, 180); g.drawArc(9, 10, 8, 9, 0, 150); + } else if (key.equals("version")) { + g.drawRoundRect(2, 3, 14, 12, 2, 2); g.drawLine(2, 7, 16, 7); g.fillOval(4, 4, 1, 1); g.drawLine(5, 10, 8, 10); g.drawLine(5, 12, 12, 12); + } else if (key.equals("address")) { + g.drawRoundRect(2, 5, 9, 7, 4, 4); g.drawRoundRect(7, 8, 9, 7, 4, 4); + } else if (key.equals("sort")) { + g.drawLine(5, 3, 5, 15); g.drawLine(2, 6, 5, 3); g.drawLine(8, 6, 5, 3); g.drawLine(12, 3, 12, 15); g.drawLine(9, 12, 12, 15); g.drawLine(15, 12, 12, 15); + } else if (key.equals("online")) { + g.drawOval(2, 2, 14, 14); g.drawPolyline(new int[]{5, 8, 13}, new int[]{9, 12, 6}, 3); + } else if (key.equals("offline-server")) { + g.drawOval(2, 2, 14, 14); g.drawLine(5, 9, 13, 9); + } else if (key.contains("play") || key.contains("launch") || key.contains("join") || key.equals("start")) { Path2D p = new Path2D.Float(); p.moveTo(5, 3); p.lineTo(15, 9); p.lineTo(5, 15); p.closePath(); g.fill(p); } else if (key.contains("folder") || key.contains("configuration")) { Path2D p = new Path2D.Float(); p.moveTo(2, 5); p.lineTo(7, 5); p.lineTo(9, 7); p.lineTo(16, 7); p.lineTo(15, 15); p.lineTo(2, 15); p.closePath(); g.draw(p); @@ -196,6 +208,24 @@ static JLabel worldThumbnail() { label.setPreferredSize(new Dimension(96, 96)); return label; } + /** An original fallback symbol, not a fetched server logo. */ + static Icon serverIcon() { + return new Icon() { + public int getIconWidth() { return 52; } + public int getIconHeight() { return 52; } + public void paintIcon(Component component, Graphics graphics, int x, int y) { + Graphics2D g = (Graphics2D) graphics.create(); + try { + g.translate(x, y); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(dark() ? new Color(0x263E61) : new Color(0xEAF2FF)); g.fillRoundRect(0, 0, 52, 52, ARC, ARC); + g.setColor(accent()); g.setStroke(new BasicStroke(1.8f)); + g.drawRoundRect(12, 12, 28, 12, 4, 4); g.drawRoundRect(12, 29, 28, 12, 4, 4); + g.fillOval(17, 17, 3, 3); g.fillOval(17, 34, 3, 3); g.drawLine(25, 18, 34, 18); g.drawLine(25, 35, 34, 35); + } finally { g.dispose(); } + } + }; + } + private static final class Surface extends JPanel { Surface(LayoutManager layout) { super(layout); setOpaque(false); } @Override public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, getPreferredSize().height); } @@ -207,8 +237,10 @@ private static final class Surface extends JPanel { Color bottom = dark() ? new Color(32, 41, 56, 230) : new Color(250, 252, 255, 225); g.setPaint(new GradientPaint(0, 0, top, 0, Math.max(1, getHeight()), bottom)); g.fillRoundRect(0, 0, getWidth(), getHeight(), ARC, ARC); - g.setColor(dark() ? new Color(149, 171, 204, 55) : new Color(209, 219, 234, 190)); - g.draw(new RoundRectangle2D.Float(.5f, .5f, getWidth() - 1f, getHeight() - 1f, ARC, ARC)); + boolean selected = Boolean.TRUE.equals(getClientProperty("AutoPlug.selected")); + g.setColor(selected ? accent() : dark() ? new Color(149, 171, 204, 55) : new Color(209, 219, 234, 190)); + g.setStroke(new BasicStroke(selected ? 2f : 1f)); + g.draw(new RoundRectangle2D.Float(1f, 1f, getWidth() - 2f, getHeight() - 2f, ARC, ARC)); } finally { g.dispose(); } super.paintComponent(graphics); } diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index 5ac0056a..9b622693 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -3,6 +3,8 @@ import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.FlatDarkLaf; import com.osiris.autoplug.client.browser.ServerBrowserService; +import com.osiris.autoplug.client.browser.SavedServer; +import com.osiris.autoplug.client.browser.ServerStatus; import com.osiris.autoplug.client.ui.LauncherActions.*; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -12,6 +14,9 @@ import java.awt.image.BufferedImage; import java.nio.file.*; import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -90,12 +95,120 @@ class DashboardPanelTest { assertTrue(grid.getComponent(1).getY() >= grid.getComponent(0).getHeight()); assertTrue(runtime.getWidth() >= 80); assertEquals("/chosen/java", runtime.getText()); assertNotNull(findButton(panel.get(), "Save settings")); - AbstractButton copy = findAccessibleButton(panel.get(), "Copy address"); - assertNotNull(copy); assertNotNull(copy.getIcon()); assertEquals("Copy address", copy.getToolTipText()); + AbstractButton importer = findAccessibleButton(panel.get(), "Import Minecraft"); + assertNotNull(importer); assertNotNull(importer.getIcon()); assertEquals("Import Minecraft", importer.getToolTipText()); }); } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } } + @Test void serverCardJoinKeepsAddressThroughRefreshDuringDefaultPreparation() throws Exception { + CountDownLatch preparing = new CountDownLatch(1), release = new CountDownLatch(1), launched = new CountDownLatch(1); + AtomicBoolean prepared = new AtomicBoolean(); AtomicReference> request = new AtomicReference<>(); + ProfileInfo client = new ProfileInfo("ready", "Default", "1.21.1", "VANILLA", "MODS", "", false); + LauncherActions actions = new LauncherActions() { + @Override public List profiles() { return prepared.get() ? Arrays.asList(client) : Collections.emptyList(); } + @Override public ProfileInfo ensureDefaultProfiles(String version) throws Exception { + assertFalse(SwingUtilities.isEventDispatchThread()); assertEquals("1.21.1", version); + preparing.countDown(); assertTrue(release.await(4, TimeUnit.SECONDS)); prepared.set(true); return client; + } + @Override public void launchProfile(String id, String host, int port) { + assertFalse(SwingUtilities.isEventDispatchThread()); request.set(Arrays.asList(id, host, String.valueOf(port))); launched.countDown(); + } + }; + SavedServer first = new SavedServer("Same name", "first.example.invalid:25566"), second = new SavedServer("Same name", "second.example.invalid:25567"); + Map statuses = new LinkedHashMap<>(); statuses.put(first.address, onlineStatus("First", "1.21.1")); statuses.put(second.address, onlineStatus("Second", "1.21.1")); + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + panel.get().displayServers(Arrays.asList(first, second), statuses); + findButton(findNamed(panel.get(), "server-" + first.address), "Join").doClick(); + }); + assertTrue(preparing.await(4, TimeUnit.SECONDS)); + SwingUtilities.invokeAndWait(() -> { + panel.get().displayServers(Arrays.asList(second, first), statuses); + ((AbstractButton) findNamed(panel.get(), "select-server-" + second.address)).doClick(); + }); + release.countDown(); assertTrue(launched.await(4, TimeUnit.SECONDS)); + assertEquals(Arrays.asList("ready", "first.example.invalid", "25566"), request.get()); + } finally { release.countDown(); SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void serverCardsRejectStalePingsAndKeepCurrentVersionForKeyboardJoin() throws Exception { + CountDownLatch launched = new CountDownLatch(1); AtomicReference launchedProfile = new AtomicReference<>(); + LauncherActions actions = new LauncherActions() { + @Override public List profiles() { return Arrays.asList( + new ProfileInfo("newer", "Newer", "1.21.1", "VANILLA", "MODS", "", false), + new ProfileInfo("older", "Older", "1.20.1", "VANILLA", "MODS", "", false)); } + @Override public void launchProfile(String id, String host, int port) { launchedProfile.set(id); launched.countDown(); } + }; + SavedServer first = new SavedServer("First", "first.example.invalid"), removed = new SavedServer("Removed", "removed.example.invalid"); + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(actions, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + int oldGeneration = panel.get().displayServers(Arrays.asList(first, removed), Collections.emptyMap()); + assertTrue(containsText(findNamed(panel.get(), "server-" + first.address), "Checking…")); + int generation = panel.get().displayServers(Arrays.asList(first), Collections.emptyMap()); + panel.get().showPing(generation, first, onlineStatus("Current message", "1.20.1")); + panel.get().showPing(oldGeneration, first, onlineStatus("Stale message", "1.21.1")); + panel.get().showPing(oldGeneration, removed, onlineStatus("Removed result", "1.21.1")); + Container card = findNamed(panel.get(), "server-" + first.address); + assertTrue(containsText(card, "Current message")); assertTrue(containsText(card, "1.20.1")); + assertFalse(containsText(card, "Stale message")); assertNull(findNamed(panel.get(), "server-" + removed.address)); + AbstractButton select = (AbstractButton) findNamed(card, "select-server-" + first.address); + Object binding = select.getInputMap(JComponent.WHEN_FOCUSED).get(KeyStroke.getKeyStroke("ENTER")); + assertNotNull(binding); select.getActionMap().get(binding).actionPerformed(new java.awt.event.ActionEvent(select, 0, "keyboard")); + }); + assertTrue(launched.await(4, TimeUnit.SECONDS)); assertEquals("older", launchedProfile.get()); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + @Test void serverCardsReflowFilterAndDisplayLiteralTextWithoutLosingControls() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> { FlatLightLaf.setup(); panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false)); }); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + SavedServer first = new SavedServer("Literal 雪 — A very long Minecraft favorite name", "first.example.invalid"), second = new SavedServer("Other", "second.example.invalid"); + Map statuses = new LinkedHashMap<>(); + statuses.put(first.address, onlineStatus("\nWelcome 雪", "Paper 1.21.1")); + statuses.put(second.address, new ServerStatus(false, "", "", 0, 0, 0, 0, "Connection refused")); + panel.get().displayServers(Arrays.asList(first, second), statuses); + Container firstCard = findNamed(panel.get(), "server-" + first.address), secondCard = findNamed(panel.get(), "server-" + second.address); + AbstractButton title = (AbstractButton) findNamed(firstCard, "select-server-" + first.address); + assertEquals(first.name, title.getText()); assertNull(title.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey)); + assertTrue(containsText(firstCard, " firstCard.getX()); + ((AbstractButton) findNamed(secondCard, "select-server-" + second.address)).doClick(); + ((JComboBox) findNamed(panel.get(), "server-sort")).setSelectedItem("Name"); + assertTrue(((AbstractButton) findNamed(secondCard, "select-server-" + second.address)).isSelected()); + panel.get().setSize(950, 620); for (int i = 0; i < 5; i++) layout(panel.get()); + assertEquals(firstCard.getX(), secondCard.getX()); assertNotEquals(firstCard.getY(), secondCard.getY()); + for (String action : new String[]{"Join", "Ping selected", "Copy address", "Edit server", "Remove"}) { + AbstractButton button = findAccessibleButton(firstCard, action); + Rectangle bounds = SwingUtilities.convertRectangle(button.getParent(), button.getBounds(), firstCard); + assertTrue(bounds.width > 0 && bounds.x >= 0 && bounds.x + bounds.width <= firstCard.getWidth(), action + " must fit within its card"); + } + JTextField search = (JTextField) findNamed(panel.get(), "server-search"); search.setText("first.example"); + assertTrue(firstCard.isVisible()); assertFalse(secondCard.isVisible()); assertTrue(title.isSelected()); + search.setText("no matching favorite"); assertFalse(firstCard.isVisible()); assertTrue(containsText(panel.get(), "No favorites match")); + search.setText(""); panel.get().displayServers(Collections.emptyList(), Collections.emptyMap()); + assertEquals(0, findNamed(panel.get(), "server-cards").getComponentCount()); assertTrue(containsText(panel.get(), "Add a server or import")); + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + + private static ServerStatus onlineStatus(String message, String version) { return new ServerStatus(true, message, version, 12, 40, 0, 38, "SUCCESS"); } + @Test void parallelDownloadCompletionKeepsProgressVisibleUntilLastTransferEnds() throws Exception { AtomicReference panel = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); @@ -279,8 +392,15 @@ public static void main(String[] args) throws Exception { panel.set(new DashboardPanel(fixtures(new AtomicBoolean(), calls), new ServerBrowserService(data.resolve("servers.json"), data.resolve("servers.dat")), true)); }); calls.await(4, TimeUnit.SECONDS); - // Waiting behind the worker callbacks allows the fixture models to arrive before printing. - Thread.sleep(250); + // The empty local import finishes before injecting render-only examples; no server is pinged. + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + SavedServer online = new SavedServer("Quiet Cove", "cove.example.invalid"), unavailable = new SavedServer("Skyline Survival", "skyline.example.invalid:25566"), checking = new SavedServer("Weekend Adventure", "weekend.example.invalid"); + Map statuses = new LinkedHashMap<>(); + statuses.put(online.address, onlineStatus("A relaxed place to build, explore, and meet friends.\nNew adventures every weekend.", "Paper 1.21.1")); + statuses.put(unavailable.address, new ServerStatus(false, "", "", 0, 0, 0, 0, "Could not reach the server. Try again when it is online.")); + panel.get().displayServers(Arrays.asList(online, unavailable, checking), statuses); + }); try { for (String view : new String[]{"Server Browser", "Worlds", "Profiles", "Server Manager", "Settings"}) { SwingUtilities.invokeAndWait(() -> findButton(panel.get(), view).doClick()); From 7bdd01598e17cbf7f6ea7474da39dc03947ef7a4 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 21:39:42 +0200 Subject: [PATCH 8/9] Fix reentrant wrapped-text layout invalidation in dashboard --- docs/images/native-launcher/settings.png | Bin 50101 -> 51580 bytes docs/images/native-launcher/worlds.png | Bin 68985 -> 70822 bytes docs/native-launcher.md | 10 +- .../autoplug/client/ui/DashboardPanel.java | 11 +- .../autoplug/client/ui/DashboardTheme.java | 13 + .../client/ui/DashboardDisplayableTest.java | 282 ++++++++++++++++++ .../client/ui/DashboardPanelTest.java | 33 ++ 7 files changed, 344 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java diff --git a/docs/images/native-launcher/settings.png b/docs/images/native-launcher/settings.png index 7e90e0cbdb97a26e377f0ad2cd4bf9ce3850bbfd..5c199b3cb2c71060518eb8b5b56e48a0260634b1 100644 GIT binary patch literal 51580 zcmeFZWmweh`ZhXBND2r_Hxiu97t}AxzpSa^}=s@N|;f-g+!< zcH{I*Nr`}@IU*Pn_V=3Nedr2o0ff(+@_uh$>n-xfmp z{qN^ENW#Bg(xyGd{QZ!pSP0&jzyBRTi|PCOrM$?S|NdyZ$4H8UEX4Tg>gt>}(+-Wg zRiYz^TI3E%eZv&m!caH{K|D0Xl5cyDf+@|KbeUoioMI$+O}v>XDFYRF9v+EkYA6Lg zVd0^hle`TfSZVy&>BA7wmB6_gkHwfV`KA*C0?8+r8>na!I`n5{T{jkHiQs@h7APN^ zDHdny$JrIehIO~UA?tEbo|knC@X4wnDGYn}Qo{qqhdaqZuWwNZ7g_6(Lqp#ON^M#0 zhm?bdq+J}%j;C6IiW_wJcdHg`s;U>)+*m*IYu?n-fc^R;qL!{QwX1VMOffD1M;9HdIAaRqNC z_U^+~vU4wi5i7UGNeG@0F4}p0z~t0m{?9!)$m`n=v(1Pk2q6%ZutaLB=L(ovyv4ND z^Vg?Ow{)*n!{Zs;UYLKod9GB*@8>?|mK+brAnWR?i8Ga|e_(;T4EGeV%K2Wz;CCr0 z#Fw7n@PD>t+rlPI`)VPwjDilSq&V@#7biE#w_NxTmcC|t_7(reF-6PAMGGXLpd}!GTgrAXE9;UX6>)AV@Sbz*!IjWsBc!rwkM$(j_Zr1dhdH2 zBKUWN zz*;|uQ(FQ1QhR&xJoo?q^8fJ-`&Kh&QSN``O+ilnMZLuM{v)NG-CeBX+mNS1%HBVC^RiBQF^8jVK@5PX!-0yPY$JOa_GZSMPW(_>#o6IU(&nL_;Y|L*=jDt(fCREUV z_?gJss)p$9?{$+-txBPlAa?6_wZACho*DXlK0Klm=m~iZy(NUicehXC-_xeA%nF3U-q6PKq9-M1Y$9We+dnuDRY zAkM_#_9~O>o9W-~#2_%)->#=wzC-HS#vgx>x7rhYxLEncs@e(JUqaMA&a#+;b1A6C zp;G(u3|QAkzSFh5!o840%WQ!H$q%zw%flYf&GE~n1e<|`p-4G_O3N|3!y0pkk#FAD zTab=*uX8&z0G1I&j1fu=UkibOwy;^+iw>_U07ly}^tsd2PCMNS@Jcp+${gXqIc<{T8irdF0 zVwY2%y3hGmM9EG&zErxJ+IHzRApu7v{k;432CG}Tf8lpMkjEIUu$>4VY*SIh+*f}_~(Qy zUdYFfAj|pJ<@z=qoYSAL&T2lCt7tM^b2?<&pXTRUNUc^YQ58O(=4yzdXobOlfH~1z z7w-(N9!Wk)7#rb4jnk&<{!({m3}dfY#d5OScjt5&_N8a|pIh5>svOMrbm~2QtRj4~ zx+5M+70Yz9IB*8vjW@=I{LB>3`s)r%6U9PE_FqWgP95a&3LliNcl%D}5XKG4%v~PO z(8vL+BH%C=!On#mwaa|Y$WYL%OnP)WeTURNjDu09vV(&dKW^iha5s)RqJ=z$Y`i*u zMb{_s9y7jpnRKI)Nm@#9GDjyHsHaL)EAi$IFa8c1CWBpJi>VrRWavZ#DMl|oM zeq5~+#WC#0-oTQufv#y_iR-pZ9p2*OD0Xr%DCaRr;CQgYyuZx&5o&a(&8%IL+u}}} zeu#HE=8*x6!g9YQ7?1Qg)gZz0)lu6I%ZDka)R1pd;nMT@C|FY1*lN-8ZsK=6w6pJW z*W2`ayEqIMZXu;q*v~IRmqbb0IV8#rSKA5qyYnaJJ~{8sEfi|kR=KLGI4LGz^x)W7 zzT}&bE*smfJ=X5tK$~KZMN3Xs_9xlzW-;nG$%#&ivK$P;fY8$ZwR}{Knhu$tHmXVr zd}k}^0$bPUpI=t8SbaJ+_cr3lQ_7v2ue&o`knxHp9a#9+Jm7|KDH)$X*I6H`EZIWZ zsAb)e$E+Qbi)T|WQ4KP&Ijt(EiNi4ZNW9_%%X+M5Hk(!xrRm-ArRHC1 zH`X88FLjlUeb8%qYq7*K!{&kvtXsIaOgCH~itRk`k;-FMf8p$qP}}R$k@Q#wC0q8o zU0-^j(A778!_FY2IPS$+T0^_sJ=uBAlyUd{V9x2C$|T=Ht$HCzHSCW+kl40f7R^-+HRLq?JWGJE6Sj`oZwVfbZq9;PvdSUV-y`<3haaZLjNu*1V=-V&LUPudF7@EH0V@?oW7; zz21CytNl`rZx`NTr?QJvM*BA8TVPoJ6Sa)dDfncHAyJm47#)s1yvT!2FMX{()$}t)){xVorG$$wX6uE+)S0@#Dq<~3|usW)|n56z-YCN;LLrORlCoj0%=}2 zN@_#`c1o-SB}L zY2Y41cvqG25a94(mE^a)@Eda?#!(r1jx{zPD(K1nNCOQHq80?R3rt^se~ArTrS^CZ zD~*XuxU8VE8#743GN?xlh-jK5rnL|0xJpFC+0Se&L{(Z8NK5x-MoK~uFw*3?} zUS`qiC5Z)*F9KCV^KBt6lb)9aNh+T;x>KOi9L_~4)Un%pm5QdTXT!3=yRiojtsnpj zoGxHTf9i-~yxywbmW^fVw^lXG3JI0_*>mrqWGs9jiM=4!{rgju_9jRCmK~|JZpTZ4 z+gXI$o3IM_wJN2$W|8<8UQo5rhf9wKAb9TpPj0f8<*+)yk#O1ZA@8F9XwE?Q>fW<^ z#gdytc&HWbrzq!R6#d%Hvwrr=jm1e692_CMAW^os_t>@TQY@4tPwh*ZE92O5idVt3 zQY-H5|JcIcHPOR*1U-@OE)3Ue!+EWV+jZv*BYZ+a4QtL@$Kheh=GiT#HX0gd7KOE0 zQ>n$cI_@tnxl>(nq1Mwie!O`qpUuHo(iZ^{jdhMz)@!yXw_tVq&*9&u1c7{$1ojv) z_HkM@a064g?H@p+=@gAm_wFMj`@ebfj_uJ4epzw| z3_qwLXdn0fw~}yA6LT-y0o>JiFQV)^i?9040e9b7xVPx&i^B&0q+UXO+?&k*?pzfd z?_dR522oZO{`SG^kN0gB|1)DqnbsS|(M0lcw@hs2F zvo$RccSvSR%?6FPmSsti)s5=bXWx-7T}j0-*n24{u^q=S>S#lWf-mPuuet1(@=r6; zTEFX5+8J#r37WH0QkIDL-_v)W{qGA>#w@d%h_)caw&?qKYdh@-%B$#$?G=CP($7j2K}P( z$juJ0!0x0MFZw6tIu!3GU$WGo!l0fVb1I8KX(-ht0zeC1gFE%`8h#d-^w4HAn`@S;@aj)%p1dA2Nm&g^j}sO_>*?>% zab115m2vp$8swnLvtx`+)i(fCp(u!+u)G;uqoR8t%q^slT>uBu>DT?;Kl1zQ{`A(J z*TCLbmgx&?8k2N94u?xEMtYM_2QQ*O8YjZ?qiq7NS7h~Y_8n2Vlh>mLp_`MH^xR`k zKc9ZXmg8%xn=8FZYrs z{CxoU*Bb=lVG6vSlF|XJNKoqLKb}nY%tEE1nB!9wIG%Rf1{FrzSgjj$Ya#1ur&}yc zg57*betVHQAR_IGO!jN}v@5;ObeVN%`t-vB6(88}DO|P+m-of2FFrD3FCUu!>w@2> zh^7X6kS_wt>r*PE)?mV3<>0eyVzwGk-SJs=#eU(Osu$laufGiD^_bMK9V=cm4>b-0 z^{!$N&+As-cVc*EjUW;}7t>J$XStA4Bls)#iBVa(6=E)$X&m=7>pjhTis7d!U%K z_>r$(W;q7(xti0Z1WOX{niamB%#?(BZOqv3c_F| znfvKOw7FyxvBEnyzNxw_PB_FhF{`i3}UG8eQMc0X3a(K|0DXz)NK+)5r+P<(7dx&vvF+H6$f)B2- z?iA>^fe+ngb#Ix)Hfe^S%GXQR1tr#DLY`uY-Jl={&A`ucSdAYTw1&_;d`LqxakMd} zS?lUpfC$Xa<e%W8EhL|3KyuDtO7;*Bw6b^Ke z``~V^Cv0W>$tCw7Pg6yHU%=Rp(L8s&L;8$G45RR}{G)uK;T!b$)Di0;6jjewc|a^j zy2(Nx;AkK_Pjp1lmFPAIGuL72W|D2J@VX8pen``K66c&ipt$_mY{C>wITP3-Np#{l_8ISkx|S4Cf|Wjz{kcx4Um+3)Sra+7hM;qSmj{W9?Ihth6wT z)!8;`mQ&3m3>qr>HIbOrE0GYBaW=6mW1?webQvAlfJgUjX4d1C24B2HoXC`IT!m8W z9iDuxbngCfm2RwHoy{=WK5dbcl+$rhjq$dqb}iNL2e286-+L+=gr{EXdMNqf(S3TA zjjQu*uZ3_iaOc3SUx|%XW3G4wHY0x~Ydb*4Dd4IKaqiP`(JC;+_@j(5`qf&F_Gn?h z#sSBPvFR;18tqV-QBvpF@prHjTYK!tDHrEWCmE`F=~((f5+t6qvCawoXWicSx0KwO1AOyeh)o$e5OVEmNH+>V z@7+b?)?*XkcDox#K$ucvC5Ksh&4=5bSl5(APq#Xh%+mVd)L<@>vx?Pg;R9j(@7;+C zXvX;rQpqADdIY^d(zh2irb#P>7Gwp{pO2Sir>&=(3%53}(}|gl$S11Zo9>!taKAk4 zV4OIzXj!?H zf|Nvhj*X1B5o;fhqP5<1RazzqqP{ZnEYB&SE9lxjGi9sBr6>Tvya=qY)XOAGWU_GS zEO=%m`Kd*x&@n~1ext)~ra)cwVSz~VbGCIpHOf&3%3)bqv6=p7)LnsfvyUuBwQbq7 zFe1|>&3POr9e*C@C+4d|Zwyq85{Yw@YxJX5eFZ#Wsg}#Y)6ZB1(!8D|*kN4~$o7kj z)j8pFDmpCQeTFF0O#c1BBO(Q7j-2fGB3_o)DCm!fRI$`+5{)aqjPuIIBnx5u_lefH zK8c=YJV#6M1h(^iI7Kf!P^CIUHKuOf6(b?pQf_yK@TIDpSndR6)?>>NgM|+(cmny> zRQDMMmkMnSE9z+5%!c&79UxeQCUUhlQFm$dS4|Y{1gf5*r=^)p_I6es5EI6P)x@o( zmR+XVd^cJ&?5+Yn>U9l8Jpy@d#j{izTDOw(=l)ocS}rGcN zOdjuKX zr!Rq)8*WnW3oDlD_tMytHwMO>mNO~l2uJ)+r`o^)nh)6O?lbrdmoRE>%YEpm>UMKc zi;y8l5cj+LW#Y0wWyN3WYj9%md(recGOhzELP^g*E7bvG+T|>V(E-nB=XDT#@+RG8 zQEyk%yYojS%ccf2%cv)80y&cZlTv!R%Cv06S}u0v{Q=*{_bmkK=F#_!VngNJOrA{d zJgc|;Ty=MaH2c?{vE$$9JpWp1>ouPZKY&}auWAQlR)b6O>$2T^MU@* zz+I3LzR=dWN+hGc&WR7Ss`t~Ln^HB+kS8QDqB%rwY~+tNoi3tTy{57Wu_HfwGxE>R@-jfrzE;CA zzwLJ{-9NqcHo+#?iTvoc_U}<2APFbP_`iRTgpQ7mhKBaKLANN)JPM8uTR|WrpEgTU z0!14$`n2KUZH%|vgRF@rX-PATLx``~?D}8w-`>9A5^Lh!@B2orH#If+`1nv#Qf@lA z85?I|Bl|LLBj?3c2xrO(Q_Qr70(PiU4u&0GfvIu4(XDVbDS z_b4PK72fSnvf~xmzoCpaE@NlHnE-*Nbd`P z0aLIp>zLuDP6*fW#j1JK#)cistl0d-V4{@wRRH7qgLgih-09e*sBj40&E7lm@;h$Z z^*Y6d?I7QF+Wa9SA!Bg$M6;a#e4_+|Z|8N^=KMUX{sOIe&Ee6+#3l4S+)_M-#ZZoV zUi5g=GDxf#DN^85yR+c$+?g*C0=z6MOGj7~js2O2a44p)h-jAm&q4;hqu9a{k!($K znQj?Hgq$%$t0R=kdLOpP3IpYjPm2^VleruLe=(3$ z?ciVM=@T^zlJx#68N#yl-BwbYz9KzW(X6Z_If^Hb=W0SH8hdqq_PEERLLhq|-0%5f zVPS=bhmY^w0UM|LD4kDYOhG!88mETr;>^Tk<@rcCJY193r+f$8WkJLW0x9oA$unY5 zn?G-fvx@(kva)I3h5QO#s!@*E{z?04d3))p{0OfxJc9QJ?;?OE_3|IT6#XGnR%yB$ zaSk8>OEu@EB>k?Oq<3g|Tstt-W3l7Iox23zlTO)i0kceB?9DXz1c@~%!uRdl@l7YI zO*k+urVlTYGc4({#w_%XGZVH35WxlP;buBj=5uIeRRFl)Zk9vQfjx8M!UPpi>k&uwe)*2Q( z`PhT2^WFeP@rBEIGchsAAA7!VjQ+9JiJGn_7EF+NXlydH4v3dQE;Ay5aR8as8noV( zc}g-~W>sFd@o`GeQngSU5KfP4S@TSq+agJJxN^#_biJ8)kQ=^O3jDW zc=`EjUsl>#jenhW<8@q9N)<+U*VMoP4D3ao%9Fa0Re>_2&gfdt%c}9FkWZtS25i(J z7(OngFOnThq^wZbQ-31ptv8ojV|z@FWR7i^6-XmgYrWmM z<~!%;vk6pRR?rPDeEs8EQc(8Fs&)%ib!stP%yuI(hqSA$`MC)>&4lNkP%~Tsx@>*0 zywF%19b6RoR>9unbAGBQf-7Dp^QD2H2Qgvd!TyodjGA?6?x%Y(g`)m{x0sCVspd&V zcTQg~edpB4P~f!w#pPus4JGA#J59>t7il64qMd%>&K9FZbHTyl^{jp22yleM5 z=;>7p4*Ca&v8koWZk2%?Ge+Ch-$mM6#)*0V@GwcxOJK%wtoR`@ew_qQ^m^0&vW-W| zT%#W<-)jzfmHg2HE#6WZsJA@S9j}Y^2|vHqx?RFb_Kj8UsbLyd&LFN7(%7^2t9yk= zVb*a=R--!Kj`-kx2)H#VPU%S>dn1H>)Q&wkdJoE8Vu648$`A6qz2?M z(a|c!h7zT%RHLT2_X~RkuWQn1CrdoeoluN>L;3BO&`OUt#+sbaYc4$kgnSTpol#b% zs-XZ84j~on;jhH@t(tGrB{4m~$hMiOGwDqpK52jE8BFa<#`equO8aHDhy&t$TLncp zLYuK>=k|3&Gy*E_lzlJ%EEX;cy2!_>CmchYc8eW{Ym1#U3eUV>O*nbgxlmGXf&BmY z1-@0w_m+gvGW(IOcOTBAA$vu+y~^Fi`;K0&wOm6wUK|vwTCP1zayrKx`XzMB#H-;*nk_L8o1I z8t#~dxgM^)IL(|0PoRGjinrUv+Iw*{Vbk?&3YXz!o0uY}__X`R)pP^rjC+&y2OQkQ zh=_sDn&qt|Zb2;9`RXNVVn_Ezf3B78a^eI}X(z?S`4V&6E$CdI#f*b1{MF)gZxMhB z%5E$yELTV6^)m5n{^JM7;bJ819UW;LmmV-LgF!Oced&R+AumfVLDTI$j9COmi7p*H|IU_!o{D>m2tFr@qLBJ8LjvwOLssT)$_D>m&MeQ9%Xw?(PnhgLpe}Dh>_V$NT z(J#v^@wpS&%!E502~0cAd(6~%s51@(I8}RGU7P}HBrq_rWXuv+kVcI&^QINJoo1DQ z{bSVl+O{l9jzvTyoeT=V6{m$3SD9F*H*6$UZ+(5k?4+dZr^G2FV^jf3HIOMK6;o9Q zE%Ll{&7StIhHlH+z_*4FSG(*}r+C-G3()B#xVp>mY8t$I!4_c!D#(v;X-)(PyuncA zLhVanum4p%9t-R8>HUq zw|a%mFAB4C3v&e148$Z%-;c1`oXTl?Of%D5Il?bg;LLP;+GAiqYu=Ecjn7fjGG_v7 znbGq^5B(9A>8MesswuVdzSs3>FL3E;M?ea&E?8J=%%b6gh<<(Pbse+SMs;<#mIv-B z?mGm?Yi}6w1%vMJ^eB*q{REIRij6uW?oxRu16b6F=EGUbIiPsF57$NtQwA^FHGyFP z3l-mmAw=fpkGOMZ*Voq_^2h`{<>mWKQanTrB1{fe`m2a5zi4MjnK7I6B$|zXU44BE zu0m%}w>tJE5wBCeqD?~v+E~PpVo}UboF6Sm@u-a>I$l72vPqCV__Qq?3O@Z5t3|{>PVjW(t5Dh#zExg)em@sbP3E)a#_~3UW3857S!K^(HB_9&A zJMZW&(Ww?B=43e+ZcSAyzDnY8toTU>1Ps?#mr2%@ZIpmuACm)&1Mtz4l)!QfU`Y@l z*zb@y{{%?BdHtw-c{4&FiKCdURaMicVEELtIL=A;1K&wNgN>Kl6dn@5vkp!@7c&6+ zuTgkj`5r*MYvZNsGuKzpC30I@&lCy)0U+DxOvRS5s0KWYbjTyt;8sJhl&0>55+P$y zWUSvP^ZsJ4czSy!*zp6`AnIfS92lVaN=i8UVU}*-=Jh7=wi*o8w&@I5UA%}S1)fNX zvDN_~dvUBLd*TZIz@$Z^+5v{6|W40P+TTWsO4!JN0o~hXRnje~~gUsX-9a znVu`@2is-fHl$DjY_w~fzla8Fa!v>8e6g>puWH%qGIY8)*;Unc$pncCs&eR?)tP$1 z)q-$Ju}|mbJa&q$?m!LE(9l5e>ttG+oBQb>Epr?tps(F5>hj`(#C@j$VCy9^_KKvU zS9BC+G)}(lKMJ%gNWi){pj$7GD)S09XX;a`h`8;1t*&6KEXEyu6_5fQ4Th}6EIA0$ zDY*~3m%8H=T{%tgE`c|bsJ*bgV0<2x96nso+O|D@WQ0OfZ?-@99+@?Um!&vo%H$Wo zEbaO2;Y-#i7Q>BNR_?7hD;pLI{M~5^n(K@6EKf08^j+Clv&&ud_%EvtaCN_Orr% zlSW2nxfCo`CsH)5`?8Xs46gQMtg0|4DmqJC^hHitu{7|3@!pJ>=fyQtMiwDArHX$ z9T@%)M>o>dX74cgu9nSPRL-XRFTWezbIx7GPis^!(zmZBq3qQO>S(KJKR>&hP>_+K z=+==qoa7oxj{LP>@T2y+K)9-PSfnpeJCi_+b&!To?gT-P@AH9aI3Y1LwO(>XgZaqv zP2{wrlx2$GM53u?3+huyQ)YREw)-S7^cqfLfetx%LMn1odp~%a$;LD>O%tg>} zmy%dhhUtHCZVTF&Rg9)*^r2GUET>~ErK|?b`ZDP`sk^l+-7oKMsd9=_KhdsL9)ynZ zc>S>6ZNiLs-{CO6VYYBQLnyr|&}8he!oK!BWm!i5;gRXp&fTb%H?XkWwWzdqo70!{@c5+&C&IEV)z*YiQ4y`c>~6SsA*SB9 zAbx)cn}4xANROLbg~Wror8s31OVhwPa_UD8c}|=Da48DU(szsF`bxjLFjILAHJ`A| z1!(7Gneuj|wM-6SI*Ev?h2sG+zu^TRb-_u5iq)h{u&;>Uc(rvXB@Z`sV2t}4{Tk~G z*KO)+AN29Vz`$~|f1iTB@YF;o%hi`_-|I_HVKmIs%ayphTkp67tL@M`9n*jcx(4gF zFQUa1ay~UjqvIU#B@nccj;%~{EZ3XGEig8m9QuwqZ~StN|GX0LU=uanKb|6m%QQ_xp}NDlk3si<#?j59_^E3sl~Y^%?)er!#c zvKOMJ0PTwO@6$y?61I0JO)0CqpL_;FROY|O4%`_jom7V z25x3HIQNb`P{k%wG@eq5pE|v_2!GQpnCEKQC4I~N)jcyA9&`%gies;LnvTTr@zG`^ zg>Mr(IX4{8?ato};BWacqsO^}*~D+n0Vv>U@PE%V`i42oO@P;qv+Qiv-fsisC6j-% z=ag7UkfG+9(y>9NTm^gTsMeIxj|iO>X-&ySn`TA^#~7=c@k;Y~YxAONJ?Q3j(xDM* z$&{yWX;$@?Jg{ki1j1|@tooP0;WyJ-H7>fjfFa!j8|YTLiQ_6K1NC&7Rp`2tj4l4f zmw~FOVXYpW0PCSTuSi)R>k1o}ZVv6u17aS2?Zc<5XvdWKyvM|Z>8@ZLHy@|VtRBtC z=&du_dw@~`QW}8zKK>2D|Jh;haOt@o+F`iJV^W@o^xCCxtnhxpqm;h<{hw2}$mdw9 zCOz{Vgd^6&ne?GDF?E!l$xQYLGhH0XLOpSToDP+jPtBHsDld^NBK!b(xF%1KVOF$Ry0P?h5P)Iy}cIAr!jcl^_-N({>H;>}L zjqlSJiVe4A<>TYy;^Jaq8L%!li9r3YX#a!%`c&tmmw0q{Uc7iM3`tVwsh^YJY?Txe zFYVc#ZS54T1XzaszmpVT?moFedsIeJ%zp7?|H!iTBrw6* z&UyAXq9^I_bk5~+Hn0fc5fGS{Pn4Eoz<32EQJ09~%vfQWKUf>fsHG$q2|7BUQfex_ z_MT8Z=9@Gw351;&P~Ak5WyFw6BFVRXEP0&liVYN-2XaWqfuJskt^5PZ3jI+E%(qqG zzZHAdq+8Tztt7}x^_ZQVotb&};&eaiKCrwOZ*c~V%YM1!1%lA~zF(O(1qER1K^DCM z?EgA+B4;)>G(>s=YC0rvLVPZJ3ttRc?NX5+-rO6zU?cA^t-d*BYj}8a@a=ZIzk4D6 zr5ai9_m`s;h1!DHW-E)Bm|fy2Z`^N~1sRea6JA$d_cM6%UuzDDLlv%`DsZfP!p=T? zX}Xf=ks^On0FaG5#e^+WHQ^mn<10P_0#IV$vts!I!Tef(`kl++tydGL`^!y@O}`5x zJ~7OemI=6LvK>!>>{pi`^H({uMDC3l`u1&u?(^0lcydJ_fZnhU0DYrBIXSsL3cC;( zjD!M7Vt&|cvQ+YO3yVAzTPh7i2xg($R^XjoQ&T)Ntc0QZB z)2z@50yfiECizzdhwCGP`(3P{+as3CHtj`_DTtVtV;}pMeRFej|CVliBA8o(4pC9l z2d5Uzy>RUEXwMaDxR8qQz**!x(PhGWtZ5*~OAaUsVABuioH%b^2j1~%$S(&1zL%ie zWcZUZW9`Ac{Tk3W0ucXN*0pH=YM`jwyV&mqx5dcF2)}tHo)+mj0zmi{2e0So!2F?i zd?UKj>z`DkQGbUpD@-ChZZSY0-xBZ!G@xbhB~$HhTLju-BqU)_jmbyrmgs4D?H1bV zuMQc1P#dYGiTDGAJqdKm^w1`0fu$>eMZ=1F04-g1#j#c~S5bQkn;sax=+{w#Ppyz* zDOS(EH3KDZ-t9Qd8<}tIReR*rMQ?huvZngf5G~=k}vObXcIXu{LXK!v`ym5p^ z;>Xxs_kUkzV8B=~!^wa8n357Gt_T7jJkd{}qob3MkN~LD#mRi=HrmkGbA=-NLinE!E~y>hU;<#0HiVK)^I)E`n(G;jquSyuDDz%|IRnK4No?i8VRUzh0#!0 zwO2>ZOzhaU#}EC>XpgTNOa67?JI_+SP~q?%5xG2}W^Vqxh!_%o+RsTG@31nGJ3{;5 z$LH&lr6k1o);yX|a}Rv|%aqQ}w@jWiGK!i}6t+^G-HqF8h_PB@I}88uEZOymYj9#s z7y;YHL<*bW$%L)BBHwAQP{dwS;mZa~_jV)a+sTiSi19f?Nd;x^V+hdr0#97}LM3BT z{5M_tOIQ5Ml#FWuN}UTpK#jsdm-&`pnD)HZT5Z)h9TXz4py_T#0GREc78bx zAWXFX^5u(p@9JQ7WMpJDfEK@+DVFL$M?MPq#Iu=2goX9hdtFCA(Od)9iWZ5O`*aK$ zW{JRCVqp0~uaU`p4Aru=DJAr^D%@*ZMmC*eNY8_%Z0YHbYVhx=lDhZDJN#_fykqV) z!Q7rKDjVs{u53L6iWAD@qqoF;F zddrAauGVHcwV0f!{OEDgoql>06#nKaDTXHOomWC_MPpGr@89?J$)C~SK!8JhKKyIF zv4h*_pZ*dlKl}TDPj>}~-uY-RV#H^y>S#Vd*$4x5qTuDhAmCE^jg^#?D(x1<_x!69 zw`|Zn_q#b4@)fi1Vn^!-6(Fo23%@(S7!3RckvYF7s{vQZF3pBY{#(G|6{+X2@mv>g zopM_#5wrW8H;E5*_+0##pFbjnyXPH~n0GliV#X!rnJynB{JiID!LgZoq$*P#xnJ9> zG5KERszN(^mo<9NO~fp$A>AZg0PSp^ZJnV6O^)mvAxu&5y5=ul{stC1nJ~WE&bJ(H zj47_yTCm>py*uBF7zc>GX-BVjVIXV+NjV5e)z@SG(KG8y-J? zzO!F0+`%g?=5geRSQxvb^R05Ju_ruk#jL&iN8Rkl|jAs zFiEaH^nDODjad!!>f9qmZ!m}7`fLCyXu<3>eow%7)Gv>%u>+k~F(YOc8I~tL4gWji z@SvM1_m+H8&g;17bC>NF!Q?qee%t{<|A#%p;%)|5Fo`TvFomD(MI8wbp}3_|Xv8?+ zyTI+Ws!_ewB<|{=P&f#xYC7-YH2+v(14F{z9J_N**?WI9tD?eWGXZ){N-C%423|R zqx{LPZ~uz-??Jq$}5_xNQGg`xB=-a!<$jGP|y{pHF!?3o6XYhIfn%Ds;ch+vRuaLvv9Knk}M*z^f z8-28M2pRk@!3_@GKQdBK+_bU7q(AbYO#ekb{tL~7r8)n8q=ubY20g8AydL9mLbq_J zj}QQ73CmG1egEetvBz?S5dHi;00Cn9t91P5IAav%g0ia&J&5*+nLIP&IOm`g?gQQh zCfWe#E5}2vD9nFLbJZ}f@E?rXEOa4mo|T^1wt>=CVc_LFW<4qYU<1@){w^HbX4Mmq z5vysjU;rxtpfaCJck5>pXuBu}fFl>nq&HJjoT3PEn>zN|*=2#Ky$!0cj2LOkETt&E zRfjH{cj!a_F5^|NS6#7jx9gYmszAexQReKt`{DQ^)YNhn&byMeXEVw<@~MDz^*B4Q zSL0&;Rg8kn8jyJ{%`}0JZsQQFTnwl`kgG*jL1_$(DdaSt@j4m^wncVQcx&ZF!0ge$ zQFuw5HIuph90Oi!4yp^+cFUun|V8-^bmkrfdclMkSEoV zY~qFDM&1?$cJ9QBgJq;RAw&H=UvRx@PnR^8dv&Vp4nd6OCwd@@4v`00Eo>*38ylM_ z8Q%Y6V*Vv64jcR};kJ=h0B#kl{ow(WipG<?c;sWSEJM-fYNL&0o%KN(@BA1m} zPuJt+JM-6e=DY-L+%7?)KZ8drsLXp$T%t!+2Omy|r-wj&y2x0VT^ivq`1;bt7)x7= zb8kV+!5xQ{E@Q?RC@3vj>3;WlO8!(nK>V3!-DJ#o>SqJAtrU7rWGl3n!w;WjP7Vb( zTa=v!CyeBHT=y%+fS*Q)U}fkR06z9c9GpOyl9NM|dGb83{D_ph#4KBAD4f@3%Adzw zG%^G(cYbtL3jA&aKsSilobCqVvs&eDhnZFRC?3<?r;4*x0MB&xNQDwpT7Tz1Qa(uqL+T{l`NP z?X35r%z((pZEZC>PVf=WQc14>P32y{SZR7;b4Sp}a2M1EkBxhPVqv7<(iX&>`m-~_ zhs}C8?ar&2F+k`dj2{0Lbbvv`AefKO`WUhrlF*gT zdkEOZ{hvM<14xebpIiBGMBils`(2ucgHQo*1L*jL=Qb*fuxaG{HE!eFUg;V*y)ReA z4U8AyMFnR@xHD95MAl5_k6xqA%ON--=#}5XPPd`jxSY{5zurE^UPxrKc-Wrpn-Rq^ z^^Q@!T8p2qIjk$tUuwFH_x(7)l+3f*UU`*-^POW5kCk2@pM5^3qN2+vAS~OiKiAFK z`iZjv5XxFbbLxAzS@ zT#55@Kvy-vfehbFSmA9Yrf&wPIF7AXdW(#>7U;s1W66bX*RfC*z3oos@NA?a*c@0i zUAh>l*XH-S8c2ICmD^p%oI}{YGGYU1R`hX#$u}}$axV8euQw*j1xcS!P}sFcEDmW` z+66ze$*qbEKwSb{=A}PP%EkN+bLk^&8uRh|Q~Taa$~}dlid}4=HV|;i&VwDmfZJAB zYEx$v-F^$9vgs{RMb;}^Jn7_2Db=DP^WkY}@vjM?7?7}=z6}~A))H$Hey5-)I02eJ zFh_Jxq4PjD=mIF)<~9fJ!#&bNxJ@KRBXzZGIM`?%Do^?FiO)EIzO$Y789W_ryb8GV z_k<5K7S!wXXxKOC?wZ?-;pdP9AI$!O(>wSi1JYe$8mi%h#fM5y^uz>r zZ*w5-F(FG(DP2-TK`fIkOX-a3`et^@)p>I5ozVi6`;Sg0%X-({$yslsG5~qe_2rBg z&=vIFZhJ-$Ni9}QW7YJG=XH}Qn{95D z9ucV!W<69#MLecTl3o)nWF4!aIgX~fm`@lru*de;rJ zU><1ebrB6B+I&?Q#_ua?><)PfLl;0xl3uhXb}~Qi0~{P865BU+C{d}$!pk8&WJzK? z2@bOMsfZ={_kHKRw5Kb#)vkyer*5Url&ujvJ`reo3jYbn;HRvAxa_12YYyAnu2tFe zXNbC|32$nhd#OSBxbVMXqM7A=SEX`dOlT;BK!r75PVTC{d7+90!{ z6L>;ylioO!g($(;#GDnpH37$Qw5i&f!G5-4Sv^!b!wRJvKyhD z4cwGH^|8ovH?Gti^aUse@*s5q@*5mM~_*>S|mtBxRn2AOm#Sz$<>L^65ks zwsoIka@0%&+GXiKdB|8=w7Zm#mia5092Jx`6k(kifsEpwl=`Txim}2Oh&c^4o#jYe z$t)FXR&T7tCNQ<#?~!uJSNn-vrTs{0eFI#M%|S?J37{dD!*ulh_*B)U66gsAtw9Mv z)C|g;(oja9CD(&~F)s}6{5m5gqEzk6?PRYjKdG2>8tFv$>&xR5R9>3}2XXMDK33!5 zU4TgFNo0RFS8hF#%Ig@%Vx&=KS!;DJJ7r+XA^>>`!^G48F|4abhvc80-ROoMCs|ws z7#x84OW9wSiM)Norce$955$iAoj0Y2E!sPUr5!l2v!IXy8pcM8E5Fe zuS7dt67TiS=zM4lkWaWCVhCSzbzA^R&As*_&=IFqO(K>sJBurLQH1EvtRT4|Wib{) zhVmp>QMKzmJjq$`ZO^H%AI90ZN{=@MO<8WtC}bryMmoMIabl?}$%d_Qk$z;&eRmPG zM2n-mnyS(n)z-?sXdv3)jQUDM*B+yDwVXd@ADp!XT&P*2UX$1w$+O7aTabu9Y)i9u zpQ}T20{5lp1(EAU{t8$Q#-DZ~!%pnl(ndL46zo5_;BQ*Qe1J$@(}{R(mDA6wAArw% zM1S2=LI@9OuPn9#9?#lhc9a+|c@<$d-9H*sMu+Bh>LzSWZC$21q3H+&OhmaD^N6e=te?!+>zjunw z>7RW7poX@@0aJoEFPMe=zk<_^U|fN>kI(KH(5U#}--t|LF#G@fvNOYDKE63`TB@h1 zZ+aM$jCO|-bmPd-Lf^j+3L1(Q1VbY#;x9^cM8n|Jf3}TAlA$3Z2M5YMP==>v>pRW- z17idEhf}qd=J_`;b!nq08oFN!nO{ACATj*a?|dVN#yk#uVErfKk46?AX?#^r3xnXseg z(!WH=#+B}}tAVUWJ0Ud1O_e19d-z<=bT-C_(4)lwr!DT)M ztV&G>G^dh@6~YzeUmP+*;+LEh`T&U!1DyIy=~)&?87tMC67Lo*xK3uuU)+}DWZl3- zhv+zEH4k3HmktDJo2T$~+D$@e@S_z8d!L=%pakKG7nBCHQ;&nZ7cRP06-u^Q9acz4 z?+83P#{`tap_Df~BS+z0zg~~(AmrEv;J2k5y*rImW3oa5e;njpnYH3od)V(fxqEi& z{bXaD;m@%8PMo62>jR@W^xjrpAO-Sx2g_AWBap8`zZKH*0dG_H{+skvT)K&UZE^}L>wdrfPxSmhZ1f0@&toWz~T>dQNVYfZ~1x*{@;_v=a{6{DB;gvv;uV7 zKY<>sWX0Wx1JeVW?csYMKGcy`gw3*TKfY4qwOhk9yBHa;Klh5WAdv*KNU0)9lKsx% z>rT#BSyRo0VqBKw@WQ)S2M1wpyL5Lwlx&l@x5mRhpUJXRN8U}|dq+u+v7e$I1-ziA zghBy^Mn%QQe@V=LFDk5xI{t&-NDX>=)^sqJHPU2t=!X;PL%G}N^Q=6cT{`|=^Y+nm zSU}w8mm%xw1@}YGuZ&}8dvkNCWIBSbeY74LKE7#nZ%y!xG2cp#Bw?|s4()cFgDnE; z1@fd4SlH*hr*HN_WTktzEREI?|Q&F0Sd^5C}KXQ~{LtMWgn z>6A7nT~LLk3|YI@gOLk$%cWrv1!;q&2g?9FJi}l1 z1j3tj-j1Z$M+-((l0fFJFzjJlO1xR^yv0J580v&O0Gk~56@AJ8SHc6koF)pnd$(rw zGRtD=5z`92w_DoY{&<^N+Ih9&>2c}RF4msWi+A`vEf`NIqTLz$R1BO{L+x9=S2 zw>F*7Wq3+|yF>4HV94UVM?i0C+9aDdvASH`OBqsx-VJIbAk|EU`Z}zJTCn6RUR#$W zG;13TmOr@_(VmLz*M zr_m-U3PpJVAXSMf?Arf)l`AB^cq}a;ML7&80S1Jhu$n}u%T?<92vHSmG}jmBc`owBtn@}#qPUfZ0`ks|jQ<$@<1!Bh zPuYU?kOA6@S<9i}EV9sbVGpg5i0?iR5SgB+|E$Nm_$rz#yha%7% zm>V^ZF67$lbvbUfbBIWf)FeAuKb{ovE;+VY16-vJz-dXKKUDc3=Ede{)Qeu(gDv)MJLfPuq}&D%A4a7Ti1ZdG;}TerRe6Z4ek)8&7z z0+$h-S^a$#{L4yqT`QbEZ12q)2(#rYELF6NjJ}Y)2cpaZmGhte1V7x0w$95rp6{Rr zhqukYbB&}vEm+ojcBWeb`nuN|={8vYV{yor?t-S~?BuVaZ2VdB7)N||m88md*)-K% zZue&1jrNoZb3E0NCe&K1qG$c$Q5p< zZ*#Q*3ZUFIH2 z?XhlwRo-^z)89Og3NKz6G`ulm_uVN5MuCHAyb_K_{o@#zgKR}jqH2o~CXcYr2|AxJdVc?@A-hc!^P|f@Jno@x zKiBf`gvgb0O4qY8S(-bARH?~zygU#ttmRtiR7 z{qKn3v=HNaNycn;nqnR%@xoc_4>fNhLxesTh2Ny7MP!UN085ne5Yhr8h%=L^6Kx#Ae5E;Z8dSUDhwOm*sLxsy>Z7D zLnqnji68+SQl4k$cY!%1Y~{VBsL`py<~Cr|Ng$Lm0rN`zb>4^jE`?qjA~;gJAnbQS zq&yZ#mi?wHr~VtEEZiDCqyNkcj4x*IMv4!$pj z&LrKQaeZ>j!4W}`O>#RiiK`hPt6}N&FUGfZ>>Ysx8u~2X$ZHgq@$`i;AA=!8zOZm& z@4C{aee|GZa=N_zl!x`o`iD59;0oIz$dWtx^=!fXhTQvuMKi?ux+{)teW}e{Q~b(3 z38D~UY?EF@i>AMnt9&CK*OC%a-bC#~cy>;KgC;F%-PRp<2CRV1OvQ#aUP(SII%&D! zu>AaUIq%GG<3xKwK|}l!Y<8(M&n?}hie7Xd)gup`{5q2B`L66CMBW3k`yj>M_icv> zrqJvSL5KC3sQ)aH>-WM5*v%DDI*2hi4b#9kA@86%f$F`)*{BC($1dWb*(0Mi56{Y~ zmX3am9{;gWl5y`P?#`~}d_5j8*>p4J3WbyJ_N-<0jWy128k1VA_cW}K;ch)S9o%u- z*w!#aDLY~1&RZ5Xsr?F-RC%dVWJQEWcE%sFQ#aYB`Jwt92RJblu!RCtC5wF)cC`Wf zu|;Kd`^+Kimt=wsD1fs}KtP}%FAs78Ib;FT9fQ*y%XA0FP;v?_0Cr$YlT0J_(JqCS zlhjV~&t|kx@cpC31IG2fyw;`H%c5<3@+YGKGC=-ha|o+NV`nyQlZQR&A)ygtm)s0j zxS#L{D!NKu9UykdUfss~KpnfEP8I5N1qf9O(98l!cToC=pT1Wr8EaTHNNsfPC-%Te zQ)1%MQ!f|VkQOj zzKaZeCZTd?WLPT9dccOPYxySVym)1M2PPksPrs7~F?hwWiTMqIsck_RsPTGJVZ~ zKSkj8+^M%7a`@N%GqXR_%xCw93Av5o{Jbd(T1+2$)!i%K>e zao=A(m-&@ROTPizLKQ~0bk{!@!TB;k4jP|MMlQvti-qO|R$+i2YxBctmDcuf)M@f_ zVvnA5iPN}RS|k6Lqd{sK)7^F>PRA?47JXdTK2nDg_KfaJKQ_NIMrolw`N=`|$>SN}tVa(XtG}jp9yPsYxtx}|d{PVh zaBF4o>Rn=}Fk)M>e`Q((dN4QuDt3|kRa8+Uhj&I<15_DZz{d% zJ9Pes_pP8St^?sTR$XdQXE!-cZ`9Z@{e{B~D=5s*ih1dcz!dmoXqx)FJmq0mDMIjFZyyps? z)vp>as>g$JLa8#U= zCqOO|r~un2RSWspsX1^TRxoiEPh6&yXI1MB3{>P1U@3T3_A9p9U5C@CQB^WxsUStUZtC6=Y~IT14gn%JqEXoXe)W z%R}~#_{ODm2GQwODa78&%K&p3)Idc>q}sa~Yo)i+OT7X9a>PMAGxG+>gJHgaUq!{F zBl*6n^djr|!5#T)U2Gjkzxo5FZDIsm`W7M0@QvP_o+09hn31W@{ptF}G{3DblqTNg zE3OWvWio@H%#n27`)E%=d&WtpHT7fSW#_XQCE3ON+gbf-dNE8VakPh~*ROxM7}WiZ zfG|Ma=X9*Dioq0wtmk9n6!_q)5mHCXCxyPMX<63^K_=e55P#G0j=hBk0@EjnMINsq zcT)NxO;|+oIMPr{lW+GDUxW2w7R8|CL82Smb0Qhl*?%s77;(^TlW_u>g3HvR#UOhJ zl@`6oaiJCDaYca?tFJbC`;(a_hch_PZ_rJ0oyxyz>Rhad)!78bIYGyNd{B(^o1h#h z<1H>uY_AhsR_ArD-}Cz{D^vwnmoYWQc|Ie9J%fvxSG>_?nzq|;wk9pTHtz$g4kR7dhu!1a&h7^|zoJlHq|D*1oJNqmXdE8XsH(v6udspK|!{{8B zIlLdyD^D#+J^g?vQAsYkShMEmId!(+WF11~I91^>?G}>VwDc;TeBuFD)MSk#^6vaw z_MGGXuf^?qZY}4V5jxj4ai49~m$Y5t1bui`L&*kL$vWNVfV#gXDx^Iu;8DeU@vjHY zVdom&Syv<0-QRaNHlndpV^$}2Yp^8P1uKI^^J9Ozyc3YE>q;`qkm@|?(g8gfqZ;72 zuj-oQb_*%lcP!x%fsyKrvs&ym(OrSC**@GiQ<@Jr!T5Q1EJzBdq4*m1EArT%|JTob z{OnUo-h#4oRM1nQH2;HT9+Eh_QU^Q84RQ1QC(N;TH5i1gKWZ`vcp8Gmwdnk2s=>(< zp$whL<_uf2`t<33AJN1Mh_SZ1_qa`7Z`yX%xio=3;Vf~D`7v!{S5uc|AU-@8TQr#( z*hIg)KCQrcLTbD*=thUn!7tk;bM+UAFotzMkEySeKW#HP<$A>C=xdD538l30p!tNi{A|AUpZ?d+pZ(8 zM|XfX&8JN2OPR^5LbAMpKYfF`hef>D2>3{>%24!brI24_k*8g8+9x)i8HVNfl?1O=BKA4Qar@eyOOcLhk5Y$q88E7Im!058414ihbS3)L2MUY4)IHkZ zv&Lt9iy2NZ0X@kLwbsZ%_PnD1`@;+?+4AbL4OOlv-r#TI??(O04u()1we76iZ>*S{ zE$tp;)bC~x9DJh2@^E7?OPoNz_>XY4;K_(KNO0OgtWHh2 zlsnDGwILmo?PG$mG|#*WU#If9(&5c#$WQK0aEFd{yNToZ7){m4>w5z|1XH6Y$6abH zdPl(K^wfmyx}eR$x@@i5he!_s%PQ%J#g5R7`AgVSNtRiq+j#BPfR|* z*L~TfD=A%RYIT@Upn%^8%}yn;q-^N~I42)pKu8kv`+Meo7BNE^q-4jLJ0Ecm&ApEU zS+78b_52Zsni9csu48g3Z`1zCWPm*xUhAd*wF7RIy)n12*e>|)&U%x3mOHDM1p0h~ zDku2VCThUJ!d2OU+=qm!%Ya-hDF;r zX`1(uv71^161w{#18q$ohKguaTtPwiW0X$w@l1~jxX{StJ8dS{3mi#)U!y9PXK5Q`HDkZYG0Ty~X_h2SQ_N0wR{9<8+a-p2&)|u^N~y|HA`YtAdZ)Oa z+i=&;m0v(WM^mG+bF_=FTln6t?@LGAF~GjiE_20uuF90>0?&hq{JwLa$TFU@|3CjV zMw-x})g*>~?|g~z{He1t>#649hIV+6S{x|$F{2%y>QMy984a`aL@#)cRi=)xTb98YSy(tIp{-HqWZrp_b=OfO^SX2Bp zF;0bwT5Tzz4XoT1PRSb1#wUtBX}dhIFYgD;$t*Z5q%CwUoGsoAxj>2v97d}+`NYKF zA3iXWza1PI>EP(PwMEi{y@jr6SlsIC!IqI+)KL7_(y)@rB;&RP^nQ_!cl47d_r5~S zjyiwc(BEYy$Yr9|rZ%L0Ms4k};}9i3TxQa2+IGS9!!a|uzF~XoIGRXP|Nrr_uU(zd zpPU~-oZd^1zi)|UiVM_MK-So3rkRsFX=GU6+B)vx$d`TjkU#o zg|J7h{FFtSReWce1c~aS9uLubG9C&`!OZ3EVJ`egyIg*`3XLJ^;m#Zz8=Jf#4wIV- zpg!NEmH-3J%a8}~+vU5NhgXU5gt^Sgr)q>URlhe827P0hQB4f=?rT={)_zAPq19WV`M!8~OH9$u>U!0p za#&>_#yQd-dH0oer5>I5$@h65-L&=k`&B6^DT*vJD(qL+T<0QvALz?mbW^^yU-V*uSBI4iKg>5 z3zLp=D61=I3ks*o)(P<5i}P=G?-*zpXQ}puDQPpteBJ0`Uy(dob#r|x8u>luPHdzK zBgJbIC9gp+&4!IW)k(Ci!j)>P0}3SpLwQecQ9B~-KHX4hjRl2D%Ji$1k9Q^SD^=~2 zkZH(7=WZsAzs`gXO|qZEOI`JS`3hS&Xd@zBadx_WQYDIZ@Ijy;BQQQiBt9S6N?0as zBjg#ychg2&Bbtm`m5uZV9dEyPno?vWi;Io*So)UnrG?qUX45lMu<`Wunt7Z1&{i6~ zq}5yR;^a_V^#+7^T}%|kk1F}c^f4D?13bP(#z^ZLUjfxV7N(xUqJUL$Kw*fIVNuS5 z^kLE*M9u-S_U$O$4w2zzjreQTH!ja53y~8BMd3wA?2S4iV7=*5CdaX`DlakhBx64U zLQbYg8^hxwbxjjp{b~obSGP3HN%5ZFRAtjmw6v%oK54vPn|-czQpMZ*m%$)oU=`CJ zyV`J0o80BpZw?w6l=jj#u^ZzO`DT-NMU7&h)bq8C-?qFa{&Ziem_d~_6ZnTnSd}8Y zh>A6GMhq+(k=iUCUNkE!S*c#MrlCe@E@3t?wF$L_#}YnEL)5A9XKBd2(E5;}It_18%yS~UA#?VWuRatRvt3G?yud=r$A?I z;{hqI*jp)~nOKY5?I0>YZ2hopAL=w^ZOdp_Z5#W!`PC&VQ64ZyHYc!XjqJ9BJ7zS# z3C>-eox->p+>*b{)evJRz=Z~Nppa(mq_nUgA$Kx%r=!AYI6ZA_8{Ao8 z=UYL=k19vR0fE$hAi`Kz*Q@vLND2r?L6r#$b@j*}Cdw`@E}&LP^U<2q!$nYKN%R`> zty6h=1qNNZgGM&1B;R9Cbsz8;G14)xJ7S*pc$0qxqEl`gqRUQ z@3WL~!>OShM31u@8ZaOSgo!2CA|1 z02A{`kfV?8s=@Y9;O_dtTKV>C-7rs^E6vF3A$ir!sz3l+eFX?q)t%Or(ji9v{KfbG^Z6t>f>7{hJK#CAj#2oOP%^r|Ru(@fg1$P|+n1)FKNfPf=D@ZrV;oU#1oQW)qJq zLA~84<^;-*fjU{j>vglZPB)`MkQD=nPM_4tAt+MPmn;P0spdo1TN}6ns){smVc7X{{ngbo}4_b{R|%4O)}>DHnfDS zhqtg_4-)bbAkh6@{~hX^R_ z(jI&O^-*e0jeVr2la7uEXse(QPHQu=f`oUGIRIqiqFvam1$mA7$`T~#QZ z*zo#2_oc@LgM)*L(2buhsz>jGAOFKp$TL28F>seG+zZidZ=t142AkDesfj)0_OOZc z^wvgvUJJ#RusUfS;zxT%D$7-CMSj|Ll4y2x=SqX+vDQrxNti|2uI$XwHAx;9eCLB0 zq_2TGa#hl>5;U11 zFz=vRgVqclI%&aYfPsrXJH0X876Ae+O*IKnK)kdP$ig?jP|ceZJPfJoshlDvi36HZ zOrIFKY6Z+qw0jk31*CiUBQI495~paBF26Edg56zNochMOH3*VwvNhDznUX;ndIJ>C zq09$(srKaV^R{1m@j6W3ApkLGfqRVLlVtqErhlE3t}}zUEF|^Mne1{VF!JC}JE$34 z8lF#Q*#DfB3@)#$%UO=VtnVt&=p*P>>c643hc6U;=hZ0RRtwfEHz=Mz3Y5>ADe%>Q z0e{Pyu4{6>Dqv3l5)rG9?AcvzzUwc9_T414g-sy9JW)n4 z*9URxH`gO|O7r;HG{1u(sX7^jO_(FRE-%fF#bOU%{#ppz2y_PJrJ~%%LH3aD^^+p1 zQf8h3-hO3!E9e}YZ#9D(qzA@4@|bB+6ZcVs zi*rL$(!*RPF*2)_bi*a}Mi#^IGpZ2*?*@1^ex1BFU|lF{eMF{e1|2l2@0SAi03kIY28}#vL_^UEQU~f=#XFH{Q|uhm@BZT!SQ;`; z))Xy`#3Pyi^1{Zc71Y5>g)o$B7sab>)WFA@8#yJ0@<^70(#jR$^pY{YW7w%Z8Khm$@p2UoXEs_}{U~L4055WM z7^z2B#E#h#m=sN&?DNt2nz%Yx6(EQ0M&S&8pl!%P!xvjCuWS=W@fzP%s+&+rlJP;w zCeK*C^rA__>o@lFR}CZ@`ez8YdT%h{PXhoPz`JJ1h?kM>haeIymq_?X?9+L!r8pqf<8@_*>tyZ5m3aVBES_N@6X#*JrG=HQ2U~ z2F~IM&zQf6wb5oXNOZNBiKW&}jl)m4PDrsItFFfA$2w~ScUelX(J>s6MfqNQh?Njt zCJm^c9Vfvw9JX^|^@4p#RV_xQpb*mQkgn=f^s0al#I&I5Yk0-B!Ci0#tq8`8ucybn%4oG8IKOlS#WehKjcf@jZ4 z86ku}BrWVbNI`xcb2aX0x!st;N}QdiVo@PiJd3{38#kE%f#`a-s_kbhi0C5gk?wIW z8j<#v6BH9mRtuv?Fr%A8W$JeWjC^nr&zzvKmQnM`&&C$f^^0ep8}o0DV~E-U(!bS7 zC&X@h_cxjG)@5e7VO3FpgR!*=Mr_wQI5yU=JSTM}IXn!ldX)65!KnEVw(gl9?Zvqk z64zh>AtVfnKPpLfBf(szF`+)0PPB8X7utW66mj)pQ1!4%YeVF=5bcj0hL`sX{|O9C zy(YfVK>aGSyc5fp^?`&~L$1@NA=k5+MP{A&?5FR~knF{UO1;v;y9HDMZgL$`Rcrju zCcjb{L&av-Zs9Bi^V(K1>}@aIn%@n+qZK+&;alTY=Ub_aeLH^KCl0FU3bMI0DR%2t z!F5Sb*tx;t0O0ossTBaCi0j5eQ@Qb3d<@Z#sLMr{OK}*3=s^vLZb26NL$+zjjK46C z|3DUHP8=oqV@6lUkYxCHw3PfrXznuYJZqB+=Ud~EembqX{Y_brHN>K~GB5&Zv686Q zu}o)8kyoNiS9U(_8OinY`fO)PA>vFv_TWYbrYgV#3wIN8f}q`g#L*2**Xzg}S*!Rw zERp75)*^P}--;{lY;sU;0gwZaZ`5VYw9A>7b1vuq9$ z3>ZN=Ha1r^C_}YRudD35gH>Q_!VzCEB=iAF6Mf{D;>!*muYI`C+G_xTz@6s4=pg;I z;AwkExrXT)Nvfk?HS3s&af*|$L`&ZJvl(l%hf67;hjI_yw2QwQswizTzvPhR#7AKp zTiOBGvAwnB<_b`{`U_D8f8ektp#*vWwdXF^8Ar@o+YT?!NN8t$a^WWVGTPt1ei4T#CJoSv78NgS#NRKgNe&RJh%%Wu6TDCA4;UW|Tp>L3LGK@s>09YH**E_@_!q)U5lE(_z#UAdB%7uskQj68hIz(l&-pE(WQqU+L{%><`l5h*>aRm73$;&iMKc^@Lgj zfW*p-4_dV;!0(CRevhK*z$Eag$1XAOYycVtB-@dS*-cH7@)?ggdaFBWIRrAk2J>@w zPjU!ki#pKbUI0*Lj*J>+{Ve(azznD0<=@;XO)b0MZu8kQ<|UP&-4N)b^&X$|>cuZc z=Grm!>Xx17_)UMmrp{7D)kUfPzk$`Kh_;O(e`>X5e#EQz_;_}1dbH>p88EC(W`XRl z(Wp7gfw)3faM|zmQQHW8TjG8i%?{ z!-$(yW5%md)b|z~ySuyldXO518mjz{jQBnIU+{(bH6zD0CH9iw;U~J*9^mAG&ZL+c`dd*f9ih~-4l0)410E>9 zyY}~_B@IejbC7#>-f^Kd9h_|+oTe6Q_>J? z5z%Dkw0!3?DCNv>Wb6lxeR3f*C8^Re3nojP;zsD)`NOR_f1{OFG{K5=0z!%Lb$&PA zYq`p?-$dFJR(NxQN7`(prY!3?j^3kB%y}Q}=e2y`7@X3+h8wHR<-qr@`>cokUoX>% z?xeW&iGY$O!NfNfpuEOA9Rf!R+1b`iWX$t_e;mlG0KOvpv_2I<;Z+vFnBaC2S3Rw%hV>!V0%oTXs=+!@lL|!4xK&=&WARy4hKph(g>b+yzf=ST`cf~Ug8CNJdwp)(M$Q`iRIKT(gNi8ZUc>AT&5Y&I2sIqYz zP+~WNAUvw8s|R%T^f<96eUK(Mz`%n3d`9{gFI_6DU!WP=0Bs9zadB-)WI}IUWc@%! z7`b)IkKp#yIWPNzRxzxEhUUamDL<>-=5Y_|j}BJqYeH17!iFN^Zn~1ZU1KRPnVj^^ zFD^un1sKXzX|LsaIu`ps*-v}!l!fZ_w0rcadTr%4Y5av0$n)BnjembV?Qul+Et4k0 zaX0YC)it}~*_VrOTz}rsamw|pwvPUq)MDr^J2nK?jswakcu3OPx%FOXj-3#heJw- zZs_~PJ^^dRzskluJc8GwcTzr9Qb2N)vYu*+?XP!Ww7x=*dt0*dx`-ay?nuz%;VB6z zJ-GiQz}Km-D<8f~C#kS8C9Z%Lc((P?MPNL4(ZpWb(1_Q*Q^BILrmu0p z#ygb2vw@cpeKqi~G{IV=tlBw@4rJZAIZ+kyW2`m;od81y{=|$y9Z`u`l3KJ)9rqbA z_xwDE+`n`MVN8HT8(4yEz$v8S1leR>H0xeoQ#B;{{h#~(2xd$kYmaq>+YDZ zTQ{g*O&^i3Z8K3*g1&+{;=GEK0T=$IzhpM#KikDFNY?K2EN0yLXs%b|wTv2<*LGTm z!3TUhgN%IlN)8u0Gy+cA)N))}cNWd>=xFG3E-#Hy#lc9qpyqcQ^70L5-VYLlrf^M^ z_UTh0JsaHK z(NimHrVv9?p;7i`aNltr-j#B`3<7=XJ{6bR7sfg9dh+bp2I6aV+N|=q3L$&@;3jkf zJZ*zxbdaP8TkdWA>fGx_xp}9iRMy>op=)(&@`w`jhR6%dg2=%;h!m{62d}GtJ~Am8 zPU`RL5$>xK{?pC?8rC;GNm-qIFhHBet+M8Q)WU7M+)X;aquf)}%~d!7xly%s6!8*U zBnGKNvgWNXuTFF<_*#s|{#nb20N4A#JY!aQpmw`7yJ1=p9-VYPb!roja91ZzjX)#I zn7zaa8bPzCIKQCyn%&tJ6-Dk1E>G>31f=0#q}G-{SEfn$PC2&`M)CYRP-Y^p2)!b8yOhEV7=kFzho zw-<12)l5Z0JIB5i*pI<{mqw{o)sS>BwSn68(je;diy4g!ND`F4pUIaO@j8k*%=+BB zBRb}=f2@lSi~huN>2#DJOJ0{_R_w79C54|uQQ7ySfux-{QE{E5@$G|`Ix(Nq!X<*0 zNMhm{%X*rAP<}H()VGNkK>j*d+%4!z?Bt+8{PAAuRH5xkz)0FrQHSUp2_4ENne&fM zOUaBdC?+>{L56xBKc-cfp<)a$j#YgD5%NEE0kkmDH`&?$NBjl_xq*1prbC5nRH|IlV}JEt($c;XBt#0Y9b(jS|<=ZecmW~hfeU6O7b#JKX;RVgrbI!?OdxFF0B4uofvr!DW z1e5={s7EV2Fe*j_lGPi;dT#;_zQlohBI#f-(B#>U5ixwl_KQ)xhxrJByc0rwN#vQ? z5n|UxbFoLm-%0&fQP1&M)5-@rcu0;*=jbwon6|mLZl)JftVVfnnPbB9T9@qD$8wS; zg&iZ83+Z!NKdyN$OYlRsN!WusyS=(ssoaL=eWps^Sv!=SnO!T(c_mJO#H|Yc6hrcO z3q-1^EE8N4ofbFms~#~id(<|yElOH{ni|aNNdsnwW%W5b{dLLZtZEY&W^B+-?88iH z5npdFG^aoUA@-GTbSMM+6C8^*POe&m7g%4<_4h@JQ!uDSEH&C3j)jY1_tcSE)tOEG zB$#q=Hl~|=znQ)ILitd~ANm0K<1u&B|G0iYH-@(ln5U{qUuDL$ov2e^Wc3L78qIG| zsA>HiC^mt56rQq{PeN|r>cYZg!F4h1f+@5VXd_Ocix{xY4|?85p> zi`ulZgZ(|o2<6ps!1m6e4MvxyMasE#qSR zXGb_EgZCsd(eDKIS?0;2h~`;dL6hyKLVC=Ju&s975>6u(S`0pt5h%DU64PO%!wv9N ztl6Kd{E_bgrQQsr3B$ymd5(4jvQIlawa~|VyY%ey{@6Mxg)*bz_FGK<*xluE zlKi?A)I&F~Qo-uH#aE<$`%3ltDZwpAH{hXChS(hQJXJ{8dzF;qw7w?jAVjNVkPBVe zhER}j^Q}9Xa!WWY`?S35OJn;55=^pN)eE#eWnpUjTTY7JzvD05OkQ0i$vB|kw^c`z zX>f2FnWx2!X{5^F2mO}ucz6(l_zP6R5Ghizs8@m!l8C=}#ya!|MQ)MR9#nknE4vD*H}_WM^OBf@T%~M+bBx zsWtu)^(8e(b0khjs}19XPII5!nSsoR>t?bv+vUHUfV0<2l@c=wEl*aQpx>-Mv-GRg z&vc4vpxvS`2sr@N$Z60(^pTU#sqHoK6eZa!5c1B*St=&74|NIX;^O88>AE|RXcmII z>Wsvlo!$F|FX?anE;;dTwq* z*8S?m96hQ;d<(XiU*B-SpVn)fBAbo#zbG93)=iztx7ydzPz%4c;NMx!%Mexj84EUc z?YE!Ae1t6F|G%DX1+i-pkUPr%Eq25WZws#vEphp}$XzRh=~10ubbhk{6Ay+od1;vq zT9rB-Y}dT{9kR+J@j74ajC3?^{r>)ab(~_CJn*r=ZrymyVo#c=e`#saLL=EPCcrNr1g&yj#GkQQ3J|dBK=Jt2iGV6rw^^(8fDI8)sNB! zF*BpL6J~0l7TM#%&WuUC)u+p&r%3OgSgUe2ts(!m6^Gic@6y|MieZE7eTME<%?f*0 zWBH6>Fr)Z0CJqxtX~|9u$oIM9?+qCHo098mhS84(<2E|BpgQ<{=bo1Xu<<`qzI>6u zkNGT7^$V4^vw<{l2M50Xa#-JXf??fZcAs|%(3)XM`&9^UoDWGJMoZaSW*GOS0ZpFa-mAYFK_?DI<^BkVXw~F%P z_HwvOCfw89w%2AQS$B6nFW$H$uj*B}-AH;K=wiu_bw{v`MNL*`KRN$vQw_eC=AcH8 z8>}Dg&esMpNpuCVDV9ik*_BPFDQ4B|FC~2oxI1XiWkcrjEWmenv zx#(Mp!{^GEF9FQN9K@?|iJzAdzR^}|SuqN>+0b8bhM|Mhb8n*j|f*6?)W& z+?lP32UU)X<2Pb!ZJU2-gE$?XhM_-bnAS z6QnB+_&)0kK^;kxF5i^MX@*f)$LR-de7Cs--=R;0dk1f4bf{CLuOEC`DiOOlR3g6X zAQmz=os2gB<#-otSNMf+q=6w5-C)XWRVQ22Bu;va-}kMt7Wg3;n%j>5azxfVG4;Rp zT+rFj+WXN~jZXuF2ABdpf4dqNe#?xF@!K(Aul)7{a57^^dKZ2hJG5%=A%^qJZB6hw zuu@a(l%n3}q{cIN3a=iuPVC7K0vP#9;KtgJ2>JFLGGOwqVLshp8UT@RRi8CgvU#G> zThjPCgmQC2??3lDD{2&(x*f(#zQ@vd`G%0@-cPvJln#8I`Y>U2_(<~(D)EgvMH<+Y zKW#{bWid76!VGD`wX>p2e7AO6%b&v`$-*aQC5aL>f@rA~^NBq;5%1SN^ zQ&fM!=rWWZX$-jL!R0%}vYLPz0?I~ChzN+oKi$(q)!2vKww~AI2SHa-fb`ep7wZG0 zKSzmi5|;H5{YD8eG!v8~y9t8Z-X3i?<-(^jCZyG7zj}w{7#(Y2^X^3BGXWOwl317y zU_d4-DsR!8Oh3bWZpnYt&0?6**B^G9o2*dn)vC8$KU3{4?ZMEVgxFq;xTr@OY&w!z z;RK;o+k|b=&jXQ-8z46L8VV@_Z|jc624%(pxcdU3RG7}tDql%{?7X7ZuD^#A-t)Q0 zw>r7Vs4W@~SI1B=-y6-cUVxBe@O2G@E#6cOpPHW{fFpzkY`nKiz8b(t8}?BXL_saB zWh~;hL_v5@pR=jV-mNB5YQrA#$j;8L)mL z2Jka?JKT7LL6*}l&`s~q}K~^O8zpF|FU%)^Z6ltu)x0NTr zi5r0#!sqwkuX|hqpc^-{wl<<_QZ1xFf|T*Kf*K)jzk}8^s6r3*l+aH3mSUJw?Ta;E zbRCAtCh^zm2!k}Sx3EHJ3c)eGt2`l{0jW5Bqtd_ijiwJ6uTFSg zm8#^pd3m|Ok-nffRT49gG}(>_m$(4@^=mfN!YCplb>E9U$L?ljZw1ndLKQf>{J-RU z2ecR#qJz-aHRNsC%9KLxp)^+P@ekmn<_gt$>Apspsp5v%WwtI$z&@%5Rn8YraPXAz zVDlQgRE!Rw)zJQ^9JCU2tlJ*x2vv9#mBLxRF)xJl*t@n>9DebX8hQI@b_*GjbkI6b z=-|s`p2!S@va~MzE!~3L(GL4)Vi@%mLedkG42Ox*OfV%T12v#-gD)@EK*%cE_d-}1 z7%3KG$)a+U;Xu_D81=2RVOkY?!ALrw)}$jVDM)FoE#7pL!`oi3|UM(bLDNZn9S^Yi)H$r*1r;l0u) z1Hqbz?yZkOzAn5lQVsEyI)m^J=#^TXtSc)Xu(|yALjKmTg%Sn@pIEWe(@H&T)w1y( z0?ADd?D9muION5)v-RaNLA)cBbzp)e*cs{I+dJM2oeRUNghR=%L_SnH-HE1 z#6IHSNv>UA_e6Gvlro7@)>d5Rn)1vF;Oq@F_ddMtzcz4?EDrDQa7?d z(&Fmr`v2Cgf<=z_2_e)(ER?_jb$(FM?189;q#qQk69(aZEB>v=w0yuQuF=e&G~l={ z`g5kp>7>nMeaRL5(vHNRe8_zKtf`7o+X7vV)?H#03UEikzZKwuc#K2f^&pM!aU;VL zH_wl!Tm#n#i&j8~p0F6XVuM$B&$DFMrX755qOKC-DSG6dlgXxq27dGmP}1w|YkdQg z2DyNLDYx_E3@CRXpj6t{v`Z=U1Xq;1LGgBUFS%s6yMl zc1q4&QTvp>&(|NjoC(s3&ByAS^k zQ*bOL9$o^QUf{=?Qe2dzD5z*8u5>x5rsDrj*ZBREpb}}&^RVAP|5}<*1?((Pq}T?i`h)&| z{ACn9;fP~+pI%b4wN2l<*hABUCp>?#WGJ%W2d9(yDEhPX^%BQ~=*U`gxjhHXi+w8$ zHe;1da<$hrB12O{KZIt5=7tu87K={){XdGOuNT-RVA~IX%%KV;NAidPN4xP?@He48 z5CC2n3_ce~@l&EB*}J9_)~6l>K4AxO=BZHrHaJ?KDr*wZnO7%gJ=8XLbGmKR1>(ee zyV#(=W`iimEp7plWcc9%(ce<>|16zkdZe52$(w)hveJJ(B}Tf=&tgFd1XU$nzxUen zKWoYv=nQ)G*#=1`MXGBDOXB@rNMdjrm`}%B5H9`Z9H6+?1WS zqXRkH`{#AQRv)_#2GU-yPz>;3|Mq*sWsBZCo8cDx@ua7`asFCCKIQ`cI+=g1iT(E^ zU6;?}d()TEl`WE;5!H!H4xgF+jL`}h96tufw-)mqed`R^eu8Har5loVJzql*m=|hv zZvl-Drn#VRNBa7fl_gi9*=(He4Tf>lHqg#c|-e+$K?)45~FJ5oY=7bk=bn2KF#cjM!FfgVMN#}Ev+6)Z*Gu}a=dOB>hhxt- zQ(9ZBM`ca0jD?&CiX63fjJ=`RX|*2?{`-~yGieXl5?PDd1q&au^_{Fr(d=5|P#&JT z?OsD$R~LIn*c;B5wtLQFMartrX9L~o#7;Xt*^9ysW2>e-y=GZ;d@mQ3@q$VFt7sIWx*s@p z{8%EHq_P>Okj>bbJ=j_T03+xgqlm1Bda6#-|p83bbX>fm|{7ItHf6SKBbDcw;sH8 z7fEM;uT0m`Kv*G0ck>D}K#NI*8D=v>q#ZJLttNp_OF`+?5dHTtXua)10` zY@#Y3{rrIrw|_|($-}fR^BNxdtMv0s^br1}?w0IBNw3dB1KAWBvl`dto5$^KH-uOE zX6?6Xjhs)%o>5>G(GzwupId-{82W2O$0b zRo$qrr^+%ltGX#m;}KZk8fLS(2FI)61YT)&~P4fxar&x|7T&m^wm) zm(y>4%pbh`MvN3=S{P2kuSRALE$rgqMZ8ju#zA=L7l`6?4+nF+bw5&GjyjO*MWBJ;_sp|&hAT13RR*FkDM`~){K=%_h+f?l`^+7eay1l2^(syFfaqqHDERgw`!Vd4gSEj{2@buNSDkP z@4|S9Ec&JNlQ&_GA)1pd@*#u z7MG8ZBJQdRH5(Sz{hdE>=Q-;xb#`gFAf0waoujrwJNWOVb03B&jmhEn-%MiGWg%uA zVNGJwEgkTB?tc4=Z*z2Xv^Y)t;7YXI%}Eb)n;+dhWX9H0#0Ohob5TYpT0CrsHs)4H zyUo~^-_p@zs!x|~ZrJkKs@Ph=Cj^uX+1c18DyIFHN;>dJOv!M0Z{1HlX(Eyn~mgGSy1dU}_a2E9MpL4Gj&t5|nD3n08kUvM^S4`+sfO zTG!+~4H0w7mj2rPwPm$|Vq0_mT)qifH}r$zx2!3M1cY&;It!Paq>E2UJX!n88qOV`BbcMyMO_{`jAz>F(xa7Fc+W>)0~9@|%ltDuok(z^}8FhYUKhMW3bP6lZW zi2PdlnY|W=!zYm`Yx*lK#l^)VQ1ek%KDCfnJ^$K*NDx>&KgKzN9Gy;y(k2OO>cT7C z-6b!WZo~pS6#WzC9CtNk;eR_hCj+`8G^A$xMwZ@awbqLm*?#Kj~`SC$;* zf+|p=Gksspf8erU-{xa#+-5w%iO$#Q%Co!F2^_m~063kI#VwFAGi0N7d}%#stCfX& z8L~Y^rK>Xl`n}I@G#yF|&T=$|4ryG4-F}c7=$J{9d25@WywTis=`G_(hUY+15vTeD zz-F+tv~+XZ%oO%QZ%nZ$q5+VFKXO4j{Ic@3OpwzTWaG@D#f4LVe%+a)ryzj1T6xHq z#=v1*9w{kO4ifa4=sMqGX%|-S_+TjcIu8J=N_WPI6qFP9|tiYDC zf*9E`?D+^h;wJAkkk~D~U@=VUUf)w*qDw3N8EIUEHwKBoA}s-@T5k~j(p?l!*7yZ@ zple7tl^F&=dj8WCKB;ijt#wFY&{V?W9aRMxEkN%25ZH#;(}U$Movee@xG^K5@+fr3s$HhcPc=Tt93a;&eDDapfs9l21 zQ}5W+Cu5l43lJLhKkXf}wxKq9FHZVm4iY}%zc{#*qwkP!ane&Vxck+}10tqIrZM&a zNjo4Gl#b@sMMbqFUk&KNo?O=t{Op430G-GSIj*dz5%X+2p%~SYJ0*G9q88v`rMx=~ z<20?%Kdd=MP3~F@6J!g^AFe`gL$wY~CerRQ`=lH72-)xwmYdXT5RF&a_9n(pCc*`I$xFYDyw6cg?@?eR!XIv`-o$R33I%rx}j`hX<0lsxyO03g70 zqgS)<#=-tdPKG)uIeD)wqy_nK6wZ8%|}~;GQ=s z=r--Y7%PZIz*XbKK%7^Xt!@!w(EZIk55}zQ%|}*02YBh*g(y9Wmqum_>>OdQ%1AWE zh-K&s#$(-Cd55nWn}rsij`eowxE^b`j!PfEpn{>-><9N8J#{Zf+MJR?<7$gUM&2nX z?+?R@#8zF0If{;zPI*cLcuGe4bh_xH!?bz;E`_+mP;PP#ZpwmZV_CltD;8?Ly`E3ItrqNvb~7OQs_^Zw#(ayuoJX|fyTiT<(&d0o)FS3X{2e45tE*mgTevjx98 zv;&IJ5g@mno9$BY2q-%Cu?7MZtayOCX3)0MT%9 zOZBjb?b?cvjrWo#9!>FyBBceH|02P#lK?qz_bKe6%nlyLJ)0ecH;>#L#rcjCuTw~K zO!v}&26#ux>or|)uvJHd_ zbF;JSKp6{l$^Ithxur?@Hx$wf3i`e2QU`&=&C|A?1<$vKiZj~ATZ49`!v_Sd)vOA5 zzv_TYZKbA;b z`^MB(JT#c!8z${T^7C&}%RKR)e$jn%)mW3+pzv;%S6c7#&b!m-m;rN}r+kJ!7_}v{ zdjZ{Sb|J4}clH!I<1-F|O-Q?Xr$XHizs)mT(}xcPde+(GU53ylODG773~&^r zwN{2*AMWEhU27Y}8Zr=YxZy{XF}Xg;jN`X8E9(DEaI?kPR9d>@1RIV)GMf`{?H;O{ zcs${0X*s{W3{8z{=e3~$@q;M1Y};OuXyto3S0Td1&&?c?PgKlWEfAE^f-GheFm%6% zEmJZII^*6a?SqTifR?+iTD7&KrvvE=R1$Y4$83PIf;mu-ZwEl*5j`$au)Y5`C1A!p zjORQ2dQwi#>561KM+)K%$}@NhJt%|Z-flhZc$AmF#>%$Bh?qN_R-}2x96LH1I0zV& za#E;MC=H)&Z)EIK6cDpWw_4Ihvs#>w_JU%cJR2u9yLIlu0q0Dz1 z_3B|mivSlSSPp0h@5n8zf;Dtt!4UXF$N{*I?Je#J>0U&nu6r3&b5*D<9Y5CzE|gEs z(H+@dHsaASS0-{(_dM_VRrq*cc;Ygnxr&nW?+UVxRl1bdQg5|P13M$V1NWiBo*w7-}{P6aWeEX9MXat|586Y~--|AzJ2 z<2|_C)Y$ZTY`P10|F}`cm6Usc(ZYQIpK3(Vvf`iVnunPW3s6d+6f?8NuYyTwmfh&OVijWfd zOJ=(CrgDbVCycHgf$6~TW`_NQ%u5qzQlQH^deFK2{vJ)e4L|(ugK;wZ{M2U0H1tE! z59`G;FzS?*5EvNjj|yNK7lTr>xq=_1@4|-WND|Zx4UD!3ZEEHEY#t&6gih)L#bVvH4i z?fT&5mrmFSUlD3d7d=v|lG~X)tg05_=D4C>4z><`S%d)kG=rdB3QZDMpq*89MnTzRrM6PegBQa2B{~w1C_(9&(JLAB^ju$ z9G@kK-;gBK-aU}At8%eH)_j(fKPxYXUFwt)B8(XekgX~sxGfK-mV6S&dEH3h4!*RH zHm1s|p#gRt?n5hht-2UXgilv>N9pAKrc6+R<=p^Gai<9@5z-S2cMT4|hRiEuliegW zx?Uw_ldw8?c^^RsYJJx0zw)=0+GuNTAyc|}MK<*jCsCUq<{StaRbyM`vJw5RnE%m` zvrrpj^gFlxy|9j!a!>p{noqkd9 zPX7z*JA^7j$=ObbjDq;WdvdLKm}*iui3Q97>N**ym59^}nCXchxbXDpN@EJ$8M~dk zykw&1SZYXc!}E&Yz7{|HiY+ZpfjIv?j!+46;OiWAwR>I*8RWTWeg?JzqR#81;=x)w~H)oWK5Lt2yXA?Mk-NmZ;4I{SfC(4=xk*#Tn=x;He+q$tt zfkHij4$#h5@(V2L$&x#}Dp>c509+FbOC6efxFnDzLEu_MfM*cQbb(ZxV6lxLsO&v9u2YxW92r2J{99>Zi$`(C_(0&SEdEJ zD2>kdj&$p+Y!JF-=_#AlW03D6c(bt);enYMb#Y_Z&{vf2*D-b96JVE9m9TFl#GR7r zp;QVO5}*hibpIXHl2UYZqcg2@dA7d6-SSOlzu9YLU}+S9B@23_&AcIA{z%^AE{cM%?|YHn^^CVZT*9C& zShcflA@)}+J`4_~?WWIA+-QlF3|O779uRq%n|rV0K^njJ_nn;6g;bL+rD_7r^cL5k z?#~@_Pny*Ju#G^~^oaugSH(Db!D?V~Ld3Cd-d8gl?& zse571uYSyD+Jc$48l%xWD}&<;?Yuj{T2`*gN-5|TqmbXdrN$a}CBkp!&gS%Q*yz-| z61&sWAm#GOB5h7aQIr5lFRJ471iu923U@so5LV=yT^LVI2kXGq;DbND504mR6 z7bUB?M`Q^!5hF!|W3EtwKdrkGys7bNC1kFhY@#HUKyLSnCmyZH_maxTnvgbIQ;-$# zv_5$5WPgWT>3HOMY-GJR5KfgoiR$SybbCz>7P4fk1dw5N{gIFzU9tnqZ-YvKw9uo< z0_pCEJgs7&CkoDZC;5ICv`g#(CbvXN70loN`RAVsd?h8WPpY|FYqStVo&ZFaG6;oW zQnVWk?P_oV3;u%0;r9&i+l-6K?^Ym*2mFIa>@y};%Wq9F;?M{gil0fvJLLcmy(Gtb zSUE!gqU@)tvp?~jqHC&uOvji0k8((RsPp)7{X~{D-&2oDHZw(j+7LDNldjy+*chkL zSP$jpkMC*HR6@cn5E#9{V`#P29%Qdk?DcCG07&q+$Mmdn2k$q&#f zV;oz)rJ$k~99?qSxT4a|7orcZ1+cGQ3c4llNG?6wP965in}yG(A0T(9Igp++EEdn4 z9R=73jkj1Uvq?|Y9EDB-?v`*H*9akDld4t>2qVnQs284w@gVW?k^#EG=pHTZ%3uz6 z#u3m=DF?46&81cfaS_H*@S|J8uzPnmazy=R0YzwX9^Z5qbC~hkih$FW^H$J`cz+tl z!JoYA@fpaHDlrNa7cdsK*m_RGZ&i~OOV39%L^tZDLg`SCSkwmw20~Zol_}iVY{|iK zI@-x`1Ew$Hpyal|-ObjCTKLh2VpJT_S0f}r1)%PRpK6`&u5lpO!E#n<=1Al~+eX&! zJ`C913yRsIEw#t+X79(=mpi>}0oJgQBGk-oqRO_rh(9%sAi|C}PAUC{u&186dA3}B z{j9kqRi=b>p-tyo+VF|G)};qmxGxt4Xj^RS8l0O3Y@54D-Yhn zE`dxmnIUqHb}jg)b-r*BZK>RRZu82y;uwlUK&`Q^ZLY%H7f-%enT?sV&i?%IDShjA z1iZH|^NW$+TDIkz@`PZH`H{VY<;D0@(hKt6Vc)K&2%oAVEOI5BQVbkmpU=3Ml~?Kd|&kd zir$HFjdts2p>w}qk+89gorausjw8&Af_CZp8o6gayjXGidU_<0a*4!0xzcD?7!MUe zge7>j!oqrz*t@*FAKaZ+CLZn0l2z(Q6!kZzGrg%3|2~Ooa<55uPp`p;i&Ukl)y zLjk0!YtD_7AIy^Q%%2s@rOr7m=zSb@_s6o3C~wA@lHGeCLj;cE-Mqu>yUe)E}7<}K9ioH*%p l?h})oZ;OW3f4jml_tJ$=#Gm@e)-b~<%WKG$%iMeLKLCFw7AOD! literal 50101 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 z%0D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 LHSQzi9tHguU-kJm diff --git a/docs/images/native-launcher/worlds.png b/docs/images/native-launcher/worlds.png index 22a248e51194469fbe5fe93a59b80e5aad84b5d3..7786763296f05c6f6cf6f1c7daf101c0d2187fb4 100644 GIT binary patch literal 70822 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
nvZ{e#g(Vtv%PxRfQJ-NJX-XeHF4MY$TJ6vtu1 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 literal 68985 zcmbTdby$>L_b-m9fFhxkG>UXdi8O+UbV`TPokI*YA|;&z(%s!Kq$u6p&CoeW*SUx1 zdCvR1-*e9OyRM&q;oSG$d+oJXeAZ{}J3v8B0_!o!V-yq=EXj}Wl~7O~l%k;A=fXe* zetFdI~5n*ow-LY_~P@zwg)2jaMXt!)pRC4soj>q_F)v;*RF-ju!7>; zpg^jZ;V4UfwqjIdOBg&pOtU=SzKc+aeEm!n{}nf!8XY(ERXBfKV$|TRo~*A_PQl1# zoFOe|l#OtTe@=Ej3|0@D%W0lTiu>?TTosT2_-Fc+r0dgPe-7eO;UeWiLE%!s@cHXE zEPT`#cYlf8_Z7jo`)g3-#sBZuqN%-JbLMOy#;#UJXEUXzP&i<3HXf&Kzi)Ce$BCsx z&i_@@%DQAi zT$DAAu$aKVlP=ZG04A1wX$aHGb~8TzF#VMrSh42&-oCU{Pi4)mdZ|jq;F##d6CGXz z+^{5=%;}sUHoEKf-rZo7w0a|$Nq_0OV%n6*k0>=!F|9*&w4L`8G8~t}j8dyX-2&R4 zcW)X`x?Nhm!A zJo$UD6FcP6iV;^=t_F}DVT>Y^zU^Q9@_d-XTeX+1GDc7NZkm>0_mP@~Y}BQ?9^UbC z3xtl)S4q(I;HOu5n#O~HSw<791!Q+Gf}rtD*KY_gqF9Z3YR*uc(h5E{RrY>th-T4S zzI)*_)zIuN59*6rjK2=^YY!FfH@A0G50Fo7i64mCvQ<6uF`B@4BNtRFeamd7qi*T) zUgZ_x2&OENEQu_+Y^p%PSXT}HD;k=%_Vy3r-~r2#vcacAc0)s5{!f5O7T0hwem2%J z;}XW`Vq!_pl2Kfb6|PF4X~a9RS&V+V7i9`F9X8!EMKvQabH@%g6+WhRVsw zRjV@_85srEFoT#u??Kui5GWXwiCDT1Ok2x>l&$!Y&qJDt80!#BZE!glXSGE$?NO## zW>+QybUiL37@vs98L=v9)9r;2m5}K8C=n=wG*pTQUbwSCD_#fsP8xOkN*gEd1KC47 zDi6`fL`FVFNh&iAaK`@l@ljGTA*BJ7MxC_+r9&D)i{Ow>rMm@-7}WzJyLVIquGOC% zT)2|4#$UwC#4E+CgR75@Fw-+K8ZW0(U6I4GGGcO&Uekj00#GV2M4K#T^owzMqIv2Y zQz`QKl$4y@csp&0?uN@|E<6u-8^u-(!)H-f8y923uT6-f^Q8nyF4kZ38yFa{ z5C*;B1RslbNK3HDKLptsQ*&@A^>cEYujMpQ6#miZxXCJ?y=SWLXre{>gG{Hprzebz zSM=7Lbk=4l=|5xJuNR_6Ra+jWiqQXCzd~LIT_`6{!j%?S=BAq0IVagldCIS` z`Jv*1$6%%Xxgm6a`fdH_9aOk|^{_)o^_bORn@kp!m(mhFp{^7_lS>go$| zXGY`!&f)@|N_6_jXMw_a-&cq$`k^o*^F>*C0P-Y8r5t`4Vrz(%7p;hdK zGI{cO7v}U3X!KT|j7Kirv090c8{77v71T++<3POF8EwvLQ?(nU9Ns1JoQOyw&0=db zFaF|}Kh9AOL_f_icQYdwb*3|dI)TTg*s7^%GGY6-{(c}#8R>hAes@tslFHp$puQ*t zCJpv@+~ZgoJk{Mz1|`s%&)_&t^Svlg6HfWbNcmhPE0RrXMg41Lm@JHGrG|;9BD&$F z(S#(t>?y&VTvj<-QC)b}m4h){)16&CNV+y%yUV~gOjP}rl}Y{lb7Z6olwfZoi&>zB z&rm(u$UmCU19T!~xsiM$HTftj^*yhBTKVt~>&G0#7^i!4(rFgE(^c`Vhd$vk-@ku1 z>WK+pBmcxEPzqmL6S}=RqI5sFS0W=Xe>>59<2Ykg(|CO{LrhG(rP8IgIa#(c=e)pj zni;QAVO(W8wEPpD5`P7ULZH@hd%Q26+YN9cX(=fe567TA6{H2!zW7`1^(Eu;%cN|h zdX2EL6J;>|{3z7@P%EQyt3ya`x=YCOwFKDc8Pk<}arrv+FO9yRP(p4m7jTFHY#69}Z=|zN?)bJCshgyzOv{XzpLJdiE9W zIKl>_ro9Y%SF}I{A@1J$IV^iptv~nj;FJ^H%24?QUxC`Fj&yBSy*`5~;rsH`$@Y`+ zjZLns%3wHO8LN?Sw@+o}nmM`}q?gV3VPGiFIU_tji9HqRuA-WI&9^rllo0LH5Cu(r z1B0qh`Qon{)pWtY4pHGvpv$4iN zX1s(4tskl`V}^*nO)6JmYIGm1O!0*F&vh`Kzr0{BeV7%%ADvKNhVFg8$q35pTZo_> z$pkzN=mL+QawFAM-9UtiGQ2{GDHZ^yvx;@9V4)_OB{g% z5qI~7Sy|;6x8X=2^LmJis+Sg9w`~#rmzL=OEjwc@#OGgun=zt=FHmTKO^#NIJ5O2PwzGlf#5> z&WdX0FUGZOjEs#*3jcj5g8?LYgmna`#_eIPcE`NjrDeJlXY>s|Psew~kwtTYNoYUaZcTKC1yJC)g%sTlWZ{d25dv zdBjNpLs=D}`t$9d92ZXduyuFl*XW}_whEJh2sge|AU5jD)Qt&@6>lWe`km=`ak3VN9L9dYb_J<7$$HpR)Wsoftm{C+zM8y7fIsG?Wvd<7X zn=(l`-1*ZXe4}{9JQ>8+M1KkrG2$rDc{37hP=>!Vg?D)H3nxg5FK~;`o0t{D$D*d= z|3G5rVa+^=zM-+9n#q45q*Ye0*K~9>W+T}G{2u4hDUA9tGG#+yaJ3##j?J zLo+<9&s*-}Ja*xD@krl+Y^Ci?wuV?tD3y~`*-H*s-cxJV(Wj*ZTl1T z1kcc2quyx_FtN4{#SB!gByr`8{CCndx;l9p?^7ZphX)7SinMB)0GqUKI$w)n(Q3Lv z^!)s(%o2mjnb6lSgbJ)GSRgk?DJv^@=CkiVe8|piSPA8S z!q>yyek>72Q4c_pv7*YWZM|D1h|1|HDj-YN&WkVli``LI&JWXKOo1Z7ObQNOd-m*^ ze6m2Eteh@vFk<+yI|>=*7L#XR;?mM25ghJE$qOw(*_yA)I|cl)#S1QjE^PA)#$aj2Q^+28tb0EzL{oW1Ty&_ z1BX>W>d!HgEcg^h@K1Pd;_DZ=uznaf+VP7QNAHaQr&cS{OiD_^BXCrRdN#J=a&O{+ zs6GRX5GH8n;POYUB9fBW&}^E#YY>}Dhs%u1k;{uKgewm5q(Je5)W?tiyRe#%ezK{) z@qMFqV`Jla1R4OcS}JPAsqhzurwTPV58ujNk8c3jL`Tz{;F{@Ic!0Xm?4Pv+o4||n zBcksYRTdKg7qNPt8qQ?kwEJB>JrldyIw9{ow#SRa;b(_<@2{IYE7&FU50P zj7_z>Xf(Jy(vwb#_PjoRRT2zD#I1r5$*t_fL~TVj&%JLk01OSf0PsP;#p%48yfaxJ zt)ab1{mIo~2PF}-QaIi7c#AuKk9*(G#O^I_a$};h%D4R^qz|FI4%$oEWYuh{is5C# z1zhzO|EKZRsF}TgYHC3GFF+ezOerqQj}*_B{3)}ubOOTU2d`pMjT2{VnsvBBp0kTK zc<~yv%P0bX@K#8`T}@Z_=H@!$bOF+wtJmc2`&>fhP2`&wQT#Ji>rG8f>4;>vy+@cc z5eW%39&XQ}pXMy)u?CiHsTy3yA}z|g)p+lO+DN}Nfd$3b6dB1q@&R-Mpa*JsZXg+` zLUMw_qd}^#Qb+;Rv)m@FGF4-vr^rBf{Hx}Jl8oz02+wFyy8OF$X&3Jj8-Vk}RJDkE zE;09NzsPTPs#s9i^UCK!o~-R9Z3r8}NihDG*K6vUw={Dv_2734r~XG9G`Mof0^*q@ z$MXE90!O`^=`+6rqKc$En8FY!8uP`<#o9J22Ee6gNWnV&5%H0$P_j z9XKEMsAA1|(As0el7+$5GrqqkaS>U6!AR@MiOSgLu zMDI51>@A`$+#W)D3#>QiFd)b?2O43inY9O;x9NCX3pkdn9FxwZ#`}LWY4re$M)VJp z#sg3~FaKsv_t3m>wE+t1ZjW;S-xl;wtA%; z|G9`G0S2c-Agf-Vyj)+_z5m)cJYk)Lmj?IdOX+ZKLHU(Jo5XF%jzNJZ0VNJyMHmkD zP_fb13%sM_MZZXMatw$6Vo~kEcz0UB!kr@>A?KK*8=2#ngFIPUDx z*0J89_NrziZ)YX_e&MWVnG?(Xv4_oDTR*YJIB<2`Ed=32!^iuf|Iet@o#^o~RIAqwb`G)-nE zD;la6+!94mr4)%znI}>Zyij~)_kFlLto&7e`OQR6w;Lyv&?7oqFgoXh#VPviJ1f*B zumI^@Zh!5+m$-SO(Udn1j~4m3w>glm=^oFqsHOV$NAB!mh5&KPvpFk4=mM6Z$J$QO zM-Zx!XcOPp-`> z-@h=xvE)9ZHu2rstWK(h@Z_+6emd!%^P(*kXc2K|O{R-7^Pc=nxIjfy;S9t_Yk{L9l|R@L z*KqBmO7-eCxo>$YsgbFf|4+nH;hL}mlaP|2QESJCQfG-2j9f&%iKEx+l8@)E43~jJ z!dRb9lJW{6)&iuNV0m~^-VUk6Sp7Zg)>Q%qhn>F#>;wc%cwu4~9J2TikjS0(-CdH0yWzz2U3bWwjX zbQ(%CM*#~oGX4+1rVc$$EUwt|p3TY?wKUk`z3hI}Z$J|y4X%jx2`#?ATJHW(PT$o;njmBSoXxd-|%h{d`Q zXR6!XGg;)bw`3T0=XKr<`c~-&`k+!>;rp--q$$k*UcGBMd+;*#_dW3lYVb3g8QSC!&+9^_-on0F?KJ_Ec((77#?=ZyvRCgXeJPK^tG2U)^Ioi4S-9=fm_*r=h!409h z7$gexmreq@W^9m=I!Z0`No)##INrmF-Y}Y|&a-Zkh)*s{1vFAULfwMbP#VQTgkd1! z!)vYWDZA-pmG8~z4Z>P=MRab9gia0Rn=82RljLp#YG`9l!5_LXY&Gl6wAuBN!t*$f zh6O#dY45h2ocqw*N3ThugaSQc;!?aOa!QAsQuK|c1sR)he|K*sjS3Fm_8Or(n(TL9 zWP(o0>L@J;R)RjU8keJze>XlLF-he^umkz`D-S#PGDHM}RUZ);y@YT;w@+OB)*4Of zq0y31U7!8|&ohQn=?(c8Uv%^eshcNOQnlqTHD{t8r?43M+89hV3zQyagClmTWEdL^ z-4>Motb6kH2nlf%+FyC(OkpP8(+Y0Cx-o@ga2#>kstLc*w5MfC8Tbq*%n$Ck{9aD) zUiO`U*6-8iYeT%t31=hdAsFvrL*1o%+A(N%QOzRWYpe7BY8st(qLa2i1UJohG9FkP zP;xK%M?Ohw#S$uv?8vFu?1pN?X%`p;#hE%TmAyVRB^GIS>l;ZWZ{5(bGI{fqp@01o z@gXCA(N=Y@IV0OoEK~ZFR<_ESp)U01YLg5?u41`OG4rcN<0%1U0cljt*6=l2|CaIR zMyqYgexrfC>0To^OLeT`Emt&@VXi17Z#JF2f!~|p+b<@xrDKEYa>zORHQ`nOhT$Wv^HZ|m!uwJeJFADVQtMoDx$SM_%a1$RQpho zk+F*qCR)|P_st+uf76tO?&hpAN|#l!ADm{_pZN*9xW2}z@BgJqsqV^v^fyZOll#Yt zUpHZ*Gnr|m{!bJhr#~OJj;Nkz1(k;Op**aU@GB#yIBcx$GLq^4y7zx`J3O%Xw8GL4 zw~LAr;ktnokHbf|_Hy@6&_uVcCfK`6s?h^N(|$#VHCmgre!7`K$&8I!!pzpeZ(H-2XO zuPJ~@QBd4~borlk?;zP^&%eVv4)U!Q-T#Wl$e&P7IR3q>yBuB``=7uXtjb)UefQ#5 z@V^HC4UYf4?BB3>$LK!-107oA(7X9^&|4earQJpKWn?T>RDjO)fcD1h5OLR z$ORWrVE<#EXyQ-`ey6M7C7oXLKK-;w%6t{rhN8%9;x#DymaL3Scc?`K0+I5*zBr9d zcxz%gnn}+8%k6aYXd@$RT>TMJE&)I(Ndy=Jzv&e0fdu4okFNsc36HYw1)`D|6$lSo zg4tiKFvN9=KBwMnP6`-;vJRwx-Dr^?u{OLQdXfROMuH>_zUGq~!8Bwd7TKUB3+2Kt zQ71hvSCn%efkBaD`V9~#GYnp@gs$p)a*W$OS+r%mNGwA&X|ii3(@F$ufLpH#o>>8p7{Ds)xW zK~WEn(b{V`>gQQ-mF9wLJZ^swdfjt-!$!_fC3JJP;*EyW-`l@bq+h>9KB%g*z~n7S zjgBMUd^Rjy836F(wr$;?;vIW-1YQCgG&MyYFb!_|@88D8@Gb__2DBtSz8*v#&u8E$ zX>@y8nbgeLdWIJ}qZCM?UhmD7Y66X{I|aaP2RilO^QrY@rc|ap?XIpq$l8>NIAznU z`%$0U>0ZuwD0%ZZSC>Jga?XlP{q7q@@GmSLQ@-am;?(?fVTj~xPMhw|Ue7Hy$Pm{M z0yx<0Y@JX0Kh*OJMvI7|PPV&7u7VuS>;e8Fu>8IR(w>3R>kg#@bU}<`8@{kKW0?jIO$GxkE^IQAE z-)mTPsuN!>7tgt!b*SmNg=i+cvFaA45VqquZ_NVu+pRqre{8+OFqPEaH})!Dv%L>h zxzMoxtQSRVt}M%C>PYTSlnC2wjTP|NxL)o$_tWXgNH!u4J5mnfi*-Cer+ulBBT1Df zyZi_7PPO+z6k0kZtiBCjCguM?6o0y4)&@q}eB?jDdw53bgkVuwl z=q+B#TN)Qeco~tNYk;%GcwwBec;KfHOPu;v=UqZ3p+AFS>E5ns^tsj^h`b!*-bC>) z^3EoJr3l>|{)u~VVah=N4ChgwrMP#Fs;0g^wnaRJ%i_KH_xGR^zv*5b#=Gq|#!eiB zg~&V*^_Hv$+E3uVE@hJq1MB20paZ`3bcgTGF1`W~wr*Acx7!Y5RiixUJDL5+1=hkF zfI@^y<^RE_gj~)n3^(J~ob{y7_VFxe*NKk#YW{NCu^dYG%}qm`l#(O*XF(&fR|a1c zAC)`}BLpN817&~K(208cfboDN{+{kH;WzmVxFquNli_b)4rz?M(;b}wE=YVu1ImF! zOs_$_EU8CG^~Kv*esob@jC*tg zP;k6R`Z&NA&x6hm*tW-Q1_8ZD7r`NJYs8ESXH!*fI5yY&kQv1Ic+mn-Z^!B#91WCF zdY)0vUkpH+hzJ}zl@#7X8-S+x9PNHD|9<5fCEz+yanO+>EoWKul_Jwhi&L8YtL}ml zrS%>Lv$^`yMcJmNIhT>keTeO$l9bdI0g2DV6S9qg%Sy|s$O)g_Nrv`lrVu(=GR1-9 zMh=b&w?79XpwjK{fZ?Uy18&N!i&FhjK!D<2p$51v$>Jxz@1wjqK$k7Jpw8mIq2KXB zr&xsGx?IS#+ISw34oNVNSw%ydgU&kZcjxiawuU!C`S);*=6|{{kw}^h9Mx#Slk?2f zC_Vlt%Hpxe17!0QFSubqg0f1H=aZV5fSKFNlRy&9QT_q`Nyqnq41*|Ob*kRZ^7n0t zuf1Kn3%s{q;JVU-VKT$CI5VvYa#yZfZLzxM)0GVH^k4pvp-OY1K${2GI~4<9Ss?S2 zH1C0c9yM^Gq_0S`%60F2olgGInyjAt&>qk{XaM3O!1A592C?(B0SGDAc9BPW3?WpZy8XjPJAW z_854)g6B$b7_*Fh`%kJmlU`7`+mi2EwP!B0(a8?04N z%VUpncmBGvBXJPR-rw)O*PvJzC)!?~$0atvQ$wO?Wv!d9Pnw$#T7%;%q@;RQt%3Pa zU;-St-LkZ9)%!wM1$)%}dNBKQsqtuDrd5LN$5tLc1NRY_QcVkXU%QtsJ!3Apa4~!+ zq>|Z@Ll1y-~?KOs6DL(xSU4cG7$z;M6Ub@KPUL^je^iSJ<0{)(hm z>B#~I$!ohCrhUiRT1U2BmJ-Rv_&JAzSC0ed(1PWq2N)`i>Yn0>-W*2Q@Gqpzq024K zT|7w`PP@cdx!J-Jw7~S?Js1D8-?Q&1Bai~rAvA&=kUzn0kpuJsJ-8hyf6Jwd64fgrHWOB@nz<)i z3?0CGUwBysgR+j~fXC?w#mIUILnRGUw`Uyh!|mpUYtikK z%{VYVv);wJ+Jb*sBlkwhd^lhH#UIkkp2PRD14}DwH#r^)L3zZ|6V@I#yKM3_x<9IH z=OE38IoU=QHG-#MPSHAfS6vhLO<1)hd?)7jx$MR{*qgfMY|;M@HT#5TJRkR1bO}^n zXVnF-2|fi^qg!Lo+@5sI*|W5%m<{UfPHmS2XKVMRk2g1u zBqMTQ>splO2UHULlE>R`_5=CBG4`J|UFBx_z5PNGj@ltGh4XVrCBN&-0GP*^!7K8i zv`M}5Eu_+Fxo~3`*1DczjQ-bgLd57Zb^Efh3wZWiu7C9_i{)Q^O6#;Y+!<}VmXOQ% z&23`W#^XzJI#DDu(7isRq&ECkpxMZcy^1gpr-?k(xRgbD*<5Z@K4DDr|U4$Z)Gq@*sC@{fHS zk6AJnrT&LOVOqs00D%hAY*6;UJVKr7L74ZymICOxe&4(QJE$j=TwjJH7Ux}^_&2J^ z-ztG^7Za)NOn^us)jKpYcjeu5K+eizr^ac|V>L68C!abCqPkF@xVOT8O6vTIwW+-y zO%^HD-lM;ufcmVs(aKY!**94u94BnhybpV8u83gX;BN~#N&aL)s>J6&n5sXayj@@w zbD;vg33T}RqCiTzCr`j-C$aBKL_Bt*-@|=jm*^8^UFV~d&fdbSPB95L>?Cai6K`7N zN~gf(P(Xb8pkOsL8x`H;T&`nf634N3z`a6`+?)oOMJMOl>&G8|wfhHS#Iu=Wzo*<5 zHg7i(`lXGB(U$R1R%4G=&0f51yjsUUe#deU30Uvi7InB7zLjJ~7p(BEuYscznf1fH zgc$o9Sq(zs=k8B0WACmmcGoLHG=s*W=paULJK2YOX4j`~?&xSqat$pOXkkee{2U() zIUT>8U+mtCBJ$YdWHwzxL`HJt_jZ>BC&A7z7nXqEjo0xNWWRhd+sJ20x(wZ2Lq->VY4>T;^vQ1S2^pJOrXZ5s_M7%AgZL*bRdwXQQJ9Q%{8{ z(hy<7lsVmIN8_dRKeRqRvOV{Eo&QMZT5RHGC8|FsTC*fT_AD&Uih=$qsUS3526~Bo zlTM+hJf2Eh7l|Jm6NVAr%+E0{W3qC0jLym_Uax6s-*7U?%ROD>{<}iBw~y&V$I4J5 zYn)arZe!F*3)ki=uoUzj18HUL_9_ZiHE||E^Ms4Ux0SF$#4@_Blinq>`yW1uNzfZD zzU;(|EtX4YHiow+rRyp$$_lVrPgjR^lV71uYeNcotS_GBry16Q=HB$ts=C*E$I7?U zq08ya=AAwVyUS{b@pLM#Wxj`5UORCnSy&_L9okf{t9%0~xi_&r)ev;NU2 zxS;uf+>?e{O^1zW6n-N3!E8B2J41J9LfG_Av^ayAM*FXBkoW8<<0L9#V`ae0c(g?|0T~Vck&%-(Xf^n|FcCE> z34V99JZdRk;fVqAZ#|dQc%{D*rE*HIs|jtkH_+nx?I@F6(w}0hc*^7|3DYDBZjd%8 z&ggyc$X#De`ow6)MH2Oa5C!?RNY`iJS;)0|1M=98eR<1t{?l=0!wkxnilt2XcgJN4hOK7|k4 z#|Zy`EHc(6K>lNJKtM=fVBqiNILst|K5r1kre$}|dxmlEtvrs;(P>5E$rP%U;OT+FNzga@#(P`x7G1}y zoHM7Pe4D3_;C~}LWGAOB(sJ4W&=V6s8|r z1yz5XfofSu{<9LYlOw=~+dtXYN}Bd9n&TlYpS=lykO} z{{(HtLi|AQM6qe`#fWA+TUc6znLAR%W@Qovj|?-GE+9i351@?K@sTyOrx~-|I05L! z{yNWRHEl&~+KGI+Y+^&apcbn8GR=M3j3a4E2R3qa(6?o-bZw3p8RPaTeqbl~eQs^$qIM*;-=m{=s#3ZF;P}4! z-+e$)=M{b%dX-Jh+JE79J2jYUJ{byjCeflWhq`@G}$ zh8IUG&w*=cJIlhZ2k?My7QyJzoxrfCIng}d zm~Prjj40v1cy~SxPvlHqKYR_iP&yEDN&Im>QU_7eWwH!AnQbFrRWE>W7wjFwdQ|XZ zUxRuj&6rue=Azz~7gsK+1~!u#@X~9C*Y+&R22D?@D_o+K#5%onl99sUJS@&*`42Cn zLUkHd=8Q>utE2FZyEcVHU+-JABsfXE`x3u<*R++rhgGLnxN*~IX`UMAQK295B)Qf~ z4_{D!TMLTs+%UM7=sW8*`C(0!`7JBer(5e+#%K``fG8d#uR8mqiQee12fdrVm^|7k z>c1ua^mMgTwyFD;wCmX%QBd?d(y6FMUbli&lKdRiEiu8oX7$*+v+Ywgt;cQ%HkSb+ zWfz0#!6ff4EF`t%wb@Bv`Z7m;n%g#zS+NPJoz{I%M!~fY1b(2VAQV%4{+-uVvvJda zE-JfE56@#YlMI9Z_)%i>75`xbTBh9zC7%@hTkA03GN3*FYVU>IQo*4ya-vw;X~a@n=w{xWWEOT(YQB2g>fy`lU)+)i->uqB6-FZI+0?={yr z3zPjR#3sF^&Ko*&M1oWE(jL6^_^GM;=Et4cOhB4DOg<0h{l;wYE2f#YvJ*6YjGwcq z7Z?<)%sI9K=+=ea`H_#r00A?$v?dWDDTNnh_UWi^KY7wSzA(@mxUyxWKU!;T5Ob+x zbkl`6(7AJT`SK01_XM8yVkaQwJ9sQjXfz6l9Y9+y+#k+2-Bj#%^3K}+2jD??rz0de z&m!~87JlmG%J3XUCk3meNd}Z=+yTf+!q>*OPS)={-#wZGI6qwJ zqLHMUz!T--oHKT;_(K)3h93hb1W%v7MH_}=MVfdBw9zz-#lBKGGR}MtOxdA4x&l^nTyr|Gc1FxIg zQ`U{VdD-6*HmLzFkJhIxM>+6HXJ-=lN=s-?gnrNo_@7c3Q1>sU0k<9hFW<;T?Fav) z9<0mY{J0+RSFZrESsVfAxya5E?Za(q5m7an0eQQ1K_PEc{*Lgkt*&A3ohhp89$_WH zs=(w*!XoKoL@Ak7EZ?9|r!01qN$(f?$LY*OZyoJ&<_+GD0P$1kKHcvmKCL;%2K%vW zTSoQA(lgqSFYvKtFR( zq8M=r_`1OHMO05)2CN4Ty3Cl0~a-}_T`{^C`|zZI#L3f z0EqY&X(3(H{;*hJssY_T^)&UaVZ)rHcb-XlG$_&ud3F%wJAEqrZ~@8Utzw+w0xmFPru+3Pm3oPSD)VzF1bv+2=G~a zkEgK;=GQp))M z?#y?K&WQoy%l(Dw?bNqdaMD&&@j%}OZvn+S9a&GEXIu>6W3ByORR683Sen9T!<{81 zb-d+T_qj@^>?(Cs3{Z|sx+}I%+LwT6vfc(E^kmhCeh{(c zjJ);f;1oSCwYWW0VQU9s-+;}=>YqaQ>0chg1y>X&Z#o#{Oz|9Nx z#WyvRag5UW-%+o^kh;$ufD{tH<+*D7SNac#Z@6!+)`focPeqc_rNnN@dC}qyZz^;s zg5{os$_ZxIex~nLrX3yac{u&RNRw|L;3)F_fl}q*Jy5BHB{NNuQG}Ry&j@kZf)cTBRzwt`;d*&(x$#J`)7%Hp0cjR7o#7Pi z))Y_=C6j__DBn>;J&@7O^nAz;mm2?`dY*FrBqOo?)`^{gw`!tv@kDU4Cu>V2_i|L4 z2RAaKnHHN&FlzZ8R=wr*iT=z&zJ?VWtI}2K&qt8tJU4B8>$WShGlqV1H*MnQWYg6> zgIx})2tDr6T|6!aUYY{Ckr;*c`uI2rt)+#8mp_Ol$O>mQipwzJPJ!S`*MToT`A=^Q z8$HYEqXRum4eDR59x2T+EMEJ{d7v`%28G4*Dux-@GA}o1Sv@*ZLA{(&acqRORBa2{ zPo9PA$-T<&0F3BB0Z6)It8ApEB%_Rbi{`*tc9E^XDZY60p0u3;Xzq>vk zE@A>c4_zKc6xCy6WBhn=`=L&aVV^HI`+L6MIDGcr3YCfQf4wE2xPJLfMj#ESF~5Rm>R-E^Ny1523X;Xbe_mies^g+dlte zn&4oQj?1=}CtJq*RXbhtAx+(v713B_1Z)mXZ>A!M_|JQCD_Pk_Ou1-7WL8F0bN#A2 z*LZd7^#Lr7hLmR>9pH}&mL7;A48PiI$!A@fJ1xqGA#bYxY{(RQU~0o`45MO12lcqydV2qO<<7DGzqNP$5eA0Qd(p|-~?DIHH0Ap zO_uE^a4yG7OrJy`P|!27S}Yih?z9mIkIJpF+!lN5eO-&4!g_+8=PfB^qcoHSYI9d6g5e3s>oLr)>s=?UQtfaHlU z*ICU7w=iFAVLY)vc@+-i@-$@`I#_AvUW!s74La?C)Q7!nt4qG)N6`tu?h}7k-2Vc6 z5qSJL3;5I+`C*X4K8XsIOpl`HNGy5P-ab}x?eF*|^~@rk_63YAM>y@xrB9`}+b!$R z6M%=}bQrn-YWJWpkV#3u|JoRss+Wy^Q`r2&>CY(ru%xa&HmSGH;Hit0cq7Ag3$;MxqN&!aQH$MuN$IPtOpUHu7Gy!|CA!Ae zfoFPfI1=0K@wUD{35+fCx#Y{wOKgfPg1fq(?r>D(?ETmB!|zI#pMHxP<)^vUagJu7 z5nyz^)%xfLiK$L@bIG+&X|5iAewME+0W)(7mnNkIiBL@1R$=UT` zb#rsueS8cNN@@;O^ST%wMEw%8+hefNLUfy3M5hx|kv&KEPjw!dVCrtZtoLT+3BYG&*H&H? zB;Q-ue=A~iQKOt9LV*I5RU^eS-`U*#k=$MGkH&XWJU{V=0Z4r@Yob2b3%{yTvXf>Z zT79~+3?yl*8mlnBUlg+AP{tZRX3Zi)3%r0n7CV>r!Pl zNJy)sKdTKPm}dP9rR@EJRH$b7qdAHDPmpY$^D%HwI*%;8>6~*JKOyQL!b9(>)klOH zsO<^n)FhDs1v{Z)b%y*yJh1OdjvD)^l6Fxq~)&(w?2)v!N5!6zGQO> zPH%mwg|fKOBz*GxQu?D;b<;_`&N6iv%~g^3@!NQB?vjw`>?dm>k8cc&wH{05l982n zn|xN#bnOSQPnp!l7A5S2G6f_gF3^`y_F1Rq9Ug1!Jm^}}84`H*a*O_-JHOoq;omneA&elBSk7#y?wW+J5_uOq@lX02QDqhyb{ zgJ9ie|JRMYneN->`_f++pf!FHn@&+C0r7sJ3H-KydcUzS^P=VX5ONOPtS;?4Y=SpjUI4X@CMwGaP zY1Eoy&OHv2(z{I^QYJi{0i9=S7e`|vFv_=*Thy(>T1`vrkAk?4Vf8~z9rS&TO%0C6 zf#7rTzY+PNx%G8Uug;i3=c_|{GiO6)$Lt}lmFHyfV+R|n1XydbbLRjS7Z@d&Y?XKP zm*;NK0?J57%!ShmV=^#7924D_p3wWi;q`TP*Nk)BhZX$?+fQMu?$J_maEBzpCQUx$ zE)4YWcuAy^AT$r>IP+#}O!)B^@*DOLC~yri=NtRF z#(5i+>g}fc?iy&*Sa?oqk;Ibf)zL}Cx=YPzA>!1BVQS|VYPyv}#^XK{rI|O7;-`9! zrby!dA%oq_5DbOU45(ZAFwcxu_b42ms;O!n`~Zr4TkVED**a|oWE`|-pz+>YM1R;X z1oR8?)(qVdkySg^y3WXmI9zpm78EmFL=IU%MeQQO#g-*~-yF3$aY&FN7?6$hq$ zVjh1x=|85Hxan!TvW-{D(?$$Uq%?EDeztCyKcJZq|MfW6j$sxr##qQ>XK9q9T20TC znie;(v@xQ-1F&CkSOnnnSe103ixknQ0gsz202Jp|TPxPs9byllkFuxeR7omgVz}vs zgdxf~0+pXQg==|TX;r7xdZ*XAW{HXS8*R4}KpOQpYEJoU*RlD{=Jl>0Z(otS-K@&o zHvUO8aWET6vuvg#7H`}=|+)Im(Y`Q}vk_gJ$(Y z+)=6u9bTGyGXzrNP1S-Dkm1SpWBBVmLd{rs?X!@TVNS6-F0E$2$2*?XwPm{*DpV{^ z5!*}4o^;lgi(bjFHUu>R9^d!8?)Pdbai^B< zUm5ib7DKvDd`fDD_TJ)C0h}}1(E;6uD4{8mi8;))ba=XOjXN{MWw8wz-y8CIsi|_0 z32|lifp`b!&dNlX>p_*(L2(gZTvk$7-q&*!Oz-f-=2Tb)ne0nD z!DFpMdQ4g@ECW(rM$j^^;+V= z{$h)KHedNzJxriUP^*LP4fc*D@S7vIJ_K$#X~}U+a(1a}Eb%)`C>8}*!EU<@k;KF} z9VrTXDR-9AmQp;_@fV`WTBaFtQt^aaM(s$kYK>=htw3lySA)izm2(g&$=ML#lW#OX zvBv-n7=%v|ZLfP)pofHLWJgQ9Bc$osO+bBB3@s0fUZ&y1)za{GQpan#RNtJvDYffR zl+q?WBlPv;9{T5I;1%fijpJ)g4N2_sJmm?GKo9N^*Gvr1AX@%4XsdDAW-9ts*VVJtCT{*2nzXgt z(#zZ|^;6tHpKiSi{F@j{%VzqQ*SrUhHt_yguwT9NL%do>UA1=>oq^6!5W5_Bm<;-c z1+*2gGM|RK!vLc4cOgIQ-WAP&t#)|~Kh_dDAQ}iTn|f8g z{|K5eT;3u`mITaLudkwunj10L4^W}C;=t0Ugb#MHCJ?-{kWA*6HE3}a+e3iiG4Q?`z4SG`RO#!Ww z|MiMPek^|3`AEHt_qkIR@{%}&jk)6vZ_%tze7I3g7=Z)(tNexAKy|*)z3vppyy|fa z9%-G;)5R^B%*f9|EjK#ck+f6w+~MW3@4*V_$oCMJ$vpTuK_4j9>5P)XoL2_23-3FE z1WpJz^j2(V6Cw-cjZj)|JwrvSY5gh@z3rB97RZWQvO8{WpTCW* z3JQZwWg&8Ups?P-dm-Yi4Dw!em~r1ghX4W4K%oBGV0sap4LrcjokXMiJx`a|vL^!T z`j%=7PXj?yVv#Ksr4z6%2~$;xPC-&G4lhzVil%Q(?!?YW49?e67@W@6**gh)t4um0%8Jj^XdI|m!!odAP*8e7>l88YUV(r6xQ+Ld z(75rbvRTOK{-|)X8bfoMsKwD+ zVHTAg-qRpgciGy?4NRqKjVIX}%&*jc%B4DzL`LaGo6}lNIhcqJM<_OWM4>2H3s*R} z&}U##)$Ie96sgFDUVogHywDvPS%Gefn1G&cdE}1E(_AL?G0T2Y9*sF)G0%gZH%+U^ z57jjtR%wr?st}!E^DNh$?=P+!Qv8$a!#OBSnqJF&e>2jWoLwDDo!ra+`EnXgL064uWpkD+@R6F#n+by^D^*N&k~7X(kkd^%9Q2Dq#4 zMuAdYV%ZIKWPMLUzOfQ5>uiwXD(v4-b-J~jT;qf|C*KT#2vgqw@bNw>e>5TlY1X%U zd&FGZRL4c$Y5PLk3dCMdE8E#Oa6Dii#pN{Yxf!~g#}!Te?GA&C{H#tviH=LFKe8>p z=Au4LgPvxv=#nw1lwvmkAw0uct4qaY!)y-aec#eRIx$KMdlN`@5{kjyDCCDU?Xt=( z67BRf>DZ1^bG`-7}KJz_|dnzBT}yg+d6y~sjCEKYifOwr=fDu%lNmd zYkuQjooDnAIV8IQ*GV}S|BheL_cj_V`^aZ(A{nzhcUX(GPa@P<4xPPR=7vAEC(7@l zQCs`sjanl-AV%FWXZj62f0Uj>BAzodRe=#AnKZJ#r7UiGw|nvS?5w-z#3+-F1g_i+ z70T?U311oxTd0+{z8&)q7&(GRyYaepX}bm>X(!9Z0lVJPqnkP(dzr4%R)6cG(24RB z>ixl|65h{O@Xu}dX5w-gyY4t}|DA|j`vI3{ps#r!DFcr1rwcpGN}^OXnBqf+%?;W5 zNe7~V@7B=`Ezxgjwu6%@-?xqt``;trjOAcZjX06z|I`q`q0$^J=0x8hgvM~~S0GNe zuGZZ`cNZ}bDzTF3>hfz7SUA#<=??W4VAhDhp|9YUs zvMfy2sOA57Aa$}zxTAjqZHYb z^r?qPYAF_5nLQ8Y*VmE;A`0F+gijS z9>%){ecbtl;3>>pdcW%PC+OoJfDMG;Aq4dO2?C^1B=qvGbcwH(+&|e8C0LG>|7W<# zD8rv78?jh@vZc@z2KC3ED;b}0@KMk`2r_28{$AzDF7gNh5PACt2qOOIdP5utET0=m zR~QiWnm?Ns0q)~ZkXr@k{m&E+2_tjS!2)kIg#8WDx#wMm*A09vS7hUD+WPs}d{5#|77fdO=!gj)}B8MUsPvj7$ zW|#r7QTKcR-KO#4LrmhpS28@Y@nW1esC<7J&IkMnDT+cAP|obf+OJ_a#-B6Hf#h)d zOL(! z{J8*8J2BR$a+HWg;DAN^0U+Z4UjRgw%U4u2jPI5^R`?sJQ92R)F6%GXotGu&X{LVu z`jyP*@_@U)Tet#oT|WdN=KmL%NDDjyEiL=;z*CxC5x}A;)kZIOD>gj*C7MK{TNyqh zn*p2k!CT;f2qgmtOMk;jcH zfQ3VVpy=rCf_ehyzbuBm9Kx2c$DN3AUteL|3*A|FINf(8#7Hg$u=?J}<3~si+P@($ z;1qs=_su51S5ugQ|8CP1y@_LKSv;y)yghfRc@C=)G{>X&Ej|B$PC-UPA^qcl;{)Lz zxIZ2od!XGvCVt^~|Ne9Q2UKK<&oodaQ72CLIiEN8Eq#05ZOoG7W^D`jW>Qumdr599 z-SP3P2C0WTGCN{q_Hy<}d+kg6YelmDKk)6#UNYr~AfB!_D(MePO~iFu7$%Rego(TU z%l;)$N8el`hY(2T`?vIvjIGJ0J*8ZDzNu^M#^nHi+ZcC<9C7qlC0`+s*1$=@NNV&B z|2%lt@W^p_wy9MG^2yXS0?lWvL^~)rm@i9fjZ%ehioM~#ue~Zn_DI@2=b-oXZ%rlr z1qk~u?@QUCAQ>_~_tSTj)%M$yBPBBUI5?0&X{H%~-wES8X#eJo1o#Jo8Isfi-3bhE zv~gO`PJdlo5k}#&Srm0VWYmI1-R4W6*Nbbr8q#%?(|+}1`-N%=8y zq0|eu3Fx!%C%G#40O*XE*Rk@nPI+j{SkrV&pC=1!%sgMmdJQk~kM1O4_&j%C^R#3d z%gCOQd=29M)JW+R`^fp~&K|NhX z>rTz*$+(ZyN?yAF#75h%Uo*3v``H7@8Of$dL;rqI=KG4b+!tbcUnt>PPd$7ESBy7v zX3f(=yqiOB`DeJ+;eo&8T?ABQBPF>z6DvY2E5E1Y2&dbpr#Q7 z{9}QEcZ+MZBr5?=Y+Q2kOu7il#&!pF>g#HY_)+ndtp_@2QM3Jn6uo@pO97>zGW!Z#Dp|-1jvWjw2`q$WEc()4>2Hs zWC-)_-9drRv9U@OfVGugWnlA~(I;8ZOCW~!t)k&-Z!&G-^3oFD@wfrtGsWuxoJO@- zSy=#Tr2u$jdNi%|i;s&+0b64qAPyQSRLh40VB`74*&!4e2#)(ker{w`R4kKj33$96 zQuwKag2F(tM;yc7C$wIhESSsj^WxlbqeLYk9U$sEY$e>cT^H1aS88+4HKJrXBPsbe z@$Xx$dNa(ei!b*o&zpCB6FN&@J5dI_Xh+5seR~G zi{uM30I_dop8V_AGRxd{EAsI?ruKG#{4T_VL*Ium2OQ2kKvDFzn6q3J-A539)+d%n zPeYRi?eCZOK+@b?U6r_#*pmYun30TZ-soh6@m~*XzlE0m(#GXZ_Tdi>;3Sg9{+xPe zUAfC^v9*;Ed3P4a`W`YusH435%b8-hBeF*CO%;7=&dN;aEMQu1*fctR7z4$qvUMDZ zD!@hRIUkEe=^GjOpm@;L2{&jx91(yY zKFOW4!b6pQ3?&j~_+_~ANYMord+tos%XS{GddnY(BllxehFNU(8ByIRwT#gQmfxcV zarRYvi%*tAG-~LoJ~TC)e$tGq)-~NQcx_n6q?EIsZG^Od0C81YY8ez~AW&K-fTu2; zT!aSValTyxIPBE>Quu!rh^sIeEAsym-cB@{tTa9R`B3iX&z~mz?I=G02eZGVT--_@2xm0UEe>Vz%Nglm7ZOUlzJ}j?pjw&i1J$w);n3> zHAN6)(Pjm7cEvK)Sj|A2&UZ3f&Bsb`dY&MW`!+fO`r^y;-CXt4rIP&bS;E&D~!8f9MioB=U|<+DUlN2|dSFj#qv+5&ow~v1;md`mmDEmUY_suFcVO z^+yEp$!apo*uPhs;p=Hj!$r%RPEC6o)QicAuofW_RR6FEV!RU%Mwvh)0KAoX1Fzl{8Q7hNs92-|(=S~CZCa|0TUR#r6%EaEVE9k& z`W$|?f}YbS!>4l2<2r&kta!`Lg`U8quL_Y}oY+SLy_H`^-1tSgx;s^n7FxG;i3sy2y&a$J?3{+K3~D_xTdt> z0>%_I_p)v%xDL6y@zA6nB1 zq+7X_7DFNW3u^vNzcHN28lt0D*lA9G)zmf3mV}*Z|HKj`g6?t(9+L1eHg5155pse1 zTfuhLjQw!-hyS|2gv8wb>R5RkBbybQtNUL*7HF$9?xmK0fUZ>$QaaeLX(qyOM)!^% zT!PWU$vt)=fREkfIgc)nxxgbEn|(kP-dglgOh4TwbKv)1K3u&t*~O0k;iKbFcc+AZ zUt~wreSg$Lp@*595tJ`{<^$tZx^PO{(Cle=ACetP}k={;kScC#gO1m)6o!%{+DQY10 zuWy6E^D#gpW#t{Yj_-UeKF<(Hj5_Tu%Q%NRzhcRTPPsD0V%@UJpreSWi$Ik$D+Hu_}DwN z=*j5G*vYZ$a~P_*X=PlDi~>A7JQP3d{4#QI2_F&?5RzWZkO8fZ{_@(xUHFs0?e9y1 z8{BxO^{1Cij`;8UsmLVHF)6a(PoHR>F|K0Y;zQQft?RrP)CzB)yzE{^|A9I#nL*^o3`^RmL|F}*-NKla6JnjE=9o$E_V&dWp#R_s_YM)D( zv<*Gi8D7ptJpO}Hsu7r_LGLof@~&TTB}(4{}gHmJB^CB;JO8Zl^0tv|)Z#ee;xe!KdJj9^sP zetYfiphH%n1a`uaL%W*ye1u=$QBg_e+MOF(v! zC#XI@`HyFJCA)q9$?nS?MJXNAGY8KgL^|chd)frSp=Swl#b7JnVf!QL*@`Q8Muf~Q zBR;(GCUB*XEoeo_923FNvmg`~qwC0C@#%m0R9)Rn`fGyjYt0U8`>U@%Pm5>mNkyM% zm;}R3zJ6-)4qti{J;blA=@>G%bM+T#>D;V6Nv4ldKrQ5V&`f9S-~?5DndnU+IYS;>=Uq^u8}BvwKr|=JGlJ)rZ58 zU`IKoAVJLK5fKVD`)Cu~cYJ>>QyIp{lMYm6(!U&wD0!-_RQKh=cJ5lMBfw6@LNDVN zmH^{H@8ze*Ym#ebgY4P#n?g@T$*yksj3XSjO`?j=AX|;G=SM)y*O^)iV1@Pj*BKgGr z$4~V{MQ_jIK`iV&*69wVt#AIxkT@(wb`J{+aggp^3HCqP62U+O#9jz__+KA!#DDU3 z!HWUmDB|BYAjF_~EwAL3o}-Sbl(?S0nde2!>#I-FYMFb&O;ft5`IRq>{QKr>0c18jb)$_RC;ViSf z$;fBjqhi};mpjblDK`ye6b(=|ycSGyLD z{Z(&dU}6;AX3@UJ(Ie^Uyx^Xh;NZi#dJ$!!b}OO~ZawZ)7%swUoFI58Sw)M5<|9cP-(+A^W0Co z%%};W8X0PCXhgBoAnWdBlJ25g;4)TWbYOgepaIE8=2czhDkrFD@fXVoG>C%DL^=zGI z{a0G32G!>YHtW*yWwWe@T;ZvUb6rwZh} z`_HI-gl)}KN$1cQrtGC(zOsfj#a2rKpNUFELCSsZUUojbdi@o5_=Cwp(qmk#wP%x? z{JJ-{ptWX9^;StipIG)QJ~s>o@PdqJDvD=5AZYgtWC6qpg9JXMifLi?YM5 zKNN%INUqS@Mc=F2vKlfAbfszbzpIfbm=(v}3PqaZq}3`ppfr%*zkb3SMj*|Wb=0{= z0fd{!4Uw9cu$bOxGz>`eW~3E#4P+G)73nKd`?|&aP-I4r02b(j83C5Kf z{8mhMUw9kDee!g4A!jID7yJkv{T1uBaGo|Jx{r;TZK<|eniWnoK?~M9HYxWt@ac^W zQQ)i$(}C+#<+kH{`iSdriUOE!RAk|W#a@WiY?JE9)+<>z*5cuQn*DTyCy@8hfdG|~ zg5qvamy6Ghuoq*oB`nQHxS;S}wc)AvVNfBesZ)Elv)z)@?6U-o;J)h4x&cm-S%8CP zMXafHP7EO-mB5wNcgSEw`X4P5gb+(mQz%2|^lR$D*gO%tb+=;5Q8UB+OV6Jn9Ggwe zAV@d}X@jX57+iwXsPQi2m#h!E5(F^H-x^I#|S=FnVf4Y#=- z?dLXHSqhVf$S+XOuJrsQrO@eA9y}Z&97sGK3z+o7!eTMaS=WwHc1luA!OzjeO~2?= zTd&y}^$VDgvaQy1HkmIrs84VzbZ^tf-}_rII{w?!6#@{90L$a2m5p6)qH@Fh2ZlGrr<>xyG(AmX`?PH0@-DBI)^VLp!2!X}CdzL!Azs;b_F3 zcn%bk-yby}onw*mb@8`~UVYq9eCd5@_M%~l)=WkO&-!@qQB~RV*BXyJ3l;f@4kOF`UHNn{=dv*Np9LF#JILM1W$!?>$}pJP*dZ9z*M zxT4=YhHc0yRSbXp(>Z+U2f@?kt@~h4ybioR2QrLFa9C0zU~76?xWoXLp;0ZHLzP&pRP#?7_-B$Q~V_2kGno z4kZo>{qza7O;Hf9&e8tPI?v>}(??fSABd()HuJ^T))79#<1sVjLrufi%YG)&r~Tmj zH-^zbw0r{yzK5E;S+`)-HlD~Zla0%?9BfK(e|{i&;B@cBm42WHjx}Jt$Y&1f=<4to0OwMRkPT@{r=h^)PAn{ z-K*gU{MTQ*c9O3KaD(f$3pzyH*gu?UCIi`S?fh_@|F8qmBH-pe>`q?yhs-KXvR2R+GJX zKs!Is?0&U^;ZJqt0A`(`K)x;IiFZtQo*z-F(<<3PG`!Y7)eS&7SWbwj$mU#!XQqHU2S|g|fUYQ$63xGLD^yBK~0p8t`2819Bi2(RS6}op>y36k#PO-Jg zI?MVd&%W7GQCJZCEG!S3lxY1RG2M?7q!9?%U5@}!nLns2OBAYri~DFfLb>jSIjS(k2Lust`khHmORZpmRm1nr)< zdzP5FK_0VvcNfz|bDvP{USFDQ4%2+hyxf~5htpBDj zZICj&+X(pKYF+Mt3_g~J#az=z6ZbYsggCzA1UV!SN{D4w15aE0G4Hw5lny8v2FQC0 zBxHOZPI0=$xU%9M-bOy3`8L)Ic0NaOXM3_yLKi;L1k1Pt!`SfHHFX9j@y+g$R;{|Z zGh6n-mc1?|*yQ0&5yi!9Za#VZ<5^pPn69*2quvUZ!^9DEFk5;|z_E%xhX)q$o;N(n zvtEph&xJ#0Nl5bQhJHfor2F2HxiF0xz|UD+3ZMU2ogrYc&Y~~`808d{V6Z{o}c z=ewD6Zo3|qV~8ON4`jR^^_U_pesx`G2MQE~#7$}vd4&@=4KG~rHsR|n3Ck{jk2B(&BbcOHCN)Ysmn zHmEdcm(#2DizvKAATzdfuA^%n|Mm~pK&;pXR^vVeod*N$Wfo_)g`+ak0r~^h6omK! zI$!Y-bvg4Gzp9uz|8PIo#u>L`FwRbSPG*jaok1ihAG%!Xb*^Ql<81;al1g=HJI#pY zD{fwd{zK$RP^p@Ya+Y~#0RKSCCM3nHb|^zd_ke{9*}E)dvBfa9XlojqQv7ng&nxF> zBtr~+JAUDz9G?w4yLKfl9V7AcH}i;@nU=HehYZ`BT9vmAPhZk_cwD;F=)$36pm2J5 z21s5{@O1h;Z+>_!DGA$aah!BZyvVy9XbI+ugm>bFH5)iY}9tm1I z%rqRz@As&H2nlvUtt7w2Z!fHAL;@EPO&7((%ztjMFe%XVFt6}B&{r~Cj0q+|YE={r zQuWNQdfjL$S9s#uaA@PzqQ^#KMTF{d`xd`|elJaFp8LKa9Gg7w?xa>GkkK3RHHc~- zB0HfNpAi}8+r`;@biA7Eb|-~9RfxT%ttXo%E+rn`D&b-5S3;kEiI%RKBYeK&8C#lV zJ#&Z=b3ziFAvMQbF=1JM*yJ;|-{oRdZmhau%eD?hviF{JC(Xz;%4 z;+w6E2`USnOkVT+9^OzEGd-Ky(SwSn%-MA|G8U+W=RFLRtNUH`S@DHk-9QgRs;51B zyxQ?_77?+&cx6Bct~k^gJA3&$>*w^vgJKre+;{fvVBE|4W0#90Pdtpf|8bGVTj@(` z?e9P{g07TI4?WGy*Xs#_%FjTh$3qK$aiy(>bqJPq$y?%^Sa`f9@E*Z0 zVXem70w>vkWe!Bj4aj#8q43xgWTNQ=b)*}8YWRz6&FJn4TXZqf!UTHkl*6GVLC5^tffzb}n2k6Vlt5`IbiB_#F#V@5a9>50FPdc{9p6ykFKa}fh^xo$m6!4o1rvz+vU zAY%W#6fla|Yp>y9F4F;qd1rYPp6j`<{RaDo(g!SG4r;b|rY+w**L8TZ5k1zA#*Z8( zXv4D-8p5DzLlEzxv{JmY$eLpgPaDzQTE;MYjPcd4)M16rBz6!32QPML5170Bk7_q& z{Ed5c3xa#>Pl)xZFAu^XhTgIxN%XtCnOa zWcLz&^A6PNnp#q^xe44AKv?a(~ zPP3nW;tpQP^nQpNd=G8JEL1c(!_-w`S7@wT0y1P0L|Y{mPR~%`uy;4y!lGQNRH+oZ zYixHBQq{INoviG}&l|8f*VZVWWxPVLK`iiQ6Qg*Hr?32Sv&-u}P?c&x8bM)!{{JW~ zO$*-7S*B$@q4y%OqlC;1NtkNlppveYRwfj*i0W=RBvYZrRF>8h_rRzO{f!POXM=Iog1$m-OiU`y?)NOSH1iM%HcH}7W`?J^>(^Hb3G*7u#)rU&`UXId|Qmo(ra|v zgZmvCba>y?_ttH1pY#z+jL+KHJw+4|-rtZEeW6UiV|1L?5hQvJupDQ1dh&~mk}x=H z*ZmTzAxnZnASXr->THvDeX0v&oSC0;u&~fE3Xt>W-smX1%rKWw3ooHW)blX2UL+n7 zcTBjQ@1rUg3O6f|oG2mbu##pEJupq4T+4dG2U4fAhWpIwdyCIbfkZ<+H z{9xao<|Jx4`42sc63_{j%Ly=$jF%lY#}L(<|FjN_E=n{1i)HI(L6I1M5K%JDIHO{_ zsalIjpf^yYuBycC1fw;ZaBx&(Ae ziOU*|i>qoRgUcFMzrgoSNF7f4dYE$H4BKnO&hwvKyW&GD(q@)&h&I9sbS_Xp(BL3u z3)K$tmTw1HFMuI(e8xjTLGf4`_WC-GH`$%T*pQr!NNTJh4HK$b+QP|Re#Aapg`akB zF5}7Df|$}iMRV6uW)57?;n2jP#GvFh8Cac7xZ&^md)pidsFVO>9*B6M`6fDg*Jg zx{<`@!3~T%qu`<&Lo>_G>u8l zE5MnqYRXDP0ONXhF%8+Ss>+!;*c`0V4gY%gQCyWJ?BlA-`71t;%ScbAhFN>O-c(xB zw><4GT}{u~9wrj)U<_&RRg6w1vJ_RFybhG6t2+%AxbGP}ITR5aJ!vr#T(R(!bEf~D z@(!Go4AIZrvF=oiB7EZoC@pU_!kljxU?hgo3le1+)nW!k2bprxsY&D`@~&U*hHT#{ z@XDlPX5@0u^sCM$$@6o~6gYdz9vT+cQc3$}t)O@auVj1JT+~&ysVN2TXj$$&l%rd~ zCB(Bu$CLbpQtWHluJWDF=H|Fd)!Y0mUS~!+)|2D@^9li7!vX0w=W*$1|YM$Jt zy>tl?rLcomN~X=@$GYY`ETc1K%VBOI{rbVGfDws@*J8+j#xJ>+{~_TNh>Bz=_0VsT}42Fkaac^SXdHyR|^%Uxc*vspr7F?&tjOwzh2|-<|7$Bi+97zK(+X zYIH^fD8Rc}3zB%7P5-ctZf%S?Kc|&$Zd8f?oXba?=4shY&}HmV`FRrLJ!=!(3L~NE zvw3~KRd6T`kP=g+Z%ffKfw$SHKzq@LCYhnvrQ{Dyw2E6y(MKIg@gFCKXLuRNPK7`1 zxBJ0CEJ$oHX^B$$enOh#b4+2M*}ch)4@t*G`6p$P+%CT&L(b^X4?kPxNZLu}Tkd|} zHHrEStT5{c=~;HxFi@rlX^hY&Gb@@pY%_FcWaOUD=@IvNc7zre8L#y9eDkHpM|uDo zrBvB)dYe}>>)U8-=Ito8Zm7ODeOMjQ>WG zZ-(6Hso*`jw}!{HT_`d)(cP=;we28{%pI*c(C*BB#qMKjptR=S5;zVc$MYZSqUD5?98Tu#~tg3j@T~P*rgb zE2R#zLUapvLl3Z#Zs4Kf3pNAR!eZ_Qa!}5Gcip>!-N74KadP|{J1-}xG2=3O4hD;+ z+)}%Zm7+!p^{5+G*CjTS+%}~b;fKh;hIGt!d5wUBCsa&V__f*&K9Fu;G;xm8gJ}&k z}W}8^6>w?qG4W_#XuIR%l)r*iU zgOQWa(ZSt^hzA5eeIUX{Or`njXeGsh!^ER(x{>MLqjS)m?+Rv)XysD1x|)OUvv{ya z9}Ayn@DF;PX;Sb1ZpPg}DSn+jkhPm#u$;A@#o}`(g_hwv{8xX9=rvi%qn^M#{OJ1=K)gvnq9)(xd+2 zF8^!uUfm6=-4|a=3o%(RBd|9 z+iy!v`klX+Ca*k}|B0n6KnTn9WB^HGe$Z<5Z&^NCe3C7xOT~WD+V*iZW^~BvB4kbk zDduD)zcjKs!R!R@oBWkCL6S#0Kn^K_aglFF980^cPVsyMlJV?=s>2dzgtd!=(^f%V z*5Yp+%6l;g)5&iU`MI-6z_vl#3BKWZw?0JyxcX8PCq za^@vIhibc&+ZZhvs`yYlm#VX@XCtZ+RMAA(mF3LyF{-kTC##3CAmSc`;4nMP8!DRv zPqkGk9K3p<)3d%kciAZz{32D5UJJSQylE!Q@4=qUl?AQrq#hAe>HoG8S@jd}4~^$H zJD?aa8cb60d|{Uto~*`Z1ywX-HR@bUYS7mjaf_rB##Nl3D1*Eo#qsqvpk`WgvMh96 zeYd%@7aufAv{4V3uC&jxk0W@pJevaeBn|IAmmam)Wj1+@mpb6q6k4#;-~$>}?{Z|w zP{*mIHI2T6Z?wcUg~)w-6sTq2X9wt`C#}R zBp?;{us{T1Omd6YC_xl}Q>W^ojX{j0yZl^0A9HAB2zk}uq3Os%rl5TM2Mj~%P1(Fi zeH|mm?>k5l$^v*%?OJ9YJAxN5i5VCG_@W1OneKSbzho;;E`LWX77B7ncTMRzx6>1V z*CPMmWmh-veUf4aF;h|aEpl#~r+%ZykNGam5}1+PhYe1lOx7@N0z(Be+F5iAt@;-8 zcAwKOHH?7v{*T2Q#J?iQ)9vpq8r1JxF5`@e@+bS65)lIOP7o>-HjVQdbv~HQH5I%N zy+=I-n2uZw>ibJ*O%$LRh2kII)WeP*Mh=?9w7Glfa|DmAaxQ3J?Fa^x*RaxmnACOxUb(`EXD0sT zIu)?!$v4v_TI_gAG1iO)khf7*?R5|s&e3A~R)!C+pa;eSAGfy*Ydp>(q7sTRE&ARK!nVYUf9f$z=0wO|uaV$FK z`GP8Y1FzA3pCD6qt*!61ID4hp88W0wyb~>lcSPR*(cu~w1_bo$`;|-Xzc;M}t5X4U3-j+ix zCYtIdStfY<7Ej(MlQJuF2>OG9p+yC-G`b`1b^&lvwgfDHaLR z-PhRP-WoCY05*T^;d3h1-0L$1jB~Y26z_iA^59Qb9&K9P%ieSx^iFOJ z?+5u4mo6*!t~Fp5>#^>I%Dx;}1jA+^Bpi|#3rR-XvFAAq>LT2MuH#K7pG*_kwT^q# zzcQAl`P^cF#``R2-U$sp|Zg zukMGgj&%_0M^6~}lnl|e$?6t_WnQ>fd7jdRT>7Oymy7S0??Y$XiZ)%Z)0L7MaRR+b z@}&P|QRdOoeXF;+lxbSzJ*O&RX&fy%%Hn#a!%JedXJ%U(HHKcRvy}Cx!5l{wZ+_vL zO@Jsmf=DcT&HF^MRYoJj>(0KJYj1maf9R}t^w7^a##ZW_W2~fOQ(efiq6ZlpAB2#d zHku_^xBqb<71VWMDa@wnMFlO1d<_V{84ICW>{=t|A&&&}>?l%<6H@SewJhC1xBjFm zu1tX>aTLIY_AIlXBej$IZE&p{xc{|;f^%Zwo|FnRqw^^) z2~Wol)fr*KNV}@<4(G^=XaW7_b;MAzgR*#4P6q|df0?sat~QZ_S*4K)Zd%#so^dJ1 zFVC|Z4@GQ|Nv~%z@%^WsmR$VR%Rp`A&gZNnYfsV6&n6Ebk*3V@E>GnpyI8GELMDe) z846s}JVpJ755Ff`hYykv&0MmWh0On5DL~BFr2u{G$FrV%x43Ef#4(JLKj)QNVXBu3 zOw`xM4jP4ip@p_~B{Af39q8ve6U0>G7;c0>vr_WCCecUwNlcq7otlbS|F?Lc_xun) z+eI+DPm?_z=8$B2x@c)GSPI>URg!EiE&>6;#^F?RiJ$AG`3S&iHkpL|pV39{!)9@3 zwUOAitR?(0My{fgY_Bsv+=8hd2@Rg!?xi;`W!+A7g2LF{)q4Jxuy8=RGzZ zfs{C2SciRjx#SC+?_}4I=h52~p0D8m0VqRM{)tr9?uK^^|RBj)>1~xs^BDJ?757IE`hOTEHB27C&eu3SdEG0=gR@ z%_!_@NZ`A6y8&)&KDKSc?vP+Vw?`hqESO31{KZIRA1YZ|taI%|u z6ulW;p5%m8RTGiuE~T!-n;dhl*jwiVFCnwmdfw*_rHF79OPt93pneL&A%f&OOB3WdYjH{vU1c9o6L0 zy@7f}1x1R8A|PF)gLLT#N)?bINEf8H2+|=SDxxAH(xms^q<2sdkluTVbV6@QAR%xk zc+SyJ&sz7l)?N4f6 z>6Q`^M+cv+fqh#^IDebh((P;td$5C)f5DlmRc5mCS6-U6xvNoc1zcGSLB)HFwP%*2 zN7EvIaN_ZvDY;h!Tv`DLp0(uW;L0fh0zh#Ofw#`G*q*pQkZwOn_~vBZWF^l`e_aaP z>`p>hP;gvLB22m5?@JO#{eWa2yyqqCcKiVG!wz!92^o+V;LsuY%$tyhu+hFE|HR>gwbw|$*EpB-EFkjVU7Ne3``uby&$8xSs4FZtHVlXModd>3@zL>KtTNDCa$1)*ASBbUKXTjV$=(u)sqESfRxZx0wi72+ zu!xQRv20}BVLNtAKIHD#z(8SQdM4EOa+b`4HI(HpbsOncv$WLhmyJkjvGUA{31G&T zKgs@n@&25wjR2C!TBbyryys@Sv1RU9_!uCMEG;NjB}ombC314 z1Dl>&Y^{ve)K>nd`?at6rnhk)TKw*irvb z6oj~1niMfGbx#edfwQ7N2_@wr#$TB9+^{0f}l&SW}10e82N%q-f<+=jsX8E2n-C?)Dq##!Zs= z#WgW?Z{;AijiigRI`)H-Zx$cnzsuzPynEtipyn)I^592WBygHqw-S~&63fHeWv+w#3i9i*}weSj$fmDz81 z(rlb-3kpjsU3?GLsvt;6{7>*1%sm|tUR^UdhqPa{M`+e*(4kuo-qq}-VX`oPv!zkK z8&;h&Oba*c_3mmOzzK(4L85g51+t8ocbBb`K2^lBqi7D}+kjtTU=PemA4^WNX0~_u zXb-0OUAhK>{>!=h-k%?wD}3n*gj+)cDUVHLkmba#oq#YW;54; z9Q2)=Z~gdT{H9I*Hit2ye4+b6-I}6pR%icT<2-#Y7K##&wEw%tvB*dkv+M2r0 zZ7w5=4fDvcMkYiVCaQLNodL;%^tKBOgn$YHmo}~+>Om>hN(Az*NfCW`we;XAG09_# zm;G!q%k`j|KwzuG1g(n!?wZY%a+&SX-H(+uPc}lxuYsGbIfj0~V!2Qk>~Qx-ZKI#; z`@~F>RKEpMsp^B`XnJ7x6{YI{CK$Y}H_f>ow2Ais(PX4_T3~W`EO)#pLG@E$w-vi) zZt_Q7o9*O@18U=}20F921KuuSE1|V$v_YYx+i0h;HaHFUi=mV6#sX;Tgt_y7FB7yzjH>Jr?^RsU7z-@ZT>Cd!;8i0Ya69BSwvN){Sja`}kGv{KK<}OH$RM4L%#(`*3oy5w~)*HhD}eY?|arjaZqL~#b`DS z>Lqevp3*rJg~zbPTE7mqEYyoHZWI-cBOUuxYvn)&=p*sRWx+9Sfji8Xa6F>qF^>p# z_1QPX;y~;?tzyVHruMOP03aB=@h^l=huiDhSrxv%w#6! zbLNjrCc5IE!=M9?+>K1EebjY9I`a7imb<8vpxxj3eon<7BY8FAeV7p6HLb8mWE!ma z7K@iiu8KTrPDTJ|rWs|!ZB!*=Ta6?nd;Myg>`s9M{@|jW7OA6p*d5xGh<4%CWEtxw z!Mr{x_xSRSubPWITi7=$+IACp4jM+S$881aX=|^Ykna^y?e1Q;yi;$o5G&TpH^T4b zu7UmW{O9Me_$8r-c8a=ba3kDAFp&EhWPi+?Mj0J@qF~W9D7dJU>~sytl0G3+svMypAc&@OKTw|kB%^1)|TCFJM7{F;ofYk2d!?3cmrCZcuk;(A&0?2)v({Jo00`4j( zwGN0TF(uTRrPS#Y#i^tGzVM!98{N2fE0G_^ zq#lm}ldc@mzh`7TU8WvNF+WGK14b2WDr{iW8>K3BVjg}C4=56N1A-4f<4q6l#sWf^ zT$c^5j+d=lZ7xM)1V~bJ{OK_^a~aWVj6O>ZyUyPLe|LxW^4=dqY(rndw(Wjg|M_l< zFgi5a0+yC_VF*)uVgCW{47RlFFNwxe$Hi=+KTb{%{63Mz&mN!3d`kZ_lpO!y-(tFd zlHEW23vPh_^lP}k{+eq1VaDGbvWOR+$!WeMX367o&i@nw{_SX=?>)egB~RslA^(9K z$jPWrRNjfl&u99H4Z!o$H`Q?~^Mu+jX(-U}26^0Nk0->#f9`33Hq=RyJ46@hC~==` z+WoY^lk24C#OVdEdJEt_No4pXaP9b!+Km5?EWd+<&95w~x0!qa_jdnHY;O6n zT7{HKu=wBI&Mi0%&h!831d_Z&FBsRj7?Z~nwIza|^I^Rj!1e^Rt)B1cS54sd|g|4}xV(;tM+q1dF@jT9Q z&PGIYe;Xrf9oPOJM>me?KVXauM0H96rS{iQl8?!S$rolDuh7sKYH69pIt}gkcfIP$ z@r%v1y?j0k!#Qa9=c{)Izr0F!H`b#1@#0snUQv0#c$k=Gdy-^#3moqla^f0L>Q+Sb z_{;mMZjDL63O$znImu*!z}@upv^etVX)4}+6M-(_HRA|w!?9GwP`Mzg-g+&e{QST) zq-xn0ZdGFITerR>iE#}yS5RIqZrc5`FD$2IyrNVY=UH|Kx!`bk7+!+!;XV-V>c{DG zKVpjHDRnL)@^G|JV1r|k<@NT?8UADR7uz_~hfkjPO!Vst>X8_wCMZwPh$p_GEyS80 zs?d72w#jL!hatKRA0J=SV{NSTw@22ampQ6k>mJxBtJDsp z?v{v?e1kZg1MgCEn)24-mXN~#ETL9EY1W9nyYq3C&86uj%oz_xpJ;oy4&*6KjYL1v zhg(bBoCt?s({Pf3RFRXD?{2`3)~h$tN%#5_4olP#zOwG~ZQ($9O6p*<5$N?PNK2m> zyf^#$A`8{{;Ka;kE3KsW-U8v<@`!xH>ap;%K#Ru66P^ad{UW>EzJK;JH#cv-tjbyK zw&8<@XT%6Y91I+vSeprzrH8w65tC#k6MBh5Y(vHwNj0$Guz`*&bKE;u4RGq9-UiW| z-0{&iP&lhO6XIQ9V0CTyta6GN z(cfx?pkG<9Szd7Im)T8Lm1-B8G`_6Iu0epZVZw25Pj zW^=)vIxu7KNFYi~$N!ll~AJj13jStHn7!&80 z!MZc3aQP-AM!=%;4#nJ4z<3Z~w7I;iw5&6_WCk6weoq+_ME$1&5v7$Q9X3o zXxiRVAnayPsd3jofP~J$&a4thdcC6-e)r*Qno>w&X6RzP7dJ1jV`sFW)>MUK%Fs=A zcBNHS0Zfb3p}LmV?fI@avHlm5EGz*FTW;bf0@Q{WBd$aMZ8^>Mg9C3_=xlS)^JmXW zf*I9cMV`-+W_lkTE$Vyd&8|tR(b1)RUR6V*4`}CQ0xe4moVKAdIauNz3sIK&Mzu;< zO(iMc!ZTMm_|&lH7_^! zF0OXkkAy~Q{?_v|xP|S^v3x{#u95!Ax~zQ%!rZ>ngLXN25RijgmvVV|d3$?%wMKwi zn@=9x)Dt8VCf@%9VWb3;p+M;KFkHRAO+J8~sf-;|a?sfi4@3*zSK~=v(_t@QtG{Yf zci$pO&uaO}tl+?E_M%^_h|Rv`bBEH!I9my;(}9ywd~vti?k>go%CKH;;{rmRV^|a* zso#rI^2&5po9amcT}O6JY0s6s@~_-7GBRP=qs4nvCWr^t#v;0XKNL z@av}%`|$|k)(1JPYLfe@!NI{ub#VrRLQ{V*t7qaq&&-&zcSrHd^NJP7Sv*hS3UYou zvnX{`sc_SoD^pTHKnwPC2))10cHh@A1BgYcQkw-fO*7oLnK{cq;|&f);m#FLH~52R z-+mkHs)0U9C+gD{cE0J`l3NndGdR?}McOLUZla=akL&XM!d`c*NPmer2DxVJK7CsK zaF*_91jvnI_4@xayaJWh190#_$AeLk3nwsXd0y+HmSDI^l^hEh zJ&m2gw$*HRu9GuENedY}NeTafh_)vB6gR8U}X=v%pBSn(Hkl}al zKe%S7#zhN5RC)D{y9v>JQszb}upYFe01da1V%+Zfq<$C>q0ag;l&9~}zPf6+WgJn~ z(-Iq-eH569{!b$TDcvTqb z<#qRh^eTbAWqg^j%Ijo_jaZ7meXK~5&V#vr-*(nJx4F2Z4_9AAMpCF0C@U*daOn+X zF1NHG`c3oh{*~^9S_ebdZ?oI^Q{r-BbVUK#zrm52t^?#LA06&A__}__cj1v^W=DE z&cAnZbX?M}kB@9FJJ)$rguEp5gmvzVy(nr9KaEo6sU=@0=~q4sIa9RKK*;00Ub&ci zgAjFy#kA{re|>eKj&KVgtMzExeCx52EYA5gi0hpZ)4EZD!mqXSi;K#|^0Xdbt5ZAy zasY`zBlg03-1nc|GB-~%4TE3{4BT?O; zZ!DiI5x2qE_xKi_NerL)o7yUzq_ue|*J<4)FY42EP2R<>oQ_8{GO*6WsEDoE9N)ec zcV)gnqt}&9;;GtSKP}o_w;x&UMAe>nddjTg;5sQI{Y!ogCerKaR(K{S4kg)2v@zH# z5Gc)Sq;p-MLgQ)Zi_XK=C_?TE`UaL4Um(1&)$RHAHE-LZr~~>`FJ)0Jyd>=VO`x(} z`(>=Obt-ka<#jE7an^sm;nevT7?ggoMoqX2%UJ(DHzN_nZip~St!vLG;Km-;LJR^+ zc^76sn0>!XxaWMitPtsCa`IRZGuJuSsug3be5;T>6W)L%QjmVx4mrti()1>i;7Jox zy&BF+-AHyCukXsuN^*Be9yvKV-M=61R!fPs*yBj~V&^39WbEQr9PnKm!w{aj7&KtR zL=tTjIgy-p$n!hr|$BJW{x5Nr*B!A$^k1z~>^t z1=2>!tP2De`>VK`b|O;+7PHjx_>_LU8OY}Wq3rVsXj{^li9p=jlOF&5_6vVBydk=d z-epOdnt0`Vr_|%ntq}DOg?)Hd<252KjW3C&fS$+XoYCC7U3;OnzgrP_09ujEYv2=e zrr`}cVJ6X!mS~%_9#U@PMwT=#zL@^@?c3fr*478`ze>V&R*eC`?>;=3Noz4PTf%v z3q3DucGXP4?5>%anYUTkZck+^*^`|GP)8nCQc?nlm6xSOkvZYE5gd^#k=2=wl@o~& zp^rffDzRK+fcPbQGrb)n{p#tJE`=cJk9$M*Z1Hsu+ieMlIdvmyp4m5@qr|5qqPz&( zAbJTj2V$eE%mKD*Z6&h4GH){QmsHocEmJNi)QrGR7E2+oM4zsw^Bz&Vj}{j&UU z0t2riet9KM1LAi3FAfl=$dGLQ%PPWAV7pM62_YWnTKu@sDS$uD-2 z0l%Qv`~T96G8Y{nd+8(5gyZY>J|K#7lM#J-OkiR2;y2KEz1a?AM{wfuAK#USx{KZn zDcc4C8-Be?fLe%5v%Cb?B?g~;j?7Ikzmyj_LOi!^30;KYJXe7yjE!EmfE z`T8a3-m(7Z)7!G(D?e9uItl_{<^qKi@T_Z8z_kDw zSny9WqW{Zdx6Zv7^+>BmlBb)`K}Mr+B)0TWbCFDhOOcWI@GH=q0ZGz@OJUH+5RfM} z(9+OVuY?@=;J)`XH^|(dbHz-Tt36tmCzXl*hlRX$l=}I$+uL$>e+WYo;6C?&2+&<3 zBe?K>>{LU|GpDH0aBueGDS6Fyp`>T=#k{BbS|ILa*GYX^ET7|^PN^%>j@ISLhF$
Z7|b#VFDHUsJ_U_s$*WaL))FO}xpxVySy)C9M=^V^iW6dC<^AlON+oEkF}x$3&qg?|lArjW3S`Am}{!b@X?J{LfkLp1nWC z$E-zL`!zaz#-7c8Jc01i)Po(_hsACxx+b+1>{@&Fh{jA+ukjXrS)OkAk?c`>ePOh7 z*_ql)S=~q8hq5Hm|7&7rGp7z+YV_XvC*q+VH(8!I&|AJ8+0@7G0r%#E>CT3iTj*Br z0*;HV%;pWvXLKKb6xO|Mvg`E8_)}3q>?VUMvyptjJ=5zitQ5o}vlQRA) z)xJw2S)!y$sdpzYvL|eQyS2tcb(LKlnQ)J~+F~%`-ZU5lLlLwzNgZ@7sBv2C1+d%& zu#~}!r!IM1&*!-jm=p|O$S1nP`P$OU=G+UNx92XU=YEPeobK;C%q>`?PD;pxt7Bu* zkomf7Nf~$39=C@*AEVp3m-$eNcsW+NFENaTQ*4vZAOUG)e9*=UrqHQ>rx1)`mA_jw zOMc1CfScMHx@Vu+{91o~Vm?f2>}p$3XSJSh6lu0d+TtxQ;naZbanK{hjWOS&Pb+;F zk~9rOM9C#5*Ak4#Z1#g&@#9v|j!Dh>#l$t|hcjx2DSQJ!6cjjlyf}}Sgo;XONW5i` zuT)suSoik&b|!C)hXQffdyioO2vlp%0)g{L0$@>t)odcGb8neQwQ%1z_@&Q@g%YEr z1RuqADLfO^UIuv*Tzn(G0D2pNKKDZOI*rZl zNAQ=#UfiQk(Gj=^h<=4L*pPmxgY9xRo>6}dfq;(@IA22cn0~;Kz%$I0A2GTZJ0M`S zNjgbiXLHv|Q0SGCw-<0lnLN1Xj^Itdo5+T0mpEU2)`NHH`BC-EITpb7EKV1p}^!K3mgacEkm^6ck zlF49GHsqUd03VVXe}P4Bc_a+fMKG(y%(VvY)BcyjF{%;>Ew%*rnb+p?;i`Bn({`ii zNflvi9@ulS#5rqJyRPjJzHx?>fh-h*Yyh_V=nztD(fLkvITLJ`>fJUZfgDymaU7D) z_W*um=-31{(9kjKjLQ0+Os}#@-y^&uOrUY>pPMti62E)$^cC<6{HW;wx>5Dp&jM;z#}KzL^ZJnb z*%HT@HXthn4>MmGEsk8jx7yj|;uPr>ni(2W*)o|lX~d`tu9S#v!(G?WFa3n-=6GtW z=3T(XW~sY+3@l}=AyX1)9}T~ymbzuMFi&x~tyAwrTv!fnv)O)5BI%qUJaMmrW3AIL zs{ppM4KDg{TV^r_dDfe!enpyFY4RNtcqApoq0MN7acld0yUqyDcuD1?^=xWL0PS)_ zXpEHi*Nez@p#G-s#+n*6`F+f`0K;uB@7cT_1F37uw+6yv)w0#l@v@^LW2IXSsXGKY z{q(VK+Mt9KTxI%7rv%~ln0JP*w{co(tH}BzEZy9^x;#yIsj$2ea(QsvL439;s)^Zr zg9{4t@n{Oy(T*bW?{BVY_V8#V@(u5ZErVJH;VyF~zV!F&%@yCD z5w3#UTChmX6d+gE*~#&Vqh5_e(bcT2tF_n|NI>02v8hU7ovXh@8ry%e6|$c)9gg+h zZe1r{tIddWjmB=rK!kPf8;9={#;;Ex*U|@i)q+F5x$Q%IZOff$i*pOhr4G0B*p8Ou zr9M!Hc!gEJk1U@YYM$~M(zP57l88C45I%bErhSKPY-HD~L3d_=q)C6>IyXns^2+km zZ)XeJSCqlK>mLd~v5CcV2^tTPr?uYT;$|zhO?@~#@}>1jg&9A_9LUufGDWpaex5~$ zKt|ZQiYbxE8KC*CT!|HdbdN(Kcr!$3RL~f**PJi1l3Tnxt%_L_b8T(!nAD9w zL)(?mvNV{33ZU~bJL){2;TTjqPeDFv%vZCL?>prN!)ojm9H9%qC?lu96+||%=_N^>x!=|XATH{5Uqy{na?HMBdiTD@v5hU` zrlUewxXzgR9MB>wukT2oeUtCFGEx{?i)yBZj1}@rNIXJ;1ddyE^WoN|?&)De6br^2 zcr#{Bm*s)c{?948#TLk^Qd=pnHH1if^YvQnPJ$cD{Y7a^VMhxs_0nq9TA7gRtP~dR zdA5XXT5{hk$e_Mf$1Tkk$ADE^OeZ(Fc2+LN+YZ0=@w{u~V-id&AtCQ!6m9UI>*lLw zirlzIigILrykQql=UeaXEcW_}WZMZoKGe+%-)arLTbYq4vN)=0Y#%DJQjeMDNe8d0 zt{eB^#v6{wiKX9&`$TNxJZdyrD9X+5m` z-FbM)7Fi=u3Cb-W6a2b$oK+6~cy^ITc1h~dr@7iRBsV5Q%!RyHkQVqtkXI5pI@k#Y z4l*TJ61_-aDB%9Bry=>n>EBG&yw0lryF(@%N6a5a;F=b-)RHWdeGVS8wwHPgp@nv&=at!#qE}jU zy$Ea9>@|F$E~c?H2hu@TIV2Q`;tPxkQv3NEOF1(hXJb8jN>fdR=m2`4? zqBN;{>sn==^3Hmd)#D{M(=to16+vqzuC&?=BXn4N+L0*KRV(;Ghgp=@3LbRWdrQ`g zJ!fS2u=hfF=?ZnnHp)-_rIdt+t4EV08@O)U@vz}imCB6mD{BVan?t;=54`-ZS391Z z))AA1?b_}qB0|s{&)S7vO72!;JRs1UeHvr!>hYd%U36sez$Bz&=|W%>=Mzlu$Agh? zS*o3H!gy$*-Vmx5yI_2_B_Baer}cJ7Rg7J_edq-b3RKq4{ZC(IyYAswq{ zTRxmhOquNH$xoxMK};(sTl2`n4g2b`fP>dD`0*0sqizh1=evoIRg?K}e!H2zO9`Uw z#%|M1!xZPK1lQgXW98o^=xQ4=hmU&PX>1nvwQTw8xtv5~s1B!K6Z55hi+aT8#>O#M zsP{C64e2)Bu;WLWV{;;^>*D&WE;MUYTzH8sGcx~-4eRW4dmmZe@>KJC#MHUWJT7H zmbHkoVvPS`a$D1xi-! z*G*ka?+)31j!lS1G$%if``V0xo^`1cLp`7CPOV{_4^*n>IIjbzw8W<0Ox>Y<-fU@3 z!TF#{uZ>zLZNJPdxNL(`zk13XT7hw1*VURe+o3UQoIZIXG5?nt$Uthbpv!{#6zx(v zr9ib#@*%RRv8AaFK?M^$f_i75HZQ9Ge zEnsbofF7E zzf-r=g}C%GXZLNfkLCnRv;^ce`5Ptn)Pt@MW-w%)Val3U^H9E#Eyl<6VmL9qC32hrfME$pF`q++H8DZ|e|Fh`phF8Ou{odG3;6d@>L|IM@~W zkX4u4#lEgwI(r)khH7!^9==|bh9dRXH+I@;Q0zH$^l!btXj~Cm*e8~dU+-iasJ&D7 zQnfZAtW8XGx0{2tvH;VwXzU>`wXw|BLcg7Or%nc@)O~a1aFWH-<*=`9xy3Z?U-XO=w403$-zR9tdPv{0lOaUr6um+)4^w1%BU|AjL_%WlFz9-@ps;oQzQ?Y!Zi0FqcMY}-rEJUPXkfRNx@lNvI{- zC`)(q&<2&Se$jZj50#a>`mFpibRgZZez(J}+s`u`mbQ^;BpV+RTegWMhY=#Rx;$)k z>!(A-VeGkERM*_U1+`ZwdZ0NVu&Jb@-ALF_WGW92dk8G@o6eHHuE*xh72&4dDzv(q z;&U=W<`1pvb!(HuvtDv;c+iS|F_{AnBmJkdiRXbV49MwS7eT<`c~31hhK zY4|v@-)&J`$SK?Gimt@CaerGUPejx1q#-Q@((=|io-Cce%T@X>t>xo73$<=K87;tV zPx!#WiSrL}k#^|Rb=4{)HS@mBcg^m$@CrBcdGdEx#AMNtsfEk^1*^?_mz1eC>ofeBWtO~0?u!vcdRueh%w{8CM zCawGnidU)&#!1B_&}DAM!5fs5M7z`L{iB_`X8gXgL_p>L*Qt|(lD0ac+4oqHxsX4e zGZZWe$j%an*oU3EPv}p@4{{K8%zZn7#}jE^lJ9~3>~`>O#Q|$?x}@HhBQKA|yYT~2;lo?j?|Hf&-b{*B@8Yl= zZW(&{J5DY|6TLt_kBbc69V*!8-ql+452hn8k^U&$y)N{azdTyRjV z=w_CsOKm5rAYUXL`cl=P`cS{y2-aq`A77rNa1iJ=l|m4?T-{y{wqgUPe`0K4rz>@` zR{0ma1Hd(%`Vo7K68!QTdFL+z!PEqki;Fx4NhHBhl6PwP>stsYAXADr7!9&FxM5(= zevjhkMg_FP_8`0$CH#`A;>f#ZKe%ngcl!{#akQBju~*M0>a{*YERj%AF#djYCt|5K z+~nlb`~ksIaul&`_rV9olDD67jBW!DXjm5xb`jh^;XAO{ON`iycmBryeB;cGru)Sg zox*CuXr0T;PJtUk0sS_Py0Wz$qnzI9qkL|=FCSJb?ECo}o1631&9Q?t)f3?OAYopP z)T0uSa1C$(m{!6XDFtp;>Y06=#vxfM7Fo+vSNE_d)7s5>Ny_P)3ixUwGzgo>m$a-}yBzYsyJF42ov3b~JKMWavpS`WdvPr9Zb>bs}DGO@HeZQJ{;Lq2@2fn^h26Cv}|6}QCz+l z+dSr1(I0GN0p1?UKhhpTiMg6XtIadWhw@=&!#J275YNP4yd9DMVD{7rm=f@DEfN^L zj48GCR_>4WkDItqD8+Gb)xb|RYuqB0bsL&{c)MZ4_OBoTLalZ*o|1(=v)Y)n#rMfG z+ts2ZVFyemitKCM6=TOhOKlDStuK=?10DHw=P}Q#bs?NiZAfPLqe&3%M%=uei@(KH z@Tdh_+CER(p}~hT8gAM@l2QOUREBxCh-=m3D_dYsz4bE(58QZ#sV3{kNfEByC5v($ z;1+3md#fCu30ijg1&9<}z103Z4%wLLlxr93IuB<`yW*t%tjH`w2aw zVvHH9*OzX7CRS(~RQybQqAtAZJ2z}{-VyU2++&tyP;?Obm`e;vCE~tYvfFVLMr?oD zKW#RnyAmK@V{J@&1W=mnBHwB#;#8iCek& zh=lcU(^_yHAros++DE(X6yvq>cdoC^XL^wwR#L(DXO?*`w^h!)buxlJ>Ll& zQCc2}(X^`X7>VQ1Z9gQp0`9;N6V%qmX0YkAqcC;?f8%@fLS8u%Jn zwF_nEsQ#XJhfZ zE|-6+FY&8P6g%JEI`a44lQDo85w!VfnJ#z~Ks+%I537O$uu-R(`Sm&nXmq{_4sB`jtHZ8%k;9WvS-k14r=cYVkVfrVQM4c0O0o;kA*k8eF=DuBg`N z>wQ(opK4?}ovl`1)IAepV^LeEaI!VFJOUn1LsouGrS;CjLV!=hZ8}CYal-EITx6VV z-!T|k2K#0h44T;*xjSJF&Bf3n{vF=X?)s35!Lk*4k9ATK4Gztc~1+RF1#vR5}4S@I93y?kAiP|9YDc$+ZpXRA^3VAWfDR;{J2r47; zs05}gkn}qh!*$_g(iJ0`K8M)vdF64F-5||d&W8iPa8CxykS9ba!i3U4h%2sJCrwll z!7U1^UOs8%MkO(nW2Mf|%O$T`v#rgu)+(bT4Uxf}1E>E8udgo>)Q?$X_e^r;pAX3| zM@mK7pHHi(PCyL>;HZuritAVVig$S|x1eDH+tFfC&M_ZM|Iu$2UYTEuqLNe zVq70b)3B{cAo?pmX$^y&ZTxCc`nQ zs3bCF?g2*l&dR!unfUIj!M?Y{Q&7l0OI01M#OAln43=*0f)SQ^$;Rtl#uW{r-}IwGcSkQ*=e~sqtc@Vqz5u=j@~N*||D|IuNBi855TWr~9smr6ulhY1!=3!3 zdO<1MQWw{wo^~&b2Vzb>R@cq5LU4viO)H6vbXpy#^1VBt68ykEEbP9^`i_=~qW{$W z;A_YZ4-B4RKEd2GiHwgDZjJ%*Y7@iu-&Q@8ogY1kr+$5p@>a=O=@<%(z%!Gd+r3R` zR=%Cw!VO(1I`VVw$%>Xax-KJP3k)mEy+btpGDk|fHmOF)u}&NjaCqGWFtCHo_^k;N z!Wb^KG_#jF3p`Mp8D#*3ZeYX9HT(Ihq>vCcseOQGw%M!wXxLLXXI2Q$1Vy{b2OO%s zO|agWjL{LW>(~KI;0>#RC!-!s8k$-fy!J?al$3a`{csCKO@b-i&GpLR4G*iwcMz7^ zZZ4jyUCW2eZ%64`tkKV4M#oIlILf`j2M*5w;xW(V)r#GMt_Y_Lzqj-*=AJ=Pn_ zYp3(zfxB-rFsrJSr7L;8P>>7%{1YjXNs)?b+nvKcTiS>}kF|RnhZYCsQHr^=%tLub z4h+gJ9q)cMjhA>h+1YE5)h_P$R@dgiB((q(Q^>YIpqPrL9KOE@0IbuuDRYkD`x{sd z_LjRIceZ6!eO_Pt9QEX~QYYA}I-r(b4Q%vH`YD;-1&qLxKBAcZRHyyy?g^|{+a-MC zPp2}h**itCoCe6PJd)i`4$e*# zXax$H;6;uOiz0k9&TMx2b2wDi2T#U4VM<}?UhjEgW}!XRcga@VZSisNO9zO%Z5;)r zgI%1H?XZ3d225PPpR~JRqV!UkPk^9XoZx}sN*#qPZk{+7e+RK~v}`R3>=d$Bn8`Zg zt1FVx(~4}}o{vH_<1y<_)qWRgjj|nd4Yc8__Tw)1RyL$wQVAhXXNBD4{lODeUowU$ zQHw6@W2%T8-Ey8Q`Byzu%myH6tEoA!4y%w_nX@B(R+%gywePS*#W*J8VmDj-uYfBW z04~f_#cVu2{`i*S$(U8ciq+2n$;hB@MqUC+9LUOzu5@|Xa^V_5SfF!4Z~4R+VrWV7 zuM^S_f5KlP0n+Q7fYFW-wLJusu5&F!^>O4stj=DB?F7E-s-V;6l65uT6Gk`vB<`E_ z$25*GY}gCx65Efx8@0di?QHS2)|!I_zk(w;$CmSq^?CooF=Bhr5clJ1( zyG$*!pUpUpR=e-BtXqIp^l*cVJ*%f>xq8zc;sgc&o?kP6D9O|9)!koQ?Y9nYeLvOw zultar$K@~!**LS7`rN`W?T}ze$#oDZvj{F;n=l9Xn>nq-%lRwPP*=4(IQ4Dc{~ z%U4=1i_%br4T9oGRukHq$5D{t#@&M8eg$} z;x;4Fqz{0P82~vY#ulqx;S+nv4|8vB2(P;XA7F@1p<({dti4Nx>>kmmZ)-aI>Xpo|H5^J zigth#dae}t$cyfLj422X&iB)Ong{z_nW!GIZsd(Q8!s9zEN8(Dlt^H zGK+r3d|k1Ia&MrxuO1?mys@e1WV1*LwO>~i&u};U{$R0O->&a2J4eGrg>1w4W+DGv z5%cAI^e%^5F}P4I04>EOyEXMj4N-{ZZYV9-8uI4pqf}$_J=hoifC3==+8Pw!7zMJR zCx6S;6^`sui8DNMbB3s3&wYP}cM}xaJ!SY8p8Ux2{+7@>?mOn!6Na9_ke$_5t&uy1)FY z>MavTo8<^W+o5YL!tqJ3hOa+j1V@^gQc?pzb?z^_JFb`T3{BFjo)tDJna)SMr?WuW z_<^m=m`H74v}?YS4MdO_SDEc(?BwPY?3954OiIb*Dxqf)bR2wCH?o*L!ZR=?S;FJVpSFpghg}@IzQLb~G^t z_v#JQ*&n6xdv-U*ROIe92W@~V<9qTy{a>Mq6iq;)e3no;&q$xEcQi4sinCy%l=jWv zCHWPN7N1%xT9@DqU`m%-{@d}K&fWf`rJhvzbfl5trv*^5E-EN!>QwJE?8!O=4gzRt z&2@^}or!rH^ERGV1F$<@KRY|7CPnj}n8s6J#(b-2&LW^=Ct0Y{xYAaFytTDeoQG=s z`t0?Ti~w*)@<9B*d-WiAKoG!gfu`2vBR|<(`OT5`&nUFeON}EM$k~e|sjFZfyDn?6<}vI9Cd~ z-BIWwVM96|-rbEDqq`@k!C8>d0as9Sc02qmIIfUiG4lpjknr`Q+UiuTm#%J9`5msZ z(}b4~b~B`KSK_&~pkfR*!QF5s8kB?!}Ix3CxvY)3bjM44IPVKC zaTMSDj2ACdI;twRRx%E$muTotLt99}+A@V;zYY2$G;_M%8JYI)XEnU~5nE)kM|JQf zaniPW)y_I71{^(#r<3FscUM+bb)}&hTd&#a0@W4cXW#H!c8SltV$#smByqTeiO|w4 z*|Gnw|KFX``hUth^LVKH{@=UX$Wkhivb7+)5|e!=VaR&RGIa?d#y%N_6cr^QOBf=O zbu3xOjO#+#$(}3|*|)LIWX5nl!*$Vj++7>$aKBU+C)h4LL&SwAAh=sQK`%z~( zv5zeh<$hB)A%^Rz`fG+##RoN7iO<4He3yo;ZU(J<#VMOV@m&5Qoo>Z3q|-7glgu z843JFi=Go>kMKSeI#=7gUhdgKB2|R<%Njjl_F~TA!3&tBei(LH`KG>@HF)x^#=+(Y ziVYurR&Yvf2CKZcS%IE6gTYw{X=u=PBalrz+a$nf(XFT#s!_%|)m9RmgfWz#CS?VH4hWe1qc8Z<32k07@ z1kL4Sr;IM(paM!`p(hrMEsc!@HcYdjzL1wV9C9N@10ZdtvjNpXGzyA<`tqwzpA#P< zUCtk8RiSLw6Hw?791C^H%?-|6D>Y`hzJnwt(C?DXd2x?fxzB}x^rP$kl=WE?cRw1V*?bS%cW@>A~Zow*T|M(7&$VE`FnA+`Xkn02no%fme zI5Epq&>VnPMkzwjTs1{x<2VZ%mQ=O!>5P#oZ5<>)$tx!^)(yF14eOkAbUuA4wx{P% z6b&h)txigLL(o+k(UmKwkAj!T^@}Ww;ESg8IRYZr&s?(WC2^o6uOkY{Enw= zbGuo6kK>bSJmpRYJl^~lQ{+rHk+!)$cU&4Kf+h<$j4ucaTbi5uKRS~9$N$Vu{?a0U zPlGwFjocZ&v%dbHjjIQETVG!o_0Vw*Y8p95;kpS@}QB&j;Y7 zZ3&9BAAOyzGYOsC{WuN|&g{(0<=(p=lAkC3!uA6T`7?h9jg0!2lQcBdo^wX--m(y1 z`P1Ed`3wMK#`SNnfqtjxo{tst>NI&ebkA$^sztKjn>vxB7Gxkx^TxIh*}2$L@&a^VESl6LSZA|fJyNYvKWzMzTw%K?lA z+m^pK{rQ{5t%1))c_@LAuqnM`wHooMq#4)5+l<-_f=kmkA_s1iYk$5T)LlvQ7{>6E z7U)R3Y4_|5KRGRQ-S402xmh}b_7gq#X&t!vKhtye6fl|inV!2u-zDK^dM+^t9Qc`@ zGf)Kwex~Q%@q+_DLwr5|?avsh7Q=i9tX-n#`u_*&RGfXW_Pq&$&N%#?m|JR>((e@Q z=G_O*{T-hQ%ZeN7UVEmW=aUA`GAP{vsNA$hS>Y}#2k@$M*>7y7e4GbWMnHDe|K~8> z|0PE6|K($^)$F_NXE$4@9OlfuY3(;fZxS!dit}GOp!2ypWdVLBP+)92L1f# znReYUfGuXqg-B!G*f{zLrZLl>ajZEBtbWPguCgZrjSt$xdEFRB@dZ>W4f_pp}XnVX1 zPul4-cRj15K`;Jm-r{x3A2rbBn<<9!=Vg?0NL&j5+WnJY^6c&&wuz1?ZN+>K9hlB+z`gVUK z2Jh(VIft3KQ{5ZEj6(2|*O#JWOYweZ&&$k91y`w)wpXGC9G6C2iE~}02?rk8M=4t% z*HXq;TZ4gvqwgHN)?UGp@M>o@p_T$t9d1=Pk5HySLHSmy3~kS+f{9?4yYmoEm|8yc zwaE(1IasTBr?n^xc-}chUWmI!o<%_>glrXvksi)L_Z0-ZX~PUV&+_p3FQbTcGIgme zrT$C3-c5oDTdURc+jof7v+rtYK-?>5{fwp|^oq~SGC<>8`{tt1sgsB5aa7V-p^9&c zM<_Af<;3c_+&mx{rgDGTxYIT*_>Y5VtWVs-5BIt=o5uz9v&8pHZp3xfoX2M`qvfkd z!HPWOM&~~XElpgnC%z63urFOS+DWaC#n;w&JV~x`g$f^07Qi9N(al1%tqlz1tL`T0 zErE&Px{MYElYYQ%*b0X%k3W<0pGjXbNxZyKmA12WZbabPYFZ~bKImHxeKzTn6)ym} z4CYowzyY*kyJlrk4BT7{lQ%594N&!<`txgCnqJ;6$%uPjx>PD9deqLod8op7h{P?` z5wkk)J#~Gupkh==KhVnAFgWNjHp{khtpj^U9xp65-D_&JIFgOQ=_5yrWxl_564LW` zSam@JSg+=Cz+smJrCqn~TG&XFUBQHY_^PI)Kl zi*?XMo3v(`+y#-h*M;)2D9{m+j1rM5p>Q65>Jt78h$vK58b2+Zz zOs8Lpn5NR5U$W!$!Q$ipdUYkc8}Rv ze;|0)1+fGabc9Yl(2e`%kB%p>LZ7mL zyBN?DNV)3V5{&kI%(2}?nM$wMnK`6>eU%0JI7Awdg`7)LHPWRuztv*9$@t^10nE?3 zKi$yc{(xNoI=}Od>=dYpYAa^axuA)r?99Nr!@}z`gLx$s>MhV+#sH*cL|CsyN>A)KV`}nYS-aQ373m{wSVk zdtc|v$mm#=Y3JFJRh6kk`wNUM68c#*kw`wxc9rN0dh%O9j;sn$KVK83Z5|NIUJpMc zUY*fjb#t^XCCN00yvCC4e7XQNk z&IY(sh6oN|1Eo!_tCxhDPdcZRa3I%b1SQa;6YTO9%-pZjoiaEj>_jKa-H6c?CS^tR zRpsm~-upr>-@ZRWt6eRp+~8N-a9+V3!+N#VHlk4^`4aI&dGB)5*$=%m;VLtZ6GLu0}@2JQb6?NnJBx3g{r6UBbnQE4HpJZ>tmQ4gubvyh3iyjvA)6W z^KL3sfArYQLN!@S~78+_exWUAL^e!D1t3SK#e>3HjjN6nR?uaqW) zSNVr^e;ahl9+cP^Jdc=pRqDM;tRkx%KFlu;8*^U>2&43_s>X-xXEcAzeGx*aM@fmS zexveb=>8M-Xd1e4mRHf&eT3pzHQ#th#hpK+(b)S4aX4$97cnfdllHP4m4LNNYg*Mp15o<&@JZLAbw@BS}k-BysBUB}KhEqN~Yg4;A zOz}EMnKiGh_tmEr&d#r}USp+c6|Vm@Kp77s2>XM#zLzD~`c=_ZNs3Fab~u-sTX+@j zh2BYjSl1n~EI;=`ktixEiKw0%fd4L%opLU$izIV{JSsH_RAP$YgzaNUKLt-DzMy^4 zOAkw)Fi5%bG3OqbubyZN{J5gC&|(dDJ^w^icFtM8?2f!q>w8KC3z5saP9WBj()CQH=7n~Nn-C_GW zHh20_HdxW^F;WG>Y=+Psy}nLFvxccfO3A)$(vTVGX2l}`1R4MrJzXZgyv>7DiDDTE zDjQ#y`mN!L zb{<|hft=e2XNB*MX|}$7eSR`kQmBC#zDdIx8c8v8m^P+6v2)-L zTgwoSzB!|bT5J18!y?%Bk4Dv??~#zKmmmZ=H;_-OITzURS`mTA<{1qH3dI2)B4^g+XhD=4J_2^8|w7#DS;J zcW0w;rTqkh8XA~SMh>Q(?Wq0%*v_=FRaL$2^H<`QHYR7|rqN^qP+P^ttmr7MWOm5A zD&p@?L>3bdXT)Q2j9^$^uCKm- zQ?y5keScp_#lRxHQUR*-YHU^Ujap)S`8@D1do#43J(I#W1VK$|Hb@WCQi71cL49YY zdg#PiT|o@9@`*CP5iS$EQaR9r7+X~%K9|BD-Xsr(WV@#(lWI&wtf1prp&v?CQ73Pg znDW52M5!BR0JSch;@wfDPk_09sU=BFS_o!T)b```cj zahmeQ7BL9|MiImZ|3h>Lu^`eSmD~HvFiF5#OLu96&lCDAF|e6p_3z0eP_DV{JXyZJ zHQp^c0=#JkhNE<0n=0diyg!v~(wjssCdk{~EH^^XCz8LPb#-45(sn|_4zT#@_`;t&27BHoK;PR)=kY*a&)ESiTXLY)$ z5kJ$jyjr8gILm5#M0%U=>~4tYPXV8LB3m_mp4)qWH`2i131ln&*V04J_l@=2`e#j2 zH;(g5Us%(1j7|mm(xAyj-w+ty3p8O?|Dky~_zvf64p^vUc*DniunxEBFl(iaj5~TN zX0sI1Qu~xX;Rig_!MeKc7Pr~Wk6Gr(^rOAk9AC7ho!Y+049-4KaNuClhN@TP&+505 zW+zqHL)y4s%U=#&&!pdMTx+l&>^Uqk>8+vlar>UJDbCK8${Dk!*T z&<%&fX`JU+U!S?Gc_%eg<;+ChBXE&gMua3gr)6-Ov>3*xaY@5!K6|O@;FZ0rmT~If z5`k!KUMB6o$3wu+)RH-T_jr$wU)~KLdi-Jm`+TcyVLT(I1)%3ZCyxFN50DqS4E7~8 zTsiD|e9-5`Gl2-TN(ja*!^z4&4p0Ah1~pntkx;Z7T^cFr5M35&wmQb>AU!G}a6|8o zJ_`zZmtsjU*gu8{l%t337!DgfOm2XnX9GczEo_yv;k2owy>}fDUXd7D=&S`NfEH4i zU>s#vhyH=q`4vNr6sTVksF!jvOomIX3LE`N0$tYvW7)G~(T*HUKuc)On|_cX@FeF+ z_+ZJN^jNdlIM}7PJKaYNJuid2_Oz!NdY+yB-D<;Ti$iHiN&jVC{-bkjVW#G+g+hX9 zQ~3HIuji3ab1!@PLmw=Qk{5vh8|^XMneoK^8$#$-kqIp?1r(dyZpee-fT*mjc}5cC z_r7)^VP+Kcec{;eaqLXHM)c3Oipa~$7fov~ z8bY}ga;pD**!g3`$`(6@=3uNL9vvz2dU|?r{N_8vlNC;50l*dqHuoLn-wrK|is)%}NU+7< z8vAYJP2uKf7~J939C?9$YsN`Uftt;!WQR!t9u+`5^4$=ci^(hrIaEg(5BLW@E+pK8 z)GD>JIMZeCL*JI+0g}T_KwMn>UVr}U{H;!@} za_o4pvRYEUGuRm37AYPTxrqSaj) z9|1RSVq+pH>pX;@JACcQ5Pqfm?|Z_rpGz%?t{5Ej_!>~;j*97K&KV|+yb#0GTvyYOQdVFFv{S7+S8p4$F2Dv=TG1l=qcASRm4^#%mc`hk zdj^@A_4(%dX<(MG3}%o*hDpcAv>qK|tD20r&Kg=es=7KjJug)~6Pziod7F@MWu~ii z;H0IE2xE(_qVAwmXHy%c73TgD3#4u_aaesXHza17ncjX52z^z%zt#@XAGNCVNY7tP z^Pl3*qd*)j3T-w+T&=-EBv>b}(XB2IWeG(PMo0_Z9fSDqI~9o9OXhu^JdHQ_E-J*$ z4}WG9?{&~ga+51%+-_!diVX}+8azId&$pQ!%shuQo=UnY+1q=u^~x2rb-`egzF}d^ z!{Dab(0P81m7`2`I3^n=Y7@6pcEA$O?sz2^ky{&ul%m|{%-aIrwcf+B7Bie^aK(&3W^k(rb4ruN3{KT z{_x>GLYVmZ@qJ?t{;~i09TO|_w}W6QGtZ*wwZg_^Xy^f6t1_1|&#zb_4wF%c@3LvQ zdGUMBa&Lbg@RNGf5>A02h6v+mrPU>`i5~B%nkA2`W(eXa?ML`SHEWY%AFIcnRaHp@ z&IpevK|xy3a?xPN8&=1Zd(6ETy*HUpmLblVo#F0#AK97p+h#^9=J|PM zv^IDrvHz0W&0OCWqB!_54~p*J5-|H9vx9^@KK|x~82B}!+^5N`aVN3Mymdc*+&_QU ze8kh$uQeWHc9ie(1wn_1R^LG-An`M*b0yc4Aba#Hi)(@Y^H+Cq4Oi~W7;p4pFf|!2 zKxX_|LXEx3#4JKTU`sm5_8n(YgB}95%r(faSKF@zb{E@R1}p zbQz*p^0zel$ivQglr^+pG4ym*Rn@0pfwq>GZvIV>I|5narr2@%XxV@$aq`NKqT8Ul zFxF)MC_d$gXHv4|2MX5x*T_4RWdH5Z!za>Cscg-aodFAaB|2{f=(^~KKM9_J1UVD) zY=`HHU<`pX2qDNNS-Jl9$W6uE0U!nZ zf8X5MxL8_F&H|TT+Vd_;NJuDE6?TWz*BEH;UcIuNj-p4m)&8j@&3@=KShTxTK#&BA z%ik4weL_{)lj^T#T!~Af&{vK*B1sD)PCPd8(K!ZpX_pgCvsq$e(;}jxIy<&MosN8X zKw~YYJ-Oo32Nk%p0&>BKcWZVUX2zAGR6zMWc3!=lqbAJPGU92=tym%4{k48KS6$kB zgHwdd&xerdkdl7U(ZG2(U%hMBq-C<@=d15Kj5lz-f}d209FVds+%lHnIr8LRExC4o zx(?Xz;G7!94ma#xLA3eYr5Eyf$VbX6MPV%=$V$;~>PvR@IaGX<%63B#T}@DpYgIbL zNhIZMcBU zexRnc?vXN6Qz~=`{&-g`k^%khlWlTB!ho|;WN!4=oE(&}-JWsuDH;E5pvrqX@U3+t ztE`D4m5+7Lp3a!DjZW3oX=s-n!5O{(*ryTM+kt1?zi0jwk~MC67K=$qVL;x*_mvO! zmwQca8n?Q5mNCT~!tFhPDd9Atpw;&hNR^rO+3tdB>N~4ToSDI?=aE=L6ADLiT$$oQ zPB8d)Ok>6HY)9(Cf(CPFR)tbus!jli|ASJ`yb);nv{YCT`*PoHZC{jCRpTfSTLC@A znS;PFzR=tunW;8Y=vrfAVQW2bhe$Wr3{QEO-6P=c*7<8QHXx@C^oBWLOuRZq@uwnG` z?Cuec%y%Q40paqPH1{UQEu^S?5>>aV=$i!@ahVb=*!A*4qcdLbOZx5RQzF~VGWlH( lih+;qPxr*+|Mc(9z8jDpFW1u-x9MM`rw!FA)VTHVe*p4T^iu!; diff --git a/docs/native-launcher.md b/docs/native-launcher.md index cd0296d7..895b335a 100644 --- a/docs/native-launcher.md +++ b/docs/native-launcher.md @@ -186,7 +186,9 @@ Artifacts use hard links when possible, with symbolic-link or copy fallback. Aut ## Verification and optional live smoke checks -The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, defaults, bounded world metadata, ownership references and CLI aliases, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. Dashboard tests cover progress and concurrent downloads; fixture previews check light and dark layouts at 1200 × 820 and 950 × 620. +The focused automated tests use provider fixtures, real local child JVMs, loopback Minecraft status responses and a simulated UPnP SOAP gateway. They exercise profile isolation, migration, defaults, bounded world metadata, ownership references and CLI aliases, launch arguments, account exchanges, process shutdown and mapping ownership without using a real account or changing a router. Dashboard tests cover progress, concurrent downloads and synchronous layout invalidation while measuring Settings. Settings and world-card stacks use GridBagLayout so wrapped text can invalidate its ancestors without clearing BoxLayout's in-progress measurement arrays. Fixture previews check light and dark layouts at 1200 × 820 and 950 × 620. + +`DashboardDisplayableTest` additionally creates hidden native Swing peers, validates the actual window/scroll-pane hierarchy, and resizes both themes repeatedly across the Settings column breakpoint. It checks Advanced controls, preserved field edits, scroll reachability, world-card bounds and uncaught event-thread exceptions. It requires a desktop environment, skips in headless mode, and never shows a window or contacts game services. This is automated window-lifecycle coverage, not human acceptance testing or interactive gameplay. Legacy automatic entry is checked with exact-version mapping fixtures, forked contract clients and original client-bytecode inspection. These checks verify method contracts and scheduling but do not establish successful interactive Minecraft gameplay. Full game loading and play were not verified in the implementation environment; unsupported historical builds are not presented as tested. @@ -197,6 +199,12 @@ mvn "-Dtest=ProfileStoreTest,ProfileUpdatesTest,LauncherDefaultsTest,LauncherCom mvn -DskipTests package ``` +On a desktop host, run the additional window-lifecycle check explicitly: + +```text +mvn -Djava.awt.headless=false -Dtest=DashboardDisplayableTest test +``` + The dependency-inclusive executable is `target/AutoPlug-Client.jar`. A live download/client smoke check is optional and contacts the official game/runtime providers; it may download substantial assets and opens a Minecraft window: ```text diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java index 7ae29658..17ad6e87 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardPanel.java @@ -572,7 +572,7 @@ private JPanel worldsPage() { JPanel controls = DashboardTheme.surface(new BorderLayout(), 8); controls.add(toolbar(primaryButton("Create world", this::createWorld), button("Refresh", this::refreshWorlds))); content.add(controls, BorderLayout.NORTH); - worldCards.setLayout(new BoxLayout(worldCards, BoxLayout.Y_AXIS)); + worldCards.setLayout(DashboardTheme.verticalStack()); worldCards.setOpaque(false); JScrollPane scroll = DashboardTheme.scroll(worldCards); content.add(scroll, BorderLayout.CENTER); @@ -663,7 +663,10 @@ private void showWorlds() { nameWorldActions(card, world.name); worldCards.add(card); worldCards.add(Box.createVerticalStrut(12)); } - worldCards.add(Box.createVerticalGlue()); worldCards.revalidate(); worldCards.repaint(); + GridBagConstraints remaining = new GridBagConstraints(); + remaining.gridx = 0; remaining.gridy = GridBagConstraints.RELATIVE; remaining.weightx = 1; remaining.weighty = 1; + remaining.fill = GridBagConstraints.BOTH; + worldCards.add(Box.createVerticalGlue(), remaining); worldCards.revalidate(); worldCards.repaint(); } static String worldMetadata(WorldInfo world) { @@ -777,7 +780,7 @@ private JPanel settingsPage() { runtime.setVisible(false); advanced.add(runtime); alignGroup(identity); alignGroup(defaults); alignGroup(advanced); disclosure.addActionListener(e -> { runtime.setVisible(disclosure.isSelected()); disclosure.setText(disclosure.isSelected() ? "Advanced −" : "Advanced"); page.revalidate(); }); - JPanel right = DashboardTheme.transparent(null); right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS)); + JPanel right = DashboardTheme.transparent(DashboardTheme.verticalStack()); right.add(defaults); right.add(Box.createVerticalStrut(12)); right.add(advanced); ResponsiveSettings settings = new ResponsiveSettings(identity, right); settings.setName("responsive-settings"); page.add(DashboardTheme.scroll(settings), BorderLayout.CENTER); @@ -787,7 +790,7 @@ private JPanel settingsPage() { } private static JPanel settingsGroup(String title) { - JPanel panel = DashboardTheme.surface(null, 16); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + JPanel panel = DashboardTheme.surface(DashboardTheme.verticalStack(), 16); panel.setAlignmentX(Component.LEFT_ALIGNMENT); if (title != null) panel.add(section(title)); return panel; diff --git a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java index 232feaf7..b90a83f1 100644 --- a/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java +++ b/src/main/java/com/osiris/autoplug/client/ui/DashboardTheme.java @@ -160,6 +160,19 @@ static JPanel transparent(LayoutManager layout) { JPanel panel = new JPanel(layout); panel.setOpaque(false); return panel; } + /** Wrapped text may invalidate ancestors during measurement; avoid BoxLayout's mutable size caches. */ + static GridBagLayout verticalStack() { return new VerticalStackLayout(); } + + private static final class VerticalStackLayout extends GridBagLayout { + VerticalStackLayout() { + defaultConstraints.gridx = 0; + defaultConstraints.gridy = GridBagConstraints.RELATIVE; + defaultConstraints.weightx = 1; + defaultConstraints.fill = GridBagConstraints.HORIZONTAL; + defaultConstraints.anchor = GridBagConstraints.NORTHWEST; + } + } + static JPanel surface(LayoutManager layout, int padding) { JPanel panel = new Surface(layout); panel.setBorder(new EmptyBorder(padding, padding, padding, padding)); diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java new file mode 100644 index 00000000..8b984702 --- /dev/null +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardDisplayableTest.java @@ -0,0 +1,282 @@ +package com.osiris.autoplug.client.ui; + +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.FlatLightLaf; +import com.osiris.autoplug.client.browser.ServerBrowserService; +import com.osiris.autoplug.client.ui.LauncherActions.ProfileInfo; +import com.osiris.autoplug.client.ui.LauncherActions.SettingsInfo; +import com.osiris.autoplug.client.ui.LauncherActions.WorldInfo; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import javax.swing.*; +import java.awt.*; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BooleanSupplier; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.assumeFalse; + +/** Exercises real, valid Swing peers without showing a window or contacting game services. */ +@Tag("displayable") +class DashboardDisplayableTest { + @TempDir Path directory; + + @Test void hiddenDisplayableDashboardReflowsSettingsAndWorldsInBothThemes() throws Exception { + assumeFalse(GraphicsEnvironment.isHeadless(), "Requires hidden native Swing peers; run with java.awt.headless=false"); + LookAndFeel original = UIManager.getLookAndFeel(); + RecordingEventQueue events = new RecordingEventQueue(); + AtomicReference frame = new AtomicReference<>(); + AtomicReference dashboard = new AtomicReference<>(); + onEdt(() -> Toolkit.getDefaultToolkit().getSystemEventQueue().push(events)); + try { + for (boolean dark : new boolean[]{false, true}) { + onEdt(() -> { + UIManager.setLookAndFeel(dark ? new FlatDarkLaf() : new FlatLightLaf()); + DashboardPanel panel = new DashboardPanel(fixtures(), new ServerBrowserService( + directory.resolve("missing-favorites.json"), directory.resolve("missing-servers.dat")), false); + dashboard.set(panel); + JFrame window = new JFrame("Hidden dashboard lifecycle test"); + frame.set(window); + window.setContentPane(panel); + // addNotify/pack create real peers, but setVisible(true) is never called. + window.addNotify(); + window.pack(); + window.setSize(1200, 820); + window.validate(); + assertTrue(window.isDisplayable()); + assertFalse(window.isVisible()); + assertFalse(window.isShowing()); + }); + awaitUi(() -> !required(dashboard.get(), "activity-progress").isVisible() + && findNamed(dashboard.get(), "world-local:fixture-7") != null, events); + + for (int width : new int[]{1200, 950, 1200, 950}) { + onEdt(() -> { + button(dashboard.get(), "Settings").doClick(); + frame.get().setSize(width, width == 950 ? 620 : 820); + frame.get().validate(); + }); + settle(frame.get(), events); + onEdt(() -> { + Container settings = required(dashboard.get(), "responsive-settings"); + assertValidAncestors(settings, frame.get()); + assertSettingsColumns(settings, width); + Container runtime = required(dashboard.get(), "advanced-runtime-fields"); + AbstractButton advanced = button(dashboard.get(), runtime.isVisible() ? "Advanced −" : "Advanced"); + if (!runtime.isVisible()) advanced.doClick(); + }); + settle(frame.get(), events); + onEdt(() -> { + Container runtime = required(dashboard.get(), "advanced-runtime-fields"); + List fields = textFields(runtime); + assertEquals(4, fields.size(), "All Java override fields remain available"); + JTextField java8 = fields.get(0); + if (java8.getText().isEmpty()) java8.setText("C:/fixture/runtime with spaces/bin/java"); + assertEquals("C:/fixture/runtime with spaces/bin/java", java8.getText()); + for (JTextField field : fields) { + assertTrue(field.getWidth() >= 80, "Runtime field must remain usable"); + assertTrue(field.getHeight() > 0); + } + JScrollPane scroll = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, runtime); + assertNotNull(scroll); + scroll.doLayout(); // Calls ScrollPaneLayout -> ResponsiveSettings.getPreferredSize. + JTextField last = fields.get(fields.size() - 1); + // JTextField.scrollRectToVisible only scrolls the text horizontally. + JComponent view = (JComponent) scroll.getViewport().getView(); + view.scrollRectToVisible(SwingUtilities.convertRectangle(last.getParent(), last.getBounds(), view)); + assertInsideViewport(last, scroll); + if (width == 950) assertTrue(scroll.getViewport().getViewSize().height + > scroll.getViewport().getExtentSize().height, "Expanded narrow settings must scroll"); + assertInside(button(dashboard.get(), "Save settings"), dashboard.get()); + button(dashboard.get(), "Advanced −").doClick(); + }); + settle(frame.get(), events); + onEdt(() -> { + assertFalse(required(dashboard.get(), "advanced-runtime-fields").isVisible()); + button(dashboard.get(), "Advanced").doClick(); + }); + settle(frame.get(), events); + onEdt(() -> assertEquals("C:/fixture/runtime with spaces/bin/java", + textFields(required(dashboard.get(), "advanced-runtime-fields")).get(0).getText())); + + onEdt(() -> button(dashboard.get(), "Worlds").doClick()); + awaitUi(() -> !required(dashboard.get(), "activity-progress").isVisible(), events); + settle(frame.get(), events); + onEdt(() -> verifyWorlds(dashboard.get(), frame.get())); + events.assertClean(); + } + onEdt(() -> { + dashboard.getAndSet(null).close(); + frame.getAndSet(null).dispose(); + }); + onEdt(() -> { }); + events.assertClean(); + } + } finally { + onEdt(() -> { + try { + if (dashboard.get() != null) dashboard.get().close(); + if (frame.get() != null) frame.get().dispose(); + if (original != null) UIManager.setLookAndFeel(original); + } finally { events.restore(); } + }); + } + events.assertClean(); + } + + private LauncherActions fixtures() { + return new LauncherActions() { + @Override public List profiles() { + assertFalse(SwingUtilities.isEventDispatchThread()); + return Arrays.asList(new ProfileInfo("fixture", "Fixture profile", "1.21.1", "VANILLA", "MODS", "", false)); + } + @Override public SettingsInfo settings() { + assertFalse(SwingUtilities.isEventDispatchThread()); + SettingsInfo settings = new SettingsInfo(); settings.account = "Offline fixture"; settings.defaultProfile = "fixture"; + return settings; + } + @Override public List worlds() { + assertFalse(SwingUtilities.isEventDispatchThread()); + List worlds = new ArrayList<>(); + for (int i = 0; i < 8; i++) worlds.add(new WorldInfo("local:fixture-" + i, + "Fixture world " + i + " — long metadata and Unicode 世界", "", "", + directory.resolve("a long fixture path with spaces/another long directory/original saves/world " + i).toString(), + "", false, true, "1.21.1", true, 1791072000000L, 184549376L, true, + Arrays.asList("vanilla", "file/long fixture datapack name"), true, false, true)); + return worlds; + } + }; + } + + private static void verifyWorlds(DashboardPanel panel, JFrame frame) { + Container first = required(panel, "world-local:fixture-0"); + assertValidAncestors(first, frame); + JScrollPane scroll = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, first); + assertNotNull(scroll); + scroll.doLayout(); + Container view = (Container) scroll.getViewport().getView(); + int previousBottom = 0; + for (int i = 0; i < 8; i++) { + Container card = required(panel, "world-local:fixture-" + i); + assertTrue(card.getWidth() > 0 && card.getHeight() > 0); + assertTrue(card.getY() >= previousBottom, "World cards must not overlap"); + assertTrue(card.getX() >= 0 && card.getX() + card.getWidth() <= view.getWidth()); + assertInside(button(card, "Launch"), card); + assertInside(button(card, "Open folder"), card); + previousBottom = card.getY() + card.getHeight(); + } + assertTrue(view.getHeight() > scroll.getViewport().getExtentSize().height); + AbstractButton lastLaunch = button(required(panel, "world-local:fixture-7"), "Launch"); + lastLaunch.scrollRectToVisible(new Rectangle(0, 0, lastLaunch.getWidth(), lastLaunch.getHeight())); + assertInsideViewport(lastLaunch, scroll); + assertTrue(scroll.getViewport().getViewPosition().y > 0, "Final world must be reachable by scrolling"); + assertFalse(frame.isVisible()); + } + + private static void assertSettingsColumns(Container settings, int windowWidth) { + Component left = settings.getComponent(0), right = settings.getComponent(1); + assertTrue(left.getWidth() > 0 && right.getWidth() > 0); + if (windowWidth == 1200) { + assertEquals(left.getY(), right.getY()); + assertTrue(right.getX() >= left.getX() + left.getWidth()); + } else { + assertEquals(left.getX(), right.getX()); + assertTrue(right.getY() >= left.getY() + left.getHeight()); + } + } + + private static void assertValidAncestors(Component component, JFrame frame) { + assertTrue(component.isDisplayable(), "The test must use real native peers"); + for (Component current = component; current != null; current = current.getParent()) { + assertTrue(current.isValid(), "Expected validated ancestor: " + current.getClass().getSimpleName()); + if (current == frame) return; + } + fail("Component is not attached to the fixture frame"); + } + + private static void assertInside(Component child, Container ancestor) { + Rectangle bounds = SwingUtilities.convertRectangle(child.getParent(), child.getBounds(), ancestor); + assertTrue(bounds.width > 0 && bounds.height > 0); + assertTrue(new Rectangle(0, 0, ancestor.getWidth(), ancestor.getHeight()).contains(bounds), + "Control outside its container: " + bounds); + } + + private static void assertInsideViewport(Component child, JScrollPane scroll) { + Rectangle bounds = SwingUtilities.convertRectangle(child.getParent(), child.getBounds(), scroll.getViewport().getView()); + assertTrue(scroll.getViewport().getViewRect().contains(bounds), "Control must be reachable in the viewport: " + bounds + " within " + scroll.getViewport().getViewRect()); + } + + private static void settle(JFrame frame, RecordingEventQueue events) throws Exception { + // Separate EDT turns allow queued validation to run; this is not recursive doLayout. + for (int pass = 0; pass < 3; pass++) { + onEdt(() -> { RepaintManager.currentManager(frame).validateInvalidComponents(); frame.validate(); }); + events.assertClean(); + } + } + + private static void awaitUi(BooleanSupplier ready, RecordingEventQueue events) throws Exception { + AtomicBoolean result = new AtomicBoolean(); long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); + while (!result.get() && System.nanoTime() < end) { + onEdt(() -> result.set(ready.getAsBoolean())); events.assertClean(); + if (!result.get()) Thread.sleep(20); + } + assertTrue(result.get(), "Fixture callbacks did not complete"); + } + + private static Container required(Container root, String name) { + Container found = findNamed(root, name); assertNotNull(found, "Missing component: " + name); return found; + } + private static Container findNamed(Container root, String name) { + if (name.equals(root.getName())) return root; + for (Component child : root.getComponents()) if (child instanceof Container) { + Container found = findNamed((Container) child, name); if (found != null) return found; + } + return null; + } + private static AbstractButton button(Container root, String text) { + AbstractButton found = findButton(root, text); assertNotNull(found, "Missing button: " + text); return found; + } + private static AbstractButton findButton(Container root, String text) { + for (Component child : root.getComponents()) { + if (child instanceof AbstractButton && text.equals(((AbstractButton) child).getText())) return (AbstractButton) child; + if (child instanceof Container) { AbstractButton found = findButton((Container) child, text); if (found != null) return found; } + } + return null; + } + private static List textFields(Container root) { + List fields = new ArrayList<>(); + for (Component child : root.getComponents()) { + if (child instanceof JTextField) fields.add((JTextField) child); + else if (child instanceof Container) fields.addAll(textFields((Container) child)); + } + return fields; + } + + private interface EdtAction { void run() throws Exception; } + private static void onEdt(EdtAction action) throws Exception { + AtomicReference failure = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> { try { action.run(); } catch (Throwable error) { failure.set(error); } }); + if (failure.get() != null) throw new AssertionError("Displayable EDT action failed", failure.get()); + } + + private static final class RecordingEventQueue extends EventQueue { + private final ConcurrentLinkedQueue failures = new ConcurrentLinkedQueue<>(); + @Override protected void dispatchEvent(AWTEvent event) { + try { super.dispatchEvent(event); } catch (Throwable failure) { failures.add(failure); } + } + void assertClean() { + Throwable failure = failures.peek(); + if (failure != null) throw new AssertionError("Uncaught exception on the Swing event queue", failure); + } + void restore() { pop(); } + } +} diff --git a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java index 9b622693..d8585c19 100644 --- a/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java +++ b/src/test/java/com/osiris/autoplug/client/ui/DashboardPanelTest.java @@ -101,6 +101,39 @@ class DashboardPanelTest { } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } } + @Test void settingsMeasurementSurvivesChildLayoutInvalidation() throws Exception { + AtomicReference panel = new AtomicReference<>(); + SwingUtilities.invokeAndWait(() -> panel.set(new DashboardPanel(new LauncherActions() {}, new ServerBrowserService(directory.resolve("servers.json"), directory.resolve("servers.dat")), false))); + try { + awaitUi(() -> !findNamed(panel.get(), "activity-progress").isVisible()); + SwingUtilities.invokeAndWait(() -> { + findButton(panel.get(), "Settings").doClick(); + findButton(panel.get(), "Advanced").doClick(); + Container responsive = findNamed(panel.get(), "responsive-settings"); + JScrollPane scroll = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, responsive); + for (Container group : new Container[]{findNamed(panel.get(), "settings-account"), findNamed(panel.get(), "settings-defaults"), findNamed(panel.get(), "settings-advanced"), (Container) responsive.getComponent(1)}) { + AtomicBoolean invalidated = new AtomicBoolean(); + // Wrapped text can synchronously invalidate an ancestor while Swing measures it. + // Force that lifecycle event once, including in headless CI. + JTextArea wrapped = new JTextArea("A wrapped text measurement invalidates its containing layout.") { + @Override public Dimension getPreferredSize() { + if (getParent() != null && invalidated.compareAndSet(false, true)) { + LayoutManager manager = getParent().getLayout(); + if (manager instanceof LayoutManager2) ((LayoutManager2) manager).invalidateLayout(getParent()); + } + return super.getPreferredSize(); + } + }; + wrapped.setLineWrap(true); group.add(wrapped); + scroll.setSize(620, 350); scroll.doLayout(); + assertTrue(invalidated.get(), "Regression must actually invalidate during measurement"); + assertTrue(responsive.getPreferredSize().height > 0); + group.remove(wrapped); + } + }); + } finally { SwingUtilities.invokeAndWait(() -> panel.get().close()); } + } + @Test void serverCardJoinKeepsAddressThroughRefreshDuringDefaultPreparation() throws Exception { CountDownLatch preparing = new CountDownLatch(1), release = new CountDownLatch(1), launched = new CountDownLatch(1); AtomicBoolean prepared = new AtomicBoolean(); AtomicReference> request = new AtomicReference<>(); From fdc3c95d3ed6454874e0a9bfdb5e474366869ca6 Mon Sep 17 00:00:00 2001 From: AntonSelin Date: Sun, 4 Oct 2026 23:11:05 +0200 Subject: [PATCH 9/9] Complete final launcher workflows and managed AutoPlug instances --- .../launch-chooser-compact.png | Bin 0 -> 8677 bytes .../native-launcher/launch-chooser-dark.png | Bin 0 -> 8513 bytes .../images/native-launcher/launch-chooser.png | Bin 0 -> 8971 bytes .../managed-console-compact.png | Bin 0 -> 45105 bytes .../managed-console-dark-compact.png | Bin 0 -> 44124 bytes .../native-launcher/managed-console.png | Bin 0 -> 48284 bytes .../overall-progress-compact.png | Bin 0 -> 60281 bytes .../native-launcher/overall-progress-dark.png | Bin 0 -> 64318 bytes .../native-launcher/overall-progress.png | Bin 0 -> 66444 bytes .../native-launcher/profiles-compact.png | Bin 0 -> 56712 bytes docs/images/native-launcher/profiles-dark.png | Bin 0 -> 61071 bytes docs/images/native-launcher/profiles.png | Bin 47753 -> 62994 bytes .../server-browser-compact.png | Bin 43828 -> 49669 bytes .../native-launcher/server-browser-dark.png | Bin 63034 -> 62331 bytes .../images/native-launcher/server-browser.png | Bin 63475 -> 61171 bytes .../native-launcher/settings-compact.png | Bin 41230 -> 41585 bytes docs/images/native-launcher/settings-dark.png | Bin 49561 -> 51754 bytes .../settings-fullscreen-compact.png | Bin 0 -> 42569 bytes docs/images/native-launcher/settings.png | Bin 51580 -> 52936 bytes .../images/native-launcher/worlds-compact.png | Bin 0 -> 55533 bytes docs/images/native-launcher/worlds.png | Bin 70822 -> 73903 bytes docs/native-launcher.md | 67 +++- docs/testing/FinalUiPreview.java | 164 ++++++++ docs/testing/README.md | 19 + .../java/com/osiris/autoplug/client/Main.java | 9 +- .../com/osiris/autoplug/client/Server.java | 87 +++-- .../autoplug/client/browser/SavedServer.java | 8 +- .../client/browser/ServerBrowserService.java | 24 +- .../autoplug/client/browser/ServerIcon.java | 37 ++ .../autoplug/client/browser/ServerStatus.java | 8 + .../client/configs/GeneralConfig.java | 5 +- .../client/configs/RestarterConfig.java | 4 + .../client/configs/UpdaterConfig.java | 4 + .../client/console/ThreadUserInput.java | 12 + .../client/launcher/LaunchRequest.java | 12 + .../client/launcher/LauncherFiles.java | 38 +- .../client/launcher/MinecraftLauncher.java | 126 +++--- .../client/launcher/ParallelDownloads.java | 112 ++++++ .../local/ConPluginCommandReceive.java | 3 +- .../client/profiles/FabricDefaultProfile.java | 197 ++++++++++ .../client/profiles/LauncherServices.java | 80 +++- .../autoplug/client/profiles/Profile.java | 3 + .../client/profiles/ProfileStore.java | 13 + .../client/profiles/ProfileUpdates.java | 6 +- .../tasks/updater/mods/ModrinthAPI.java | 35 ++ .../autoplug/client/ui/DashboardPanel.java | 263 ++++++++++--- .../autoplug/client/ui/LaunchChoicePanel.java | 69 ++++ .../autoplug/client/ui/LauncherActions.java | 9 + .../autoplug/client/ui/ManagedWorldPanel.java | 101 +++++ .../autoplug/client/ui/OverallProgress.java | 10 + .../autoplug/client/utils/MineStat.java | 5 + .../autoplug/client/utils/UtilsMinecraft.java | 40 +- .../client/worlds/AutoPlugWorldBootstrap.java | 113 ++++++ .../autoplug/client/worlds/ManagedServer.java | 25 +- .../autoplug/client/worlds/ServerLaunch.java | 5 + .../autoplug/client/worlds/WorldService.java | 30 +- .../client/ServerProcessObservationTest.java | 69 ++++ .../browser/ServerFavoriteHistoryTest.java | 37 ++ .../client/browser/ServerIconTest.java | 32 ++ .../ServerStatusIconIntegrationTest.java | 61 +++ .../launcher/ParallelDownloadsTest.java | 358 ++++++++++++++++++ .../profiles/FabricDefaultProfileTest.java | 177 +++++++++ .../client/profiles/LauncherCommandsTest.java | 2 +- .../client/profiles/LauncherDefaultsTest.java | 15 +- .../profiles/LauncherPreferencesTest.java | 129 +++++++ .../profiles/WorldActivityOrderingTest.java | 42 ++ .../client/ui/DashboardDisplayableTest.java | 4 +- .../client/ui/DashboardPanelTest.java | 95 +++-- .../client/ui/DashboardServerRowsTest.java | 151 ++++++++ .../client/ui/LaunchChoicePanelTest.java | 90 +++++ .../client/ui/ManagedWorldPanelTest.java | 196 ++++++++++ .../client/ui/OverallProgressTest.java | 23 ++ .../worlds/AutoPlugWorldBootstrapTest.java | 94 +++++ .../client/worlds/LocalWorldStoreTest.java | 15 +- .../worlds/ManagedConsoleFixtureProcess.java | 19 + .../worlds/ManagedWorldPackagedSmoke.java | 92 +++++ .../client/worlds/WorldFixtureProcess.java | 8 +- .../client/worlds/WorldServiceTest.java | 14 + 78 files changed, 3245 insertions(+), 221 deletions(-) create mode 100644 docs/images/native-launcher/launch-chooser-compact.png create mode 100644 docs/images/native-launcher/launch-chooser-dark.png create mode 100644 docs/images/native-launcher/launch-chooser.png create mode 100644 docs/images/native-launcher/managed-console-compact.png create mode 100644 docs/images/native-launcher/managed-console-dark-compact.png create mode 100644 docs/images/native-launcher/managed-console.png create mode 100644 docs/images/native-launcher/overall-progress-compact.png create mode 100644 docs/images/native-launcher/overall-progress-dark.png create mode 100644 docs/images/native-launcher/overall-progress.png create mode 100644 docs/images/native-launcher/profiles-compact.png create mode 100644 docs/images/native-launcher/profiles-dark.png create mode 100644 docs/images/native-launcher/settings-fullscreen-compact.png create mode 100644 docs/images/native-launcher/worlds-compact.png create mode 100644 docs/testing/FinalUiPreview.java create mode 100644 docs/testing/README.md create mode 100644 src/main/java/com/osiris/autoplug/client/browser/ServerIcon.java create mode 100644 src/main/java/com/osiris/autoplug/client/launcher/ParallelDownloads.java create mode 100644 src/main/java/com/osiris/autoplug/client/profiles/FabricDefaultProfile.java create mode 100644 src/main/java/com/osiris/autoplug/client/ui/LaunchChoicePanel.java create mode 100644 src/main/java/com/osiris/autoplug/client/ui/ManagedWorldPanel.java create mode 100644 src/main/java/com/osiris/autoplug/client/ui/OverallProgress.java create mode 100644 src/main/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrap.java create mode 100644 src/test/java/com/osiris/autoplug/client/ServerProcessObservationTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/browser/ServerFavoriteHistoryTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/browser/ServerIconTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/browser/ServerStatusIconIntegrationTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/launcher/ParallelDownloadsTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/FabricDefaultProfileTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/LauncherPreferencesTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/profiles/WorldActivityOrderingTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/ui/DashboardServerRowsTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/ui/LaunchChoicePanelTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/ui/ManagedWorldPanelTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/ui/OverallProgressTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/AutoPlugWorldBootstrapTest.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/ManagedConsoleFixtureProcess.java create mode 100644 src/test/java/com/osiris/autoplug/client/worlds/ManagedWorldPackagedSmoke.java diff --git a/docs/images/native-launcher/launch-chooser-compact.png b/docs/images/native-launcher/launch-chooser-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..37c2acf52a51b67d6be35671f99499fd70ded322 GIT binary patch literal 8677 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 KUDBP0ul^0+EAZn0 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/launch-chooser.png b/docs/images/native-launcher/launch-chooser.png new file mode 100644 index 0000000000000000000000000000000000000000..b06b34ff71a433fedb8d3910de81a5df4ddc924a GIT binary patch literal 8971 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 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/managed-console-compact.png b/docs/images/native-launcher/managed-console-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f2344a4dd8304c8b6a3799fdfb435a973d3cd0 GIT binary patch literal 45105 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 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/managed-console-dark-compact.png b/docs/images/native-launcher/managed-console-dark-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..0231e450a7c1dfe69c3dfb6d403182aa9db4cd55 GIT binary patch literal 44124 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 f@@Sz>dT1*@P>3!h*2e383G9fux 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 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/managed-console.png b/docs/images/native-launcher/managed-console.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc7ec5c1b6514681adab36ba793d40e7b7657fa GIT binary patch literal 48284 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%0Da6sl}q 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 Scs4#DmBUoE@03Fyg#R1MPt`mC literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/overall-progress-compact.png b/docs/images/native-launcher/overall-progress-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..6b73e76498e6c8a44c2a48a63c3755c30579ff75 GIT binary patch literal 60281 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%0At8tV|A5py-!@*$ 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 z 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 z zdQIP}**OS}`j*KWqbGdS~;2#OKN(G zh6N2W(+HV}>y-DMW)T&OHcCEf(=kWcbVGAN-F6O;-Gqd!^0jTS39 zqDTi5qu&pdaZl^Dbfjg9s9@+3aI@WK;}zg$@)+)DZ&j&0gD#-dJ*T`R$-e_R*F{T? zd;gh9JZnLbV(@q>#WXUjw%7ypPqMYQsl1JdZlQeOrRZ4-6s3%MTCpWB$h3G|fOF?E zYty~IXIgu8Mk7uC^ylX9Cpo~D`Y`o7gNpL{Ch`ByWV*=6`uoETzja+92X*7O$OsAw n9_n9hJpG-Ug%P{@ug2C-!~1wtQSQvtARB-Jo5#72p1A!l`^HM# literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/overall-progress-dark.png b/docs/images/native-launcher/overall-progress-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e6607bcd6eca69e0a6ae6e505ab28a631ee0b2f5 GIT binary patch literal 64318 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%0DmLcj1EFtW+avH@Y}mZjSVCHW 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 literal 0 HcmV?d00001 diff --git a/docs/images/native-launcher/profiles-dark.png b/docs/images/native-launcher/profiles-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe5551f7120e721d8fae1fed6a0ff1e4b850b4f GIT binary patch literal 61071 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 literal 47753 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 diff --git a/docs/images/native-launcher/server-browser-compact.png b/docs/images/native-launcher/server-browser-compact.png index 5b8196a2d26386e19d740b683dfdf180cb15a1ab..c02f43d707582d2d5b2bc8ff827d28486dcdd9b5 100644 GIT binary patch literal 49669 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 vtbJHfaNx?Gp~f>ao*!P zk(4K7Mc?;WkHtiSyq8o$h_F-sI%pq<@VC6560*wOCD#rJnHk98umsk+h$7hU)6XK0 zkK&sC>5@tQ0aU~l@Iz>41u zTQHyzag$j*4(*<^yxce{uFNC{`rZ2J2tG7P;z6hmZP{8sdDF2|-K%nyT>f!hyavx= zy_CzaD0W_QgU`++*K3^9a?!mR1`Q-sb~z}7Fx2`b*Vw|c`%3ir zDbMx&^uB4`Rah&eb?TZ#e})GUU00sa7(UK&SdRX6xZ^XQ<$Q;>ITV9F-p$k$lbkg)ol6s^EK`UnHq+7yHBQz>&IV_46(Y1lqxW`^IrUl zXKETIF-A7I>A2Erf1??5s-Ei5O?OPduPNO~!e>7g25Vu&|M(!A@dS?zbvDzuIiy!V z-t?KY+h86;K=18sabL_DS1L9w{qvZHnna~9LSm;+{=LRhV2K8GPXcDWJ*#|~WrB}o znC%Z28#5H1rj+9pW3sRAjCO-Fh)nWgDXVH)t1dCO@XjQ3ZuT;=Ciyd?Ma4}5n>*lV z%U7Uljk5liZ@kU0X{DlnZ@r2g>(NO0nv3oDtoK_Qm3AZ9wCT#>Ox8$K{p9M3^OTNk zKL&KR*A>?{`3$;UwQdR4=hd$82E;=)nVsh4s0{&4^R+rth1)@I-2cZ+a?yKvX$^+_ ziiiH=8r}mCL3(`l_~O~k5tFvGdCQ|I_}OLFX7!pjA>UnuBHkU?scu>La9J+LS1N*@ z&FbsLrwq;kAq5<~?gyLjJC}DSv#2eH?MHal#-lVK+vw5XW@=hU!ET;|)Rz73+vls* zo;G2%J=q{b6yZN-poSz(48jAQddlXQZqHG=zf_7V?FD9 zSI$VZT?H#q74;vRA8IiDV>|$B5`c)@f1Qp0pPxO{p(VG0giy>S_ktP2%`aeVKvZ0Y zgNnBM{aZoa(LrsvhLxi&b`4j+q^zdphUuaFJ5I}aUO`SxMM<5lDc=xsj-sklP*!_P z^*e|=Gyr~F!=2JMSUNB8Z~73|eyJZfn#Bo{G@!mmz>jQfe9hO=JPxPH<|=Jy-@Ela zN5wcn{h!~zj$==1Ydan;(^g~cQC?xHzA2zp#@WhetOeD7fb8;PV{0tx{0qmC_602m z2P5~&YbTipT9dW9J0%}fB?_p z%II6F(`%8Hf0L^!9*y|q@Be@RbUSc$!AxH>emnZm0JNki2t?z2A;GFizQ5Xm{G6o} z+<*|I+EG63DyQvIvCgXlw4vJoq!0(d)y4E`<@`B2e+iF2SXz|TemjjWdWa--knhi% zp5?{`9t4+opaV25i@Tj(?Z8E(LXL%gcA@a1LiSh>m-@&+QKyNxI0N75g?u-xQr??t zho%>YRY(p4A3trE$4=%mQfPIkIO3AEUHvBbic%+4#_v0^fSbCdxOj&Frg8n5uE%gh zGtClR_offU!U$z@8n6LT@m?r2SQWrR6Wd2+f|zV+cG+;&J4?%fS_wLPG9_n75@MOd zR!x4S6L>Cs-ra;M--sglCFbL2RPKqArSw@>CabouVx$n#Shr`G#!#Jf+uCt}y&}El zX@qSTdfbZY3tWC4kK?cc&8i)wN;^?oURLkc2$&tW$SC%~(rlhn!r9w$dBkjt(Nm|j z@FU<`Y39vzpb>2EAO-7H~o5VqoeQEH+ly8+qm;_ zi|2}*9!5|kw^paw%ofjajQMbw2A|fF_`NeHy=A1$-=1(j20oPg+9MGj>OM6kb>-m0 z^yqSqoeuHX@2}VB`VKX`z-)1&5NTcOvb(x&E8dGDm1mOVdNK ztBG6$(hAZ?f&t9J5;IMq^e@Sp(jTp)TrF0_X^Wna)$f0HdaSI06R-G=kgKtzvnW4} z$D3i55!)45s3we>!V5E5iZt<4k+ZH_jFPUa6OSs!Pu_P&4LSrwq)=Pva(lLZ)8npp zc<9SUm&K6Z*)ZjAjqo8hD>lc%d}zWj9yNiJz##5m^oFo#HM{4A;{-u_w0HMf_^%-y zQ@V2Av;+w?E9oGnrL7PT+82n7Sv)ugFePQGI*x{wO4ztNk{SXv8(>F84>OLgk(t`wFYr1EI_usuU= zcV2OkR<*&6ykg~U0Ib)ocWb94#|IO^p#f&=<`_)bCyx^gAlHlg!LW2yo6luar4spU z-hjQEMeaSsz{WX$-~rqCdS^hM$vGOZeY|E~HQ7ntmz9bH9+z59Llxp=a_;9pkn&3%D2RC9D_Mww zK0@he#5hZoLN}=P8&&ulr;YDYPfW0n+R3KLBPUX1i574vb{;QsQqCq_EF*%bs&-vy zOnOnSH7rV#(a2~iFDc4Y1*=>4H9~3dIO~uvBDIeEUMwR%Ug^%NU~oKHeA#TND>+f0;6XeV z6hkYU4jFLoTt1$zxk4jGv#)O$I$$et+r%lH8Y|sfU#8q%G`?#B>hn_7Dwe~FaCvSZ zaq52^Y>{{SivJWr1#&Z)n`;h|fA#HI+tq)R@9003?@i?5$B>c(BwMp>)_0GKR<6)U zJ5*xZS8&FSH{d~OR_BLiPuvF&%Lj6)`#n$U%h+IoI)l1Gr%wnN%|Vs*b7#YMe97s( z*{vZVJ%itrB5k?5J9DMl7U;%yaI_XKXKUsY6xNvXMJ*7A&e3Nc@{rr;nb+9wd^*jA zYYy|@ii(`2EdyfB#7h|Qu`4WP(cC#@JMJMxHu~4lXwzb&4PdRfV)A83u>%HsH&*-yT#<4l#b0;M&T;(aXPIz5M1C!ac1 zFyb@vTE)VAqWXtc?a4!1{gKwlQgmA*J01K}&HTE~025Kj3qHin&zs5v`x-ycD`qO_ z2NKEiRA6UXiAT(gpxu*PK8-Gm+{?zh?Q zX!cNLD_>H8JG|VK0mxb2XqUi3?l5kVd(-Uq;cvLxPs7oy<~&VLF_t2!5~@5L-fh#K zs4}#CJaBJmHw@g+mTnXPesm>Wow$eHsneby#AsZvnGidR?(|!8wf0KHU6+}s;=|b zPk%c7M2Hwkvpj&xvCiT~VJdSJnE43H!Y^J$8C51;GAxCNtX-jsT`ckTlZSFXGf%>g z$Y-d#cq1X%x-c9-m zwkL2coDZ<1GX=2}5_cjcSpa<|Y!4&F(D z&UMBz96N~`aj_rAdK4vwS`F$0pGFk|Euk2T3-_C=bbmfMEz})t`tD=cw9un3sU}uZ z!FqupYSVTRNaH==g+A729hPX5s8mA!RXgE``1}$hy4a9yZe*!Buut;vAKD8 z)Z?Bnn&|#Eh__7;N-@13kJ|}ssJE@=q}Qe4tJWEjn)@9~D#{Ni7pYbe&OMzgpi1(W zRi(Kdps#kNgN8>)ol$-8b7XBry2;>y!dhGAMtsMfL&?oE_g-ljzE7Z(Mxc^`qbjYUj!mb72i-S>iqnqI?iy zd%F9}98ED^w9fhDM<L{-aT1Kt4OW zWx=jJ>A@aGk|QcDvzv^1=uZjMuc;_IwCsY2Wd%j)S{FdrQNNqvTjtZ909k1^p#)fP z;R*iT05R@*J*!&OU2DT5Qjhi<5BzKG*q^SNhD0!?V7H9-)-id>c*1NAJ`J%=<3pcz zeI7>mp?X+e=&ce$UXLi>rP8HUsKs|Y!M|vBwSX_CGp4QC$g`l z>Etou0U<=cfZ<%>-Ct-|tgfK(y8C&R7|8~%KyQqUN8okKTf5;w;(M$38abctFxtSx zcehb~w)%Xs3Yp9r*!AJa;M#NIw-lngh?i$M0a-pLd1qlLh>rvz8amN>nYbT|t|B5Y z=fTsvASD(0G}KjS1ec}(^ndTVoDsA`~~aCbU^#Nu;~GNeO{+i_WZB> zq!Hz4E6Nq%@VB?6d9vs9IC$Hj%6b9Og`{s|U1aPY5Ni4k|)*tSF{F6g# z0g#8Dx=th&YghIhRw3aAZ%cdJ3w3qlyL~f&KWvP8J0@}niV(N>jm?Szm?(D))8TJA z0G`61ZB#{8SclT!w&XOmlN?;GoP#2iM4~7443cm3mhO; zPwOhYF)lG%V1S-xY@OvX2&n9id9&4Svc7xkQ-~Y~jC7u3f(Wlwrg;jDBF(C;;yovq zIyG4>f(L&J$2JB)u`HYMa_s3f#@YQv4J(azh};efkImsClM%TaQxfkk181}QG!(Wk z8O!Lu?8{$00EYZr{npd&y0eaqGVk*W=g(&!Xly3zgdiRpDNakq^usIYrvKn((u|n$ z{C5+V|3Y*2$H5+MI@G4l9pU$-#;P08x5D?wM;gnFQc?YIn5m>8cYD>uBb&P9;`gN_ zM;c-|%YVGH+Mtiwm&*;s^`U<3IROAuPbA&M8DBd6foJ42f-`U|dII8@8b_5~9IU-c z3x58jMJD7uLo0>^-5l0C1-<`MJ6ESw5PPzhb1fG+spOZvxtq3d*P2G=(=zyo`5d#$%a|P*5xGjAyfZHN@j|aTIOp zJrvOH>6AFht!XF>=ZEz83b0NhLNsr={g)WMpJ# zA2lvl0tL9o71HV61z8Vr2YeUWT>tr!c$SkDtjANZ9;tWE4FRi%l^S4QdaX1>Y~a^y z&V2_JIUa}Rf3g!2O1zCgL()* zU$#4g^uu#1Fl6J;4r2J5i(U?Ph?N;42bKmy>tHIfk4zTtrEY}wGB>FR!@Y}a6 z$C6BMP%!ZjT64LXG1=jDdH@H&)x=lNM8!~TBeJoq<_JwPt~%7CI6iWEFxI4(&@eI< z3Gd07!@%fqwNmRO1~ZuefEX0`g@QxyT%k_iDn6&?O=T+y9VUF>DPCTV9T`zFHGJD7uao!-`4`{F75DFqzoAaKXc(gB_WS|V zi9gc>n}WB_L6?vd_yq9(5t|VeDlQllI~fErflygGP`6WBFM7$F7t0C{mYFOsD1(Ib!yXBSexA-TH9V5Nc zKVcFJ)GNDhJT~bt=ftQe2B1;lNZHOlTDgB=UeK{wGTXF?A(fYnyO&zw{u!4e!YyNk z8t|`XE6ifN0;d;VQGq@Pt?TD`^YYpI6qqsZ;~H;Hr#s6*b+=1T#+DfAuQ+?4IAn-? z`kbd0$4@Aa|6}C;x7m1T%7S8lZdRFWo_&5QQi$88<&-{F=bLd^O{+KM0(z~Gd8hE0 zQK|KSi3-Vav9LO)vueLH-b9N7GKwA&Oo5&&6c^`9k@KM42&fS{P{sUMmPMYl$QFB- z@10%(NE9|XFca%j74+Nt>o4K&uU-l((m@+6AE+UD!_tMGv_H?6vU!L-*`HHR9%_46 zgY?9_;VDPEkNO^Jz~<67zb+bjdXHZ|@J}@auO|DCuVzqXS)xOb5yeq?U}Jr>c2&!$ z6Y&C$4LtarcZskra=arIU%q_#y~^t-Y5tc50Q|hF+`(7BjRviSeML-7b8g{4 zP1tmdx&a~Y5{y*C%z&{-x|D+%hkiYW_7LpLZ?9cagZWtT&OmK#&~xoP#NLYZ&5Pgb zQA-{lr;@_w`k1lZz3cXoGNwfcfHw0&tx*9h_BEr$M$Tva5wJ)$)Ea)to$P$rq}Mnp zo7j|apRZJDt2gbKJHFmb=f3n(L>|pn#!%kz=w9@JCz+_Uz%8%<$z!8^&U?fH9;y~O z>~n?36qvLgRI4UsQn-Lfq|wOsRnU#mz>DK0pfC9Z^i-Bh0F8GVGq-Oi(f=%&qZovj z0c3T&wY1c47e)Z%;WO!DJ{-I zT%46p=wgUq-{m`HwaR&#$1)#Ccq}x^%ggT@sFuxIdoM>z%z+kio4k8-!~Pen#g08M z{cN6>(Fx)tU5w$ACUJ-4_rcj3E7#S?QR+8$Fao9IKoNxgebDjGqi)WdOOTwN zyH&ogjJx~H*;$o^od0fq)*Pv}3=tgsFMeiwpYd&$vk39`dJ749dY3EGmkWerEzM9!b6jHXRh%H5pNhw(uwukqTUi5dE?16dT{p z(@n~hb8DOWh577PQ{5=eJ0r~dCH@u;3hq)l&sE_*d6F@21w!i+n8ZIBVX57 z^`napl1sbFjzmR}osXypO^Aa^DsaA&WR)ckLx^P+=!0{;_7yr-tK3zXA{}R>`e`>yqk&fuzZ=4T!f?j-ZZd-*_e8)@X zk*v9^({+S<5QBV2YmP#`$ezg6hS##Zv-C@;f3e=1IZ9_iPAEd;|*%>I8dU zTwDMo6xyLP<)(USNji_c9H&WaUvwS;5&dtD#I>}7dTioAdh+Y+nfCI->=7DF0TH43VuWOr>s!TlL zuNV#u{C`Dwe!DJF0pP^{-zRVcDg0Iu<8GZ)p3wWu2xL4@k-=n?n+2WaXo?G!b9#x5 zqEH&piJ>L7N-@9-okyr*w`sQj;|0i2_ujEx{fvRau_w5@N9HG){umw3)ORk}F{3j8 zlqzxw=ApBfH)~HviBP#lGRO~oeKLFh;9rst6(6(=czeb{pY0BK2z|De&i>U!VSP6# z%Deh?K{Z7!&2M}6Y5-Vb!$N8O?Krt09?4D9fmMwE9j9xPN(h|N zhF$@G^m|KaxA2Xef>8V-JV!0v=}iQ)Vxo8LhGb$}hy<`=;LS|CxjwTro!4 z!jgCuWo2b0B_&ooWH{eug#Gtu-yi>iWA>{{Zsx;kmIEh`X`zOEdgq)mrzoeOn}Mbw zQ7z$fYMT8sP`L>tWI$`?{q=$-kY<|ht`KE4gX?de*VMPztyPzFM%V;sOo~DD>*?v_ zp@sUQ-ovu|Mfo022<<6iiGT4=Fir38X@bd@&O|&2mzU!g3DYYIL~c-_YbyB^hW|Z< z5O!m2yd_D9Sq_waz%ml~ahL~4P-4^UpTJpwf|h4TJaaY}KJ#qNUS zZVmjnjjCWYAMEDZiI7t9OC^xZ`xg)l1&^>N4`Wr7jg7W?!_EoRCRJ%~rk()Kf?cKj zA;i+^dH#CGrw5;Yx_5yWfCPcQFvOKwETz6BdK8MXYHmp*g&n zjI&6DN6Xp^X;Xxk@ z&CwrUGpge<7|F@}9w9(wPfq72aT{GmEx=+-d*w}of*P?wMgUc{~-ZHNYNT@AyX~XyLj8uPES;h18ifyI< z*APOLLb%IPP=J3=HnZe6a!e$^JdQjcGn%@O1P3E~XpS4XyF>Tk(y8w0Xn5tjGgi5^ zMWo=sy0ZY(Z&tIxmqB-S^=oKxwf4kugIG*7Wo=&_TD1b=*nd+F_nUiT;_S>QU?rLt z7<;u8qd$4^ZVFu%Nn!(bOr=v!S)k32XQq@NGIy&5Mx+y6G*h=ADLrTJ&Y>gPAuYSD zX|g;YrpvY9OfRFL<*r@IPP;q3ATDkQ9UQHw>@0eh6u|FmRon<;F@GGdVq-b?sdO*h zRN3~hfX0x-R$6Xad`DqNVz*@vF-`F3`t;77dP}YV;#p|?RYw?PIpG1}_*yQyFx*_1 zU5V-m{jrEcHpz&x*QrpK9Zx_V4#if{@qOY0tyOT|dbA=xRjIiUnGD-SDdLrCD=`o@HJIT|+S`j@FWuW{Y-pd_fxr0}yF z>%V&2-6fCt&UcgRg+4t&8VPUi_Teb&Qg&uoagiHNRYN-rS|;3Eq!g{2e3PpB!vNC) zh&)o!)XYQ$gWW9#7OL~s7b~57{0)^TARq4S3PnTk{b2s{n$Gz6;R$&G7IHQ0H=fAP>iS1rxGpa0j(LeEPy`Q9n4l)Ci)jevxQcXg>Yzh%+ir)gC= zVD5X^`v=9hqpV=L>qNEODf@KnjYikbLs-n^WCc%2RGEGs>OTUJLyg-F(LuN`+5n#S zU8GC*L7KoLsMs<$7?RU%7!jlJi~0@<@&{*HZ!V572>0a|-OQVFl?rdY$*4>_HWP zuA|Fc0y+lpEdO5=%oU11Bop+%@$=H>+&DOJ732vM~)9(4^F)jaZd8G_5m@Shg;CXxP z`uPQPTml~3!e(sv@f03amfvD~wAtq9+$`%3{|6WdS=<-4h`0JOC!PX;{ZMhj@Ft@W zV22TBk@&!7S?K-l2(OZMAHl!ZW@c}}Kj5_p*4~>mroXNzf5CsMxvcarORktlJUMn9~Jc zA}+ABlEL=z4hXR{Ban(FQ>9tjnk{_D$j6;E#}`3XyZIt|@O2wo0?w%7m` zx;6$)ZR}P0Q~6gG%mr87#g;*TF+acS!}z9paNUp8Z9QWx)xGbg0U53}38?m4P^)Z+ z?Grf~9`j!xMnMnuIt^G&7yH)@uBaAu9_)Qm98sm_qt8o0H!9^z&(B^z&y;!RpWPj$ z-OVV$96?9v`Nt@%FI876MmYKjrkg+qo{k7&I(m8{&^*TU;wNi=r&cDknX5DL67o?) zTwI*@^%AL=FK9Zpw!Ca;Vgitgu@vZlSAP#E7fr}nV6SeTlzp|M*Oi&&VY$TQeG!_| z)!kiNXVvS@X+1-83bC42ZYuuvuNOi6(^+dYBqVpxf@!aAuW`@otPXV8{gi|2Hn<#d zRskB+SUPP_9Dtte4KzKdbaZr0XAOH9tIkbVDQ*S%y`U#Gv_&~+|G^xwGm;x~%9<1! z8Y-rI29Pw+3+xiwXPDdmBV%1?rVX?~ z?^`mKX0m?4I}by{uSGt5ZAz==>k)BD0c-o9%^Hq7lU6Oo6g3r92!ZR>SV}OVHTmMw zl8(oL*w0<)R`>vm^bX|`Gz;F`@f{nQk!I+S7Le{%0qK@5iyT5) zI;FcCks7+YTe@S0I&0Mb-uvC3-*cT$%*A@Irh?ZYj%8qrBN|r?$Gsh9|CASEQz>QkI8D5; z*G8+M-j{}2k{-(>^G{6l$NW#9#dZrB!%%DGS{!(Q_q2r9Y=~yi>u{wr?R|R?Q7ySq zHV*g9S1aM;0kP7IhMDyr7nH=cmCWus3YToYISId6~f;MW&>1o-yXmvBH{_F;2GdITzS*Xsd# zna6fXN1KT?Xto&|dJSz)uUWbH4x!Yj?6ts@wyyktOkCLc9ks z86U0n+T%P2tZ1l8?L^-aVW>!&Xh68Z!OkAXZNqG?@4f@Ex-&Q@;Gp++cd#-s$$j5q zEUKrP0t{K+9czHGDLx{C`Xay3Y{@siK&J{no_=L*&DYOwi`c&oR$Fzp=t#8=HQ?Q! zhGr886+DEu7Q^)qhT3eNYRgHzaWtRle#2T%0W6t*aHj?X9_V;0|Ewf8b1?Pa$dy>4 zZWj)><`4sC>S6Z6!kdyaSQzy{{+{>E1wFV+^quqJnFAH|^#UcX{eoxysO+?QFWtoN zSdC1aBiXsuxSQa;QWT!$0Y`~CQ!Nn@5g4zy?}`M*66Go+yMl=ipAbQ~gd8^`^FQ@aI=F6wy;z|j z2YcdfQNdu5VXDqg0l|-Yr7W1y-cyk}{iAYZG+(ns)KXGh9Oga;$er-q1!Jo<&z{At ze_5rVYRx1*Tn+{kjpR<3ZMu+O(0DlbI4KAj}TQesZ zyR5Cdh(Ayzafy%uPC(Tqf=4Ich&jf6cQt1-wGGQATX9;FJq`n0ZlBW$!=;Ule@tw3 zwyqvEo0*wS^z`(MKnB_tTm0JQ=C5|04|@m!-xjyH?4^3Sa3R*6l3mMOh+I4uUVITCXM6XK%IgtT6_A$-+oPUuKD#ah)~~<@ z!1ozWVfO?Ji}F;)2FZ;FNbALG0-yrD+!YYTq3!MMjEs!+WN-Zu5Hpn$Y!z^r<#g=W z%wjNJ4blzNEULQ z4}c3;My5;0rh!%)$g07_22Cj?K=l1eNn>W9D=@Xd^Io&(1iVFsEfalC$dNZajFbWxaGcfPPTYSSnf0-C3_4n`vES zJzV^Zon2Y|9lZR;vn3*6Z@$T3>?yhH3YHfB;}5YUeI)@yH9 z0{Foa#(C-mM#dHP;C^}g*aKXmPQup*p-m?RHqE9t`+mZ(ewMBIrl#FHIJ%JNWN5wB zG}oZ=oN7C>rGB+7xL))>&LdALoqWQ;52ZXXHn1N6`2_=(v8j_b$VI>)S6D*#`K zFb&mM0NP47xc$5Om-FmwDvo+T0~Xy^sC1xzmu~^#Tt&bA_dRg8=wtl5TTr=F0MqVG z>Z%A#SicV8M{o;|4{iw5N8d-fo}}YXSO4m#NT&r*Ob4#f_!ZKst6feuN0&H=<^U(u z)$T{&EC$+W^#ff`+sDc*uR(MeseV-QR6uMtV{#$p=EJjA&`;JVQzTUrHKod3{FHAgNVUdL3#R7d+_byV|ULelU|Ni=) zfx`#%dypnDeslZ|^cOX~`Sv)OuIGqsIH+qt`ft>;>eDvCu{bwdg*O=eu@!pmAhmwm z+2&EH2AWt-;BQ^_NpSKQU{ipf?siS8%{fxRdPM~XSesNg>;{HfC6VmbQa_j%rXGe{d2U%1a zsyGHu>BgN9x`7y~xlF(p|4s6rk$~whKsaA+XsbAVi%&5?&)nU?b^&2!kbUB71+v5( zFOO*}KJ6{^eGo|Yfuk!q@ZdVBJiC>|^-);Ot?t*KzmJln!h{oYpDzlUpQuZhuboaJ$sLeC}F$ zwmbJ;PG4y%oiiyTU!ElTcU(Fc?h%4rh;EJ>@h@~f6aI-(M_=mp42t0dy zd=g_q&Lv)3UVaHyvo_Z=_wHH@<`&qioRhX%_Z%CquBwHhg?LVQDe8NL6=ZLNN|_4` zS{PTY=pJQ+jq!??-MP!R<-*G4v9-t=i-mMocpDiaNVmi~#z}Fu@bfQh+{#^{5BsnH zb-`ckWe>&6pwcr863O5Y+W_n^{G(z4QrPLgeD9+Yfq z@u|}6&&nnmZhrfbp;9-9>M$gnK)){^((75*;;@_bJ%4qx(^Ky`h+c|Kb+MXLl%&dB zrh!4mkLlj_-mavfxY%g7H2BE}4TxqAyqlXcHfqZmDpLWlosro$$Wxe??mi$|7f?js z?HsznMQhv3eANMp7_}_Z<7f&3DXrY(~oTSQFx06-4q*a``J zJZvXJQ?wqX7WmyKxUHlTV~VEc+}57l_Htk2?c$S}fA}o?t>)`be*D0r7kgl=^=RF+ z*pB6aM4MA&)n4%6`|J?hkiE`o_?n{A-@Vu4rzlleGoRuNFJ8oN*yt|~!d2Z91o-|^Lnwso} zgS7w>M_{YmsGNw`)h_1RaP<>Z!{&=h2*{E4bQ57R?PjX;Lzh!ka!wTZ1LmT6xR{R7 zw8!^myEx#X&0H57g{TgOy->g>QEPpyF0dEO&T^?`di+58^l&v1qb=%~rTw|HkC}Dp zKz{cV%7Zp}gK>t#=vlwD7qck^SSu@2Z{`Zk-F#oyy6vd@i1|Y$erSVRLI{w}A#Vwa zg|(KBLR_Mm>R2B={-S0 z`=@Z$LTe2#5xb6lNvlwSQjX`9Rz-`vu3YqMJrY|X$?}{OqA@Mtpe%MgSp{eWzcOZC zw|n?Ajt_x^S+hYVRiW#*;qfmX5%Hf5FQ9Aj`tanHDu+y1E%3}94QLe2GnYs88I-to z)k6x+)oo_@jdzI?7-45YKFK6w|9us0Q^35*O3l`9-JhK54cnB`tacl?{S58uF`2M1 z%RHskul26(JjvJEG6*RLwc|;(hVl}Uu5;;C>*N5`^mG23P3Y0NYw2$t@0WgB( zRF&;h8Dwn)0IK-~f0MS=x;#?oH?Yd;JSq7)ORs2A^lbKZW;-QnXdDu0MhW#e!F2yG{4fpjXyRe#p=6#k}8|GG6n)KEWv%;a+Vt-fCOip=T>At!{rDstHgEC1&L zBrEMvM7+394$*1s?=cyaVFEEDgMY!78{4Crhui@B#X3}Ah{Ypr@5bQ)GJto^{#Sx} z1$gX=LgR1v#HEJiL)?d!YV-k!9mth!1i83ib^pYO>j4ypCOY)Fy_Tz^h_qv60bf}$ zU;0mXkPR1@8ul>`4;iG=MTT^K1qSLW=5vor-ZIOsL6%LoK0%&S5X`k-w;(fUcwH!0 zlpB0MT!{l22=xcCT1|8d2Kz>v8R4*9%j1A?IoCYg<-+$Gq;2rp@>GK=~n|=Az&v?SzjQGH9Y8*JQU2BXw z582(LDu-Gl@O_STw2} z-&I#~hTjVyey9KXqPFQwm1ch!X{I1>0NwN4bMKBR3XdxNG3AXT_ZvZQk7lw|&7x;1 zOZaLs4w5`=5vOVh79F{eYNk&lP5FE08EMlT_R?fwXZ+i~hq34C_X%lQf+M{o3gHC1S_JHlyvt?F&ddn=6tbUH;> z_+bUGYY-991&vobHd*ss2*h}k*YQNm-C41lV6XHLuWyvTOS$Jd;S%N9(cd5PrIVFY6rLMsIo6Jj2Y>- zKi>M{b-YZGH%WZ@r$-Adp-G;n&IHWQ%+PY}l;^U%@ZgeeV?YRj@<5xbjbgz2lKYtW zb4ul%G3&{!v2obXMUGH%VS^PB%oAAHR|h>rsM(yce{DC;%E*e5U>14Z(7VP5k2$kr z*pk!vUFN>Lyl^`@<@ZxyM=Gk{l4<9m#rHHHwbP* z>*il=rPxjn7kw+Eqt&MLCXA5t-`p%l?!H}OaJkf!c1mVj=H0RZ`xRV1{bWlD*sP0w z6xYDJ{m$9u&!B6(&yR1lnCRBU#wLZ;y;)VS5D|NGc*k?WKX%KRRB_Ak`|$z?2a*X=f6f~T19ili2B!myJFsM8Q1Z2v<^WIbAH6N(NU;a-Ngh~bn`Wc@hPz# zuc4%R;njc=--jAjDqAGD5fs0l)ol*sijMWzHYTeCfLL5UmS7Mu z{1)i0zH*vR*YVT|eka5s zs2>?D<59%t+T#Nlbj9+X9i|<(Yv651F*ero?na>cYxVxoXze6CZMBgw1jGN%yhB!`_vsJhKV zatH}J60~jyCn|NB;LV_vg5ERV#-t=Xb~g++=me?Sa=>UXEpc63X=jQ#-BhXd2ggR= zjg!amfVfsbiJZgA^=5xV0?xPDtv+`2Atp=&4z?iHK7m~I|xOg=% zMZKpjHktwXB1uQ;mRzr27O*8$zfH1k+^(RL8xMv5B9hliW6m=TjU4c5jci-0&w&$? zXY(uh9*tIV_V@0Sb{USgsi`OrKl@Wh&!W^6sH>@3`Cf&F`Rf1_Dm|{mVRveN`MU?k z{8M3+7K=YHLD<_a0Mvg@krQ3K^=k%d&}2Ktoz5>t2R$4BZ=fo_nW| zkmuDACO6s=MJf4Vm%AI^8o#59QoeKVp}OV9`J`#jtK6HF8Z14uAi284GOvzLND!#T zaAriaF=mv~AUZuJsnF3>Z_gE5hmz0}_cR#2SOAyWPUIHXx2Xd9YS+FBKSKtaxxUF- zI@DEA^|*!Dh8SV{h6oVuks@fGQ|@jKRr8h9mWUf_sBjUf?uhG*1sC>>vo-)c9wAHN z`!bP<8pi;4PY{h%$S5hklGNz97LuHfV8sF;p=?QzXzo>^88psj{<>w_!ko^FfBBg~OR z`WARs^bL8pgthOwV%5v3|25+;ex6W&xV(M2-401HJ_7(zXFvhe(p|ZPGtPDT$toRL zr&jAOnmA7ZP=Ub)BZoX4|f3Uu29pthBgm z`3zc)?T?^3PMFhIZAuA@8Ic-_%Bm{XQ}*8mx72qb+ftsfvGxCJHdR-s#2i08GQh(g zc|^{eXK>D$;GmQaCiE_m+}{}$iTnRdsriI{Z^!=2*#P#0B2%+c(y8~GypbKb(7eoy zOu0X}5Bh18xHT~NIQM1iOzFiw-R!TCl-q(Vknp1 zMQ>epG82ENnEr9|y%_yr;T&v4U*Ln!cEYcmhhvTN)(Z!9EWGCZ*;wdC>v)U%pp5=Q z3sLl_7me>u8>J)Rs~vUx8Q%4&77eQz=w}yOu-WXHu<4i!^C*dhoDDitCi_K@gB zvysg8H3s&6#puUPZ)vlMgv^w{sT$&FMA&8g-F9k8yY<@@0ULqi_9=$PQ)2{{nN@HuQ&1K9VQzDZuT>=nlD@4$-#dR}Kgmeniyi^r*yA&vt23VDe z;cl{(gV*01Bkj`xh}PPy=&<#=Kk?CN_yU_lEhf1)2etE-e#bnT#GR7~aMZK?>PCK_rxPzAv-dk`%5c?r#Vc1LD%MHl{ zd=Re11k!sZjuyWQ zYklssYX}PAr;V$rC5|%50{^@;)E&w z$EN&`+$ohTY-bk;E?v0(uT7bTItBp{@x&7+9+b ztIOl=3S+RLyW6c>SV>~pC!2B14Oe$LD^{u+`zU+O+lkT2j^L`zTqe7gR^cD^{L zwm)VcvRN;wPWOgRKXjiIn-Q7f2y#?kXSd*$_YW|Ds$5{pbApQP10rSo9{|Gy02Qv_ z6bi|bjlqQPPXvrp3;4AL{{Ln7RReCnRkfJmLz%8z)ji5qvi+rI*;k%sNJ|wIvsp9P zo4Jk#KhkOJwd0Td#`lq+|Kw3TV(1U+^nu8Xijljqyw_y!>-b!uuhn<-1+?HlHf5oI zGBDBXWW%5`jBfy}%^E?JYWAs^Kd;N=LYqoDx$;`^emE~eE6qa~rGYrFT>0SNoQjaufZFbRWMS>`Xt zGd<6{s-g&vLfF}EvplL7*r&3a5niJPu=b+&ONc8}jL?4IwHf2Zy3&r@5Qu&ZFIvY= zyYu(K#iKuYt0hzw>MP+x58Pdijg3JXE(Ey5kxuq6i}AO#d`d-iQ;Twk<5c)1DyP{L z9VLv_tVK3@dwz`^Uq+JDAb$qT7%{8b`Sbh=(lpB=)!wnM+Vu9WKFfV}Z^OuzXS(%>QyUi zV`z#l#fA7{Z6Mwh3SL3@(PQv@9QzEOBT)@mI&sruj+x)X1j}qYfyfi8<;#e~jVx8x z)qX|YP$$h^kmTq%8w|6z;2PPfn1dj@@B#a_Ri;ru!RY8H1OgHK9&|$4_QQuWFe2QY zoyu>zyHi8&7+&Jk1fKndPV-Hnu-1GxQ|PdDm>|>H!MM z$DUQ_tEVF>Y0sZn+SceYczWeyn9=NH41 zMiuTM)HH7+SDHgQBph0xMy8`-Ccn z8J*lo)YoC0F!}gQ&c=eoC=(! z!_nH7)2CFR`zhQT3`(Ou{+E|W{U*l7AmFFvJVCzU4`bR{UCHzD`to9B3jc-2%VY%~ zX^CO-o8c`)Jy~gA`h(D_*Iiw`C(c>bWTE-G9E%Gr_M|lk=6Ez3#!-zCvW-ha@b+2- zg@9aU@s*{ecb#`=X=%sED*ZS|HHN||vEUPF8{EuZn#l^$`3|sesiA^LalA*@YteSg zbQolOFMe!s?|A?Gs^!3}TgAJ*yOK6?$4$M*se!SNB3`Ik8}vL&T&)y~_sM-8QjE?! z_wL;r^Q@GTlv+v3WdZRUcEiK+*tMP^byc>;Ya!NtD@LzD(cav84%Y4Mm1l>DCuvM@+zmBe`-tv010SI1ja%=ldw2Z( zsx0#D1}$D@l82;I$nwafFz05|;q_QrPSy&KJ;CLn*U>A-#PONZ*!w9 zxUPe5b^qoWS^78XNbcnXb3M{Ow zDw1-7yl}#3+Z#5goch!IJ5Mvx%)FhiO*TqLORpAiSP0QPEQXxNtA!0*_HatCj-gvd zhuai-UIUa;FfFj`E&~hAdGnVsb{QEzow-m)5z+d76cFi67T5FsL4-mheMDBW!zY?I z=v~fNYeXk6PG(5(uhf-`F4s9&yr1$OHiX8H#MuQV^PXW#n_1k{s8B5{6xQgyXO8n8 zu0Fs?);UV;CScR~-p!To(McO|CR8a?U^B_J5wW&WHGfk_Ddu~<+=8eQp5m}{Ih_r? zY)kAZP+{C6pwiM!D>i1^)g+kE>R|TRT?;=xX*FO%LHUgbP7-Yp4BLtJka*I0XR0DR zl$O>{H1+cG5@gj>?p$mLc560yHB@|KN63jcZX)=NTU<=tRx6-AJ6ksHzw_>R*~M7a z*X4**+Gv%&u9ONUw-Bd5_hxs!7|IHwF4DC1`_cGg{BjGw+c(TE7@@pbnnzGOZNRSH zuiPIM$xFq3Q)D45w1pN!jE5ZhdMI&3g-wFT6lrYO!25C)FxKd&JXa%S9YJJt5#!7r zieSL%3fy!|S+Xlp#D|k z7;l-`b^Hu~`EQ5VW$yq^Hy|=zDu4{)75E2q-E?l_lQ+z=5o72q(kp#lb#yW zZSHpAi!Rg?iHAqxom=aAwxgvc^Zr`u4fHCP!x{~zN|ilpYfYO|?@1%}$6}|=`L9I3 zdf?md7n}*@$ZryuHl^1l;%zyEIvC;<;-jEsB!gQYo!Z_cy|R*v7;nnkx~RN-q?Uh| zkO!;gJluk&Erf`_@3mpLse;gzK!?9Tr#@x@{jkE#pAZx_iO%BBAYgA6Iz# zuFJxi*2Q)7d`6P}Qjddr<4S4I7Rlym_nuX(fYsXmHmP)QdtIB2^|`WWMmbJ2UHVd& z1%Y&mnzwCn8I-+ESkJ@cFkomQavC3Q#8mc^ zf$@fb@y-UofT$QmGnZ~O9*j=%CpBlGGhjL<88O}nkYQ=6GVYQtJCqFZ^1O2LWEo-+ zOy);HdBp%kYb{P#cUM>G>D95mvKUebV}&t=T%OvslsVWRNsNlq$RRig4!Qo9Ujqw8i%TFu_o#)^s-%4nnY%(aV9=LpNPJy&% z+P~sA%PpdbO!BWc>mF~CCj!q9y}F$WhO1xHzjvl%X!+c)JR%bzlLnO*6Q5I>Uzt0L zr$)ZX&I9X@hOvXrS*=@G-e5r)oRJ8GD7K7(I6jH%w@2Wa9Ij_>Uo9u|Maoe&W_X%l142dh)g-1&*TOiH`t^o zC_g{auqpgX5^wyvN8$WlA*Ffi#8rSiYglVgOiV^vgkgH}q9Zpc2-eFKR@=Wx5&@^U z2YxI?A&iqTR=vNLPY0_ehxTxTpn10W_cC%hQiQ`f>rS94K<_)Hvd?y0-(9nswz_Ji z0&N3m(s8pTb<%&om&!1M8|YDL6aP9Q|(4B_QmNLv#QV^drF2AaAZtE+9mk8IY-P_V+DkXB%WfOL0DH%Noh9ZGkHba#VvNq26#LmIwk>pACr z|M&auxc8269mById$0Axd}jRSZ_c#?q$NdAk)9zvc<=yK^u3Vmg9neQ9z1wxhWHSC zA}p56^5DVe2ckmnRb*qDQbd@F_j=nlits1 za-XLP^>B(0a&9E*Xm@+H2lt0#>OW-4gnKn~x+cA-=H{E8EomkwQ<@k znZ#u;$##~IUdQ#Ef;J380FlfaBOUX34(zW0VqULw#FO7w)bKcQzrPLF{r~f$NY#k) zvJ=}AB=8Rz83(@owUyZtVym@h287SM_YpcjyjQC>6TXG8lXs?FU}B8Y1J*AonVE)K zp;BQX;vu!MAN=8n@Za!Qg|Fe^uEa*5XO=}I1g)y~Fj9SxTwN9c+X#P(A@I=rb4we! zeq~82c3@)hcIirYf9J2FR|e0$B4s8CP#~>ezO+9=c!GvQ#Pr5ytv#<|4VteMI?6iM zejujnOTminflV$56NxU8JY3rY^UpkQ$(Ej$Y1g!AKzyC`#6|O_r-VOAHqAW|(6`E6 z`rN7`H^V=Va(GAqr1(CL+AF*!t6ODy8%N(7PO5QIV1|jTs0EJV&W^U-{Ov;$cbKfH zDYI~%R%3HgRzLXKhU}PW=FdN0W;4e{Zs2%<3C<<+CQ|JEob1}oOkoV6Hfe_&$4Cv_TDkJ#__4+seG_eXrPtgYy* z9nL(4Z-r9NgIBaf6vf%gzT}OeC}TWO$c;MUa+qf2U(-XQ!;JY-U!_zT7=Dq=X+ugs+dn22a!;+S-NPebUDH zy@hJ;GnRlW9t}$=Ub6gJe`1?cLMW=LUD-#q_);8v(%`2*kSJcEXFMpf+MO!>Mk)2P zuHh;ECltQy7J->JA~^W_C~wF*a?;4LT$V*4$;9}mC;1b-M&3g3U=?ltJ?&Kfp`pIa z_`IIW(=FKAI;%4B@k3*VB;3FD9)=2XlRN*0QOiprE4*o_y6v68rFj z_m+8CVn#1w5FDlV1(&?OE+bENx9vl{cq#uVNVxK6%=VfdF9IwqEJ8xlF$7 zmWZ6_)KS44lfM_n4AI2Jm#Iz=ta_^pCycWC3jL#ykaznsQ{AI>!Y=_Wc2=Q0xJB@Z z7%P7cDwf=G7Dv|0K_&8OF#Zn-lK${;j63uuiT{0QnU9b`2a*9t`)^B2+A47KYnM9P zlap(%3J+F4a>WW;TQLG7M>MHP#gR$i+V%2ipi;Zftf(PC z3r-uGBN>dE4gMe0)#rAn%TrvBML#I!NG7qHO|__u`u%6XD%mxY!bm(1c})^~ukt4} za_8SQZYRA7o#bup9c-*JouBgBw8rB3TTvQgeK2ovyJZo|!zN(!LnZv!uV|y4;c-2? zh$3nyxbvaW`K-!(_G7N}mr{ei=q^$ZqBaxtC9Ymh5qh<%0>wgAY3XpXl&Gk)Wj|8g zuC5Tm4U>tEvvoC#TIg0z3K}{(2SXEy!4x&7CMUcY%ILqU)LYd3SnSkCzo9OGJMgB> zYPA;Q2+DINtj{T}Vv(kZV6PTeYvSWq_bdj!rbK5nQ$pIj#f&M4YfpHyc{fXG?P>F0 ziqp>W&F;6%dOz^LPHh%eFVxxZDAIq6iBSR~nYE}dl;zIo^the$a69gyT+zYK=8eqY zvGqPG)~NqQXxTuvAt)&5aInCu_am50&{ta-NKrdCLp>!UI5=2I%k3;LCz%B-{wj$^ zA#xkPgoI%yD+}q*4#JUC*!5vvX-X`@(j==NRYvNI-ym&qs7x{L{h~ITR$-LvqLV#= zD4js+jKoK!2>!S{1`W)#rm9#=^=C_Mz7pTqTgTw%#uzaX&`G>EU5`5PN*E*}WQ5@j z=-7&^c*U|r3=l_uMVJkzw$c_iq#HytYTbFkwE5*<%32(X>%m{M!vWj$t61OYr zJ7AY*qt}$Bg{JT5EH=5BP81lcyYkM>VRDL9rrR6*XW=j_Hp}XU;}Va4Ii(x%qm9Wv z=Z^h-Vb!*_%<-2&v85+3DRSNyx=J3}Q{O@;S0vVzXw zS`-@QHkRox(KQw{QOQlsIoO5HGbeFbTx0@g=`mWmh6B}L(l&Wyu^odr;Cn=~Z_=3` zZM{Lmg7gRh?dGr@olFNn0nhQ`?So$DSP-W8%%sIZC2 zw(St_`5^a!f2Ixw3is30SvRMeSCWa22aV^ty%oRefo|o>P@veX{s>_fB4-rPnl8Z! z`hpV$Z5BjHs6zaYE$n7@!%5<3I=|(`1w=W)BfSlH6OSTYPE2EHK-3gpcrfWQf?wERG;;obajtqBP5kn zQi)HR?ZaM90_TXm&nd#R?7mBO2wKX`lHzrIxeE3qE;&;yw1-@OZB?A?6-+{ zohvZ>uFoWl+%Pb4aeddmz7#**BkaYMN#+FpyG>ECNZnX{N%Jpt^cy$NMqE)RAnB~V zCUq>$pk}H-)n>l#($Z4hZKVR`GwN^xB?(HZtr-v6xZP?#(5eDtS8U6Q3;(SDea=hFr?yV&+?CB;I?PQdnVQF z;6G6=)om$Ss#Wyn58l&|mTM3|Z)R{7>T1*3ve}oi-M0kG^)X*wmCC9MU!QJydDak3 z`9h=14($%IZUlzW$hYhLdZ~F{!`Bvb_ypZrlSPBb*L6Tpp9h*R*AvkB zE}nmF_sd5JZ&Lc>*#5fiP=rUdx$6?y5zoEqIzC#PaQ#&qQ%MTFGN z?qH!&)xasdGMv^_&Duk|vMh})h>6%rz`s}!^6FPxa$p0r#%A2f?@>)g;nhu`TC+mm zd))|iEv6~z2`zf*KJ&31#ooh06HZ<=`ivws)qH;I0IR66&jbhZjLtM0PsggC3?he~ zJ1{7Uc>luvPVA)cBt(WZ57WMK^9$jAfl){vYE7P&FXLL8G_YFyCz@xXN?J3cbDi== zC^+zFME;%^mbcU8h8eEFkdSc1rKCh`CJI!F6es+D2RVvw&` z*iA5WIWx45j=D%K$8tx&lZ6SDp~wB0DZa1Ewna{oQ#p@DP*a z#*KYfW$LVKY?Y88T#k9WZ=22eIN}9nyd@lquD17gw>TT-OsWgR@sL=wKX^uo9Ih@r z=BeCnUbleH{g@O%y`ZR_>iYCw<8BU#b!meveo1&E9k)$Vc^g{L+>;SYflt8gySm<9 zOBQ`~PL^g&pizMv7qT64bx+U z>;qT+nE_xK;@VJ$5eKQi?x3Cg#UR{{w|e=}(ez1R%9-VMulNR56zt@*zt1|aOXnsP z!nbI_@Mr8XeyCBX5TQnKzj!-#u*O*yHSnE3_X|?CXvm4^_W9mm2kn7`!s3KcjtRrU z$Bn!M46VN+C+nKa>l8J=9Baq?BVQ1gxTW4z5mkP4ky$seSA0%2sn0vjim;YxX*iOi{*59;+q8#;~&Ys!eqFfF)h}aqf^Az$t@sdaMC^#uQr>0$ku$& zbX_7-==rbZ>QO)j`}(^0gW&3F&L-4WSFzUO4W84|y6jAt@6A@%>abIiBAw5P84c&|VXm zI`es28`lB;q-0o&elAZ=_pkTI@>%ITwwav(kwQJfo3Hn|l{mEJp?@3+Sk6M(OX>Te zQh%UjeQbSiL!Pl!utT%#jQ7UbX%>z06;4uD`xbN)t5 z?9AtctCyz^o5N`<(>mE?MJF;5eOS;q3b(bjHM5xtES~DA^ zLmZ2^VHar~il2q5^hgr%$bL7yoAqPvVj6C#+4M1pjK-GNXFHa;1@uT%MakJtZa*