From 7dc2ce0da8688ccaacb50b3efa1f8ef08cc846a6 Mon Sep 17 00:00:00 2001 From: Aeth3r Date: Fri, 16 Oct 2026 09:56:12 -0400 Subject: [PATCH] Add MTGA Assistant: native Linux deck and game tracker PySide6 app that follows MTG Arena's Player.log under Steam/Proton and shows my remaining library with draw odds, my zones, and everything revealed about the opponent (board, graveyard, exile, known hand/library, seen this match). - Auto-detects the Steam library, Proton prefix log and MTGA install - Card names/costs/types from MTGA's local SQLite card database - Tracks card identity across zone changes, shuffles and Bo3 games - Scryfall card images with a lazy, size-capped LRU disk cache - Live log following with restart detection, plus --replay mode - Flags log gaps where MTGA omits oversized game-state messages Co-Authored-By: Claude Opus 5.5 --- .gitignore | 4 + README.md | 62 +++ pyproject.toml | 25 ++ src/mtga_assistant/__init__.py | 0 src/mtga_assistant/__main__.py | 5 + src/mtga_assistant/app.py | 50 +++ src/mtga_assistant/carddb.py | 131 ++++++ src/mtga_assistant/gamestate.py | 366 ++++++++++++++++ src/mtga_assistant/images.py | 173 ++++++++ src/mtga_assistant/logparse.py | 137 ++++++ src/mtga_assistant/logtail.py | 103 +++++ src/mtga_assistant/paths.py | 104 +++++ src/mtga_assistant/ui/__init__.py | 0 src/mtga_assistant/ui/card_list.py | 184 ++++++++ src/mtga_assistant/ui/main_window.py | 290 +++++++++++++ src/mtga_assistant/ui/preview.py | 80 ++++ tests/fixtures/bo3_match.log | 601 +++++++++++++++++++++++++++ tests/test_carddb.py | 50 +++ tests/test_gamestate.py | 196 +++++++++ tests/test_logparse.py | 65 +++ uv.lock | 110 +++++ 21 files changed, 2736 insertions(+) create mode 100644 .gitignore create mode 100644 pyproject.toml create mode 100644 src/mtga_assistant/__init__.py create mode 100644 src/mtga_assistant/__main__.py create mode 100644 src/mtga_assistant/app.py create mode 100644 src/mtga_assistant/carddb.py create mode 100644 src/mtga_assistant/gamestate.py create mode 100644 src/mtga_assistant/images.py create mode 100644 src/mtga_assistant/logparse.py create mode 100644 src/mtga_assistant/logtail.py create mode 100644 src/mtga_assistant/paths.py create mode 100644 src/mtga_assistant/ui/__init__.py create mode 100644 src/mtga_assistant/ui/card_list.py create mode 100644 src/mtga_assistant/ui/main_window.py create mode 100644 src/mtga_assistant/ui/preview.py create mode 100644 tests/fixtures/bo3_match.log create mode 100644 tests/test_carddb.py create mode 100644 tests/test_gamestate.py create mode 100644 tests/test_logparse.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17cd2fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.venv/ +__pycache__/ +*.pyc +.pytest_cache/ diff --git a/README.md b/README.md index 2a27665..9907f0b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,64 @@ # mtga-assistant +A native Linux deck and game tracker for **Magic: The Gathering Arena** running under Steam/Proton. +It follows MTGA's `Player.log`, much like Untapped.gg and other trackers do, and shows: + +- **My deck**: remaining library with draw odds, hand, battlefield, graveyard, exile, sideboard. + Between matches, it shows the last deck you submitted. +- **Opponent**: battlefield, stack, graveyard, exile, cards *known* to be in their hand or library + (cards you saw that went back into a hidden zone, or were revealed), and every card seen this match. +- **Card preview**: hover a card to see its image from [Scryfall](https://scryfall.com). + +Card names, mana costs and types come from MTGA's own local card database, so they work offline. + +## Requirements + +- MTGA installed through Steam (Proton). The log, install and card DB are auto-detected from your + Steam library folders. +- **Detailed logs enabled** in MTGA: *Options → Account → Detailed Logs (Plugin Support)*. +- [uv](https://docs.astral.sh/uv/) (`pacman -S uv`). + +## Running + +```sh +uv run mtga-assistant # follow the live Player.log +uv run mtga-assistant --replay path/to/Player-prev.log --rate 40 # replay a saved log +uv run pytest # tests +``` + +Start it before or after MTGA: on startup it reads the existing log to catch up on a match in +progress, then follows new lines. When MTGA restarts and replaces the log, the tracker resets. + +On Wayland the window's app id is `mtga-assistant`. For example, to keep it floating on another +workspace in Hyprland: + +``` +windowrule = float, class:^(mtga-assistant)$ +windowrule = workspace 2, class:^(mtga-assistant)$ +``` + +## Configuration + +Optional: `~/.config/mtga-assistant/config.toml` + +```toml +log_path = "/path/to/Player.log" # override auto-detection +mtga_dir = "/path/to/steamapps/common/MTGA" +cache_max_mb = 500 # image cache cap +``` + +## Image cache + +Images are downloaded only for cards that actually appear, at Scryfall's `normal` size (about +60–100 KB each), and stored in `~/.cache/mtga-assistant/images`. When the cache passes +`cache_max_mb`, the least recently viewed images are deleted. *Cache → Clear image cache* empties it. + +## Known limitations + +- MTGA leaves oversized game-state messages out of the log ("Message summarized because one or + more GameStateMessages exceeded the 50 GameObject or 50 Annotation limit"), typically during board + wipes. Some zones can then be stale until they next change. The app detects this and shows a + warning. +- After a library shuffle, a known card's position in the opponent's library is lost. It stays listed + under "Library … known" until it shows up again. If it is drawn without being revealed, it may + stay listed. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..79d32c3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,25 @@ +[project] +name = "mtga-assistant" +version = "0.1.0" +description = "Native Linux deck and game tracker for MTG Arena, driven by Player.log" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "PySide6-Essentials>=6.8", +] + +[project.scripts] +mtga-assistant = "mtga_assistant.app:main" + +[dependency-groups] +dev = ["pytest>=8"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/mtga_assistant"] + +[tool.pytest.ini_options] +testpaths = ["tests"] diff --git a/src/mtga_assistant/__init__.py b/src/mtga_assistant/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mtga_assistant/__main__.py b/src/mtga_assistant/__main__.py new file mode 100644 index 0000000..ac99fd1 --- /dev/null +++ b/src/mtga_assistant/__main__.py @@ -0,0 +1,5 @@ +import sys + +from .app import main + +sys.exit(main()) diff --git a/src/mtga_assistant/app.py b/src/mtga_assistant/app.py new file mode 100644 index 0000000..1798a5f --- /dev/null +++ b/src/mtga_assistant/app.py @@ -0,0 +1,50 @@ +"""Entry point: mtga-assistant [--log PATH] [--replay PATH [--rate N]].""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +from PySide6.QtWidgets import QApplication + +from . import paths +from .carddb import CardDB +from .images import ImageCache +from .ui.main_window import MainWindow + + +def main() -> int: + ap = argparse.ArgumentParser(description="MTG Arena deck and game tracker") + ap.add_argument("--log", type=Path, help="Player.log to follow (default: auto-detect)") + ap.add_argument("--replay", type=Path, help="replay a saved log instead of following the live one") + ap.add_argument("--rate", type=float, default=40.0, help="replay speed in log events per second") + ap.add_argument("--mtga-dir", type=Path, help="MTGA install directory (default: auto-detect)") + args, qt_args = ap.parse_known_args() + + cfg = paths.load_config() + if args.log: + cfg.log_path = args.log + if args.mtga_dir: + cfg.mtga_dir = args.mtga_dir + + app = QApplication([sys.argv[0], *qt_args]) + app.setApplicationName("MTGA Assistant") + app.setDesktopFileName("mtga-assistant") # Wayland app_id, usable in Hyprland window rules + + mtga_dir = paths.find_mtga_dir(cfg) + db_path = paths.find_card_db(mtga_dir) if mtga_dir else None + cards = CardDB(db_path) + images = ImageCache(paths.CACHE_DIR, cards, cfg.cache_max_mb * 1024 * 1024) + + if args.replay: + win = MainWindow(cards, images, args.replay, replay_rate=args.rate) + else: + win = MainWindow(cards, images, paths.find_log_path(cfg)) + app.aboutToQuit.connect(win.shutdown) + win.show() + return app.exec() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/mtga_assistant/carddb.py b/src/mtga_assistant/carddb.py new file mode 100644 index 0000000..37ffdb0 --- /dev/null +++ b/src/mtga_assistant/carddb.py @@ -0,0 +1,131 @@ +"""Read-only access to MTGA's local SQLite card database (Raw_CardDatabase_*.mtga).""" + +from __future__ import annotations + +import re +import sqlite3 +from dataclasses import dataclass, field +from functools import lru_cache +from pathlib import Path + +CARD_TYPES = { + 1: "Artifact", 2: "Creature", 3: "Enchantment", 4: "Instant", 5: "Land", + 6: "Phenomenon", 7: "Plane", 8: "Planeswalker", 9: "Scheme", 10: "Sorcery", + 11: "Kindred", 12: "Vanguard", 13: "Dungeon", 14: "Battle", 15: "Conspiracy", +} +RARITIES = {0: "token", 1: "land", 2: "common", 3: "uncommon", 4: "rare", 5: "mythic"} + +# Cards.LinkedFaceType values whose first LinkedFaceGrpId is the "base" card: DFC back +# faces, split/room halves, adventure and omen sides, meld results, specializations... +# (Observed: odd types are the derived face, except omens where 20 is the derived side.) +DERIVED_FACE_TYPES = {1, 3, 5, 7, 9, 11, 13, 15, 17, 20} + +_MANA_TOKEN = re.compile(r"o(\([^)]*\)|[^o(]+)") + + +def parse_mana(text: str) -> list[str]: + """'o2o(W/U)oU' -> ['2', 'W/U', 'U'].""" + return [m.group(1).strip("()") for m in _MANA_TOKEN.finditer(text or "")] + + +def mana_value(symbols: list[str]) -> int: + total = 0 + for s in symbols: + if s.isdigit(): + total += int(s) + elif s.startswith("2/"): + total += 2 + elif s != "X": + total += 1 + return total + + +@dataclass(frozen=True) +class CardInfo: + grp_id: int + name: str + mana: tuple[str, ...] = () + types: tuple[str, ...] = () + set_code: str = "" + collector_number: str = "" + rarity: str = "" + is_token: bool = False + power: str = "" + toughness: str = "" + linked_faces: tuple[int, ...] = field(default=()) + linked_face_type: int = 0 + + @property + def mana_value(self) -> int: + return mana_value(list(self.mana)) + + @property + def is_land(self) -> bool: + return "Land" in self.types + + @property + def type_line(self) -> str: + return " ".join(self.types) + + +def unknown_card(grp_id: int) -> CardInfo: + return CardInfo(grp_id=grp_id, name=f"Unknown card #{grp_id}") + + +class CardDB: + def __init__(self, path: Path | None): + self.path = path + self._conn: sqlite3.Connection | None = None + if path is not None: + # immutable=1: MTGA may rewrite the file on update; never take locks on it. + uri = f"file:{path}?mode=ro&immutable=1" + self._conn = sqlite3.connect(uri, uri=True, check_same_thread=False) + + @property + def available(self) -> bool: + return self._conn is not None + + @lru_cache(maxsize=None) + def get(self, grp_id: int) -> CardInfo: + if self._conn is None: + return unknown_card(grp_id) + row = self._conn.execute( + """ + SELECT c.GrpId, + (SELECT Loc FROM Localizations_enUS l WHERE l.LocId = c.TitleId + ORDER BY l.Formatted = 1 DESC, l.Formatted LIMIT 1), + c.OldSchoolManaText, c.Types, c.ExpansionCode, c.CollectorNumber, + c.Rarity, c.IsToken, c.Power, c.Toughness, c.LinkedFaceGrpIds, c.LinkedFaceType + FROM Cards c WHERE c.GrpId = ? + """, + (grp_id,), + ).fetchone() + if row is None: + return unknown_card(grp_id) + (gid, name, mana, types, set_code, cn, rarity, is_token, power, tough, linked, ltype) = row + return CardInfo( + grp_id=gid, + name=_strip_tags(name) if name else f"Card #{gid}", + mana=tuple(parse_mana(mana)), + types=tuple(CARD_TYPES.get(int(t), "?") for t in (types or "").split(",") if t), + set_code=set_code or "", + collector_number=cn or "", + rarity=RARITIES.get(rarity, ""), + is_token=bool(is_token), + power=power or "", + toughness=tough or "", + linked_faces=tuple(int(x) for x in (linked or "").split(",") if x), + linked_face_type=int(ltype or 0), + ) + + def base_grp(self, grp_id: int) -> int: + """Canonical grpId for a physical card, e.g. a DFC's back face -> its front face.""" + info = self.get(grp_id) + if info.linked_face_type in DERIVED_FACE_TYPES and info.linked_faces: + return info.linked_faces[0] + return grp_id + + +def _strip_tags(s: str) -> str: + # Some titles carry markup such as or . + return re.sub(r"<[^>]+>", "", s) diff --git a/src/mtga_assistant/gamestate.py b/src/mtga_assistant/gamestate.py new file mode 100644 index 0000000..52daeca --- /dev/null +++ b/src/mtga_assistant/gamestate.py @@ -0,0 +1,366 @@ +"""Game/match state reconstructed from GRE messages. Pure Python, no Qt. + +Model notes (derived from MTGA's GRE protocol as it appears in Player.log): + +* Each zone message carries the zone's *complete* ``objectInstanceIds`` list, so + zones are replaced wholesale on every update. +* Game objects are only sent for cards the local player can see. Hidden cards + (libraries, the opponent's hand) exist only as instance ids in a zone list. +* When a card changes zone it usually gets a new instance id, announced by an + ``ObjectIdChanged`` annotation (orig_id -> new_id). We follow these chains so + that an opponent's card we have seen keeps its identity when it goes back into + a hidden zone (bounced to hand, put back into library, ...). +* ``Shuffle`` annotations renumber a library (OldIds -> NewIds) in random order, + so known cards in a shuffled library lose their position but are still there. +""" + +from __future__ import annotations + +from collections import Counter +from dataclasses import dataclass, field +from typing import Any + +from .logparse import ClientDeck, DeckSubmitted, Event, GreMessages, MatchRoom + +HIDDEN_ZONES = {"ZoneType_Library", "ZoneType_Hand"} +CARD_OBJECT_TYPES = {"GameObjectType_Card"} +# Zones whose cards are "out of the library" for my remaining-library maths. +MY_TRACKED_ZONES = ( + "ZoneType_Hand", + "ZoneType_Stack", + "ZoneType_Battlefield", + "ZoneType_Graveyard", + "ZoneType_Exile", + "ZoneType_Command", +) + + +@dataclass +class Zone: + zone_id: int + type: str + owner: int | None + ids: list[int] + + +def _details(annotation: dict[str, Any]) -> dict[str, list[Any]]: + out: dict[str, list[Any]] = {} + for d in annotation.get("details") or []: + vals = d.get("valueInt32") or d.get("valueString") or d.get("valueUint32") or [] + out[d.get("key", "")] = vals + return out + + +@dataclass +class GameState: + """State of one game (one game of a best-of-three).""" + + my_seat: int + deck: Counter[int] + sideboard: Counter[int] + game_number: int = 1 + zones: dict[int, Zone] = field(default_factory=dict) + objects: dict[int, dict[str, Any]] = field(default_factory=dict) + life: dict[int, int] = field(default_factory=dict) + turn: int = 0 + active_player: int = 0 + phase: str = "" + complete: bool = False + applied_state_ids: set[int] = field(default_factory=set) + # MTGA omits oversized GRE messages from the log ("Message summarized..."); after such a + # gap some zones may be stale until the server next sends them. + desynced: bool = False + + # Opponent knowledge. + parent: dict[int, int] = field(default_factory=dict) # new instance id -> previous id + known: dict[int, int] = field(default_factory=dict) # opp instance id -> grpId, survives hiding + opp_library_unplaced: Counter[int] = field(default_factory=Counter) # known cards shuffled away + # grpId -> instance ids seen. Resolved to physical cards (chain roots) only when counting, + # because an object can be logged a message before the ObjectIdChanged that links it. + opp_seen: dict[int, set[int]] = field(default_factory=dict) + + @property + def opp_seat(self) -> int: + return 2 if self.my_seat == 1 else 1 + + # -- applying messages ------------------------------------------------- + + def apply(self, gsm: dict[str, Any]) -> None: + state_id = gsm.get("gameStateId") + if state_id is not None: + if state_id in self.applied_state_ids: + return + self.applied_state_ids.add(state_id) + + if gsm.get("type") == "GameStateType_Full": + self.zones.clear() + self.objects.clear() + self.desynced = False + elif (prev := gsm.get("prevGameStateId")) and self.applied_state_ids - {state_id} \ + and prev not in self.applied_state_ids: + self.desynced = True + + if info := gsm.get("gameInfo"): + self.game_number = info.get("gameNumber", self.game_number) + if info.get("stage") == "GameStage_GameOver" or info.get("matchState") in ( + "MatchState_GameComplete", + "MatchState_MatchComplete", + ): + self.complete = True + for p in gsm.get("players") or []: + seat = p.get("systemSeatNumber") + if seat is not None and "lifeTotal" in p: + self.life[seat] = p["lifeTotal"] + if ti := gsm.get("turnInfo"): + self.turn = ti.get("turnNumber", self.turn) + self.active_player = ti.get("activePlayer", self.active_player) + self.phase = ti.get("phase", self.phase) + + for ann in gsm.get("annotations") or []: + self._apply_annotation(ann) + + for z in gsm.get("zones") or []: + zid = z["zoneId"] + self.zones[zid] = Zone(zid, z.get("type", ""), z.get("ownerSeatId"), list(z.get("objectInstanceIds") or [])) + + for obj in gsm.get("gameObjects") or []: + self._apply_object(obj) + + for iid in gsm.get("diffDeletedInstanceIds") or []: + self.objects.pop(iid, None) + + def _apply_annotation(self, ann: dict[str, Any]) -> None: + types = ann.get("type") or [] + if "AnnotationType_ObjectIdChanged" in types: + d = _details(ann) + if d.get("orig_id") and d.get("new_id"): + orig, new = d["orig_id"][0], d["new_id"][0] + self.parent[new] = orig + if orig in self.known: + self.known[new] = self.known[orig] + if "AnnotationType_Shuffle" in types: + d = _details(ann) + for old in d.get("OldIds") or []: + if old in self.known: + self.opp_library_unplaced[self.known.pop(old)] += 1 + + def _apply_object(self, obj: dict[str, Any]) -> None: + iid = obj["instanceId"] + self.objects[iid] = obj + grp = obj.get("grpId") or 0 + if not grp or obj.get("ownerSeatId") != self.opp_seat: + return + otype = obj.get("type") + if otype in CARD_OBJECT_TYPES: + newly_visible = iid not in self.known + self.known[iid] = grp + ids = self.opp_seen.setdefault(grp, set()) + if newly_visible and self.opp_library_unplaced[grp] > 0 \ + and self.root_of(iid) not in {self.root_of(i) for i in ids}: + # Possibly the known card we lost track of in a shuffle resurfacing. + self.opp_library_unplaced[grp] -= 1 + ids.add(iid) + elif otype == "GameObjectType_RevealedCard": + self.opp_seen.setdefault(grp, set()).add(-iid) # distinct key space for reveals + + def root_of(self, iid: int) -> int: + """First instance id of the chain this id belongs to (the physical card).""" + seen = set() + while iid in self.parent and iid not in seen: + seen.add(iid) + iid = self.parent[iid] + return iid + + # -- queries ------------------------------------------------------------ + + def zone_of_type(self, ztype: str, owner: int | None) -> Zone | None: + for z in self.zones.values(): + if z.type == ztype and (owner is None or z.owner == owner): + return z + return None + + def cards_in(self, ztype: str, *, owner: int | None = None, controller: int | None = None, + include_tokens: bool = True) -> Counter[int]: + """grpId counts of visible objects in zones of the given type.""" + out: Counter[int] = Counter() + for z in self.zones.values(): + if z.type != ztype: + continue + for iid in z.ids: + obj = self.objects.get(iid) + if not obj or not obj.get("grpId"): + continue + otype = obj.get("type") + if otype not in CARD_OBJECT_TYPES and not (include_tokens and otype == "GameObjectType_Token"): + continue + if owner is not None and obj.get("ownerSeatId") != owner: + continue + if controller is not None and obj.get("controllerSeatId", obj.get("ownerSeatId")) != controller: + continue + out[obj["grpId"]] += 1 + return out + + def zone_size(self, ztype: str, owner: int) -> int: + z = self.zone_of_type(ztype, owner) + return len(z.ids) if z else 0 + + def opp_known_in(self, ztype: str) -> Counter[int]: + """Opponent cards we know are in a hidden zone (by tracking identity).""" + out: Counter[int] = Counter() + z = self.zone_of_type(ztype, self.opp_seat) + if z: + for iid in z.ids: + if iid in self.known: + out[self.known[iid]] += 1 + # Cards the opponent revealed from that zone (e.g. "reveal your hand"). + if z: + for obj in self.objects.values(): + if (obj.get("type") == "GameObjectType_RevealedCard" and obj.get("zoneId") == z.zone_id + and obj.get("grpId")): + out[obj["grpId"]] += 1 + if ztype == "ZoneType_Library": + out += self.opp_library_unplaced + return out + + def opp_seen_counts(self, normalize=lambda g: g) -> Counter[int]: + merged: dict[int, set[int]] = {} + for g, ids in self.opp_seen.items(): + # Negative ids are reveal copies, which have no chain. + merged.setdefault(normalize(g), set()).update(i if i < 0 else self.root_of(i) for i in ids) + return Counter({g: len(r) for g, r in merged.items() if r}) + + def my_outside_library(self, normalize) -> Counter[int]: + """My non-token cards outside the library, keyed by deck grpId.""" + out: Counter[int] = Counter() + for ztype in MY_TRACKED_ZONES: + for g, n in self.cards_in(ztype, owner=self.my_seat, include_tokens=False).items(): + out[normalize(g)] += n + return out + + +@dataclass +class MatchTracker: + """Everything the UI needs, across the games of a match.""" + + card_lookup: Any = None # CardDB-like with .get(grpId) -> CardInfo; optional + match_id: str = "" + event_id: str = "" + players: dict[int, str] = field(default_factory=dict) + my_seat: int | None = None + game: GameState | None = None + in_match: bool = False + game_results: list[str] = field(default_factory=list) # "Won"/"Lost" per finished game + last_result: str = "" + next_deck: ClientDeck | None = None + # Opponent cards seen in earlier games of this match (max count in any one game). + opp_seen_prev_games: Counter[int] = field(default_factory=Counter) + deck_name: str = "" + submitted_deck: DeckSubmitted | None = None + version: int = 0 # bumped on every change, for cheap UI refresh checks + + def handle(self, ev: Event) -> None: + if isinstance(ev, GreMessages): + for m in ev.messages: + self._handle_gre(m) + elif isinstance(ev, MatchRoom): + self._handle_room(ev) + elif isinstance(ev, DeckSubmitted): + self.submitted_deck = ev + self.deck_name = ev.name + elif isinstance(ev, ClientDeck): + self.next_deck = ev + self.version += 1 + + def _start_match(self) -> None: + self.opp_seen_prev_games.clear() + self.game_results.clear() + self.last_result = "" + self.players.clear() + self.in_match = True + + def _handle_room(self, ev: MatchRoom) -> None: + if ev.state == "MatchGameRoomStateType_Playing": + # ConnectResp (which starts the match on our side) may arrive before or after this. + if not self.in_match: + self._start_match() + self.match_id = ev.match_id + for p in ev.players: + self.players[p.get("systemSeatId")] = p.get("playerName", "") + self.event_id = p.get("eventId", self.event_id) + elif ev.state == "MatchGameRoomStateType_MatchCompleted": + self.in_match = False + res = ev.final_result or {} + for r in res.get("resultList") or []: + if r.get("scope") == "MatchScope_Match" and self.my_seat is not None: + won = r.get("winningTeamId") == self.my_seat + self.last_result = "Won" if won else "Lost" + if self.game: + self.game.complete = True + + def _handle_gre(self, m: dict[str, Any]) -> None: + mtype = m.get("type") + if mtype == "GREMessageType_ConnectResp": + seats = m.get("systemSeatIds") or [1] + self.my_seat = seats[0] + deck_msg = (m.get("connectResp") or {}).get("deckMessage") or {} + if not self.in_match: + self._start_match() + self.next_deck = None + self.game = GameState( + my_seat=self.my_seat, + deck=Counter(deck_msg.get("deckCards") or []), + sideboard=Counter(deck_msg.get("sideboardCards") or []), + ) + return + gsm = m.get("gameStateMessage") + if gsm is None or self.game is None: + return + game_no = (gsm.get("gameInfo") or {}).get("gameNumber") + if gsm.get("type") == "GameStateType_Full" and game_no and game_no != self.game.game_number: + # Next game of the match: no new ConnectResp, just a fresh Full state. + prev = self.game + self.opp_seen_prev_games = self.opp_seen_match + deck = self.next_deck or ClientDeck(prev.deck, prev.sideboard) + self.next_deck = None + self.game = GameState(my_seat=prev.my_seat, deck=Counter(deck.main), + sideboard=Counter(deck.sideboard), game_number=game_no) + self.game.apply(gsm) + results = (gsm.get("gameInfo") or {}).get("results") or [] + game_results = [r for r in results if r.get("scope") == "MatchScope_Game"] + if len(game_results) > len(self.game_results) and self.my_seat is not None: + self.game_results = [ + "Won" if r.get("winningTeamId") == self.my_seat else "Lost" for r in game_results + ] + self.game.complete = True + + # -- derived views ------------------------------------------------------ + + @property + def opp_seen_match(self) -> Counter[int]: + """Opponent cards seen this match: for each card, the most copies seen in any one game.""" + out = self.opp_seen_prev_games.copy() + if self.game is not None: + for g, n in self.game.opp_seen_counts(self.normalize).items(): + out[g] = max(out[g], n) + return out + + def normalize(self, grp: int) -> int: + """Map a game object's grpId to its card's canonical grpId (e.g. DFC back -> front).""" + g = self.game + if (g is not None and grp in g.deck) or self.card_lookup is None: + return grp + return self.card_lookup.base_grp(grp) + + def my_library_remaining(self) -> Counter[int]: + g = self.game + if g is None: + return Counter() + remaining = g.deck.copy() + remaining.subtract(g.my_outside_library(self.normalize)) + return +remaining # drop zero/negative entries + + @property + def opponent_name(self) -> str: + if self.my_seat is None: + return "" + return self.players.get(2 if self.my_seat == 1 else 1, "") diff --git a/src/mtga_assistant/images.py b/src/mtga_assistant/images.py new file mode 100644 index 0000000..ee49868 --- /dev/null +++ b/src/mtga_assistant/images.py @@ -0,0 +1,173 @@ +"""Card images from Scryfall with a size-capped on-disk LRU cache. + +Images are fetched lazily, only for cards that actually show up, and stored as +``/images/.jpg``. A file's mtime is bumped whenever it is used, and +the least recently used files are evicted when the cache exceeds its cap. +""" + +from __future__ import annotations + +import threading +import time +import urllib.error +import urllib.parse +import urllib.request +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path + +from PySide6.QtCore import QObject, Signal +from PySide6.QtGui import QPixmap + +from .carddb import CardDB + +USER_AGENT = "mtga-assistant/0.1 (personal desktop tracker)" +SCRYFALL = "https://api.scryfall.com" +MIN_REQUEST_INTERVAL = 0.11 # Scryfall asks for <= 10 requests/second + + +class ImageCache(QObject): + image_ready = Signal(int) # grpId + size_changed = Signal(int) # bytes on disk + _downloaded = Signal(int) + + def __init__(self, cache_dir: Path, cards: CardDB, max_bytes: int): + super().__init__() + self.dir = cache_dir / "images" + self.dir.mkdir(parents=True, exist_ok=True) + self.cards = cards + self.max_bytes = max_bytes + self._pool = ThreadPoolExecutor(max_workers=3, thread_name_prefix="scryfall") + self._lock = threading.Lock() + self._inflight: set[int] = set() + self._failed: set[int] = set() + self._last_request = 0.0 + self._pixmaps: dict[int, QPixmap] = {} + # Emitted from worker threads; Qt queues delivery onto this object's (GUI) thread. + self._downloaded.connect(self._on_downloaded) + self.evict() + + def path_for(self, grp_id: int) -> Path: + return self.dir / f"{grp_id}.jpg" + + def pixmap(self, grp_id: int) -> QPixmap | None: + """Return the image if cached; otherwise start a download and return None.""" + if pm := self._pixmaps.get(grp_id): + return pm + path = self.path_for(grp_id) + if path.exists(): + try: + path.touch() + except OSError: + pass + pm = QPixmap(str(path)) + if not pm.isNull(): + if len(self._pixmaps) > 200: + self._pixmaps.clear() + self._pixmaps[grp_id] = pm + return pm + self.request(grp_id) + return None + + def request(self, grp_id: int) -> None: + with self._lock: + if grp_id in self._inflight or grp_id in self._failed: + return + self._inflight.add(grp_id) + self._pool.submit(self._download, grp_id) + + def is_failed(self, grp_id: int) -> bool: + return grp_id in self._failed + + # -- worker side --------------------------------------------------------- + + def _throttle(self) -> None: + with self._lock: + wait = self._last_request + MIN_REQUEST_INTERVAL - time.monotonic() + self._last_request = max(time.monotonic(), self._last_request + MIN_REQUEST_INTERVAL) + if wait > 0: + time.sleep(wait) + + def _candidate_urls(self, grp_id: int) -> list[str]: + q = "format=image&version=normal" + urls = [f"{SCRYFALL}/cards/arena/{grp_id}?{q}"] + info = self.cards.get(grp_id) + if info.set_code and info.collector_number: + set_code = urllib.parse.quote(info.set_code.lower()) + cn = urllib.parse.quote(info.collector_number) + urls.append(f"{SCRYFALL}/cards/{set_code}/{cn}?{q}") + if info.name and not info.name.startswith(("Unknown card", "Card #")): + exact = urllib.parse.quote(info.name.split(" // ")[0]) + urls.append(f"{SCRYFALL}/cards/named?exact={exact}&{q}") + return urls + + def _download(self, grp_id: int) -> None: + ok = False + try: + for url in self._candidate_urls(grp_id): + self._throttle() + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "*/*"}) + try: + with urllib.request.urlopen(req, timeout=20) as resp: + data = resp.read() + except urllib.error.HTTPError as e: + if e.code == 404: + continue + break + except (urllib.error.URLError, TimeoutError, OSError): + break + tmp = self.path_for(grp_id).with_suffix(".part") + tmp.write_bytes(data) + tmp.replace(self.path_for(grp_id)) + ok = True + break + finally: + with self._lock: + self._inflight.discard(grp_id) + if not ok: + self._failed.add(grp_id) + if ok: + self._downloaded.emit(grp_id) + + def _on_downloaded(self, grp_id: int) -> None: + self.evict() + self.image_ready.emit(grp_id) + + # -- cache management ------------------------------------------------------ + + def disk_usage(self) -> int: + return sum(p.stat().st_size for p in self.dir.glob("*.jpg")) + + def evict(self) -> None: + files = [] + for p in self.dir.glob("*.jpg"): + try: + st = p.stat() + except OSError: + continue + files.append((st.st_mtime, st.st_size, p)) + total = sum(f[1] for f in files) + if total > self.max_bytes: + for _, size, p in sorted(files): + try: + p.unlink() + except OSError: + continue + total -= size + if p.stem.isdigit(): + self._pixmaps.pop(int(p.stem), None) + if total <= self.max_bytes * 0.9: + break + self.size_changed.emit(total) + + def clear(self) -> None: + for p in self.dir.glob("*"): + try: + p.unlink() + except OSError: + pass + self._pixmaps.clear() + self._failed.clear() + self.size_changed.emit(0) + + def shutdown(self) -> None: + self._pool.shutdown(wait=False, cancel_futures=True) diff --git a/src/mtga_assistant/logparse.py b/src/mtga_assistant/logparse.py new file mode 100644 index 0000000..c882d21 --- /dev/null +++ b/src/mtga_assistant/logparse.py @@ -0,0 +1,137 @@ +"""Turn Player.log lines into typed events. + +The log interleaves plain text with JSON payloads. The payloads we care about are: + +* a line starting with ``{`` that holds ``greToClientEvent`` (in-game state) or + ``matchGameRoomStateChangedEvent`` (match start / end), preceded by a header line; +* ``[UnityCrossThreadLogger]==> EventSetDeckV3 {...}`` requests, whose ``request`` + field is itself a JSON string carrying the deck submitted to an event. + +This module has no Qt dependency so it can be unit-tested and replayed headlessly. +""" + +from __future__ import annotations + +import json +import re +from collections import Counter +from dataclasses import dataclass, field +from typing import Any + +MAX_PENDING_LINES = 5000 + + +@dataclass +class GreMessages: + messages: list[dict[str, Any]] + + +@dataclass +class MatchRoom: + state: str + match_id: str + players: list[dict[str, Any]] + final_result: dict[str, Any] | None = None + + +@dataclass +class DeckSubmitted: + name: str + event: str + main: Counter[int] = field(default_factory=Counter) + sideboard: Counter[int] = field(default_factory=Counter) + + +@dataclass +class ClientDeck: + """Deck the client submitted for the next game of a match (after sideboarding).""" + + main: Counter[int] + sideboard: Counter[int] + + +Event = GreMessages | MatchRoom | DeckSubmitted | ClientDeck + +_REQUEST_RE = re.compile(r"==> (EventSetDeck\w*) (\{.*)$") + + +class LogParser: + """Incremental line parser. Feed complete lines; get events back.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + + def reset(self) -> None: + self._pending.clear() + + def feed(self, line: str) -> list[Event]: + line = line.rstrip("\r\n") + if self._pending: + # Continuing a multi-line JSON body. + if line.startswith("[") and not line.startswith("[{"): + self._pending.clear() # a new log entry began; drop the fragment + else: + self._pending.append(line) + # Pretty-printed bodies close with a '}' at column 0; only reparse then. + return self._try_pending() if line.startswith("}") else [] + + if line.startswith("{"): + self._pending = [line] + return self._try_pending() + + if "==> EventSetDeck" in line: + m = _REQUEST_RE.search(line) + if m: + try: + return _deck_submitted(json.loads(m.group(2))) + except (json.JSONDecodeError, KeyError, TypeError, ValueError): + return [] + return [] + + def _try_pending(self) -> list[Event]: + text = "\n".join(self._pending) + try: + obj = json.loads(text) + except json.JSONDecodeError: + if len(self._pending) > MAX_PENDING_LINES: + self._pending.clear() + return [] + self._pending.clear() + return _classify(obj) + + +def _classify(obj: Any) -> list[Event]: + if not isinstance(obj, dict): + return [] + if gre := obj.get("greToClientEvent"): + msgs = gre.get("greToClientMessages") or [] + return [GreMessages(msgs)] if msgs else [] + if room := obj.get("matchGameRoomStateChangedEvent"): + info = room.get("gameRoomInfo") or {} + cfg = info.get("gameRoomConfig") or {} + return [ + MatchRoom( + state=info.get("stateType", ""), + match_id=cfg.get("matchId", "") or (info.get("finalMatchResult") or {}).get("matchId", ""), + players=cfg.get("reservedPlayers") or [], + final_result=info.get("finalMatchResult"), + ) + ] + payload = obj.get("payload") + if isinstance(payload, dict) and payload.get("type") == "ClientMessageType_SubmitDeckResp": + deck = (payload.get("submitDeckResp") or {}).get("deck") or {} + return [ClientDeck(Counter(deck.get("deckCards") or []), Counter(deck.get("sideboardCards") or []))] + return [] + + +def _deck_submitted(payload: dict[str, Any]) -> list[Event]: + req = json.loads(payload["request"]) + deck = req.get("Deck") or {} + main: Counter[int] = Counter() + side: Counter[int] = Counter() + for c in deck.get("MainDeck") or []: + main[int(c["cardId"])] += int(c["quantity"]) + for c in deck.get("Sideboard") or []: + side[int(c["cardId"])] += int(c["quantity"]) + summary = req.get("Summary") or {} + return [DeckSubmitted(name=summary.get("Name", ""), event=req.get("EventName", ""), main=main, sideboard=side)] diff --git a/src/mtga_assistant/logtail.py b/src/mtga_assistant/logtail.py new file mode 100644 index 0000000..1c5e743 --- /dev/null +++ b/src/mtga_assistant/logtail.py @@ -0,0 +1,103 @@ +"""Background thread that follows Player.log (or replays a saved log) and emits events.""" + +from __future__ import annotations + +import os +import time +from pathlib import Path + +from PySide6.QtCore import QThread, Signal + +from .logparse import LogParser + +POLL_INTERVAL = 0.25 +BATCH_MAX = 200 + + +class LogFollower(QThread): + events = Signal(list) # list[Event] + status = Signal(str) + reset = Signal() # log was replaced (MTGA restarted): state must be rebuilt + + def __init__(self, path: Path, replay_rate: float | None = None): + """replay_rate: if set, read the file once at that many events/second, then stop.""" + super().__init__() + self.path = path + self.replay_rate = replay_rate + self._stop = False + + def stop(self) -> None: + self._stop = True + + def run(self) -> None: + if self.replay_rate: + self._replay() + else: + self._follow() + + def _replay(self) -> None: + parser = LogParser() + delay = 1.0 / self.replay_rate + self.status.emit(f"Replaying {self.path.name}") + with open(self.path, encoding="utf-8", errors="replace") as f: + for line in f: + if self._stop: + return + evs = parser.feed(line) + if evs: + self.events.emit(evs) + time.sleep(delay) + self.status.emit(f"Replay of {self.path.name} finished") + + def _follow(self) -> None: + parser = LogParser() + f = None + inode = None + pos = 0 + buf = b"" + waiting_reported = False + following = False + while not self._stop: + try: + st = os.stat(self.path) + except FileNotFoundError: + if not waiting_reported: + self.status.emit(f"Waiting for {self.path}") + waiting_reported = True + time.sleep(1.0) + continue + waiting_reported = False + + if f is None or st.st_ino != inode or st.st_size < pos: + # First open, or MTGA restarted and replaced/truncated the log. + if f is not None: + f.close() + self.reset.emit() + f = open(self.path, "rb") + inode, pos, buf = st.st_ino, 0, b"" + parser.reset() + self.status.emit(f"Reading {self.path.name}") + following = False + + chunk = f.read() + if not chunk: + if not following: + self.status.emit(f"Following {self.path.name}") + following = True + time.sleep(POLL_INTERVAL) + continue + pos = f.tell() + buf += chunk + lines = buf.split(b"\n") + buf = lines.pop() # keep a trailing partial line for the next read + + batch = [] + for line in lines: + batch.extend(parser.feed(line.decode("utf-8", errors="replace"))) + if len(batch) >= BATCH_MAX: + self.events.emit(batch) + batch = [] + if batch: + self.events.emit(batch) + if f is not None: + f.close() diff --git a/src/mtga_assistant/paths.py b/src/mtga_assistant/paths.py new file mode 100644 index 0000000..314fed7 --- /dev/null +++ b/src/mtga_assistant/paths.py @@ -0,0 +1,104 @@ +"""Locate MTGA's Player.log and install directory inside a Steam/Proton setup.""" + +from __future__ import annotations + +import os +import re +import tomllib +from dataclasses import dataclass +from pathlib import Path + +MTGA_APP_ID = "2141910" +LOG_SUBPATH = Path( + "pfx/drive_c/users/steamuser/AppData/LocalLow/Wizards Of The Coast/MTGA" +) + +CONFIG_DIR = Path(os.environ.get("XDG_CONFIG_HOME", Path.home() / ".config")) / "mtga-assistant" +CACHE_DIR = Path(os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")) / "mtga-assistant" +CONFIG_FILE = CONFIG_DIR / "config.toml" + +STEAM_ROOTS = [ + Path.home() / ".local/share/Steam", + Path.home() / ".steam/steam", + Path.home() / ".steam/root", + Path.home() / ".var/app/com.valvesoftware.Steam/.local/share/Steam", +] + + +@dataclass +class Config: + log_path: Path | None = None + mtga_dir: Path | None = None + cache_max_mb: int = 500 + + +def load_config() -> Config: + cfg = Config() + try: + data = tomllib.loads(CONFIG_FILE.read_text()) + except (FileNotFoundError, tomllib.TOMLDecodeError): + return cfg + if p := data.get("log_path"): + cfg.log_path = Path(p).expanduser() + if p := data.get("mtga_dir"): + cfg.mtga_dir = Path(p).expanduser() + if (mb := data.get("cache_max_mb")) is not None: + cfg.cache_max_mb = int(mb) + return cfg + + +def steam_libraries() -> list[Path]: + """All Steam library folders listed in any libraryfolders.vdf we can find.""" + libs: list[Path] = [] + for root in STEAM_ROOTS: + vdf = root / "steamapps/libraryfolders.vdf" + try: + text = vdf.read_text(errors="replace") + except OSError: + continue + for m in re.finditer(r'"path"\s+"([^"]+)"', text): + p = Path(m.group(1).replace("\\\\", "\\")) + if p not in libs: + libs.append(p) + if root not in libs and (root / "steamapps").is_dir(): + libs.append(root) + return libs + + +def find_mtga_library() -> Path | None: + for lib in steam_libraries(): + if (lib / f"steamapps/appmanifest_{MTGA_APP_ID}.acf").exists(): + return lib + return None + + +def find_log_path(cfg: Config) -> Path | None: + if cfg.log_path: + return cfg.log_path + libs = steam_libraries() + mtga_lib = find_mtga_library() + # The prefix normally lives in the same library as the game, but check all of them. + if mtga_lib: + libs = [mtga_lib] + [l for l in libs if l != mtga_lib] + for lib in libs: + d = lib / "steamapps/compatdata" / MTGA_APP_ID / LOG_SUBPATH + if d.is_dir(): + return d / "Player.log" + return None + + +def find_mtga_dir(cfg: Config) -> Path | None: + if cfg.mtga_dir: + return cfg.mtga_dir + lib = find_mtga_library() + if lib: + d = lib / "steamapps/common/MTGA" + if d.is_dir(): + return d + return None + + +def find_card_db(mtga_dir: Path) -> Path | None: + raw = mtga_dir / "MTGA_Data/Downloads/Raw" + dbs = sorted(raw.glob("Raw_CardDatabase_*.mtga"), key=lambda p: p.stat().st_mtime) + return dbs[-1] if dbs else None diff --git a/src/mtga_assistant/ui/__init__.py b/src/mtga_assistant/ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mtga_assistant/ui/card_list.py b/src/mtga_assistant/ui/card_list.py new file mode 100644 index 0000000..56c24c6 --- /dev/null +++ b/src/mtga_assistant/ui/card_list.py @@ -0,0 +1,184 @@ +"""Sectioned card list: count, mana cost, name, note. Emits the hovered card's grpId.""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +from PySide6.QtCore import QModelIndex, QRectF, QSize, Qt, Signal +from PySide6.QtGui import QBrush, QColor, QFont, QPainter, QPen +from PySide6.QtWidgets import ( + QAbstractItemView, + QHeaderView, + QStyledItemDelegate, + QStyleOptionViewItem, + QTreeWidget, + QTreeWidgetItem, +) + +from ..carddb import CardInfo + +GRP_ROLE = Qt.ItemDataRole.UserRole + 1 +MANA_ROLE = Qt.ItemDataRole.UserRole + 2 + +COL_COUNT, COL_MANA, COL_NAME, COL_NOTE = range(4) + +MANA_COLORS = { + "W": "#f8f6d8", + "U": "#c1d7e9", + "B": "#bab1ab", + "R": "#e49977", + "G": "#a3c095", + "C": "#cac5c0", +} +GENERIC_COLOR = "#cac5c0" + + +@dataclass +class Row: + info: CardInfo + count: int = 1 + note: str = "" + dim: bool = False + + +@dataclass +class Section: + key: str # stable id used to remember expanded/collapsed state + title: str + rows: list[Row] = field(default_factory=list) + collapsed_by_default: bool = False + + +def sort_key(row: Row) -> tuple: + i = row.info + return (i.is_land, i.mana_value, i.name) + + +class ManaDelegate(QStyledItemDelegate): + PIP = 16 + + def paint(self, painter: QPainter, option: QStyleOptionViewItem, index: QModelIndex) -> None: + symbols = index.data(MANA_ROLE) + if not symbols: + super().paint(painter, option, index) + return + self.initStyleOption(option, index) + style = option.widget.style() if option.widget else None + if style: + # Draw selection/hover background without text. + option.text = "" + style.drawControl(style.ControlElement.CE_ItemViewItem, option, painter, option.widget) + painter.save() + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + size = min(self.PIP, option.rect.height() - 4) + x = option.rect.left() + 2 + y = option.rect.top() + (option.rect.height() - size) // 2 + font = QFont(option.font) + font.setPixelSize(int(size * 0.7)) + font.setBold(True) + painter.setFont(font) + for sym in symbols: + if x + size > option.rect.right(): + break + rect = QRectF(x, y, size, size) + parts = [p for p in sym.split("/") if p] + phyrexian = "P" in parts + parts = [p for p in parts if p != "P"] or ["C"] + fills = [MANA_COLORS.get(p, GENERIC_COLOR) for p in parts] + painter.setPen(QPen(QColor("#555"), 0.8)) + if len(fills) >= 2: # hybrid: two half circles + painter.setBrush(QBrush(QColor(fills[0]))) + painter.drawPie(rect, 90 * 16, 180 * 16) + painter.setBrush(QBrush(QColor(fills[1]))) + painter.drawPie(rect, 270 * 16, 180 * 16) + else: + painter.setBrush(QBrush(QColor(fills[0]))) + painter.drawEllipse(rect) + if phyrexian: + label = "φ" + elif sym == "C": + label = "◇" + elif parts[0] not in MANA_COLORS: + label = parts[0] # generic number, X, or the "2" of a 2/C hybrid + else: + label = "" + if label: + painter.setPen(QColor("#111")) + painter.drawText(rect, Qt.AlignmentFlag.AlignCenter, label) + x += size + 2 + painter.restore() + + def sizeHint(self, option: QStyleOptionViewItem, index: QModelIndex) -> QSize: + symbols = index.data(MANA_ROLE) or [] + return QSize(len(symbols) * (self.PIP + 2) + 4, self.PIP + 6) + + +class CardList(QTreeWidget): + hovered = Signal(int) + + def __init__(self, parent=None): + super().__init__(parent) + self.setColumnCount(4) + self.setHeaderHidden(True) + self.setRootIsDecorated(True) + self.setIndentation(12) + self.setUniformRowHeights(True) + self.setMouseTracking(True) + self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.setItemDelegateForColumn(COL_MANA, ManaDelegate(self)) + hdr = self.header() + hdr.setStretchLastSection(False) + hdr.setSectionResizeMode(COL_COUNT, QHeaderView.ResizeMode.ResizeToContents) + hdr.setSectionResizeMode(COL_MANA, QHeaderView.ResizeMode.ResizeToContents) + hdr.setSectionResizeMode(COL_NAME, QHeaderView.ResizeMode.Stretch) + hdr.setSectionResizeMode(COL_NOTE, QHeaderView.ResizeMode.ResizeToContents) + self.itemEntered.connect(self._on_entered) + self.currentItemChanged.connect(lambda cur, _prev: self._on_entered(cur, 0)) + self._expanded: dict[str, bool] = {} + self._last_render: list | None = None + + def _on_entered(self, item: QTreeWidgetItem | None, _col: int) -> None: + if item is not None and (grp := item.data(0, GRP_ROLE)): + self.hovered.emit(int(grp)) + + def set_sections(self, sections: list[Section]) -> None: + # Skip rebuilding (and losing scroll position) when nothing changed. + signature = [(s.key, s.title, [(r.info.grp_id, r.count, r.note, r.dim) for r in s.rows]) for s in sections] + if signature == self._last_render: + return + self._last_render = signature + + for i in range(self.topLevelItemCount()): + top = self.topLevelItem(i) + self._expanded[top.data(0, GRP_ROLE + 10)] = top.isExpanded() + scroll = self.verticalScrollBar().value() + + self.clear() + bold = QFont(self.font()) + bold.setBold(True) + dim_brush = QBrush(self.palette().color(self.palette().ColorRole.PlaceholderText)) + for sec in sections: + top = QTreeWidgetItem([sec.title, "", "", ""]) + top.setFirstColumnSpanned(True) + top.setFont(0, bold) + top.setData(0, GRP_ROLE + 10, sec.key) + top.setFlags(Qt.ItemFlag.ItemIsEnabled) + self.addTopLevelItem(top) + top.setFirstColumnSpanned(True) + for row in sorted(sec.rows, key=sort_key): + it = QTreeWidgetItem([f"{row.count}×" if row.count else "", "", row.info.name, row.note]) + it.setData(0, GRP_ROLE, row.info.grp_id) + it.setData(COL_MANA, MANA_ROLE, list(row.info.mana)) + it.setToolTip(COL_NAME, f"{row.info.name}\n{row.info.type_line}") + it.setTextAlignment(COL_COUNT, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) + it.setTextAlignment(COL_NOTE, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) + if row.dim: + for c in range(4): + it.setForeground(c, dim_brush) + top.addChild(it) + top.setExpanded(self._expanded.get(sec.key, not sec.collapsed_by_default)) + self.verticalScrollBar().setValue(scroll) + + def sizeHint(self) -> QSize: + return QSize(340, 600) + diff --git a/src/mtga_assistant/ui/main_window.py b/src/mtga_assistant/ui/main_window.py new file mode 100644 index 0000000..955def5 --- /dev/null +++ b/src/mtga_assistant/ui/main_window.py @@ -0,0 +1,290 @@ +"""Main window: my deck | opponent | card preview.""" + +from __future__ import annotations + +from collections import Counter +from pathlib import Path + +from PySide6.QtCore import Qt, QTimer +from PySide6.QtGui import QAction, QKeySequence +from PySide6.QtWidgets import ( + QFileDialog, + QHBoxLayout, + QLabel, + QMainWindow, + QMessageBox, + QSplitter, + QVBoxLayout, + QWidget, +) + +from ..carddb import CardDB +from ..gamestate import GameState, MatchTracker +from ..images import ImageCache +from ..logtail import LogFollower +from .card_list import CardList, Row, Section +from .preview import CardPreview + +REFRESH_MS = 150 + + +def _panel(title: str, body: QWidget) -> QWidget: + w = QWidget() + lay = QVBoxLayout(w) + lay.setContentsMargins(4, 4, 4, 4) + label = QLabel(f"{title}") + lay.addWidget(label) + lay.addWidget(body, 1) + return w + + +class MainWindow(QMainWindow): + def __init__(self, cards: CardDB, images: ImageCache, log_path: Path | None, + replay_rate: float | None = None): + super().__init__() + self.setWindowTitle("MTGA Assistant") + self.cards = cards + self.images = images + self.tracker = MatchTracker(card_lookup=cards) + self.follower: LogFollower | None = None + self._rendered_version = -1 + + # Header + self.header = QLabel("Waiting for a match…") + self.header.setTextFormat(Qt.TextFormat.RichText) + self.warning = QLabel() + self.warning.setStyleSheet("color: #d08770;") + self.warning.setWordWrap(True) + self.warning.hide() + + # Panels + self.mine = CardList() + self.opp = CardList() + self.preview = CardPreview(cards, images) + self.mine.hovered.connect(self.preview.show_card) + self.opp.hovered.connect(self.preview.show_card) + + split = QSplitter(Qt.Orientation.Horizontal) + split.addWidget(_panel("My deck", self.mine)) + split.addWidget(_panel("Opponent", self.opp)) + split.addWidget(self.preview) + split.setStretchFactor(0, 3) + split.setStretchFactor(1, 3) + split.setStretchFactor(2, 2) + + central = QWidget() + lay = QVBoxLayout(central) + top = QHBoxLayout() + top.addWidget(self.header, 1) + lay.addLayout(top) + lay.addWidget(self.warning) + lay.addWidget(split, 1) + self.setCentralWidget(central) + + # Status bar + self.status_log = QLabel() + self.status_cache = QLabel() + self.statusBar().addWidget(self.status_log, 1) + self.statusBar().addPermanentWidget(self.status_cache) + images.size_changed.connect(self._on_cache_size) + self._on_cache_size(images.disk_usage()) + if not cards.available: + self.warning.setText("MTGA card database not found: card names are unavailable. " + "Set mtga_dir in ~/.config/mtga-assistant/config.toml.") + self.warning.show() + + self._build_menu() + + self.refresh_timer = QTimer(self) + self.refresh_timer.setInterval(REFRESH_MS) + self.refresh_timer.timeout.connect(self.refresh) + self.refresh_timer.start() + + self.resize(1280, 800) + if log_path is not None: + self.start_log(log_path, replay_rate) + else: + self.status_log.setText("Player.log not found: use File → Open log…") + + # -- menu ---------------------------------------------------------------- + + def _build_menu(self) -> None: + file_menu = self.menuBar().addMenu("&File") + open_act = QAction("&Open log…", self) + open_act.triggered.connect(lambda: self._choose_log(None)) + replay_act = QAction("&Replay log…", self) + replay_act.triggered.connect(lambda: self._choose_log(40.0)) + quit_act = QAction("&Quit", self) + quit_act.setShortcut(QKeySequence.StandardKey.Quit) + quit_act.triggered.connect(self.close) + file_menu.addActions([open_act, replay_act]) + file_menu.addSeparator() + file_menu.addAction(quit_act) + + cache_menu = self.menuBar().addMenu("&Cache") + clear_act = QAction("&Clear image cache", self) + clear_act.triggered.connect(self._clear_cache) + cache_menu.addAction(clear_act) + + def _choose_log(self, replay_rate: float | None) -> None: + start = str(self.follower.path.parent) if self.follower else str(Path.home()) + path, _ = QFileDialog.getOpenFileName(self, "Choose an MTGA log", start, "Logs (*.log);;All files (*)") + if path: + self.start_log(Path(path), replay_rate) + + def _clear_cache(self) -> None: + if QMessageBox.question(self, "Clear image cache", + f"Delete all cached card images in {self.images.dir}?") == QMessageBox.StandardButton.Yes: + self.images.clear() + + def _on_cache_size(self, size: int) -> None: + self.status_cache.setText(f"Image cache: {size / 1_048_576:.1f} / {self.images.max_bytes / 1_048_576:.0f} MB") + + # -- log ----------------------------------------------------------------- + + def start_log(self, path: Path, replay_rate: float | None = None) -> None: + if self.follower: + self.follower.stop() + self.follower.wait(2000) + self._reset_tracker() + self.follower = LogFollower(path, replay_rate) + self.follower.events.connect(self._on_events) + self.follower.status.connect(self.status_log.setText) + self.follower.reset.connect(self._reset_tracker) + self.follower.start() + + def _reset_tracker(self) -> None: + self.tracker = MatchTracker(card_lookup=self.cards) + self._rendered_version = -1 + + def _on_events(self, events: list) -> None: + for ev in events: + self.tracker.handle(ev) + + def shutdown(self) -> None: + if self.follower: + self.follower.stop() + self.follower.wait(2000) + self.follower = None + self.images.shutdown() + + def closeEvent(self, event) -> None: + self.shutdown() + super().closeEvent(event) + + # -- rendering ------------------------------------------------------------- + + def _rows(self, counts: Counter[int], note=None, dim: bool = False) -> list[Row]: + rows = [] + for grp, n in counts.items(): + if n <= 0: + continue + info = self.cards.get(grp) + rows.append(Row(info=info, count=n, note=note(grp, n) if note else "", dim=dim)) + return rows + + def refresh(self) -> None: + t = self.tracker + if t.version == self._rendered_version: + return + self._rendered_version = t.version + g = t.game + self._render_header(t, g) + if g is None: + self._render_idle(t) + return + self._render_mine(t, g) + self._render_opp(t, g) + + def _render_header(self, t: MatchTracker, g: GameState | None) -> None: + if g is None: + self.header.setText("Waiting for a match…") + self.warning.setVisible(not self.cards.available) + return + opp = t.opponent_name or "opponent" + parts = [f"vs {opp}"] + if t.event_id: + parts.append(t.event_id.replace("_", " ")) + parts.append(f"Game {g.game_number}") + if g.turn: + whose = "your" if g.active_player == g.my_seat else "their" + parts.append(f"Turn {g.turn} ({whose})") + if g.life: + parts.append(f"Life: you {g.life.get(g.my_seat, '?')} · them {g.life.get(g.opp_seat, '?')}") + if t.game_results: + w = t.game_results.count("Won") + parts.append(f"Games {w}-{len(t.game_results) - w}") + if not t.in_match and t.last_result: + parts.append(f"Match {t.last_result.lower()}") + self.header.setText(" · ".join(parts)) + + lib_size = g.zone_size("ZoneType_Library", g.my_seat) + unaccounted = sum(t.my_library_remaining().values()) - lib_size if g.zones else 0 + if g.desynced or unaccounted: + self.warning.setText( + "Part of the game log was skipped by MTGA (oversized message), so some zones may be " + "out of date until they next change." + + (f" {unaccounted} card(s) of yours are unaccounted for." if unaccounted > 0 else "") + ) + self.warning.show() + else: + self.warning.setVisible(not self.cards.available) + + def _render_idle(self, t: MatchTracker) -> None: + sections = [] + if d := t.submitted_deck: + sections.append(Section("deck", f"{d.name or 'Last submitted deck'} ({sum(d.main.values())})", + self._rows(d.main))) + if d.sideboard: + sections.append(Section("side", f"Sideboard ({sum(d.sideboard.values())})", + self._rows(d.sideboard), collapsed_by_default=True)) + self.mine.set_sections(sections) + self.opp.set_sections([]) + + def _render_mine(self, t: MatchTracker, g: GameState) -> None: + me = g.my_seat + lib_size = g.zone_size("ZoneType_Library", me) + remaining = t.my_library_remaining() + denom = lib_size or sum(remaining.values()) or 1 + + def pct(_grp: int, n: int) -> str: + return f"{100 * n / denom:.0f}%" + + # Every card in the deck; ones with no copies left stay listed, greyed out. + lib_rows = [ + Row(self.cards.get(grp), n, pct(grp, n) if n else "", dim=not n) + for grp in g.deck + for n in [remaining.get(grp, 0)] + ] + + sections = [ + Section("library", f"Library ({lib_size})", lib_rows), + Section("hand", f"Hand ({g.zone_size('ZoneType_Hand', me)})", self._rows(g.cards_in("ZoneType_Hand", owner=me))), + Section("battlefield", "Battlefield", self._rows(g.cards_in("ZoneType_Battlefield", controller=me))), + Section("graveyard", f"Graveyard ({g.zone_size('ZoneType_Graveyard', me)})", + self._rows(g.cards_in("ZoneType_Graveyard", owner=me))), + Section("exile", "Exile", self._rows(g.cards_in("ZoneType_Exile", owner=me))), + Section("sideboard", f"Sideboard ({sum(g.sideboard.values())})", self._rows(g.sideboard), + collapsed_by_default=True), + ] + self.mine.set_sections([s for s in sections if s.rows or s.key in ("library", "hand")]) + + def _render_opp(self, t: MatchTracker, g: GameState) -> None: + opp = g.opp_seat + hand_size = g.zone_size("ZoneType_Hand", opp) + lib_size = g.zone_size("ZoneType_Library", opp) + known_hand = g.opp_known_in("ZoneType_Hand") + known_lib = g.opp_known_in("ZoneType_Library") + seen = t.opp_seen_match + sections = [ + Section("battlefield", "Battlefield", self._rows(g.cards_in("ZoneType_Battlefield", controller=opp))), + Section("stack", "Stack", self._rows(g.cards_in("ZoneType_Stack", owner=opp))), + Section("hand", f"Hand ({hand_size}, {sum(known_hand.values())} known)", self._rows(known_hand)), + Section("graveyard", f"Graveyard ({g.zone_size('ZoneType_Graveyard', opp)})", + self._rows(g.cards_in("ZoneType_Graveyard", owner=opp))), + Section("exile", "Exile", self._rows(g.cards_in("ZoneType_Exile", owner=opp))), + Section("library", f"Library ({lib_size}, {sum(known_lib.values())} known)", self._rows(known_lib)), + Section("seen", f"Seen this match ({sum(seen.values())} cards)", + [r for r in self._rows(seen) if not r.info.is_token]), + ] + self.opp.set_sections([s for s in sections if s.rows or s.key in ("battlefield", "hand", "seen")]) diff --git a/src/mtga_assistant/ui/preview.py b/src/mtga_assistant/ui/preview.py new file mode 100644 index 0000000..4d20706 --- /dev/null +++ b/src/mtga_assistant/ui/preview.py @@ -0,0 +1,80 @@ +"""Large image of the hovered card, with a text fallback while it downloads.""" + +from __future__ import annotations + +from PySide6.QtCore import QSize, Qt +from PySide6.QtGui import QPixmap, QResizeEvent +from PySide6.QtWidgets import QLabel, QSizePolicy, QVBoxLayout, QWidget + +from ..carddb import CardDB +from ..images import ImageCache + + +class CardPreview(QWidget): + def __init__(self, cards: CardDB, images: ImageCache, parent=None): + super().__init__(parent) + self.cards = cards + self.images = images + self.grp_id: int | None = None + self._pixmap: QPixmap | None = None + + self.image = QLabel() + self.image.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.image.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored) + self.image.setMinimumSize(200, 280) + self.caption = QLabel() + self.caption.setWordWrap(True) + self.caption.setAlignment(Qt.AlignmentFlag.AlignCenter) + + lay = QVBoxLayout(self) + lay.setContentsMargins(4, 4, 4, 4) + lay.addWidget(self.image, 1) + lay.addWidget(self.caption) + + images.image_ready.connect(self._on_image_ready) + self._show_placeholder("Hover a card to preview it") + + def show_card(self, grp_id: int) -> None: + if grp_id == self.grp_id: + return + self.grp_id = grp_id + info = self.cards.get(grp_id) + details = [info.type_line] + if info.power or info.toughness: + details.append(f"{info.power}/{info.toughness}") + if info.set_code: + details.append(f"{info.set_code} #{info.collector_number}") + self.caption.setText(f"{info.name}
{' · '.join(d for d in details if d)}") + pm = self.images.pixmap(grp_id) + if pm is not None: + self._pixmap = pm + self._rescale() + elif self.images.is_failed(grp_id): + self._show_placeholder("No image available") + else: + self._show_placeholder("Loading image…") + + def _show_placeholder(self, text: str) -> None: + self._pixmap = None + self.image.setPixmap(QPixmap()) + self.image.setText(text) + + def _on_image_ready(self, grp_id: int) -> None: + if grp_id == self.grp_id: + self.grp_id = None + self.show_card(grp_id) + + def _rescale(self) -> None: + if self._pixmap is None: + return + self.image.setPixmap( + self._pixmap.scaled(self.image.size(), Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation) + ) + + def resizeEvent(self, event: QResizeEvent) -> None: + super().resizeEvent(event) + self._rescale() + + def sizeHint(self) -> QSize: + return QSize(320, 600) diff --git a/tests/fixtures/bo3_match.log b/tests/fixtures/bo3_match.log new file mode 100644 index 0000000..1805d56 --- /dev/null +++ b/tests/fixtures/bo3_match.log @@ -0,0 +1,601 @@ +{"MatchesV3":[]} +[UnityCrossThreadLogger]==> EventJoin {"id":"53b1b1d2-ef72-461f-a4c6-93218bbffe0c","request":"{\"EventName\":\"Traditional_Historic_Play\",\"EntryCurrencyType\":\"None\",\"EntryCurrencyPaid\":0,\"CustomTokenId\":null,\"EventChoice\":\"\",\"DebugIgnoreEntryLimits\":false}"} +[UnityCrossThreadLogger]10/16/2026 12:34:31 AM +<== EventJoin(53b1b1d2-ef72-461f-a4c6-93218bbffe0c) +{"Course":{"CourseId":"9f838f46-df35-409e-919c-50298839beb1","InternalEventName":"Traditional_Historic_Play","CurrentModule":"DeckSelect","ModulePayload":"","CourseDeckSummary":{"Attributes":[],"PreferredCosmetics":{"Avatar":"","Sleeve":"","Pet":"","Title":"","Emotes":[]}},"CardPool":[],"CardStyles":[]},"InventoryInfo":{"SeqId":4,"Changes":[],"Gems":2800,"Gold":4395,"TotalVaultProgress":965,"wcTrackPosition":7,"WildCardCommons":173,"WildCardUnCommons":153,"WildCardRares":5,"CustomTokens":{"HotPocketsProgressiveRewards":1,"PlayInToken":5,"DraftToken":5,"Token_JumpIn":2,"StarterBundle_Gate_1":1,"SealedToken":2,"BonusPackProgress":7},"Boosters":[],"VouchersV2":{},"PrizeWallsUnlocked":[],"Cosmetics":{"ArtStyles":[{"Type":"ArtStyle","Id":"416780.DA","ArtId":416780,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"415990.DA","ArtId":415990,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"406523.SG","ArtId":406523,"Variant":"SG","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"404135.DA","ArtId":404135,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"406559.SG","ArtId":406559,"Variant":"SG","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"406626.SG","ArtId":406626,"Variant":"SG","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"404488.DA","ArtId":404488,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"409514.SG","ArtId":409514,"Variant":"SG","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"402959.DA","ArtId":402959,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"400332.DA","ArtId":400332,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"402057.DA","ArtId":402057,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"406664.SG","ArtId":406664,"Variant":"SG","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"413908.MP","ArtId":413908,"Variant":"MP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416644.SH","ArtId":416644,"Variant":"SH","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416688.DA","ArtId":416688,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"419665.DA","ArtId":419665,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"411692.DA","ArtId":411692,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416781.DA","ArtId":416781,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"419492.DA","ArtId":419492,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"410632.DA","ArtId":410632,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"410641.DA","ArtId":410641,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"410635.DA","ArtId":410635,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"419672.DA","ArtId":419672,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416724.DA","ArtId":416724,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416568.DA","ArtId":416568,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"419467.DA","ArtId":419467,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"419630.DA","ArtId":419630,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"419514.DA","ArtId":419514,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421172.DA","ArtId":421172,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417870.JP","ArtId":417870,"Variant":"JP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421184.DA","ArtId":421184,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421370.FF","ArtId":421370,"Variant":"FF","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421371.FF","ArtId":421371,"Variant":"FF","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421372.FF","ArtId":421372,"Variant":"FF","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421373.FF","ArtId":421373,"Variant":"FF","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421374.FF","ArtId":421374,"Variant":"FF","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"419511.DA","ArtId":419511,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"419475.DA","ArtId":419475,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"421185.DA","ArtId":421185,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421198.DA","ArtId":421198,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421180.DA","ArtId":421180,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"421284.DA","ArtId":421284,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"417357.DA","ArtId":417357,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421114.DA","ArtId":421114,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421162.DA","ArtId":421162,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417065.DA","ArtId":417065,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421259.DA","ArtId":421259,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417343.DA","ArtId":417343,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421343.DA","ArtId":421343,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417314.DA","ArtId":417314,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417066.DA","ArtId":417066,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421159.DA","ArtId":421159,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417063.DA","ArtId":417063,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421346.DA","ArtId":421346,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417332.DA","ArtId":417332,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421297.DA","ArtId":421297,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417361.DA","ArtId":417361,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421121.DA","ArtId":421121,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421170.DA","ArtId":421170,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421342.DA","ArtId":421342,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421212.DA","ArtId":421212,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421254.DA","ArtId":421254,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421344.DA","ArtId":421344,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421303.DA","ArtId":421303,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417352.DA","ArtId":417352,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421317.DA","ArtId":421317,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421321.DA","ArtId":421321,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421331.DA","ArtId":421331,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417340.DA","ArtId":417340,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421130.DA","ArtId":421130,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421133.DA","ArtId":421133,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417319.DA","ArtId":417319,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421205.DA","ArtId":421205,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421227.DA","ArtId":421227,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421229.DA","ArtId":421229,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417351.DA","ArtId":417351,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421263.DA","ArtId":421263,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421270.DA","ArtId":421270,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421273.DA","ArtId":421273,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421282.DA","ArtId":421282,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421150.DA","ArtId":421150,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421341.DA","ArtId":421341,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421283.DA","ArtId":421283,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421345.DA","ArtId":421345,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421242.DA","ArtId":421242,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421193.DA","ArtId":421193,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421132.DA","ArtId":421132,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"421237.DA","ArtId":421237,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"417364.DA","ArtId":417364,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413352.SH","ArtId":413352,"Variant":"SH","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"421328.DA","ArtId":421328,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422142.DA","ArtId":422142,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422152.DA","ArtId":422152,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417325.DA","ArtId":417325,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"421142.DA","ArtId":421142,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"422167.DA","ArtId":422167,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422144.DA","ArtId":422144,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422179.DA","ArtId":422179,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422237.DA","ArtId":422237,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422277.DA","ArtId":422277,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422310.DA","ArtId":422310,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422137.DA","ArtId":422137,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422353.DA","ArtId":422353,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422225.DA","ArtId":422225,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422245.DA","ArtId":422245,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422258.DA","ArtId":422258,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422260.DA","ArtId":422260,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422395.DA","ArtId":422395,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422176.DA","ArtId":422176,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422393.DA","ArtId":422393,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422230.DA","ArtId":422230,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422170.MP","ArtId":422170,"Variant":"MP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422220.MP","ArtId":422220,"Variant":"MP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422366.MP","ArtId":422366,"Variant":"MP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422367.MP","ArtId":422367,"Variant":"MP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422354.DA","ArtId":422354,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422169.DA","ArtId":422169,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422272.DA","ArtId":422272,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422148.DA","ArtId":422148,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"422314.DA","ArtId":422314,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422323.DA","ArtId":422323,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422339.DA","ArtId":422339,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422315.DA","ArtId":422315,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416666.SH","ArtId":416666,"Variant":"SH","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"422342.DA","ArtId":422342,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422351.DA","ArtId":422351,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422397.DA","ArtId":422397,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430040.DA","ArtId":430040,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430061.DA","ArtId":430061,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"429642.DA","ArtId":429642,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"430122.DA","ArtId":430122,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"422005.DA","ArtId":422005,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"423549.DA","ArtId":423549,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"422035.DA","ArtId":422035,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"431437.DA","ArtId":431437,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"433347.DA","ArtId":433347,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409483.INVOCATION","ArtId":409483,"Variant":"INVOCATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413165.CRYSTAL","ArtId":413165,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"412076.MYSTICALARCHIVE","ArtId":412076,"Variant":"MYSTICALARCHIVE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"404314.TEMPLE","ArtId":404314,"Variant":"TEMPLE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409264.INVENTION","ArtId":409264,"Variant":"INVENTION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"410007.STORYBOOK","ArtId":410007,"Variant":"STORYBOOK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"407325.CONSTELLATION","ArtId":407325,"Variant":"CONSTELLATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"433625.DA","ArtId":433625,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409263.ARCHITECTURE","ArtId":409263,"Variant":"ARCHITECTURE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403040.ARCHITECTURE","ArtId":403040,"Variant":"ARCHITECTURE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"160821.HEDRON","ArtId":160821,"Variant":"HEDRON","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413174.CRYSTAL","ArtId":413174,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"433713.DA","ArtId":433713,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"409160.CONSTELLATION","ArtId":409160,"Variant":"CONSTELLATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413173.CRYSTAL","ArtId":413173,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416834.KNOTWORK","ArtId":416834,"Variant":"KNOTWORK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416609.KNOTWORK","ArtId":416609,"Variant":"KNOTWORK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"426080.GLASS1","ArtId":426080,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416665.KNOTWORK","ArtId":416665,"Variant":"KNOTWORK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403157.GLASS1","ArtId":403157,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"159739.TEMPLE","ArtId":159739,"Variant":"TEMPLE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"416061.KNOTWORK","ArtId":416061,"Variant":"KNOTWORK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403149.GLASS1","ArtId":403149,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403136.GLASS1","ArtId":403136,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"429385.DA","ArtId":429385,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"427371.GLASS1","ArtId":427371,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"423612.NEON","ArtId":423612,"Variant":"NEON","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409924.CONSTELLATION","ArtId":409924,"Variant":"CONSTELLATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"405903.GLASS1","ArtId":405903,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"429417.DA","ArtId":429417,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"418405.MYSTICALARCHIVE","ArtId":418405,"Variant":"MYSTICALARCHIVE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413169.CRYSTAL","ArtId":413169,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428594.DA","ArtId":428594,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424304.MANGAPW","ArtId":424304,"Variant":"MANGAPW","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428602.DA","ArtId":428602,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"424874.DA","ArtId":424874,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"424826.DA","ArtId":424826,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428643.DA","ArtId":428643,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424939.DA","ArtId":424939,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424866.DA","ArtId":424866,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424817.DA","ArtId":424817,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424894.DA","ArtId":424894,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424927.DA","ArtId":424927,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428592.DA","ArtId":428592,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424823.DA","ArtId":424823,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424892.DA","ArtId":424892,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425106.DA","ArtId":425106,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425731.DA","ArtId":425731,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"433420.DA","ArtId":433420,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424940.DA","ArtId":424940,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424970.DA","ArtId":424970,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424911.DA","ArtId":424911,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424858.DA","ArtId":424858,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424828.DA","ArtId":424828,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"424849.DA","ArtId":424849,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428601.DA","ArtId":428601,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424925.DA","ArtId":424925,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425080.DA","ArtId":425080,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"431879.DA","ArtId":431879,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424880.DA","ArtId":424880,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424868.DA","ArtId":424868,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"433614.DA_AA","ArtId":433614,"Variant":"DA_AA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"426081.GLASS1","ArtId":426081,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413171.CRYSTAL","ArtId":413171,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"413168.CRYSTAL","ArtId":413168,"Variant":"CRYSTAL","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403170.GLASS1","ArtId":403170,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425108.DA","ArtId":425108,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424059.DA","ArtId":424059,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424819.DA","ArtId":424819,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425792.DA","ArtId":425792,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"432506.DA","ArtId":432506,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424910.DA","ArtId":424910,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"431179.DA","ArtId":431179,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428623.DA","ArtId":428623,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424903.DA","ArtId":424903,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424969.DA","ArtId":424969,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409620.CONSTELLATION","ArtId":409620,"Variant":"CONSTELLATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424885.DA","ArtId":424885,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424923.DA","ArtId":424923,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424877.DA","ArtId":424877,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424931.DA","ArtId":424931,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424827.DA","ArtId":424827,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424862.DA","ArtId":424862,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"428651.DA","ArtId":428651,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"424899.DA","ArtId":424899,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"424928.DA","ArtId":424928,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"424825.DA","ArtId":424825,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434619.DA","ArtId":434619,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"434616.DA","ArtId":434616,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434621.DA","ArtId":434621,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434401.DA","ArtId":434401,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434433.DA","ArtId":434433,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434438.DA","ArtId":434438,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434448.DA","ArtId":434448,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434598.DA","ArtId":434598,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434599.DA","ArtId":434599,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434479.DA","ArtId":434479,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434623.DA","ArtId":434623,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434527.DA","ArtId":434527,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434468.DA","ArtId":434468,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434485.DA","ArtId":434485,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434593.DA","ArtId":434593,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434491.DA","ArtId":434491,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434556.DA","ArtId":434556,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434407.DA","ArtId":434407,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"402355.ARCHITECTURE","ArtId":402355,"Variant":"ARCHITECTURE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434630.DA","ArtId":434630,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434447.DA","ArtId":434447,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434580.DA","ArtId":434580,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434508.DA","ArtId":434508,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"134204.MANGA","ArtId":134204,"Variant":"MANGA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434495.DA","ArtId":434495,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"434427.DA","ArtId":434427,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"434597.DA","ArtId":434597,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434405.DA","ArtId":434405,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434500.STORYBOOK","ArtId":434500,"Variant":"STORYBOOK","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"434580.STORYBOOK","ArtId":434580,"Variant":"STORYBOOK","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"434487.DA","ArtId":434487,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434395.DA","ArtId":434395,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434614.STORYBOOK","ArtId":434614,"Variant":"STORYBOOK","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"434508.STORYBOOK","ArtId":434508,"Variant":"STORYBOOK","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"434613.STORYBOOK","ArtId":434613,"Variant":"STORYBOOK","ExplicitGrpIds":[],"AcquisitionFlags":"Event"},{"Type":"ArtStyle","Id":"409970.STORYBOOK","ArtId":409970,"Variant":"STORYBOOK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434515.DA","ArtId":434515,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434566.DA","ArtId":434566,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434614.DA","ArtId":434614,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434615.DA","ArtId":434615,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"162392.BGDECO","ArtId":162392,"Variant":"BGDECO","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434592.DA","ArtId":434592,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434428.DA","ArtId":434428,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"429063.MP_AA","ArtId":429063,"Variant":"MP_AA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"400275.INVENTION","ArtId":400275,"Variant":"INVENTION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434398.DA","ArtId":434398,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434551.DA","ArtId":434551,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434437.DA","ArtId":434437,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434575.DA","ArtId":434575,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"134207.MANGA","ArtId":134207,"Variant":"MANGA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"134227.MANGA","ArtId":134227,"Variant":"MANGA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434611.DA","ArtId":434611,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"410028.STORYBOOK","ArtId":410028,"Variant":"STORYBOOK","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434596.DA","ArtId":434596,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434486.DA","ArtId":434486,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434629.DA","ArtId":434629,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434518.DA","ArtId":434518,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434588.DA","ArtId":434588,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434578.DA","ArtId":434578,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438538.EQ","ArtId":438538,"Variant":"EQ","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434591.DA","ArtId":434591,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434521.DA","ArtId":434521,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434554.DA","ArtId":434554,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434534.DA","ArtId":434534,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434595.DA","ArtId":434595,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434631.DA","ArtId":434631,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434590.DA","ArtId":434590,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434415.DA","ArtId":434415,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"434627.DA","ArtId":434627,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"434594.DA","ArtId":434594,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434628.DA","ArtId":434628,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434589.DA","ArtId":434589,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"434548.DA","ArtId":434548,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439657.DA","ArtId":439657,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430560.DA","ArtId":430560,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430405.DA","ArtId":430405,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430517.DA","ArtId":430517,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430434.DA","ArtId":430434,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"146447.ARCHITECTURE","ArtId":146447,"Variant":"ARCHITECTURE","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440524.DA","ArtId":440524,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430396.DA","ArtId":430396,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439638.DA","ArtId":439638,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440545.DA","ArtId":440545,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439624.DA","ArtId":439624,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430528.DA","ArtId":430528,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"442535.DA","ArtId":442535,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430352.DA","ArtId":430352,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430365.DA","ArtId":430365,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439614.DA","ArtId":439614,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"436106.DA","ArtId":436106,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"440537.DA","ArtId":440537,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439632.DA","ArtId":439632,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"435320.DA","ArtId":435320,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430518.DA","ArtId":430518,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430292.DA","ArtId":430292,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430557.DA","ArtId":430557,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440491.DA","ArtId":440491,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439597.DA","ArtId":439597,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430519.DA","ArtId":430519,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430305.DA","ArtId":430305,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430327.DA","ArtId":430327,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430333.DA","ArtId":430333,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430426.DA","ArtId":430426,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440511.DA","ArtId":440511,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430401.DA","ArtId":430401,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430520.DA","ArtId":430520,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439647.DA","ArtId":439647,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430312.DA","ArtId":430312,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430463.DA","ArtId":430463,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"134231.MANGA","ArtId":134231,"Variant":"MANGA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"405642.CONSTELLATION","ArtId":405642,"Variant":"CONSTELLATION","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430496.DA","ArtId":430496,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440498.DA","ArtId":440498,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"435316.DA","ArtId":435316,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439669.DA","ArtId":439669,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"440535.DA","ArtId":440535,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"430354.DA","ArtId":430354,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439610.DA","ArtId":439610,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440536.DA","ArtId":440536,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"436113.DA","ArtId":436113,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430554.DA","ArtId":430554,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430332.DA","ArtId":430332,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439616.DA","ArtId":439616,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430419.DA","ArtId":430419,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440544.DA","ArtId":440544,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439642.DA","ArtId":439642,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440547.DA","ArtId":440547,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"430307.DA","ArtId":430307,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440527.DA","ArtId":440527,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439635.DA","ArtId":439635,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439602.DA","ArtId":439602,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440531.DA","ArtId":440531,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"440523.DA","ArtId":440523,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"438960.DA","ArtId":438960,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439092.DA","ArtId":439092,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438977.DA","ArtId":438977,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438931.DA","ArtId":438931,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438936.DA","ArtId":438936,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439050.DA","ArtId":439050,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438955.DA","ArtId":438955,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438942.DA","ArtId":438942,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"436151.DA","ArtId":436151,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"418126.SCHEMATIC","ArtId":418126,"Variant":"SCHEMATIC","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439008.DA","ArtId":439008,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438871.DA","ArtId":438871,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438956.DA","ArtId":438956,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438894.DA","ArtId":438894,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438900.DA","ArtId":438900,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439002.DA","ArtId":439002,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439043.DA","ArtId":439043,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438920.DA","ArtId":438920,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438922.DA","ArtId":438922,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438857.DA","ArtId":438857,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440360.DA","ArtId":440360,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439045.DA","ArtId":439045,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438864.DA","ArtId":438864,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439058.DA","ArtId":439058,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"445090.DA","ArtId":445090,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"438867.DA","ArtId":438867,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439041.DA","ArtId":439041,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438885.DA","ArtId":438885,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438868.DA","ArtId":438868,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"438999.DA","ArtId":438999,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439047.DA","ArtId":439047,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439115.DA","ArtId":439115,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438891.DA","ArtId":438891,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439035.DA","ArtId":439035,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438969.DA","ArtId":438969,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438955.DOSSIER","ArtId":438955,"Variant":"DOSSIER","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439054.DA","ArtId":439054,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438938.DA","ArtId":438938,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438970.DA","ArtId":438970,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439046.DA","ArtId":439046,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"439044.DA","ArtId":439044,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"439039.DA","ArtId":439039,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438988.DA","ArtId":438988,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439059.DA","ArtId":439059,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438991.DA","ArtId":438991,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440362.DA","ArtId":440362,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438902.DA","ArtId":438902,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"445664.DA","ArtId":445664,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440365.DA","ArtId":440365,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439007.DA","ArtId":439007,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439125.DA","ArtId":439125,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"439057.DA","ArtId":439057,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439023.DA","ArtId":439023,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439036.DA","ArtId":439036,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437720.DA","ArtId":437720,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444159.DA","ArtId":444159,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443482.DA","ArtId":443482,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443438.DA","ArtId":443438,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444199.DA","ArtId":444199,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437723.DA","ArtId":437723,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444169.DA","ArtId":444169,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443451.DA","ArtId":443451,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"443483.DA","ArtId":443483,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437705.DA","ArtId":437705,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444201.DA","ArtId":444201,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443416.DA","ArtId":443416,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443484.DA","ArtId":443484,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444151.DA","ArtId":444151,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437717.DA","ArtId":437717,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443485.DA","ArtId":443485,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439486.DA","ArtId":439486,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437706.DA","ArtId":437706,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"436294.DA","ArtId":436294,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"444203.DA","ArtId":444203,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444172.DA","ArtId":444172,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443486.DA","ArtId":443486,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443450.DA","ArtId":443450,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444204.DA","ArtId":444204,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443487.DA","ArtId":443487,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437714.DA","ArtId":437714,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439491.DA","ArtId":439491,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443469.DA","ArtId":443469,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"444206.DA","ArtId":444206,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443488.DA","ArtId":443488,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443452.DA","ArtId":443452,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"436300.DA","ArtId":436300,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444193.DA","ArtId":444193,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443489.DA","ArtId":443489,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444196.DA","ArtId":444196,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443490.DA","ArtId":443490,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444208.DA","ArtId":444208,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439484.DA","ArtId":439484,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443467.DA","ArtId":443467,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438256.DA","ArtId":438256,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"440467.DA","ArtId":440467,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"439150.DA","ArtId":439150,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"442583.DA","ArtId":442583,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"439466.DA","ArtId":439466,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"446988.DA","ArtId":446988,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447679.DA","ArtId":447679,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448111.DA","ArtId":448111,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"448052.DA","ArtId":448052,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"446982.DA","ArtId":446982,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448137.DA","ArtId":448137,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"448146.DA","ArtId":448146,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"446981.DA","ArtId":446981,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449148.DA","ArtId":449148,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"447712.DA","ArtId":447712,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"401598.DA","ArtId":401598,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450621.DA","ArtId":450621,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"102626.DA","ArtId":102626,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447098.DA","ArtId":447098,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447089.DA","ArtId":447089,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"427375.DA","ArtId":427375,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449865.DA","ArtId":449865,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447792.DA","ArtId":447792,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"409359.DA","ArtId":409359,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449245.DA","ArtId":449245,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"415628.DA","ArtId":415628,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"437928.DA","ArtId":437928,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449242.DA","ArtId":449242,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447814.DA","ArtId":447814,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403992.DA","ArtId":403992,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"415710.DA","ArtId":415710,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"405194.DA","ArtId":405194,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447076.DA","ArtId":447076,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450932.DA","ArtId":450932,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"429659.DA","ArtId":429659,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"415630.DA","ArtId":415630,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448863.DA","ArtId":448863,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449154.DA","ArtId":449154,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"402770.DA","ArtId":402770,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"123645.DA","ArtId":123645,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"80855.DA","ArtId":80855,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452241.DA","ArtId":452241,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448846.DA","ArtId":448846,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449158.DA","ArtId":449158,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449086.DA","ArtId":449086,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"415631.DA","ArtId":415631,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448953.DA","ArtId":448953,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447492.DA","ArtId":447492,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448839.DA","ArtId":448839,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447079.DA","ArtId":447079,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447707.DA","ArtId":447707,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"133224.DA","ArtId":133224,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447709.DA","ArtId":447709,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450604.DA","ArtId":450604,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"403175.DA","ArtId":403175,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447094.DA","ArtId":447094,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447075.DA","ArtId":447075,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447817.DA","ArtId":447817,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438956.DOSSIER","ArtId":438956,"Variant":"DOSSIER","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"438890.DOSSIER","ArtId":438890,"Variant":"DOSSIER","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439090.DOSSIER","ArtId":439090,"Variant":"DOSSIER","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"402493.DA","ArtId":402493,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447689.DA","ArtId":447689,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451055.DA","ArtId":451055,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447475.DA","ArtId":447475,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447113.DA","ArtId":447113,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"155303.DA","ArtId":155303,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"449232.DA","ArtId":449232,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"447074.DA","ArtId":447074,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"447088.DA","ArtId":447088,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450475.DA","ArtId":450475,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450515.DA","ArtId":450515,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450418.DA","ArtId":450418,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450449.DA","ArtId":450449,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450425.DA","ArtId":450425,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450218.DA","ArtId":450218,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450448.DA","ArtId":450448,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"404805.DA","ArtId":404805,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450191.DA","ArtId":450191,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450210.DA","ArtId":450210,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450190.DA","ArtId":450190,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450206.DA","ArtId":450206,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450197.DA","ArtId":450197,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450305.DA","ArtId":450305,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450447.DA","ArtId":450447,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450511.DA","ArtId":450511,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450451.DA","ArtId":450451,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450373.DA","ArtId":450373,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450450.DA","ArtId":450450,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450534.DA","ArtId":450534,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450483.DA","ArtId":450483,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450192.DA","ArtId":450192,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450412.DA","ArtId":450412,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450366.DA","ArtId":450366,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450310.DA","ArtId":450310,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450350.DA","ArtId":450350,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450339.DA","ArtId":450339,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450193.DA","ArtId":450193,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450376.DA","ArtId":450376,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450266.DA","ArtId":450266,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450463.DA","ArtId":450463,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450429.DA","ArtId":450429,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450196.DA","ArtId":450196,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450198.DA","ArtId":450198,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450360.DA","ArtId":450360,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450513.DA","ArtId":450513,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450372.DA","ArtId":450372,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450414.DA","ArtId":450414,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450460.DA","ArtId":450460,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450343.DA","ArtId":450343,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450359.DA","ArtId":450359,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450323.DA","ArtId":450323,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450194.DA","ArtId":450194,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450461.DA","ArtId":450461,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450459.DA","ArtId":450459,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"453190.DA","ArtId":453190,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450437.DA","ArtId":450437,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450462.DA","ArtId":450462,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450262.DA","ArtId":450262,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450203.DA","ArtId":450203,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450424.DA","ArtId":450424,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450261.DA","ArtId":450261,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440785.DA","ArtId":440785,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449685.DA","ArtId":449685,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449530.DA","ArtId":449530,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440759.DA","ArtId":440759,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449605.DA","ArtId":449605,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449602.DA","ArtId":449602,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449688.DA","ArtId":449688,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425222.DA","ArtId":425222,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440788.DA","ArtId":440788,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449687.DA","ArtId":449687,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440742.DA","ArtId":440742,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440756.DA","ArtId":440756,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440773.DA","ArtId":440773,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440751.DA","ArtId":440751,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"449679.DA","ArtId":449679,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"440758.DA","ArtId":440758,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440771.DA","ArtId":440771,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449600.DA","ArtId":449600,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449710.DA","ArtId":449710,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449633.DA","ArtId":449633,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449690.DA","ArtId":449690,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449610.DA","ArtId":449610,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440786.DA","ArtId":440786,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440755.DA","ArtId":440755,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449622.DA","ArtId":449622,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440772.DA","ArtId":440772,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449562.DA","ArtId":449562,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449686.DA","ArtId":449686,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449713.DA","ArtId":449713,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449689.DA","ArtId":449689,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449597.DA","ArtId":449597,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440778.DA","ArtId":440778,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449711.DA","ArtId":449711,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440761.DA","ArtId":440761,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440749.DA","ArtId":440749,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449702.DA","ArtId":449702,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449712.DA","ArtId":449712,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449709.DA","ArtId":449709,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440767.DA","ArtId":440767,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449549.DA","ArtId":449549,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440777.DA","ArtId":440777,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"425215.DA","ArtId":425215,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449625.DA","ArtId":449625,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440768.DA","ArtId":440768,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449634.DA","ArtId":449634,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"449701.DA","ArtId":449701,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"449714.DA","ArtId":449714,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440776.DA","ArtId":440776,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449548.DA","ArtId":449548,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449542.DA","ArtId":449542,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440775.DA","ArtId":440775,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449715.DA","ArtId":449715,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449556.DA","ArtId":449556,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440774.DA","ArtId":440774,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449698.DA","ArtId":449698,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449553.DA","ArtId":449553,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449598.DA","ArtId":449598,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444069.DA","ArtId":444069,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448420.DA","ArtId":448420,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444044.DA","ArtId":444044,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448464.DA","ArtId":448464,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448469.DA","ArtId":448469,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"445660.DA","ArtId":445660,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448465.DA","ArtId":448465,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444057.DA","ArtId":444057,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444059.DA","ArtId":444059,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448470.DA","ArtId":448470,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444058.DA","ArtId":444058,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444120.DA","ArtId":444120,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451340.DA","ArtId":451340,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448466.DA","ArtId":448466,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444060.DA","ArtId":444060,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"445989.DA","ArtId":445989,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452866.DA","ArtId":452866,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448471.DA","ArtId":448471,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448408.DA","ArtId":448408,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449976.DA","ArtId":449976,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448431.DA","ArtId":448431,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448467.DA","ArtId":448467,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448440.DA","ArtId":448440,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448472.DA","ArtId":448472,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"445655.DA","ArtId":445655,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"444122.DA","ArtId":444122,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"448445.DA","ArtId":448445,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444111.DA","ArtId":444111,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440365.MAGNIFYINGGLASS","ArtId":440365,"Variant":"MAGNIFYINGGLASS","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444076.DA","ArtId":444076,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444053.DA","ArtId":444053,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448468.DA","ArtId":448468,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448473.DA","ArtId":448473,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444091.DA","ArtId":444091,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443888.DA","ArtId":443888,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443939.DA","ArtId":443939,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443941.DA","ArtId":443941,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443953.DA","ArtId":443953,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444066.DA","ArtId":444066,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444967.DA","ArtId":444967,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443951.DA","ArtId":443951,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443967.DA","ArtId":443967,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444013.DA","ArtId":444013,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444961.DA","ArtId":444961,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444964.DA","ArtId":444964,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444960.DA","ArtId":444960,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449988.DA","ArtId":449988,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444965.DA","ArtId":444965,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443892.DA","ArtId":443892,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444019.DA","ArtId":444019,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443982.DA","ArtId":443982,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450762.DA","ArtId":450762,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444391.DA","ArtId":444391,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"448022.DA","ArtId":448022,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444596.DA","ArtId":444596,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"443908.DA","ArtId":443908,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450700.DA_AA","ArtId":450700,"Variant":"DA_AA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444570.DA","ArtId":444570,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444440.DA","ArtId":444440,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444385.DA","ArtId":444385,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450692.DA","ArtId":450692,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444369.DA","ArtId":444369,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450734.DA","ArtId":450734,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450679.DA","ArtId":450679,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450727.DA","ArtId":450727,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450718.DA","ArtId":450718,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444392.DA","ArtId":444392,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444575.DA","ArtId":444575,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444534.DA","ArtId":444534,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450704.DA","ArtId":450704,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450758.DA","ArtId":450758,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450703.DA","ArtId":450703,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450678.DA","ArtId":450678,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444340.DA","ArtId":444340,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444344.DA","ArtId":444344,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444579.DA","ArtId":444579,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450757.DA","ArtId":450757,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450741.DA","ArtId":450741,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444443.DA","ArtId":444443,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444611.DA","ArtId":444611,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444488.DA","ArtId":444488,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444466.DA","ArtId":444466,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444498.DA","ArtId":444498,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444583.DA","ArtId":444583,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444373.DA","ArtId":444373,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450675.DA","ArtId":450675,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444372.DA","ArtId":444372,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450687.DA","ArtId":450687,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"444582.DA","ArtId":444582,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444516.DA","ArtId":444516,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444441.DA","ArtId":444441,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444396.DA","ArtId":444396,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450691.DA","ArtId":450691,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450690.DA","ArtId":450690,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450715.DA","ArtId":450715,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444617.DA","ArtId":444617,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444561.DA","ArtId":444561,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444386.DA","ArtId":444386,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444544.DA","ArtId":444544,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444536.DA","ArtId":444536,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444567.DA","ArtId":444567,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444571.DA","ArtId":444571,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444578.DA","ArtId":444578,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444531.DA","ArtId":444531,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450673.DA","ArtId":450673,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"444513.DA","ArtId":444513,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444419.DA","ArtId":444419,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"444573.DA","ArtId":444573,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"453373.DA","ArtId":453373,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"451913.DA","ArtId":451913,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"453320.DA","ArtId":453320,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"453409.DA","ArtId":453409,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"453336.DA","ArtId":453336,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449367.DA","ArtId":449367,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457396.DA","ArtId":457396,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457414.DA","ArtId":457414,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457382.DA","ArtId":457382,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457296.DA","ArtId":457296,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457499.DA","ArtId":457499,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457315.DA","ArtId":457315,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457331.DA","ArtId":457331,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457384.DA","ArtId":457384,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457349.DA","ArtId":457349,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457272.DA","ArtId":457272,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457387.DA","ArtId":457387,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457293.DA","ArtId":457293,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457397.DA","ArtId":457397,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457399.DA","ArtId":457399,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457398.DA","ArtId":457398,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"460491.DA","ArtId":460491,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457400.DA","ArtId":457400,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457505.DA","ArtId":457505,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457385.DA","ArtId":457385,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457388.DA","ArtId":457388,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457313.DA","ArtId":457313,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457330.DA","ArtId":457330,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457506.DA","ArtId":457506,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457351.DA","ArtId":457351,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457507.DA","ArtId":457507,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457391.DA","ArtId":457391,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457504.DA","ArtId":457504,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457386.DA","ArtId":457386,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457277.DA","ArtId":457277,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457383.DA","ArtId":457383,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"456122.DA","ArtId":456122,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457392.DA","ArtId":457392,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457389.DA","ArtId":457389,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457390.DA","ArtId":457390,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457295.DA","ArtId":457295,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"460974.DA","ArtId":460974,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457297.DA","ArtId":457297,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457280.DA","ArtId":457280,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457316.DA","ArtId":457316,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457317.DA","ArtId":457317,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457334.DA","ArtId":457334,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457358.DA","ArtId":457358,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457332.DA","ArtId":457332,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457373.DA","ArtId":457373,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457502.DA","ArtId":457502,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457378.DA","ArtId":457378,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457355.DA","ArtId":457355,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457375.DA","ArtId":457375,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457503.DA","ArtId":457503,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457494.DA","ArtId":457494,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457379.DA","ArtId":457379,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"456057.DA","ArtId":456057,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"455920.DA","ArtId":455920,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"455075.DA","ArtId":455075,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"463364.DA","ArtId":463364,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"455956.DA","ArtId":455956,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"455077.DA","ArtId":455077,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459701.DA","ArtId":459701,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459793.DA","ArtId":459793,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"463864.DA","ArtId":463864,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"459740.DA","ArtId":459740,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459597.DA","ArtId":459597,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459733.DA","ArtId":459733,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459746.DA","ArtId":459746,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459671.DA","ArtId":459671,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459734.DA","ArtId":459734,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459731.DA","ArtId":459731,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459603.DA","ArtId":459603,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"440857.FF_FIELDNOTES","ArtId":440857,"Variant":"FF_FIELDNOTES","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"441633.FF_FIELDNOTES","ArtId":441633,"Variant":"FF_FIELDNOTES","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439453.FF_FIELDNOTES","ArtId":439453,"Variant":"FF_FIELDNOTES","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459674.DA","ArtId":459674,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"458996.DA","ArtId":458996,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459632.DA","ArtId":459632,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459696.DA","ArtId":459696,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459680.DA","ArtId":459680,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459697.DA","ArtId":459697,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459700.DA","ArtId":459700,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459684.DA","ArtId":459684,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459698.DA","ArtId":459698,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459687.DA","ArtId":459687,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459699.DA","ArtId":459699,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459742.DA","ArtId":459742,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459640.DA","ArtId":459640,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459785.DA","ArtId":459785,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459656.DA","ArtId":459656,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459008.DA","ArtId":459008,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459812.DA","ArtId":459812,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459695.DA","ArtId":459695,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459818.DA","ArtId":459818,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459717.DA","ArtId":459717,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459816.DA","ArtId":459816,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"464862.DA","ArtId":464862,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459009.DA","ArtId":459009,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459677.DA","ArtId":459677,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459644.DA","ArtId":459644,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"459676.DA","ArtId":459676,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459821.DA","ArtId":459821,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459825.DA","ArtId":459825,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459824.DA","ArtId":459824,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459007.DA","ArtId":459007,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459005.DA","ArtId":459005,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459689.DA","ArtId":459689,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459673.DA","ArtId":459673,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459682.DA","ArtId":459682,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459681.DA","ArtId":459681,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459685.DA","ArtId":459685,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459716.DA","ArtId":459716,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459001.DA","ArtId":459001,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459002.DA","ArtId":459002,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459754.DA","ArtId":459754,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459744.DA","ArtId":459744,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459757.DA","ArtId":459757,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459006.DA","ArtId":459006,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"459667.DA","ArtId":459667,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450879.OM1","ArtId":450879,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450879.OM1_DA","ArtId":450879,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450854.OM1","ArtId":450854,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450852.OM1","ArtId":450852,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450852.OM1_DA","ArtId":450852,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"454179.OM1","ArtId":454179,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"454179.OM1_DA","ArtId":454179,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449957.OM1","ArtId":449957,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449957.OM1_DA","ArtId":449957,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449943.OM1","ArtId":449943,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449943.OM1_DA","ArtId":449943,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449933.OM1","ArtId":449933,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449941.OM1","ArtId":449941,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449936.OM1","ArtId":449936,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450893.OM1","ArtId":450893,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449947.OM1","ArtId":449947,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449920.OM1","ArtId":449920,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449920.OM1_DA","ArtId":449920,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451071.OM1","ArtId":451071,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451057.OM1","ArtId":451057,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451057.OM1_DA","ArtId":451057,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450089.OM1","ArtId":450089,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452728.OM1","ArtId":452728,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451068.OM1","ArtId":451068,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449930.OM1","ArtId":449930,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449958.OM1","ArtId":449958,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449958.OM1_DA","ArtId":449958,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452755.OM1","ArtId":452755,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452755.OM1_DA","ArtId":452755,"Variant":"OM1_DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"450834.OM1","ArtId":450834,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450834.OM1_DA","ArtId":450834,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450840.OM1","ArtId":450840,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450840.OM1_DA","ArtId":450840,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451069.OM1","ArtId":451069,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449953.OM1","ArtId":449953,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449935.OM1","ArtId":449935,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452738.OM1","ArtId":452738,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450861.OM1","ArtId":450861,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450861.OM1_DA","ArtId":450861,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449952.OM1","ArtId":449952,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449951.OM1","ArtId":449951,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451062.OM1","ArtId":451062,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451062.OM1_DA","ArtId":451062,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449955.OM1","ArtId":449955,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450896.OM1","ArtId":450896,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450088.OM1","ArtId":450088,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451064.OM1","ArtId":451064,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451064.OM1_DA","ArtId":451064,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450853.OM1","ArtId":450853,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449916.OM1","ArtId":449916,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450146.OM1","ArtId":450146,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450144.OM1","ArtId":450144,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449948.OM1","ArtId":449948,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449948.OM1_DA","ArtId":449948,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451060.OM1","ArtId":451060,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451060.OM1_DA","ArtId":451060,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449922.OM1","ArtId":449922,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452752.OM1","ArtId":452752,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452733.OM1","ArtId":452733,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452735.OM1","ArtId":452735,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452737.OM1","ArtId":452737,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449956.OM1","ArtId":449956,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449921.OM1","ArtId":449921,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449921.OM1_DA","ArtId":449921,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450889.OM1","ArtId":450889,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450889.OM1_DA","ArtId":450889,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450890.OM1","ArtId":450890,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450890.OM1_DA","ArtId":450890,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450856.OM1","ArtId":450856,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450856.OM1_DA","ArtId":450856,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450860.OM1","ArtId":450860,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451066.OM1","ArtId":451066,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451066.OM1_DA","ArtId":451066,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452740.OM1","ArtId":452740,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452740.OM1_DA","ArtId":452740,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452732.OM1","ArtId":452732,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450880.OM1","ArtId":450880,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450892.OM1","ArtId":450892,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"462645.OM1","ArtId":462645,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"462645.OM1_DA","ArtId":462645,"Variant":"OM1_DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"449919.OM1","ArtId":449919,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451565.OM1","ArtId":451565,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449954.OM1","ArtId":449954,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450142.OM1","ArtId":450142,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450093.OM1","ArtId":450093,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450094.OM1","ArtId":450094,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449931.OM1","ArtId":449931,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451070.OM1","ArtId":451070,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451070.OM1_DA","ArtId":451070,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449946.OM1","ArtId":449946,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450841.OM1","ArtId":450841,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452725.OM1","ArtId":452725,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449939.OM1","ArtId":449939,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449924.OM1","ArtId":449924,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450868.OM1","ArtId":450868,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450868.OM1_DA","ArtId":450868,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452731.OM1","ArtId":452731,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449925.OM1","ArtId":449925,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449918.OM1","ArtId":449918,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450855.OM1","ArtId":450855,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452727.OM1","ArtId":452727,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450143.OM1","ArtId":450143,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452724.OM1","ArtId":452724,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449937.OM1","ArtId":449937,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450090.OM1","ArtId":450090,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450888.OM1","ArtId":450888,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450888.OM1_DA","ArtId":450888,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450838.OM1","ArtId":450838,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450846.OM1","ArtId":450846,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449934.OM1","ArtId":449934,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449934.OM1_DA","ArtId":449934,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449929.OM1","ArtId":449929,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450897.OM1","ArtId":450897,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452734.OM1","ArtId":452734,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450870.OM1","ArtId":450870,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450098.OM1","ArtId":450098,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451067.OM1","ArtId":451067,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451065.OM1","ArtId":451065,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451065.OM1_DA","ArtId":451065,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450842.OM1","ArtId":450842,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450837.OM1","ArtId":450837,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450843.OM1","ArtId":450843,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452746.OM1","ArtId":452746,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452741.OM1","ArtId":452741,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451063.OM1","ArtId":451063,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451063.OM1_DA","ArtId":451063,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449917.OM1","ArtId":449917,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452730.OM1","ArtId":452730,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449928.OM1","ArtId":449928,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450092.OM1","ArtId":450092,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449923.OM1","ArtId":449923,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449926.OM1","ArtId":449926,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449926.OM1_DA","ArtId":449926,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449932.OM1","ArtId":449932,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449959.OM1","ArtId":449959,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449940.OM1","ArtId":449940,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449950.OM1","ArtId":449950,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449950.OM1_DA","ArtId":449950,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449945.OM1","ArtId":449945,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449938.OM1","ArtId":449938,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449942.OM1","ArtId":449942,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451061.OM1","ArtId":451061,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451061.OM1_DA","ArtId":451061,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450091.OM1","ArtId":450091,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451058.OM1","ArtId":451058,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451058.OM1_DA","ArtId":451058,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449960.OM1","ArtId":449960,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449949.OM1","ArtId":449949,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451564.OM1","ArtId":451564,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451564.OM1_DA","ArtId":451564,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452726.OM1","ArtId":452726,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450849.OM1","ArtId":450849,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452751.OM1","ArtId":452751,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452744.OM1","ArtId":452744,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451059.OM1","ArtId":451059,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450871.OM1","ArtId":450871,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452745.OM1","ArtId":452745,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452743.OM1","ArtId":452743,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450862.OM1","ArtId":450862,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450867.OM1","ArtId":450867,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452750.OM1","ArtId":452750,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450851.OM1","ArtId":450851,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450866.OM1","ArtId":450866,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450866.OM1_DA","ArtId":450866,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450859.OM1","ArtId":450859,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452753.OM1","ArtId":452753,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452747.OM1","ArtId":452747,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452747.OM1_DA","ArtId":452747,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450869.OM1","ArtId":450869,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450836.OM1","ArtId":450836,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451558.OM1","ArtId":451558,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450147.OM1","ArtId":450147,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450887.OM1","ArtId":450887,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450887.OM1_DA","ArtId":450887,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451562.OM1","ArtId":451562,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450864.OM1","ArtId":450864,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451559.OM1","ArtId":451559,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450895.OM1","ArtId":450895,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"451557.OM1","ArtId":451557,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452754.OM1","ArtId":452754,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450099.OM1","ArtId":450099,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450875.OM1","ArtId":450875,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450875.OM1_DA","ArtId":450875,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452742.OM1","ArtId":452742,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"456679.OM1","ArtId":456679,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452739.OM1","ArtId":452739,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450097.OM1","ArtId":450097,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450141.OM1","ArtId":450141,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452749.OM1","ArtId":452749,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"449927.OM1","ArtId":449927,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450844.OM1","ArtId":450844,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452729.OM1","ArtId":452729,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452729.OM1_DA","ArtId":452729,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"452736.OM1","ArtId":452736,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450858.OM1","ArtId":450858,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450858.OM1_DA","ArtId":450858,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450891.OM1","ArtId":450891,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450891.OM1_DA","ArtId":450891,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450845.OM1","ArtId":450845,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450845.OM1_DA","ArtId":450845,"Variant":"OM1_DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"450833.OM1","ArtId":450833,"Variant":"OM1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"456862.DA","ArtId":456862,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"454721.DA","ArtId":454721,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"454571.DA","ArtId":454571,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"454621.DA","ArtId":454621,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"457851.DA","ArtId":457851,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457830.DA","ArtId":457830,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457858.DA","ArtId":457858,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457937.DA","ArtId":457937,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457884.DA","ArtId":457884,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457940.DA","ArtId":457940,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457907.DA","ArtId":457907,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457943.DA","ArtId":457943,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457877.DA","ArtId":457877,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457955.DA","ArtId":457955,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457816.DA","ArtId":457816,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457870.DA","ArtId":457870,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457931.DA","ArtId":457931,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"417854.JP","ArtId":417854,"Variant":"JP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417869.JP","ArtId":417869,"Variant":"JP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417855.JP","ArtId":417855,"Variant":"JP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"417856.JP","ArtId":417856,"Variant":"JP","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457815.DA","ArtId":457815,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457929.DA","ArtId":457929,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"458937.DA","ArtId":458937,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457892.DA","ArtId":457892,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457902.DA","ArtId":457902,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457866.DA","ArtId":457866,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457802.DA","ArtId":457802,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457868.DA","ArtId":457868,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457965.DA","ArtId":457965,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457840.DA","ArtId":457840,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457817.DA","ArtId":457817,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457974.DA","ArtId":457974,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"CodeRedemption"},{"Type":"ArtStyle","Id":"457949.DA","ArtId":457949,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457952.DA","ArtId":457952,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457960.DA","ArtId":457960,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457956.DA","ArtId":457956,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457933.DA","ArtId":457933,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457936.DA","ArtId":457936,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457954.DA","ArtId":457954,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457825.DA","ArtId":457825,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457934.DA","ArtId":457934,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457856.DA","ArtId":457856,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"403143.GLASS1","ArtId":403143,"Variant":"GLASS1","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457850.DA","ArtId":457850,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457926.DA","ArtId":457926,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457948.DA","ArtId":457948,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457958.DA","ArtId":457958,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457909.DA","ArtId":457909,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457901.DA","ArtId":457901,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457985.DA","ArtId":457985,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457879.DA","ArtId":457879,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"457845.DA","ArtId":457845,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"457828.DA","ArtId":457828,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457867.DA","ArtId":457867,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457945.DA","ArtId":457945,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457841.DA","ArtId":457841,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457836.DA","ArtId":457836,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457818.DA","ArtId":457818,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457894.DA","ArtId":457894,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457941.DA","ArtId":457941,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457935.DA","ArtId":457935,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457914.DA","ArtId":457914,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457989.DA","ArtId":457989,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457987.DA","ArtId":457987,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457885.DA","ArtId":457885,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457912.DA","ArtId":457912,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"457986.DA","ArtId":457986,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457988.DA","ArtId":457988,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"439073.MAGNIFYINGGLASS","ArtId":439073,"Variant":"MAGNIFYINGGLASS","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461596.DA","ArtId":461596,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461521.DA","ArtId":461521,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461730.DA","ArtId":461730,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461759.DA","ArtId":461759,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461732.DA","ArtId":461732,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461607.DA","ArtId":461607,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461640.DA","ArtId":461640,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461734.DA","ArtId":461734,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461680.DA","ArtId":461680,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461587.DA","ArtId":461587,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461527.DA","ArtId":461527,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461762.DA","ArtId":461762,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"457942.DA","ArtId":457942,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"457844.DA","ArtId":457844,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"SeasonReward"},{"Type":"ArtStyle","Id":"461736.DA","ArtId":461736,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461565.DA","ArtId":461565,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461763.DA","ArtId":461763,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461765.DA","ArtId":461765,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461766.DA","ArtId":461766,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461683.DA","ArtId":461683,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461604.DA","ArtId":461604,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461764.DA","ArtId":461764,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461761.DA","ArtId":461761,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461645.DA","ArtId":461645,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461552.DA","ArtId":461552,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461774.DA","ArtId":461774,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461685.DA","ArtId":461685,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461741.DA","ArtId":461741,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461517.DA","ArtId":461517,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461760.DA","ArtId":461760,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461731.DA","ArtId":461731,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461664.DA","ArtId":461664,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461721.DA","ArtId":461721,"Variant":"DA","ExplicitGrpIds":[],"AcquisitionFlags":"BattlePass"},{"Type":"ArtStyle","Id":"461547.DA","ArtId":461547,"Variant":"DA","ExplicitGrpIds":[]},{"Type":"ArtStyle","Id":"461733.DA","ArtId":461733,"Variant":"DA","ExplicitGrpIds":[]}],"Avatars":[{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_ChandraNalaar","AcquisitionFlagsInternal":1},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_AjaniGoldmane","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_GideonJura"},{"Type":"Avatar","Id":"Avatar_Basic_Teferi"},{"Type":"Avatar","Id":"Avatar_Basic_SarkhanVol"},{"Type":"Avatar","Id":"Avatar_Basic_Tezzeret"},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_VivienReid","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_NissaRevane"},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_LilianaVess","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_Karn"},{"Type":"Avatar","Id":"Avatar_Basic_JayaBallard"},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_JaceBeleren","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_Bolas_DragonGod"},{"Type":"Avatar","Id":"Avatar_Basic_Olivia_VOW"},{"Type":"Avatar","Id":"Avatar_Basic_Oko_ELD"},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Sorin_VOW","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_Kaito_NEO","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_NikoAris"},{"Type":"Avatar","Id":"Avatar_Basic_Urabrask_ONE"},{"Type":"Avatar","Id":"Avatar_Basic_Legolas_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Adventurer"},{"Type":"Avatar","Id":"Avatar_Basic_Gandalf_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Gollum_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Galadriel_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Frodo_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Eowyn_LTR"},{"Type":"Avatar","Id":"Avatar_Basic_Aragorn_LTR"},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Kellan_WOE","AcquisitionFlagsInternal":4},{"Type":"Avatar","Id":"Avatar_Basic_UB_PinkiePie"},{"Type":"Avatar","Id":"Avatar_Basic_Quintorius_LCI"},{"Type":"Avatar","Id":"Avatar_Basic_Gishath_LCI"},{"Type":"Avatar","Id":"Avatar_Basic_Huatli_LCI"},{"Type":"Avatar","Id":"Avatar_Basic_OkinecAhau_LCI"},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_Elspeth_MOM","AcquisitionFlagsInternal":1},{"Type":"Avatar","AcquisitionFlags":"DefaultLoginGrant","Id":"Avatar_Basic_Ashiok_WAR","AcquisitionFlagsInternal":1},{"Type":"Avatar","Id":"Avatar_Basic_Vito_LCI"},{"Type":"Avatar","Id":"Avatar_Basic_Brass_LCI"},{"Type":"Avatar","Id":"Avatar_Basic_Kaya_MKM"},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Kellan_OTJ","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Rakdos_OTJ","AcquisitionFlagsInternal":4},{"Type":"Avatar","Id":"Avatar_Basic_Slimefoot_DMU"},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Kiora_DG","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Zimone_FDN","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Chandra_DFT","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"Achievements","Id":"Avatar_Basic_Kaito_FDN","AcquisitionFlagsInternal":64},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Sarkhan_TDM","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Kotis_TDM","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"Achievements","Id":"Avatar_Basic_Chandra_FDN","AcquisitionFlagsInternal":64},{"Type":"Avatar","AcquisitionFlags":"CodeRedemption","Id":"Avatar_Basic_Cloud_FIN","AcquisitionFlagsInternal":4},{"Type":"Avatar","AcquisitionFlags":"Achievements","Id":"Avatar_Basic_Vivien_FDN","AcquisitionFlagsInternal":64},{"Type":"Avatar","Id":"Avatar_Basic_Tezzeret_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_Mmmenon_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_Kilo_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_Alpharael_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_Szarel_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_Haliya_EOE"},{"Type":"Avatar","Id":"Avatar_Basic_SliverGravemother_CMM"},{"Type":"Avatar","AcquisitionFlags":"Achievements","Id":"Avatar_Basic_Liliana_FDN","AcquisitionFlagsInternal":64},{"Type":"Avatar","Id":"Avatar_Basic_Fleem_OM1"},{"Type":"Avatar","Id":"Avatar_Basic_Jace_ONE"},{"Type":"Avatar","Id":"Avatar_Basic_Grub_ECL"},{"Type":"Avatar","Id":"Avatar_Basic_Ashling_ECL"},{"Type":"Avatar","Id":"Avatar_Basic_Brigid_ECL"},{"Type":"Avatar","Id":"Avatar_Basic_Sygg_ECL"},{"Type":"Avatar","Id":"Avatar_Basic_Maralen_ECL"},{"Type":"Avatar","Id":"Avatar_Basic_Ferrafor_ECL"},{"Type":"Avatar","AcquisitionFlags":"Achievements","Id":"Avatar_Basic_Ajani_FDN","AcquisitionFlagsInternal":64},{"Type":"Avatar","Id":"Avatar_Basic_Raphael_TMT"},{"Type":"Avatar","Id":"Avatar_Basic_DellianFell_SOS"},{"Type":"Avatar","Id":"Avatar_Basic_Liliana_S25"},{"Type":"Avatar","Id":"Avatar_Basic_Emrakul_S25"},{"Type":"Avatar","Id":"Avatar_Basic_Kozilek_S25"},{"Type":"Avatar","Id":"Avatar_Basic_Ulamog_MH3"},{"Type":"Avatar","Id":"Avatar_Basic_Bilbo_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Smaug_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Gollum_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Bard_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Radagast_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Thorin_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_BilboRiddles_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Gandalf_HOB"},{"Type":"Avatar","Id":"Avatar_Basic_Jace_FRA"},{"Type":"Avatar","Id":"Avatar_Basic_AltGarruk_FRA"},{"Type":"Avatar","Id":"Avatar_Basic_AltAjani_FRA"},{"Type":"Avatar","Id":"Avatar_Basic_AltLiliana_FRA"},{"Type":"Avatar","Id":"Avatar_Basic_AltChandra_FRA"},{"Type":"Avatar","Id":"Avatar_Basic_Tam_FRA"}],"Pets":[{"Type":"Pet","Id":"VOW_Bat.Level1","Name":"VOW_Bat","Variant":"Level1"},{"Type":"Pet","Id":"VOW_Bat.Level2","Name":"VOW_Bat","Variant":"Level2"},{"Type":"Pet","Id":"VOW_Bat.Level3","Name":"VOW_Bat","Variant":"Level3"},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"NEO_Koi.Level1","Name":"NEO_Koi","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"NEO_Koi.Level2","Name":"NEO_Koi","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","Id":"KHM_Preorder_Bear.Level1","Name":"KHM_Preorder_Bear","Variant":"Level1"},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"LTR_Mastery.Level1","Name":"LTR_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"LTR_Mastery.Level2","Name":"LTR_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"WOE_Preorder.Level1","Name":"WOE_Preorder","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"LTR_Mastery.Level3","Name":"LTR_Mastery","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"WOE_Mastery.Level1","Name":"WOE_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"WOE_Mastery.Level2","Name":"WOE_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"WOE_Mastery.Level3","Name":"WOE_Mastery","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","Id":"LCI_Mastery.Level1","Name":"LCI_Mastery","Variant":"Level1"},{"Type":"Pet","Id":"LCI_Mastery.Level2","Name":"LCI_Mastery","Variant":"Level2"},{"Type":"Pet","Id":"IKO_BattlePass.Skin4","Name":"IKO_BattlePass","Variant":"Skin4"},{"Type":"Pet","Id":"LCI_Mastery.Level3","Name":"LCI_Mastery","Variant":"Level3"},{"Type":"Pet","Id":"MKM_Mastery.Level1","Name":"MKM_Mastery","Variant":"Level1"},{"Type":"Pet","Id":"MKM_Mastery.Level2","Name":"MKM_Mastery","Variant":"Level2"},{"Type":"Pet","Id":"MKM_Mastery.Level3","Name":"MKM_Mastery","Variant":"Level3"},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"OTJ_Rock.Level1","Name":"OTJ_Rock","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"OTJ_Mastery.Level1","Name":"OTJ_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"OTJ_Mastery.Level2","Name":"OTJ_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"Summer2023_Store.Level1","Name":"Summer2023_Store","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FDN_Mastery.Level1","Name":"FDN_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FDN_Mastery.Level2","Name":"FDN_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FDN_Mastery.Level3","Name":"FDN_Mastery","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"DFT_Mastery.Level1","Name":"DFT_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"DFT_Mastery.Level2","Name":"DFT_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"DFT_Mastery.Level3","Name":"DFT_Mastery","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","Id":"OTJ_Rock.Level2","Name":"OTJ_Rock","Variant":"Level2"},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"TDM_Mastery_Companion.Level1","Name":"TDM_Mastery_Companion","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"TDM_Mastery_Companion.Level2","Name":"TDM_Mastery_Companion","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"TDM_Preorder_Companion.Level1","Name":"TDM_Preorder_Companion","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"TDM_Mastery_Companion.Level3","Name":"TDM_Mastery_Companion","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"TDM_Mastery_Companion.Level4","Name":"TDM_Mastery_Companion","Variant":"Level4","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FIN_Mastery.Level1","Name":"FIN_Mastery","Variant":"Level1","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FIN_Mastery.Level2","Name":"FIN_Mastery","Variant":"Level2","AcquisitionFlagsInternal":4},{"Type":"Pet","AcquisitionFlags":"CodeRedemption","Id":"FIN_Mastery.Level3","Name":"FIN_Mastery","Variant":"Level3","AcquisitionFlagsInternal":4},{"Type":"Pet","Id":"EOE_Mastery.Level1","Name":"EOE_Mastery","Variant":"Level1"},{"Type":"Pet","Id":"EOE_Mastery.Level2","Name":"EOE_Mastery","Variant":"Level2"},{"Type":"Pet","Id":"EOE_Mastery.Level3","Name":"EOE_Mastery","Variant":"Level3"},{"Type":"Pet","Id":"OM1_Mastery_Companion.Level1","Name":"OM1_Mastery_Companion","Variant":"Level1"},{"Type":"Pet","Id":"OM1_Mastery_Companion.Level2","Name":"OM1_Mastery_Companion","Variant":"Level2"},{"Type":"Pet","Id":"OM1_Mastery_Companion.Level3","Name":"OM1_Mastery_Companion","Variant":"Level3"},{"Type":"Pet","Id":"ECL_Mastery.Level1","Name":"ECL_Mastery","Variant":"Level1"},{"Type":"Pet","Id":"ECL_Mastery.Level2","Name":"ECL_Mastery","Variant":"Level2"},{"Type":"Pet","Id":"ECL_Mastery.Level3","Name":"ECL_Mastery","Variant":"Level3"},{"Type":"Pet","Id":"AFR_Dragon.Skin3","Name":"AFR_Dragon","Variant":"Skin3"},{"Type":"Pet","Id":"SOS_Mastery_Companion.Level1","Name":"SOS_Mastery_Companion","Variant":"Level1"},{"Type":"Pet","Id":"SOS_Mastery_Companion.Level2","Name":"SOS_Mastery_Companion","Variant":"Level2"},{"Type":"Pet","Id":"SOS_Mastery_Companion.Level3","Name":"SOS_Mastery_Companion","Variant":"Level3"},{"Type":"Pet","Id":"SOS_Mastery_Companion.Level4","Name":"SOS_Mastery_Companion","Variant":"Level4"},{"Type":"Pet","Id":"HOB_Mastery_Companion.Level1","Name":"HOB_Mastery_Companion","Variant":"Level1"},{"Type":"Pet","AcquisitionFlags":"BattlePass","Id":"HOB_Mastery_Companion.Level2","Name":"HOB_Mastery_Companion","Variant":"Level2","AcquisitionFlagsInternal":8},{"Type":"Pet","AcquisitionFlags":"BattlePass","Id":"HOB_Mastery_Companion.Level3","Name":"HOB_Mastery_Companion","Variant":"Level3","AcquisitionFlagsInternal":8},{"Type":"Pet","Id":"FRA_Mastery_Companion.Level1","Name":"FRA_Mastery_Companion","Variant":"Level1"},{"Type":"Pet","AcquisitionFlags":"BattlePass","Id":"FRA_Mastery_Companion.Level2","Name":"FRA_Mastery_Companion","Variant":"Level2","AcquisitionFlagsInternal":8}],"Sleeves":[{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_STX_418005","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_STX_418002","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_STX_418003","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_STX_418001","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_STX_418004","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_MID_431144_R"},{"Type":"Sleeve","Id":"CardBack_VOW_426125"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Basic_Thunderstorm_SnowCoveredMountain","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_LocketOrzhov"},{"Type":"Sleeve","Id":"CardBack_Metallic_CollegeWB"},{"Type":"Sleeve","Id":"CardBack_Metallic_CollegeUR"},{"Type":"Sleeve","Id":"CardBack_VOW_422028"},{"Type":"Sleeve","Id":"CardBack_VOW_417062"},{"Type":"Sleeve","Id":"CardBack_VOW_424637"},{"Type":"Sleeve","Id":"CardBack_VOW_422180"},{"Type":"Sleeve","Id":"CardBack_VOW_421278"},{"Type":"Sleeve","Id":"CardBack_VOW_421349"},{"Type":"Sleeve","Id":"CardBack_MetallicGruul"},{"Type":"Sleeve","Id":"CardBack_MetallicSimic"},{"Type":"Sleeve","Id":"CardBack_VOW_421144"},{"Type":"Sleeve","Id":"CardBack_NEO_422140"},{"Type":"Sleeve","Id":"CardBack_NEO_422587"},{"Type":"Sleeve","Id":"CardBack_NEO_422135"},{"Type":"Sleeve","Id":"CardBack_RD_430904"},{"Type":"Sleeve","Id":"CardBack_RD_430906"},{"Type":"Sleeve","Id":"CardBack_RD_430902"},{"Type":"Sleeve","Id":"CardBack_RD_430903"},{"Type":"Sleeve","Id":"CardBack_RD_430905"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Flag_SNC_Brokers","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Flag_SNC_Cabaretti","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Flag_SNC_Maestros","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Flag_SNC_Riveteers","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_Flag_SNC_Obscura","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_SNC_423715_Brokers","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_SNC_423715_Cabaretti","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_SNC_423715_Riveteers","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_SNC_423715_Maestros","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_SNC_423715_Obscura","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_BRO_430064"},{"Type":"Sleeve","Id":"CardBack_ZNR_402686"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_EmbossedDefaultArena","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_ZNR_417011"},{"Type":"Sleeve","Id":"CardBack_M21_413716"},{"Type":"Sleeve","AcquisitionFlags":"Event","Id":"CardBack_IKO_VivienMonstersAdvocate","AcquisitionFlagsInternal":2},{"Type":"Sleeve","Id":"CardBack_DG_147646"},{"Type":"Sleeve","Id":"CardBack_LTR_438027"},{"Type":"Sleeve","AcquisitionFlags":"Event, CodeRedemption","Id":"CardBack_RD_414680","AcquisitionFlagsInternal":6},{"Type":"Sleeve","Id":"CardBack_RD_436839"},{"Type":"Sleeve","Id":"CardBack_RD_436840"},{"Type":"Sleeve","Id":"CardBack_RD_436841"},{"Type":"Sleeve","Id":"CardBack_RD_436838"},{"Type":"Sleeve","Id":"CardBack_RD_436837"},{"Type":"Sleeve","AcquisitionFlags":"Event, CodeRedemption","Id":"CardBack_RD_414785","AcquisitionFlagsInternal":6},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_WOE_434643","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_WOE_434616"},{"Type":"Sleeve","Id":"CardBack_WOE_439898"},{"Type":"Sleeve","Id":"CardBack_WOE_440175"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_RD_416853","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_WOE_436943"},{"Type":"Sleeve","Id":"CardBack_BRO_434944_M"},{"Type":"Sleeve","Id":"CardBack_WOE_436948"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_WOE_438678","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_DMU_439347"},{"Type":"Sleeve","Id":"CardBack_WOE_436922"},{"Type":"Sleeve","Id":"CardBack_WOE_437652"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_WOE_434641","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_LCI_443065"},{"Type":"Sleeve","Id":"CardBack_WOE_436956"},{"Type":"Sleeve","Id":"CardBack_LCI_442152"},{"Type":"Sleeve","Id":"CardBack_LocketAzorius"},{"Type":"Sleeve","Id":"CardBack_MKM_442877_M"},{"Type":"Sleeve","Id":"CardBack_MKM_439092"},{"Type":"Sleeve","Id":"CardBack_LCI_441786"},{"Type":"Sleeve","Id":"CardBack_MKM_451611"},{"Type":"Sleeve","Id":"CardBack_MKM_442877_E"},{"Type":"Sleeve","Id":"CardBack_SNC_425746"},{"Type":"Sleeve","Id":"CardBack_MKM_442877_K"},{"Type":"Sleeve","Id":"CardBack_MKM_442877_A"},{"Type":"Sleeve","Id":"CardBack_MKM_442877_J"},{"Type":"Sleeve","Id":"CardBack_MKM_439080"},{"Type":"Sleeve","Id":"CardBack_MKM_439044"},{"Type":"Sleeve","Id":"CardBack_OTJ_444959"},{"Type":"Sleeve","Id":"CardBack_OTJ_439476"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_OTJ_439482","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_OTJ_439477"},{"Type":"Sleeve","Id":"CardBack_MetallicArena"},{"Type":"Sleeve","Id":"CardBack_OTJ_439475"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_PoolParty","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_PoolParty2","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_OTJ_444218"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_OTJ_449097","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_BLB_447202"},{"Type":"Sleeve","Id":"CardBack_BLB_447006"},{"Type":"Sleeve","Id":"CardBack_DSK_446988"},{"Type":"Sleeve","Id":"CardBack_DG_MemorialSleeve"},{"Type":"Sleeve","Id":"CardBack_DSK_449250"},{"Type":"Sleeve","Id":"CardBack_FDN_449816"},{"Type":"Sleeve","Id":"CardBack_WOE_442023_W"},{"Type":"Sleeve","Id":"CardBack_FDN_452123"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_FDN_449317","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_FDN_449812"},{"Type":"Sleeve","Id":"CardBack_FDN_449813"},{"Type":"Sleeve","Id":"CardBack_FDN_452122"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_FDN_449871","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_DFT_453669","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_DFT_450515","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_DFT_452454","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"Achievements","Id":"CardBack_DGM_146842","AcquisitionFlagsInternal":64},{"Type":"Sleeve","Id":"CardBack_DFT_453235"},{"Type":"Sleeve","Id":"CardBack_DFT_452793"},{"Type":"Sleeve","Id":"CardBack_DFT_453220"},{"Type":"Sleeve","Id":"CardBack_DFT_453224"},{"Type":"Sleeve","Id":"CardBack_DFT_453227"},{"Type":"Sleeve","Id":"CardBack_DFT_452799"},{"Type":"Sleeve","Id":"CardBack_DFT_445426"},{"Type":"Sleeve","Id":"CardBack_DFT_452807"},{"Type":"Sleeve","Id":"CardBack_DFT_453229"},{"Type":"Sleeve","Id":"CardBack_DFT_453234"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_DFT_452434","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_TDM_452671"},{"Type":"Sleeve","Id":"CardBack_TDM_452677"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_TDM_452184","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_TDM_452708"},{"Type":"Sleeve","Id":"CardBack_TDM_452707"},{"Type":"Sleeve","Id":"CardBack_TDM_452706"},{"Type":"Sleeve","Id":"CardBack_TDM_452705"},{"Type":"Sleeve","Id":"CardBack_TDM_452709"},{"Type":"Sleeve","Id":"CardBack_TDM_448915"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_TDM_452678","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_FIN_444069","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_FIN_448363"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_FIN_451307","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_FIN_448739"},{"Type":"Sleeve","Id":"CardBack_FIN_445050"},{"Type":"Sleeve","Id":"CardBack_FIN_445044"},{"Type":"Sleeve","Id":"CardBack_FIN_448385"},{"Type":"Sleeve","Id":"CardBack_FIN_445038"},{"Type":"Sleeve","Id":"CardBack_FIN_451941"},{"Type":"Sleeve","Id":"CardBack_FIN_451951"},{"Type":"Sleeve","Id":"CardBack_MetallicAzorius"},{"Type":"Sleeve","Id":"CardBack_FIN_451935"},{"Type":"Sleeve","Id":"CardBack_FIN_445037"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_FIN_452052","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_EOE_450762"},{"Type":"Sleeve","Id":"CardBack_EOE_450740"},{"Type":"Sleeve","Id":"CardBack_RD_458295"},{"Type":"Sleeve","Id":"CardBack_RD_458296"},{"Type":"Sleeve","Id":"CardBack_RD_458297"},{"Type":"Sleeve","Id":"CardBack_RD_458298"},{"Type":"Sleeve","Id":"CardBack_RD_458299"},{"Type":"Sleeve","Id":"CardBack_FDN_451783"},{"Type":"Sleeve","Id":"CardBack_EOE_444595"},{"Type":"Sleeve","AcquisitionFlags":"Achievements","Id":"CardBack_M19_404486","AcquisitionFlagsInternal":64},{"Type":"Sleeve","Id":"CardBack_OM1_461339"},{"Type":"Sleeve","Id":"CardBack_OM1_461353"},{"Type":"Sleeve","Id":"CardBack_OM1_461218"},{"Type":"Sleeve","Id":"CardBack_OM1_461328"},{"Type":"Sleeve","Id":"CardBack_OM1_461338"},{"Type":"Sleeve","Id":"CardBack_OM1_461334"},{"Type":"Sleeve","Id":"CardBack_OM1_461290"},{"Type":"Sleeve","Id":"CardBack_OM1_461308"},{"Type":"Sleeve","Id":"CardBack_OM1_461311"},{"Type":"Sleeve","Id":"CardBack_ECL_458914"},{"Type":"Sleeve","Id":"CardBack_ECL_462552"},{"Type":"Sleeve","Id":"CardBack_ECL_CraggReward"},{"Type":"Sleeve","Id":"CardBack_ECL_SquenReward"},{"Type":"Sleeve","Id":"CardBack_ECL_462878"},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_weathered","AcquisitionFlagsInternal":4},{"Type":"Sleeve","AcquisitionFlags":"CodeRedemption","Id":"CardBack_ICE_96928","AcquisitionFlagsInternal":4},{"Type":"Sleeve","Id":"CardBack_AFR_419111"},{"Type":"Sleeve","Id":"CardBack_SOS_459589"},{"Type":"Sleeve","Id":"CardBack_SOS_464332"},{"Type":"Sleeve","Id":"CardBack_SOS_460847"},{"Type":"Sleeve","Id":"CardBack_SOS_463630"},{"Type":"Sleeve","Id":"CardBack_SOS_463631"},{"Type":"Sleeve","Id":"CardBack_SOS_463635"},{"Type":"Sleeve","Id":"CardBack_SOS_463633"},{"Type":"Sleeve","Id":"CardBack_SOS_463632"},{"Type":"Sleeve","Id":"CardBack_SOS_464336"},{"Type":"Sleeve","Id":"CardBack_SOS_464338"},{"Type":"Sleeve","Id":"CardBack_SOS_464330"},{"Type":"Sleeve","Id":"CardBack_SOS_464334"},{"Type":"Sleeve","Id":"CardBack_SOS_464349"},{"Type":"Sleeve","Id":"CardBack_MSH_460073"},{"Type":"Sleeve","Id":"CardBack_Summer2026"},{"Type":"Sleeve","Id":"CardBack_MSH_460076"},{"Type":"Sleeve","Id":"CardBack_HOB_457837"},{"Type":"Sleeve","Id":"CardBack_BLB_437930"},{"Type":"Sleeve","AcquisitionFlags":"Achievements","Id":"CardBack_OGW_161204","AcquisitionFlagsInternal":64},{"Type":"Sleeve","Id":"CardBack_HOB_466029"},{"Type":"Sleeve","AcquisitionFlags":"BattlePass","Id":"CardBack_HOB_458492","AcquisitionFlagsInternal":8},{"Type":"Sleeve","Id":"CardBack_HOB_458536"},{"Type":"Sleeve","Id":"CardBack_FRA_479306"},{"Type":"Sleeve","Id":"CardBack_FRA_461591"}],"Emotes":[{"Type":"Emote","AcquisitionFlags":"DefaultLoginGrant","Id":"Phrase_Basic_Hello","Category":"Greeting","Treatment":"","AcquisitionFlagsInternal":1},{"Type":"Emote","FlipType":"Reply","AcquisitionFlags":"DefaultLoginGrant","Id":"Phrase_Basic_Nice_Thanks","FlipTypeInternal":1,"Category":"Kudos","Treatment":"","AcquisitionFlagsInternal":1},{"Type":"Emote","FlipType":"Priority","AcquisitionFlags":"DefaultLoginGrant","Id":"Phrase_Basic_Thinking_YourGo","FlipTypeInternal":2,"Category":"Priority","Treatment":"","AcquisitionFlagsInternal":1},{"Type":"Emote","FlipType":"Reply","AcquisitionFlags":"DefaultLoginGrant","Id":"Phrase_Basic_Oops_Sorry","FlipTypeInternal":1,"Category":"Accident","Treatment":"","AcquisitionFlagsInternal":1},{"Type":"Emote","AcquisitionFlags":"DefaultLoginGrant","Id":"Phrase_Basic_GoodGame","Category":"GoodGame","Treatment":"","AcquisitionFlagsInternal":1},{"Type":"Emote","Page":"Sticker","Id":"Sticker_VOW_GG","PageInternal":1,"Category":"VOW_Stickers","Treatment":"Sticker_VOW_GG"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_VOW_Olivia","PageInternal":1,"Category":"VOW_Stickers","Treatment":"Sticker_VOW_Olivia"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_VOW_Sorin","PageInternal":1,"Category":"VOW_Stickers","Treatment":"Sticker_VOW_Sorin"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_NEO_TamiyoHello","PageInternal":1,"Category":"NEO_Stickers","Treatment":"Sticker_NEO_TamiyoHello"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_NEO_KaitoFistbump","PageInternal":1,"Category":"NEO_Stickers","Treatment":"Sticker_NEO_KaitoFistbump"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_NEO_TezzeretRage","PageInternal":1,"Category":"NEO_Stickers","Treatment":"Sticker_NEO_TezzeretRage"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_MID_Teferi","PageInternal":1,"Category":"MID_Stickers","Treatment":"Sticker_MID_Teferi"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_Mimic_Sweeper","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_Mimic_Sweeper"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_Tasha_BRB","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_Tasha_BRB"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_Tasha_Return","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_Tasha_Return"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_MinscBoo_Approve","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_MinscBoo_Approve"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_BlackDragon","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_BlackDragon"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_RedDragon","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_RedDragon"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_BlueDragon","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_BlueDragon"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_GreenDragon","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_GreenDragon"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_HBG_WhiteDragon","PageInternal":1,"Category":"HBG_Stickers","Treatment":"Sticker_HBG_WhiteDragon"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_Halloween23_AngryRoll","PageInternal":1,"Category":"Halloween23_Stickers","Treatment":"Sticker_Halloween23_AngryRoll"},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_OTJ_321Draw","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_OTJ_Howdy","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_OTJ_Pondering","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_OTJ_Tarnation","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_OTJ_Yeehaw","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","Id":"Phrase_OTJ_BigTown","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_OTJ_Anna_HurryUp","PageInternal":1,"Category":"OTJ_Stickers","Treatment":"Sticker_OTJ_Anna_HurryUp","AcquisitionFlagsInternal":4},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_OTJ_Oko_Crimes","PageInternal":1,"Category":"OTJ_Stickers","Treatment":"Sticker_OTJ_Oko_Crimes","AcquisitionFlagsInternal":4},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_OTJ_Kellan_Sweating","PageInternal":1,"Category":"OTJ_Stickers","Treatment":"Sticker_OTJ_Kellan_Sweating","AcquisitionFlagsInternal":4},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_OTJ_Fblthp_Singing","PageInternal":1,"Category":"OTJ_Stickers","Treatment":"Sticker_OTJ_Fblthp_Singing","AcquisitionFlagsInternal":4},{"Type":"Emote","Id":"Phrase_OTJ_StickUp","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","Id":"Phrase_OTJ_Obliged","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","Id":"Phrase_OTJ_StruckGold","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_Summer_Karn_Sunbathing","PageInternal":1,"Category":"Summer_Stickers","Treatment":"Sticker_Summer_Karn_Sunbathing","AcquisitionFlagsInternal":4},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"CodeRedemption","Id":"Sticker_Summer_Kiora_Lifeguard","PageInternal":1,"Category":"Summer_Stickers","Treatment":"Sticker_Summer_Kiora_Lifeguard","AcquisitionFlagsInternal":4},{"Type":"Emote","Id":"Phrase_OTJ_Apologize","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","Id":"Phrase_OTJ_HolyCow","Category":"OTJ_Phrases","Treatment":"Phrase_OTJ_BG"},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Caw","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Hiss","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Meow","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Rats","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Ribbit","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Squeak","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","AcquisitionFlags":"CodeRedemption","Id":"Phrase_BLB_Woof","Category":"BLB_Phrases","Treatment":"Phrase_BLB_BG","AcquisitionFlagsInternal":4},{"Type":"Emote","Page":"Sticker","Id":"Sticker_Arlinn_LaughingWolves","PageInternal":1,"Category":"Halloween2024_Sticker","Treatment":"Sticker_Arlinn_LaughingWolves"},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_Lands","Category":"FDN_Phrases","Treatment":"Phrase_FDN_Lands","AcquisitionFlagsInternal":64},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"Achievements","Id":"Achievements_Sparky_Topdecking","PageInternal":1,"Category":"FDN_Achievement_Stickers","Treatment":"Achievements_Sparky_Topdecking","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_Catch","Category":"FDN_Phrases","Treatment":"Phrase_FDN_Catch","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_HoleInPlan","Category":"FDN_Phrases","Treatment":"Phrase_FDN_HoleInPlan","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_NoRestNoMercy","Category":"FDN_Phrases","Treatment":"Phrase_FDN_NoRestNoMercy","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_NiceDeck","Category":"FDN_Phrases","Treatment":"Phrase_FDN_NiceDeck","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_NatureCalls","Category":"FDN_Phrases","Treatment":"Phrase_FDN_NatureCalls","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_GreatnessAnyCost","Category":"FDN_Phrases","Treatment":"Phrase_FDN_GreatnessAnyCost","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_AllDay","Category":"FDN_Phrases","Treatment":"Phrase_FDN_AllDay","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_ReadyBrawl","Category":"FDN_Phrases","Treatment":"Phrase_FDN_ReadyBrawl","AcquisitionFlagsInternal":64},{"Type":"Emote","AcquisitionFlags":"Achievements","Id":"Phrase_FDN_NeverDidntHaveIt","Category":"FDN_Phrases","Treatment":"Phrase_FDN_NeverDidntHaveIt","AcquisitionFlagsInternal":64},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"Achievements","Id":"Achievements_Sparky_Celebrating","PageInternal":1,"Category":"FDN_Achievement_Stickers","Treatment":"Achievements_Sparky_Celebrating","AcquisitionFlagsInternal":64},{"Type":"Emote","Page":"Sticker","AcquisitionFlags":"Achievements","Id":"Achievements_Sparky_Cool","PageInternal":1,"Category":"FDN_Achievement_Stickers","Treatment":"Achievements_Sparky_Cool","AcquisitionFlagsInternal":64},{"Type":"Emote","Page":"Sticker","Id":"Sticker_LCI_Capybara_Bored","PageInternal":1,"Category":"LCI_Stickers","Treatment":"Sticker_LCI_Capybara_Bored"},{"Type":"Emote","Id":"Phrase_YargleDay2025","Category":"YargleDay2025_Phrases","Treatment":"Phrase_YargleDay2025"},{"Type":"Emote","Id":"Phrase_OM1_sadface","Category":"OM1_Phrases","Treatment":"Phrase_OM1_sadface"},{"Type":"Emote","Id":"Phrase_OM1_smiley","Category":"OM1_Phrases","Treatment":"Phrase_OM1_smiley"},{"Type":"Emote","Id":"Phrase_OM1_evilsmiley","Category":"OM1_Phrases","Treatment":"Phrase_OM1_evilsmiley"},{"Type":"Emote","Id":"Phrase_OM1_angryfrown","Category":"OM1_Phrases","Treatment":"Phrase_OM1_angryfrown"},{"Type":"Emote","Id":"Phrase_OM1_wink","Category":"OM1_Phrases","Treatment":"Phrase_OM1_wink"},{"Type":"Emote","Page":"Sticker","Id":"Sticker_OM1_Fleem_Blink","PageInternal":1,"Category":"OM1_Stickers","Treatment":"Sticker_OM1_Fleem_Blink"},{"Type":"Emote","Id":"Phrase_ECL_FaeriePrank","Category":"ECL_Phrases","Treatment":"Phrase_ECL_FaeriePrank"},{"Type":"Emote","Id":"Phrase_ECL_WiseTreefolk","Category":"ECL_Phrases","Treatment":"Phrase_ECL_WiseTreefolk"},{"Type":"Emote","Id":"Phrase_ECL_DoBattle","Category":"ECL_Phrases","Treatment":"Phrase_ECL_DoBattle"},{"Type":"Emote","Id":"Phrase_ECL_LookDifferent","Category":"ECL_Phrases","Treatment":"Phrase_ECL_LookDifferent"},{"Type":"Emote","Id":"Phrase_ECL_Scoundrel","Category":"ECL_Phrases","Treatment":"Phrase_ECL_Scoundrel"},{"Type":"Emote","Id":"Phrase_S26_QuietThinking","Category":"S26_Phrases","Treatment":"Phrase_S26_QuietThinking"},{"Type":"Emote","Id":"Phrase_S26_DontMakeMistakes","Category":"S26_Phrases","Treatment":"Phrase_S26_DontMakeMistakes"},{"Type":"Emote","Id":"Phrase_S26_DidntNeed","Category":"S26_Phrases","Treatment":"Phrase_S26_DidntNeed"},{"Type":"Emote","Id":"Phrase_S26_DoneHere","Category":"S26_Phrases","Treatment":"Phrase_S26_DoneHere"},{"Type":"Emote","Id":"Phrase_S26_Enough","Category":"S26_Phrases","Treatment":"Phrase_S26_Enough"},{"Type":"Emote","Id":"Phrase_S26_Impressive","Category":"S26_Phrases","Treatment":"Phrase_S26_Impressive"},{"Type":"Emote","Id":"Phrase_S26_RestWhenDead","Category":"S26_Phrases","Treatment":"Phrase_S26_RestWhenDead"},{"Type":"Emote","Id":"Phrase_HOB_GoodMorning","Category":"HOB_Phrases","Treatment":"Phrase_HOB_GoodMorning"},{"Type":"Emote","Id":"Phrase_HOB_HairOnToes","Category":"HOB_Phrases","Treatment":"Phrase_HOB_HairOnToes"},{"Type":"Emote","Id":"Phrase_HOB_DawnTakeYou","Category":"HOB_Phrases","Treatment":"Phrase_HOB_DawnTakeYou"},{"Type":"Emote","Id":"Phrase_HOB_GoForward","Category":"HOB_Phrases","Treatment":"Phrase_HOB_GoForward"},{"Type":"Emote","Id":"Phrase_HOB_Precious","Category":"HOB_Phrases","Treatment":"Phrase_HOB_Precious"}],"Titles":[{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_Initiate","InternalName":"Title_Initiate","LocKey":"Titles/Core/Initiate","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_UCore","InternalName":"Title_UCore","LocKey":"Titles/Core/ColorMasteryU","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_RCore","InternalName":"Title_RCore","LocKey":"Titles/Core/ColorMasteryR","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_BCore","InternalName":"Title_BCore","LocKey":"Titles/Core/ColorMasteryB","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_WCore","InternalName":"Title_WCore","LocKey":"Titles/Core/ColorMasteryW","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_GCore","InternalName":"Title_GCore","LocKey":"Titles/Core/ColorMasteryG","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_Crafty","InternalName":"Title_Crafty","LocKey":"Titles/Core/CraftCards","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_StandardBearer","InternalName":"Title_StandardBearer","LocKey":"Titles/Core/StandardGamesWon","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_BrawlCore","InternalName":"Title_BrawlCore","LocKey":"Titles/Core/BrawlDifferentCommanders","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_Collector","InternalName":"Title_Collector","LocKey":"Titles/Core/SetComplete","AcquisitionFlagsInternal":64},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_PackLeader","InternalName":"Title_PackLeader","LocKey":"Titles/Core/OpenPacks","AcquisitionFlagsInternal":64},{"Type":"Title","Id":"Title_YargleDay2025","InternalName":"Titles/YargleDay2025/TheBargler","LocKey":"Titles/YargleDay2025/TheBargler"},{"Type":"Title","Id":"Title_YoungAvenger","InternalName":"Titles/MSH/YoungAvenger","LocKey":"Titles/MSH/YoungAvenger"},{"Type":"Title","AcquisitionFlags":"Achievements","Id":"Title_Seasoned","InternalName":"Title_Seasoned","LocKey":"Titles/Core/GamesPlayed","AcquisitionFlagsInternal":64}]}}} +[UnityCrossThreadLogger]==> DeckUpsertDeckV3 {"id":"7668648d-95b7-4564-8077-91d1e069f937","request":"{\"Summary\":{\"DeckId\":\"ad644e5b-5720-44ab-8d98-022c13d54788\",\"Mana\":\"\",\"Name\":\"Cruel Tutelage\",\"Attributes\":[{\"name\":\"Version\",\"value\":\"11\"},{\"name\":\"TileID\",\"value\":\"71860\"},{\"name\":\"LastPlayed\",\"value\":\"\\\"2026-10-16T00:34:31.4451208+00:00\\\"\"},{\"name\":\"LastUpdated\",\"value\":\"\\\"2026-10-14T15:39:44.5372957+00:00\\\"\"},{\"name\":\"IsFavorite\",\"value\":\"false\"},{\"name\":\"Format\",\"value\":\"TraditionalHistoric\"}],\"Description\":\"\",\"DeckTileId\":71860,\"DeckArtId\":0,\"IsCompanionValid\":false,\"PreferredCosmetics\":{\"Avatar\":\"\",\"Sleeve\":\"\",\"Pet\":\"\",\"Title\":\"\",\"Emotes\":[]},\"NetDeckFolderId\":null,\"IsNetDeck\":false,\"checkInbox\":false},\"Deck\":{\"MainDeck\":[{\"cardId\":71860,\"quantity\":4},{\"cardId\":97170,\"quantity\":1},{\"cardId\":93986,\"quantity\":4},{\"cardId\":77498,\"quantity\":4},{\"cardId\":94278,\"quantity\":4},{\"cardId\":73266,\"quantity\":4},{\"cardId\":102507,\"quantity\":4},{\"cardId\":75662,\"quantity\":4},{\"cardId\":97169,\"quantity\":6},{\"cardId\":95614,\"quantity\":2},{\"cardId\":91788,\"quantity\":4},{\"cardId\":83950,\"quantity\":4},{\"cardId\":68740,\"quantity\":4},{\"cardId\":94351,\"quantity\":1},{\"cardId\":87448,\"quantity\":1},{\"cardId\":73474,\"quantity\":1},{\"cardId\":106251,\"quantity\":4},{\"cardId\":70335,\"quantity\":4}],\"Sideboard\":[{\"cardId\":95614,\"quantity\":1},{\"cardId\":82853,\"quantity\":3},{\"cardId\":75118,\"quantity\":1},{\"cardId\":102775,\"quantity\":1},{\"cardId\":70205,\"quantity\":2},{\"cardId\":90718,\"quantity\":1},{\"cardId\":94877,\"quantity\":2},{\"cardId\":92204,\"quantity\":2},{\"cardId\":92407,\"quantity\":1},{\"cardId\":88998,\"quantity\":1}],\"CommandZone\":[],\"Companions\":[],\"CardSkins\":[]},\"ActionType\":\"Updated\"}"} +[UnityCrossThreadLogger]==> EventSetDeckV3 {"id":"ddbd8dd5-7f9f-4156-9a57-f8337cc06ae5","request":"{\"EventName\":\"Traditional_Historic_Play\",\"Summary\":{\"DeckId\":\"ad644e5b-5720-44ab-8d98-022c13d54788\",\"Mana\":\"\",\"Name\":\"Cruel Tutelage\",\"Attributes\":[{\"name\":\"Version\",\"value\":\"11\"},{\"name\":\"TileID\",\"value\":\"71860\"},{\"name\":\"LastPlayed\",\"value\":\"\\\"2026-10-16T00:34:31.4451208+00:00\\\"\"},{\"name\":\"LastUpdated\",\"value\":\"\\\"2026-10-14T15:39:44.5372957+00:00\\\"\"},{\"name\":\"IsFavorite\",\"value\":\"false\"},{\"name\":\"Format\",\"value\":\"TraditionalHistoric\"}],\"Description\":\"\",\"DeckTileId\":71860,\"DeckArtId\":0,\"IsCompanionValid\":false,\"PreferredCosmetics\":{\"Avatar\":\"\",\"Sleeve\":\"\",\"Pet\":\"\",\"Title\":\"\",\"Emotes\":[]},\"NetDeckFolderId\":null,\"IsNetDeck\":false,\"checkInbox\":false},\"Deck\":{\"MainDeck\":[{\"cardId\":71860,\"quantity\":4},{\"cardId\":97170,\"quantity\":1},{\"cardId\":93986,\"quantity\":4},{\"cardId\":77498,\"quantity\":4},{\"cardId\":94278,\"quantity\":4},{\"cardId\":73266,\"quantity\":4},{\"cardId\":102507,\"quantity\":4},{\"cardId\":75662,\"quantity\":4},{\"cardId\":97169,\"quantity\":6},{\"cardId\":95614,\"quantity\":2},{\"cardId\":91788,\"quantity\":4},{\"cardId\":83950,\"quantity\":4},{\"cardId\":68740,\"quantity\":4},{\"cardId\":94351,\"quantity\":1},{\"cardId\":87448,\"quantity\":1},{\"cardId\":73474,\"quantity\":1},{\"cardId\":106251,\"quantity\":4},{\"cardId\":70335,\"quantity\":4}],\"Sideboard\":[{\"cardId\":95614,\"quantity\":1},{\"cardId\":82853,\"quantity\":3},{\"cardId\":75118,\"quantity\":1},{\"cardId\":102775,\"quantity\":1},{\"cardId\":70205,\"quantity\":2},{\"cardId\":90718,\"quantity\":1},{\"cardId\":94877,\"quantity\":2},{\"cardId\":92204,\"quantity\":2},{\"cardId\":92407,\"quantity\":1},{\"cardId\":88998,\"quantity\":1}],\"CommandZone\":[],\"Companions\":[],\"CardSkins\":[]}}"} +[UnityCrossThreadLogger]10/16/2026 12:34:31 AM +<== DeckUpsertDeckV3(7668648d-95b7-4564-8077-91d1e069f937) +{"DeckId":"ad644e5b-5720-44ab-8d98-022c13d54788","Name":"Cruel Tutelage","Attributes":[{"name":"Version","value":"11"},{"name":"TileID","value":"71860"},{"name":"LastPlayed","value":"\"2026-10-16T00:34:31.4451208+00:00\""},{"name":"LastUpdated","value":"\"2026-10-14T15:39:44.5372957+00:00\""},{"name":"IsFavorite","value":"false"},{"name":"Format","value":"TraditionalHistoric"}],"Description":"","DeckTileId":71860,"DeckArtId":0,"PreferredCosmetics":{"Avatar":"","Sleeve":"","Pet":"","Title":"","Emotes":[]}} +[UnityCrossThreadLogger]10/16/2026 12:34:31 AM +<== EventSetDeckV3(ddbd8dd5-7f9f-4156-9a57-f8337cc06ae5) +{"CourseId":"9f838f46-df35-409e-919c-50298839beb1","InternalEventName":"Traditional_Historic_Play","CurrentModule":"CreateMatch","ModulePayload":"","CourseDeckSummary":{"DeckId":"ad644e5b-5720-44ab-8d98-022c13d54788","Name":"Cruel Tutelage","Attributes":[{"name":"Version","value":"11"},{"name":"TileID","value":"71860"},{"name":"LastPlayed","value":"\"2026-10-16T00:34:31.4451208+00:00\""},{"name":"LastUpdated","value":"\"2026-10-14T15:39:44.5372957+00:00\""},{"name":"IsFavorite","value":"false"},{"name":"Format","value":"TraditionalHistoric"}],"Description":"","DeckTileId":71860,"DeckArtId":0,"PreferredCosmetics":{"Avatar":"","Sleeve":"","Pet":"","Title":"","Emotes":[]}},"CourseDeck":{"MainDeck":[{"cardId":71860,"quantity":4},{"cardId":97170,"quantity":1},{"cardId":93986,"quantity":4},{"cardId":77498,"quantity":4},{"cardId":94278,"quantity":4},{"cardId":73266,"quantity":4},{"cardId":102507,"quantity":4},{"cardId":75662,"quantity":4},{"cardId":97169,"quantity":6},{"cardId":95614,"quantity":2},{"cardId":91788,"quantity":4},{"cardId":83950,"quantity":4},{"cardId":68740,"quantity":4},{"cardId":94351,"quantity":1},{"cardId":87448,"quantity":1},{"cardId":73474,"quantity":1},{"cardId":106251,"quantity":4},{"cardId":70335,"quantity":4}],"Sideboard":[{"cardId":95614,"quantity":1},{"cardId":82853,"quantity":3},{"cardId":75118,"quantity":1},{"cardId":102775,"quantity":1},{"cardId":70205,"quantity":2},{"cardId":90718,"quantity":1},{"cardId":94877,"quantity":2},{"cardId":92204,"quantity":2},{"cardId":92407,"quantity":1},{"cardId":88998,"quantity":1}],"CommandZone":[],"Companions":[],"CardSkins":[]},"CardPool":[],"CardStyles":[]} +[UnityCrossThreadLogger]==> EventEnterPairing {"id":"180f5e47-4e44-4798-9a30-df046b1d285c","request":"{\"EventName\":\"Traditional_Historic_Play\",\"EventCode\":null}"} +[UnityCrossThreadLogger]10/16/2026 12:34:31 AM +<== EventEnterPairing(180f5e47-4e44-4798-9a30-df046b1d285c) +{"CurrentModule":"CreateMatch","Payload":"Success"} +Unloading 4 Unused Serialized files (Serialized files now loaded: 299) +Unloading 11767 unused Assets to reduce memory usage. Loaded Objects now: 26584. +Total: 61.613200 ms (FindLiveObjects: 1.378800 ms CreateObjectMapping: 1.154200 ms MarkObjects: 54.909400 ms DeleteObjects: 4.170200 ms) + +OnSceneLoaded for MatchScene +There can be only one active Event System. +OnSceneLoaded for PreGameScene +OnSceneUnloaded for NavBar +cannot find async scene unload for NavBar +OnSceneUnloaded for MainNavigation +cannot find async scene unload for MainNavigation +Caches cleared +Unloading 1 Unused Serialized files (Serialized files now loaded: 255) +Unloading 10110 unused Assets to reduce memory usage. Loaded Objects now: 12270. +Total: 71.226500 ms (FindLiveObjects: 0.839700 ms CreateObjectMapping: 0.876100 ms MarkObjects: 65.183800 ms DeleteObjects: 4.326200 ms) + +Reference Assets/Core/Art/Meta/Cosmetics/Pets/Images/Icon_Pet_AFR_Dragon_U.png named AFR_DragonSkin3 not cleaned up properly. +Reference Assets/Core/Art/Meta/Cosmetics/Pets/Images/Icon_Pet_AFR_Dragon_U.png named AFR_DragonSkin3 not cleaned up properly. +Reference Assets/Core/Art/Meta/Cosmetics/Pets/Images/Icon_Pet_AFR_Dragon_U.png named AFR_DragonSkin3 not cleaned up properly. +Reference Assets/Core/Art/Meta/Cosmetics/Pets/Images/Icon_Pet_AFR_Dragon_U.png named AFR_DragonSkin3 not cleaned up properly. +[UnityCrossThreadLogger]10/16/2026 12:34:51 AM: Match to LOCALPLAYERID0000000000000: AuthenticateResponse +{ "transactionId": "c63e3b86-1930-44bd-bcf5-a7662be2fb42", "requestId": 1, "timestamp": "639277076914576915", "authenticateResponse": { "clientId": "LOCALPLAYERID0000000000000", "sessionId": "00000000-0000-0000-0000-000000000000", "screenName":"Local Player" } } +[UnityCrossThreadLogger]STATE CHANGED {"old":"None","new":"ConnectedToMatchDoor"} +[UnityCrossThreadLogger]Connecting to matchId c0a18506-9d87-4d0c-a2d3-e10bef8659d3 +[UnityCrossThreadLogger]STATE CHANGED {"old":"ConnectedToMatchDoor","new":"ConnectedToMatchDoor_ConnectingToGRE"} +[UnityCrossThreadLogger]10/16/2026 12:34:51 AM: Match to LOCALPLAYERID0000000000000: MatchGameRoomStateChangedEvent +{ "transactionId": "2f0123f2-3c0b-417a-a5c4-2258f3d25569", "requestId": 2, "timestamp": "1792110891750", "matchGameRoomStateChangedEvent": { "gameRoomInfo": { "gameRoomConfig": { "reservedPlayers": [ { "userId": "LOCALPLAYERID0000000000000", "playerName":"Local Player", "systemSeatId": 1, "teamId": 1, "courseId": "Avatar_Basic_BilboRiddles_HOB", "sessionId": "00000000-0000-0000-0000-000000000000", "platformId": "SteamWindows", "eventId": "Traditional_Historic_Play" }, { "userId": "OPPONENTID000000", "playerName":"Opponent Player", "systemSeatId": 2, "teamId": 2, "courseId": "Avatar_Basic_Adventurer", "sessionId": "00000000-0000-0000-0000-000000000000", "platformId": "Windows", "eventId": "Traditional_Historic_Play" } ], "matchId": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3" }, "stateType": "MatchGameRoomStateType_Playing", "players": [ { "userId": "LOCALPLAYERID0000000000000", "playerName":"Local Player", "systemSeatId": 1, "teamId": 1 }, { "userId": "OPPONENTID000000", "playerName":"Opponent Player", "systemSeatId": 2, "teamId": 2 } ] } } } +[UnityCrossThreadLogger]STATE CHANGED {"old":"ConnectedToMatchDoor_ConnectingToGRE","new":"Playing"} +[UnityCrossThreadLogger]10/16/2026 12:34:51 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "2f0123f2-3c0b-417a-a5c4-2258f3d25569", "requestId": 2, "timestamp": "1792110891791", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_ConnectResp", "systemSeatIds": [ 1 ], "msgId": 2, "connectResp": { "status": "ConnectionStatus_Success", "protoVer": "ProtoVersion_PersistentAnnotations", "settings": { "stops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" } ], "autoPassOption": "AutoPassOption_ResolveMyStackEffects", "graveyardOrder": "OrderingType_OrderArbitraryAlways", "manaSelectionType": "ManaSelectionType_Auto", "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", "smartStopsSetting": "SmartStopsSetting_Enable", "autoTapStopsSetting": "AutoTapStopsSetting_Enable", "autoOptionalPaymentCancellationSetting": "Setting_Enable", "transientStops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" } ], "stackAutoPassOption": "AutoPassOption_Clear" }, "deckMessage": { "deckCards": [ 71860, 71860, 71860, 71860, 97170, 93986, 93986, 93986, 93986, 77498, 77498, 77498, 77498, 94278, 94278, 94278, 94278, 73266, 73266, 73266, 73266, 102507, 102507, 102507, 102507, 75662, 75662, 75662, 75662, 97169, 97169, 97169, 97169, 97169, 97169, 95614, 95614, 91788, 91788, 91788, 91788, 83950, 83950, 83950, 83950, 68740, 68740, 68740, 68740, 94351, 87448, 73474, 106251, 106251, 106251, 106251, 70335, 70335, 70335, 70335 ], "sideboardCards": [ 95614, 82853, 82853, 82853, 75118, 102775, 70205, 70205, 90718, 94877, 94877, 92204, 92204, 92407, 88998 ] }, "grpVersion": { "majorVersion": 2026, "minorVersion": 64, "buildVersion": 282 }, "greVersion": { "majorVersion": 2026, "minorVersion": 64, "buildVersion": 3 }, "grpChangelist": 1331345, "greChangelist": 1331419 } }, { "type": "GREMessageType_DieRollResultsResp", "systemSeatIds": [ 1, 2 ], "msgId": 3, "dieRollResultsResp": { "playerDieRolls": [ { "systemSeatId": 1, "rollValue": 20 }, { "systemSeatId": 2, "rollValue": 10 } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 4, "gameStateId": 1, "gameStateMessage": { "type": "GameStateType_Full", "gameStateId": 1, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 1, "stage": "GameStage_Start", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_GameInProgress", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "teams": [ { "id": 1, "playerIds": [ 1 ], "status": "TeamStatus_InGame" }, { "id": 2, "playerIds": [ 2 ], "status": "TeamStatus_InGame" } ], "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_ChooseStartingPlayerResp", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 } ], "turnInfo": { "decisionPlayer": 1 }, "zones": [ { "zoneId": 18, "type": "ZoneType_Revealed", "visibility": "Visibility_Public", "ownerSeatId": 1 }, { "zoneId": 19, "type": "ZoneType_Revealed", "visibility": "Visibility_Public", "ownerSeatId": 2 }, { "zoneId": 24, "type": "ZoneType_Suppressed", "visibility": "Visibility_Public" }, { "zoneId": 25, "type": "ZoneType_Pending", "visibility": "Visibility_Public" }, { "zoneId": 26, "type": "ZoneType_Command", "visibility": "Visibility_Public" }, { "zoneId": 27, "type": "ZoneType_Stack", "visibility": "Visibility_Public" }, { "zoneId": 28, "type": "ZoneType_Battlefield", "visibility": "Visibility_Public" }, { "zoneId": 29, "type": "ZoneType_Exile", "visibility": "Visibility_Public" }, { "zoneId": 30, "type": "ZoneType_Limbo", "visibility": "Visibility_Public" }, { "zoneId": 31, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 1, "viewers": [ 1 ] }, { "zoneId": 32, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 1, "objectInstanceIds": [ 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 ] }, { "zoneId": 33, "type": "ZoneType_Graveyard", "visibility": "Visibility_Public", "ownerSeatId": 1 }, { "zoneId": 34, "type": "ZoneType_Sideboard", "visibility": "Visibility_Private", "ownerSeatId": 1, "viewers": [ 1 ] }, { "zoneId": 35, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 2, "viewers": [ 2 ] }, { "zoneId": 36, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 2, "objectInstanceIds": [ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283 ] }, { "zoneId": 37, "type": "ZoneType_Graveyard", "visibility": "Visibility_Public", "ownerSeatId": 2 }, { "zoneId": 38, "type": "ZoneType_Sideboard", "visibility": "Visibility_Private", "ownerSeatId": 2, "viewers": [ 2 ] } ], "diffDeletedInstanceIds": [ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 141, 143, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163 ], "pendingMessageCount": 1, "timers": [ { "timerId": 1, "type": "TimerType_Prologue", "durationSec": 120, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2 }, { "timerId": 2, "type": "TimerType_Epilogue", "durationSec": 145, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 3, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 4, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 2 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 2 }, { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 10, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 11, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 12, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 } ], "update": "GameStateUpdate_SendAndRecord" } }, { "type": "GREMessageType_ChooseStartingPlayerReq", "systemSeatIds": [ 1 ], "msgId": 5, "gameStateId": 1, "chooseStartingPlayerReq": { "teamType": "TeamType_Individual", "systemSeatIds": [ 1, 2 ] } } ] } } +OnSceneLoaded for Battlefield_VOW +OnSceneLoaded for DuelScene +[UnityCrossThreadLogger]10/16/2026 12:34:53 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 3, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277076930443443", + "transactionId": "547bd1dd-afcd-4073-bc42-5564a1f55936", + "payload": { + "type": "ClientMessageType_SetSettingsReq", + "setSettingsReq": { + "settings": { + "autoPassOption": "AutoPassOption_ResolveMyStackEffects", + "manaSelectionType": "ManaSelectionType_Auto", + "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", + "autoSelectReplacementSetting": "Setting_Enable" + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:34:53 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "547bd1dd-afcd-4073-bc42-5564a1f55936", "requestId": 3, "timestamp": "1792110893078", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_SetSettingsResp", "systemSeatIds": [ 1 ], "msgId": 7, "gameStateId": 1, "setSettingsResp": { "settings": { "stops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" } ], "autoPassOption": "AutoPassOption_ResolveMyStackEffects", "graveyardOrder": "OrderingType_OrderArbitraryAlways", "manaSelectionType": "ManaSelectionType_Auto", "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", "smartStopsSetting": "SmartStopsSetting_Enable", "autoTapStopsSetting": "AutoTapStopsSetting_Enable", "autoOptionalPaymentCancellationSetting": "Setting_Enable", "transientStops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" } ], "autoSelectReplacementSetting": "Setting_Enable", "stackAutoPassOption": "AutoPassOption_Clear" } } } ] } } +OnSceneUnloaded for PreGameScene +[UnityCrossThreadLogger]10/16/2026 12:35:02 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 4, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077020272410", + "transactionId": "70cf4fe7-eed6-46b4-a124-e5e7836a4f3b", + "payload": { + "type": "ClientMessageType_ChooseStartingPlayerResp", + "gameStateId": 1, + "respId": 5, + "chooseStartingPlayerResp": { + "teamType": "TeamType_Individual", + "systemSeatId": 1, + "teamId": 1 + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:02 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "70cf4fe7-eed6-46b4-a124-e5e7836a4f3b", "requestId": 4, "timestamp": "1792110902076", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 8, "gameStateId": 2, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 2, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_MulliganResp", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_MulliganResp", "startingLifeTotal": 20 } ], "turnInfo": { "activePlayer": 1, "decisionPlayer": 1 }, "zones": [ { "zoneId": 31, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 1, "objectInstanceIds": [ 170, 169, 168, 167, 166, 165, 164 ], "viewers": [ 1 ] }, { "zoneId": 32, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 1, "objectInstanceIds": [ 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 ] }, { "zoneId": 35, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 2, "objectInstanceIds": [ 230, 229, 228, 227, 226, 225, 224 ], "viewers": [ 2 ] }, { "zoneId": 36, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 2, "objectInstanceIds": [ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283 ] } ], "gameObjects": [ { "instanceId": 164, "grpId": 97169, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "superTypes": [ "SuperType_Basic" ], "cardTypes": [ "CardType_Land" ], "subtypes": [ "SubType_Island" ], "viewers": [ 1 ], "name": 652, "overlayGrpId": 97169, "uniqueAbilities": [ { "id": 54, "grpId": 1002 } ] }, { "instanceId": 165, "grpId": 94278, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Instant" ], "color": [ "CardColor_Blue" ], "viewers": [ 1 ], "name": 529845, "overlayGrpId": 94278, "uniqueAbilities": [ { "id": 29, "grpId": 269 }, { "id": 30, "grpId": 25848 } ] }, { "instanceId": 166, "grpId": 71860, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Enchantment" ], "color": [ "CardColor_Blue" ], "viewers": [ 1 ], "name": 433755, "overlayGrpId": 71860, "uniqueAbilities": [ { "id": 6, "grpId": 92280 }, { "id": 7, "grpId": 137881 } ] }, { "instanceId": 167, "grpId": 91788, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Land" ], "viewers": [ 1 ], "name": 414451, "overlayGrpId": 91788, "uniqueAbilities": [ { "id": 60, "grpId": 136225 } ] }, { "instanceId": 168, "grpId": 87448, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Land" ], "viewers": [ 1 ], "name": 738112, "overlayGrpId": 87448, "uniqueAbilities": [ { "id": 82, "grpId": 180111 }, { "id": 83, "grpId": 1167 }, { "id": 84, "grpId": 169785 }, { "id": 85, "grpId": 169786 } ] }, { "instanceId": 169, "grpId": 73266, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Creature" ], "subtypes": [ "SubType_Crab" ], "color": [ "CardColor_Blue" ], "power": { }, "toughness": { "value": 3 }, "viewers": [ 1 ], "name": 437203, "overlayGrpId": 73266, "uniqueAbilities": [ { "id": 40, "grpId": 138408 } ] }, { "instanceId": 170, "grpId": 68740, "type": "GameObjectType_Card", "zoneId": 31, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Land" ], "subtypes": [ "SubType_Island", "SubType_Swamp" ], "viewers": [ 1 ], "name": 30133, "overlayGrpId": 68740, "uniqueAbilities": [ { "id": 78, "grpId": 1003 }, { "id": 79, "grpId": 1002 }, { "id": 80, "grpId": 90846 } ] } ], "annotations": [ { "id": 76, "affectorId": 1, "affectedIds": [ 1 ], "type": [ "AnnotationType_NewTurnStarted" ] } ], "pendingMessageCount": 1, "prevGameStateId": 1, "timers": [ { "timerId": 1, "type": "TimerType_Prologue", "durationSec": 120, "elapsedSec": 10, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 10284 }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 10, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 10284 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 164 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } } ] } }, { "type": "GREMessageType_MulliganReq", "systemSeatIds": [ 1 ], "msgId": 9, "gameStateId": 2, "prompt": { "promptId": 34, "parameters": [ { "parameterName": "NumberOfCards", "type": "ParameterType_Number", "numberValue": 7 } ] }, "mulliganReq": { "mulliganType": "MulliganType_London" } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:04 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 5, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077041146547", + "transactionId": "211ff842-4b99-4b40-9500-eeda87188dd5", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:04 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 6, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077044826475", + "transactionId": "2612646a-cad1-45e0-9bd1-e8ea6b7861f4", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:05 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 7, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077056599346", + "transactionId": "964f666c-3a18-401f-a657-2ba3d42a4d04", + "payload": { + "type": "ClientMessageType_MulliganResp", + "gameStateId": 2, + "respId": 9, + "mulliganResp": { + "decision": "MulliganOption_AcceptHand" + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:05 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "964f666c-3a18-401f-a657-2ba3d42a4d04", "requestId": 7, "timestamp": "1792110905707", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 10, "gameStateId": 3, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 3, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 } ], "turnInfo": { "activePlayer": 1, "decisionPlayer": 2 }, "pendingMessageCount": 1, "prevGameStateId": 2, "timers": [ { "timerId": 1, "type": "TimerType_Prologue", "durationSec": 120, "elapsedSec": 13, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 13914 }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 13, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 13914 }, { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 1 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 164 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } } ] } }, { "type": "GREMessageType_PromptReq", "systemSeatIds": [ 1, 2 ], "msgId": 11, "gameStateId": 3, "prompt": { "promptId": 37, "parameters": [ { "parameterName": "PlayerId", "type": "ParameterType_Reference", "reference": { "type": "ReferenceType_PlayerSeatId", "id": 1 } } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:06 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 8, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077061142090", + "transactionId": "d1aa0e84-c106-44be-b840-acd3b97f4c84", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 165 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:06 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 9, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077061315553", + "transactionId": "06c95a02-f598-42a4-bc78-a217e3abe6d7", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:06 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 10, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077061404856", + "transactionId": "4eeb8bf7-e5f4-4b60-b8b5-647447d12006", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 170 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:06 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "06085585-8ac8-4c74-9db9-08ee6bdba377", "requestId": 4, "timestamp": "1792110906631", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_UIMessage", "systemSeatIds": [ 1 ], "uiMessage": { "seatIds": [ 2 ], "onHover": { } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:06 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "8ac8d6d3-a810-4e92-afb9-2cb4f37fdc26", "requestId": 5, "timestamp": "1792110906823", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_UIMessage", "systemSeatIds": [ 1 ], "uiMessage": { "seatIds": [ 2 ], "onHover": { } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:07 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "c4344ffc-4182-471b-aeba-50567f8adc6c", "requestId": 6, "timestamp": "1792110907812", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_UIMessage", "systemSeatIds": [ 1 ], "uiMessage": { "seatIds": [ 2 ], "onHover": { } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:08 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 11, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077082945543", + "transactionId": "dd785371-e392-4e8f-a513-eada3c52a626", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 164 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:09 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "f10f5093-bdfd-4b61-9eb5-3df8d014fc77", "requestId": 7, "timestamp": "1792110909129", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_SetSettingsResp", "systemSeatIds": [ 1 ], "msgId": 14, "gameStateId": 3, "setSettingsResp": { "settings": { "stops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" } ], "autoPassOption": "AutoPassOption_Clear", "graveyardOrder": "OrderingType_OrderArbitraryAlways", "manaSelectionType": "ManaSelectionType_Auto", "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", "smartStopsSetting": "SmartStopsSetting_Enable", "autoTapStopsSetting": "AutoTapStopsSetting_Enable", "autoOptionalPaymentCancellationSetting": "Setting_Enable", "transientStops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" } ], "autoSelectReplacementSetting": "Setting_Enable", "stackAutoPassOption": "AutoPassOption_Clear" } } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 15, "gameStateId": 4, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 4, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 1, "stage": "GameStage_Play", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_GameInProgress", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 } ], "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Upkeep", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 2, "nextPhase": "Phase_Main1" }, "annotations": [ { "id": 77, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] } ] }, { "id": 78, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] } ] } ], "prevGameStateId": 3, "timers": [ { "timerId": 1, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 3, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 3416 } ], "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 164 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 16, "gameStateId": 5, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 5, "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Upkeep", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 2, "nextPhase": "Phase_Main1" }, "prevGameStateId": 4, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 164 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 17, "gameStateId": 6, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 6, "turnInfo": { "phase": "Phase_Main1", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "annotations": [ { "id": 79, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "pendingMessageCount": 2, "prevGameStateId": 5, "timers": [ { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "running": true, "behavior": "TimerBehavior_StartDelayedTimer", "elapsedMs": 1 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 13, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 13915 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 164 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } } ] } }, { "type": "GREMessageType_PromptReq", "systemSeatIds": [ 1, 2 ], "msgId": 18, "gameStateId": 6, "prompt": { "promptId": 37, "parameters": [ { "parameterName": "PlayerId", "type": "ParameterType_Reference", "reference": { "type": "ReferenceType_PlayerSeatId", "id": 2 } } ] } }, { "type": "GREMessageType_ActionsAvailableReq", "systemSeatIds": [ 1 ], "msgId": 19, "gameStateId": 6, "prompt": { "promptId": 2 }, "actionsAvailableReq": { "actions": [ { "actionType": "ActionType_Cast", "grpId": 94278, "instanceId": 165, "facetId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true }, { "actionType": "ActionType_Cast", "grpId": 71860, "instanceId": 166, "facetId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true }, { "actionType": "ActionType_Cast", "grpId": 73266, "instanceId": 169, "facetId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true }, { "actionType": "ActionType_Play", "grpId": 97169, "instanceId": 164, "facetId": 164, "shouldStop": true }, { "actionType": "ActionType_Play", "grpId": 91788, "instanceId": 167, "facetId": 167, "shouldStop": true }, { "actionType": "ActionType_Play", "grpId": 87448, "instanceId": 168, "facetId": 168, "shouldStop": true }, { "actionType": "ActionType_Play", "grpId": 68740, "instanceId": 170, "facetId": 170, "shouldStop": true }, { "actionType": "ActionType_Pass" } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:09 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 12, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077097327477", + "transactionId": "7b4a270a-d961-444d-afd7-493b93362c08", + "payload": { + "type": "ClientMessageType_PerformActionResp", + "gameStateId": 6, + "respId": 19, + "performActionResp": { + "actions": [ + { + "actionType": "ActionType_Play", + "grpId": 97169, + "instanceId": 164, + "facetId": 164, + "shouldStop": true + } + ], + "autoPassPriority": "AutoPassPriority_Yes" + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:09 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 13, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077098083989", + "transactionId": "a3f6d8ca-9dfc-4ea8-a29d-6d0bab8a43d5", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:09 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "7b4a270a-d961-444d-afd7-493b93362c08", "requestId": 12, "timestamp": "1792110909786", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 20, "gameStateId": 7, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 7, "zones": [ { "zoneId": 28, "type": "ZoneType_Battlefield", "visibility": "Visibility_Public", "objectInstanceIds": [ 284 ] }, { "zoneId": 30, "type": "ZoneType_Limbo", "visibility": "Visibility_Public", "objectInstanceIds": [ 164 ] }, { "zoneId": 31, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 1, "objectInstanceIds": [ 170, 169, 168, 167, 166, 165 ], "viewers": [ 1 ] } ], "gameObjects": [ { "instanceId": 164, "grpId": 97169, "type": "GameObjectType_Card", "zoneId": 30, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "superTypes": [ "SuperType_Basic" ], "cardTypes": [ "CardType_Land" ], "subtypes": [ "SubType_Island" ], "viewers": [ 1 ], "name": 652, "overlayGrpId": 97169, "uniqueAbilities": [ { "id": 54, "grpId": 1002 } ] }, { "instanceId": 284, "grpId": 97169, "type": "GameObjectType_Card", "zoneId": 28, "visibility": "Visibility_Public", "ownerSeatId": 1, "controllerSeatId": 1, "superTypes": [ "SuperType_Basic" ], "cardTypes": [ "CardType_Land" ], "subtypes": [ "SubType_Island" ], "name": 652, "overlayGrpId": 97169, "uniqueAbilities": [ { "id": 235, "grpId": 1002 } ] } ], "annotations": [ { "id": 80, "affectedIds": [ 164 ], "type": [ "AnnotationType_ObjectIdChanged" ], "details": [ { "key": "orig_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 164 ] }, { "key": "new_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 284 ] } ] }, { "id": 81, "affectedIds": [ 284 ], "type": [ "AnnotationType_ZoneTransfer" ], "details": [ { "key": "zone_src", "type": "KeyValuePairValueType_int32", "valueInt32": [ 31 ] }, { "key": "zone_dest", "type": "KeyValuePairValueType_int32", "valueInt32": [ 28 ] }, { "key": "category", "type": "KeyValuePairValueType_string", "valueString": [ "PlayLand" ] } ] }, { "id": 82, "affectorId": 1, "affectedIds": [ 284 ], "type": [ "AnnotationType_UserActionTaken" ], "details": [ { "key": "actionType", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] }, { "key": "abilityGrpId", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "pendingMessageCount": 1, "prevGameStateId": 6, "timers": [ { "timerId": 3, "type": "TimerType_ActivePlayer", "durationSec": 68, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "running": true, "behavior": "TimerBehavior_StartDelayedTimer", "elapsedMs": 649 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 14, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 14564 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ], "persistentAnnotations": [ { "id": 5, "affectorId": 28, "affectedIds": [ 284 ], "type": [ "AnnotationType_EnteredZoneThisTurn" ] }, { "id": 84, "affectorId": 284, "affectedIds": [ 284 ], "type": [ "AnnotationType_ColorProduction" ], "details": [ { "key": "colors", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] } ] } ] } }, { "type": "GREMessageType_ActionsAvailableReq", "systemSeatIds": [ 1 ], "msgId": 21, "gameStateId": 7, "prompt": { "promptId": 2 }, "actionsAvailableReq": { "actions": [ { "actionType": "ActionType_Cast", "grpId": 94278, "instanceId": 165, "facetId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true, "autoTapSolution": { "autoTapActions": [ { "instanceId": 284, "abilityGrpId": 1002, "manaPaymentOption": { "mana": [ { "manaId": 1, "color": "ManaColor_Blue", "srcInstanceId": 284, "specs": [ { "type": "ManaSpecType_Predictive" } ], "abilityGrpId": 1002, "count": 1 } ] } } ] } }, { "actionType": "ActionType_Cast", "grpId": 71860, "instanceId": 166, "facetId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true }, { "actionType": "ActionType_Cast", "grpId": 73266, "instanceId": 169, "facetId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ], "shouldStop": true, "autoTapSolution": { "autoTapActions": [ { "instanceId": 284, "abilityGrpId": 1002, "manaPaymentOption": { "mana": [ { "manaId": 1, "color": "ManaColor_Blue", "srcInstanceId": 284, "specs": [ { "type": "ManaSpecType_Predictive" } ], "abilityGrpId": 1002, "count": 1 } ] } } ] } }, { "actionType": "ActionType_Activate_Mana", "grpId": 97169, "instanceId": 284, "facetId": 284, "abilityGrpId": 1002, "manaPaymentOptions": [ { "mana": [ { "manaId": 1, "color": "ManaColor_Blue", "srcInstanceId": 284, "specs": [ { "type": "ManaSpecType_Predictive" } ], "abilityGrpId": 1002, "count": 1 } ] } ], "isBatchable": true, "uniqueAbilityId": 235, "manaSelections": [ { "instanceId": 284, "abilityGrpId": 1002, "options": [ { "mana": [ { "color": "ManaColor_Blue", "count": 1 } ] } ] } ] }, { "actionType": "ActionType_Pass" }, { "actionType": "ActionType_FloatMana" } ], "inactiveActions": [ { "actionType": "ActionType_Play", "grpId": 91788, "instanceId": 167, "facetId": 167 }, { "actionType": "ActionType_Play", "grpId": 87448, "instanceId": 168, "facetId": 168 }, { "actionType": "ActionType_Play", "grpId": 68740, "instanceId": 170, "facetId": 170 } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:09 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 14, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077099127670", + "transactionId": "50fdb5af-7c78-4d45-8d62-e04f26ed0d7a", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 169 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:10 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 15, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077102439495", + "transactionId": "a3633719-ff1a-4b3d-9f45-48580a4285ba", + "payload": { + "type": "ClientMessageType_PerformActionResp", + "gameStateId": 7, + "respId": 21, + "performActionResp": { + "actions": [ + { + "actionType": "ActionType_Cast", + "grpId": 73266, + "instanceId": 169, + "facetId": 169, + "manaCost": [ + { + "color": [ + "ManaColor_Blue" + ], + "count": 1 + } + ], + "shouldStop": true, + "autoTapSolution": { + "autoTapActions": [ + { + "instanceId": 284, + "abilityGrpId": 1002, + "manaPaymentOption": { + "mana": [ + { + "manaId": 1, + "color": "ManaColor_Blue", + "srcInstanceId": 284, + "specs": [ + { + "type": "ManaSpecType_Predictive" + } + ], + "abilityGrpId": 1002, + "count": 1 + } + ] + } + } + ] + } + } + ], + "autoPassPriority": "AutoPassPriority_Yes" + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:10 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 16, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077103568649", + "transactionId": "30282bac-1512-42ea-874f-0cd320e6f609", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:10 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "a3633719-ff1a-4b3d-9f45-48580a4285ba", "requestId": 15, "timestamp": "1792110910338", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 22, "gameStateId": 8, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 8, "zones": [ { "zoneId": 27, "type": "ZoneType_Stack", "visibility": "Visibility_Public", "objectInstanceIds": [ 285 ] }, { "zoneId": 30, "type": "ZoneType_Limbo", "visibility": "Visibility_Public", "objectInstanceIds": [ 169, 164 ] }, { "zoneId": 31, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 1, "objectInstanceIds": [ 170, 168, 167, 166, 165 ], "viewers": [ 1 ] } ], "gameObjects": [ { "instanceId": 169, "grpId": 73266, "type": "GameObjectType_Card", "zoneId": 30, "visibility": "Visibility_Private", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Creature" ], "subtypes": [ "SubType_Crab" ], "color": [ "CardColor_Blue" ], "power": { }, "toughness": { "value": 3 }, "viewers": [ 1 ], "name": 437203, "overlayGrpId": 73266, "uniqueAbilities": [ { "id": 40, "grpId": 138408 } ] }, { "instanceId": 284, "grpId": 97169, "type": "GameObjectType_Card", "zoneId": 28, "visibility": "Visibility_Public", "ownerSeatId": 1, "controllerSeatId": 1, "superTypes": [ "SuperType_Basic" ], "cardTypes": [ "CardType_Land" ], "subtypes": [ "SubType_Island" ], "isTapped": true, "name": 652, "overlayGrpId": 97169, "uniqueAbilities": [ { "id": 235, "grpId": 1002 } ] }, { "instanceId": 285, "grpId": 73266, "type": "GameObjectType_Card", "zoneId": 27, "visibility": "Visibility_Public", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Creature" ], "subtypes": [ "SubType_Crab" ], "color": [ "CardColor_Blue" ], "power": { }, "toughness": { "value": 3 }, "name": 437203, "overlayGrpId": 73266, "uniqueAbilities": [ { "id": 236, "grpId": 138408 } ] } ], "annotations": [ { "id": 85, "affectedIds": [ 169 ], "type": [ "AnnotationType_ObjectIdChanged" ], "details": [ { "key": "orig_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 169 ] }, { "key": "new_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 285 ] } ] }, { "id": 86, "affectedIds": [ 285 ], "type": [ "AnnotationType_ZoneTransfer" ], "details": [ { "key": "zone_src", "type": "KeyValuePairValueType_int32", "valueInt32": [ 31 ] }, { "key": "zone_dest", "type": "KeyValuePairValueType_int32", "valueInt32": [ 27 ] }, { "key": "category", "type": "KeyValuePairValueType_string", "valueString": [ "CastSpell" ] } ] }, { "id": 87, "affectorId": 284, "affectedIds": [ 286 ], "type": [ "AnnotationType_AbilityInstanceCreated" ], "details": [ { "key": "source_zone", "type": "KeyValuePairValueType_int32", "valueInt32": [ 28 ] } ] }, { "id": 88, "affectorId": 286, "affectedIds": [ 284 ], "type": [ "AnnotationType_TappedUntappedPermanent" ], "details": [ { "key": "tapped", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] } ] }, { "id": 89, "affectorId": 1, "affectedIds": [ 286 ], "type": [ "AnnotationType_UserActionTaken" ], "details": [ { "key": "actionType", "type": "KeyValuePairValueType_int32", "valueInt32": [ 4 ] }, { "key": "abilityGrpId", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1002 ] } ] }, { "id": 90, "affectorId": 284, "affectedIds": [ 285 ], "type": [ "AnnotationType_ManaPaid" ], "details": [ { "key": "id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] }, { "key": "color", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] } ] }, { "id": 91, "affectorId": 284, "affectedIds": [ 286 ], "type": [ "AnnotationType_AbilityInstanceDeleted" ] }, { "id": 92, "affectorId": 1, "affectedIds": [ 285 ], "type": [ "AnnotationType_UserActionTaken" ], "details": [ { "key": "actionType", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "abilityGrpId", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "diffDeletedInstanceIds": [ 286 ], "prevGameStateId": 7, "timers": [ { "timerId": 3, "type": "TimerType_ActivePlayer", "durationSec": 75, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "elapsedSec": 1, "behavior": "TimerBehavior_StartDelayedTimer", "elapsedMs": 1155 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 15, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 15069 } ], "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ], "persistentAnnotations": [ { "id": 4, "affectorId": 27, "affectedIds": [ 285 ], "type": [ "AnnotationType_EnteredZoneThisTurn" ] } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 23, "gameStateId": 9, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 9, "turnInfo": { "phase": "Phase_Main1", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "prevGameStateId": 8, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 24, "gameStateId": 10, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 10, "turnInfo": { "phase": "Phase_Main1", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "zones": [ { "zoneId": 27, "type": "ZoneType_Stack", "visibility": "Visibility_Public" }, { "zoneId": 28, "type": "ZoneType_Battlefield", "visibility": "Visibility_Public", "objectInstanceIds": [ 285, 284 ] } ], "gameObjects": [ { "instanceId": 285, "grpId": 73266, "type": "GameObjectType_Card", "zoneId": 28, "visibility": "Visibility_Public", "ownerSeatId": 1, "controllerSeatId": 1, "cardTypes": [ "CardType_Creature" ], "subtypes": [ "SubType_Crab" ], "color": [ "CardColor_Blue" ], "power": { }, "toughness": { "value": 3 }, "hasSummoningSickness": true, "name": 437203, "overlayGrpId": 73266, "uniqueAbilities": [ { "id": 236, "grpId": 138408 } ] } ], "annotations": [ { "id": 96, "affectorId": 285, "affectedIds": [ 285 ], "type": [ "AnnotationType_ResolutionStart" ], "details": [ { "key": "grpid", "type": "KeyValuePairValueType_int32", "valueInt32": [ 73266 ] } ] }, { "id": 97, "affectorId": 285, "affectedIds": [ 285 ], "type": [ "AnnotationType_ResolutionComplete" ], "details": [ { "key": "grpid", "type": "KeyValuePairValueType_int32", "valueInt32": [ 73266 ] } ] }, { "id": 98, "affectorId": 1, "affectedIds": [ 285 ], "type": [ "AnnotationType_ZoneTransfer" ], "details": [ { "key": "zone_src", "type": "KeyValuePairValueType_int32", "valueInt32": [ 27 ] }, { "key": "zone_dest", "type": "KeyValuePairValueType_int32", "valueInt32": [ 28 ] }, { "key": "category", "type": "KeyValuePairValueType_string", "valueString": [ "Resolve" ] } ] } ], "prevGameStateId": 9, "timers": [ { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" } ], "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ], "persistentAnnotations": [ { "id": 5, "affectorId": 28, "affectedIds": [ 285, 284 ], "type": [ "AnnotationType_EnteredZoneThisTurn" ] } ], "diffDeletedPersistentAnnotationIds": [ 4 ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 25, "gameStateId": 11, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 11, "turnInfo": { "phase": "Phase_Main1", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "prevGameStateId": 10, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 26, "gameStateId": 12, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 12, "turnInfo": { "phase": "Phase_Combat", "step": "Step_BeginCombat", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_DeclareAttack" }, "annotations": [ { "id": 99, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "prevGameStateId": 11, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 27, "gameStateId": 13, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 13, "turnInfo": { "phase": "Phase_Combat", "step": "Step_BeginCombat", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_DeclareAttack" }, "prevGameStateId": 12, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 28, "gameStateId": 14, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 14, "turnInfo": { "phase": "Phase_Combat", "step": "Step_DeclareAttack", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_EndCombat" }, "annotations": [ { "id": 100, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 5 ] } ] } ], "prevGameStateId": 13, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 29, "gameStateId": 15, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 15, "turnInfo": { "phase": "Phase_Combat", "step": "Step_DeclareAttack", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_EndCombat" }, "prevGameStateId": 14, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 30, "gameStateId": 16, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 16, "turnInfo": { "phase": "Phase_Combat", "step": "Step_EndCombat", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Main2" }, "annotations": [ { "id": 101, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 8 ] } ] } ], "prevGameStateId": 15, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 31, "gameStateId": 17, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 17, "turnInfo": { "phase": "Phase_Combat", "step": "Step_EndCombat", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Main2" }, "prevGameStateId": 16, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 32, "gameStateId": 18, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 18, "turnInfo": { "phase": "Phase_Main2", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Ending", "nextStep": "Step_End" }, "annotations": [ { "id": 102, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 4 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "prevGameStateId": 17, "timers": [ { "timerId": 11, "type": "TimerType_NonActivePlayer", "durationSec": 60, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 } ], "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 33, "gameStateId": 19, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 19, "turnInfo": { "phase": "Phase_Main2", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Ending", "nextStep": "Step_End" }, "prevGameStateId": 18, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 34, "gameStateId": 20, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 20, "turnInfo": { "phase": "Phase_Ending", "step": "Step_End", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 1, "decisionPlayer": 1, "nextPhase": "Phase_Ending", "nextStep": "Step_Cleanup" }, "annotations": [ { "id": 103, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 5 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "prevGameStateId": 19, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 35, "gameStateId": 21, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 21, "turnInfo": { "phase": "Phase_Ending", "step": "Step_End", "turnNumber": 1, "activePlayer": 1, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Ending", "nextStep": "Step_Cleanup" }, "prevGameStateId": 20, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 169, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 36, "gameStateId": 22, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 22, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "pipCount": 1, "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 } ], "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Upkeep", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 2, "nextPhase": "Phase_Beginning", "nextStep": "Step_Draw" }, "annotations": [ { "id": 104, "affectedIds": [ 1 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 5 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 10 ] } ] }, { "id": 105, "affectedIds": [ 0 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] }, { "id": 106, "affectorId": 2, "affectedIds": [ 2 ], "type": [ "AnnotationType_NewTurnStarted" ] }, { "id": 107, "affectedIds": [ 2 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] } ] }, { "id": 108, "affectedIds": [ 2 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] } ] } ], "prevGameStateId": 21, "timers": [ { "timerId": 3, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 11, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 } ], "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ], "diffDeletedPersistentAnnotationIds": [ 5 ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 37, "gameStateId": 23, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 23, "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Upkeep", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 1, "nextPhase": "Phase_Beginning", "nextStep": "Step_Draw" }, "prevGameStateId": 22, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 38, "gameStateId": 24, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 24, "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Draw", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 2, "nextPhase": "Phase_Main1" }, "zones": [ { "zoneId": 30, "type": "ZoneType_Limbo", "visibility": "Visibility_Public", "objectInstanceIds": [ 231, 169, 164 ] }, { "zoneId": 35, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 2, "objectInstanceIds": [ 287, 230, 229, 228, 227, 226, 225, 224 ], "viewers": [ 2 ] }, { "zoneId": 36, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 2, "objectInstanceIds": [ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283 ] } ], "annotations": [ { "id": 109, "affectedIds": [ 2 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 1 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 3 ] } ] }, { "id": 110, "affectedIds": [ 231 ], "type": [ "AnnotationType_ObjectIdChanged" ], "details": [ { "key": "orig_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 231 ] }, { "key": "new_id", "type": "KeyValuePairValueType_int32", "valueInt32": [ 287 ] } ] }, { "id": 111, "affectedIds": [ 287 ], "type": [ "AnnotationType_ZoneTransfer" ], "details": [ { "key": "zone_src", "type": "KeyValuePairValueType_int32", "valueInt32": [ 36 ] }, { "key": "zone_dest", "type": "KeyValuePairValueType_int32", "valueInt32": [ 35 ] }, { "key": "category", "type": "KeyValuePairValueType_string", "valueString": [ "Draw" ] } ] } ], "prevGameStateId": 23, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ], "persistentAnnotations": [ { "id": 14, "affectorId": 35, "affectedIds": [ 287 ], "type": [ "AnnotationType_EnteredZoneThisTurn" ] } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 39, "gameStateId": 25, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 25, "turnInfo": { "phase": "Phase_Beginning", "step": "Step_Draw", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 1, "nextPhase": "Phase_Main1" }, "prevGameStateId": 24, "update": "GameStateUpdate_SendHiFi", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 40, "gameStateId": 26, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 26, "turnInfo": { "phase": "Phase_Main1", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 2, "decisionPlayer": 2, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "annotations": [ { "id": 112, "affectedIds": [ 2 ], "type": [ "AnnotationType_PhaseOrStepModified" ], "details": [ { "key": "phase", "type": "KeyValuePairValueType_int32", "valueInt32": [ 2 ] }, { "key": "step", "type": "KeyValuePairValueType_int32", "valueInt32": [ 0 ] } ] } ], "prevGameStateId": 25, "timers": [ { "timerId": 12, "type": "TimerType_Delay", "durationSec": 2, "running": true, "behavior": "TimerBehavior_StartDelayedTimer", "elapsedMs": 1 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 3, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 3417 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:11 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "6a6cc617-24ab-4d80-ad8b-de6ebdde78b2", "requestId": 8, "timestamp": "1792110911594", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_UIMessage", "systemSeatIds": [ 1 ], "uiMessage": { "seatIds": [ 2 ], "onChat": { "text": "Phrase_Basic_Hello" } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:12 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 17, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077121691790", + "transactionId": "a056a52c-9892-4aeb-8a19-2695cc8cfe64", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 285 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:12 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 18, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077121764773", + "transactionId": "c4e289e4-ec09-47e9-afd9-f6e84f11d0f9", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:12 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "timestamp": "1792110912338", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_TimerStateMessage", "systemSeatIds": [ 1, 2 ], "msgId": 42, "gameStateId": 26, "timerStateMessage": { "seatId": 2, "timers": [ { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 10, "type": "TimerType_ActivePlayer", "durationSec": 61, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 11, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 12, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 5, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 5417 } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:12 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 19, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077125998520", + "transactionId": "f0daff02-794f-4a27-8709-76fa68cbfa9e", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": { + "objectId": 285 + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:12 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 20, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077126278570", + "transactionId": "864a802d-e833-4b8e-b714-993f9ebc61de", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onHover": {} + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:14 AM: LOCALPLAYERID0000000000000 to Match: ClientToGreuimessage +{ + "requestId": 21, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREUIMessage", + "timestamp": "639277077140142120", + "transactionId": "943a2900-e1de-4961-9e09-9002e36d7728", + "payload": { + "type": "ClientMessageType_UIMessage", + "systemSeatId": 1, + "uiMessage": { + "seatIds": [ + 2 + ], + "onChat": { + "text": "Phrase_OTJ_Howdy" + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:15 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "e6f344f9-5e8f-4d56-92a9-9b2a83d750f6", "requestId": 9, "timestamp": "1792110915443", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 43, "gameStateId": 27, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 27, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 1, "stage": "GameStage_GameOver", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_GameComplete", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "results": [ { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } ], "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "teams": [ { "id": 2, "playerIds": [ 2 ], "status": "TeamStatus_PendingLoss" } ], "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_PendingLoss", "maxHandSize": 7, "turnNumber": 1, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 } ], "prevGameStateId": 26, "timers": [ { "timerId": 10, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "elapsedSec": 3, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 3103 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 8, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 8519 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 44, "gameStateId": 28, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 28, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_EnterSideboardingReq", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_PendingLoss", "maxHandSize": 7, "turnNumber": 1, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_EnterSideboardingReq", "startingLifeTotal": 20 } ], "pendingMessageCount": 1, "prevGameStateId": 27, "timers": [ { "timerId": 2, "type": "TimerType_Epilogue", "durationSec": 145, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 1 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "elapsedSec": 3, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 3105 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_IntermissionReq", "systemSeatIds": [ 1 ], "msgId": 45, "gameStateId": 28, "intermissionReq": { "options": [ { "optionPrompt": { "promptId": 31 }, "responseType": "ClientMessageType_EnterSideboardingReq" } ], "intermissionPrompt": { "promptId": 25, "parameters": [ { "parameterName": "WinningTeamId", "type": "ParameterType_Number", "numberValue": 1 } ] }, "result": { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:18 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 22, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077180236913", + "transactionId": "8505a700-0acd-406d-9835-99e061658467", + "payload": { + "type": "ClientMessageType_EnterSideboardingReq", + "gameStateId": 28, + "respId": 45 + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:18 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "8505a700-0acd-406d-9835-99e061658467", "requestId": 22, "timestamp": "1792110918060", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 47, "gameStateId": 29, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 29, "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "turnNumber": 1, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_SubmitDeckResp", "startingLifeTotal": 20 } ], "turnInfo": { "phase": "Phase_Main1", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 2, "decisionPlayer": 1, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "pendingMessageCount": 1, "prevGameStateId": 28, "timers": [ { "timerId": 2, "type": "TimerType_Epilogue", "durationSec": 145, "elapsedSec": 2, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2618 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "elapsedSec": 2, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2618 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "elapsedSec": 5, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 5722 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } }, { "type": "GREMessageType_SubmitDeckReq", "systemSeatIds": [ 1 ], "msgId": 48, "gameStateId": 29, "submitDeckReq": { "deck": { "deckCards": [ 71860, 71860, 71860, 71860, 97170, 93986, 93986, 93986, 93986, 77498, 77498, 77498, 77498, 94278, 94278, 94278, 94278, 73266, 73266, 73266, 73266, 102507, 102507, 102507, 102507, 75662, 75662, 75662, 75662, 97169, 97169, 97169, 97169, 97169, 97169, 95614, 95614, 91788, 91788, 91788, 91788, 83950, 83950, 83950, 83950, 68740, 68740, 68740, 68740, 94351, 87448, 73474, 106251, 106251, 106251, 106251, 70335, 70335, 70335, 70335 ], "sideboardCards": [ 95614, 82853, 82853, 82853, 75118, 102775, 70205, 70205, 90718, 94877, 94877, 92204, 92204, 92407, 88998 ] } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:19 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "44b53100-71b3-4ebd-8d05-ac474a01b6cb", "requestId": 10, "timestamp": "1792110918164", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 49, "gameStateId": 30, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 30, "players": [ { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_PendingLoss", "maxHandSize": 7, "turnNumber": 1, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_SubmitDeckResp", "startingLifeTotal": 20 } ], "turnInfo": { "phase": "Phase_Main1", "turnNumber": 2, "activePlayer": 2, "priorityPlayer": 2, "decisionPlayer": 2, "nextPhase": "Phase_Combat", "nextStep": "Step_BeginCombat" }, "prevGameStateId": 29, "timers": [ { "timerId": 2, "type": "TimerType_Epilogue", "durationSec": 145, "elapsedSec": 2, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2722 }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 105 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "elapsedSec": 2, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2722 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 1 } ], "update": "GameStateUpdate_SendAndRecord", "actions": [ { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 166, "manaCost": [ { "color": [ "ManaColor_Generic" ], "count": 2 }, { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Cast", "instanceId": 165, "manaCost": [ { "color": [ "ManaColor_Blue" ], "count": 1 } ] } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 167 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 170 } }, { "seatId": 1, "action": { "actionType": "ActionType_Play", "instanceId": 168 } }, { "seatId": 1, "action": { "actionType": "ActionType_Activate_Mana", "instanceId": 284, "abilityGrpId": 1002 } } ] } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:24 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 23, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077242110190", + "transactionId": "b27f4de8-4b27-4a59-b324-482531ceef70", + "payload": { + "type": "ClientMessageType_SubmitDeckResp", + "gameStateId": 29, + "respId": 48, + "submitDeckResp": { + "deck": { + "deckCards": [ + 71860, + 71860, + 71860, + 71860, + 97170, + 93986, + 93986, + 93986, + 93986, + 77498, + 77498, + 77498, + 77498, + 94278, + 94278, + 94278, + 94278, + 73266, + 73266, + 73266, + 73266, + 102507, + 102507, + 102507, + 102507, + 75662, + 75662, + 75662, + 75662, + 97169, + 97169, + 97169, + 97169, + 97169, + 97169, + 95614, + 95614, + 91788, + 91788, + 91788, + 91788, + 83950, + 83950, + 83950, + 83950, + 68740, + 68740, + 68740, + 68740, + 94351, + 87448, + 73474, + 106251, + 106251, + 106251, + 106251, + 70335, + 70335, + 70335, + 70335 + ], + "sideboardCards": [ + 95614, + 82853, + 82853, + 82853, + 75118, + 102775, + 70205, + 70205, + 90718, + 94877, + 94877, + 92204, + 92204, + 92407, + 88998 + ] + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:24 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "b27f4de8-4b27-4a59-b324-482531ceef70", "requestId": 23, "timestamp": "1792110924266", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_SubmitDeckConfirmation", "systemSeatIds": [ 1 ], "msgId": 52, "gameStateId": 30 }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 1, "gameStateId": 1, "gameStateMessage": { "type": "GameStateType_Full", "gameStateId": 1, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 2, "stage": "GameStage_Start", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_GameInProgress", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "results": [ { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } ], "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "teams": [ { "id": 1, "playerIds": [ 1 ], "status": "TeamStatus_InGame" }, { "id": 2, "playerIds": [ 2 ], "status": "TeamStatus_InGame" } ], "players": [ { "lifeTotal": 20, "systemSeatNumber": 1, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 1, "timerIds": [ 1, 2, 3, 4, 5, 6, 7 ], "controllerSeatId": 1, "controllerType": "ControllerType_Player", "startingLifeTotal": 20 }, { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_InGame", "maxHandSize": 7, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_ChooseStartingPlayerResp", "startingLifeTotal": 20 } ], "turnInfo": { "decisionPlayer": 2 }, "zones": [ { "zoneId": 18, "type": "ZoneType_Revealed", "visibility": "Visibility_Public", "ownerSeatId": 1 }, { "zoneId": 19, "type": "ZoneType_Revealed", "visibility": "Visibility_Public", "ownerSeatId": 2 }, { "zoneId": 24, "type": "ZoneType_Suppressed", "visibility": "Visibility_Public" }, { "zoneId": 25, "type": "ZoneType_Pending", "visibility": "Visibility_Public" }, { "zoneId": 26, "type": "ZoneType_Command", "visibility": "Visibility_Public" }, { "zoneId": 27, "type": "ZoneType_Stack", "visibility": "Visibility_Public" }, { "zoneId": 28, "type": "ZoneType_Battlefield", "visibility": "Visibility_Public" }, { "zoneId": 29, "type": "ZoneType_Exile", "visibility": "Visibility_Public" }, { "zoneId": 30, "type": "ZoneType_Limbo", "visibility": "Visibility_Public" }, { "zoneId": 31, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 1, "viewers": [ 1 ] }, { "zoneId": 32, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 1, "objectInstanceIds": [ 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 ] }, { "zoneId": 33, "type": "ZoneType_Graveyard", "visibility": "Visibility_Public", "ownerSeatId": 1 }, { "zoneId": 34, "type": "ZoneType_Sideboard", "visibility": "Visibility_Private", "ownerSeatId": 1, "viewers": [ 1 ] }, { "zoneId": 35, "type": "ZoneType_Hand", "visibility": "Visibility_Private", "ownerSeatId": 2, "viewers": [ 2 ] }, { "zoneId": 36, "type": "ZoneType_Library", "visibility": "Visibility_Hidden", "ownerSeatId": 2, "objectInstanceIds": [ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283 ] }, { "zoneId": 37, "type": "ZoneType_Graveyard", "visibility": "Visibility_Public", "ownerSeatId": 2 }, { "zoneId": 38, "type": "ZoneType_Sideboard", "visibility": "Visibility_Private", "ownerSeatId": 2, "viewers": [ 2 ] } ], "diffDeletedInstanceIds": [ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 141, 143, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163 ], "timers": [ { "timerId": 1, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 2, "type": "TimerType_Epilogue", "durationSec": 145, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 3, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 4, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 5, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" }, { "timerId": 6, "type": "TimerType_Inactivity", "durationSec": 150, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30 }, { "timerId": 7, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 15, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 15069 }, { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "running": true, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30, "elapsedMs": 2 }, { "timerId": 9, "type": "TimerType_Epilogue", "durationSec": 145, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 10, "type": "TimerType_ActivePlayer", "durationSec": 61, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 11, "type": "TimerType_NonActivePlayer", "durationSec": 45, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 12, "type": "TimerType_Delay", "durationSec": 2, "behavior": "TimerBehavior_StartDelayedTimer" }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 2 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 8, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 8522 } ], "update": "GameStateUpdate_SendAndRecord" } } ] } } +Can't add component to object that is being destroyed. +Can't add component to object that is being destroyed. +OnSceneUnloaded for DuelScene +OnSceneLoaded for PreGameScene +OnSceneLoaded for DuelScene +[UnityCrossThreadLogger]10/16/2026 12:35:26 AM: LOCALPLAYERID0000000000000 to Match: ClientToGremessage +{ + "requestId": 24, + "clientToMatchServiceMessageType": "ClientToMatchServiceMessageType_ClientToGREMessage", + "timestamp": "639277077265180717", + "transactionId": "b1b6802c-df3c-46c6-a884-ca2ca85417d1", + "payload": { + "type": "ClientMessageType_SetSettingsReq", + "setSettingsReq": { + "settings": { + "autoPassOption": "AutoPassOption_ResolveMyStackEffects", + "manaSelectionType": "ManaSelectionType_Auto", + "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", + "autoSelectReplacementSetting": "Setting_Enable" + } + } + } +} +[UnityCrossThreadLogger]10/16/2026 12:35:26 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "b1b6802c-df3c-46c6-a884-ca2ca85417d1", "requestId": 24, "timestamp": "1792110926563", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_SetSettingsResp", "systemSeatIds": [ 1 ], "msgId": 4, "gameStateId": 1, "setSettingsResp": { "settings": { "stops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" } ], "autoPassOption": "AutoPassOption_ResolveMyStackEffects", "graveyardOrder": "OrderingType_OrderArbitraryAlways", "manaSelectionType": "ManaSelectionType_Auto", "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", "smartStopsSetting": "SmartStopsSetting_Enable", "autoTapStopsSetting": "AutoTapStopsSetting_Enable", "autoOptionalPaymentCancellationSetting": "Setting_Enable", "transientStops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" } ], "autoSelectReplacementSetting": "Setting_Enable", "stackAutoPassOption": "AutoPassOption_Clear" } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:28 AM: Match to LOCALPLAYERID0000000000000: GreToClientEvent +{ "transactionId": "84c23c13-3d3a-4800-98f0-86c88a243951", "requestId": 13, "timestamp": "1792110928334", "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_SetSettingsResp", "systemSeatIds": [ 1 ], "msgId": 5, "gameStateId": 1, "setSettingsResp": { "settings": { "stops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Set" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Set" } ], "autoPassOption": "AutoPassOption_Clear", "graveyardOrder": "OrderingType_OrderArbitraryAlways", "manaSelectionType": "ManaSelectionType_Auto", "defaultAutoPassOption": "AutoPassOption_ResolveMyStackEffects", "smartStopsSetting": "SmartStopsSetting_Enable", "autoTapStopsSetting": "AutoTapStopsSetting_Enable", "autoOptionalPaymentCancellationSetting": "Setting_Enable", "transientStops": [ { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_UpkeepStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DrawStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PrecombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_BeginCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareAttackersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_DeclareBlockersStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_CombatDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndCombatStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_PostcombatMainPhase", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_EndStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Team", "status": "SettingStatus_Clear" }, { "stopType": "StopType_FirstStrikeDamageStep", "appliesTo": "SettingScope_Opponents", "status": "SettingStatus_Clear" } ], "autoSelectReplacementSetting": "Setting_Enable", "stackAutoPassOption": "AutoPassOption_Clear" } } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 7, "gameStateId": 2, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 2, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 2, "stage": "GameStage_GameOver", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_GameComplete", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "results": [ { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" }, { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } ], "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "teams": [ { "id": 2, "playerIds": [ 2 ], "status": "TeamStatus_PendingLoss" } ], "players": [ { "lifeTotal": 20, "systemSeatNumber": 2, "status": "PlayerStatus_PendingLoss", "maxHandSize": 7, "teamId": 2, "timerIds": [ 8, 9, 10, 11, 12, 13, 14 ], "controllerSeatId": 2, "controllerType": "ControllerType_Player", "pendingMessageType": "ClientMessageType_ChooseStartingPlayerResp", "startingLifeTotal": 20 } ], "prevGameStateId": 1, "timers": [ { "timerId": 8, "type": "TimerType_Prologue", "durationSec": 120, "behavior": "TimerBehavior_TakeControl", "warningThresholdSec": 30 }, { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "elapsedSec": 4, "running": true, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 4069 }, { "timerId": 14, "type": "TimerType_MatchClock", "durationSec": 1800, "elapsedSec": 12, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 12588 } ], "update": "GameStateUpdate_SendAndRecord" } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 8, "gameStateId": 3, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 3, "gameInfo": { "matchID": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "gameNumber": 2, "stage": "GameStage_GameOver", "type": "GameType_Duel", "variant": "GameVariant_Normal", "matchState": "MatchState_MatchComplete", "matchWinCondition": "MatchWinCondition_Best2of3", "maxTimeoutCount": 4, "maxPipCount": 3, "timeoutDurationSec": 30, "results": [ { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" }, { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" }, { "scope": "MatchScope_Match", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } ], "superFormat": "SuperFormat_Constructed", "mulliganType": "MulliganType_London", "deckConstraintInfo": { "minDeckSize": 60, "maxDeckSize": 250, "maxSideboardSize": 15 } }, "prevGameStateId": 2, "timers": [ { "timerId": 13, "type": "TimerType_Inactivity", "durationSec": 150, "elapsedSec": 4, "behavior": "TimerBehavior_Timeout", "warningThresholdSec": 30, "elapsedMs": 4069 } ], "update": "GameStateUpdate_SendAndRecord" } }, { "type": "GREMessageType_GameStateMessage", "systemSeatIds": [ 1 ], "msgId": 9, "gameStateId": 4, "gameStateMessage": { "type": "GameStateType_Diff", "gameStateId": 4, "pendingMessageCount": 1, "prevGameStateId": 3, "update": "GameStateUpdate_SendAndRecord" } }, { "type": "GREMessageType_IntermissionReq", "systemSeatIds": [ 1 ], "msgId": 10, "gameStateId": 4, "intermissionReq": { "intermissionPrompt": { "promptId": 27, "parameters": [ { "parameterName": "WinningTeamId", "type": "ParameterType_Number", "numberValue": 1 } ] }, "result": { "scope": "MatchScope_Match", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } } } ] } } +[UnityCrossThreadLogger]10/16/2026 12:35:28 AM: Match to LOCALPLAYERID0000000000000: MatchGameRoomStateChangedEvent +{ "transactionId": "84c23c13-3d3a-4800-98f0-86c88a243951", "requestId": 13, "timestamp": "1792110928334", "matchGameRoomStateChangedEvent": { "gameRoomInfo": { "gameRoomConfig": { "reservedPlayers": [ { "userId": "LOCALPLAYERID0000000000000", "playerName":"Local Player", "systemSeatId": 1, "teamId": 1, "courseId": "Avatar_Basic_BilboRiddles_HOB", "sessionId": "00000000-0000-0000-0000-000000000000", "platformId": "SteamWindows", "eventId": "Traditional_Historic_Play" }, { "userId": "OPPONENTID000000", "playerName":"Opponent Player", "systemSeatId": 2, "teamId": 2, "courseId": "Avatar_Basic_Adventurer", "sessionId": "00000000-0000-0000-0000-000000000000", "platformId": "Windows", "eventId": "Traditional_Historic_Play" } ], "matchId": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3" }, "stateType": "MatchGameRoomStateType_MatchCompleted", "finalMatchResult": { "matchId": "c0a18506-9d87-4d0c-a2d3-e10bef8659d3", "matchCompletedReason": "MatchCompletedReasonType_Success", "resultList": [ { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" }, { "scope": "MatchScope_Game", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" }, { "scope": "MatchScope_Match", "result": "ResultType_WinLoss", "winningTeamId": 1, "reason": "ResultReason_Concede" } ] } } } } +[UnityCrossThreadLogger]STATE CHANGED {"old":"Playing","new":"MatchCompleted"} +OnSceneUnloaded for PreGameScene +Unloading 2 Unused Serialized files (Serialized files now loaded: 528) diff --git a/tests/test_carddb.py b/tests/test_carddb.py new file mode 100644 index 0000000..599f25e --- /dev/null +++ b/tests/test_carddb.py @@ -0,0 +1,50 @@ +import pytest + +from mtga_assistant import paths +from mtga_assistant.carddb import CardDB, mana_value, parse_mana + + +@pytest.mark.parametrize( + "text,symbols,mv", + [ + ("o2oU", ["2", "U"], 3), + ("oW", ["W"], 1), + ("", [], 0), + ("o1o(R/G)", ["1", "R/G"], 2), + ("o1o(B/P)o(B/P)", ["1", "B/P", "B/P"], 3), + ("o(2/B)o(2/R)", ["2/B", "2/R"], 4), + ("oXoXoR", ["X", "X", "R"], 1), + ("o10", ["10"], 10), + ], +) +def test_parse_mana(text, symbols, mv): + assert parse_mana(text) == symbols + assert mana_value(symbols) == mv + + +def test_missing_db_gives_placeholder(): + db = CardDB(None) + assert not db.available + assert db.get(123).name == "Unknown card #123" + assert db.base_grp(123) == 123 + + +@pytest.fixture(scope="module") +def real_db(): + mtga = paths.find_mtga_dir(paths.load_config()) + path = paths.find_card_db(mtga) if mtga else None + if path is None: + pytest.skip("MTGA is not installed on this machine") + return CardDB(path) + + +def test_real_db_lookup(real_db): + island = real_db.get(97169) + assert island.name == "Island" + assert island.is_land + + +def test_real_db_split_card_half_maps_to_whole(real_db): + # Desist (half) -> Cease // Desist + assert real_db.base_grp(89160) == 89158 + assert real_db.base_grp(89158) == 89158 diff --git a/tests/test_gamestate.py b/tests/test_gamestate.py new file mode 100644 index 0000000..90aa89c --- /dev/null +++ b/tests/test_gamestate.py @@ -0,0 +1,196 @@ +from pathlib import Path + +from mtga_assistant.carddb import CardInfo +from mtga_assistant.gamestate import MatchTracker +from mtga_assistant.logparse import GreMessages, LogParser + +FIXTURE = Path(__file__).parent / "fixtures" / "bo3_match.log" + +ME, OPP = 1, 2 +# Zone ids as MTGA assigns them for a two-player game. +BATTLEFIELD, EXILE, LIMBO = 28, 29, 30 +MY_HAND, MY_LIB, MY_GY = 31, 32, 33 +OPP_HAND, OPP_LIB, OPP_GY = 35, 36, 37 + + +def replay(path: Path, tracker: MatchTracker, check=None) -> None: + p = LogParser() + with open(path, encoding="utf-8") as f: + for line in f: + for ev in p.feed(line): + tracker.handle(ev) + if check and isinstance(ev, GreMessages): + check(tracker) + + +def test_fixture_match_lifecycle(): + t = MatchTracker() + replay(FIXTURE, t) + assert t.my_seat == ME + assert t.opponent_name == "Opponent Player" + assert t.game is not None and t.game.game_number == 2 + assert t.game_results == ["Won", "Won"] + assert t.last_result == "Won" + assert not t.in_match + assert t.deck_name == "Cruel Tutelage" + + +def test_fixture_library_count_matches_library_zone(): + checked = 0 + + def check(t: MatchTracker) -> None: + nonlocal checked + g = t.game + if g is None or not g.zones or g.desynced: + return + assert sum(t.my_library_remaining().values()) == g.zone_size("ZoneType_Library", ME) + checked += 1 + + replay(FIXTURE, MatchTracker(), check) + assert checked >= 15 + + +# -- synthetic GRE messages for opponent knowledge ------------------------------ + + +def gsm(state_id: int, *, zones=(), objects=(), annotations=(), deleted=(), full=False) -> dict: + msg = { + "type": "GameStateType_Full" if full else "GameStateType_Diff", + "gameStateId": state_id, + "zones": list(zones), + "gameObjects": list(objects), + "annotations": list(annotations), + "diffDeletedInstanceIds": list(deleted), + } + if not full: + msg["prevGameStateId"] = state_id - 1 + return {"type": "GREMessageType_GameStateMessage", "gameStateMessage": msg} + + +def zone(zid: int, ztype: str, ids, owner=None) -> dict: + z = {"zoneId": zid, "type": f"ZoneType_{ztype}", "objectInstanceIds": list(ids)} + if owner is not None: + z["ownerSeatId"] = owner + return z + + +def card(iid: int, grp: int, zid: int, owner=OPP, otype="Card") -> dict: + return {"instanceId": iid, "grpId": grp, "type": f"GameObjectType_{otype}", "zoneId": zid, + "ownerSeatId": owner, "controllerSeatId": owner} + + +def id_changed(orig: int, new: int) -> dict: + return {"type": ["AnnotationType_ObjectIdChanged"], "details": [ + {"key": "orig_id", "valueInt32": [orig]}, {"key": "new_id", "valueInt32": [new]}]} + + +def shuffle(old: list[int], new: list[int]) -> dict: + return {"type": ["AnnotationType_Shuffle"], "details": [ + {"key": "OldIds", "valueInt32": old}, {"key": "NewIds", "valueInt32": new}]} + + +def start_game(t: MatchTracker, deck=(1001,) * 4) -> None: + t.handle(GreMessages([{ + "type": "GREMessageType_ConnectResp", "systemSeatIds": [ME], + "connectResp": {"deckMessage": {"deckCards": list(deck), "sideboardCards": []}}, + }])) + t.handle(GreMessages([gsm(1, full=True, zones=[ + zone(BATTLEFIELD, "Battlefield", []), zone(LIMBO, "Limbo", []), + zone(MY_HAND, "Hand", [], ME), zone(MY_LIB, "Library", range(100, 100 + len(deck)), ME), + zone(OPP_HAND, "Hand", [200, 201], OPP), zone(OPP_LIB, "Library", [300, 301, 302], OPP), + zone(OPP_GY, "Graveyard", [], OPP), + ])])) + + +def test_bounced_card_is_known_in_opponent_hand(): + t = MatchTracker() + start_game(t) + # Opponent casts card 200 -> it resolves onto the battlefield as instance 210. + t.handle(GreMessages([gsm(2, annotations=[id_changed(200, 210)], zones=[ + zone(OPP_HAND, "Hand", [201], OPP), zone(BATTLEFIELD, "Battlefield", [210]), + ], objects=[card(210, 5005, BATTLEFIELD)])])) + g = t.game + assert g.cards_in("ZoneType_Battlefield", controller=OPP) == {5005: 1} + + # It gets bounced: new id 220, back in the hidden hand, no object sent for it. + t.handle(GreMessages([gsm(3, annotations=[id_changed(210, 220)], zones=[ + zone(OPP_HAND, "Hand", [201, 220], OPP), zone(BATTLEFIELD, "Battlefield", []), + ], deleted=[210])])) + assert g.opp_known_in("ZoneType_Hand") == {5005: 1} + assert not g.cards_in("ZoneType_Battlefield", controller=OPP) + assert t.opp_seen_match == {5005: 1} # same physical card, counted once + + +def test_known_card_survives_library_shuffle(): + t = MatchTracker() + start_game(t) + g = t.game + # A card is revealed on top of their library (e.g. by a "reveal the top card" effect). + t.handle(GreMessages([gsm(2, objects=[card(300, 6006, OPP_LIB)])])) + assert g.opp_known_in("ZoneType_Library") == {6006: 1} + + t.handle(GreMessages([gsm(3, annotations=[shuffle([300, 301, 302], [310, 311, 312])], + zones=[zone(OPP_LIB, "Library", [310, 311, 312], OPP)], deleted=[300])])) + assert g.opp_known_in("ZoneType_Library") == {6006: 1} + + # Later it is drawn and played: no longer "known in library". + t.handle(GreMessages([gsm(4, zones=[zone(OPP_LIB, "Library", [310, 311], OPP), + zone(BATTLEFIELD, "Battlefield", [320])], + objects=[card(320, 6006, BATTLEFIELD)])])) + assert g.opp_known_in("ZoneType_Library") == {} + + +def test_revealed_card_in_hand(): + t = MatchTracker() + start_game(t) + t.handle(GreMessages([gsm(2, objects=[card(400, 7007, OPP_HAND, otype="RevealedCard")])])) + assert t.game.opp_known_in("ZoneType_Hand") == {7007: 1} + assert t.opp_seen_match == {7007: 1} + + +def test_tokens_do_not_count_as_my_cards(): + t = MatchTracker() + start_game(t, deck=(1001,) * 4) + t.handle(GreMessages([gsm(2, annotations=[id_changed(100, 150)], zones=[ + zone(MY_LIB, "Library", [101, 102, 103], ME), zone(BATTLEFIELD, "Battlefield", [150, 151]), + ], objects=[card(150, 1001, BATTLEFIELD, owner=ME), card(151, 9999, BATTLEFIELD, owner=ME, otype="Token")])])) + assert t.my_library_remaining() == {1001: 3} + + +class FakeCards: + def __init__(self, base: dict[int, int]): + self.base = base + + def get(self, grp): + return CardInfo(grp_id=grp, name=str(grp)) + + def base_grp(self, grp): + return self.base.get(grp, grp) + + +def test_transformed_card_maps_back_to_deck_entry(): + t = MatchTracker(card_lookup=FakeCards({1002: 1001})) # 1002 is 1001's back face + start_game(t, deck=(1001,) * 2) + t.handle(GreMessages([gsm(2, annotations=[id_changed(100, 150)], zones=[ + zone(MY_LIB, "Library", [101], ME), zone(BATTLEFIELD, "Battlefield", [150]), + ], objects=[card(150, 1002, BATTLEFIELD, owner=ME)])])) + assert t.my_library_remaining() == {1001: 1} + + +def test_gap_in_state_ids_marks_desync(): + t = MatchTracker() + start_game(t) + t.handle(GreMessages([gsm(2)])) + assert not t.game.desynced + t.handle(GreMessages([gsm(5)])) # prevGameStateId 4 never seen + assert t.game.desynced + + +def test_object_logged_before_its_id_change_is_one_card(): + t = MatchTracker() + start_game(t) + t.handle(GreMessages([gsm(2, objects=[card(210, 5005, BATTLEFIELD)])])) + # The new object shows up one message before the annotation linking it to its old id. + t.handle(GreMessages([gsm(3, objects=[card(220, 5005, BATTLEFIELD)])])) + t.handle(GreMessages([gsm(4, annotations=[id_changed(210, 220)])])) + assert t.opp_seen_match == {5005: 1} diff --git a/tests/test_logparse.py b/tests/test_logparse.py new file mode 100644 index 0000000..63a2ce5 --- /dev/null +++ b/tests/test_logparse.py @@ -0,0 +1,65 @@ +from collections import Counter +from pathlib import Path + +from mtga_assistant.logparse import ClientDeck, DeckSubmitted, GreMessages, LogParser, MatchRoom + +FIXTURE = Path(__file__).parent / "fixtures" / "bo3_match.log" + + +def parse_file(path: Path) -> list: + p = LogParser() + out = [] + with open(path, encoding="utf-8") as f: + for line in f: + out.extend(p.feed(line)) + return out + + +def test_fixture_event_kinds(): + events = parse_file(FIXTURE) + kinds = Counter(type(e).__name__ for e in events) + assert kinds["MatchRoom"] == 2 + assert kinds["DeckSubmitted"] == 1 + assert kinds["ClientDeck"] == 1 + assert kinds["GreMessages"] >= 15 + + rooms = [e for e in events if isinstance(e, MatchRoom)] + assert rooms[0].state == "MatchGameRoomStateType_Playing" + assert rooms[1].state == "MatchGameRoomStateType_MatchCompleted" + assert {p["playerName"] for p in rooms[0].players} == {"Local Player", "Opponent Player"} + + +def test_deck_submitted(): + deck = next(e for e in parse_file(FIXTURE) if isinstance(e, DeckSubmitted)) + assert deck.name == "Cruel Tutelage" + assert sum(deck.main.values()) == 60 + assert sum(deck.sideboard.values()) == 15 + + +def test_client_deck_from_pretty_printed_body(): + deck = next(e for e in parse_file(FIXTURE) if isinstance(e, ClientDeck)) + assert sum(deck.main.values()) == 60 + assert sum(deck.sideboard.values()) == 15 + + +def test_single_line_gre_event(): + p = LogParser() + assert p.feed("[UnityCrossThreadLogger]10/16/2026 12:34:51 AM: Match to X: GreToClientEvent\n") == [] + evs = p.feed('{ "greToClientEvent": { "greToClientMessages": [ { "type": "GREMessageType_UIMessage" } ] } }\n') + assert len(evs) == 1 and isinstance(evs[0], GreMessages) + + +def test_multiline_body_and_abandoned_fragment(): + p = LogParser() + assert p.feed("{\n") == [] + assert p.feed(' "payload": { "type": "Other" },\n') == [] + # A new log entry starts before the body closed: the fragment is dropped. + assert p.feed("[UnityCrossThreadLogger]something\n") == [] + evs = p.feed('{ "greToClientEvent": { "greToClientMessages": [ { "type": "T" } ] } }\n') + assert len(evs) == 1 + + +def test_non_json_lines_ignored(): + p = LogParser() + for line in ["OnSceneLoaded for DuelScene", "[UnityCrossThreadLogger]STATE CHANGED {\"old\":1}", ""]: + assert p.feed(line) == [] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..656cb75 --- /dev/null +++ b/uv.lock @@ -0,0 +1,110 @@ +version = 1 +revision = 5 +requires-python = ">=3.12" + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz", hash = "sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960", size = 21209, upload-time = "2026-10-06T22:48:38.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl", hash = "sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7", size = 7552, upload-time = "2026-10-06T22:48:36.959Z" }, +] + +[[package]] +name = "mtga-assistant" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "pyside6-essentials" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [{ name = "pyside6-essentials", specifier = ">=6.8" }] + +[package.metadata.requires-dev] +dev = [{ name = "pytest", specifier = ">=8" }] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pluggy" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/db/7fc19e6f2dc92a966727031389fc2e08b558f0f25eb7403c1119ad4713cd/pluggy-1.7.0.tar.gz", hash = "sha256:d1eaa46ebb595891b860ab086b4d09c8588af65ebd4361b8e8f4bb8920b90ba8", size = 123304, upload-time = "2026-10-15T09:50:58.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl", hash = "sha256:7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec", size = 27082, upload-time = "2026-10-15T09:50:56.808Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pyside6-essentials" +version = "6.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "shiboken6" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/90/d528f8dd3f9f20712bc719e10c698d27c998e1dd76ed3f33b6fb606d0972/pyside6_essentials-6.12.0-cp310-abi3-macosx_14_0_universal2.whl", hash = "sha256:0867b709a724db28b161227c7d6ecb5ed10cc09226a53542417ac6dee1308239", size = 116002775, upload-time = "2026-10-08T09:09:54.453Z" }, + { url = "https://files.pythonhosted.org/packages/7b/3c/7597d8dcb36aa8315427635ec6ec9d850ffbad4ce78b9118ac854889f2d3/pyside6_essentials-6.12.0-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:16f4b5e41daf49235ae048458243da9efe5f3d8040f9cc5aa454ce69893d3bd9", size = 84346433, upload-time = "2026-10-08T09:10:02.825Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4e/f4fd4c016719be832ec49d3c87940459e87fd666179a0a199a3998d07916/pyside6_essentials-6.12.0-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:08c5841063fc1df69b7fa1ee405f539e66576a83fc48004be3e2c5e35ccbfa69", size = 83810102, upload-time = "2026-10-08T09:10:09.13Z" }, + { url = "https://files.pythonhosted.org/packages/03/61/9a7e32a37b224f68506785bfb0f288d516098ec71681782d72b695a6c95d/pyside6_essentials-6.12.0-cp310-abi3-win_amd64.whl", hash = "sha256:c9a95102aa23c1f86516a30d5a9be37552d324eee7e567eb7508973f1218cb42", size = 82153795, upload-time = "2026-10-08T09:10:15.104Z" }, + { url = "https://files.pythonhosted.org/packages/92/11/43afb3d0e7c25dd09f0eb7e44f1283dadb5fa8d8b517249fe3fde02e6702/pyside6_essentials-6.12.0-cp310-abi3-win_arm64.whl", hash = "sha256:c76aa689989bf9bb9b45535e0a81c6733294df720b0eed1308fa30d2606b98cc", size = 62073456, upload-time = "2026-10-08T09:10:20.202Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "shiboken6" +version = "6.12.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/45/11536fba5f50a57671eb14441c6098096f3e57074e54c9d7d66039a5831e/shiboken6-6.12.0-cp310-abi3-macosx_14_0_universal2.whl", hash = "sha256:47105e05baf57d35453e07d240bbe59cb4b8d9565377ea5134ff9fb37d4f5c02", size = 479653, upload-time = "2026-10-08T09:10:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/49/c2/a04fa003b4360e99d8e3fc2829abacf37396ace63ea1cd616402209ec7c6/shiboken6-6.12.0-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bde565bb0890044b5c7f63808adddede5abc241e9395a2bfed61919884d6240", size = 279268, upload-time = "2026-10-08T09:10:42.982Z" }, + { url = "https://files.pythonhosted.org/packages/97/ca/a4415e6218e0dff764fe2b2d30db2fc8f499a08ace07634232ade3f73adc/shiboken6-6.12.0-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:ff72a72b3277b418902d562b987b33a6f6818bed9fe40a49d634d09bc67f620e", size = 276562, upload-time = "2026-10-08T09:10:44.25Z" }, + { url = "https://files.pythonhosted.org/packages/2a/b6/bee97e7a2edeab72aafabb46ee5adc939790a638d107860b4cad7a20e407/shiboken6-6.12.0-cp310-abi3-win_amd64.whl", hash = "sha256:a1906cb8116869178c64b6bab52623bbc8b4ceed7b30bfc3c9aa0f6e67f6438e", size = 1265476, upload-time = "2026-10-08T09:10:45.627Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d5/5894d35f8a470ca8acff0d1cd8f15b1c94cbfdfe0ce4a6ec0fcf10b95bd1/shiboken6-6.12.0-cp310-abi3-win_arm64.whl", hash = "sha256:da382e68f0815b31b6dc2bce11a465b148c4f42c37b91546a361de1576567d10", size = 1838851, upload-time = "2026-10-08T09:10:47.123Z" }, +]