grim-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/dist/artifacts/cache.d.ts +6 -0
  4. package/dist/artifacts/cache.d.ts.map +1 -0
  5. package/dist/artifacts/cache.js +73 -0
  6. package/dist/artifacts/cache.js.map +1 -0
  7. package/dist/artifacts/grim.d.ts +3 -0
  8. package/dist/artifacts/grim.d.ts.map +1 -0
  9. package/dist/artifacts/grim.js +94 -0
  10. package/dist/artifacts/grim.js.map +1 -0
  11. package/dist/artifacts/http.d.ts +8 -0
  12. package/dist/artifacts/http.d.ts.map +1 -0
  13. package/dist/artifacts/http.js +51 -0
  14. package/dist/artifacts/http.js.map +1 -0
  15. package/dist/artifacts/index.d.ts +5 -0
  16. package/dist/artifacts/index.d.ts.map +1 -0
  17. package/dist/artifacts/index.js +4 -0
  18. package/dist/artifacts/index.js.map +1 -0
  19. package/dist/artifacts/paper.d.ts +4 -0
  20. package/dist/artifacts/paper.d.ts.map +1 -0
  21. package/dist/artifacts/paper.js +56 -0
  22. package/dist/artifacts/paper.js.map +1 -0
  23. package/dist/artifacts/types.d.ts +21 -0
  24. package/dist/artifacts/types.d.ts.map +1 -0
  25. package/dist/artifacts/types.js +2 -0
  26. package/dist/artifacts/types.js.map +1 -0
  27. package/dist/artifacts.d.ts +2 -0
  28. package/dist/artifacts.d.ts.map +1 -0
  29. package/dist/artifacts.js +2 -0
  30. package/dist/artifacts.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +57 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/config.d.ts +31 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +174 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +4 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/server/artifacts.d.ts +9 -0
  44. package/dist/server/artifacts.d.ts.map +1 -0
  45. package/dist/server/artifacts.js +65 -0
  46. package/dist/server/artifacts.js.map +1 -0
  47. package/dist/server/index.d.ts +7 -0
  48. package/dist/server/index.d.ts.map +1 -0
  49. package/dist/server/index.js +17 -0
  50. package/dist/server/index.js.map +1 -0
  51. package/dist/server/java.d.ts +2 -0
  52. package/dist/server/java.d.ts.map +1 -0
  53. package/dist/server/java.js +72 -0
  54. package/dist/server/java.js.map +1 -0
  55. package/dist/server/launch.d.ts +4 -0
  56. package/dist/server/launch.d.ts.map +1 -0
  57. package/dist/server/launch.js +35 -0
  58. package/dist/server/launch.js.map +1 -0
  59. package/dist/server/process.d.ts +4 -0
  60. package/dist/server/process.d.ts.map +1 -0
  61. package/dist/server/process.js +48 -0
  62. package/dist/server/process.js.map +1 -0
  63. package/dist/server/properties.d.ts +3 -0
  64. package/dist/server/properties.d.ts.map +1 -0
  65. package/dist/server/properties.js +45 -0
  66. package/dist/server/properties.js.map +1 -0
  67. package/dist/server/types.d.ts +18 -0
  68. package/dist/server/types.d.ts.map +1 -0
  69. package/dist/server/types.js +2 -0
  70. package/dist/server/types.js.map +1 -0
  71. package/package.json +59 -0
  72. package/vendor/grim.json +10 -0
  73. package/vendor/grimac-bukkit-2.3.73.jar +0 -0
