@react-text-game/core 0.3.0 → 0.4.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 (44) hide show
  1. package/README.md +98 -1
  2. package/dist/game.d.ts.map +1 -1
  3. package/dist/game.js +2 -0
  4. package/dist/game.js.map +1 -1
  5. package/dist/i18n/constants.d.ts +21 -0
  6. package/dist/i18n/constants.d.ts.map +1 -0
  7. package/dist/i18n/constants.js +21 -0
  8. package/dist/i18n/constants.js.map +1 -0
  9. package/dist/i18n/hooks/index.d.ts +13 -0
  10. package/dist/i18n/hooks/index.d.ts.map +1 -0
  11. package/dist/i18n/hooks/index.js +13 -0
  12. package/dist/i18n/hooks/index.js.map +1 -0
  13. package/dist/i18n/hooks/useGameTranslation.d.ts +81 -0
  14. package/dist/i18n/hooks/useGameTranslation.d.ts.map +1 -0
  15. package/dist/i18n/hooks/useGameTranslation.js +102 -0
  16. package/dist/i18n/hooks/useGameTranslation.js.map +1 -0
  17. package/dist/i18n/index.d.ts +69 -0
  18. package/dist/i18n/index.d.ts.map +1 -0
  19. package/dist/i18n/index.js +69 -0
  20. package/dist/i18n/index.js.map +1 -0
  21. package/dist/i18n/init.d.ts +62 -0
  22. package/dist/i18n/init.d.ts.map +1 -0
  23. package/dist/i18n/init.js +114 -0
  24. package/dist/i18n/init.js.map +1 -0
  25. package/dist/i18n/types.d.ts +54 -0
  26. package/dist/i18n/types.d.ts.map +1 -0
  27. package/dist/i18n/types.js +2 -0
  28. package/dist/i18n/types.js.map +1 -0
  29. package/dist/i18n/utils.d.ts +55 -0
  30. package/dist/i18n/utils.d.ts.map +1 -0
  31. package/dist/i18n/utils.js +69 -0
  32. package/dist/i18n/utils.js.map +1 -0
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/options.d.ts +2 -0
  36. package/dist/options.d.ts.map +1 -1
  37. package/dist/options.js +2 -0
  38. package/dist/options.js.map +1 -1
  39. package/dist/tests/game.test.js.map +1 -1
  40. package/dist/tests/i18n.test.d.ts +2 -0
  41. package/dist/tests/i18n.test.d.ts.map +1 -0
  42. package/dist/tests/i18n.test.js +590 -0
  43. package/dist/tests/i18n.test.js.map +1 -0
  44. package/package.json +16 -5
