@claudinho/core 0.7.0 → 0.8.1

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 (3) hide show
  1. package/dist/index.d.ts +159 -2
  2. package/dist/index.js +1379 -145
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -253,6 +253,153 @@ function nationToRegion(nameOrCode) {
253
253
  return intlNameMap()[norm(nameOrCode)];
254
254
  }
255
255
 
256
+ // src/i18n.ts
257
+ var EN = {
258
+ "bracket.title": "Knockout bracket",
259
+ "bracket.stageTitle": "Knockout \xB7 {stage}",
260
+ "bracket.shareTitle": "Knockout bracket \xB7 2026",
261
+ "bracket.degraded": "Live scores unavailable \u2014 bracket structure only, no confirmed advancement.",
262
+ "bracket.standingsDegraded": "Live standings unavailable \u2014 group slots stay TBD until groups finish.",
263
+ "bracket.treeFallback": "Terminal too narrow for tree view \u2014 showing staged list.",
264
+ "bracket.empty": "No bracket matches available.",
265
+ "bracket.projected": "(proj.)",
266
+ "bracket.invalidStage": "Stage must be one of: R32, R16, QF, SF, 3P, F",
267
+ "bracket.unknownStage": 'Unknown stage "{stage}". Use R32, R16, QF, SF, 3P, or F.',
268
+ "bracket.slot.groupWinner": "Group {group} winner",
269
+ "bracket.slot.groupSecond": "Group {group} 2nd",
270
+ "bracket.slot.third": "3rd ({groups})",
271
+ "bracket.slot.winner": "{stage} {n} winner",
272
+ "bracket.slot.loser": "{stage} {n} loser",
273
+ "bracket.slot.tbd": "TBD",
274
+ "live.data": "Live data: {source}",
275
+ "share.tryIt": "Try it: {line}",
276
+ "stage.group": "Group {group}",
277
+ "stage.groupStage": "Group stage",
278
+ "stage.r32": "Round of 32",
279
+ "stage.r16": "Round of 16",
280
+ "stage.qf": "Quarter-final",
281
+ "stage.sf": "Semi-final",
282
+ "stage.3p": "Third-place play-off",
283
+ "stage.f": "Final",
284
+ "stage.friendly": "Friendly"
285
+ };
286
+ var ES = {
287
+ "bracket.title": "Cuadro de eliminatorias",
288
+ "bracket.stageTitle": "Eliminatorias \xB7 {stage}",
289
+ "bracket.shareTitle": "Cuadro de eliminatorias \xB7 2026",
290
+ "bracket.degraded": "Marcadores en vivo no disponibles \u2014 solo estructura del cuadro, sin avances confirmados.",
291
+ "bracket.standingsDegraded": "Tabla en vivo no disponible \u2014 los cupos de grupo siguen por definir hasta que terminen los grupos.",
292
+ "bracket.treeFallback": "Terminal demasiado estrecha para el \xE1rbol \u2014 mostrando lista por fase.",
293
+ "bracket.empty": "No hay partidos de eliminatorias disponibles.",
294
+ "bracket.projected": "(proy.)",
295
+ "bracket.invalidStage": "La fase debe ser una de: R32, R16, QF, SF, 3P, F",
296
+ "bracket.unknownStage": 'Fase desconocida "{stage}". Usa R32, R16, QF, SF, 3P o F.',
297
+ "bracket.slot.groupWinner": "Ganador del grupo {group}",
298
+ "bracket.slot.groupSecond": "2.\xBA del grupo {group}",
299
+ "bracket.slot.third": "3.\xBA ({groups})",
300
+ "bracket.slot.winner": "Ganador {stage} {n}",
301
+ "bracket.slot.loser": "Perdedor {stage} {n}",
302
+ "bracket.slot.tbd": "Por definir",
303
+ "live.data": "Datos en vivo: {source}",
304
+ "share.tryIt": "Pru\xE9balo: {line}",
305
+ "stage.group": "Grupo {group}",
306
+ "stage.groupStage": "Fase de grupos",
307
+ "stage.r32": "Dieciseisavos de final",
308
+ "stage.r16": "Octavos de final",
309
+ "stage.qf": "Cuartos de final",
310
+ "stage.sf": "Semifinal",
311
+ "stage.3p": "Tercer puesto",
312
+ "stage.f": "Final",
313
+ "stage.friendly": "Amistoso"
314
+ };
315
+ var PT = {
316
+ "bracket.title": "Chave do mata-mata",
317
+ "bracket.stageTitle": "Mata-mata \xB7 {stage}",
318
+ "bracket.shareTitle": "Chave do mata-mata \xB7 2026",
319
+ "bracket.degraded": "Placar ao vivo indispon\xEDvel \u2014 apenas a estrutura da chave, sem avan\xE7os confirmados.",
320
+ "bracket.standingsDegraded": "Classifica\xE7\xE3o ao vivo indispon\xEDvel \u2014 vagas de grupo seguem a definir at\xE9 o fim dos grupos.",
321
+ "bracket.treeFallback": "Terminal estreito demais para a \xE1rvore \u2014 mostrando lista por fase.",
322
+ "bracket.empty": "Nenhum jogo do mata-mata dispon\xEDvel.",
323
+ "bracket.projected": "(proj.)",
324
+ "bracket.invalidStage": "A fase deve ser uma de: R32, R16, QF, SF, 3P, F",
325
+ "bracket.unknownStage": 'Fase desconhecida "{stage}". Use R32, R16, QF, SF, 3P ou F.',
326
+ "bracket.slot.groupWinner": "Vencedor do grupo {group}",
327
+ "bracket.slot.groupSecond": "2.\xBA do grupo {group}",
328
+ "bracket.slot.third": "3.\xBA ({groups})",
329
+ "bracket.slot.winner": "Vencedor {stage} {n}",
330
+ "bracket.slot.loser": "Perdedor {stage} {n}",
331
+ "bracket.slot.tbd": "A definir",
332
+ "live.data": "Dados ao vivo: {source}",
333
+ "share.tryIt": "Experimente: {line}",
334
+ "stage.group": "Grupo {group}",
335
+ "stage.groupStage": "Fase de grupos",
336
+ "stage.r32": "Fase de 32 equipes",
337
+ "stage.r16": "Oitavas de final",
338
+ "stage.qf": "Quartas de final",
339
+ "stage.sf": "Semifinal",
340
+ "stage.3p": "Disputa do 3.\xBA lugar",
341
+ "stage.f": "Final",
342
+ "stage.friendly": "Amistoso"
343
+ };
344
+ var FR = {
345
+ "bracket.title": "Tableau \xE0 \xE9limination directe",
346
+ "bracket.stageTitle": "\xC9liminatoires \xB7 {stage}",
347
+ "bracket.shareTitle": "Tableau \xE0 \xE9limination directe \xB7 2026",
348
+ "bracket.degraded": "Scores en direct indisponibles \u2014 structure du tableau seulement, aucune qualification confirm\xE9e.",
349
+ "bracket.standingsDegraded": "Classement en direct indisponible \u2014 les places de groupe restent \xE0 d\xE9finir jusqu\u2019\xE0 la fin des poules.",
350
+ "bracket.treeFallback": "Terminal trop \xE9troit pour l\u2019arbre \u2014 affichage par phase.",
351
+ "bracket.empty": "Aucun match \xE0 \xE9limination directe disponible.",
352
+ "bracket.projected": "(proj.)",
353
+ "bracket.invalidStage": "La phase doit \xEAtre l\u2019une de : R32, R16, QF, SF, 3P, F",
354
+ "bracket.unknownStage": "Phase inconnue \xAB {stage} \xBB. Utilisez R32, R16, QF, SF, 3P ou F.",
355
+ "bracket.slot.groupWinner": "Vainqueur du groupe {group}",
356
+ "bracket.slot.groupSecond": "2e du groupe {group}",
357
+ "bracket.slot.third": "3e ({groups})",
358
+ "bracket.slot.winner": "Vainqueur {stage} {n}",
359
+ "bracket.slot.loser": "Perdant {stage} {n}",
360
+ "bracket.slot.tbd": "\xC0 d\xE9finir",
361
+ "live.data": "Donn\xE9es en direct : {source}",
362
+ "share.tryIt": "Essayez : {line}",
363
+ "stage.group": "Groupe {group}",
364
+ "stage.groupStage": "Phase de groupes",
365
+ "stage.r32": "Seizi\xE8mes de finale",
366
+ "stage.r16": "Huiti\xE8mes de finale",
367
+ "stage.qf": "Quarts de finale",
368
+ "stage.sf": "Demi-finale",
369
+ "stage.3p": "Match pour la 3e place",
370
+ "stage.f": "Finale",
371
+ "stage.friendly": "Match amical"
372
+ };
373
+ var CATALOGS = { en: EN, es: ES, pt: PT, fr: FR };
374
+ function normalizeLang(lang) {
375
+ const code = (lang ?? "en").slice(0, 2).toLowerCase();
376
+ if (code === "es" || code === "pt" || code === "fr") return code;
377
+ return "en";
378
+ }
379
+ function t(lang, key, vars) {
380
+ const dict = CATALOGS[normalizeLang(lang)];
381
+ let s = dict[key] ?? EN[key] ?? key;
382
+ if (vars) {
383
+ for (const [k, v] of Object.entries(vars)) s = s.replaceAll(`{${k}}`, v);
384
+ }
385
+ return s;
386
+ }
387
+ var STAGE_KEYS = {
388
+ GROUP: "stage.groupStage",
389
+ R32: "stage.r32",
390
+ R16: "stage.r16",
391
+ QF: "stage.qf",
392
+ SF: "stage.sf",
393
+ "3P": "stage.3p",
394
+ F: "stage.f",
395
+ FRIENDLY: "stage.friendly"
396
+ };
397
+ function stageLabelI18n(lang, stage, group) {
398
+ if (group) return t(lang, "stage.group", { group });
399
+ const key = STAGE_KEYS[stage];
400
+ return key ? t(lang, key) : stage;
401
+ }
402
+
256
403
  // src/validate.ts
257
404
  function isValidTimeZone(tz) {
258
405
  if (!tz) return false;
@@ -487,7 +634,7 @@ var schedule_2026_default = [
487
634
  flag: "\u{1F1FF}\u{1F1E6}"
488
635
  },
489
636
  status: "SCHEDULED",
490
- updatedAt: "2026-06-23T22:15:03.527Z"
637
+ updatedAt: "2026-06-24T01:20:06.301Z"
491
638
  },
492
639
  {
493
640
  id: "760414",
@@ -508,7 +655,7 @@ var schedule_2026_default = [
508
655
  flag: "\u{1F1E8}\u{1F1FF}"
509
656
  },
510
657
  status: "SCHEDULED",
511
- updatedAt: "2026-06-23T22:15:03.528Z"
658
+ updatedAt: "2026-06-24T01:20:06.302Z"
512
659
  },
513
660
  {
514
661
  id: "760416",
@@ -529,7 +676,7 @@ var schedule_2026_default = [
529
676
  flag: "\u{1F1E7}\u{1F1E6}"
530
677
  },
531
678
  status: "SCHEDULED",
532
- updatedAt: "2026-06-23T22:15:03.528Z"
679
+ updatedAt: "2026-06-24T01:20:06.302Z"
533
680
  },
534
681
  {
535
682
  id: "760417",
@@ -550,7 +697,7 @@ var schedule_2026_default = [
550
697
  flag: "\u{1F1F5}\u{1F1FE}"
551
698
  },
552
699
  status: "SCHEDULED",
553
- updatedAt: "2026-06-23T22:15:03.528Z"
700
+ updatedAt: "2026-06-24T01:20:06.302Z"
554
701
  },
555
702
  {
556
703
  id: "760420",
@@ -571,7 +718,7 @@ var schedule_2026_default = [
571
718
  flag: "\u{1F1E8}\u{1F1ED}"
572
719
  },
573
720
  status: "SCHEDULED",
574
- updatedAt: "2026-06-23T22:15:03.528Z"
721
+ updatedAt: "2026-06-24T01:20:06.302Z"
575
722
  },
576
723
  {
577
724
  id: "760419",
@@ -592,7 +739,7 @@ var schedule_2026_default = [
592
739
  flag: "\u{1F1F2}\u{1F1E6}"
593
740
  },
594
741
  status: "SCHEDULED",
595
- updatedAt: "2026-06-23T22:15:03.528Z"
742
+ updatedAt: "2026-06-24T01:20:06.302Z"
596
743
  },
597
744
  {
598
745
  id: "760418",
@@ -613,7 +760,7 @@ var schedule_2026_default = [
613
760
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
614
761
  },
615
762
  status: "SCHEDULED",
616
- updatedAt: "2026-06-23T22:15:03.528Z"
763
+ updatedAt: "2026-06-24T01:20:06.302Z"
617
764
  },
618
765
  {
619
766
  id: "760421",
@@ -634,7 +781,7 @@ var schedule_2026_default = [
634
781
  flag: "\u{1F1F9}\u{1F1F7}"
635
782
  },
636
783
  status: "SCHEDULED",
637
- updatedAt: "2026-06-23T22:15:03.528Z"
784
+ updatedAt: "2026-06-24T01:20:06.302Z"
638
785
  },
639
786
  {
640
787
  id: "760422",
@@ -655,7 +802,7 @@ var schedule_2026_default = [
655
802
  flag: "\u{1F1E8}\u{1F1FC}"
656
803
  },
657
804
  status: "SCHEDULED",
658
- updatedAt: "2026-06-23T22:15:03.528Z"
805
+ updatedAt: "2026-06-24T01:20:06.302Z"
659
806
  },
