aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Ashby <martin@ashbysoft.com>2023-09-09 23:10:49 +0100
committerMartin Ashby <martin@ashbysoft.com>2023-09-09 23:10:49 +0100
commit3157633c35da97dbc60bfed1b12c4a93bcc543a2 (patch)
tree1fc7214cf6bc06ccb5fe0b78209d7d9cffa25b73
downloadmcl-3157633c35da97dbc60bfed1b12c4a93bcc543a2.tar.gz
mcl-3157633c35da97dbc60bfed1b12c4a93bcc543a2.tar.bz2
mcl-3157633c35da97dbc60bfed1b12c4a93bcc543a2.tar.xz
mcl-3157633c35da97dbc60bfed1b12c4a93bcc543a2.zip
Initial
-rw-r--r--.gitignore2
-rw-r--r--build.zig70
-rw-r--r--src/foo.json6
-rw-r--r--src/main.zig251
-rw-r--r--src/version_test.json1539
5 files changed, 1868 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ee7098f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+zig-out/
+zig-cache/
diff --git a/build.zig b/build.zig
new file mode 100644
index 0000000..21341cb
--- /dev/null
+++ b/build.zig
@@ -0,0 +1,70 @@
+const std = @import("std");
+
+// Although this function looks imperative, note that its job is to
+// declaratively construct a build graph that will be executed by an external
+// runner.
+pub fn build(b: *std.Build) void {
+ // Standard target options allows the person running `zig build` to choose
+ // what target to build for. Here we do not override the defaults, which
+ // means any target is allowed, and the default is native. Other options
+ // for restricting supported target set are available.
+ const target = b.standardTargetOptions(.{});
+
+ // Standard optimization options allow the person running `zig build` to select
+ // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
+ // set a preferred release mode, allowing the user to decide how to optimize.
+ const optimize = b.standardOptimizeOption(.{});
+
+ const exe = b.addExecutable(.{
+ .name = "mcl",
+ // In this case the main source file is merely a path, however, in more
+ // complicated build scripts, this could be a generated file.
+ .root_source_file = .{ .path = "src/main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+
+ // This declares intent for the executable to be installed into the
+ // standard location when the user invokes the "install" step (the default
+ // step when running `zig build`).
+ b.installArtifact(exe);
+
+ // This *creates* a Run step in the build graph, to be executed when another
+ // step is evaluated that depends on it. The next line below will establish
+ // such a dependency.
+ const run_cmd = b.addRunArtifact(exe);
+
+ // By making the run step depend on the install step, it will be run from the
+ // installation directory rather than directly from within the cache directory.
+ // This is not necessary, however, if the application depends on other installed
+ // files, this ensures they will be present and in the expected location.
+ run_cmd.step.dependOn(b.getInstallStep());
+
+ // This allows the user to pass arguments to the application in the build
+ // command itself, like this: `zig build run -- arg1 arg2 etc`
+ if (b.args) |args| {
+ run_cmd.addArgs(args);
+ }
+
+ // This creates a build step. It will be visible in the `zig build --help` menu,
+ // and can be selected like this: `zig build run`
+ // This will evaluate the `run` step rather than the default, which is "install".
+ const run_step = b.step("run", "Run the app");
+ run_step.dependOn(&run_cmd.step);
+
+ // Creates a step for unit testing. This only builds the test executable
+ // but does not run it.
+ const unit_tests = b.addTest(.{
+ .root_source_file = .{ .path = "src/main.zig" },
+ .target = target,
+ .optimize = optimize,
+ });
+
+ const run_unit_tests = b.addRunArtifact(unit_tests);
+
+ // Similar to creating the run step earlier, this exposes a `test` step to
+ // the `zig build --help` menu, providing a way for the user to request
+ // running the unit tests.
+ const test_step = b.step("test", "Run unit tests");
+ test_step.dependOn(&run_unit_tests.step);
+}
diff --git a/src/foo.json b/src/foo.json
new file mode 100644
index 0000000..4e2392f
--- /dev/null
+++ b/src/foo.json
@@ -0,0 +1,6 @@
+{
+ "y": [
+ { "z": "yay" },
+ "nay"
+ ]
+} \ No newline at end of file
diff --git a/src/main.zig b/src/main.zig
new file mode 100644
index 0000000..8ca780b
--- /dev/null
+++ b/src/main.zig
@@ -0,0 +1,251 @@
+const std = @import("std");
+
+const Manifest = struct {
+ const uri = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
+
+ latest: struct {
+ release: []const u8,
+ snapshot: []const u8,
+ },
+ versions: []struct {
+ id: []const u8,
+ type: []const u8,
+ url: []const u8,
+ releaseTime: []const u8,
+ sha1: []const u8,
+ complianceLevel: i64,
+ },
+};
+
+const Version = struct {
+ const Rule = struct {
+ const Feature = struct {
+ is_demo_user: bool = false,
+ has_custom_resolution: bool = false,
+ is_quick_play_multiplayer: bool = false,
+ is_quick_play_realms: bool = false,
+ };
+ const Os = struct {
+ name: ?[]const u8 = null,
+ arch: ?[]const u8 = null,
+ };
+ action: enum{allow},
+ features: ?Feature = null,
+ os: ?Os = null,
+ };
+
+ const Arg = union(enum) {
+ const Extended = struct {
+ const Value = union(enum) {
+ single: []const u8,
+ many: []const []const u8,
+ pub fn jsonParse(allocator: std.mem.Allocator, source: anytype, options: std.json.ParseOptions) !Value {
+ switch (try source.peekNextTokenType()) {
+ .array_begin => {
+ return .{ .many = try std.json.innerParse([]const []const u8, allocator, source, options) };
+ },
+ .string => {
+ return .{ .single = try std.json.innerParse([]const u8, allocator, source, options) };
+ },
+ else => return error.UnexpectedToken,
+ }
+ }
+ };
+
+ rules: []Rule,
+ value: Value,
+ };
+
+ plain: []const u8,
+ extended: Extended,
+
+ pub fn jsonParse(allocator: std.mem.Allocator, source: anytype, options: std.json.ParseOptions) !Arg {
+ switch (try source.peekNextTokenType()) {
+ .object_begin => {
+ return .{
+ .extended = try std.json.innerParse(Extended, allocator, source, options),
+ };
+ },
+ .string => {
+ return .{
+ .plain = try std.json.innerParse([]const u8, allocator, source, options),
+ };
+ },
+ else => return error.UnexpectedToken,
+ }
+ }
+ };
+
+ arguments: struct {
+ game: []Arg,
+ jvm: []Arg,
+ },
+};
+
+/// Minecraft launcher!
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{ .safety = false }){}; // TODO turn safety back on
+ defer _ = gpa.deinit();
+ const a = gpa.allocator();
+ var client = std.http.Client{ .allocator = a };
+ defer client.deinit();
+
+ const m_wrap = try download_json(&client, Manifest, Manifest.uri);
+ defer m_wrap.deinit();
+ const m = m_wrap.value;
+ std.log.info("release: {s} snapshot: {s}", .{ m.latest.release, m.latest.snapshot });
+
+ // Find the release version
+ const rvu = for (m.versions) |v| {
+ if (std.mem.eql(u8, v.id, m.latest.release)) {
+ break v.url;
+ }
+ } else {
+ return error.NoReleaseVersionFound;
+ };
+ std.log.info("found release version url {s}", .{rvu});
+ var rv_wrap = try download_json(&client, Version, rvu);
+ defer rv_wrap.deinit();
+ const rv = rv_wrap.value;
+ for (rv.arguments.game) |ga| {
+ std.log.info("game arg: {}", .{ga});
+ }
+ // Download the manifest for that
+
+ // std.mem.replace(comptime T: type, input: []const T, needle: []const T, replacement: []const T, output: []T)
+
+ // check the latest.release
+ // find that in the versions[] by key id
+ // get the download URL for that https://piston-meta.mojang.com/v1/packages/1f376e6cb981265af345076889f9ef325bb6b9e8/1.20.1.json
+
+ // get arguments.game and arguments.jvm ready to supply ...
+ // probably just use the system java version for now
+ //
+}
+
+/// Caller is responsible for calling deinit on the resulting Parsed struct.
+fn download_json(client: *std.http.Client, comptime T: type, url_maybe_https: []const u8) !std.json.Parsed(T) {
+ // TODO use https once zig supports TLSv1.2 or mojang support TLSv1.3
+ const a = client.allocator;
+ const sz = std.mem.replacementSize(u8, url_maybe_https, "https://", "http://");
+ const url = try a.alloc(u8, sz);
+ defer a.free(url);
+ _ = std.mem.replace(u8, url_maybe_https, "https://", "http://", url);
+
+ var h = std.http.Headers.init(a);
+ defer h.deinit();
+ try h.append("Accept", "application/json");
+ const uri = try std.Uri.parse(url);
+ var r = try client.request(.GET, uri, h, .{});
+ try r.start();
+ try r.wait();
+ if (r.response.status != .ok) {
+ std.log.err("request failed {}:{s}", .{ r.response.status, r.response.reason });
+ return error.HttpStatusError;
+ }
+ var r2 = std.json.reader(a, r.reader());
+ var diags = std.json.Diagnostics{};
+ r2.enableDiagnostics(&diags);
+ defer r2.deinit();
+ var res = std.json.parseFromTokenSource(T, a, &r2, .{ .ignore_unknown_fields = true, .allocate = .alloc_always }) catch |e| {
+ std.log.err("parse failed {} line {} col {}", .{ e, diags.getLine(), diags.getColumn() });
+ return e;
+ };
+ return res;
+}
+
+test "heterogenous array" {
+ const x =
+ \\ {
+ \\ "y": [
+ \\ { "z": "yay" },
+ \\ "nay"
+ \\ ]
+ \\ }
+ ;
+ const IX = union(enum) {
+ // What to name union tags?
+ const P = struct { z: []const u8 };
+ p: P,
+ q: []const u8,
+ pub fn jsonParse(allocator: std.mem.Allocator, source: anytype, options: std.json.ParseOptions) !@This() {
+ switch (try source.peekNextTokenType()) {
+ .object_begin => {
+ return .{
+ .p = try std.json.innerParse(P, allocator, source, options),
+ };
+ },
+ .string => {
+ return .{
+ .q = try std.json.innerParse([]const u8, allocator, source, options),
+ };
+ },
+ else => return error.UnexpectedToken,
+ }
+ }
+ };
+ const X = struct { y: []const IX };
+ const xx = try std.json.parseFromSlice(X, std.testing.allocator, x, .{});
+ defer xx.deinit();
+ try std.testing.expectEqualDeep(X{
+ .y = &[_]IX{
+ .{ .p = .{ .z = "yay" } },
+ .{ .q = "nay" },
+ },
+ }, xx.value);
+}
+
+test "string list" {
+ const x =
+ \\["ond", "two", "three", "four"]
+ ;
+ const v_w = try std.json.parseFromSlice([]const []const u8, std.testing.allocator, x, .{});
+ defer v_w.deinit();
+ const expect: []const []const u8 = &[_][]const u8{ "ond", "two", "three", "four" };
+ try std.testing.expectEqualDeep(expect, v_w.value);
+}
+
+test "string or string list" {
+ const x1 =
+ \\ "testing"
+ ;
+ const x2 =
+ \\ ["one", "two"]
+ ;
+ const X = union(enum) {
+ one: []const u8,
+ many: []const []const u8,
+ pub fn jsonParse(allocator: std.mem.Allocator, source: anytype, options: std.json.ParseOptions) !@This() {
+ switch (try source.peekNextTokenType()) {
+ .array_begin => {
+ return .{ .many = try std.json.innerParse([]const []const u8, allocator, source, options) };
+ },
+ .string => {
+ return .{ .one = try std.json.innerParse([]const u8, allocator, source, options) };
+ },
+ else => return error.UnexpectedToken,
+ }
+ }
+ };
+ var ax1_w = try std.json.parseFromSlice(X, std.testing.allocator, x1, .{});
+ defer ax1_w.deinit();
+ var ax2_w = try std.json.parseFromSlice(X, std.testing.allocator, x2, .{});
+ defer ax2_w.deinit();
+}
+
+test "Version" {
+ const x = @embedFile("version_test.json");
+ var f = std.io.fixedBufferStream(x);
+ var jr = std.json.reader(std.testing.allocator, f.reader());
+ defer jr.deinit();
+ var d = std.json.Diagnostics{};
+ jr.enableDiagnostics(&d);
+ var v_w = std.json.parseFromTokenSource(Version, std.testing.allocator, &jr, .{.ignore_unknown_fields = true}) catch |e| {
+ std.log.err("parse failed {} line {} col {}", .{ e, d.getLine(), d.getColumn() });
+ return e;
+ };
+ defer v_w.deinit();
+ const v = v_w.value;
+ _ = v;
+ // v.arguments.game
+}
diff --git a/src/version_test.json b/src/version_test.json
new file mode 100644
index 0000000..a611093
--- /dev/null
+++ b/src/version_test.json
@@ -0,0 +1,1539 @@
+{
+ "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": "9767c3c7faa655f0cc4798d30736e1df8d6a710f",
+ "size": 411581,
+ "totalSize": 618900704,
+ "url": "https://piston-meta.mojang.com/v1/packages/9767c3c7faa655f0cc4798d30736e1df8d6a710f/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