@@ -0,0 +1,590 @@
1
+ import { renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
3
+ import i18next from "i18next";
4
+ import { Game } from "../game";
5
+ import { getGameTranslation, initI18n, useGameTranslation } from "../i18n";
6
+ import { DEFAULT_CONFIG } from "../i18n/constants";
7
+ import { loadUITranslations } from "../i18n/utils";
8
+ import { getSetting, setSetting } from "../saves/db";
9
+ import { setupMockStorage, teardownMockStorage } from "../tests/helpers";
10
+ describe("i18n", () => {
11
+ beforeEach(async () => {
12
+ setupMockStorage();
13
+ sessionStorage.clear();
14
+ localStorage.clear();
15
+ await Game.init({ gameName: "Test Game", isDevMode: true });
16
+ // Clear any saved language preference from previous tests
17
+ await setSetting("language", "en");
18
+ // Reset i18next to English if already initialized
19
+ if (i18next.isInitialized) {
20
+ await i18next.changeLanguage("en");
21
+ }
22
+ });
23
+ afterEach(async () => {
24
+ // Clean up language setting
25
+ if (i18next.isInitialized) {
26
+ await i18next.changeLanguage("en");
27
+ }
28
+ Game._resetForTesting();
29
+ teardownMockStorage();
30
+ });
31
+ describe("DEFAULT_CONFIG", () => {
32
+ test("has correct default values", () => {
33
+ expect(DEFAULT_CONFIG.defaultLanguage).toBe("en");
34
+ expect(DEFAULT_CONFIG.fallbackLanguage).toBe("en");
35
+ expect(DEFAULT_CONFIG.debug).toBe(false);
36
+ expect(DEFAULT_CONFIG.resources).toEqual({});
37
+ });
38
+ });
39
+ describe("loadUITranslations", () => {
40
+ test("returns empty object when UI package not installed", async () => {
41
+ const translations = await loadUITranslations();
42
+ // Since UI package likely isn't installed in tests, should return {}
43
+ expect(typeof translations).toBe("object");
44
+ });
45
+ test("returns translation structure when UI package is available", async () => {
46
+ const translations = await loadUITranslations();
47
+ // Check structure regardless of whether UI package is installed
48
+ expect(translations).toBeDefined();
49
+ // If translations exist, they should be organized by language
50
+ if (Object.keys(translations).length > 0) {
51
+ const firstLang = Object.keys(translations)[0];
52
+ expect(typeof translations[firstLang]).toBe("object");
53
+ }
54
+ });
55
+ });
56
+ describe("initI18n", () => {
57
+ test("initializes with default config", async () => {
58
+ await initI18n();
59
+ expect(i18next.isInitialized).toBe(true);
60
+ expect(i18next.language).toBeDefined();
61
+ });
62
+ test("initializes with custom default language", async () => {
63
+ const config = {
64
+ defaultLanguage: "ru",
65
+ fallbackLanguage: "en",
66
+ resources: {
67
+ ru: {
68
+ common: { greeting: "@825B" },
69
+ },
70
+ en: {
71
+ common: { greeting: "Hello" },
72
+ },
73
+ },
74
+ };
75
+ await initI18n(config);
76
+ expect(i18next.isInitialized).toBe(true);
77
+ });
78
+ test("initializes with custom resources", async () => {
79
+ const config = {
80
+ resources: {
81
+ en: {
82
+ passages: { intro: "Welcome to the game" },
83
+ common: { save: "Save", load: "Load" },
84
+ },
85
+ ru: {
86
+ passages: { intro: ">1@> ?>60;>20BL 2 83@C" },
87
+ common: { save: "!>E@0=8BL", load: "03@C78BL" },
88
+ },
89
+ },
90
+ };
91
+ await initI18n(config);
92
+ expect(i18next.isInitialized).toBe(true);
93
+ // Test translation exists
94
+ const t = i18next.getFixedT("en", "passages");
95
+ expect(t("intro")).toBe("Welcome to the game");
96
+ });
97
+ test("sets fallback language correctly", async () => {
98
+ const config = {
99
+ defaultLanguage: "de",
100
+ fallbackLanguage: "en",
101
+ resources: {
102
+ en: {
103
+ common: { test: "English" },
104
+ },
105
+ de: {
106
+ common: {},
107
+ },
108
+ },
109
+ };
110
+ await initI18n(config);
111
+ // fallbackLng can be a string or array, normalize for comparison
112
+ const fallbackLng = i18next.options.fallbackLng;
113
+ const expectedLang = Array.isArray(fallbackLng) ? fallbackLng[0] : fallbackLng;
114
+ expect(expectedLang).toBe("en");
115
+ });
116
+ test("enables debug mode when configured", async () => {
117
+ const config = {
118
+ debug: true,
119
+ resources: {
120
+ en: {
121
+ common: { test: "Test" },
122
+ },
123
+ },
124
+ };
125
+ await initI18n(config);
126
+ expect(i18next.options.debug).toBe(true);
127
+ });
128
+ test("loads saved language preference from database", async () => {
129
+ // Set a saved language preference
130
+ await setSetting("language", "ru");
131
+ const config = {
132
+ defaultLanguage: "en",
133
+ resources: {
134
+ en: { common: { test: "English" } },
135
+ ru: { common: { test: " CAA:89" } },
136
+ },
137
+ };
138
+ await initI18n(config);
139
+ // Should use saved language
140
+ const savedLang = await getSetting("language", "en");
141
+ expect(savedLang).toBe("ru");
142
+ });
143
+ test("uses default language when no saved preference exists", async () => {
144
+ const config = {
145
+ defaultLanguage: "en",
146
+ resources: {
147
+ en: { common: { test: "English" } },
148
+ },
149
+ };
150
+ await initI18n(config);
151
+ expect(i18next.language).toBeDefined();
152
+ });
153
+ test("merges user resources with UI translations", async () => {
154
+ const config = {
155
+ resources: {
156
+ en: {
157
+ passages: { intro: "My custom intro" },
158
+ },
159
+ },
160
+ };
161
+ await initI18n(config);
162
+ // User resources should be present
163
+ const t = i18next.getFixedT("en", "passages");
164
+ expect(t("intro")).toBe("My custom intro");
165
+ });
166
+ test("supports multiple namespaces", async () => {
167
+ const config = {
168
+ resources: {
169
+ en: {
170
+ passages: { intro: "Passage text" },
171
+ common: { save: "Save" },
172
+ ui: { button: "Click me" },
173
+ },
174
+ },
175
+ };
176
+ await initI18n(config);
177
+ const tPassages = i18next.getFixedT("en", "passages");
178
+ const tCommon = i18next.getFixedT("en", "common");
179
+ const tUI = i18next.getFixedT("en", "ui");
180
+ expect(tPassages("intro")).toBe("Passage text");
181
+ expect(tCommon("save")).toBe("Save");
182
+ expect(tUI("button")).toBe("Click me");
183
+ });
184
+ test("supports multiple languages", async () => {
185
+ const config = {
186
+ resources: {
187
+ en: { common: { greeting: "Hello" } },
188
+ ru: { common: { greeting: "@825B" } },
189
+ de: { common: { greeting: "Hallo" } },
190
+ fr: { common: { greeting: "Bonjour" } },
191
+ },
192
+ };
193
+ await initI18n(config);
194
+ const supportedLangs = i18next.options.supportedLngs;
195
+ expect(supportedLangs).toContain("en");
196
+ expect(supportedLangs).toContain("ru");
197
+ expect(supportedLangs).toContain("de");
198
+ expect(supportedLangs).toContain("fr");
199
+ });
200
+ test("registers custom i18next modules", async () => {
201
+ const mockModule = {
202
+ type: "3rdParty",
203
+ init: mock(() => { }),
204
+ };
205
+ const config = {
206
+ resources: { en: { common: {} } },
207
+ modules: [mockModule],
208
+ };
209
+ await initI18n(config);
210
+ expect(i18next.isInitialized).toBe(true);
211
+ });
212
+ });
213
+ describe("getGameTranslation", () => {
214
+ beforeEach(async () => {
215
+ await initI18n({
216
+ defaultLanguage: "en",
217
+ resources: {
218
+ en: {
219
+ passages: {
220
+ intro: "Welcome",
221
+ forest: "You are in a forest",
222
+ },
223
+ common: {
224
+ save: "Save",
225
+ load: "Load",
226
+ },
227
+ },
228
+ ru: {
229
+ passages: {
230
+ intro: ">1@> ?>60;>20BL",
231
+ forest: "K 2 ;5AC",
232
+ },
233
+ common: {
234
+ save: "!>E@0=8BL",
235
+ load: "03@C78BL",
236
+ },
237
+ },
238
+ },
239
+ });
240
+ });
241
+ test("returns translation function for default namespace", () => {
242
+ const t = getGameTranslation();
243
+ expect(typeof t).toBe("function");
244
+ expect(t("intro")).toBe("Welcome");
245
+ });
246
+ test("returns translation function for specific namespace", () => {
247
+ const t = getGameTranslation("common");
248
+ expect(t("save")).toBe("Save");
249
+ expect(t("load")).toBe("Load");
250
+ });
251
+ test("returns translation for passages namespace", () => {
252
+ const t = getGameTranslation("passages");
253
+ expect(t("intro")).toBe("Welcome");
254
+ expect(t("forest")).toBe("You are in a forest");
255
+ });
256
+ test("uses current language", async () => {
257
+ await i18next.changeLanguage("ru");
258
+ const t = getGameTranslation("passages");
259
+ expect(t("intro")).toBe(">1@> ?>60;>20BL");
260
+ expect(t("forest")).toBe("K 2 ;5AC");
261
+ });
262
+ test("updates when language changes", async () => {
263
+ const tEn = getGameTranslation("common");
264
+ expect(tEn("save")).toBe("Save");
265
+ await i18next.changeLanguage("ru");
266
+ const tRu = getGameTranslation("common");
267
+ expect(tRu("save")).toBe("!>E@0=8BL");
268
+ });
269
+ test("falls back to key when translation missing", () => {
270
+ const t = getGameTranslation("passages");
271
+ expect(t("nonexistent")).toBe("nonexistent");
272
+ });
273
+ test("supports interpolation", async () => {
274
+ await initI18n({
275
+ resources: {
276
+ en: {
277
+ passages: {
278
+ greeting: "Hello, {{name}}!",
279
+ },
280
+ },
281
+ },
282
+ });
283
+ const t = getGameTranslation("passages");
284
+ expect(t("greeting", { name: "Player" })).toBe("Hello, Player!");
285
+ });
286
+ });
287
+ describe("useGameTranslation", () => {
288
+ beforeEach(async () => {
289
+ await initI18n({
290
+ defaultLanguage: "en",
291
+ fallbackLanguage: "en",
292
+ resources: {
293
+ en: {
294
+ passages: { intro: "Welcome" },
295
+ common: { save: "Save", load: "Load" },
296
+ },
297
+ ru: {
298
+ passages: { intro: ">1@> ?>60;>20BL" },
299
+ common: { save: "!>E@0=8BL", load: "03@C78BL" },
300
+ },
301
+ de: {
302
+ passages: { intro: "Willkommen" },
303
+ common: { save: "Speichern", load: "Laden" },
304
+ },
305
+ },
306
+ });
307
+ });
308
+ test("returns translation function", () => {
309
+ const { result } = renderHook(() => useGameTranslation());
310
+ expect(typeof result.current.t).toBe("function");
311
+ });
312
+ test("returns current language", () => {
313
+ const { result } = renderHook(() => useGameTranslation());
314
+ expect(result.current.currentLanguage).toBeDefined();
315
+ expect(typeof result.current.currentLanguage).toBe("string");
316
+ });
317
+ test("returns available languages", () => {
318
+ const { result } = renderHook(() => useGameTranslation());
319
+ expect(Array.isArray(result.current.languages)).toBe(true);
320
+ expect(result.current.languages.length).toBeGreaterThan(0);
321
+ expect(result.current.languages).toContain("en");
322
+ expect(result.current.languages).toContain("ru");
323
+ expect(result.current.languages).toContain("de");
324
+ });
325
+ test("filters out cimode when debug is disabled", () => {
326
+ const { result } = renderHook(() => useGameTranslation());
327
+ expect(result.current.languages).not.toContain("cimode");
328
+ });
329
+ test("includes cimode when debug is enabled", async () => {
330
+ await initI18n({
331
+ debug: true,
332
+ resources: {
333
+ en: { common: {} },
334
+ },
335
+ });
336
+ const { result } = renderHook(() => useGameTranslation());
337
+ expect(result.current.languages).toContain("cimode");
338
+ });
339
+ test("translates keys in default namespace", () => {
340
+ const { result } = renderHook(() => useGameTranslation("passages"));
341
+ expect(result.current.t("intro")).toBe("Welcome");
342
+ });
343
+ test("translates keys in custom namespace", () => {
344
+ const { result } = renderHook(() => useGameTranslation("common"));
345
+ expect(result.current.t("save")).toBe("Save");
346
+ expect(result.current.t("load")).toBe("Load");
347
+ });
348
+ test("changes language and persists preference", async () => {
349
+ const { result } = renderHook(() => useGameTranslation("passages"));
350
+ await result.current.changeLanguage("ru");
351
+ await waitFor(() => {
352
+ expect(result.current.currentLanguage).toBe("ru");
353
+ });
354
+ // Check if preference was saved
355
+ const savedLang = await getSetting("language", "en");
356
+ expect(savedLang).toBe("ru");
357
+ });
358
+ test("updates translations after language change", async () => {
359
+ const { result } = renderHook(() => useGameTranslation("passages"));
360
+ expect(result.current.t("intro")).toBe("Welcome");
361
+ await result.current.changeLanguage("ru");
362
+ await waitFor(() => {
363
+ expect(result.current.t("intro")).toBe(">1@> ?>60;>20BL");
364
+ });
365
+ });
366
+ test("supports interpolation", async () => {
367
+ // Initialize with interpolation example first
368
+ await initI18n({
369
+ resources: {
370
+ en: {
371
+ passages: { greeting: "Hello, {{name}}!" },
372
+ },
373
+ },
374
+ });
375
+ const { result } = renderHook(() => useGameTranslation("passages"));
376
+ expect(result.current.t("greeting", { name: "Player" })).toBe("Hello, Player!");
377
+ });
378
+ test("changeLanguage returns promise", async () => {
379
+ const { result } = renderHook(() => useGameTranslation());
380
+ const promise = result.current.changeLanguage("de");
381
+ expect(promise).toBeInstanceOf(Promise);
382
+ await promise;
383
+ });
384
+ test("handles multiple language changes", async () => {
385
+ const { result } = renderHook(() => useGameTranslation("passages"));
386
+ await result.current.changeLanguage("ru");
387
+ await waitFor(() => {
388
+ expect(result.current.t("intro")).toBe(">1@> ?>60;>20BL");
389
+ });
390
+ await result.current.changeLanguage("de");
391
+ await waitFor(() => {
392
+ expect(result.current.t("intro")).toBe("Willkommen");
393
+ });
394
+ await result.current.changeLanguage("en");
395
+ await waitFor(() => {
396
+ expect(result.current.t("intro")).toBe("Welcome");
397
+ });
398
+ });
399
+ });
400
+ describe("Integration Tests", () => {
401
+ test("complete i18n workflow: init, translate, change language", async () => {
402
+ // 1. Initialize i18n
403
+ await initI18n({
404
+ defaultLanguage: "en",
405
+ fallbackLanguage: "en",
406
+ resources: {
407
+ en: {
408
+ passages: { story: "Once upon a time..." },
409
+ common: { continue: "Continue" },
410
+ },
411
+ ru: {
412
+ passages: { story: "4=064K..." },
413
+ common: { continue: "@>4>;68BL" },
414
+ },
415
+ },
416
+ });
417
+ // 2. Use translation function
418
+ const t = getGameTranslation("passages");
419
+ expect(t("story")).toBe("Once upon a time...");
420
+ // 3. Change language
421
+ await i18next.changeLanguage("ru");
422
+ // 4. Get new translation function
423
+ const tRu = getGameTranslation("passages");
424
+ expect(tRu("story")).toBe("4=064K...");
425
+ });
426
+ test("multiple namespaces across different languages", async () => {
427
+ await initI18n({
428
+ resources: {
429
+ en: {
430
+ passages: { intro: "Intro EN" },
431
+ common: { save: "Save EN" },
432
+ ui: { button: "Button EN" },
433
+ },
434
+ ru: {
435
+ passages: { intro: "Intro RU" },
436
+ common: { save: "Save RU" },
437
+ ui: { button: "Button RU" },
438
+ },
439
+ },
440
+ });
441
+ // Test English
442
+ const tPassagesEn = getGameTranslation("passages");
443
+ const tCommonEn = getGameTranslation("common");
444
+ const tUIEn = getGameTranslation("ui");
445
+ expect(tPassagesEn("intro")).toBe("Intro EN");
446
+ expect(tCommonEn("save")).toBe("Save EN");
447
+ expect(tUIEn("button")).toBe("Button EN");
448
+ // Change to Russian
449
+ await i18next.changeLanguage("ru");
450
+ const tPassagesRu = getGameTranslation("passages");
451
+ const tCommonRu = getGameTranslation("common");
452
+ const tUIRu = getGameTranslation("ui");
453
+ expect(tPassagesRu("intro")).toBe("Intro RU");
454
+ expect(tCommonRu("save")).toBe("Save RU");
455
+ expect(tUIRu("button")).toBe("Button RU");
456
+ });
457
+ test("language persistence across reinitializations", async () => {
458
+ // First initialization with language change
459
+ await initI18n({
460
+ defaultLanguage: "en",
461
+ resources: {
462
+ en: { common: { test: "Test EN" } },
463
+ ru: { common: { test: "Test RU" } },
464
+ },
465
+ });
466
+ await i18next.changeLanguage("ru");
467
+ await setSetting("language", "ru");
468
+ // Second initialization should load saved language
469
+ await initI18n({
470
+ defaultLanguage: "en",
471
+ resources: {
472
+ en: { common: { test: "Test EN" } },
473
+ ru: { common: { test: "Test RU" } },
474
+ },
475
+ });
476
+ const savedLang = await getSetting("language", "en");
477
+ expect(savedLang).toBe("ru");
478
+ });
479
+ });
480
+ describe("Edge Cases", () => {
481
+ test("handles empty resources", async () => {
482
+ await initI18n({
483
+ resources: {},
484
+ });
485
+ expect(i18next.isInitialized).toBe(true);
486
+ });
487
+ test("handles missing translation key", async () => {
488
+ await initI18n({
489
+ resources: {
490
+ en: { common: { existing: "Exists" } },
491
+ },
492
+ });
493
+ const t = getGameTranslation("common");
494
+ // Should return key when translation missing
495
+ expect(t("nonexistent")).toBe("nonexistent");
496
+ });
497
+ test("handles missing namespace", async () => {
498
+ await initI18n({
499
+ resources: {
500
+ en: { common: { test: "Test" } },
501
+ },
502
+ });
503
+ const t = getGameTranslation("nonexistent");
504
+ expect(typeof t).toBe("function");
505
+ });
506
+ test("handles special characters in translations", async () => {
507
+ await initI18n({
508
+ resources: {
509
+ en: {
510
+ passages: {
511
+ special: 'Test "quotes" and \'apostrophes\'',
512
+ unicode: "Test `} E1-('",
513
+ newlines: "Line 1\nLine 2",
514
+ },
515
+ },
516
+ },
517
+ });
518
+ const t = getGameTranslation("passages");
519
+ expect(t("special")).toBe('Test "quotes" and \'apostrophes\'');
520
+ expect(t("unicode")).toBe("Test `} E1-('");
521
+ expect(t("newlines")).toBe("Line 1\nLine 2");
522
+ });
523
+ test("handles empty string translations", async () => {
524
+ await initI18n({
525
+ resources: {
526
+ en: { common: { empty: "" } },
527
+ },
528
+ });
529
+ const t = getGameTranslation("common");
530
+ expect(t("empty")).toBe("");
531
+ });
532
+ test("handles numeric translation values", async () => {
533
+ await initI18n({
534
+ resources: {
535
+ en: {
536
+ common: {
537
+ count: "{{count}}",
538
+ },
539
+ },
540
+ },
541
+ });
542
+ const t = getGameTranslation("common");
543
+ expect(t("count", { count: 42 })).toBe("42");
544
+ });
545
+ test("handles nested translation keys", async () => {
546
+ await initI18n({
547
+ resources: {
548
+ en: {
549
+ passages: {
550
+ forest: {
551
+ description: "A dark forest",
552
+ action: "Enter",
553
+ },
554
+ },
555
+ },
556
+ },
557
+ });
558
+ const t = getGameTranslation("passages");
559
+ expect(t("forest.description")).toBe("A dark forest");
560
+ expect(t("forest.action")).toBe("Enter");
561
+ });
562
+ test("handles language change to unsupported language", async () => {
563
+ await initI18n({
564
+ resources: {
565
+ en: { common: { test: "Test" } },
566
+ },
567
+ });
568
+ // Try to change to unsupported language
569
+ await i18next.changeLanguage("xyz");
570
+ // Should fall back to fallback language
571
+ expect(i18next.language).toBeDefined();
572
+ });
573
+ test("handles rapid language changes", async () => {
574
+ await initI18n({
575
+ resources: {
576
+ en: { common: { test: "EN" } },
577
+ ru: { common: { test: "RU" } },
578
+ de: { common: { test: "DE" } },
579
+ },
580
+ });
581
+ // Rapidly change languages
582
+ await i18next.changeLanguage("ru");
583
+ await i18next.changeLanguage("de");
584
+ await i18next.changeLanguage("en");
585
+ const t = getGameTranslation("common");
586
+ expect(t("test")).toBe("EN");
587
+ });
588
+ });
589
+ });
590
+ //# sourceMappingURL=i18n.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/tests/i18n.test.ts"],"names":[],"mappings":"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"}