660
807
  {
661
808
  id: "760425",
@@ -676,7 +823,7 @@ var schedule_2026_default = [
676
823
  flag: "\u{1F1EF}\u{1F1F5}"
677
824
  },
678
825
  status: "SCHEDULED",
679
- updatedAt: "2026-06-23T22:15:03.528Z"
826
+ updatedAt: "2026-06-24T01:20:06.302Z"
680
827
  },
681
828
  {
682
829
  id: "760423",
@@ -697,7 +844,7 @@ var schedule_2026_default = [
697
844
  flag: "\u{1F1EA}\u{1F1E8}"
698
845
  },
699
846
  status: "SCHEDULED",
700
- updatedAt: "2026-06-23T22:15:03.528Z"
847
+ updatedAt: "2026-06-24T01:20:06.302Z"
701
848
  },
702
849
  {
703
850
  id: "760424",
@@ -718,7 +865,7 @@ var schedule_2026_default = [
718
865
  flag: "\u{1F1F9}\u{1F1F3}"
719
866
  },
720
867
  status: "SCHEDULED",
721
- updatedAt: "2026-06-23T22:15:03.528Z"
868
+ updatedAt: "2026-06-24T01:20:06.302Z"
722
869
  },
723
870
  {
724
871
  id: "760428",
@@ -739,7 +886,7 @@ var schedule_2026_default = [
739
886
  flag: "\u{1F1E8}\u{1F1FB}"
740
887
  },
741
888
  status: "SCHEDULED",
742
- updatedAt: "2026-06-23T22:15:03.528Z"
889
+ updatedAt: "2026-06-24T01:20:06.302Z"
743
890
  },
744
891
  {
745
892
  id: "760426",
@@ -760,7 +907,7 @@ var schedule_2026_default = [
760
907
  flag: "\u{1F1EA}\u{1F1EC}"
761
908
  },
762
909
  status: "SCHEDULED",
763
- updatedAt: "2026-06-23T22:15:03.528Z"
910
+ updatedAt: "2026-06-24T01:20:06.302Z"
764
911
  },
765
912
  {
766
913
  id: "760429",
@@ -781,7 +928,7 @@ var schedule_2026_default = [
781
928
  flag: "\u{1F1FA}\u{1F1FE}"
782
929
  },
783
930
  status: "SCHEDULED",
784
- updatedAt: "2026-06-23T22:15:03.528Z"
931
+ updatedAt: "2026-06-24T01:20:06.302Z"
785
932
  },
786
933
  {
787
934
  id: "760427",
@@ -802,7 +949,7 @@ var schedule_2026_default = [
802
949
  flag: "\u{1F1F3}\u{1F1FF}"
803
950
  },
804
951
  status: "SCHEDULED",
805
- updatedAt: "2026-06-23T22:15:03.528Z"
952
+ updatedAt: "2026-06-24T01:20:06.302Z"
806
953
  },
807
954
  {
808
955
  id: "760432",
@@ -823,7 +970,7 @@ var schedule_2026_default = [
823
970
  flag: "\u{1F1F8}\u{1F1F3}"
824
971
  },
825
972
  status: "SCHEDULED",
826
- updatedAt: "2026-06-23T22:15:03.528Z"
973
+ updatedAt: "2026-06-24T01:20:06.302Z"
827
974
  },
828
975
  {
829
976
  id: "760430",
@@ -844,7 +991,7 @@ var schedule_2026_default = [
844
991
  flag: "\u{1F1F3}\u{1F1F4}"
845
992
  },
846
993
  status: "SCHEDULED",
847
- updatedAt: "2026-06-23T22:15:03.528Z"
994
+ updatedAt: "2026-06-24T01:20:06.302Z"
848
995
  },
849
996
  {
850
997
  id: "760433",
@@ -865,7 +1012,7 @@ var schedule_2026_default = [
865
1012
  flag: "\u{1F1E9}\u{1F1FF}"
866
1013
  },
867
1014
  status: "SCHEDULED",
868
- updatedAt: "2026-06-23T22:15:03.528Z"
1015
+ updatedAt: "2026-06-24T01:20:06.302Z"
869
1016
  },
870
1017
  {
871
1018
  id: "760431",
@@ -886,7 +1033,7 @@ var schedule_2026_default = [
886
1033
  flag: "\u{1F1EF}\u{1F1F4}"
887
1034
  },
888
1035
  status: "SCHEDULED",
889
- updatedAt: "2026-06-23T22:15:03.528Z"
1036
+ updatedAt: "2026-06-24T01:20:06.302Z"
890
1037
  },
891
1038
  {
892
1039
  id: "760435",
@@ -907,7 +1054,7 @@ var schedule_2026_default = [
907
1054
  flag: "\u{1F1E8}\u{1F1E9}"
908
1055
  },
909
1056
  status: "SCHEDULED",
910
- updatedAt: "2026-06-23T22:15:03.528Z"
1057
+ updatedAt: "2026-06-24T01:20:06.302Z"
911
1058
  },
912
1059
  {
913
1060
  id: "760437",
@@ -928,7 +1075,7 @@ var schedule_2026_default = [
928
1075
  flag: "\u{1F1ED}\u{1F1F7}"
929
1076
  },
930
1077
  status: "SCHEDULED",
931
- updatedAt: "2026-06-23T22:15:03.528Z"
1078
+ updatedAt: "2026-06-24T01:20:06.302Z"
932
1079
  },
933
1080
  {
934
1081
  id: "760434",
@@ -949,7 +1096,7 @@ var schedule_2026_default = [
949
1096
  flag: "\u{1F1F5}\u{1F1E6}"
950
1097
  },
951
1098
  status: "SCHEDULED",
952
- updatedAt: "2026-06-23T22:15:03.528Z"
1099
+ updatedAt: "2026-06-24T01:20:06.302Z"
953
1100
  },
954
1101
  {
955
1102
  id: "760436",
@@ -970,7 +1117,7 @@ var schedule_2026_default = [
970
1117
  flag: "\u{1F1E8}\u{1F1F4}"
971
1118
  },
972
1119
  status: "SCHEDULED",
973
- updatedAt: "2026-06-23T22:15:03.528Z"
1120
+ updatedAt: "2026-06-24T01:20:06.302Z"
974
1121
  },
975
1122
  {
976
1123
  id: "760438",
@@ -991,7 +1138,7 @@ var schedule_2026_default = [
991
1138
  flag: "\u{1F1FF}\u{1F1E6}"
992
1139
  },
993
1140
  status: "SCHEDULED",
994
- updatedAt: "2026-06-23T22:15:03.624Z"
1141
+ updatedAt: "2026-06-24T01:20:06.394Z"
995
1142
  },
996
1143
  {
997
1144
  id: "760439",
@@ -1012,7 +1159,7 @@ var schedule_2026_default = [
1012
1159
  flag: "\u{1F1E7}\u{1F1E6}"
1013
1160
  },
1014
1161
  status: "SCHEDULED",
1015
- updatedAt: "2026-06-23T22:15:03.624Z"
1162
+ updatedAt: "2026-06-24T01:20:06.394Z"
1016
1163
  },
1017
1164
  {
1018
1165
  id: "760440",
@@ -1033,7 +1180,7 @@ var schedule_2026_default = [
1033
1180
  flag: "\u{1F1F6}\u{1F1E6}"
1034
1181
  },
1035
1182
  status: "SCHEDULED",
1036
- updatedAt: "2026-06-23T22:15:03.624Z"
1183
+ updatedAt: "2026-06-24T01:20:06.394Z"
1037
1184
  },
1038
1185
  {
1039
1186
  id: "760441",
@@ -1054,7 +1201,7 @@ var schedule_2026_default = [
1054
1201
  flag: "\u{1F1F0}\u{1F1F7}"
1055
1202
  },
1056
1203
  status: "SCHEDULED",
1057
- updatedAt: "2026-06-23T22:15:03.624Z"
1204
+ updatedAt: "2026-06-24T01:20:06.394Z"
1058
1205
  },
1059
1206
  {
1060
1207
  id: "760442",
@@ -1075,7 +1222,7 @@ var schedule_2026_default = [
1075
1222
  flag: "\u{1F1E6}\u{1F1FA}"
1076
1223
  },
1077
1224
  status: "SCHEDULED",
1078
- updatedAt: "2026-06-23T22:15:03.624Z"
1225
+ updatedAt: "2026-06-24T01:20:06.394Z"
1079
1226
  },
1080
1227
  {
1081
1228
  id: "760445",
@@ -1096,7 +1243,7 @@ var schedule_2026_default = [
1096
1243
  flag: "\u{1F1F2}\u{1F1E6}"
1097
1244
  },
1098
1245
  status: "SCHEDULED",
1099
- updatedAt: "2026-06-23T22:15:03.624Z"
1246
+ updatedAt: "2026-06-24T01:20:06.394Z"
1100
1247
  },
1101
1248
  {
1102
1249
  id: "760444",
@@ -1117,7 +1264,7 @@ var schedule_2026_default = [
1117
1264
  flag: "\u{1F1ED}\u{1F1F9}"
1118
1265
  },
1119
1266
  status: "SCHEDULED",
1120
- updatedAt: "2026-06-23T22:15:03.624Z"
1267
+ updatedAt: "2026-06-24T01:20:06.394Z"
1121
1268
  },
1122
1269
  {
1123
1270
  id: "760443",
@@ -1138,7 +1285,7 @@ var schedule_2026_default = [
1138
1285
  flag: "\u{1F1F5}\u{1F1FE}"
1139
1286
  },
1140
1287
  status: "SCHEDULED",
1141
- updatedAt: "2026-06-23T22:15:03.624Z"
1288
+ updatedAt: "2026-06-24T01:20:06.394Z"
1142
1289
  },
1143
1290
  {
1144
1291
  id: "760447",
@@ -1159,7 +1306,7 @@ var schedule_2026_default = [
1159
1306
  flag: "\u{1F1F8}\u{1F1EA}"
1160
1307
  },
1161
1308
  status: "SCHEDULED",
1162
- updatedAt: "2026-06-23T22:15:03.624Z"
1309
+ updatedAt: "2026-06-24T01:20:06.394Z"
1163
1310
  },
1164
1311
  {
1165
1312
  id: "760448",
@@ -1180,7 +1327,7 @@ var schedule_2026_default = [
1180
1327
  flag: "\u{1F1E8}\u{1F1EE}"
1181
1328
  },
1182
1329
  status: "SCHEDULED",
1183
- updatedAt: "2026-06-23T22:15:03.624Z"
1330
+ updatedAt: "2026-06-24T01:20:06.394Z"
1184
1331
  },
1185
1332
  {
1186
1333
  id: "760446",
@@ -1201,7 +1348,7 @@ var schedule_2026_default = [
1201
1348
  flag: "\u{1F1E8}\u{1F1FC}"
1202
1349
  },
1203
1350
  status: "SCHEDULED",
1204
- updatedAt: "2026-06-23T22:15:03.624Z"
1351
+ updatedAt: "2026-06-24T01:20:06.394Z"
1205
1352
  },
1206
1353
  {
1207
1354
  id: "760449",
@@ -1222,7 +1369,7 @@ var schedule_2026_default = [
1222
1369
  flag: "\u{1F1EF}\u{1F1F5}"
1223
1370
  },
1224
1371
  status: "SCHEDULED",
1225
- updatedAt: "2026-06-23T22:15:03.624Z"
1372
+ updatedAt: "2026-06-24T01:20:06.394Z"
1226
1373
  },
1227
1374
  {
1228
1375
  id: "760453",
@@ -1243,7 +1390,7 @@ var schedule_2026_default = [
1243
1390
  flag: "\u{1F1F8}\u{1F1E6}"
1244
1391
  },
1245
1392
  status: "SCHEDULED",
1246
- updatedAt: "2026-06-23T22:15:03.624Z"
1393
+ updatedAt: "2026-06-24T01:20:06.394Z"
1247
1394
  },
1248
1395
  {
1249
1396
  id: "760451",
@@ -1264,7 +1411,7 @@ var schedule_2026_default = [
1264
1411
  flag: "\u{1F1EE}\u{1F1F7}"
1265
1412
  },
1266
1413
  status: "SCHEDULED",
1267
- updatedAt: "2026-06-23T22:15:03.624Z"
1414
+ updatedAt: "2026-06-24T01:20:06.394Z"
1268
1415
  },
1269
1416
  {
1270
1417
  id: "760450",
@@ -1285,7 +1432,7 @@ var schedule_2026_default = [
1285
1432
  flag: "\u{1F1E8}\u{1F1FB}"
1286
1433
  },
1287
1434
  status: "SCHEDULED",
1288
- updatedAt: "2026-06-23T22:15:03.624Z"
1435
+ updatedAt: "2026-06-24T01:20:06.394Z"
1289
1436
  },
1290
1437
  {
1291
1438
  id: "760452",
@@ -1306,7 +1453,7 @@ var schedule_2026_default = [
1306
1453
  flag: "\u{1F1EA}\u{1F1EC}"
1307
1454
  },
1308
1455
  status: "SCHEDULED",
1309
- updatedAt: "2026-06-23T22:15:03.624Z"
1456
+ updatedAt: "2026-06-24T01:20:06.394Z"
1310
1457
  },
1311
1458
  {
1312
1459
  id: "760456",
@@ -1327,7 +1474,7 @@ var schedule_2026_default = [
1327
1474
  flag: "\u{1F1E6}\u{1F1F9}"
1328
1475
  },
1329
1476
  status: "SCHEDULED",
1330
- updatedAt: "2026-06-23T22:15:03.624Z"
1477
+ updatedAt: "2026-06-24T01:20:06.394Z"
1331
1478
  },