package/dist/cli.js ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ import { writeDefaultConfig, loadConfig, configFileName } from './config.js';
3
+ import { listPaperVersions, resolveGrim, resolvePaper } from './artifacts/index.js';
4
+ import { startServer } from './server/index.js';
5
+ const [, , command, argument] = process.argv;
6
+ async function main() {
7
+ switch (command) {
8
+ case 'init':
9
+ console.log(`Created ${await writeDefaultConfig()}`);
10
+ return;
11
+ case 'versions': {
12
+ console.log((await listPaperVersions()).join('\n'));
13
+ return;
14
+ }
15
+ case 'verify': {
16
+ const config = await loadConfig();
17
+ const version = argument ?? config.version;
18
+ const [paper, grim] = await Promise.all([
19
+ resolvePaper(version, { cacheDir: config.cacheDir }),
20
+ resolveGrim(version, { cacheDir: config.cacheDir }),
21
+ ]);
22
+ console.log(JSON.stringify({ paper, grim }, null, 2));
23
+ return;
24
+ }
25
+ case 'start': {
26
+ const config = await loadConfig();
27
+ const server = await startServer(argument ? { ...config, version: argument } : config);
28
+ const stopServer = (signal) => {
29
+ if (server.exitCode === null && !server.killed)
30
+ server.kill(signal);
31
+ };
32
+ if (server.stdout)
33
+ server.stdout.pipe(process.stdout);
34
+ if (server.stderr)
35
+ server.stderr.pipe(process.stderr);
36
+ process.once('SIGINT', () => stopServer('SIGINT'));
37
+ process.once('SIGTERM', () => stopServer('SIGTERM'));
38
+ if (process.platform === 'win32') {
39
+ process.once('SIGBREAK', () => stopServer('SIGBREAK'));
40
+ }
41
+ await new Promise((resolve) => {
42
+ server.once('close', (code) => {
43
+ process.exitCode = code ?? 1;
44
+ resolve();
45
+ });
46
+ });
47
+ return;
48
+ }
49
+ default:
50
+ throw new Error(`Usage: grim-server init | grim-server start [minecraft-version] | grim-server versions | grim-server verify [minecraft-version] (config: ${configFileName})`);
51
+ }
52
+ }
53
+ main().catch((error) => {
54
+ console.error(error instanceof Error ? error.message : String(error));
55
+ process.exitCode = 1;
56
+ });
57
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAE7C,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACtC,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpD,WAAW,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;aACpD,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACvF,MAAM,UAAU,GAAG,CAAC,MAAsB,EAAQ,EAAE;gBAClD,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtE,CAAC,CAAC;YACF,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;oBAC7B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CACb,4IAA4I,cAAc,GAAG,CAC9J,CAAC;IACN,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type MemoryConfig = {
2
+ min: string;
3
+ max: string;
4
+ };
5
+ export type MinecraftProperties = Record<string, string | number | boolean>;
6
+ export type GrimServerConfig = {
7
+ version: string;
8
+ serverDir: string;
9
+ cacheDir: string;
10
+ port: number;
11
+ motd: string;
12
+ onlineMode: boolean;
13
+ allowFlight: boolean;
14
+ memory: MemoryConfig;
15
+ serverProperties: MinecraftProperties;
16
+ javaArgs: string[];
17
+ environment: Record<string, string>;
18
+ captureOutput: boolean;
19
+ java?: string;
20
+ paperJar?: string;
21
+ grimJar?: string;
22
+ };
23
+ export declare const configFileName = "grim-server.config.json";
24
+ export declare const defaultConfig: Omit<GrimServerConfig, 'serverDir' | 'cacheDir'> & {
25
+ serverDir: string;
26
+ cacheDir: string;
27
+ };
28
+ export declare function loadConfig(cwd?: string, file?: string): Promise<GrimServerConfig>;
29
+ export declare function writeDefaultConfig(cwd?: string, file?: string): Promise<string>;
30
+ export declare function normalizeConfig(value: unknown, cwd?: string): GrimServerConfig;
31
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAE5E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAiBlB,CAAC;AAEF,wBAAsB,UAAU,CAC9B,GAAG,SAAgB,EACnB,IAAI,SAAiB,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAkB3B;AAED,wBAAsB,kBAAkB,CACtC,GAAG,SAAgB,EACnB,IAAI,SAAiB,GACpB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAgB,GAAG,gBAAgB,CA0CrF"}
package/dist/config.js ADDED
@@ -0,0 +1,174 @@
1
+ import { access, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export const configFileName = 'grim-server.config.json';
4
+ export const defaultConfig = {
5
+ version: '1.21.11',
6
+ serverDir: '.grim-server',
7
+ cacheDir: '.grim-cache',
8
+ port: 25565,
9
+ motd: 'Grim Minecraft Server',
10
+ onlineMode: false,
11
+ allowFlight: true,
12
+ memory: {
13
+ min: '1G',
14
+ max: '2G',
15
+ },
16
+ serverProperties: {},
17
+ javaArgs: [],
18
+ environment: {},
19
+ captureOutput: true,
20
+ };
21
+ export async function loadConfig(cwd = process.cwd(), file = configFileName) {
22
+ const filePath = path.resolve(cwd, file);
23
+ try {
24
+ const text = await import('node:fs/promises').then(({ readFile }) => readFile(filePath, 'utf8'));
25
+ return normalizeConfig(JSON.parse(text), cwd);
26
+ }
27
+ catch (error) {
28
+ if (error.code === 'ENOENT') {
29
+ return normalizeConfig({}, cwd);
30
+ }
31
+ if (error instanceof SyntaxError) {
32
+ throw new Error(`Unable to parse ${file}: ${error.message}`);
33
+ }
34
+ throw new Error(`Unable to read ${file}: ${error instanceof Error ? error.message : String(error)}`);
35
+ }
36
+ }
37
+ export async function writeDefaultConfig(cwd = process.cwd(), file = configFileName) {
38
+ const filePath = path.resolve(cwd, file);
39
+ try {
40
+ await access(filePath);
41
+ throw new Error(`${file} already exists`);
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error && error.message.endsWith('already exists'))
45
+ throw error;
46
+ }
47
+ await writeFile(filePath, `${JSON.stringify(defaultConfig, null, 2)}\n`, 'utf8');
48
+ return filePath;
49
+ }
50
+ export function normalizeConfig(value, cwd = process.cwd()) {
51
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
52
+ throw new Error('Server config must be a JSON object');
53
+ }
54
+ const input = value;
55
+ const memory = input.memory && typeof input.memory === 'object' && !Array.isArray(input.memory)
56
+ ? input.memory
57
+ : {};
58
+ const config = {
59
+ version: stringValue(input.version, defaultConfig.version),
60
+ serverDir: resolveConfiguredPath(cwd, stringValue(input.serverDir, defaultConfig.serverDir)),
61
+ cacheDir: resolveConfiguredPath(cwd, stringValue(input.cacheDir, defaultConfig.cacheDir)),
62
+ port: numberValue(input.port, defaultConfig.port),
63
+ motd: stringValue(input.motd, defaultConfig.motd),
64
+ onlineMode: booleanValue(input.onlineMode, defaultConfig.onlineMode),
65
+ allowFlight: booleanValue(input.allowFlight, defaultConfig.allowFlight),
66
+ memory: {
67
+ min: stringValue(memory.min, defaultConfig.memory.min),
68
+ max: stringValue(memory.max, defaultConfig.memory.max),
69
+ },
70
+ serverProperties: propertiesValue(input.serverProperties),
71
+ javaArgs: stringArrayValue(input.javaArgs, 'javaArgs'),
72
+ environment: environmentValue(input.environment),
73
+ captureOutput: booleanValue(input.captureOutput, defaultConfig.captureOutput),
74
+ };
75
+ for (const key of ['java', 'paperJar', 'grimJar']) {
76
+ const entry = input[key];
77
+ if (entry !== undefined) {
78
+ if (typeof entry !== 'string' || entry.length === 0) {
79
+ throw new Error(`${key} must be a non-empty string`);
80
+ }
81
+ const value = key === 'java' && !looksLikePath(entry) ? entry : resolveConfiguredPath(cwd, entry);
82
+ config[key] = value;
83
+ }
84
+ }
85
+ if (!/^[\w.-]+$/.test(config.version))
86
+ throw new Error('version contains unsupported characters');
87
+ if (!Number.isInteger(config.port) || config.port < 1 || config.port > 65535) {
88
+ throw new Error('port must be an integer between 1 and 65535');
89
+ }
90
+ return config;
91
+ }
92
+ function resolveConfiguredPath(cwd, value) {
93
+ const pathImpl = shouldUseWin32(cwd, value) ? path.win32 : path.posix;
94
+ return pathImpl.isAbsolute(value) ? pathImpl.resolve(value) : pathImpl.resolve(cwd, value);
95
+ }
96
+ function shouldUseWin32(cwd, value) {
97
+ return process.platform === 'win32' || looksLikeWindowsPath(cwd) || looksLikeWindowsPath(value);
98
+ }
99
+ function looksLikeWindowsPath(value) {
100
+ return /^[a-zA-Z]:[\\/]/.test(value) || value.startsWith('\\\\') || value.startsWith('//');
101
+ }
102
+ function looksLikePath(value) {
103
+ return (looksLikeWindowsPath(value) ||
104
+ value.startsWith('/') ||
105
+ value.startsWith('\\') ||
106
+ value.startsWith('./') ||
107
+ value.startsWith('../') ||
108
+ value.includes('/') ||
109
+ value.includes('\\'));
110
+ }
111
+ function stringValue(value, fallback) {
112
+ if (value === undefined)
113
+ return fallback;
114
+ if (typeof value !== 'string' || value.length === 0) {
115
+ throw new Error('config string values must be non-empty strings');
116
+ }
117
+ return value;
118
+ }
119
+ function numberValue(value, fallback) {
120
+ if (value === undefined)
121
+ return fallback;
122
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
123
+ throw new Error('config number values must be finite numbers');
124
+ }
125
+ return value;
126
+ }
127
+ function booleanValue(value, fallback) {
128
+ if (value === undefined)
129
+ return fallback;
130
+ if (typeof value !== 'boolean')
131
+ throw new Error('config boolean values must be booleans');
132
+ return value;
133
+ }
134
+ function propertiesValue(value) {
135
+ if (value === undefined)
136
+ return {};
137
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
138
+ throw new Error('serverProperties must be an object');
139
+ }
140
+ const properties = {};
141
+ for (const [key, entry] of Object.entries(value)) {
142
+ if (!key || typeof entry === 'object' || entry === null) {
143
+ throw new Error(`serverProperties.${key} must be a string, number, or boolean`);
144
+ }
145
+ if (typeof entry !== 'string' && typeof entry !== 'number' && typeof entry !== 'boolean') {
146
+ throw new Error(`serverProperties.${key} must be a string, number, or boolean`);
147
+ }
148
+ properties[key] = entry;
149
+ }
150
+ return properties;
151
+ }
152
+ function stringArrayValue(value, key) {
153
+ if (value === undefined)
154
+ return [];
155
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
156
+ throw new Error(`${key} must be an array of strings`);
157
+ }
158
+ return [...value];
159
+ }
160
+ function environmentValue(value) {
161
+ if (value === undefined)
162
+ return {};
163
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
164
+ throw new Error('environment must be an object');
165
+ }
166
+ const environment = {};
167
+ for (const [key, entry] of Object.entries(value)) {
168
+ if (typeof entry !== 'string')
169
+ throw new Error(`environment.${key} must be a string`);
170
+ environment[key] = entry;
171
+ }
172
+ return environment;
173
+ }
174
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { configFileName, defaultConfig, loadConfig, normalizeConfig, writeDefaultConfig, type GrimServerConfig, type MinecraftProperties, type MemoryConfig, } from './config.js';
2
+ export { cacheArtifact, hashFile, listPaperVersions, resolveGrim, resolvePaper, type Artifact, type Checksum, type DiscoveryOptions, type HttpClient, } from './artifacts/index.js';
3
+ export { launchServer, resolveJava, startServer, type LaunchOptions, type ServerHandle, } from './server/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { configFileName, defaultConfig, loadConfig, normalizeConfig, writeDefaultConfig, } from './config.js';
2
+ export { cacheArtifact, hashFile, listPaperVersions, resolveGrim, resolvePaper, } from './artifacts/index.js';
3
+ export { launchServer, resolveJava, startServer, } from './server/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,UAAU,EACV,eAAe,EACf,kBAAkB,GAInB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,YAAY,GAKb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,GAGZ,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DiscoveryOptions } from '../artifacts/index.js';
2
+ import type { ResolvedArtifact } from './types.js';
3
+ export declare function resolveServerArtifacts(version: string, cacheDir: string, options: DiscoveryOptions, paperJar?: string, grimJar?: string): Promise<{
4
+ paper: ResolvedArtifact;
5
+ grim: ResolvedArtifact;
6
+ version: string;
7
+ }>;
8
+ export declare function installGrim(serverDir: string, grim: ResolvedArtifact): Promise<void>;
9
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/server/artifacts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/E;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F"}
@@ -0,0 +1,65 @@
1
+ import { copyFile, mkdir, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { hashFile, resolveGrim, resolvePaper } from '../artifacts/index.js';
5
+ export async function resolveServerArtifacts(version, cacheDir, options, paperJar, grimJar) {
6
+ const paper = paperJar
7
+ ? { path: paperJar }
8
+ : await withArtifactPath(resolvePaper(version, { ...options, cacheDir }));
9
+ const serverVersion = version === 'latest' && 'version' in paper ? paper.version : version;
10
+ const grim = grimJar
11
+ ? { path: grimJar }
12
+ : await bundledGrimOrResolved(serverVersion, { ...options, cacheDir });
13
+ return {
14
+ paper: await withArtifactPath(Promise.resolve(paper)),
15
+ grim: await withArtifactPath(Promise.resolve(grim)),
16
+ version: serverVersion,
17
+ };
18
+ }
19
+ export async function installGrim(serverDir, grim) {
20
+ await mkdir(path.join(serverDir, 'plugins'), { recursive: true });
21
+ await copyFile(grim.path, path.join(serverDir, 'plugins', path.basename(grim.path)));
22
+ }
23
+ async function bundledGrimOrResolved(minecraftVersion, options) {
24
+ const bundled = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'vendor', 'grim.json');
25
+ try {
26
+ const manifest = JSON.parse(await readFile(bundled, 'utf8'));
27
+ if (manifest.minecraftVersion === minecraftVersion && manifest.filename) {
28
+ const artifactPath = path.join(path.dirname(bundled), manifest.filename);
29
+ if ((await isFile(artifactPath)) && manifest.checksum?.algorithm && manifest.checksum.value) {
30
+ const checksum = await hashFile(artifactPath, manifest.checksum.algorithm);
31
+ if (checksum === manifest.checksum.value) {
32
+ return {
33
+ name: manifest.filename,
34
+ path: artifactPath,
35
+ version: 'bundled',
36
+ url: '',
37
+ source: 'modrinth',
38
+ };
39
+ }
40
+ }
41
+ }
42
+ }
43
+ catch {
44
+ return resolveGrimArtifact(minecraftVersion, options);
45
+ }
46
+ return resolveGrimArtifact(minecraftVersion, options);
47
+ }
48
+ async function resolveGrimArtifact(version, options) {
49
+ return withArtifactPath(resolveGrim(version, options));
50
+ }
51
+ async function withArtifactPath(artifactPromise) {
52
+ const artifact = await artifactPromise;
53
+ if (!('path' in artifact))
54
+ throw new Error('Artifact cache path was not returned');
55
+ return artifact;
56
+ }
57
+ async function isFile(file) {
58
+ try {
59
+ return (await import('node:fs/promises').then(({ stat }) => stat(file))).isFile();
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/server/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type GrimServerConfig } from '../config.js';
2
+ export { resolveJava } from './java.js';
3
+ export type { LaunchOptions, ServerHandle } from './types.js';
4
+ export { launchServer } from './launch.js';
5
+ import type { LaunchOptions, ServerHandle } from './types.js';
6
+ export declare function startServer(overrides?: Partial<GrimServerConfig>, options?: LaunchOptions): Promise<ServerHandle>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAsB,WAAW,CAC/B,SAAS,GAAE,OAAO,CAAC,gBAAgB,CAAM,EACzC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -0,0 +1,17 @@
1
+ import { loadConfig } from '../config.js';
2
+ import { launchServer } from './launch.js';
3
+ export { resolveJava } from './java.js';
4
+ export { launchServer } from './launch.js';
5
+ export async function startServer(overrides = {}, options = {}) {
6
+ const loaded = await loadConfig();
7
+ const config = {
8
+ ...loaded,
9
+ ...overrides,
10
+ memory: { ...loaded.memory, ...(overrides.memory ?? {}) },
11
+ serverProperties: { ...loaded.serverProperties, ...(overrides.serverProperties ?? {}) },
12
+ environment: { ...loaded.environment, ...(overrides.environment ?? {}) },
13
+ javaArgs: overrides.javaArgs ? [...overrides.javaArgs] : [...loaded.javaArgs],
14
+ };
15
+ return launchServer(config, options);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAyB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,YAAuC,EAAE,EACzC,UAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAqB;QAC/B,GAAG,MAAM;QACT,GAAG,SAAS;QACZ,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;QACzD,gBAAgB,EAAE,EAAE,GAAG,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE;QACvF,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;QACxE,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;KAC9E,CAAC;IACF,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveJava(configured?: string): Promise<string>;
2
+ //# sourceMappingURL=java.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../src/server/java.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWtE"}
@@ -0,0 +1,72 @@
1
+ import { readdir, stat } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ export async function resolveJava(configured) {
6
+ if (configured)
7
+ return configured;
8
+ const bundled = await findBundledJava();
9
+ if (bundled)
10
+ return bundled;
11
+ const javaHome = process.env.JAVA_HOME;
12
+ if (javaHome) {
13
+ const candidate = path.join(javaHome, 'bin', executableName());
14
+ if (await isFile(candidate))
15
+ return candidate;
16
+ }
17
+ const pathJava = await findJavaOnPath();
18
+ return pathJava ?? executableName();
19
+ }
20
+ async function findJavaOnPath() {
21
+ const pathValue = process.env.PATH;
22
+ if (!pathValue)
23
+ return undefined;
24
+ for (const directory of pathValue.split(path.delimiter)) {
25
+ const candidate = path.join(directory, executableName());
26
+ if (await isFile(candidate))
27
+ return candidate;
28
+ }
29
+ return undefined;
30
+ }
31
+ async function findBundledJava() {
32
+ const roots = [
33
+ path.resolve('.runtime'),
34
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '.runtime'),
35
+ ];
36
+ for (const root of roots) {
37
+ const entries = await directories(root);
38
+ for (const entry of entries) {
39
+ const candidates = [
40
+ path.join(root, entry, 'bin', executableName()),
41
+ path.join(root, entry, 'current', 'bin', executableName()),
42
+ path.join(root, 'current', 'bin', executableName()),
43
+ ];
44
+ for (const candidate of candidates) {
45
+ if (await isFile(candidate))
46
+ return candidate;
47
+ }
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ async function directories(root) {
53
+ try {
54
+ const entries = await readdir(root, { withFileTypes: true });
55
+ return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
61
+ function executableName() {
62
+ return os.platform() === 'win32' ? 'java.exe' : 'java';
63
+ }
64
+ async function isFile(file) {
65
+ try {
66
+ return (await stat(file)).isFile();
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ //# sourceMappingURL=java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../src/server/java.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GrimServerConfig } from '../config.js';
2
+ import type { LaunchOptions, ServerHandle } from './types.js';
3
+ export declare function launchServer(config: GrimServerConfig, options?: LaunchOptions): Promise<ServerHandle>;
4
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/server/launch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAuCvB"}
@@ -0,0 +1,35 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { enhanceProcess } from './process.js';
4
+ import { ensureServerFiles } from './properties.js';
5
+ import { installGrim, resolveServerArtifacts } from './artifacts.js';
6
+ import { resolveJava } from './java.js';
7
+ export async function launchServer(config, options = {}) {
8
+ const artifacts = await resolveServerArtifacts(config.version, config.cacheDir, options, config.paperJar, config.grimJar);
9
+ await mkdir(config.serverDir, { recursive: true });
10
+ await ensureServerFiles(config);
11
+ await installGrim(config.serverDir, artifacts.grim);
12
+ const java = await resolveJava(config.java);
13
+ const child = spawn(java, [
14
+ `-Xms${config.memory.min}`,
15
+ `-Xmx${config.memory.max}`,
16
+ ...config.javaArgs,
17
+ '-jar',
18
+ artifacts.paper.path,
19
+ '--nogui',
20
+ ], {
21
+ cwd: config.serverDir,
22
+ stdio: config.captureOutput && process.env.GRIM_CAPTURE !== '0'
23
+ ? ['pipe', 'pipe', 'pipe']
24
+ : 'inherit',
25
+ env: {
26
+ ...process.env,
27
+ ...config.environment,
28
+ GRIM_JAR: artifacts.grim.path,
29
+ MINECRAFT_VERSION: artifacts.version,
30
+ MINECRAFT_PORT: String(config.port),
31
+ },
32
+ });
33
+ return enhanceProcess(child);
34
+ }
35
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/server/launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIxC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAwB,EACxB,UAAyB,EAAE;IAE3B,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAC5C,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,QAAQ,EACf,OAAO,EACP,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,OAAO,CACf,CAAC;IACF,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CACjB,IAAI,EACJ;QACE,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QAC1B,GAAG,MAAM,CAAC,QAAQ;QAClB,MAAM;QACN,SAAS,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS;KACV,EACD;QACE,GAAG,EAAE,MAAM,CAAC,SAAS;QACrB,KAAK,EACH,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;YACtD,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC1B,CAAC,CAAC,SAAS;QACf,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,MAAM,CAAC,WAAW;YACrB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI;YAC7B,iBAAiB,EAAE,SAAS,CAAC,OAAO;YACpC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;SACpC;KACF,CACF,CAAC;IACF,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { ServerHandle } from './types.js';
3
+ export declare function enhanceProcess(child: ChildProcess): ServerHandle;
4
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/server/process.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAwBhE"}
@@ -0,0 +1,48 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export function enhanceProcess(child) {
3
+ const lines = new EventEmitter();
4
+ const logs = new EventEmitter();
5
+ consume(child.stdout, 'stdout', lines, logs);
6
+ consume(child.stderr, 'stderr', lines, logs);
7
+ const handle = child;
8
+ handle.command = (input) => {
9
+ if (!child.stdin || child.stdin.destroyed)
10
+ return false;
11
+ child.stdin.write(`${input.trim()}\n`);
12
+ return true;
13
+ };
14
+ handle.say = (message) => handle.command(`say ${message}`);
15
+ handle.stop = () => handle.command('stop');
16
+ handle.killServer = () => child.kill();
17
+ handle.onLine = (listener) => {
18
+ lines.on('line', listener);
19
+ return handle;
20
+ };
21
+ handle.onLog = (listener) => {
22
+ logs.on('log', listener);
23
+ return handle;
24
+ };
25
+ return handle;
26
+ }
27
+ function consume(stream, channel, lines, logs) {
28
+ if (!stream)
29
+ return;
30
+ let pending = '';
31
+ stream.setEncoding('utf8');
32
+ stream.on('data', (chunk) => {
33
+ pending += chunk;
34
+ const complete = pending.split(/\r?\n/);
35
+ pending = complete.pop() ?? '';
36
+ for (const line of complete)
37
+ emit(line);
38
+ });
39
+ stream.on('end', () => {
40
+ if (pending)
41
+ emit(pending);
42
+ });
43
+ function emit(line) {
44
+ lines.emit('line', line);
45
+ logs.emit('log', line, channel);
46
+ }
47
+ }
48
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/server/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,KAAqB,CAAC;IACrC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACxD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC1B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CACd,MAAoC,EACpC,OAA4B,EAC5B,KAAmB,EACnB,IAAkB;IAElB,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QAClC,OAAO,IAAI,KAAK,CAAC;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,SAAS,IAAI,CAAC,IAAY;QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}