{"version":3,"file":"game-BuDQdGVu.mjs","names":["playWildCard","doPlayWildCard"],"sources":["../src/game/constants.ts","../src/game/actions/createGame.ts","../src/game/lib/replenishDrawPile.ts","../src/game/lib/takeCardFromDrawPile.ts","../src/game/lib/isCardPlayable.ts","../src/game/lib/hasPlayableCard.ts","../src/game/lib/addCardToHand.ts","../src/game/lib/changeToNextPlayer.ts","../src/game/actions/drawCard.ts","../src/game/actions/getClientStateAndClearEvents.ts","../src/game/actions/joinGame.ts","../src/game/lib/changeDirection.ts","../src/game/lib/removeCardFromHand.ts","../src/game/lib/addWildCardToBottomOfDiscardPile.ts","../src/game/lib/addCardToBottomOfDiscardPile.ts","../src/game/lib/discardLeavingPlayerCards.ts","../src/game/lib/transitionGameToForfeited.ts","../src/game/actions/leaveGame.ts","../src/game/lib/addCardToDiscardPile.ts","../src/game/lib/isOutOfCards.ts","../src/game/lib/isGameWinner.ts","../src/game/lib/transitionGameToCompleted.ts","../src/game/lib/discardFirstCard.ts","../src/game/lib/dealCardToPlayer.ts","../src/game/lib/dealCardsToPlayers.ts","../src/game/lib/startRound.ts","../src/game/lib/returnDiscardPile.ts","../src/game/lib/getPointsForCard.ts","../src/game/lib/calculatePoints.ts","../src/game/lib/raiseScore.ts","../src/game/lib/returnPlayerCards.ts","../src/game/lib/takeCardsFromDrawPile.ts","../src/game/lib/drawTwoCards.ts","../src/game/lib/skipNextPlayer.ts","../src/game/lib/playDrawTwoCard.ts","../src/game/lib/playNumberCard.ts","../src/game/lib/playReverseCard.ts","../src/game/lib/playSkipCard.ts","../src/game/actions/playCard.ts","../src/game/lib/drawFourCards.ts","../src/game/lib/addWildCardToDiscardPile.ts","../src/game/lib/playWildCard.ts","../src/game/actions/playWildCard.ts","../src/game/lib/transitionGameToStarted.ts","../src/game/actions/startGame.ts","../src/game/types/Card.ts"],"sourcesContent":["import type { Card } from \"./types/Card.js\";\n\nexport const EXPIRY_EXTENSION_MS = 300000; // 5 minutes\nexport const MIN_PLAYERS = 2;\nexport const MAX_PLAYERS = 10;\nexport const INITIAL_HAND_SIZE = 7;\nexport const ACTION_CARD_VALUE = 20;\nexport const WILD_CARD_VALUE = 50;\nexport const WINNING_SCORE = 100;\n\nexport const CARDS: readonly Card[] = [\n  { color: \"red\", type: \"number\", value: 0, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"red\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"red\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"red\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"red\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"red\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"red\", type: \"skip\", id: crypto.randomUUID() },\n  { color: \"red\", type: \"skip\", id: crypto.randomUUID() },\n\n  { color: \"yellow\", type: \"number\", value: 0, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"skip\", id: crypto.randomUUID() },\n  { color: \"yellow\", type: \"skip\", id: crypto.randomUUID() },\n\n  { color: \"green\", type: \"number\", value: 0, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"green\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"green\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"green\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"green\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"green\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"green\", type: \"skip\", id: crypto.randomUUID() },\n  { color: \"green\", type: \"skip\", id: crypto.randomUUID() },\n\n  { color: \"blue\", type: \"number\", value: 0, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 1, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 2, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 3, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 4, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 5, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 6, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 7, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 8, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"number\", value: 9, id: crypto.randomUUID() },\n  { color: \"blue\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"blue\", type: \"drawTwo\", id: crypto.randomUUID() },\n  { color: \"blue\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"blue\", type: \"reverse\", id: crypto.randomUUID() },\n  { color: \"blue\", type: \"skip\", id: crypto.randomUUID() },\n  { color: \"blue\", type: \"skip\", id: crypto.randomUUID() },\n\n  { type: \"wild\", isDrawFour: false, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: false, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: false, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: false, id: crypto.randomUUID() },\n\n  { type: \"wild\", isDrawFour: true, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: true, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: true, id: crypto.randomUUID() },\n  { type: \"wild\", isDrawFour: true, id: crypto.randomUUID() },\n];\n","import { EXPIRY_EXTENSION_MS } from \"../constants.js\";\nimport { CARDS } from \"../constants.js\";\nimport type { CreatedGame } from \"../types/Game.js\";\nimport type { Player } from \"../types/Player.js\";\n\nexport function createGame(userId: string, username: string) {\n  const player: Player = {\n    id: crypto.randomUUID(),\n    userId,\n    username,\n    events: [],\n    hand: [],\n    score: 0,\n  };\n\n  const createdAt = Date.now();\n  const game: CreatedGame = {\n    id: crypto.randomUUID(),\n    createdAt,\n    expiresAt: createdAt + EXPIRY_EXTENSION_MS,\n    status: \"created\",\n    players: [player],\n    adminId: player.id,\n    drawPile: CARDS,\n    discardPile: [],\n    currentPlayerIndex: 0,\n    isReversed: false,\n    chatMessages: [],\n  };\n\n  return { game, playerId: player.id } as const;\n}\n","import { shuffle } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function replenishDrawPile(game: StartedGame): StartedGame {\n  const discardPile = [...game.discardPile];\n\n  const drawPile = discardPile\n    .splice(0, discardPile.length - 1)\n    .map((discardedCard) => {\n      if (discardedCard.type === \"discardedWild\") {\n        return discardedCard.card;\n      }\n      return discardedCard;\n    });\n\n  return {\n    ...game,\n    drawPile: shuffle(drawPile),\n    discardPile,\n  };\n}\n","import { takeLastItemFromCollection } from \"@hellacardgames/lib\";\nimport { replenishDrawPile } from \"./replenishDrawPile.js\";\nimport type { Card } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\ntype TakeCardFromDrawPileResult = {\n  readonly card: Card;\n  readonly game: StartedGame;\n};\n\nexport function takeCardFromDrawPile(\n  game: StartedGame,\n): TakeCardFromDrawPileResult {\n  if (game.drawPile.length === 0) {\n    game = replenishDrawPile(game);\n  }\n\n  const { collection: newDrawPile, item: card } = takeLastItemFromCollection(\n    game.drawPile,\n  );\n\n  game = { ...game, drawPile: newDrawPile };\n\n  return { card, game };\n}\n","import type { Card, Color, DiscardedCard } from \"../types/Card.js\";\n\nexport function isCardPlayable(\n  card: Card,\n  hand: readonly Card[],\n  discardPile: readonly DiscardedCard[],\n): boolean {\n  const lastDiscard = discardPile[discardPile.length - 1];\n  if (!lastDiscard) {\n    throw new Error(\"Discard pile is empty.\");\n  }\n  if (card.type === \"wild\") {\n    if (card.isDrawFour) {\n      if (hasCardOfColor(lastDiscard.color, hand)) {\n        return false;\n      }\n      return true;\n    } else {\n      return true;\n    }\n  }\n  if (card.color === lastDiscard.color) {\n    return true;\n  }\n  if (card.type === \"number\" && lastDiscard.type === \"number\") {\n    return card.value === lastDiscard.value;\n  }\n  return card.type === lastDiscard.type;\n}\n\nfunction hasCardOfColor(color: Color, hand: readonly Card[]): boolean {\n  return !!hand.find((c) => c.type !== \"wild\" && c.color === color);\n}\n","import { isCardPlayable } from \"./isCardPlayable.js\";\nimport type { Card, DiscardedCard } from \"../types/Card.js\";\n\nexport function hasPlayableCard(\n  hand: readonly Card[],\n  discardPile: readonly DiscardedCard[],\n): boolean {\n  for (const card of hand) {\n    if (isCardPlayable(card, hand, discardPile)) {\n      return true;\n    }\n  }\n  return false;\n}\n","import { addItemToCollection } from \"@hellacardgames/lib\";\n\ntype Player = {\n  readonly hand: readonly unknown[];\n};\n\ntype Card<TPlayer extends Player> = TPlayer[\"hand\"][number];\n\nexport function addCardToHand<TPlayer extends Player>(\n  player: TPlayer,\n  card: Card<TPlayer>,\n): TPlayer {\n  return {\n    ...player,\n    hand: addItemToCollection(player.hand, card),\n  };\n}\n","import { changeTurn, emitEvent, getCurrentPlayer } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function changeToNextPlayer(game: StartedGame): StartedGame {\n  game = changeTurn(game);\n\n  game = emitEvent(game, {\n    type: \"turnChanged\",\n    currentPlayerUsername: getCurrentPlayer(game).username,\n  });\n\n  return game;\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  isCurrentPlayer,\n  tryGetPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { EXPIRY_EXTENSION_MS } from \"../constants.js\";\nimport { takeCardFromDrawPile } from \"../lib/takeCardFromDrawPile.js\";\nimport { hasPlayableCard } from \"../lib/hasPlayableCard.js\";\nimport { isCardPlayable } from \"../lib/isCardPlayable.js\";\nimport { addCardToHand } from \"../lib/addCardToHand.js\";\nimport { changeToNextPlayer } from \"../lib/changeToNextPlayer.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport function drawCard(game: Game, playerId: string) {\n  const { player } = tryGetPlayer(game, playerId);\n  if (!player) {\n    return { success: false, error: \"playerNotFound\" } as const;\n  }\n  if (game.status !== \"started\") {\n    return { success: false, error: \"invalidStatus\" } as const;\n  }\n  if (!isCurrentPlayer(game, player.id)) {\n    return { success: false, error: \"outOfTurn\" } as const;\n  }\n  if (hasPlayableCard(player.hand, game.discardPile)) {\n    return { success: false, error: \"hasPlayableCard\" } as const;\n  }\n\n  const takeCardResult = takeCardFromDrawPile(game);\n  const isPlayable = isCardPlayable(\n    takeCardResult.card,\n    player.hand,\n    game.discardPile,\n  );\n\n  game = takeCardResult.game;\n  game = updatePlayer(game, player.id, (p) =>\n    addCardToHand(p, takeCardResult.card),\n  );\n\n  game = emitEventToPlayer(game, player.id, {\n    type: \"playerDrewCard\",\n    card: takeCardResult.card,\n  });\n  game = emitEventToOtherPlayers(game, player.id, {\n    type: \"otherPlayerDrewCard\",\n    username: player.username,\n    isPlayable,\n  });\n\n  if (!isPlayable) {\n    game = changeToNextPlayer(game);\n  }\n\n  game = { ...game, expiresAt: Date.now() + EXPIRY_EXTENSION_MS };\n  game = emitEvent(game, {\n    type: \"expirationUpdated\",\n    expiresAt: game.expiresAt,\n  });\n\n  return { success: true, game } as const;\n}\n","import {\n  getClientStateAndClearEventsFactory,\n  getCurrentPlayer,\n  getPlayer,\n} from \"@hellacardgames/lib\";\nimport type { ClientState } from \"../types/ClientState.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport const getClientStateAndClearEvents = getClientStateAndClearEventsFactory<\n  Game,\n  ClientState\n>((game, player) => ({\n  status: game.status,\n  gameId: game.id,\n  playerId: player.id,\n  player: {\n    username: player.username,\n    hand: player.hand,\n    score: player.score,\n  },\n  otherPlayers: game.players\n    .filter((p) => p.id !== player.id)\n    .map((p) => ({\n      username: p.username,\n      numCards: p.hand.length,\n      score: p.score,\n    })),\n  usernames: game.players.map((p) => p.username),\n  adminUsername: getPlayer(game, game.adminId).player.username,\n  lastDiscard: game.discardPile[game.discardPile.length - 1] ?? null,\n  currentPlayerUsername: getCurrentPlayer(game).username,\n  isReversed: game.isReversed,\n  expiresAt: game.expiresAt,\n  chatMessages: game.chatMessages,\n}));\n","import { addItemToCollection, emitEvent } from \"@hellacardgames/lib\";\nimport { MAX_PLAYERS } from \"../constants.js\";\nimport type { Game } from \"../types/Game.js\";\nimport type { Player } from \"../types/Player.js\";\n\nexport function joinGame(game: Game, userId: string, username: string) {\n  if (game.status !== \"created\") {\n    return { success: false, error: \"invalidStatus\" } as const;\n  }\n  if (game.players.length === MAX_PLAYERS) {\n    return { success: false, error: \"maxPlayersReached\" } as const;\n  }\n  if (game.players.find((p) => p.userId === userId)) {\n    return { success: false, error: \"alreadyInGame\" } as const;\n  }\n\n  const player: Player = {\n    id: crypto.randomUUID(),\n    userId,\n    username,\n    events: [],\n    hand: [],\n    score: 0,\n  };\n\n  game = emitEvent(game, { type: \"otherPlayerJoined\", username });\n  game = { ...game, players: addItemToCollection(game.players, player) };\n\n  return { success: true, game, playerId: player.id } as const;\n}\n","import { emitEvent } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function changeDirection(game: StartedGame): StartedGame {\n  const isReversed = !game.isReversed;\n\n  game = { ...game, isReversed };\n  game = emitEvent(game, { type: \"directionChanged\", isReversed });\n\n  return game;\n}\n","import { removeItemFromCollection } from \"@hellacardgames/lib\";\n\ntype Player = {\n  readonly hand: readonly unknown[];\n};\n\ntype Card<TPlayer extends Player> = TPlayer[\"hand\"][number];\n\nexport function removeCardFromHand<TPlayer extends Player>(\n  player: TPlayer,\n  card: Card<TPlayer>,\n): TPlayer {\n  return {\n    ...player,\n    hand: removeItemFromCollection(player.hand, card),\n  };\n}\n","import { prependItemToCollection } from \"@hellacardgames/lib\";\nimport type { Color, WildCard } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function addWildCardToBottomOfDiscardPile(\n  game: StartedGame,\n  card: WildCard,\n  color: Color,\n): StartedGame {\n  return {\n    ...game,\n    discardPile: prependItemToCollection(game.discardPile, {\n      type: \"discardedWild\",\n      card,\n      color,\n    }),\n  };\n}\n","import { prependItemToCollection } from \"@hellacardgames/lib\";\nimport type { Card, WildCard } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function addCardToBottomOfDiscardPile(\n  game: StartedGame,\n  card: Exclude<Card, WildCard>,\n): StartedGame {\n  return {\n    ...game,\n    discardPile: prependItemToCollection(game.discardPile, card),\n  };\n}\n","import { getPlayer, updatePlayer } from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { addWildCardToBottomOfDiscardPile } from \"./addWildCardToBottomOfDiscardPile.js\";\nimport { addCardToBottomOfDiscardPile } from \"./addCardToBottomOfDiscardPile.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function discardLeavingPlayerCards(\n  game: StartedGame,\n  playerId: string,\n): StartedGame {\n  const { player } = getPlayer(game, playerId);\n\n  const cards = player.hand.slice();\n\n  for (const card of cards) {\n    game = updatePlayer(game, player.id, (p) => removeCardFromHand(p, card));\n    game =\n      card.type === \"wild\"\n        ? addWildCardToBottomOfDiscardPile(game, card, \"red\")\n        : addCardToBottomOfDiscardPile(game, card);\n  }\n\n  return game;\n}\n","import type { ForfeitedGame, StartedGame } from \"../types/Game.js\";\n\nexport function transitionGameToForfeited(game: StartedGame): ForfeitedGame {\n  return { ...game, status: \"forfeited\" };\n}\n","import {\n  emitEvent,\n  getCurrentPlayer,\n  getPlayerOne,\n  removePlayer,\n  tryGetPlayer,\n} from \"@hellacardgames/lib\";\nimport { EXPIRY_EXTENSION_MS, MIN_PLAYERS } from \"../constants.js\";\nimport { changeDirection } from \"../lib/changeDirection.js\";\nimport { discardLeavingPlayerCards } from \"../lib/discardLeavingPlayerCards.js\";\nimport { transitionGameToForfeited } from \"../lib/transitionGameToForfeited.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport function leaveGame(game: Game, playerId: string) {\n  const { player } = tryGetPlayer(game, playerId);\n  if (!player) {\n    return { success: false, error: \"playerNotFound\" } as const;\n  }\n\n  if (game.status === \"started\") {\n    game = discardLeavingPlayerCards(game, player.id);\n  }\n\n  const removePlayerResult = removePlayer(game, player.id);\n  game = removePlayerResult.game;\n  game = emitEvent(game, {\n    type: \"otherPlayerLeft\",\n    username: player.username,\n  });\n\n  if (removePlayerResult.turnChanged) {\n    game = emitEvent(game, {\n      type: \"turnChanged\",\n      currentPlayerUsername: getCurrentPlayer(game).username,\n    });\n  }\n\n  if (game.players.length > 0 && player.id === game.adminId) {\n    const newAdmin = getPlayerOne(game);\n    game = { ...game, adminId: newAdmin.id };\n    game = emitEvent(game, {\n      type: \"adminChanged\",\n      username: newAdmin.username,\n    });\n  }\n\n  if (game.status === \"started\") {\n    if (game.players.length === 2 && game.isReversed) {\n      game = changeDirection(game);\n    }\n\n    if (game.players.length < MIN_PLAYERS) {\n      game = transitionGameToForfeited(game);\n      game = { ...game, expiresAt: Date.now() + EXPIRY_EXTENSION_MS };\n      game = emitEvent(game, { type: \"gameForfeited\" });\n      game = emitEvent(game, {\n        type: \"expirationUpdated\",\n        expiresAt: game.expiresAt,\n      });\n    }\n  }\n\n  return { success: true, game } as const;\n}\n","import { addItemToCollection } from \"@hellacardgames/lib\";\nimport type { Card, WildCard } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function addCardToDiscardPile(\n  game: StartedGame,\n  card: Exclude<Card, WildCard>,\n): StartedGame {\n  return {\n    ...game,\n    discardPile: addItemToCollection(game.discardPile, card),\n  };\n}\n","import { getPlayer } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function isOutOfCards(game: StartedGame, playerId: string): boolean {\n  const { player } = getPlayer(game, playerId);\n\n  return player.hand.length === 0;\n}\n","import { getPlayer } from \"@hellacardgames/lib\";\nimport { WINNING_SCORE } from \"../constants.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function isGameWinner(game: StartedGame, playerId: string): boolean {\n  const { player } = getPlayer(game, playerId);\n\n  return player.score >= WINNING_SCORE;\n}\n","import type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function transitionGameToCompleted(game: StartedGame): CompletedGame {\n  return { ...game, status: \"completed\" };\n}\n","import { emitEvent } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function discardFirstCard(game: StartedGame): StartedGame {\n  const drawPile = [...game.drawPile];\n\n  let firstDiscard = drawPile.pop();\n  if (!firstDiscard) {\n    throw new Error(\"Draw pile is empty.\");\n  }\n\n  const skippedCards = [];\n\n  while (firstDiscard.type !== \"number\") {\n    skippedCards.unshift(firstDiscard);\n    firstDiscard = drawPile.pop();\n    if (!firstDiscard) {\n      throw new Error(\"Draw pile has no number cards.\");\n    }\n  }\n\n  drawPile.unshift(...skippedCards);\n\n  game = { ...game, drawPile, discardPile: [firstDiscard] };\n  game = emitEvent(game, { type: \"cardDiscarded\", card: firstDiscard });\n\n  return game;\n}\n","import {\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { takeCardFromDrawPile } from \"./takeCardFromDrawPile.js\";\nimport { addCardToHand } from \"./addCardToHand.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function dealCardToPlayer(\n  game: StartedGame,\n  playerId: string,\n): StartedGame {\n  const { player } = getPlayer(game, playerId);\n\n  const takeCardResult = takeCardFromDrawPile(game);\n  game = takeCardResult.game;\n  game = updatePlayer(game, player.id, (p) =>\n    addCardToHand(p, takeCardResult.card),\n  );\n\n  game = emitEventToPlayer(game, player.id, {\n    type: \"playerCardDealt\",\n    card: takeCardResult.card,\n  });\n  game = emitEventToOtherPlayers(game, player.id, {\n    type: \"otherPlayerCardDealt\",\n    username: player.username,\n  });\n\n  return game;\n}\n","import { dealCardToPlayer } from \"./dealCardToPlayer.js\";\nimport { INITIAL_HAND_SIZE } from \"../constants.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function dealCardsToPlayers(game: StartedGame): StartedGame {\n  const playerIds = game.players.map((p) => p.id);\n\n  Array.from({ length: INITIAL_HAND_SIZE }).forEach(() => {\n    playerIds.forEach((playerId) => {\n      game = dealCardToPlayer(game, playerId);\n    });\n  });\n\n  return game;\n}\n","import { shuffle } from \"@hellacardgames/lib\";\nimport { discardFirstCard } from \"./discardFirstCard.js\";\nimport { dealCardsToPlayers } from \"./dealCardsToPlayers.js\";\nimport { changeDirection } from \"./changeDirection.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function startRound(game: StartedGame): StartedGame {\n  game = { ...game, drawPile: shuffle(game.drawPile) };\n  game = dealCardsToPlayers(game);\n  game = discardFirstCard(game);\n\n  if (game.isReversed) {\n    game = changeDirection(game);\n  }\n\n  return game;\n}\n","import { emitEvent } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function returnDiscardPile(game: StartedGame): StartedGame {\n  game = {\n    ...game,\n    drawPile: [\n      ...game.drawPile,\n      ...game.discardPile.map((discardedCard) =>\n        discardedCard.type === \"discardedWild\"\n          ? discardedCard.card\n          : discardedCard,\n      ),\n    ],\n    discardPile: [],\n  };\n\n  game = emitEvent(game, { type: \"discardPileReturned\" });\n\n  return game;\n}\n","import { ACTION_CARD_VALUE, WILD_CARD_VALUE } from \"../constants.js\";\nimport type { Card } from \"../types/Card.js\";\n\nexport function getPointsForCard(card: Card): number {\n  switch (card.type) {\n    case \"number\":\n      return card.value;\n    case \"drawTwo\":\n    case \"reverse\":\n    case \"skip\":\n      return ACTION_CARD_VALUE;\n    case \"wild\":\n      return WILD_CARD_VALUE;\n  }\n}\n","import { getPointsForCard } from \"./getPointsForCard.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function calculatePoints(game: StartedGame): number {\n  return game.players\n    .flatMap((p) => p.hand)\n    .map((card) => getPointsForCard(card))\n    .reduce(\n      (previousPoints, currentPoints) => previousPoints + currentPoints,\n      0,\n    );\n}\n","import { updatePlayer } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function raiseScore(\n  game: StartedGame,\n  playerId: string,\n  points: number,\n): StartedGame {\n  return updatePlayer(game, playerId, (p) => ({\n    ...p,\n    score: p.score + points,\n  }));\n}\n","import {\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport type { Card } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function returnPlayerCards(game: StartedGame): StartedGame {\n  for (const player of game.players) {\n    const cards = [...player.hand];\n    let cardToReturn: Card | undefined;\n    while ((cardToReturn = cards.pop())) {\n      game = { ...game, drawPile: [...game.drawPile, cardToReturn] };\n      game = emitEventToPlayer(game, player.id, {\n        type: \"playerReturnedCard\",\n        cardId: cardToReturn.id,\n      });\n      game = emitEventToOtherPlayers(game, player.id, {\n        type: \"otherPlayerReturnedCard\",\n        username: player.username,\n      });\n    }\n    game = updatePlayer(game, player.id, (p) => ({ ...p, hand: cards }));\n  }\n\n  return game;\n}\n","import { takeCardFromDrawPile } from \"./takeCardFromDrawPile.js\";\nimport type { Card } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\ntype TakeCardsFromDrawPileResult = {\n  readonly cards: readonly Card[];\n  readonly game: StartedGame;\n};\n\nexport function takeCardsFromDrawPile(\n  game: StartedGame,\n  count: number,\n): TakeCardsFromDrawPileResult {\n  const cards: Card[] = [];\n\n  for (let i = 0; i < count; i++) {\n    const result = takeCardFromDrawPile(game);\n    game = result.game;\n    cards.push(result.card);\n  }\n\n  return { cards, game };\n}\n","import {\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { takeCardsFromDrawPile } from \"./takeCardsFromDrawPile.js\";\nimport { addCardToHand } from \"./addCardToHand.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function drawTwoCards(game: StartedGame, playerId: string): StartedGame {\n  const { player } = getPlayer(game, playerId);\n\n  const takeCardsResult = takeCardsFromDrawPile(game, 2);\n  game = takeCardsResult.game;\n\n  takeCardsResult.cards.forEach((card) => {\n    game = updatePlayer(game, player.id, (p) => addCardToHand(p, card));\n  });\n\n  game = emitEventToPlayer(game, player.id, {\n    type: \"playerDrewTwoCards\",\n    cards: takeCardsResult.cards,\n  });\n  game = emitEventToOtherPlayers(game, player.id, {\n    type: \"otherPlayerDrewTwoCards\",\n    username: player.username,\n  });\n\n  return game;\n}\n","import { changeTurn, emitEvent, getCurrentPlayer } from \"@hellacardgames/lib\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function skipNextPlayer(game: StartedGame): StartedGame {\n  game = changeTurn(game);\n  game = changeTurn(game);\n\n  game = emitEvent(game, {\n    type: \"turnChanged\",\n    currentPlayerUsername: getCurrentPlayer(game).username,\n  });\n\n  return game;\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getCurrentPlayer,\n  getNextPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { addCardToDiscardPile } from \"./addCardToDiscardPile.js\";\nimport { isOutOfCards } from \"./isOutOfCards.js\";\nimport { isGameWinner } from \"./isGameWinner.js\";\nimport { transitionGameToCompleted } from \"./transitionGameToCompleted.js\";\nimport { startRound } from \"./startRound.js\";\nimport { returnDiscardPile } from \"./returnDiscardPile.js\";\nimport { calculatePoints } from \"./calculatePoints.js\";\nimport { raiseScore } from \"./raiseScore.js\";\nimport { returnPlayerCards } from \"./returnPlayerCards.js\";\nimport { drawTwoCards } from \"./drawTwoCards.js\";\nimport { skipNextPlayer } from \"./skipNextPlayer.js\";\nimport type { DrawTwoCard } from \"../types/Card.js\";\nimport type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function playDrawTwoCard(\n  game: StartedGame,\n  card: DrawTwoCard,\n): StartedGame | CompletedGame {\n  const currentPlayer = getCurrentPlayer(game);\n\n  game = updatePlayer(game, currentPlayer.id, (p) =>\n    removeCardFromHand(p, card),\n  );\n  game = addCardToDiscardPile(game, card);\n\n  game = emitEventToPlayer(game, currentPlayer.id, {\n    type: \"playerPlayedCard\",\n    card,\n  });\n  game = emitEventToOtherPlayers(game, currentPlayer.id, {\n    type: \"otherPlayerPlayedCard\",\n    username: currentPlayer.username,\n    card,\n  });\n\n  const targetPlayer = getNextPlayer(game);\n  game = drawTwoCards(game, targetPlayer.id);\n\n  if (isOutOfCards(game, currentPlayer.id)) {\n    game = raiseScore(game, currentPlayer.id, calculatePoints(game));\n    game = returnPlayerCards(game);\n    game = returnDiscardPile(game);\n\n    const updatedCurrentPlayer = getCurrentPlayer(game);\n\n    if (isGameWinner(game, currentPlayer.id)) {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonGame\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonGame\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEvent(game, { type: \"gameCompleted\" });\n      return transitionGameToCompleted(game);\n    } else {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonRound\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonRound\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = startRound(game);\n    }\n  } else {\n    if (game.players.length > 2) {\n      game = skipNextPlayer(game);\n    }\n  }\n\n  return game;\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getCurrentPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { addCardToDiscardPile } from \"./addCardToDiscardPile.js\";\nimport { isOutOfCards } from \"./isOutOfCards.js\";\nimport { isGameWinner } from \"./isGameWinner.js\";\nimport { transitionGameToCompleted } from \"./transitionGameToCompleted.js\";\nimport { startRound } from \"./startRound.js\";\nimport { returnDiscardPile } from \"./returnDiscardPile.js\";\nimport { calculatePoints } from \"./calculatePoints.js\";\nimport { raiseScore } from \"./raiseScore.js\";\nimport { returnPlayerCards } from \"./returnPlayerCards.js\";\nimport { changeToNextPlayer } from \"./changeToNextPlayer.js\";\nimport type { NumberCard } from \"../types/Card.js\";\nimport type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function playNumberCard(\n  game: StartedGame,\n  card: NumberCard,\n): StartedGame | CompletedGame {\n  const currentPlayer = getCurrentPlayer(game);\n\n  game = updatePlayer(game, currentPlayer.id, (p) =>\n    removeCardFromHand(p, card),\n  );\n  game = addCardToDiscardPile(game, card);\n\n  game = emitEventToPlayer(game, currentPlayer.id, {\n    type: \"playerPlayedCard\",\n    card,\n  });\n  game = emitEventToOtherPlayers(game, currentPlayer.id, {\n    type: \"otherPlayerPlayedCard\",\n    username: currentPlayer.username,\n    card,\n  });\n\n  if (isOutOfCards(game, currentPlayer.id)) {\n    game = raiseScore(game, currentPlayer.id, calculatePoints(game));\n    game = returnPlayerCards(game);\n    game = returnDiscardPile(game);\n\n    const updatedCurrentPlayer = getCurrentPlayer(game);\n\n    if (isGameWinner(game, currentPlayer.id)) {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonGame\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonGame\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEvent(game, { type: \"gameCompleted\" });\n      return transitionGameToCompleted(game);\n    } else {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonRound\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonRound\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = startRound(game);\n    }\n  } else {\n    game = changeToNextPlayer(game);\n  }\n\n  return game;\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getCurrentPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { addCardToDiscardPile } from \"./addCardToDiscardPile.js\";\nimport { isOutOfCards } from \"./isOutOfCards.js\";\nimport { isGameWinner } from \"./isGameWinner.js\";\nimport { transitionGameToCompleted } from \"./transitionGameToCompleted.js\";\nimport { startRound } from \"./startRound.js\";\nimport { returnDiscardPile } from \"./returnDiscardPile.js\";\nimport { calculatePoints } from \"./calculatePoints.js\";\nimport { raiseScore } from \"./raiseScore.js\";\nimport { returnPlayerCards } from \"./returnPlayerCards.js\";\nimport { changeToNextPlayer } from \"./changeToNextPlayer.js\";\nimport { changeDirection } from \"./changeDirection.js\";\nimport type { ReverseCard } from \"../types/Card.js\";\nimport type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function playReverseCard(\n  game: StartedGame,\n  card: ReverseCard,\n): StartedGame | CompletedGame {\n  const currentPlayer = getCurrentPlayer(game);\n\n  game = updatePlayer(game, currentPlayer.id, (p) =>\n    removeCardFromHand(p, card),\n  );\n  game = addCardToDiscardPile(game, card);\n\n  game = emitEventToPlayer(game, currentPlayer.id, {\n    type: \"playerPlayedCard\",\n    card,\n  });\n  game = emitEventToOtherPlayers(game, currentPlayer.id, {\n    type: \"otherPlayerPlayedCard\",\n    username: currentPlayer.username,\n    card,\n  });\n\n  if (isOutOfCards(game, currentPlayer.id)) {\n    game = raiseScore(game, currentPlayer.id, calculatePoints(game));\n    game = returnPlayerCards(game);\n    game = returnDiscardPile(game);\n\n    const updatedCurrentPlayer = getCurrentPlayer(game);\n\n    if (isGameWinner(game, currentPlayer.id)) {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonGame\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonGame\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEvent(game, { type: \"gameCompleted\" });\n      return transitionGameToCompleted(game);\n    } else {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonRound\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonRound\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = startRound(game);\n    }\n  } else {\n    if (game.players.length > 2) {\n      game = changeDirection(game);\n      game = changeToNextPlayer(game);\n    }\n  }\n\n  return game;\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getCurrentPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { addCardToDiscardPile } from \"./addCardToDiscardPile.js\";\nimport { isOutOfCards } from \"./isOutOfCards.js\";\nimport { isGameWinner } from \"./isGameWinner.js\";\nimport { transitionGameToCompleted } from \"./transitionGameToCompleted.js\";\nimport { startRound } from \"./startRound.js\";\nimport { returnDiscardPile } from \"./returnDiscardPile.js\";\nimport { calculatePoints } from \"./calculatePoints.js\";\nimport { raiseScore } from \"./raiseScore.js\";\nimport { returnPlayerCards } from \"./returnPlayerCards.js\";\nimport { skipNextPlayer } from \"./skipNextPlayer.js\";\nimport type { SkipCard } from \"../types/Card.js\";\nimport type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function playSkipCard(\n  game: StartedGame,\n  card: SkipCard,\n): StartedGame | CompletedGame {\n  const currentPlayer = getCurrentPlayer(game);\n\n  game = updatePlayer(game, currentPlayer.id, (p) =>\n    removeCardFromHand(p, card),\n  );\n  game = addCardToDiscardPile(game, card);\n\n  game = emitEventToPlayer(game, currentPlayer.id, {\n    type: \"playerPlayedCard\",\n    card,\n  });\n  game = emitEventToOtherPlayers(game, currentPlayer.id, {\n    type: \"otherPlayerPlayedCard\",\n    username: currentPlayer.username,\n    card,\n  });\n\n  if (isOutOfCards(game, currentPlayer.id)) {\n    game = raiseScore(game, currentPlayer.id, calculatePoints(game));\n    game = returnPlayerCards(game);\n    game = returnDiscardPile(game);\n\n    const updatedCurrentPlayer = getCurrentPlayer(game);\n\n    if (isGameWinner(game, currentPlayer.id)) {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonGame\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonGame\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEvent(game, { type: \"gameCompleted\" });\n      return transitionGameToCompleted(game);\n    } else {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonRound\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonRound\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = startRound(game);\n    }\n  } else {\n    if (game.players.length > 2) {\n      game = skipNextPlayer(game);\n    }\n  }\n\n  return game;\n}\n","import { emitEvent, isCurrentPlayer, tryGetPlayer } from \"@hellacardgames/lib\";\nimport { EXPIRY_EXTENSION_MS } from \"../constants.js\";\nimport { isCardPlayable } from \"../lib/isCardPlayable.js\";\nimport { playDrawTwoCard } from \"../lib/playDrawTwoCard.js\";\nimport { playNumberCard } from \"../lib/playNumberCard.js\";\nimport { playReverseCard } from \"../lib/playReverseCard.js\";\nimport { playSkipCard } from \"../lib/playSkipCard.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport function playCard(game: Game, playerId: string, cardId: string) {\n  const { player } = tryGetPlayer(game, playerId);\n  if (!player) {\n    return { success: false, error: \"playerNotFound\" } as const;\n  }\n  if (game.status !== \"started\") {\n    return { success: false, error: \"invalidStatus\" } as const;\n  }\n  if (!isCurrentPlayer(game, player.id)) {\n    return { success: false, error: \"outOfTurn\" } as const;\n  }\n  const card = player.hand.find((c) => c.id === cardId);\n  if (!card) {\n    return { success: false, error: \"cardNotFound\" } as const;\n  }\n  if (card.type === \"wild\") {\n    return { success: false, error: \"cardIsWild\" } as const;\n  }\n  if (!isCardPlayable(card, player.hand, game.discardPile)) {\n    return { success: false, error: \"cardNotPlayable\" } as const;\n  }\n\n  game = { ...game, expiresAt: Date.now() + EXPIRY_EXTENSION_MS };\n  game = emitEvent(game, {\n    type: \"expirationUpdated\",\n    expiresAt: game.expiresAt,\n  });\n\n  switch (card.type) {\n    case \"drawTwo\":\n      return { success: true, game: playDrawTwoCard(game, card) } as const;\n    case \"number\":\n      return { success: true, game: playNumberCard(game, card) } as const;\n    case \"reverse\":\n      return { success: true, game: playReverseCard(game, card) } as const;\n    case \"skip\":\n      return { success: true, game: playSkipCard(game, card) } as const;\n  }\n}\n","import {\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { takeCardsFromDrawPile } from \"./takeCardsFromDrawPile.js\";\nimport { addCardToHand } from \"./addCardToHand.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function drawFourCards(\n  game: StartedGame,\n  playerId: string,\n): StartedGame {\n  const { player } = getPlayer(game, playerId);\n\n  const takeCardsResult = takeCardsFromDrawPile(game, 4);\n  game = takeCardsResult.game;\n\n  takeCardsResult.cards.forEach((card) => {\n    game = updatePlayer(game, player.id, (p) => addCardToHand(p, card));\n  });\n\n  game = emitEventToPlayer(game, player.id, {\n    type: \"playerDrewFourCards\",\n    cards: takeCardsResult.cards,\n  });\n  game = emitEventToOtherPlayers(game, player.id, {\n    type: \"otherPlayerDrewFourCards\",\n    username: player.username,\n  });\n\n  return game;\n}\n","import { addItemToCollection } from \"@hellacardgames/lib\";\nimport type { Color, WildCard } from \"../types/Card.js\";\nimport type { StartedGame } from \"../types/Game.js\";\n\nexport function addWildCardToDiscardPile(\n  game: StartedGame,\n  card: WildCard,\n  color: Color,\n): StartedGame {\n  return {\n    ...game,\n    discardPile: addItemToCollection(game.discardPile, {\n      type: \"discardedWild\",\n      card,\n      color,\n    }),\n  };\n}\n","import {\n  emitEvent,\n  emitEventToOtherPlayers,\n  emitEventToPlayer,\n  getCurrentPlayer,\n  getNextPlayer,\n  updatePlayer,\n} from \"@hellacardgames/lib\";\nimport { removeCardFromHand } from \"./removeCardFromHand.js\";\nimport { isOutOfCards } from \"./isOutOfCards.js\";\nimport { isGameWinner } from \"./isGameWinner.js\";\nimport { transitionGameToCompleted } from \"./transitionGameToCompleted.js\";\nimport { startRound } from \"./startRound.js\";\nimport { returnDiscardPile } from \"./returnDiscardPile.js\";\nimport { calculatePoints } from \"./calculatePoints.js\";\nimport { raiseScore } from \"./raiseScore.js\";\nimport { returnPlayerCards } from \"./returnPlayerCards.js\";\nimport { drawFourCards } from \"./drawFourCards.js\";\nimport { addWildCardToDiscardPile } from \"./addWildCardToDiscardPile.js\";\nimport { changeToNextPlayer } from \"./changeToNextPlayer.js\";\nimport { skipNextPlayer } from \"./skipNextPlayer.js\";\nimport type { Color, WildCard } from \"../types/Card.js\";\nimport type { CompletedGame, StartedGame } from \"../types/Game.js\";\n\nexport function playWildCard(\n  game: StartedGame,\n  card: WildCard,\n  color: Color,\n): StartedGame | CompletedGame {\n  const currentPlayer = getCurrentPlayer(game);\n\n  game = updatePlayer(game, currentPlayer.id, (p) =>\n    removeCardFromHand(p, card),\n  );\n  game = addWildCardToDiscardPile(game, card, color);\n\n  game = emitEventToPlayer(game, currentPlayer.id, {\n    type: \"playerPlayedCard\",\n    card: { type: \"discardedWild\", card, color },\n  });\n  game = emitEventToOtherPlayers(game, currentPlayer.id, {\n    type: \"otherPlayerPlayedCard\",\n    username: currentPlayer.username,\n    card: { type: \"discardedWild\", card, color },\n  });\n\n  if (card.isDrawFour) {\n    const targetPlayer = getNextPlayer(game);\n    game = drawFourCards(game, targetPlayer.id);\n  }\n\n  if (isOutOfCards(game, currentPlayer.id)) {\n    game = raiseScore(game, currentPlayer.id, calculatePoints(game));\n    game = returnPlayerCards(game);\n    game = returnDiscardPile(game);\n\n    const updatedCurrentPlayer = getCurrentPlayer(game);\n\n    if (isGameWinner(game, currentPlayer.id)) {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonGame\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonGame\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEvent(game, { type: \"gameCompleted\" });\n      return transitionGameToCompleted(game);\n    } else {\n      game = emitEventToPlayer(game, updatedCurrentPlayer.id, {\n        type: \"playerWonRound\",\n        score: updatedCurrentPlayer.score,\n      });\n      game = emitEventToOtherPlayers(game, updatedCurrentPlayer.id, {\n        type: \"otherPlayerWonRound\",\n        username: updatedCurrentPlayer.username,\n        score: updatedCurrentPlayer.score,\n      });\n      game = startRound(game);\n    }\n  } else {\n    if (card.isDrawFour) {\n      if (game.players.length > 2) {\n        game = skipNextPlayer(game);\n      }\n    } else {\n      game = changeToNextPlayer(game);\n    }\n  }\n\n  return game;\n}\n","import { emitEvent, isCurrentPlayer, tryGetPlayer } from \"@hellacardgames/lib\";\nimport { EXPIRY_EXTENSION_MS } from \"../constants.js\";\nimport { isCardPlayable } from \"../lib/isCardPlayable.js\";\nimport { playWildCard as doPlayWildCard } from \"../lib/playWildCard.js\";\nimport type { Color } from \"../types/Card.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport function playWildCard(\n  game: Game,\n  playerId: string,\n  cardId: string,\n  color: Color,\n) {\n  const { player } = tryGetPlayer(game, playerId);\n  if (!player) {\n    return { success: false, error: \"playerNotFound\" } as const;\n  }\n  if (game.status !== \"started\") {\n    return { success: false, error: \"invalidStatus\" } as const;\n  }\n  if (!isCurrentPlayer(game, player.id)) {\n    return { success: false, error: \"outOfTurn\" } as const;\n  }\n  const card = player.hand.find((c) => c.id === cardId);\n  if (!card) {\n    return { success: false, error: \"cardNotFound\" } as const;\n  }\n  if (card.type !== \"wild\") {\n    return { success: false, error: \"cardNotWild\" } as const;\n  }\n  if (!isCardPlayable(card, player.hand, game.discardPile)) {\n    return { success: false, error: \"cardNotPlayable\" } as const;\n  }\n\n  game = { ...game, expiresAt: Date.now() + EXPIRY_EXTENSION_MS };\n  game = emitEvent(game, {\n    type: \"expirationUpdated\",\n    expiresAt: game.expiresAt,\n  });\n\n  return {\n    success: true,\n    game: doPlayWildCard(game, card, color),\n  } as const;\n}\n","import type { CreatedGame, StartedGame } from \"../types/Game.js\";\n\nexport function transitionGameToStarted(game: CreatedGame): StartedGame {\n  return { ...game, status: \"started\" };\n}\n","import { emitEvent, tryGetPlayer } from \"@hellacardgames/lib\";\nimport { EXPIRY_EXTENSION_MS, MIN_PLAYERS } from \"../constants.js\";\nimport { startRound } from \"../lib/startRound.js\";\nimport { transitionGameToStarted } from \"../lib/transitionGameToStarted.js\";\nimport type { Game } from \"../types/Game.js\";\n\nexport function startGame(game: Game, playerId: string) {\n  const { player } = tryGetPlayer(game, playerId);\n  if (!player) {\n    return { success: false, error: \"playerNotFound\" } as const;\n  }\n  if (player.id !== game.adminId) {\n    return { success: false, error: \"playerNotAdmin\" } as const;\n  }\n  if (game.status !== \"created\") {\n    return { success: false, error: \"invalidStatus\" } as const;\n  }\n  if (game.players.length < MIN_PLAYERS) {\n    return { success: false, error: \"minPlayersNotReached\" } as const;\n  }\n\n  game = transitionGameToStarted(game);\n  game = emitEvent(game, { type: \"gameStarted\" });\n\n  game = startRound(game);\n\n  game = { ...game, expiresAt: Date.now() + EXPIRY_EXTENSION_MS };\n  game = emitEvent(game, {\n    type: \"expirationUpdated\",\n    expiresAt: game.expiresAt,\n  });\n\n  return { success: true, game } as const;\n}\n","export type Card = NumberCard | DrawTwoCard | ReverseCard | SkipCard | WildCard;\n\nexport type NumberCard = {\n  readonly id: string;\n  readonly type: \"number\";\n  readonly color: Color;\n  readonly value: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n};\n\nexport type DrawTwoCard = {\n  readonly id: string;\n  readonly type: \"drawTwo\";\n  readonly color: Color;\n};\n\nexport type ReverseCard = {\n  readonly id: string;\n  readonly type: \"reverse\";\n  readonly color: Color;\n};\n\nexport type SkipCard = {\n  readonly id: string;\n  readonly type: \"skip\";\n  readonly color: Color;\n};\n\nexport type WildCard = {\n  readonly id: string;\n  readonly type: \"wild\";\n  readonly isDrawFour: boolean;\n};\n\nexport type DiscardedCard =\n  NumberCard | DrawTwoCard | ReverseCard | SkipCard | DiscardedWildCard;\n\ntype DiscardedWildCard = {\n  readonly type: \"discardedWild\";\n  readonly card: WildCard;\n  readonly color: Color;\n};\n\nexport type Color = (typeof COLORS)[number];\n\nexport const COLORS = [\"blue\", \"green\", \"red\", \"yellow\"] as const;\n"],"mappings":";;AAEA,MAAa,sBAAsB;AAEnC,MAAa,cAAc;AAM3B,MAAa,QAAyB;CACpC;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CAClE;EAAE,OAAO;EAAO,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CACzD;EAAE,OAAO;EAAO,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CACzD;EAAE,OAAO;EAAO,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CACzD;EAAE,OAAO;EAAO,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CACzD;EAAE,OAAO;EAAO,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CACtD;EAAE,OAAO;EAAO,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CAEtD;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACrE;EAAE,OAAO;EAAU,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC5D;EAAE,OAAO;EAAU,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC5D;EAAE,OAAO;EAAU,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC5D;EAAE,OAAO;EAAU,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC5D;EAAE,OAAO;EAAU,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CACzD;EAAE,OAAO;EAAU,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CAEzD;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACpE;EAAE,OAAO;EAAS,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,OAAO;EAAS,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,OAAO;EAAS,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,OAAO;EAAS,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,OAAO;EAAS,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CACxD;EAAE,OAAO;EAAS,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CAExD;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAU,OAAO;EAAG,IAAI,OAAO,WAAW;CAAE;CACnE;EAAE,OAAO;EAAQ,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,OAAO;EAAQ,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,OAAO;EAAQ,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,OAAO;EAAQ,MAAM;EAAW,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,OAAO;EAAQ,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CACvD;EAAE,OAAO;EAAQ,MAAM;EAAQ,IAAI,OAAO,WAAW;CAAE;CAEvD;EAAE,MAAM;EAAQ,YAAY;EAAO,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,MAAM;EAAQ,YAAY;EAAO,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,MAAM;EAAQ,YAAY;EAAO,IAAI,OAAO,WAAW;CAAE;CAC3D;EAAE,MAAM;EAAQ,YAAY;EAAO,IAAI,OAAO,WAAW;CAAE;CAE3D;EAAE,MAAM;EAAQ,YAAY;EAAM,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,MAAM;EAAQ,YAAY;EAAM,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,MAAM;EAAQ,YAAY;EAAM,IAAI,OAAO,WAAW;CAAE;CAC1D;EAAE,MAAM;EAAQ,YAAY;EAAM,IAAI,OAAO,WAAW;CAAE;AAC5D;;;ACvHA,SAAgB,WAAW,QAAgB,UAAkB;CAC3D,MAAM,SAAiB;EACrB,IAAI,OAAO,WAAW;EACtB;EACA;EACA,QAAQ,CAAC;EACT,MAAM,CAAC;EACP,OAAO;CACT;CAEA,MAAM,YAAY,KAAK,IAAI;CAe3B,OAAO;EAAE,MAAA;GAbP,IAAI,OAAO,WAAW;GACtB;GACA,WAAW,YAAY;GACvB,QAAQ;GACR,SAAS,CAAC,MAAM;GAChB,SAAS,OAAO;GAChB,UAAU;GACV,aAAa,CAAC;GACd,oBAAoB;GACpB,YAAY;GACZ,cAAc,CAAC;EAGL;EAAG,UAAU,OAAO;CAAG;AACrC;;;AC5BA,SAAgB,kBAAkB,MAAgC;CAChE,MAAM,cAAc,CAAC,GAAG,KAAK,WAAW;CAExC,MAAM,WAAW,YACd,OAAO,GAAG,YAAY,SAAS,CAAC,CAAC,CACjC,KAAK,kBAAkB;EACtB,IAAI,cAAc,SAAS,iBACzB,OAAO,cAAc;EAEvB,OAAO;CACT,CAAC;CAEH,OAAO;EACL,GAAG;EACH,UAAU,QAAQ,QAAQ;EAC1B;CACF;AACF;;;ACVA,SAAgB,qBACd,MAC4B;CAC5B,IAAI,KAAK,SAAS,WAAW,GAC3B,OAAO,kBAAkB,IAAI;CAG/B,MAAM,EAAE,YAAY,aAAa,MAAM,SAAS,2BAC9C,KAAK,QACP;CAEA,OAAO;EAAE,GAAG;EAAM,UAAU;CAAY;CAExC,OAAO;EAAE;EAAM;CAAK;AACtB;;;ACtBA,SAAgB,eACd,MACA,MACA,aACS;CACT,MAAM,cAAc,YAAY,YAAY,SAAS;CACrD,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,wBAAwB;CAE1C,IAAI,KAAK,SAAS,QAAQ;EACxB,IAAI,KAAK,YAAY;GACnB,IAAI,eAAe,YAAY,OAAO,IAAI,GACxC,OAAO;GAET,OAAO;EACT,OACE,OAAO;CAEX;CACA,IAAI,KAAK,UAAU,YAAY,OAC7B,OAAO;CAET,IAAI,KAAK,SAAS,YAAY,YAAY,SAAS,UACjD,OAAO,KAAK,UAAU,YAAY;CAEpC,OAAO,KAAK,SAAS,YAAY;AACnC;AAEA,SAAS,eAAe,OAAc,MAAgC;CACpE,OAAO,CAAC,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE,UAAU,KAAK;AAClE;;;AC7BA,SAAgB,gBACd,MACA,aACS;CACT,KAAK,MAAM,QAAQ,MACjB,IAAI,eAAe,MAAM,MAAM,WAAW,GACxC,OAAO;CAGX,OAAO;AACT;;;ACLA,SAAgB,cACd,QACA,MACS;CACT,OAAO;EACL,GAAG;EACH,MAAM,oBAAoB,OAAO,MAAM,IAAI;CAC7C;AACF;;;ACbA,SAAgB,mBAAmB,MAAgC;CACjE,OAAO,WAAW,IAAI;CAEtB,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,uBAAuB,iBAAiB,IAAI,CAAC,CAAC;CAChD,CAAC;CAED,OAAO;AACT;;;ACIA,SAAgB,SAAS,MAAY,UAAkB;CACrD,MAAM,EAAE,WAAW,aAAa,MAAM,QAAQ;CAC9C,IAAI,CAAC,QACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAEnD,IAAI,KAAK,WAAW,WAClB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAElD,IAAI,CAAC,gBAAgB,MAAM,OAAO,EAAE,GAClC,OAAO;EAAE,SAAS;EAAO,OAAO;CAAY;CAE9C,IAAI,gBAAgB,OAAO,MAAM,KAAK,WAAW,GAC/C,OAAO;EAAE,SAAS;EAAO,OAAO;CAAkB;CAGpD,MAAM,iBAAiB,qBAAqB,IAAI;CAChD,MAAM,aAAa,eACjB,eAAe,MACf,OAAO,MACP,KAAK,WACP;CAEA,OAAO,eAAe;CACtB,OAAO,aAAa,MAAM,OAAO,KAAK,MACpC,cAAc,GAAG,eAAe,IAAI,CACtC;CAEA,OAAO,kBAAkB,MAAM,OAAO,IAAI;EACxC,MAAM;EACN,MAAM,eAAe;CACvB,CAAC;CACD,OAAO,wBAAwB,MAAM,OAAO,IAAI;EAC9C,MAAM;EACN,UAAU,OAAO;EACjB;CACF,CAAC;CAED,IAAI,CAAC,YACH,OAAO,mBAAmB,IAAI;CAGhC,OAAO;EAAE,GAAG;EAAM,WAAW,KAAK,IAAI,IAAI;CAAoB;CAC9D,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,WAAW,KAAK;CAClB,CAAC;CAED,OAAO;EAAE,SAAS;EAAM;CAAK;AAC/B;;;ACxDA,MAAa,+BAA+B,qCAGzC,MAAM,YAAY;CACnB,QAAQ,KAAK;CACb,QAAQ,KAAK;CACb,UAAU,OAAO;CACjB,QAAQ;EACN,UAAU,OAAO;EACjB,MAAM,OAAO;EACb,OAAO,OAAO;CAChB;CACA,cAAc,KAAK,QAChB,QAAQ,MAAM,EAAE,OAAO,OAAO,EAAE,CAAC,CACjC,KAAK,OAAO;EACX,UAAU,EAAE;EACZ,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE;CACX,EAAE;CACJ,WAAW,KAAK,QAAQ,KAAK,MAAM,EAAE,QAAQ;CAC7C,eAAe,UAAU,MAAM,KAAK,OAAO,CAAC,CAAC,OAAO;CACpD,aAAa,KAAK,YAAY,KAAK,YAAY,SAAS,MAAM;CAC9D,uBAAuB,iBAAiB,IAAI,CAAC,CAAC;CAC9C,YAAY,KAAK;CACjB,WAAW,KAAK;CAChB,cAAc,KAAK;AACrB,EAAE;;;AC7BF,SAAgB,SAAS,MAAY,QAAgB,UAAkB;CACrE,IAAI,KAAK,WAAW,WAClB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAElD,IAAI,KAAK,QAAQ,WAAA,IACf,OAAO;EAAE,SAAS;EAAO,OAAO;CAAoB;CAEtD,IAAI,KAAK,QAAQ,MAAM,MAAM,EAAE,WAAW,MAAM,GAC9C,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAGlD,MAAM,SAAiB;EACrB,IAAI,OAAO,WAAW;EACtB;EACA;EACA,QAAQ,CAAC;EACT,MAAM,CAAC;EACP,OAAO;CACT;CAEA,OAAO,UAAU,MAAM;EAAE,MAAM;EAAqB;CAAS,CAAC;CAC9D,OAAO;EAAE,GAAG;EAAM,SAAS,oBAAoB,KAAK,SAAS,MAAM;CAAE;CAErE,OAAO;EAAE,SAAS;EAAM;EAAM,UAAU,OAAO;CAAG;AACpD;;;AC1BA,SAAgB,gBAAgB,MAAgC;CAC9D,MAAM,aAAa,CAAC,KAAK;CAEzB,OAAO;EAAE,GAAG;EAAM;CAAW;CAC7B,OAAO,UAAU,MAAM;EAAE,MAAM;EAAoB;CAAW,CAAC;CAE/D,OAAO;AACT;;;ACFA,SAAgB,mBACd,QACA,MACS;CACT,OAAO;EACL,GAAG;EACH,MAAM,yBAAyB,OAAO,MAAM,IAAI;CAClD;AACF;;;ACZA,SAAgB,iCACd,MACA,MACA,OACa;CACb,OAAO;EACL,GAAG;EACH,aAAa,wBAAwB,KAAK,aAAa;GACrD,MAAM;GACN;GACA;EACF,CAAC;CACH;AACF;;;ACbA,SAAgB,6BACd,MACA,MACa;CACb,OAAO;EACL,GAAG;EACH,aAAa,wBAAwB,KAAK,aAAa,IAAI;CAC7D;AACF;;;ACNA,SAAgB,0BACd,MACA,UACa;CACb,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,MAAM,QAAQ,OAAO,KAAK,MAAM;CAEhC,KAAK,MAAM,QAAQ,OAAO;EACxB,OAAO,aAAa,MAAM,OAAO,KAAK,MAAM,mBAAmB,GAAG,IAAI,CAAC;EACvE,OACE,KAAK,SAAS,SACV,iCAAiC,MAAM,MAAM,KAAK,IAClD,6BAA6B,MAAM,IAAI;CAC/C;CAEA,OAAO;AACT;;;ACrBA,SAAgB,0BAA0B,MAAkC;CAC1E,OAAO;EAAE,GAAG;EAAM,QAAQ;CAAY;AACxC;;;ACSA,SAAgB,UAAU,MAAY,UAAkB;CACtD,MAAM,EAAE,WAAW,aAAa,MAAM,QAAQ;CAC9C,IAAI,CAAC,QACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAGnD,IAAI,KAAK,WAAW,WAClB,OAAO,0BAA0B,MAAM,OAAO,EAAE;CAGlD,MAAM,qBAAqB,aAAa,MAAM,OAAO,EAAE;CACvD,OAAO,mBAAmB;CAC1B,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,UAAU,OAAO;CACnB,CAAC;CAED,IAAI,mBAAmB,aACrB,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,uBAAuB,iBAAiB,IAAI,CAAC,CAAC;CAChD,CAAC;CAGH,IAAI,KAAK,QAAQ,SAAS,KAAK,OAAO,OAAO,KAAK,SAAS;EACzD,MAAM,WAAW,aAAa,IAAI;EAClC,OAAO;GAAE,GAAG;GAAM,SAAS,SAAS;EAAG;EACvC,OAAO,UAAU,MAAM;GACrB,MAAM;GACN,UAAU,SAAS;EACrB,CAAC;CACH;CAEA,IAAI,KAAK,WAAW,WAAW;EAC7B,IAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,YACpC,OAAO,gBAAgB,IAAI;EAG7B,IAAI,KAAK,QAAQ,SAAA,GAAsB;GACrC,OAAO,0BAA0B,IAAI;GACrC,OAAO;IAAE,GAAG;IAAM,WAAW,KAAK,IAAI,IAAI;GAAoB;GAC9D,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,UAAU,MAAM;IACrB,MAAM;IACN,WAAW,KAAK;GAClB,CAAC;EACH;CACF;CAEA,OAAO;EAAE,SAAS;EAAM;CAAK;AAC/B;;;AC3DA,SAAgB,qBACd,MACA,MACa;CACb,OAAO;EACL,GAAG;EACH,aAAa,oBAAoB,KAAK,aAAa,IAAI;CACzD;AACF;;;ACTA,SAAgB,aAAa,MAAmB,UAA2B;CACzE,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,OAAO,OAAO,KAAK,WAAW;AAChC;;;ACHA,SAAgB,aAAa,MAAmB,UAA2B;CACzE,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,OAAO,OAAO,SAAA;AAChB;;;ACNA,SAAgB,0BAA0B,MAAkC;CAC1E,OAAO;EAAE,GAAG;EAAM,QAAQ;CAAY;AACxC;;;ACDA,SAAgB,iBAAiB,MAAgC;CAC/D,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;CAElC,IAAI,eAAe,SAAS,IAAI;CAChC,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,qBAAqB;CAGvC,MAAM,eAAe,CAAC;CAEtB,OAAO,aAAa,SAAS,UAAU;EACrC,aAAa,QAAQ,YAAY;EACjC,eAAe,SAAS,IAAI;EAC5B,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,gCAAgC;CAEpD;CAEA,SAAS,QAAQ,GAAG,YAAY;CAEhC,OAAO;EAAE,GAAG;EAAM;EAAU,aAAa,CAAC,YAAY;CAAE;CACxD,OAAO,UAAU,MAAM;EAAE,MAAM;EAAiB,MAAM;CAAa,CAAC;CAEpE,OAAO;AACT;;;ACjBA,SAAgB,iBACd,MACA,UACa;CACb,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,MAAM,iBAAiB,qBAAqB,IAAI;CAChD,OAAO,eAAe;CACtB,OAAO,aAAa,MAAM,OAAO,KAAK,MACpC,cAAc,GAAG,eAAe,IAAI,CACtC;CAEA,OAAO,kBAAkB,MAAM,OAAO,IAAI;EACxC,MAAM;EACN,MAAM,eAAe;CACvB,CAAC;CACD,OAAO,wBAAwB,MAAM,OAAO,IAAI;EAC9C,MAAM;EACN,UAAU,OAAO;CACnB,CAAC;CAED,OAAO;AACT;;;AC5BA,SAAgB,mBAAmB,MAAgC;CACjE,MAAM,YAAY,KAAK,QAAQ,KAAK,MAAM,EAAE,EAAE;CAE9C,MAAM,KAAK,EAAE,QAAA,EAA0B,CAAC,CAAC,CAAC,cAAc;EACtD,UAAU,SAAS,aAAa;GAC9B,OAAO,iBAAiB,MAAM,QAAQ;EACxC,CAAC;CACH,CAAC;CAED,OAAO;AACT;;;ACRA,SAAgB,WAAW,MAAgC;CACzD,OAAO;EAAE,GAAG;EAAM,UAAU,QAAQ,KAAK,QAAQ;CAAE;CACnD,OAAO,mBAAmB,IAAI;CAC9B,OAAO,iBAAiB,IAAI;CAE5B,IAAI,KAAK,YACP,OAAO,gBAAgB,IAAI;CAG7B,OAAO;AACT;;;ACbA,SAAgB,kBAAkB,MAAgC;CAChE,OAAO;EACL,GAAG;EACH,UAAU,CACR,GAAG,KAAK,UACR,GAAG,KAAK,YAAY,KAAK,kBACvB,cAAc,SAAS,kBACnB,cAAc,OACd,aACN,CACF;EACA,aAAa,CAAC;CAChB;CAEA,OAAO,UAAU,MAAM,EAAE,MAAM,sBAAsB,CAAC;CAEtD,OAAO;AACT;;;ACjBA,SAAgB,iBAAiB,MAAoB;CACnD,QAAQ,KAAK,MAAb;EACE,KAAK,UACH,OAAO,KAAK;EACd,KAAK;EACL,KAAK;EACL,KAAK,QACH,OAAA;EACF,KAAK,QACH,OAAA;CACJ;AACF;;;ACXA,SAAgB,gBAAgB,MAA2B;CACzD,OAAO,KAAK,QACT,SAAS,MAAM,EAAE,IAAI,CAAC,CACtB,KAAK,SAAS,iBAAiB,IAAI,CAAC,CAAC,CACrC,QACE,gBAAgB,kBAAkB,iBAAiB,eACpD,CACF;AACJ;;;ACRA,SAAgB,WACd,MACA,UACA,QACa;CACb,OAAO,aAAa,MAAM,WAAW,OAAO;EAC1C,GAAG;EACH,OAAO,EAAE,QAAQ;CACnB,EAAE;AACJ;;;ACJA,SAAgB,kBAAkB,MAAgC;CAChE,KAAK,MAAM,UAAU,KAAK,SAAS;EACjC,MAAM,QAAQ,CAAC,GAAG,OAAO,IAAI;EAC7B,IAAI;EACJ,OAAQ,eAAe,MAAM,IAAI,GAAI;GACnC,OAAO;IAAE,GAAG;IAAM,UAAU,CAAC,GAAG,KAAK,UAAU,YAAY;GAAE;GAC7D,OAAO,kBAAkB,MAAM,OAAO,IAAI;IACxC,MAAM;IACN,QAAQ,aAAa;GACvB,CAAC;GACD,OAAO,wBAAwB,MAAM,OAAO,IAAI;IAC9C,MAAM;IACN,UAAU,OAAO;GACnB,CAAC;EACH;EACA,OAAO,aAAa,MAAM,OAAO,KAAK,OAAO;GAAE,GAAG;GAAG,MAAM;EAAM,EAAE;CACrE;CAEA,OAAO;AACT;;;AClBA,SAAgB,sBACd,MACA,OAC6B;CAC7B,MAAM,QAAgB,CAAC;CAEvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;EAC9B,MAAM,SAAS,qBAAqB,IAAI;EACxC,OAAO,OAAO;EACd,MAAM,KAAK,OAAO,IAAI;CACxB;CAEA,OAAO;EAAE;EAAO;CAAK;AACvB;;;ACZA,SAAgB,aAAa,MAAmB,UAA+B;CAC7E,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,MAAM,kBAAkB,sBAAsB,MAAM,CAAC;CACrD,OAAO,gBAAgB;CAEvB,gBAAgB,MAAM,SAAS,SAAS;EACtC,OAAO,aAAa,MAAM,OAAO,KAAK,MAAM,cAAc,GAAG,IAAI,CAAC;CACpE,CAAC;CAED,OAAO,kBAAkB,MAAM,OAAO,IAAI;EACxC,MAAM;EACN,OAAO,gBAAgB;CACzB,CAAC;CACD,OAAO,wBAAwB,MAAM,OAAO,IAAI;EAC9C,MAAM;EACN,UAAU,OAAO;CACnB,CAAC;CAED,OAAO;AACT;;;AC3BA,SAAgB,eAAe,MAAgC;CAC7D,OAAO,WAAW,IAAI;CACtB,OAAO,WAAW,IAAI;CAEtB,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,uBAAuB,iBAAiB,IAAI,CAAC,CAAC;CAChD,CAAC;CAED,OAAO;AACT;;;ACUA,SAAgB,gBACd,MACA,MAC6B;CAC7B,MAAM,gBAAgB,iBAAiB,IAAI;CAE3C,OAAO,aAAa,MAAM,cAAc,KAAK,MAC3C,mBAAmB,GAAG,IAAI,CAC5B;CACA,OAAO,qBAAqB,MAAM,IAAI;CAEtC,OAAO,kBAAkB,MAAM,cAAc,IAAI;EAC/C,MAAM;EACN;CACF,CAAC;CACD,OAAO,wBAAwB,MAAM,cAAc,IAAI;EACrD,MAAM;EACN,UAAU,cAAc;EACxB;CACF,CAAC;CAED,MAAM,eAAe,cAAc,IAAI;CACvC,OAAO,aAAa,MAAM,aAAa,EAAE;CAEzC,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;EACxC,OAAO,WAAW,MAAM,cAAc,IAAI,gBAAgB,IAAI,CAAC;EAC/D,OAAO,kBAAkB,IAAI;EAC7B,OAAO,kBAAkB,IAAI;EAE7B,MAAM,uBAAuB,iBAAiB,IAAI;EAElD,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;GACxC,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,0BAA0B,IAAI;EACvC,OAAO;GACL,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,WAAW,IAAI;EACxB;CACF,OACE,IAAI,KAAK,QAAQ,SAAS,GACxB,OAAO,eAAe,IAAI;CAI9B,OAAO;AACT;;;AChEA,SAAgB,eACd,MACA,MAC6B;CAC7B,MAAM,gBAAgB,iBAAiB,IAAI;CAE3C,OAAO,aAAa,MAAM,cAAc,KAAK,MAC3C,mBAAmB,GAAG,IAAI,CAC5B;CACA,OAAO,qBAAqB,MAAM,IAAI;CAEtC,OAAO,kBAAkB,MAAM,cAAc,IAAI;EAC/C,MAAM;EACN;CACF,CAAC;CACD,OAAO,wBAAwB,MAAM,cAAc,IAAI;EACrD,MAAM;EACN,UAAU,cAAc;EACxB;CACF,CAAC;CAED,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;EACxC,OAAO,WAAW,MAAM,cAAc,IAAI,gBAAgB,IAAI,CAAC;EAC/D,OAAO,kBAAkB,IAAI;EAC7B,OAAO,kBAAkB,IAAI;EAE7B,MAAM,uBAAuB,iBAAiB,IAAI;EAElD,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;GACxC,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,0BAA0B,IAAI;EACvC,OAAO;GACL,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,WAAW,IAAI;EACxB;CACF,OACE,OAAO,mBAAmB,IAAI;CAGhC,OAAO;AACT;;;ACxDA,SAAgB,gBACd,MACA,MAC6B;CAC7B,MAAM,gBAAgB,iBAAiB,IAAI;CAE3C,OAAO,aAAa,MAAM,cAAc,KAAK,MAC3C,mBAAmB,GAAG,IAAI,CAC5B;CACA,OAAO,qBAAqB,MAAM,IAAI;CAEtC,OAAO,kBAAkB,MAAM,cAAc,IAAI;EAC/C,MAAM;EACN;CACF,CAAC;CACD,OAAO,wBAAwB,MAAM,cAAc,IAAI;EACrD,MAAM;EACN,UAAU,cAAc;EACxB;CACF,CAAC;CAED,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;EACxC,OAAO,WAAW,MAAM,cAAc,IAAI,gBAAgB,IAAI,CAAC;EAC/D,OAAO,kBAAkB,IAAI;EAC7B,OAAO,kBAAkB,IAAI;EAE7B,MAAM,uBAAuB,iBAAiB,IAAI;EAElD,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;GACxC,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,0BAA0B,IAAI;EACvC,OAAO;GACL,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,WAAW,IAAI;EACxB;CACF,OACE,IAAI,KAAK,QAAQ,SAAS,GAAG;EAC3B,OAAO,gBAAgB,IAAI;EAC3B,OAAO,mBAAmB,IAAI;CAChC;CAGF,OAAO;AACT;;;AC7DA,SAAgB,aACd,MACA,MAC6B;CAC7B,MAAM,gBAAgB,iBAAiB,IAAI;CAE3C,OAAO,aAAa,MAAM,cAAc,KAAK,MAC3C,mBAAmB,GAAG,IAAI,CAC5B;CACA,OAAO,qBAAqB,MAAM,IAAI;CAEtC,OAAO,kBAAkB,MAAM,cAAc,IAAI;EAC/C,MAAM;EACN;CACF,CAAC;CACD,OAAO,wBAAwB,MAAM,cAAc,IAAI;EACrD,MAAM;EACN,UAAU,cAAc;EACxB;CACF,CAAC;CAED,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;EACxC,OAAO,WAAW,MAAM,cAAc,IAAI,gBAAgB,IAAI,CAAC;EAC/D,OAAO,kBAAkB,IAAI;EAC7B,OAAO,kBAAkB,IAAI;EAE7B,MAAM,uBAAuB,iBAAiB,IAAI;EAElD,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;GACxC,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,0BAA0B,IAAI;EACvC,OAAO;GACL,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,WAAW,IAAI;EACxB;CACF,OACE,IAAI,KAAK,QAAQ,SAAS,GACxB,OAAO,eAAe,IAAI;CAI9B,OAAO;AACT;;;ACvEA,SAAgB,SAAS,MAAY,UAAkB,QAAgB;CACrE,MAAM,EAAE,WAAW,aAAa,MAAM,QAAQ;CAC9C,IAAI,CAAC,QACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAEnD,IAAI,KAAK,WAAW,WAClB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAElD,IAAI,CAAC,gBAAgB,MAAM,OAAO,EAAE,GAClC,OAAO;EAAE,SAAS;EAAO,OAAO;CAAY;CAE9C,MAAM,OAAO,OAAO,KAAK,MAAM,MAAM,EAAE,OAAO,MAAM;CACpD,IAAI,CAAC,MACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAe;CAEjD,IAAI,KAAK,SAAS,QAChB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAa;CAE/C,IAAI,CAAC,eAAe,MAAM,OAAO,MAAM,KAAK,WAAW,GACrD,OAAO;EAAE,SAAS;EAAO,OAAO;CAAkB;CAGpD,OAAO;EAAE,GAAG;EAAM,WAAW,KAAK,IAAI,IAAI;CAAoB;CAC9D,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,WAAW,KAAK;CAClB,CAAC;CAED,QAAQ,KAAK,MAAb;EACE,KAAK,WACH,OAAO;GAAE,SAAS;GAAM,MAAM,gBAAgB,MAAM,IAAI;EAAE;EAC5D,KAAK,UACH,OAAO;GAAE,SAAS;GAAM,MAAM,eAAe,MAAM,IAAI;EAAE;EAC3D,KAAK,WACH,OAAO;GAAE,SAAS;GAAM,MAAM,gBAAgB,MAAM,IAAI;EAAE;EAC5D,KAAK,QACH,OAAO;GAAE,SAAS;GAAM,MAAM,aAAa,MAAM,IAAI;EAAE;CAC3D;AACF;;;ACrCA,SAAgB,cACd,MACA,UACa;CACb,MAAM,EAAE,WAAW,UAAU,MAAM,QAAQ;CAE3C,MAAM,kBAAkB,sBAAsB,MAAM,CAAC;CACrD,OAAO,gBAAgB;CAEvB,gBAAgB,MAAM,SAAS,SAAS;EACtC,OAAO,aAAa,MAAM,OAAO,KAAK,MAAM,cAAc,GAAG,IAAI,CAAC;CACpE,CAAC;CAED,OAAO,kBAAkB,MAAM,OAAO,IAAI;EACxC,MAAM;EACN,OAAO,gBAAgB;CACzB,CAAC;CACD,OAAO,wBAAwB,MAAM,OAAO,IAAI;EAC9C,MAAM;EACN,UAAU,OAAO;CACnB,CAAC;CAED,OAAO;AACT;;;AC7BA,SAAgB,yBACd,MACA,MACA,OACa;CACb,OAAO;EACL,GAAG;EACH,aAAa,oBAAoB,KAAK,aAAa;GACjD,MAAM;GACN;GACA;EACF,CAAC;CACH;AACF;;;ACOA,SAAgBA,eACd,MACA,MACA,OAC6B;CAC7B,MAAM,gBAAgB,iBAAiB,IAAI;CAE3C,OAAO,aAAa,MAAM,cAAc,KAAK,MAC3C,mBAAmB,GAAG,IAAI,CAC5B;CACA,OAAO,yBAAyB,MAAM,MAAM,KAAK;CAEjD,OAAO,kBAAkB,MAAM,cAAc,IAAI;EAC/C,MAAM;EACN,MAAM;GAAE,MAAM;GAAiB;GAAM;EAAM;CAC7C,CAAC;CACD,OAAO,wBAAwB,MAAM,cAAc,IAAI;EACrD,MAAM;EACN,UAAU,cAAc;EACxB,MAAM;GAAE,MAAM;GAAiB;GAAM;EAAM;CAC7C,CAAC;CAED,IAAI,KAAK,YAAY;EACnB,MAAM,eAAe,cAAc,IAAI;EACvC,OAAO,cAAc,MAAM,aAAa,EAAE;CAC5C;CAEA,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;EACxC,OAAO,WAAW,MAAM,cAAc,IAAI,gBAAgB,IAAI,CAAC;EAC/D,OAAO,kBAAkB,IAAI;EAC7B,OAAO,kBAAkB,IAAI;EAE7B,MAAM,uBAAuB,iBAAiB,IAAI;EAElD,IAAI,aAAa,MAAM,cAAc,EAAE,GAAG;GACxC,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,UAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;GAChD,OAAO,0BAA0B,IAAI;EACvC,OAAO;GACL,OAAO,kBAAkB,MAAM,qBAAqB,IAAI;IACtD,MAAM;IACN,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,wBAAwB,MAAM,qBAAqB,IAAI;IAC5D,MAAM;IACN,UAAU,qBAAqB;IAC/B,OAAO,qBAAqB;GAC9B,CAAC;GACD,OAAO,WAAW,IAAI;EACxB;CACF,OACE,IAAI,KAAK,YACH;MAAA,KAAK,QAAQ,SAAS,GACxB,OAAO,eAAe,IAAI;CAAA,OAG5B,OAAO,mBAAmB,IAAI;CAIlC,OAAO;AACT;;;ACtFA,SAAgB,aACd,MACA,UACA,QACA,OACA;CACA,MAAM,EAAE,WAAW,aAAa,MAAM,QAAQ;CAC9C,IAAI,CAAC,QACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAEnD,IAAI,KAAK,WAAW,WAClB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAElD,IAAI,CAAC,gBAAgB,MAAM,OAAO,EAAE,GAClC,OAAO;EAAE,SAAS;EAAO,OAAO;CAAY;CAE9C,MAAM,OAAO,OAAO,KAAK,MAAM,MAAM,EAAE,OAAO,MAAM;CACpD,IAAI,CAAC,MACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAe;CAEjD,IAAI,KAAK,SAAS,QAChB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAc;CAEhD,IAAI,CAAC,eAAe,MAAM,OAAO,MAAM,KAAK,WAAW,GACrD,OAAO;EAAE,SAAS;EAAO,OAAO;CAAkB;CAGpD,OAAO;EAAE,GAAG;EAAM,WAAW,KAAK,IAAI,IAAI;CAAoB;CAC9D,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,WAAW,KAAK;CAClB,CAAC;CAED,OAAO;EACL,SAAS;EACT,MAAMC,eAAe,MAAM,MAAM,KAAK;CACxC;AACF;;;AC1CA,SAAgB,wBAAwB,MAAgC;CACtE,OAAO;EAAE,GAAG;EAAM,QAAQ;CAAU;AACtC;;;ACEA,SAAgB,UAAU,MAAY,UAAkB;CACtD,MAAM,EAAE,WAAW,aAAa,MAAM,QAAQ;CAC9C,IAAI,CAAC,QACH,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAEnD,IAAI,OAAO,OAAO,KAAK,SACrB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB;CAEnD,IAAI,KAAK,WAAW,WAClB,OAAO;EAAE,SAAS;EAAO,OAAO;CAAgB;CAElD,IAAI,KAAK,QAAQ,SAAA,GACf,OAAO;EAAE,SAAS;EAAO,OAAO;CAAuB;CAGzD,OAAO,wBAAwB,IAAI;CACnC,OAAO,UAAU,MAAM,EAAE,MAAM,cAAc,CAAC;CAE9C,OAAO,WAAW,IAAI;CAEtB,OAAO;EAAE,GAAG;EAAM,WAAW,KAAK,IAAI,IAAI;CAAoB;CAC9D,OAAO,UAAU,MAAM;EACrB,MAAM;EACN,WAAW,KAAK;CAClB,CAAC;CAED,OAAO;EAAE,SAAS;EAAM;CAAK;AAC/B;;;ACWA,MAAa,SAAS;CAAC;CAAQ;CAAS;CAAO;AAAQ"}