1332
1479
  {
1333
1480
  id: "760457",
@@ -1348,7 +1495,7 @@ var schedule_2026_default = [
1348
1495
  flag: "\u{1F1EE}\u{1F1F6}"
1349
1496
  },
1350
1497
  status: "SCHEDULED",
1351
- updatedAt: "2026-06-23T22:15:03.624Z"
1498
+ updatedAt: "2026-06-24T01:20:06.394Z"
1352
1499
  },
1353
1500
  {
1354
1501
  id: "760454",
@@ -1369,7 +1516,7 @@ var schedule_2026_default = [
1369
1516
  flag: "\u{1F1F8}\u{1F1F3}"
1370
1517
  },
1371
1518
  status: "SCHEDULED",
1372
- updatedAt: "2026-06-23T22:15:03.624Z"
1519
+ updatedAt: "2026-06-24T01:20:06.394Z"
1373
1520
  },
1374
1521
  {
1375
1522
  id: "760455",
@@ -1390,7 +1537,7 @@ var schedule_2026_default = [
1390
1537
  flag: "\u{1F1E9}\u{1F1FF}"
1391
1538
  },
1392
1539
  status: "SCHEDULED",
1393
- updatedAt: "2026-06-23T22:15:03.624Z"
1540
+ updatedAt: "2026-06-24T01:20:06.394Z"
1394
1541
  },
1395
1542
  {
1396
1543
  id: "760461",
@@ -1411,7 +1558,7 @@ var schedule_2026_default = [
1411
1558
  flag: "\u{1F1FA}\u{1F1FF}"
1412
1559
  },
1413
1560
  status: "SCHEDULED",
1414
- updatedAt: "2026-06-23T22:15:03.624Z"
1561
+ updatedAt: "2026-06-24T01:20:06.394Z"
1415
1562
  },
1416
1563
  {
1417
1564
  id: "760458",
@@ -1432,7 +1579,7 @@ var schedule_2026_default = [
1432
1579
  flag: "\u{1F1EC}\u{1F1ED}"
1433
1580
  },
1434
1581
  status: "SCHEDULED",
1435
- updatedAt: "2026-06-23T22:15:03.624Z"
1582
+ updatedAt: "2026-06-24T01:20:06.394Z"
1436
1583
  },
1437
1584
  {
1438
1585
  id: "760460",
@@ -1453,7 +1600,7 @@ var schedule_2026_default = [
1453
1600
  flag: "\u{1F1ED}\u{1F1F7}"
1454
1601
  },
1455
1602
  status: "SCHEDULED",
1456
- updatedAt: "2026-06-23T22:15:03.624Z"
1603
+ updatedAt: "2026-06-24T01:20:06.394Z"
1457
1604
  },
1458
1605
  {
1459
1606
  id: "760459",
@@ -1474,7 +1621,7 @@ var schedule_2026_default = [
1474
1621
  flag: "\u{1F1E8}\u{1F1E9}"
1475
1622
  },
1476
1623
  status: "SCHEDULED",
1477
- updatedAt: "2026-06-23T22:15:03.624Z"
1624
+ updatedAt: "2026-06-24T01:20:06.394Z"
1478
1625
  },
1479
1626
  {
1480
1627
  id: "760462",
@@ -1495,7 +1642,7 @@ var schedule_2026_default = [
1495
1642
  flag: "\u{1F1F6}\u{1F1E6}"
1496
1643
  },
1497
1644
  status: "SCHEDULED",
1498
- updatedAt: "2026-06-23T22:15:03.624Z"
1645
+ updatedAt: "2026-06-24T01:20:06.394Z"
1499
1646
  },
1500
1647
  {
1501
1648
  id: "760463",
@@ -1516,7 +1663,7 @@ var schedule_2026_default = [
1516
1663
  flag: "\u{1F1E8}\u{1F1E6}"
1517
1664
  },
1518
1665
  status: "SCHEDULED",
1519
- updatedAt: "2026-06-23T22:15:03.624Z"
1666
+ updatedAt: "2026-06-24T01:20:06.394Z"
1520
1667
  },
1521
1668
  {
1522
1669
  id: "760464",
@@ -1537,7 +1684,7 @@ var schedule_2026_default = [
1537
1684
  flag: "\u{1F1ED}\u{1F1F9}"
1538
1685
  },
1539
1686
  status: "SCHEDULED",
1540
- updatedAt: "2026-06-23T22:15:03.624Z"
1687
+ updatedAt: "2026-06-24T01:20:06.394Z"
1541
1688
  },
1542
1689
  {
1543
1690
  id: "760465",
@@ -1558,7 +1705,7 @@ var schedule_2026_default = [
1558
1705
  flag: "\u{1F1E7}\u{1F1F7}"
1559
1706
  },
1560
1707
  status: "SCHEDULED",
1561
- updatedAt: "2026-06-23T22:15:03.624Z"
1708
+ updatedAt: "2026-06-24T01:20:06.394Z"
1562
1709
  },
1563
1710
  {
1564
1711
  id: "760467",
@@ -1579,7 +1726,7 @@ var schedule_2026_default = [
1579
1726
  flag: "\u{1F1F2}\u{1F1FD}"
1580
1727
  },
1581
1728
  status: "SCHEDULED",
1582
- updatedAt: "2026-06-23T22:15:03.624Z"
1729
+ updatedAt: "2026-06-24T01:20:06.394Z"
1583
1730
  },
1584
1731
  {
1585
1732
  id: "760466",
@@ -1600,7 +1747,7 @@ var schedule_2026_default = [
1600
1747
  flag: "\u{1F1F0}\u{1F1F7}"
1601
1748
  },
1602
1749
  status: "SCHEDULED",
1603
- updatedAt: "2026-06-23T22:15:03.624Z"
1750
+ updatedAt: "2026-06-24T01:20:06.394Z"
1604
1751
  },
1605
1752
  {
1606
1753
  id: "760473",
@@ -1621,7 +1768,7 @@ var schedule_2026_default = [
1621
1768
  flag: "\u{1F1E8}\u{1F1EE}"
1622
1769
  },
1623
1770
  status: "SCHEDULED",
1624
- updatedAt: "2026-06-23T22:15:03.692Z"
1771
+ updatedAt: "2026-06-24T01:20:06.523Z"
1625
1772
  },
1626
1773
  {
1627
1774
  id: "760468",
@@ -1642,7 +1789,7 @@ var schedule_2026_default = [
1642
1789
  flag: "\u{1F1E9}\u{1F1EA}"
1643
1790
  },
1644
1791
  status: "SCHEDULED",
1645
- updatedAt: "2026-06-23T22:15:03.692Z"
1792
+ updatedAt: "2026-06-24T01:20:06.523Z"
1646
1793
  },
1647
1794
  {
1648
1795
  id: "760471",
@@ -1663,7 +1810,7 @@ var schedule_2026_default = [
1663
1810
  flag: "\u{1F1F8}\u{1F1EA}"
1664
1811
  },
1665
1812
  status: "SCHEDULED",
1666
- updatedAt: "2026-06-23T22:15:03.692Z"
1813
+ updatedAt: "2026-06-24T01:20:06.523Z"
1667
1814
  },
1668
1815
  {
1669
1816
  id: "760472",
@@ -1684,7 +1831,7 @@ var schedule_2026_default = [
1684
1831
  flag: "\u{1F1F3}\u{1F1F1}"
1685
1832
  },
1686
1833
  status: "SCHEDULED",
1687
- updatedAt: "2026-06-23T22:15:03.692Z"
1834
+ updatedAt: "2026-06-24T01:20:06.523Z"
1688
1835
  },
1689
1836
  {
1690
1837
  id: "760469",
@@ -1705,7 +1852,7 @@ var schedule_2026_default = [
1705
1852
  flag: "\u{1F1E6}\u{1F1FA}"
1706
1853
  },
1707
1854
  status: "SCHEDULED",
1708
- updatedAt: "2026-06-23T22:15:03.692Z"
1855
+ updatedAt: "2026-06-24T01:20:06.523Z"
1709
1856
  },
1710
1857
  {
1711
1858
  id: "760470",
@@ -1726,7 +1873,7 @@ var schedule_2026_default = [
1726
1873
  flag: "\u{1F1FA}\u{1F1F8}"
1727
1874
  },
1728
1875
  status: "SCHEDULED",
1729
- updatedAt: "2026-06-23T22:15:03.692Z"
1876
+ updatedAt: "2026-06-24T01:20:06.523Z"
1730
1877
  },
1731
1878
  {
1732
1879
  id: "760475",
@@ -1747,7 +1894,7 @@ var schedule_2026_default = [
1747
1894
  flag: "\u{1F1EB}\u{1F1F7}"
1748
1895
  },
1749
1896
  status: "SCHEDULED",
1750
- updatedAt: "2026-06-23T22:15:03.692Z"
1897
+ updatedAt: "2026-06-24T01:20:06.523Z"
1751
1898
  },
1752
1899
  {
1753
1900
  id: "760474",
@@ -1768,7 +1915,7 @@ var schedule_2026_default = [
1768
1915
  flag: "\u{1F1EE}\u{1F1F6}"
1769
1916
  },
1770
1917
  status: "SCHEDULED",
1771
- updatedAt: "2026-06-23T22:15:03.692Z"
1918
+ updatedAt: "2026-06-24T01:20:06.523Z"
1772
1919
  },
1773
1920
  {
1774
1921
  id: "760478",
@@ -1789,7 +1936,7 @@ var schedule_2026_default = [
1789
1936
  flag: "\u{1F1F8}\u{1F1E6}"
1790
1937
  },
1791
1938
  status: "SCHEDULED",
1792
- updatedAt: "2026-06-23T22:15:03.692Z"
1939
+ updatedAt: "2026-06-24T01:20:06.523Z"
1793
1940
  },
1794
1941
  {
1795
1942
  id: "760479",
@@ -1810,7 +1957,7 @@ var schedule_2026_default = [
1810
1957
  flag: "\u{1F1EA}\u{1F1F8}"
1811
1958
  },
1812
1959
  status: "SCHEDULED",
1813
- updatedAt: "2026-06-23T22:15:03.692Z"
1960
+ updatedAt: "2026-06-24T01:20:06.523Z"
1814
1961
  },
1815
1962
  {
1816
1963
  id: "760476",
@@ -1831,7 +1978,7 @@ var schedule_2026_default = [
1831
1978
  flag: "\u{1F1EE}\u{1F1F7}"
1832
1979
  },
1833
1980
  status: "SCHEDULED",
1834
- updatedAt: "2026-06-23T22:15:03.692Z"
1981
+ updatedAt: "2026-06-24T01:20:06.523Z"
1835
1982
  },
1836
1983
  {
1837
1984
  id: "760477",
@@ -1852,7 +1999,7 @@ var schedule_2026_default = [
1852
1999
  flag: "\u{1F1E7}\u{1F1EA}"
1853
2000
  },
1854
2001
  status: "SCHEDULED",
1855
- updatedAt: "2026-06-23T22:15:03.692Z"
2002
+ updatedAt: "2026-06-24T01:20:06.523Z"
1856
2003
  },
1857
2004
  {
1858
2005
  id: "760480",
@@ -1873,7 +2020,7 @@ var schedule_2026_default = [
1873
2020
  flag: "\u{1F1EC}\u{1F1ED}"
1874
2021
  },
1875
2022
  status: "SCHEDULED",
1876
- updatedAt: "2026-06-23T22:15:03.692Z"
2023
+ updatedAt: "2026-06-24T01:20:06.523Z"
1877
2024
  },
1878
2025
  {
1879
2026
  id: "760485",
@@ -1894,7 +2041,7 @@ var schedule_2026_default = [
1894
2041
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
1895
2042
  },
1896
2043
  status: "SCHEDULED",
1897
- updatedAt: "2026-06-23T22:15:03.692Z"
2044
+ updatedAt: "2026-06-24T01:20:06.523Z"
1898
2045
  },
1899
2046
  {
1900
2047
  id: "760481",
@@ -1915,7 +2062,7 @@ var schedule_2026_default = [
1915
2062
  flag: "\u{1F1F5}\u{1F1F9}"
1916
2063
  },
1917
2064
  status: "SCHEDULED",
1918
- updatedAt: "2026-06-23T22:15:03.692Z"
2065
+ updatedAt: "2026-06-24T01:20:06.523Z"
1919
2066
  },
1920
2067
  {
1921
2068
  id: "760482",
@@ -1936,7 +2083,7 @@ var schedule_2026_default = [
1936
2083
  flag: "\u{1F1FA}\u{1F1FF}"
1937
2084
  },
1938
2085
  status: "SCHEDULED",
1939
- updatedAt: "2026-06-23T22:15:03.692Z"
2086
+ updatedAt: "2026-06-24T01:20:06.523Z"
1940
2087
  },
1941
2088
  {
1942
2089
  id: "760484",
@@ -1957,7 +2104,7 @@ var schedule_2026_default = [
1957
2104
  flag: "\u{1F1E6}\u{1F1F9}"
1958
2105
  },
1959
2106
  status: "SCHEDULED",
1960
- updatedAt: "2026-06-23T22:15:03.692Z"
2107
+ updatedAt: "2026-06-24T01:20:06.523Z"
1961
2108
  },
1962
2109
  {
1963
2110
  id: "760483",
@@ -1978,7 +2125,7 @@ var schedule_2026_default = [
1978
2125
  flag: "\u{1F1E6}\u{1F1F7}"
1979
2126
  },
1980
2127
  status: "SCHEDULED",
1981
- updatedAt: "2026-06-23T22:15:03.692Z"
2128
+ updatedAt: "2026-06-24T01:20:06.523Z"
1982
2129
  },
1983
2130
  {
1984
2131
  id: "760486",
@@ -1998,7 +2145,7 @@ var schedule_2026_default = [
1998
2145
  flag: "\u{1F3F3}\uFE0F"
1999
2146
  },
2000
2147
  status: "SCHEDULED",
2001
- updatedAt: "2026-06-23T22:15:03.697Z"
2148
+ updatedAt: "2026-06-24T01:20:06.529Z"
2002
2149
  },
2003
2150
  {
2004
2151
  id: "760487",
@@ -2018,7 +2165,7 @@ var schedule_2026_default = [
2018
2165
  flag: "\u{1F3F3}\uFE0F"
2019
2166
  },
2020
2167
  status: "SCHEDULED",
2021
- updatedAt: "2026-06-23T22:15:03.697Z"
2168
+ updatedAt: "2026-06-24T01:20:06.529Z"
2022
2169
  },
2023
2170
  {
2024
2171
  id: "760489",
@@ -2028,9 +2175,9 @@ var schedule_2026_default = [
2028
2175
  city: "Foxborough, Massachusetts",
2029
2176
  country: "USA",
2030
2177
  home: {
2031
- code: "GER",
2178
+ code: "TBD",
2032
2179
  name: "Germany",
2033
- flag: "\u{1F1E9}\u{1F1EA}"
2180
+ flag: "\u{1F3F3}\uFE0F"
2034
2181
  },
2035
2182
  away: {
2036
2183
  code: "3RD",
@@ -2038,7 +2185,7 @@ var schedule_2026_default = [
2038
2185
  flag: "\u{1F3F3}\uFE0F"
2039
2186
  },
2040
2187
  status: "SCHEDULED",
2041
- updatedAt: "2026-06-23T22:15:03.697Z"
2188
+ updatedAt: "2026-06-24T01:20:06.529Z"
2042
2189
  },
2043
2190
  {
2044
2191
  id: "760488",
@@ -2058,7 +2205,7 @@ var schedule_2026_default = [
2058
2205
  flag: "\u{1F3F3}\uFE0F"
2059
2206
  },
2060
2207
  status: "SCHEDULED",
2061
- updatedAt: "2026-06-23T22:15:03.697Z"
2208
+ updatedAt: "2026-06-24T01:20:06.529Z"
2062
2209
  },
2063
2210
  {
2064
2211
  id: "760490",
@@ -2078,7 +2225,7 @@ var schedule_2026_default = [
2078
2225
  flag: "\u{1F3F3}\uFE0F"
2079
2226
  },
2080
2227
  status: "SCHEDULED",
2081
- updatedAt: "2026-06-23T22:15:03.697Z"
2228
+ updatedAt: "2026-06-24T01:20:06.529Z"
2082
2229
  },
2083
2230
  {
2084
2231
  id: "760492",
@@ -2098,7 +2245,7 @@ var schedule_2026_default = [
2098
2245
  flag: "\u{1F3F3}\uFE0F"
2099
2246
  },
2100
2247
  status: "SCHEDULED",
2101
- updatedAt: "2026-06-23T22:15:03.697Z"
2248
+ updatedAt: "2026-06-24T01:20:06.529Z"
2102
2249
  },
2103
2250
  {
2104
2251
  id: "760491",
@@ -2108,9 +2255,9 @@ var schedule_2026_default = [
2108
2255
  city: "Mexico City",
2109
2256
  country: "Mexico",
2110
2257
  home: {
2111
- code: "MEX",
2258
+ code: "TBD",
2112
2259
  name: "Mexico",
2113
- flag: "\u{1F1F2}\u{1F1FD}"
2260
+ flag: "\u{1F3F3}\uFE0F"
2114
2261
  },
2115
2262
  away: {
2116
2263
  code: "3RD",
@@ -2118,7 +2265,7 @@ var schedule_2026_default = [
2118
2265
  flag: "\u{1F3F3}\uFE0F"
2119
2266
  },
2120
2267
  status: "SCHEDULED",
2121
- updatedAt: "2026-06-23T22:15:03.697Z"
2268
+ updatedAt: "2026-06-24T01:20:06.529Z"
2122
2269
  },
2123
2270
  {
2124
2271
  id: "760495",
@@ -2138,7 +2285,7 @@ var schedule_2026_default = [
2138
2285
  flag: "\u{1F3F3}\uFE0F"
2139
2286
  },
2140
2287
  status: "SCHEDULED",
2141
- updatedAt: "2026-06-23T22:15:03.697Z"
2288
+ updatedAt: "2026-06-24T01:20:06.529Z"
2142
2289
  },
2143
2290
  {
2144
2291
  id: "760493",
@@ -2158,7 +2305,7 @@ var schedule_2026_default = [
2158
2305
  flag: "\u{1F3F3}\uFE0F"
2159
2306
  },
2160
2307
  status: "SCHEDULED",
2161
- updatedAt: "2026-06-23T22:15:03.697Z"
2308
+ updatedAt: "2026-06-24T01:20:06.529Z"
2162
2309
  },
2163
2310
  {
2164
2311
  id: "760494",
@@ -2168,9 +2315,9 @@ var schedule_2026_default = [
2168
2315
  city: "Santa Clara, California",
2169
2316
  country: "USA",
2170
2317
  home: {
2171
- code: "USA",
2318
+ code: "TBD",
2172
2319
  name: "United States",
2173
- flag: "\u{1F1FA}\u{1F1F8}"
2320
+ flag: "\u{1F3F3}\uFE0F"
2174
2321
  },
2175
2322
  away: {
2176
2323
  code: "3RD",
@@ -2178,7 +2325,7 @@ var schedule_2026_default = [
2178
2325
  flag: "\u{1F3F3}\uFE0F"
2179
2326
  },
2180
2327
  status: "SCHEDULED",
2181
- updatedAt: "2026-06-23T22:15:03.697Z"
2328
+ updatedAt: "2026-06-24T01:20:06.529Z"
2182
2329
  },
2183
2330
  {
2184
2331
  id: "760497",
@@ -2198,7 +2345,7 @@ var schedule_2026_default = [
2198
2345
  flag: "\u{1F3F3}\uFE0F"
2199
2346
  },
2200
2347
  status: "SCHEDULED",
2201
- updatedAt: "2026-06-23T22:15:03.762Z"
2348
+ updatedAt: "2026-06-24T01:20:06.593Z"
2202
2349
  },
2203
2350
  {
2204
2351
  id: "760496",
@@ -2218,7 +2365,7 @@ var schedule_2026_default = [
2218
2365
  flag: "\u{1F3F3}\uFE0F"
2219
2366
  },
2220
2367
  status: "SCHEDULED",
2221
- updatedAt: "2026-06-23T22:15:03.762Z"
2368
+ updatedAt: "2026-06-24T01:20:06.593Z"
2222
2369
  },
2223
2370
  {
2224
2371
  id: "760498",
@@ -2238,7 +2385,7 @@ var schedule_2026_default = [
2238
2385
  flag: "\u{1F3F3}\uFE0F"
2239
2386
  },
2240
2387
  status: "SCHEDULED",
2241
- updatedAt: "2026-06-23T22:15:03.762Z"
2388
+ updatedAt: "2026-06-24T01:20:06.593Z"
2242
2389
  },
2243
2390
  {
2244
2391
  id: "760499",
@@ -2258,7 +2405,7 @@ var schedule_2026_default = [
2258
2405
  flag: "\u{1F3F3}\uFE0F"
2259
2406
  },
2260
2407
  status: "SCHEDULED",
2261
- updatedAt: "2026-06-23T22:15:03.762Z"
2408
+ updatedAt: "2026-06-24T01:20:06.593Z"
2262
2409
  },
2263
2410
  {
2264
2411
  id: "760500",
@@ -2268,9 +2415,9 @@ var schedule_2026_default = [
2268
2415
  city: "Miami Gardens, Florida",
2269
2416
  country: "USA",
2270
2417
  home: {
2271
- code: "ARG",
2418
+ code: "TBD",
2272
2419
  name: "Argentina",
2273
- flag: "\u{1F1E6}\u{1F1F7}"
2420
+ flag: "\u{1F3F3}\uFE0F"
2274
2421
  },
2275
2422
  away: {
2276
2423
  code: "2H",
@@ -2278,7 +2425,7 @@ var schedule_2026_default = [
2278
2425
  flag: "\u{1F3F3}\uFE0F"
2279
2426
  },
2280
2427
  status: "SCHEDULED",
2281
- updatedAt: "2026-06-23T22:15:03.762Z"
2428
+ updatedAt: "2026-06-24T01:20:06.593Z"
2282
2429
  },
2283
2430
  {
2284
2431
  id: "760501",
@@ -2298,7 +2445,7 @@ var schedule_2026_default = [
2298
2445
  flag: "\u{1F3F3}\uFE0F"
2299
2446
  },
2300
2447
  status: "SCHEDULED",
2301
- updatedAt: "2026-06-23T22:15:03.762Z"
2448
+ updatedAt: "2026-06-24T01:20:06.593Z"
2302
2449
  },
2303
2450
  {
2304
2451
  id: "760502",
@@ -2318,7 +2465,7 @@ var schedule_2026_default = [
2318
2465
  flag: "\u{1F3F3}\uFE0F"
2319
2466
  },
2320
2467
  status: "SCHEDULED",
2321
- updatedAt: "2026-06-23T22:15:03.762Z"
2468
+ updatedAt: "2026-06-24T01:20:06.593Z"
2322
2469
  },
2323
2470
  {
2324
2471
  id: "760503",
@@ -2338,7 +2485,7 @@ var schedule_2026_default = [
2338
2485
  flag: "\u{1F3F3}\uFE0F"
2339
2486
  },
2340
2487
  status: "SCHEDULED",
2341
- updatedAt: "2026-06-23T22:15:03.762Z"
2488
+ updatedAt: "2026-06-24T01:20:06.593Z"
2342
2489
  },
2343
2490
  {
2344
2491
  id: "760504",
@@ -2358,7 +2505,7 @@ var schedule_2026_default = [
2358
2505
  flag: "\u{1F3F3}\uFE0F"
2359
2506
  },
2360
2507
  status: "SCHEDULED",
2361
- updatedAt: "2026-06-23T22:15:03.762Z"
2508
+ updatedAt: "2026-06-24T01:20:06.593Z"
2362
2509
  },
2363
2510
  {
2364
2511
  id: "760505",
@@ -2378,7 +2525,7 @@ var schedule_2026_default = [
2378
2525
  flag: "\u{1F3F3}\uFE0F"
2379
2526
  },
2380
2527
  status: "SCHEDULED",
2381
- updatedAt: "2026-06-23T22:15:03.762Z"
2528
+ updatedAt: "2026-06-24T01:20:06.593Z"
2382
2529
  },
2383
2530
  {
2384
2531
  id: "760506",
@@ -2398,7 +2545,7 @@ var schedule_2026_default = [
2398
2545
  flag: "\u{1F3F3}\uFE0F"
2399
2546
  },
2400
2547
  status: "SCHEDULED",
2401
- updatedAt: "2026-06-23T22:15:03.762Z"
2548
+ updatedAt: "2026-06-24T01:20:06.593Z"
2402
2549
  },
2403
2550
  {
2404
2551
  id: "760507",
@@ -2418,7 +2565,7 @@ var schedule_2026_default = [
2418
2565
  flag: "\u{1F3F3}\uFE0F"
2419
2566
  },
2420
2567
  status: "SCHEDULED",
2421
- updatedAt: "2026-06-23T22:15:03.762Z"
2568
+ updatedAt: "2026-06-24T01:20:06.593Z"
2422
2569
  },
2423
2570
  {
2424
2571
  id: "760509",
@@ -2438,7 +2585,7 @@ var schedule_2026_default = [
2438
2585
  flag: "\u{1F3F3}\uFE0F"
2439
2586
  },
2440
2587
  status: "SCHEDULED",
2441
- updatedAt: "2026-06-23T22:15:03.762Z"
2588
+ updatedAt: "2026-06-24T01:20:06.593Z"
2442
2589
  },
2443
2590
  {
2444
2591
  id: "760508",
@@ -2458,7 +2605,7 @@ var schedule_2026_default = [
2458
2605
  flag: "\u{1F3F3}\uFE0F"
2459
2606
  },
2460
2607
  status: "SCHEDULED",
2461
- updatedAt: "2026-06-23T22:15:03.762Z"
2608
+ updatedAt: "2026-06-24T01:20:06.593Z"
2462
2609
  },
2463
2610
  {
2464
2611
  id: "760510",
@@ -2468,17 +2615,17 @@ var schedule_2026_default = [
2468
2615
  city: "Foxborough, Massachusetts",
2469
2616
  country: "USA",
2470
2617
  home: {
2471
- code: "RD16 W1",
2618
+ code: "RD32",
2472
2619
  name: "Round of 16 1 Winner",
2473
2620
  flag: "\u{1F3F3}\uFE0F"
2474
2621
  },
2475
2622
  away: {
2476
- code: "RD16 W2",
2623
+ code: "RD32",
2477
2624
  name: "Round of 16 2 Winner",
2478
2625
  flag: "\u{1F3F3}\uFE0F"
2479
2626
  },
2480
2627
  status: "SCHEDULED",
2481
- updatedAt: "2026-06-23T22:15:03.862Z"
2628
+ updatedAt: "2026-06-24T01:20:06.650Z"
2482
2629
  },
2483
2630
  {
2484
2631
  id: "760511",
@@ -2488,17 +2635,17 @@ var schedule_2026_default = [
2488
2635
  city: "Inglewood, California",
2489
2636
  country: "USA",
2490
2637
  home: {
2491
- code: "RD16 W5",
2638
+ code: "RD32",
2492
2639
  name: "Round of 16 5 Winner",
2493
2640
  flag: "\u{1F3F3}\uFE0F"
2494
2641
  },
2495
2642
  away: {
2496
- code: "RD16 W6",
2643
+ code: "RD32",
2497
2644
  name: "Round of 16 6 Winner",
2498
2645
  flag: "\u{1F3F3}\uFE0F"
2499
2646
  },
2500
2647
  status: "SCHEDULED",
2501
- updatedAt: "2026-06-23T22:15:03.862Z"
2648
+ updatedAt: "2026-06-24T01:20:06.650Z"
2502
2649
  },
2503
2650
  {
2504
2651
  id: "760512",
@@ -2508,17 +2655,17 @@ var schedule_2026_default = [
2508
2655
  city: "Miami Gardens, Florida",
2509
2656
  country: "USA",
2510
2657
  home: {
2511
- code: "RD16 W3",
2658
+ code: "RD32",
2512
2659
  name: "Round of 16 3 Winner",
2513
2660
  flag: "\u{1F3F3}\uFE0F"
2514
2661
  },
2515
2662
  away: {
2516
- code: "RD16 W4",
2663
+ code: "RD32",
2517
2664
  name: "Round of 16 4 Winner",
2518
2665
  flag: "\u{1F3F3}\uFE0F"
2519
2666
  },
2520
2667
  status: "SCHEDULED",
2521
- updatedAt: "2026-06-23T22:15:03.862Z"
2668
+ updatedAt: "2026-06-24T01:20:06.650Z"
2522
2669
  },
2523
2670
  {
2524
2671
  id: "760513",
@@ -2528,17 +2675,17 @@ var schedule_2026_default = [
2528
2675
  city: "Kansas City, Missouri",
2529
2676
  country: "USA",
2530
2677
  home: {
2531
- code: "RD16 W7",
2678
+ code: "RD32",
2532
2679
  name: "Round of 16 7 Winner",
2533
2680
  flag: "\u{1F3F3}\uFE0F"
2534
2681
  },
2535
2682
  away: {
2536
- code: "RD16 W8",
2683
+ code: "RD32",
2537
2684
  name: "Round of 16 8 Winner",
2538
2685
  flag: "\u{1F3F3}\uFE0F"
2539
2686
  },
2540
2687
  status: "SCHEDULED",
2541
- updatedAt: "2026-06-23T22:15:03.862Z"
2688
+ updatedAt: "2026-06-24T01:20:06.650Z"
2542
2689
  },
2543
2690
  {
2544
2691
  id: "760514",
@@ -2548,17 +2695,17 @@ var schedule_2026_default = [
2548
2695
  city: "Arlington, Texas",
2549
2696
  country: "USA",
2550
2697
  home: {
2551
- code: "QFW1",
2698
+ code: "RD32",
2552
2699
  name: "Quarterfinal 1 Winner",
2553
2700
  flag: "\u{1F3F3}\uFE0F"
2554
2701
  },
2555
2702
  away: {
2556
- code: "QFW2",
2703
+ code: "RD32",
2557
2704
  name: "Quarterfinal 2 Winner",
2558
2705
  flag: "\u{1F3F3}\uFE0F"
2559
2706
  },
2560
2707
  status: "SCHEDULED",
2561
- updatedAt: "2026-06-23T22:15:03.862Z"
2708
+ updatedAt: "2026-06-24T01:20:06.650Z"
2562
2709
  },
2563
2710
  {
2564
2711
  id: "760515",
@@ -2568,17 +2715,17 @@ var schedule_2026_default = [
2568
2715
  city: "Atlanta, Georgia",
2569
2716
  country: "USA",
2570
2717
  home: {
2571
- code: "QFW3",
2718
+ code: "RD32",
2572
2719
  name: "Quarterfinal 3 Winner",
2573
2720
  flag: "\u{1F3F3}\uFE0F"
2574
2721
  },
2575
2722
  away: {
2576
- code: "QW4",
2723
+ code: "RD32",
2577
2724
  name: "Quarterfinal 4 Winner",
2578
2725
  flag: "\u{1F3F3}\uFE0F"
2579
2726
  },
2580
2727
  status: "SCHEDULED",
2581
- updatedAt: "2026-06-23T22:15:03.862Z"
2728
+ updatedAt: "2026-06-24T01:20:06.650Z"
2582
2729
  },
2583
2730
  {
2584
2731
  id: "760516",
@@ -2588,17 +2735,17 @@ var schedule_2026_default = [
2588
2735
  city: "Miami Gardens, Florida",
2589
2736
  country: "USA",
2590
2737
  home: {
2591
- code: "SF L1",
2738
+ code: "RD32",
2592
2739
  name: "Semifinal 1 Loser",
2593
2740
  flag: "\u{1F3F3}\uFE0F"
2594
2741
  },
2595
2742
  away: {
2596
- code: "SF L2",
2743
+ code: "RD32",
2597
2744
  name: "Semifinal 2 Loser",
2598
2745
  flag: "\u{1F3F3}\uFE0F"
2599
2746
  },
2600
2747
  status: "SCHEDULED",
2601
- updatedAt: "2026-06-23T22:15:03.932Z"
2748
+ updatedAt: "2026-06-24T01:20:06.749Z"
2602
2749
  },
2603
2750
  {
2604
2751
  id: "760517",
@@ -2608,24 +2755,72 @@ var schedule_2026_default = [
2608
2755
  city: "East Rutherford, New Jersey",
2609
2756
  country: "USA",
2610
2757
  home: {
2611
- code: "SFW1",
2758
+ code: "RD32",
2612
2759
  name: "Semifinal 1 Winner",
2613
2760
  flag: "\u{1F3F3}\uFE0F"
2614
2761
  },
2615
2762
  away: {
2616
- code: "SFW2",
2763
+ code: "RD32",
2617
2764
  name: "Semifinal 2 Winner",
2618
2765
  flag: "\u{1F3F3}\uFE0F"
2619
2766
  },
2620
2767
  status: "SCHEDULED",
2621
- updatedAt: "2026-06-23T22:15:03.932Z"
2768
+ updatedAt: "2026-06-24T01:20:06.749Z"
2622
2769
  }
2623
2770
  ];
2624
2771
 
2772
+ // src/bracket/placeholders.ts
2773
+ var PLACEHOLDER_FLAG = "\u{1F3F3}\uFE0F";
2774
+ function winnerName(stage, index) {
2775
+ switch (stage) {
2776
+ case "R32":
2777
+ return `Round of 32 ${index} Winner`;
2778
+ case "R16":
2779
+ return `Round of 16 ${index} Winner`;
2780
+ case "QF":
2781
+ return `Quarterfinal ${index} Winner`;
2782
+ case "SF":
2783
+ return `Semifinal ${index} Winner`;
2784
+ default:
2785
+ return `${stage}-${index} Winner`;
2786
+ }
2787
+ }
2788
+ function slotRefToTeam(ref) {
2789
+ switch (ref.kind) {
2790
+ case "group":
2791
+ return {
2792
+ code: ref.position === 1 ? `1${ref.group}` : `2${ref.group}`,
2793
+ name: ref.position === 1 ? `Group ${ref.group} Winner` : `Group ${ref.group} 2nd Place`,
2794
+ flag: PLACEHOLDER_FLAG
2795
+ };
2796
+ case "third":
2797
+ return {
2798
+ code: "3RD",
2799
+ name: `Third Place Group ${ref.groups.join("/")}`,
2800
+ flag: PLACEHOLDER_FLAG
2801
+ };
2802
+ case "winner":
2803
+ return { code: "RD32", name: winnerName(ref.stage, ref.index), flag: PLACEHOLDER_FLAG };
2804
+ case "loser":
2805
+ return {
2806
+ code: "RD32",
2807
+ name: `Semifinal ${ref.index} Loser`,
2808
+ flag: PLACEHOLDER_FLAG
2809
+ };
2810
+ case "seed":
2811
+ return { code: "TBD", name: ref.label, flag: PLACEHOLDER_FLAG };
2812
+ default:
2813
+ return { code: "TBD", name: "TBD", flag: PLACEHOLDER_FLAG };
2814
+ }
2815
+ }
2816
+ function isResolvedNation(team) {
2817
+ return team.flag !== PLACEHOLDER_FLAG;
2818
+ }
2819
+
2625
2820
  // src/schedule.ts
2626
2821
  var SCHEDULE = schedule_2026_default;
2627
- function sanitizeBundledFixture(m) {
2628
- return {
2822
+ function sanitizeBundledFixture(m, node) {
2823
+ const base = {
2629
2824
  id: m.id,
2630
2825
  stage: m.stage,
2631
2826
  group: m.group,
@@ -2638,6 +2833,14 @@ function sanitizeBundledFixture(m) {
2638
2833
  status: "SCHEDULED",
2639
2834
  updatedAt: m.updatedAt
2640
2835
  };
2836
+ if (node && m.stage !== "GROUP" && m.stage !== "FRIENDLY") {
2837
+ return {
2838
+ ...base,
2839
+ home: slotRefToTeam(node.home),
2840
+ away: slotRefToTeam(node.away)
2841
+ };
2842
+ }
2843
+ return base;
2641
2844
  }
2642
2845
  function allFixtures() {
2643
2846
  return SCHEDULE;
@@ -2698,11 +2901,11 @@ function blankRow(team) {
2698
2901
  }
2699
2902
  function computeStandings(matches) {
2700
2903
  const rows = /* @__PURE__ */ new Map();
2701
- const ensure = (t) => {
2702
- let r = rows.get(t.code);
2904
+ const ensure = (t2) => {
2905
+ let r = rows.get(t2.code);
2703
2906
  if (!r) {
2704
- r = blankRow(t);
2705
- rows.set(t.code, r);
2907
+ r = blankRow(t2);
2908
+ rows.set(t2.code, r);
2706
2909
  }
2707
2910
  return r;
2708
2911
  };
@@ -2793,10 +2996,10 @@ function toInt(s) {
2793
2996
  const n = parseInt(s, 10);
2794
2997
  return Number.isFinite(n) ? n : void 0;
2795
2998
  }
2796
- function toTeam(t) {
2797
- const name = t?.displayName ?? t?.name ?? t?.location ?? t?.shortDisplayName ?? "TBD";
2798
- const code = (t?.abbreviation ?? name.slice(0, 3)).toUpperCase();
2799
- return { code, name, flag: nationToFlag(t?.displayName ?? t?.abbreviation ?? name) };
2999
+ function toTeam(t2) {
3000
+ const name = t2?.displayName ?? t2?.name ?? t2?.location ?? t2?.shortDisplayName ?? "TBD";
3001
+ const code = (t2?.abbreviation ?? name.slice(0, 3)).toUpperCase();
3002
+ return { code, name, flag: nationToFlag(t2?.displayName ?? t2?.abbreviation ?? name) };
2800
3003
  }
2801
3004
  function mapEspnEvent(ev, ctx = {}) {
2802
3005
  const comp = ev.competitions?.[0];
@@ -2814,6 +3017,11 @@ function mapEspnEvent(ev, ctx = {}) {
2814
3017
  const hs = toInt(homeC?.score);
2815
3018
  const as = toInt(awayC?.score);
2816
3019
  const hasScore = status !== "SCHEDULED" && hs !== void 0 && as !== void 0;
3020
+ let winnerCode;
3021
+ if (isFinished(status)) {
3022
+ if (homeC?.winner) winnerCode = home.code;
3023
+ else if (awayC?.winner) winnerCode = away.code;
3024
+ }
2817
3025
  return {
2818
3026
  id: ev.id,
2819
3027
  stage,
@@ -2827,6 +3035,7 @@ function mapEspnEvent(ev, ctx = {}) {
2827
3035
  score: hasScore ? { home: hs, away: as } : void 0,
2828
3036
  minute: parseMinute(ev.status ?? comp?.status),
2829
3037
  status,
3038
+ winnerCode,
2830
3039
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2831
3040
  };
2832
3041
  }
@@ -2918,7 +3127,7 @@ var EspnAdapter = class {
2918
3127
  const map = {};
2919
3128
  try {
2920
3129
  const tables = parseStandings(await this.get(this.standingsUrl()));
2921
- for (const t of tables) for (const r of t.rows) map[r.team.code] = t.group;
3130
+ for (const t2 of tables) for (const r of t2.rows) map[r.team.code] = t2.group;
2922
3131
  } catch {
2923
3132
  }
2924
3133
  this.groupMap = map;
@@ -2955,6 +3164,854 @@ var EspnAdapter = class {
2955
3164
  }
2956
3165
  };
2957
3166
 
3167
+ // src/bracket/parse.ts
3168
+ var PLACEHOLDER_FLAG2 = "\u{1F3F3}\uFE0F";
3169
+ function parseTeamSlot(team) {
3170
+ const name = team.name;
3171
+ let m = name.match(/^Group ([A-L]) Winner$/);
3172
+ if (m) return { kind: "group", position: 1, group: m[1] };
3173
+ m = name.match(/^Group ([A-L]) 2nd Place$/);
3174
+ if (m) return { kind: "group", position: 2, group: m[1] };
3175
+ m = name.match(/^Third Place Group ([A-L](?:\/[A-L])+)$/);
3176
+ if (m) return { kind: "third", groups: m[1].split("/") };
3177
+ m = name.match(/^Round of 32 (\d+) Winner$/);
3178
+ if (m) return { kind: "winner", stage: "R32", index: Number(m[1]) };
3179
+ m = name.match(/^Round of 16 (\d+) Winner$/);
3180
+ if (m) return { kind: "winner", stage: "R16", index: Number(m[1]) };
3181
+ m = name.match(/^Quarterfinal (\d+) Winner$/);
3182
+ if (m) return { kind: "winner", stage: "QF", index: Number(m[1]) };
3183
+ m = name.match(/^Semifinal (\d+) Winner$/);
3184
+ if (m) return { kind: "winner", stage: "SF", index: Number(m[1]) };
3185
+ m = name.match(/^Semifinal (\d+) Loser$/);
3186
+ if (m) return { kind: "loser", stage: "SF", index: Number(m[1]) };
3187
+ if (isResolvedNation(team)) {
3188
+ return { kind: "seed", label: team.name, code: "TBD" };
3189
+ }
3190
+ if (team.flag === PLACEHOLDER_FLAG2 && team.code === "TBD") {
3191
+ return { kind: "seed", label: team.name, code: "TBD" };
3192
+ }
3193
+ return null;
3194
+ }
3195
+
3196
+ // src/bracket/types.ts
3197
+ var BRACKET_STAGE_ORDER = ["R32", "R16", "QF", "SF", "3P", "F"];
3198
+ var EXPECTED_KNOCKOUT_COUNTS = {
3199
+ R32: 16,
3200
+ R16: 8,
3201
+ QF: 4,
3202
+ SF: 2,
3203
+ "3P": 1,
3204
+ F: 1
3205
+ };
3206
+ function teamFromMatch(match, code) {
3207
+ if (match.home.code === code) return match.home;
3208
+ if (match.away.code === code) return match.away;
3209
+ return void 0;
3210
+ }
3211
+
3212
+ // src/bracket/build.ts
3213
+ function matchKey(stage, index) {
3214
+ return `${stage}:${index}`;
3215
+ }
3216
+ function orderByBracketIndex(matches) {
3217
+ return [...matches].sort((a, b) => Number(a.id) - Number(b.id));
3218
+ }
3219
+ function buildBracketTopology(matches, generatedAt) {
3220
+ const knockout = matches.filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3221
+ const problems = [];
3222
+ const nodes = [];
3223
+ for (const stage of BRACKET_STAGE_ORDER) {
3224
+ const stageMatches = orderByBracketIndex(knockout.filter((m) => m.stage === stage));
3225
+ const expected = EXPECTED_KNOCKOUT_COUNTS[stage];
3226
+ if (expected != null && stageMatches.length !== expected) {
3227
+ problems.push(`stage ${stage}: expected ${expected}, got ${stageMatches.length}`);
3228
+ }
3229
+ stageMatches.forEach((m, i) => {
3230
+ const home = parseTeamSlot(m.home);
3231
+ const away = parseTeamSlot(m.away);
3232
+ if (!home) problems.push(`${m.id}: unparsed home slot "${m.home.name}"`);
3233
+ if (!away) problems.push(`${m.id}: unparsed away slot "${m.away.name}"`);
3234
+ if (home && away) {
3235
+ nodes.push({ matchId: m.id, stage, index: i + 1, home, away });
3236
+ }
3237
+ });
3238
+ }
3239
+ const knockoutIds = new Set(knockout.map((m) => m.id));
3240
+ const topologyIds = new Set(nodes.map((n) => n.matchId));
3241
+ for (const id of knockoutIds) {
3242
+ if (!topologyIds.has(id)) problems.push(`knockout fixture ${id} missing from topology`);
3243
+ }
3244
+ for (const id of topologyIds) {
3245
+ if (!knockoutIds.has(id)) problems.push(`topology match ${id} not in knockout schedule`);
3246
+ }
3247
+ validateWinnerChain(nodes, problems);
3248
+ validateThirdPlace(nodes, problems);
3249
+ validateBracketIndexing(knockout, nodes, problems);
3250
+ if (problems.length > 0) {
3251
+ throw new Error(
3252
+ `bracket topology validation failed:
3253
+ ${problems.map((p) => ` - ${p}`).join("\n")}`
3254
+ );
3255
+ }
3256
+ return { generatedAt, stages: [...BRACKET_STAGE_ORDER], matches: nodes };
3257
+ }
3258
+ function validateBracketIndexing(knockout, nodes, problems) {
3259
+ for (const stage of ["R32", "R16"]) {
3260
+ const byKickoff2 = [...knockout.filter((m) => m.stage === stage)].sort(
3261
+ (a, b) => a.kickoff.localeCompare(b.kickoff)
3262
+ );
3263
+ const byId = orderByBracketIndex(knockout.filter((m) => m.stage === stage));
3264
+ const kickoffIds = byKickoff2.map((m) => m.id).join(",");
3265
+ const idIds = byId.map((m) => m.id).join(",");
3266
+ if (kickoffIds !== idIds) {
3267
+ const diverged = byKickoff2.map((m, i) => ({ kickoffRank: i + 1, idRank: byId.findIndex((x) => x.id === m.id) + 1, id: m.id })).filter((x) => x.kickoffRank !== x.idRank);
3268
+ if (diverged.length > 0 && stage === "R32") {
3269
+ const r32ById = new Map(nodes.filter((n) => n.stage === "R32").map((n) => [n.index, n.matchId]));
3270
+ const r16First = nodes.find((n) => n.stage === "R16" && n.index === 1);
3271
+ if (r16First) {
3272
+ const home = r16First.home;
3273
+ const away = r16First.away;
3274
+ if (home.kind === "winner" && home.stage === "R32") {
3275
+ const expectedId = r32ById.get(home.index);
3276
+ if (!expectedId) {
3277
+ problems.push(`R32 index ${home.index} missing for R16-1 home ref`);
3278
+ }
3279
+ }
3280
+ if (away.kind === "winner" && away.stage === "R32") {
3281
+ const expectedId = r32ById.get(away.index);
3282
+ if (!expectedId) {
3283
+ problems.push(`R32 index ${away.index} missing for R16-1 away ref`);
3284
+ }
3285
+ }
3286
+ }
3287
+ }
3288
+ }
3289
+ }
3290
+ }
3291
+ function validateWinnerChain(nodes, problems) {
3292
+ const indexMap = new Map(nodes.map((n) => [matchKey(n.stage, n.index), n]));
3293
+ const chains = [
3294
+ { from: "R32", to: "R16", count: 16 },
3295
+ { from: "R16", to: "QF", count: 8 },
3296
+ { from: "QF", to: "SF", count: 4 },
3297
+ { from: "SF", to: "F", count: 2 }
3298
+ ];
3299
+ for (const { from, to, count } of chains) {
3300
+ const refs = nodes.filter((n) => n.stage === to).flatMap((n) => [n.home, n.away]).filter((r) => r.kind === "winner" && r.stage === from);
3301
+ const indices = refs.map((r) => r.index);
3302
+ if (indices.length !== count) {
3303
+ problems.push(`${to}: expected ${count} ${from} winner refs, got ${indices.length}`);
3304
+ }
3305
+ const unique = new Set(indices);
3306
+ if (unique.size !== count) {
3307
+ problems.push(`${to}: ${from} winner indices must be unique 1..${count}`);
3308
+ }
3309
+ for (let i = 1; i <= count; i++) {
3310
+ if (!unique.has(i)) problems.push(`${to}: missing ${from} winner index ${i}`);
3311
+ if (!indexMap.has(matchKey(from, i))) problems.push(`missing ${from} match index ${i}`);
3312
+ }
3313
+ }
3314
+ }
3315
+ function validateThirdPlace(nodes, problems) {
3316
+ const third = nodes.find((n) => n.stage === "3P");
3317
+ if (!third) {
3318
+ problems.push("missing third-place play-off node");
3319
+ return;
3320
+ }
3321
+ const slots = [third.home, third.away];
3322
+ const indices = /* @__PURE__ */ new Set();
3323
+ for (const slot of slots) {
3324
+ if (slot.kind !== "loser" || slot.stage !== "SF") {
3325
+ problems.push("3P slots must reference SF losers");
3326
+ return;
3327
+ }
3328
+ indices.add(slot.index);
3329
+ }
3330
+ if (!indices.has(1) || !indices.has(2)) {
3331
+ problems.push("3P must reference Semifinal 1 Loser and Semifinal 2 Loser");
3332
+ }
3333
+ }
3334
+
3335
+ // src/bracket/resolve.ts
3336
+ function isGroupComplete(group, tables, standingsDegraded) {
3337
+ if (standingsDegraded) return false;
3338
+ const table = tables.find((t2) => t2.group === group);
3339
+ if (!table?.rows.length || table.rows.length !== 4) return false;
3340
+ return table.rows.every((r) => r.played >= 3);
3341
+ }
3342
+ function teamFromStandings(group, position, tables) {
3343
+ const table = tables.find((t2) => t2.group === group);
3344
+ if (!table) return void 0;
3345
+ const row = table.rows[position - 1];
3346
+ return row?.team;
3347
+ }
3348
+ function resolveWinner(match) {
3349
+ if (!isFinished(match.status)) return void 0;
3350
+ if (match.winnerCode) {
3351
+ const w = teamFromMatch(match, match.winnerCode);
3352
+ if (w && w.flag !== "\u{1F3F3}\uFE0F") return w;
3353
+ }
3354
+ if (!match.score) return void 0;
3355
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3356
+ if (outcome === "H") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3357
+ if (outcome === "A") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3358
+ return void 0;
3359
+ }
3360
+ function resolveLoser(match) {
3361
+ if (!isFinished(match.status)) return void 0;
3362
+ if (match.winnerCode) {
3363
+ const winner = teamFromMatch(match, match.winnerCode);
3364
+ if (winner?.code === match.home.code) {
3365
+ return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3366
+ }
3367
+ if (winner?.code === match.away.code) {
3368
+ return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3369
+ }
3370
+ }
3371
+ if (!match.score) return void 0;
3372
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3373
+ if (outcome === "H") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3374
+ if (outcome === "A") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3375
+ return void 0;
3376
+ }
3377
+ function participant(team, status) {
3378
+ return { label: team.name, flag: team.flag, code: team.code, status };
3379
+ }
3380
+ function tbd(label) {
3381
+ return { label, flag: "\u{1F3F3}\uFE0F", status: "tbd" };
3382
+ }
3383
+ function winnerLabel(ctx, stage, index) {
3384
+ return t(ctx.lang, "bracket.slot.winner", {
3385
+ stage: stageLabelI18n(ctx.lang, stage),
3386
+ n: String(index)
3387
+ });
3388
+ }
3389
+ function resolveSlot(ref, ctx) {
3390
+ switch (ref.kind) {
3391
+ case "seed":
3392
+ return tbd(ref.label);
3393
+ case "group": {
3394
+ if (isGroupComplete(ref.group, ctx.tables, ctx.standingsDegraded)) {
3395
+ const team = teamFromStandings(ref.group, ref.position, ctx.tables);
3396
+ if (team) return participant(team, "projected");
3397
+ }
3398
+ const label = ref.position === 1 ? t(ctx.lang, "bracket.slot.groupWinner", { group: ref.group }) : t(ctx.lang, "bracket.slot.groupSecond", { group: ref.group });
3399
+ return tbd(label);
3400
+ }
3401
+ case "third":
3402
+ return tbd(t(ctx.lang, "bracket.slot.third", { groups: ref.groups.join("/") }));
3403
+ case "winner": {
3404
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3405
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3406
+ if (match) {
3407
+ const winner = resolveWinner(match);
3408
+ if (winner) return participant(winner, "confirmed");
3409
+ }
3410
+ return tbd(winnerLabel(ctx, ref.stage, ref.index));
3411
+ }
3412
+ case "loser": {
3413
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3414
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3415
+ if (match) {
3416
+ const loser = resolveLoser(match);
3417
+ if (loser) return participant(loser, "confirmed");
3418
+ }
3419
+ return tbd(
3420
+ t(ctx.lang, "bracket.slot.loser", {
3421
+ stage: stageLabelI18n(ctx.lang, ref.stage),
3422
+ n: String(ref.index)
3423
+ })
3424
+ );
3425
+ }
3426
+ default:
3427
+ return tbd(t(ctx.lang, "bracket.slot.tbd"));
3428
+ }
3429
+ }
3430
+ function buildBracketView(topology, matches, tables, standingsDegraded, liveDegraded, filterStage, lang) {
3431
+ const knockout = matches.filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3432
+ const matchesById = new Map(knockout.map((m) => [m.id, m]));
3433
+ const nodesByKey = new Map(topology.matches.map((n) => [matchKey(n.stage, n.index), n]));
3434
+ const ctx = { nodesByKey, matchesById, tables, standingsDegraded, lang };
3435
+ const want = filterStage?.toUpperCase();
3436
+ const stages = [];
3437
+ for (const stage of topology.stages) {
3438
+ if (want && stage !== want) continue;
3439
+ const nodes = topology.matches.filter((n) => n.stage === stage);
3440
+ const matchViews = nodes.map((node) => {
3441
+ const match = matchesById.get(node.matchId) ?? {
3442
+ id: node.matchId,
3443
+ stage: node.stage,
3444
+ kickoff: "",
3445
+ venue: "",
3446
+ home: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3447
+ away: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3448
+ status: "SCHEDULED",
3449
+ updatedAt: ""
3450
+ };
3451
+ return {
3452
+ matchId: node.matchId,
3453
+ stage: node.stage,
3454
+ index: node.index,
3455
+ kickoff: match.kickoff,
3456
+ home: resolveSlot(node.home, ctx),
3457
+ away: resolveSlot(node.away, ctx),
3458
+ match
3459
+ };
3460
+ });
3461
+ stages.push({
3462
+ stage,
3463
+ label: stageLabelI18n(lang, stage),
3464
+ matches: matchViews
3465
+ });
3466
+ }
3467
+ return {
3468
+ stages,
3469
+ degraded: liveDegraded,
3470
+ standingsDegraded
3471
+ };
3472
+ }
3473
+
3474
+ // src/data/bracket.2026.json
3475
+ var bracket_2026_default = {
3476
+ generatedAt: "2026-06-24T01:20:06.749Z",
3477
+ stages: [
3478
+ "R32",
3479
+ "R16",
3480
+ "QF",
3481
+ "SF",
3482
+ "3P",
3483
+ "F"
3484
+ ],
3485
+ matches: [
3486
+ {
3487
+ matchId: "760486",
3488
+ stage: "R32",
3489
+ index: 1,
3490
+ home: {
3491
+ kind: "group",
3492
+ position: 2,
3493
+ group: "A"
3494
+ },
3495
+ away: {
3496
+ kind: "group",
3497
+ position: 2,
3498
+ group: "B"
3499
+ }
3500
+ },
3501
+ {
3502
+ matchId: "760487",
3503
+ stage: "R32",
3504
+ index: 2,
3505
+ home: {
3506
+ kind: "group",
3507
+ position: 1,
3508
+ group: "C"
3509
+ },
3510
+ away: {
3511
+ kind: "group",
3512
+ position: 2,
3513
+ group: "F"
3514
+ }
3515
+ },
3516
+ {
3517
+ matchId: "760488",
3518
+ stage: "R32",
3519
+ index: 3,
3520
+ home: {
3521
+ kind: "group",
3522
+ position: 1,
3523
+ group: "F"
3524
+ },
3525
+ away: {
3526
+ kind: "group",
3527
+ position: 2,
3528
+ group: "C"
3529
+ }
3530
+ },
3531
+ {
3532
+ matchId: "760489",
3533
+ stage: "R32",
3534
+ index: 4,
3535
+ home: {
3536
+ kind: "seed",
3537
+ label: "Germany",
3538
+ code: "TBD"
3539
+ },
3540
+ away: {
3541
+ kind: "third",
3542
+ groups: [
3543
+ "A",
3544
+ "B",
3545
+ "C",
3546
+ "D",
3547
+ "F"
3548
+ ]
3549
+ }
3550
+ },
3551
+ {
3552
+ matchId: "760490",
3553
+ stage: "R32",
3554
+ index: 5,
3555
+ home: {
3556
+ kind: "group",
3557
+ position: 2,
3558
+ group: "E"
3559
+ },
3560
+ away: {
3561
+ kind: "group",
3562
+ position: 2,
3563
+ group: "I"
3564
+ }
3565
+ },
3566
+ {
3567
+ matchId: "760491",
3568
+ stage: "R32",
3569
+ index: 6,
3570
+ home: {
3571
+ kind: "seed",
3572
+ label: "Mexico",
3573
+ code: "TBD"
3574
+ },
3575
+ away: {
3576
+ kind: "third",
3577
+ groups: [
3578
+ "C",
3579
+ "E",
3580
+ "F",
3581
+ "H",
3582
+ "I"
3583
+ ]
3584
+ }
3585
+ },
3586
+ {
3587
+ matchId: "760492",
3588
+ stage: "R32",
3589
+ index: 7,
3590
+ home: {
3591
+ kind: "group",
3592
+ position: 1,
3593
+ group: "I"
3594
+ },
3595
+ away: {
3596
+ kind: "third",
3597
+ groups: [
3598
+ "C",
3599
+ "D",
3600
+ "F",
3601
+ "G",
3602
+ "H"
3603
+ ]
3604
+ }
3605
+ },
3606
+ {
3607
+ matchId: "760493",
3608
+ stage: "R32",
3609
+ index: 8,
3610
+ home: {
3611
+ kind: "group",
3612
+ position: 1,
3613
+ group: "G"
3614
+ },
3615
+ away: {
3616
+ kind: "third",
3617
+ groups: [
3618
+ "A",
3619
+ "E",
3620
+ "H",
3621
+ "I",
3622
+ "J"
3623
+ ]
3624
+ }
3625
+ },
3626
+ {
3627
+ matchId: "760494",
3628
+ stage: "R32",
3629
+ index: 9,
3630
+ home: {
3631
+ kind: "seed",
3632
+ label: "United States",
3633
+ code: "TBD"
3634
+ },
3635
+ away: {
3636
+ kind: "third",
3637
+ groups: [
3638
+ "B",
3639
+ "E",
3640
+ "F",
3641
+ "I",
3642
+ "J"
3643
+ ]
3644
+ }
3645
+ },
3646
+ {
3647
+ matchId: "760495",
3648
+ stage: "R32",
3649
+ index: 10,
3650
+ home: {
3651
+ kind: "group",
3652
+ position: 1,
3653
+ group: "L"
3654
+ },
3655
+ away: {
3656
+ kind: "third",
3657
+ groups: [
3658
+ "E",
3659
+ "H",
3660
+ "I",
3661
+ "J",
3662
+ "K"
3663
+ ]
3664
+ }
3665
+ },
3666
+ {
3667
+ matchId: "760496",
3668
+ stage: "R32",
3669
+ index: 11,
3670
+ home: {
3671
+ kind: "group",
3672
+ position: 2,
3673
+ group: "K"
3674
+ },
3675
+ away: {
3676
+ kind: "group",
3677
+ position: 2,
3678
+ group: "L"
3679
+ }
3680
+ },
3681
+ {
3682
+ matchId: "760497",
3683
+ stage: "R32",
3684
+ index: 12,
3685
+ home: {
3686
+ kind: "group",
3687
+ position: 1,
3688
+ group: "H"
3689
+ },
3690
+ away: {
3691
+ kind: "group",
3692
+ position: 2,
3693
+ group: "J"
3694
+ }
3695
+ },
3696
+ {
3697
+ matchId: "760498",
3698
+ stage: "R32",
3699
+ index: 13,
3700
+ home: {
3701
+ kind: "group",
3702
+ position: 1,
3703
+ group: "B"
3704
+ },
3705
+ away: {
3706
+ kind: "third",
3707
+ groups: [
3708
+ "E",
3709
+ "F",
3710
+ "G",
3711
+ "I",
3712
+ "J"
3713
+ ]
3714
+ }
3715
+ },
3716
+ {
3717
+ matchId: "760499",
3718
+ stage: "R32",
3719
+ index: 14,
3720
+ home: {
3721
+ kind: "group",
3722
+ position: 2,
3723
+ group: "D"
3724
+ },
3725
+ away: {
3726
+ kind: "group",
3727
+ position: 2,
3728
+ group: "G"
3729
+ }
3730
+ },
3731
+ {
3732
+ matchId: "760500",
3733
+ stage: "R32",
3734
+ index: 15,
3735
+ home: {
3736
+ kind: "seed",
3737
+ label: "Argentina",
3738
+ code: "TBD"
3739
+ },
3740
+ away: {
3741
+ kind: "group",
3742
+ position: 2,
3743
+ group: "H"
3744
+ }
3745
+ },
3746
+ {
3747
+ matchId: "760501",
3748
+ stage: "R32",
3749
+ index: 16,
3750
+ home: {
3751
+ kind: "group",
3752
+ position: 1,
3753
+ group: "K"
3754
+ },
3755
+ away: {
3756
+ kind: "third",
3757
+ groups: [
3758
+ "D",
3759
+ "E",
3760
+ "I",
3761
+ "J",
3762
+ "L"
3763
+ ]
3764
+ }
3765
+ },
3766
+ {
3767
+ matchId: "760502",
3768
+ stage: "R16",
3769
+ index: 1,
3770
+ home: {
3771
+ kind: "winner",
3772
+ stage: "R32",
3773
+ index: 1
3774
+ },
3775
+ away: {
3776
+ kind: "winner",
3777
+ stage: "R32",
3778
+ index: 3
3779
+ }
3780
+ },
3781
+ {
3782
+ matchId: "760503",
3783
+ stage: "R16",
3784
+ index: 2,
3785
+ home: {
3786
+ kind: "winner",
3787
+ stage: "R32",
3788
+ index: 2
3789
+ },
3790
+ away: {
3791
+ kind: "winner",
3792
+ stage: "R32",
3793
+ index: 5
3794
+ }
3795
+ },
3796
+ {
3797
+ matchId: "760504",
3798
+ stage: "R16",
3799
+ index: 3,
3800
+ home: {
3801
+ kind: "winner",
3802
+ stage: "R32",
3803
+ index: 4
3804
+ },
3805
+ away: {
3806
+ kind: "winner",
3807
+ stage: "R32",
3808
+ index: 6
3809
+ }
3810
+ },
3811
+ {
3812
+ matchId: "760505",
3813
+ stage: "R16",
3814
+ index: 4,
3815
+ home: {
3816
+ kind: "winner",
3817
+ stage: "R32",
3818
+ index: 7
3819
+ },
3820
+ away: {
3821
+ kind: "winner",
3822
+ stage: "R32",
3823
+ index: 8
3824
+ }
3825
+ },
3826
+ {
3827
+ matchId: "760506",
3828
+ stage: "R16",
3829
+ index: 5,
3830
+ home: {
3831
+ kind: "winner",
3832
+ stage: "R32",
3833
+ index: 11
3834
+ },
3835
+ away: {
3836
+ kind: "winner",
3837
+ stage: "R32",
3838
+ index: 12
3839
+ }
3840
+ },
3841
+ {
3842
+ matchId: "760507",
3843
+ stage: "R16",
3844
+ index: 6,
3845
+ home: {
3846
+ kind: "winner",
3847
+ stage: "R32",
3848
+ index: 9
3849
+ },
3850
+ away: {
3851
+ kind: "winner",
3852
+ stage: "R32",
3853
+ index: 10
3854
+ }
3855
+ },
3856
+ {
3857
+ matchId: "760508",
3858
+ stage: "R16",
3859
+ index: 7,
3860
+ home: {
3861
+ kind: "winner",
3862
+ stage: "R32",
3863
+ index: 13
3864
+ },
3865
+ away: {
3866
+ kind: "winner",
3867
+ stage: "R32",
3868
+ index: 15
3869
+ }
3870
+ },
3871
+ {
3872
+ matchId: "760509",
3873
+ stage: "R16",
3874
+ index: 8,
3875
+ home: {
3876
+ kind: "winner",
3877
+ stage: "R32",
3878
+ index: 14
3879
+ },
3880
+ away: {
3881
+ kind: "winner",
3882
+ stage: "R32",
3883
+ index: 16
3884
+ }
3885
+ },
3886
+ {
3887
+ matchId: "760510",
3888
+ stage: "QF",
3889
+ index: 1,
3890
+ home: {
3891
+ kind: "winner",
3892
+ stage: "R16",
3893
+ index: 1
3894
+ },
3895
+ away: {
3896
+ kind: "winner",
3897
+ stage: "R16",
3898
+ index: 2
3899
+ }
3900
+ },
3901
+ {
3902
+ matchId: "760511",
3903
+ stage: "QF",
3904
+ index: 2,
3905
+ home: {
3906
+ kind: "winner",
3907
+ stage: "R16",
3908
+ index: 5
3909
+ },
3910
+ away: {
3911
+ kind: "winner",
3912
+ stage: "R16",
3913
+ index: 6
3914
+ }
3915
+ },
3916
+ {
3917
+ matchId: "760512",
3918
+ stage: "QF",
3919
+ index: 3,
3920
+ home: {
3921
+ kind: "winner",
3922
+ stage: "R16",
3923
+ index: 3
3924
+ },
3925
+ away: {
3926
+ kind: "winner",
3927
+ stage: "R16",
3928
+ index: 4
3929
+ }
3930
+ },
3931
+ {
3932
+ matchId: "760513",
3933
+ stage: "QF",
3934
+ index: 4,
3935
+ home: {
3936
+ kind: "winner",
3937
+ stage: "R16",
3938
+ index: 7
3939
+ },
3940
+ away: {
3941
+ kind: "winner",
3942
+ stage: "R16",
3943
+ index: 8
3944
+ }
3945
+ },
3946
+ {
3947
+ matchId: "760514",
3948
+ stage: "SF",
3949
+ index: 1,
3950
+ home: {
3951
+ kind: "winner",
3952
+ stage: "QF",
3953
+ index: 1
3954
+ },
3955
+ away: {
3956
+ kind: "winner",
3957
+ stage: "QF",
3958
+ index: 2
3959
+ }
3960
+ },
3961
+ {
3962
+ matchId: "760515",
3963
+ stage: "SF",
3964
+ index: 2,
3965
+ home: {
3966
+ kind: "winner",
3967
+ stage: "QF",
3968
+ index: 3
3969
+ },
3970
+ away: {
3971
+ kind: "winner",
3972
+ stage: "QF",
3973
+ index: 4
3974
+ }
3975
+ },
3976
+ {
3977
+ matchId: "760516",
3978
+ stage: "3P",
3979
+ index: 1,
3980
+ home: {
3981
+ kind: "loser",
3982
+ stage: "SF",
3983
+ index: 1
3984
+ },
3985
+ away: {
3986
+ kind: "loser",
3987
+ stage: "SF",
3988
+ index: 2
3989
+ }
3990
+ },
3991
+ {
3992
+ matchId: "760517",
3993
+ stage: "F",
3994
+ index: 1,
3995
+ home: {
3996
+ kind: "winner",
3997
+ stage: "SF",
3998
+ index: 1
3999
+ },
4000
+ away: {
4001
+ kind: "winner",
4002
+ stage: "SF",
4003
+ index: 2
4004
+ }
4005
+ }
4006
+ ]
4007
+ };
4008
+
4009
+ // src/bracket/topology.ts
4010
+ var TOPOLOGY = bracket_2026_default;
4011
+ function loadBracketTopology() {
4012
+ return TOPOLOGY;
4013
+ }
4014
+
2958
4015
  // src/live.ts
2959
4016
  function resolveCompetition(explicit) {
2960
4017
  if (explicit) return explicit;
@@ -2996,7 +4053,7 @@ async function getStandings(adapter, group) {
2996
4053
  if (adapter.fetchStandings) {
2997
4054
  try {
2998
4055
  const all = await adapter.fetchStandings();
2999
- const tables2 = (want ? all.filter((t) => t.group === want) : all).sort(
4056
+ const tables2 = (want ? all.filter((t2) => t2.group === want) : all).sort(
3000
4057
  (a, b) => a.group.localeCompare(b.group)
3001
4058
  );
3002
4059
  return { tables: tables2, degraded: false, source: adapter.name };
@@ -3004,9 +4061,45 @@ async function getStandings(adapter, group) {
3004
4061
  }
3005
4062
  }
3006
4063
  const letters = want ? [want] : groups();
3007
- const tables = letters.map((g) => ({ group: g, rows: rosterAtZero(fixturesByGroup(g)) })).filter((t) => t.rows.length > 0);
4064
+ const tables = letters.map((g) => ({ group: g, rows: rosterAtZero(fixturesByGroup(g)) })).filter((t2) => t2.rows.length > 0);
3008
4065
  return { tables, degraded: true };
3009
4066
  }
4067
+ var KNOCKOUT_WINDOW_START = "20260628";
4068
+ var KNOCKOUT_WINDOW_END = "20260719";
4069
+ async function getBracket(adapter, opts = {}) {
4070
+ const topology = loadBracketTopology();
4071
+ const base = allFixtures().filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
4072
+ let matches = base;
4073
+ let liveDegraded = true;
4074
+ let source;
4075
+ try {
4076
+ const live = adapter.fetchWindow ? await adapter.fetchWindow(KNOCKOUT_WINDOW_START, KNOCKOUT_WINDOW_END) : [];
4077
+ matches = mergeLive(base, live);
4078
+ liveDegraded = false;
4079
+ source = adapter.name;
4080
+ } catch {
4081
+ }
4082
+ const standings = await getStandings(adapter);
4083
+ if (!source && !standings.degraded && standings.source) {
4084
+ source = standings.source;
4085
+ }
4086
+ const view = buildBracketView(
4087
+ topology,
4088
+ matches,
4089
+ standings.tables,
4090
+ standings.degraded,
4091
+ liveDegraded,
4092
+ opts.stage,
4093
+ opts.lang
4094
+ );
4095
+ if (source) view.source = source;
4096
+ return {
4097
+ view,
4098
+ degraded: liveDegraded,
4099
+ standingsDegraded: standings.degraded,
4100
+ source
4101
+ };
4102
+ }
3010
4103
  function shiftUtcDate(dateISO, days) {
3011
4104
  const [y, m, d] = dateISO.slice(0, 10).split("-").map(Number);
3012
4105
  return new Date(Date.UTC(y ?? 1970, (m ?? 1) - 1, (d ?? 1) + days)).toISOString().slice(0, 10);
@@ -3164,9 +4257,9 @@ function outcomeLabel(o, match) {
3164
4257
  return o.label;
3165
4258
  }
3166
4259
  function utcHhmm(iso) {
3167
- const t = Date.parse(iso);
3168
- if (!Number.isFinite(t)) return "";
3169
- return `${new Date(t).toISOString().slice(11, 16)} UTC`;
4260
+ const t2 = Date.parse(iso);
4261
+ if (!Number.isFinite(t2)) return "";
4262
+ return `${new Date(t2).toISOString().slice(11, 16)} UTC`;
3170
4263
  }
3171
4264
  function marketFavoriteText(signal, match) {
3172
4265
  const fav = signal.favorite;
@@ -3614,7 +4707,134 @@ function formatShareTable(input, options = {}) {
3614
4707
  );
3615
4708
  return blocks.join("\n\n");
3616
4709
  }
4710
+
4711
+ // src/bracket/format.ts
4712
+ function formatParticipant(p, side, flags, locale) {
4713
+ const suffix = p.status === "projected" ? ` ${t(locale, "bracket.projected")}` : "";
4714
+ if (!flags || p.flag === "\u{1F3F3}\uFE0F") {
4715
+ if (p.code && p.code !== "TBD") return `${p.code}${suffix}`;
4716
+ return `${p.label}${suffix}`;
4717
+ }
4718
+ if (side === "home") return `${p.flag} ${p.label}${suffix}`;
4719
+ return `${p.label}${suffix} ${p.flag}`;
4720
+ }
4721
+ function statusTail2(m) {
4722
+ if (m.status === "LIVE" && m.minute) return ` ${m.minute}'`;
4723
+ if (m.status === "HT") return " HT";
4724
+ if (m.status === "FT") return " FT";
4725
+ if (isLive(m.status)) return " LIVE";
4726
+ return "";
4727
+ }
4728
+ function formatBracketMatchLine(mv, opts = {}) {
4729
+ const flags = opts.flags !== false;
4730
+ const home = formatParticipant(mv.home, "home", flags, opts.locale);
4731
+ const away = formatParticipant(mv.away, "away", flags, opts.locale);
4732
+ const m = mv.match;
4733
+ if (isFinished(m.status) || isLive(m.status)) {
4734
+ return ` ${home} ${scoreline(m)} ${away}${statusTail2(m)}`;
4735
+ }
4736
+ const kickoff = mv.kickoff ? formatKickoff(mv.kickoff, { tz: opts.tz, locale: opts.locale }) : "";
4737
+ return ` ${home} vs ${away}${kickoff ? ` \xB7 ${kickoff}` : ""}`;
4738
+ }
4739
+ function formatBracketList(view, opts = {}) {
4740
+ const blocks = [];
4741
+ for (const stage of view.stages) {
4742
+ blocks.push(stage.label);
4743
+ for (const mv of stage.matches) {
4744
+ blocks.push(formatBracketMatchLine(mv, opts));
4745
+ }
4746
+ blocks.push("");
4747
+ }
4748
+ if (opts.footer !== false) {
4749
+ if (view.degraded) {
4750
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4751
+ } else if (view.standingsDegraded) {
4752
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4753
+ }
4754
+ if (view.source) {
4755
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4756
+ }
4757
+ }
4758
+ return blocks.join("\n").trimEnd();
4759
+ }
4760
+ var MIN_TREE_WIDTH = 80;
4761
+ function formatBracketTree(view, opts = {}) {
4762
+ const width = opts.width ?? 80;
4763
+ if (width < MIN_TREE_WIDTH) return null;
4764
+ const blocks = [];
4765
+ for (let i = 0; i < view.stages.length; i++) {
4766
+ const stage = view.stages[i];
4767
+ blocks.push(`\u2501\u2501\u2501 ${stage.label} \u2501\u2501\u2501`);
4768
+ for (const mv of stage.matches) {
4769
+ blocks.push(formatBracketMatchLine(mv, opts));
4770
+ }
4771
+ if (i < view.stages.length - 1) {
4772
+ blocks.push(" \u2502");
4773
+ blocks.push(" \u25BC");
4774
+ }
4775
+ blocks.push("");
4776
+ }
4777
+ if (opts.footer !== false) {
4778
+ if (view.degraded) {
4779
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4780
+ } else if (view.standingsDegraded) {
4781
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4782
+ }
4783
+ if (view.source) {
4784
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4785
+ }
4786
+ }
4787
+ return blocks.join("\n").trimEnd();
4788
+ }
4789
+ function formatShareBracket(input, options = {}) {
4790
+ const includeHashtag = options.includeHashtag !== false;
4791
+ const includeInstall = options.includeInstallLine !== false;
4792
+ const locale = options.locale;
4793
+ const blocks = [t(locale, "bracket.shareTitle"), ""];
4794
+ if (input.view.stages.length === 0) {
4795
+ blocks.push(input.emptyNote ?? t(locale, "bracket.empty"));
4796
+ } else if ((options.style ?? "social") === "compact") {
4797
+ const fmtOpts = { locale, tz: options.tz };
4798
+ const lines = input.view.stages.flatMap(
4799
+ (stage) => stage.matches.map((mv) => formatBracketCompactLine(mv, fmtOpts))
4800
+ );
4801
+ blocks.push(lines.join("\n"));
4802
+ if (input.view.degraded) {
4803
+ blocks.push(`(${t(locale, "bracket.degraded")})`);
4804
+ } else if (input.view.standingsDegraded) {
4805
+ blocks.push(`(${t(locale, "bracket.standingsDegraded")})`);
4806
+ }
4807
+ } else {
4808
+ blocks.push(formatBracketList(input.view, { footer: false, locale, tz: options.tz }));
4809
+ if (input.view.degraded) {
4810
+ blocks.push(`(${t(locale, "bracket.degraded")})`);
4811
+ } else if (input.view.standingsDegraded) {
4812
+ blocks.push(`(${t(locale, "bracket.standingsDegraded")})`);
4813
+ }
4814
+ }
4815
+ const footer = [];
4816
+ const src = input.source ?? input.view.source;
4817
+ if (src) footer.push(t(locale, "live.data", { source: liveSourceLabel(src) }));
4818
+ footer.push(
4819
+ [includeHashtag ? SHARE_HASHTAG : "", SHARE_DISCLAIMER].filter(Boolean).join(" \xB7 ")
4820
+ );
4821
+ if (includeInstall && input.installLine) {
4822
+ footer.push(t(locale, "share.tryIt", { line: input.installLine }));
4823
+ }
4824
+ blocks.push("", footer.join("\n"));
4825
+ return blocks.join("\n");
4826
+ }
4827
+ function formatBracketCompactLine(mv, opts = {}) {
4828
+ const flags = opts.flags !== false;
4829
+ const home = formatParticipant(mv.home, "home", flags, opts.locale);
4830
+ const away = formatParticipant(mv.away, "away", flags, opts.locale);
4831
+ const m = mv.match;
4832
+ const mid2 = isFinished(m.status) || isLive(m.status) ? scoreline(m) : "vs";
4833
+ const tail = m.status === "SCHEDULED" && mv.kickoff ? ` \xB7 ${formatKickoff(mv.kickoff, { tz: opts.tz, locale: opts.locale })}` : statusTail2(m);
4834
+ return `${stageLabelI18n(opts.locale, mv.stage)} \xB7 ${home} ${mid2} ${away}${tail}`;
4835
+ }
3617
4836
  export {
4837
+ BRACKET_STAGE_ORDER,
3618
4838
  DEFAULT_COMPETITION,
3619
4839
  DEFAULT_FLAVOR,
3620
4840
  DEFAULT_MAX_AGE_MS,
@@ -3627,6 +4847,8 @@ export {
3627
4847
  SHARE_HASHTAG,
3628
4848
  allFixtures,
3629
4849
  asFlavorLevel,
4850
+ buildBracketTopology,
4851
+ buildBracketView,
3630
4852
  buildMarketSignal,
3631
4853
  byKickoff,
3632
4854
  competitionBase,
@@ -3640,11 +4862,17 @@ export {
3640
4862
  fixturesByTeam,
3641
4863
  fixturesInLiveWindow,
3642
4864
  flagEmoji,
4865
+ formatBracketCompactLine,
4866
+ formatBracketList,
4867
+ formatBracketMatchLine,
4868
+ formatBracketTree,
3643
4869
  formatDate,
3644
4870
  formatKickoff,
4871
+ formatShareBracket,
3645
4872
  formatShareSnippet,
3646
4873
  formatShareTable,
3647
4874
  formatTime,
4875
+ getBracket,
3648
4876
  getLiveMatches,
3649
4877
  getMarketSignal,
3650
4878
  getMarketSignals,
@@ -3661,6 +4889,7 @@ export {
3661
4889
  isValidDate,
3662
4890
  isValidTimeZone,
3663
4891
  liveSourceLabel,
4892
+ loadBracketTopology,
3664
4893
  localDate,
3665
4894
  makeAdapter,
3666
4895
  makeMarketProvider,
@@ -3675,18 +4904,23 @@ export {
3675
4904
  marketRelevant,
3676
4905
  marketSourceLabel,
3677
4906
  matchFlavor,
4907
+ matchKey,
3678
4908
  matchLocation,
3679
4909
  mergeLive,
3680
4910
  nationToFlag,
3681
4911
  nationToRegion,
3682
4912
  nextFixtureForTeam,
4913
+ normalizeLang,
3683
4914
  normalizeOutcomes,
3684
4915
  outcomeFromScore,
3685
4916
  parseStandings,
4917
+ parseTeamSlot,
3686
4918
  resolveCompetition,
3687
4919
  resolveMarketSource,
3688
4920
  resolveTz,
3689
4921
  sanitizeBundledFixture,
3690
4922
  scoreline,
3691
- stageLabel
4923
+ stageLabel,
4924
+ stageLabelI18n,
4925
+ t
3692
4926
  };