{
  "version": 3,
  "sources": ["app.mjs"],
  "sourcesContent": ["import { prepareGameplayStorage } from './gameplay-reset.mjs?v=8a6208ef22c9ab94';\nimport { createGameplayBlocker } from './dialog-state.mjs?v=8a6208ef22c9ab94';\nimport { HintRoutes } from './hint-routes.mjs?v=8a6208ef22c9ab94';\nimport { startupSelection } from './loading.mjs?v=8a6208ef22c9ab94';\nimport { elapsedSince } from './run-clock.mjs?v=8a6208ef22c9ab94';\nimport {\n  difficultyLabel,\n  updateCompletion,\n  bindCompletionPresentation,\n  advanceChallenge,\n  showGameMessage,\n} from './gameplay-flow.mjs?v=8a6208ef22c9ab94';\nimport { updateGymBadge } from './gym-badges.mjs?v=8a6208ef22c9ab94';\nimport { drawingCache } from './drawing-cache.mjs?v=8a6208ef22c9ab94';\nimport {\n  bindGeneratorGuidance,\n  formatGenerationFailure,\n  guidance,\n} from './generator-guidance.mjs?v=8a6208ef22c9ab94';\nimport { setupBoardAccessibility } from './accessibility.mjs?v=8a6208ef22c9ab94';\nimport { reducedMotion } from './motion-preference.mjs?v=8a6208ef22c9ab94';\nimport { createTaskWorker } from './worker-task.mjs?v=8a6208ef22c9ab94';\nimport { createSaveStore, SAVE_CONFLICT_MESSAGE } from './save-store.mjs?v=8a6208ef22c9ab94';\nimport { bindPointerControls } from './pointer-controls.mjs?v=8a6208ef22c9ab94';\nimport { updateMapButton, updateSoundButton } from './board-tools.mjs?v=8a6208ef22c9ab94';\nimport { challengeProgress, isLevelCleared } from './challenge-progress.mjs?v=8a6208ef22c9ab94';\nimport { setupFeedback } from './feedback.mjs?v=8a6208ef22c9ab94';\nimport {\n  initial,\n  move,\n  solve,\n  broken,\n  DIRS,\n  tile,\n  routeBroken,\n  routeClear,\n  complete,\n  atFinish,\n  recover,\n  W,\n  H,\n} from './engine.mjs?v=8a6208ef22c9ab94';\nimport { scene, drawBoard, T } from './render.mjs?v=8a6208ef22c9ab94';\nimport { motion, sample } from './motion.mjs?v=8a6208ef22c9ab94';\nimport { LEVELS, level, puzzle, installGenerated } from './levels.mjs?v=8a6208ef22c9ab94';\nimport { TapQueue, DirectionInput, padDirection, swipeDirection } from './input.mjs?v=8a6208ef22c9ab94';\nimport { decodeBoard, encodeBoard, normalizeSettings, restoreRecord } from './generator.mjs?v=8a6208ef22c9ab94';\nimport { consolidateProgress } from './progress.mjs?v=8a6208ef22c9ab94';\nimport { createAnalytics } from './analytics.mjs?v=8a6208ef22c9ab94';\nconst updateAccessibility = setupBoardAccessibility();\nconst track = createAnalytics('snowpoint');\nconst $ = (id) => document.getElementById(id),\n  canvas = $('game'),\n  ctx = canvas.getContext('2d');\nconst pads = [...document.querySelectorAll('[data-dir]')];\nconst arrows = { up: '\u2191', right: '\u2192', down: '\u2193', left: '\u2190' };\nlet state = initial(),\n  visual = { ...state },\n  history = [],\n  started = false,\n  map = false,\n  dir = 'up';\nlet animation = null,\n  particles = [],\n  hint = null,\n  pending = null,\n  sound = false,\n  audio = null;\nlet elapsed = 0,\n  lastFrame = performance.now(),\n  lastSave = 0,\n  camera = null,\n  recoveryNote = '';\nconst storageKey = 'gym-puzzles-beta-20261028-snowpoint-v1';\nprepareGameplayStorage();\nconst saveStore = createSaveStore(storageKey);\nlet generatedRecord = null,\n  generatedReady = false,\n  generatorWorker = null,\n  generatorBusy = false,\n  hintWorker = null;\nconst modeLast = { classic: 'diamond', custom: 'first-tracks' };\nlet slots = {},\n  archivedSlots = {},\n  board = null;\nlet controls = null;\nconst taps = new TapQueue();\nconst hintRoutes = new HintRoutes();\nlet completionVisible = false;\nconst input = new DirectionInput(requestMove);\nconst total = () => puzzle(state.levelId).targets.length,\n  required = () => puzzle(state.levelId).required;\nconst dialogOpen = createGameplayBlocker();\nconst analyticsDetails = () => ({\n  level_id: state.levelId,\n  mode: level(state.levelId).kind,\n  difficulty: level(state.levelId).difficulty ?? 'classic',\n});\n\nfunction validPosition(s) {\n  return (\n    Number.isInteger(s?.x) && Number.isInteger(s?.y) && s.x >= 0 && s.x < W && s.y >= 2 && s.y < H\n  );\n}\nfunction validMask(s) {\n  return Number.isInteger(s?.mask) && s.mask >= 0 && s.mask < 2 ** puzzle(s.levelId).targets.length;\n}\nfunction normalize(s) {\n  const next = {\n    levelId: level(s.levelId).id,\n    x: s.x,\n    y: s.y,\n    mask: s.mask,\n    moves: Number.isInteger(s.moves) ? Math.max(0, s.moves) : 0,\n    won: false,\n  };\n  if (\n    tile(next.x, next.y, next.levelId) === 'wall' ||\n    (next.x >= 8 && next.x <= 12 && next.y <= 4 && !routeClear(next))\n  ) {\n    next.x = 10;\n    next.y = 21;\n  }\n  next.won = complete(next);\n  return next;\n}\nfunction loadSlot(id) {\n  const saved = slots[id];\n  state = initial(id);\n  history = [];\n  elapsed = 0;\n  started = false;\n  if (saved) {\n    const raw = { ...saved.state, levelId: id };\n    if (validPosition(raw) && validMask(raw)) {\n      state = normalize(raw);\n      if (state.x !== raw.x || state.y !== raw.y)\n        recoveryNote = 'Your cleared snowballs are safe. Continue from the entrance.';\n      elapsed = Number.isFinite(saved.elapsed) ? Math.max(0, saved.elapsed) : 0;\n      started = saved.started === true;\n      history = Array.isArray(saved.history)\n        ? saved.history\n            .map((s) => ({ ...s, levelId: id }))\n            .filter((s) => validPosition(s) && validMask(s))\n            .map(normalize)\n            .slice(-200)\n        : [];\n    }\n  }\n  visual = { ...state };\n}\ntry {\n  const saved = startupSelection(saveStore.read(), LEVELS);\n  generatedRecord = saved?.generated ?? null;\n  const restored = restoreRecord(generatedRecord);\n  if (restored) {\n    installGenerated(restored.board, generatedRecord);\n    generatedReady = true;\n  }\n  const migrated = consolidateProgress(saved);\n  slots = migrated.slots;\n  // Preserve the exact inactive pair, even when migration cannot validate it.\n  if (saved?.slots && Object.hasOwn(saved.slots, 'generated'))\n    slots.generated = saved.slots.generated;\n  archivedSlots = migrated.archived;\n  if (migrated.selected === 'generated' && validGeneratedResume()) loadGeneratedSlot();\n  else loadSlot(migrated.selected === 'generated' ? LEVELS[0].id : migrated.selected);\n} catch {}\nconst cachedDrawing = drawingCache();\nfunction cacheBoard() {\n  board = cachedDrawing(puzzle(state.levelId), 'board', () => {\n    const c = document.createElement('canvas');\n    c.width = W * T;\n    c.height = H * T;\n    drawBoard(c.getContext('2d'), state.levelId);\n    return c;\n  });\n}\nfunction snowballObjective(count) {\n  return count === 1 ? 'the snowball' : `all ${count} snowballs`;\n}\nfunction editionUI() {\n  const g = level(state.levelId);\n  $('levelSelect').value = g.id;\n  $('useSeedButton').disabled = !generatedReady;\n  $('resumeGeneratedButton').hidden = !generatedRecord || state.levelId === 'generated';\n  $('levelChoice').hidden = g.kind === 'generated';\n  for (const [kind, id] of Object.entries({\n    classic: 'modeClassic',\n    custom: 'modeCustom',\n    generated: 'modeGenerator',\n  }))\n    $(id).setAttribute('aria-pressed', String(g.kind === kind));\n  if (g.kind !== 'generated') modeLast[g.kind] = g.id;\n  $('levelNote').textContent = g.note;\n  $('editionName').textContent = g.shortName;\n  $('levelDifficulty').textContent = difficultyLabel(g);\n  $('startTitle').textContent = g.kind !== 'classic' ? g.name : 'Remember this place?';\n  $('startDescription').textContent =\n    g.kind !== 'classic'\n      ? `${g.difficulty} \u00B7 Clear ${snowballObjective(required())}, then reach the top.`\n      : 'Find your angles. Ride the ramps. Open the center path and reach the top.';\n  $('blockerLabel').textContent =\n    g.kind !== 'classic' ? 'SNOWBALLS CLEARED' : 'CENTER BLOCKERS CLEARED';\n  $('requiredTotal').textContent = `/ ${String(required()).padStart(2, '0')}`;\n  $('helpGoal').textContent =\n    g.kind !== 'classic'\n      ? `Clear ${snowballObjective(required())} to open the gate, then reach the glowing platform. Try to finish within ${g.par} moves.`\n      : `Clear the ${required()} center blockers to open the gate, then reach the glowing platform. The ${total() - required()} side snowballs are optional.`;\n  document.documentElement.style.setProperty('--teal', g.accent);\n  const cleared = LEVELS.filter((g) => isLevelCleared(g, slots[g.id])).length;\n  $('editionProgress').textContent =\n    `${cleared} / ${LEVELS.length} ${state.levelId === 'generated' ? 'CLASSIC & CUSTOM CLEARED' : 'CLEARED'}`;\n  const next = LEVELS[(LEVELS.findIndex((g) => g.id === state.levelId) + 1) % LEVELS.length];\n  $('nextButton').textContent =\n    g.kind === 'generated' ? 'New random rink \u2192' : `Next: ${next.name} \u2192`;\n}\nfunction validGeneratedResume() {\n  const run = slots.generated;\n  if (\n    !generatedReady ||\n    !run ||\n    !Number.isFinite(run.elapsed) ||\n    run.elapsed < 0 ||\n    typeof run.started !== 'boolean' ||\n    !Array.isArray(run.history) ||\n    run.history.length > 200\n  )\n    return false;\n  const valid = (s) =>\n    s?.levelId === 'generated' &&\n    validPosition(s) &&\n    validMask(s) &&\n    Number.isInteger(s.moves) &&\n    s.moves >= 0 &&\n    typeof s.won === 'boolean' &&\n    ['levelId', 'x', 'y', 'mask', 'moves', 'won'].every((key) => normalize(s)[key] === s[key]);\n  return valid(run.state) && run.history.every(valid);\n}\nfunction loadGeneratedSlot() {\n  const run = slots.generated;\n  state = { ...run.state };\n  history = run.history.map((s) => ({ ...s }));\n  elapsed = run.elapsed;\n  started = run.started;\n  visual = { ...state };\n}\nfunction selectLevel(id) {\n  if (saveStore.conflicted) return false;\n  if (id === 'generated') {\n    if (!saveStore.checkGenerated()) {\n      say(SAVE_CONFLICT_MESSAGE);\n      return false;\n    }\n    if (!validGeneratedResume()) {\n      say(\n        'Your saved puzzle could not be validated. It is still saved; your current run is unchanged.',\n      );\n      return false;\n    }\n  }\n  completionVisible = false;\n  $('keepProgress').checked = false;\n  clearInput();\n  if (animation) finishMove();\n  persist();\n  if (saveStore.conflicted) return false;\n  if (id === 'generated' && !saveStore.checkGenerated()) {\n    say(SAVE_CONFLICT_MESSAGE);\n    return false;\n  }\n  animation = null;\n  particles = [];\n  hint = null;\n  camera = null;\n  dir = 'up';\n  recoveryNote = '';\n  const nextId = level(id).id;\n  if (nextId !== 'generated') slots[nextId] = saveStore.refresh(nextId).slots[nextId];\n  completionVisible = false;\n  if (nextId === 'generated') loadGeneratedSlot();\n  else loadSlot(nextId);\n  cacheBoard();\n  editionUI();\n  ui();\n  persist();\n  track('challenge_selected', analyticsDetails());\n  say(\n    state.won\n      ? 'This challenge is cleared. Replay it or choose another.'\n      : started\n        ? 'Welcome back. Your progress in this challenge is saved.'\n        : level(id).note,\n  );\n  return true;\n}\nfunction say(message) {\n  showGameMessage(\n    $('message'),\n    saveStore.conflicted ? SAVE_CONFLICT_MESSAGE : message,\n    saveStore.conflicted,\n  );\n}\nfunction timeText() {\n  const seconds = Math.floor(elapsed / 1000);\n  return `${String(Math.floor(seconds / 60)).padStart(2, '0')}:${String(seconds % 60).padStart(2, '0')}`;\n}\nfunction counters(mask = state.mask) {\n  $('broken').textContent = String(routeBroken({ ...state, mask })).padStart(2, '0');\n  $('allBalls').textContent = `${broken({ mask })} / ${total()}`;\n  $('progressFill').style.width = `${(routeBroken({ ...state, mask }) / required()) * 100}%`;\n}\nfunction inputUI() {\n  $('queuedInput').hidden = !pending;\n  $('queuedInput').textContent = pending\n    ? `Next input: ${pending.replace(/([A-Z])/g, ' $1').toLowerCase()} ${arrows[pending]}`\n    : '';\n  pads.forEach((b) => {\n    b.disabled = state.won;\n    b.classList.toggle('is-queued', pending === b.dataset.dir);\n    b.classList.toggle(\n      'is-active',\n      input.last === b.dataset.dir || (!!animation && dir === b.dataset.dir),\n    );\n  });\n}\nfunction ui() {\n  updateAccessibility({\n    name: level(state.levelId).name,\n    state,\n    width: W,\n    height: H,\n    cell: (x, y) => {\n      if (atFinish({ x, y })) return 'finish platform (stops sliding)';\n      const board = puzzle(state.levelId),\n        i = board.targets.findIndex(([tx, ty]) => tx === x && ty === y);\n      const ramp = board.ramps.get(`${x},${y}`);\n      return i >= 0 && !(state.mask & (1 << i))\n        ? `${board.routeMask & (1 << i) ? 'required' : 'optional'} snowball (needs downhill momentum)`\n        : ramp\n          ? `ramp, downhill ${ramp}; uphill allowed; sides blocked`\n          : tile(x, y, state.levelId);\n    },\n    mechanisms: [`Required snowballs cleared: ${routeBroken(state)} of ${required()}`],\n  });\n  $('challengeProgress').innerHTML = challengeProgress(\n    state.levelId === 'generated' ? [...LEVELS, level(state.levelId)] : LEVELS,\n    {\n      ...slots,\n      [state.levelId]: {\n        ...slots[state.levelId],\n        revision: level(state.levelId).revision ?? 1,\n        state,\n        started,\n      },\n    },\n    state.levelId,\n  );\n  const badge = updateGymBadge('snowpoint', LEVELS, {\n    ...slots,\n    [state.levelId]: {\n      ...slots[state.levelId],\n      revision: level(state.levelId).revision ?? 1,\n      state,\n      started,\n    },\n  });\n  counters();\n  $('moves').textContent = String(state.moves);\n  $('timer').textContent = timeText();\n  $('undoButton').disabled = !history.length || state.won;\n  $('hintButton').disabled = !!animation || state.won;\n  $('saveLabel').textContent = state.won\n    ? 'CHALLENGE CLEARED'\n    : animation\n      ? 'SLIDING\u2026'\n      : started\n        ? 'PROGRESS SAVED'\n        : 'READY WHEN YOU ARE';\n  $('startOverlay').hidden = started;\n  $('winOverlay').hidden = !state.won || !completionVisible;\n  $('winTitle').textContent = 'Challenge cleared.';\n  if (state.won)\n    $('winStats').textContent =\n      `${broken(state)} ${broken(state) === 1 ? 'snowball' : 'snowballs'} \u00B7 ${state.moves} ${state.moves === 1 ? 'move' : 'moves'} \u00B7 ${timeText()}`;\n  updateCompletion({\n    levels: LEVELS,\n    slots: {\n      ...slots,\n      [state.levelId]: {\n        ...slots[state.levelId],\n        revision: level(state.levelId).revision ?? 1,\n        state,\n        started,\n        history,\n      },\n    },\n    selected: state.levelId,\n    slot: { state, started, history },\n    visible: completionVisible,\n    badge,\n    busy: !!animation,\n  });\n  inputUI();\n}\nfunction persist() {\n  slots[state.levelId] = {\n    ...(state.levelId === 'generated'\n      ? slots.generated\n      : slots[state.levelId]?.cleared === true\n        ? { cleared: true }\n        : {}),\n    state: { ...state },\n    elapsed,\n    started,\n    revision: level(state.levelId).revision ?? 1,\n    history: history.slice(-200),\n  };\n  try {\n    const result = saveStore.write(\n      {\n        version: 5,\n        generated: generatedRecord,\n        archived: archivedSlots,\n        selected: state.levelId,\n        slots,\n        state,\n        elapsed,\n        started,\n        history: history.slice(-200),\n      },\n      state.levelId,\n    );\n    if (result.status === 'conflict') say(SAVE_CONFLICT_MESSAGE);\n    if (result.status !== 'saved')\n      $('saveLabel').textContent =\n        result.status === 'conflict' ? 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD' : 'THIS SESSION';\n  } catch {\n    $('saveLabel').textContent = 'THIS SESSION';\n  }\n}\nfunction tone(freq, duration = 0.08, type = 'square', volume = 0.025, endFreq) {\n  if (!sound) return;\n  try {\n    audio ??= new (window.AudioContext || window.webkitAudioContext)();\n    if (audio.state === 'suspended') audio.resume();\n    const o = audio.createOscillator(),\n      g = audio.createGain();\n    o.type = type;\n    o.frequency.setValueAtTime(freq, audio.currentTime);\n    if (endFreq) o.frequency.exponentialRampToValueAtTime(endFreq, audio.currentTime + duration);\n    g.gain.setValueAtTime(volume, audio.currentTime);\n    g.gain.exponentialRampToValueAtTime(0.0001, audio.currentTime + duration);\n    o.connect(g);\n    g.connect(audio.destination);\n    o.start();\n    o.stop(audio.currentTime + duration);\n  } catch {}\n}\nfunction start() {\n  canvas.focus?.({ preventScroll: true });\n  if (!started && !state.won)\n    track('challenge_started', { ...analyticsDetails(), trigger: 'enter' });\n  started = true;\n  say(\n    puzzle(state.levelId).custom\n      ? 'Clear every snowball, then reach the top. Ramp arrows mark launch directions.'\n      : 'Open the center path. Ramp arrows point downhill.',\n  );\n  ui();\n  persist();\n}\nfunction smash(e) {\n  if (reducedMotion()) return;\n  tone(650, 0.13, 'triangle', 0.055, 130);\n  for (let i = 0; i < 16; i++) {\n    const a = Math.random() * Math.PI * 2,\n      s = 18 + Math.random() * 42;\n    particles.push({\n      x: e.x * T + 8,\n      y: e.y * T + 6,\n      vx: Math.cos(a) * s,\n      vy: Math.sin(a) * s - 12,\n      life: 0.4 + Math.random() * 0.2,\n      size: Math.random() > 0.5 ? 2 : 1,\n      color: i % 3 ? '#f6fff7' : '#b4e2e4',\n    });\n  }\n}\nfunction clearInput() {\n  hintWorker?.terminate();\n  hintWorker = null;\n  pending = null;\n  taps.clear();\n  input.clear();\n  controls?.reset();\n  inputUI();\n}\nconst RAMP_SIDE_MESSAGE =\n  'Ramp sides block entry. Follow the arrow downhill, or climb uphill against it.';\nfunction stoppedAtRampSide(result) {\n  return result.events.some(\n    (event) => event.type === 'wall' && puzzle(state.levelId).ramps.has(`${event.x},${event.y}`),\n  );\n}\nfunction requestMove(d, isRepeat = false) {\n  if (saveStore.conflicted || dialogOpen() || !DIRS[d] || state.won) return;\n  hintWorker?.terminate();\n  hintWorker = null;\n  if (!started) start();\n  if (animation) {\n    if (!isRepeat) {\n      taps.push(d);\n      pending = taps.items[0] ?? null;\n      inputUI();\n    }\n    return;\n  }\n  dir = d;\n  hint = null;\n  const result = move(state, d);\n  if (!result.path.length) {\n    if (result.events.some((e) => e.type === 'gate'))\n      say(\n        `Gate closed: clear ${required() - routeBroken(state)} more required snowball${required() - routeBroken(state) === 1 ? '' : 's'}.`,\n      );\n    else if (result.events.some((e) => e.type === 'bump'))\n      say('Not enough momentum. Follow a ramp arrow into that snowball.');\n    else if (stoppedAtRampSide(result)) say(RAMP_SIDE_MESSAGE);\n    else say('Blocked by a ledge or ice pillar. Choose another direction.');\n    tone(120, 0.06, 'triangle');\n    const nextTap = taps.shift();\n    pending = taps.items[0] ?? null;\n    inputUI();\n    if (nextTap) requestMove(nextTap);\n    return;\n  }\n  history.push({ ...state });\n  if (history.length > 200) history.shift();\n  animation = motion(result, state, performance.now());\n  if (reducedMotion()) finishMove();\n  ui();\n  tone(310, 0.1, 'triangle', 0.012, 500);\n}\nfunction finishMove() {\n  const { result } = animation;\n  state = result.state;\n  completionVisible = state.won;\n  visual = { ...state };\n  animation = null;\n  if (state.won) {\n    track('challenge_completed', {\n      ...analyticsDetails(),\n      moves: state.moves,\n      duration_seconds: Math.round(elapsed / 1000),\n    });\n    clearInput();\n    say('The path is open. Snowpoint challenge complete!');\n    [523, 659, 784, 1046].forEach((f, i) =>\n      setTimeout(() => tone(f, 0.22, 'triangle', 0.05), i * 140),\n    );\n  } else if (routeClear(state))\n    say('Gate open! Head up the center staircase to the glowing platform.');\n  else if (result.events.some((e) => e.type === 'gate'))\n    say(\n      `The gate needs ${required() - routeBroken(state)} more required snowball${required() - routeBroken(state) === 1 ? '' : 's'} cleared.`,\n    );\n  else if (result.events.some((e) => e.type === 'smash'))\n    say(\n      `${routeBroken(state)} of ${required()} ${puzzle(state.levelId).custom ? 'snowballs' : 'center blockers'} cleared. Line up the next run.`,\n    );\n  else if (result.events.some((e) => e.type === 'bump'))\n    say('A snowball stopped you. Try approaching downhill from the side.');\n  else if (stoppedAtRampSide(result)) say(RAMP_SIDE_MESSAGE);\n  else if (result.events.some((e) => e.type === 'ramp'))\n    say('Ramp crossed. Snow patches let you stop and change direction.');\n  else\n    say(\n      tile(state.x, state.y, state.levelId) === 'snow'\n        ? 'A snow patch. Stop, turn, and choose your next slide.'\n        : 'Find a snow patch or a downhill launch point.',\n    );\n  const next = taps.shift();\n  pending = taps.items[0] ?? null;\n  ui();\n  persist();\n  if (state.won) {\n    editionUI();\n    ui();\n    $('nextButton').focus?.({ preventScroll: true });\n  }\n  if (next && !state.won) requestMove(next);\n}\nfunction undo() {\n  if (saveStore.conflicted) return;\n  if (!history.length || state.won) return;\n  clearInput();\n  animation = null;\n  state = history.pop();\n  visual = { ...state };\n  hint = null;\n  particles = [];\n  say('One move back. Your previous snowballs are restored.');\n  completionVisible = false;\n  ui();\n  persist();\n  tone(230, 0.08, 'triangle');\n}\nfunction reset() {\n  if (saveStore.conflicted) return;\n  slots[state.levelId] = {\n    ...slots[state.levelId],\n    cleared: isLevelCleared(level(state.levelId), {\n      ...slots[state.levelId],\n      revision: level(state.levelId).revision ?? 1,\n      state,\n    }),\n  };\n  clearInput();\n  state = initial(state.levelId);\n  visual = { ...state };\n  history = [];\n  animation = null;\n  particles = [];\n  hint = null;\n  elapsed = 0;\n  started = true;\n  dir = 'up';\n  camera = null;\n  say('A fresh rink. Clear the required snowballs, then reach the top.');\n  completionVisible = false;\n  ui();\n  persist();\n  editionUI();\n  track('challenge_started', { ...analyticsDetails(), trigger: 'restart' });\n}\nfunction returnToEntrance() {\n  if (saveStore.conflicted) return;\n  if (state.won) return;\n  clearInput();\n  if (animation) finishMove();\n  if (saveStore.conflicted || state.won) return;\n  history.push({ ...state });\n  state = recover(state);\n  visual = { ...state };\n  particles = [];\n  hint = null;\n  camera = null;\n  started = true;\n  say('Back at the entrance. All your cleared snowballs are still cleared.');\n  completionVisible = false;\n  ui();\n  persist();\n}\nfunction presentHint(route, verified = false) {\n  if (\n    !verified &&\n    route?.length &&\n    !hintRoutes.remember(\n      puzzle(state.levelId),\n      state,\n      { status: 'ok', route },\n      (from, direction) => (direction === 'return' ? recover(from) : move(from, direction).state),\n    )\n  ) {\n    say('A reliable hint could not be verified. Try Undo or Back to entrance.');\n    return;\n  }\n  if (!route?.length) {\n    say('Try Undo to revisit your last angle.');\n    return;\n  }\n  const d = route[0];\n  if (d === 'return') {\n    hint = null;\n    say('Try BACK TO ENTRANCE. Your cleared snowballs stay cleared.');\n    return;\n  }\n  const [dx, dy] = DIRS[d];\n  hint = { x: state.x + dx, y: state.y + dy, until: performance.now() + 5000 };\n  say(\n    `Try ${d.toUpperCase()} ${arrows[d]}. ${routeClear(state) ? 'The gate is open; head to the platform.' : 'Follow this forward route; it avoids entrance recovery.'}`,\n  );\n  tone(740, 0.08, 'sine');\n}\nfunction showHint() {\n  if (saveStore.conflicted || animation || state.won || dialogOpen()) return;\n  if (!started) start();\n  track('hint_requested', analyticsDetails());\n  const cached = hintRoutes.get(puzzle(state.levelId), state);\n  if (cached) {\n    presentHint(cached.route, true);\n    return;\n  }\n  if (state.levelId === 'generated') {\n    hintWorker?.terminate();\n    hintWorker = null;\n    const snapshot = JSON.stringify(state);\n    try {\n      const task = createTaskWorker(new URL('./generator-worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n      hintWorker = task;\n      say('Finding your next move\u2026');\n      task.onmessage = (e) => {\n        task.terminate();\n        if (hintWorker !== task) return;\n        hintWorker = null;\n        if (JSON.stringify(state) === snapshot) presentHint(e.data.result?.route);\n      };\n      task.onerror = () => {\n        task.terminate();\n        if (hintWorker !== task) return;\n        hintWorker = null;\n        say('Try Undo or Restart with Keep progress on to find a new angle.');\n      };\n      task.postMessage({\n        kind: 'hint',\n        board: encodeBoard(puzzle(state.levelId)),\n        state: { ...state },\n      });\n    } catch {\n      hintWorker?.terminate();\n      hintWorker = null;\n      say(\n        'Background hints are unavailable in this browser. Try Undo or Restart with Keep progress on.',\n      );\n    }\n  } else\n    presentHint(\n      solve(state, 250000, { recovery: false }) ?? solve(state, 250000, { recovery: true }),\n    );\n}\nfunction toggleMap() {\n  map = !map;\n  camera = null;\n  canvas.width = map ? 336 : 256;\n  canvas.height = map ? 368 : 192;\n  updateMapButton($('mapButton'), map);\n  document.querySelector('.console').classList.toggle('map-active', map);\n}\nfunction frame(now) {\n  const rawDt = elapsedSince(now, lastFrame) / 1000,\n    dt = Math.min(rawDt, 0.1);\n  lastFrame = now;\n  if (started && !state.won && document.visibilityState !== 'hidden' && !dialogOpen())\n    elapsed += rawDt * 1000;\n  particles.forEach((p) => {\n    p.life -= dt;\n    p.x += p.vx * dt;\n    p.y += p.vy * dt;\n    p.vy += 45 * dt;\n  });\n  particles = particles.filter((p) => p.life > 0);\n  if (reducedMotion()) {\n    particles = [];\n    if (animation) finishMove();\n  }\n  let paintState = state,\n    powered = false;\n  if (animation) {\n    const a = animation,\n      s = sample(a, now);\n    visual = { x: s.x, y: s.y };\n    powered = s.powered;\n    a.result.events.forEach((e, i) => {\n      if (e.step !== undefined && s.elapsed >= a.ends[e.step] && !a.fired.has(i)) {\n        a.fired.add(i);\n        if (e.type === 'smash') {\n          a.mask |= 1 << e.index;\n          smash(e);\n          counters(a.mask);\n        } else if (e.type === 'ramp') tone(420, 0.09, 'triangle', 0.015, 700);\n      }\n    });\n    paintState = { ...state, mask: a.mask };\n    if (s.done) {\n      finishMove();\n      paintState = state;\n      powered = false;\n    }\n  }\n  const target = {\n    x: Math.max(0, Math.min(W * T - 256, visual.x * T - 120)),\n    y: Math.max(0, Math.min(H * T - 192, visual.y * T - 88)),\n  };\n  if (!camera || reducedMotion()) camera = target;\n  else {\n    const a = 1 - Math.exp(-dt * 14);\n    camera.x += (target.x - camera.x) * a;\n    camera.y += (target.y - camera.y) * a;\n  }\n  if (hint && now > hint.until) hint = null;\n  input.update(now, !!animation || dialogOpen() || state.won);\n  scene(ctx, {\n    board,\n    state: paintState,\n    visual,\n    dir,\n    time: reducedMotion() ? 0 : now,\n    moving: !reducedMotion() && !!animation,\n    map,\n    particles,\n    hint,\n    camera,\n    powered,\n  });\n  const clock = timeText();\n  if ($('timer').textContent !== clock) $('timer').textContent = clock;\n  if (now - lastSave > 5000) {\n    if (!animation && started) persist();\n    lastSave = now;\n  }\n  requestAnimationFrame(frame);\n}\n$('startButton').addEventListener('click', start);\n$('againButton').addEventListener('click', reset);\n$('resetButton').addEventListener('click', () =>\n  $('keepProgress').checked && !state.won ? returnToEntrance() : reset(),\n);\n$('returnButton').addEventListener('click', returnToEntrance);\n$('undoButton').addEventListener('click', undo);\n$('hintButton').addEventListener('click', showHint);\n$('mapButton').addEventListener('click', toggleMap);\n$('soundButton').addEventListener('click', () => {\n  sound = !sound;\n  updateSoundButton($('soundButton'), sound);\n  tone(440, 0.08, 'triangle');\n});\nconst help = $('helpDialog');\n$('helpButton').addEventListener('click', () => {\n  clearInput();\n  if (animation) finishMove();\n  help.showModal();\n});\n$('closeHelp').addEventListener('click', () => help.close());\n$('helpDone').addEventListener('click', () => help.close());\nhelp.addEventListener('click', (e) => {\n  if (e.target !== help) return;\n  const r = help.getBoundingClientRect();\n  if (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom)\n    help.close();\n});\nconst keys = {\n  ArrowUp: 'up',\n  w: 'up',\n  W: 'up',\n  ArrowRight: 'right',\n  d: 'right',\n  D: 'right',\n  ArrowDown: 'down',\n  s: 'down',\n  S: 'down',\n  ArrowLeft: 'left',\n  a: 'left',\n  A: 'left',\n};\nwindow.addEventListener('keydown', (e) => {\n  if (\n    dialogOpen() ||\n    e.ctrlKey ||\n    e.metaKey ||\n    e.altKey ||\n    e.target?.closest?.('.challenge-picker') ||\n    e.target?.isContentEditable ||\n    ['SELECT', 'INPUT', 'TEXTAREA'].includes(e.target?.tagName)\n  )\n    return;\n  if (keys[e.key]) {\n    e.preventDefault();\n    if (!e.repeat && !input.held.has(`key:${e.key.toLowerCase()}`))\n      input.press(`key:${e.key.toLowerCase()}`, keys[e.key], performance.now());\n  } else if (e.key.toLowerCase() === 'z') {\n    e.preventDefault();\n    undo();\n  } else if (e.key.toLowerCase() === 'e') {\n    e.preventDefault();\n    returnToEntrance();\n  } else if (e.key.toLowerCase() === 'r') {\n    e.preventDefault();\n    $('keepProgress').checked && !state.won ? returnToEntrance() : reset();\n  }\n});\nwindow.addEventListener('keyup', (e) => {\n  if (keys[e.key]) {\n    input.release(`key:${e.key.toLowerCase()}`, performance.now());\n    inputUI();\n  }\n});\ncontrols = bindPointerControls({\n  canvas,\n  dpad: $('dpad'),\n  pads,\n  input,\n  request: requestMove,\n  enabled: () => !dialogOpen() && !state.won,\n  clearInput,\n  update: inputUI,\n  padDirection,\n  swipeDirection,\n});\nwindow.addEventListener('blur', clearInput);\nwindow.addEventListener('gym-privacy-open', clearInput);\ndocument.addEventListener('visibilitychange', () => {\n  clearInput();\n  if (document.visibilityState === 'hidden' && animation) finishMove();\n  persist();\n  lastFrame = performance.now();\n});\nwindow.addEventListener('pagehide', () => {\n  clearInput();\n  if (animation) finishMove();\n  persist();\n});\n$('levelSelect').addEventListener('change', (e) => selectLevel(e.target.value));\n$('nextButton').addEventListener('click', () =>\n  state.levelId === 'generated'\n    ? beginGeneration(true)\n    : advanceChallenge(\n        LEVELS,\n        { ...slots, [state.levelId]: { revision: level(state.levelId).revision ?? 1, state } },\n        state.levelId,\n        selectLevel,\n      ),\n);\nconst generatorDialog = $('generatorDialog');\nfunction openGenerator() {\n  clearInput();\n  if (animation) finishMove();\n  refreshGeneratorGuidance();\n  refreshGeneratorDisclosure();\n  if (!generatorBusy && $('generatorStatus').textContent.startsWith('Finding'))\n    $('generatorStatus').textContent = '';\n  generatorDialog.showModal();\n}\nfunction stopGeneration() {\n  if (generatorBusy)\n    $('generatorStatus').textContent = 'Search cancelled. Your current puzzle is kept.';\n  generatorWorker?.terminate();\n  generatorWorker = null;\n  generatorBusy = false;\n  $('generateButton').disabled = false;\n  $('generateButton').textContent = 'Generate puzzle \u2192';\n  $('generatorCancel').textContent = 'Close';\n}\nfunction acceptGenerated(record) {\n  $('generatorStatus').textContent =\n    `Ready: ${record.moves} moves minimum. A verified rink was generated.`;\n  clearInput();\n  if (animation) finishMove();\n  persist();\n  generatedRecord = record;\n  generatedReady = true;\n  installGenerated(decodeBoard(record.board), record);\n  delete slots.generated;\n  completionVisible = false;\n  $('keepProgress').checked = false;\n  state = initial('generated');\n  visual = { ...state };\n  history = [];\n  elapsed = 0;\n  started = false;\n  animation = null;\n  particles = [];\n  hint = null;\n  camera = null;\n  dir = 'up';\n  cacheBoard();\n  editionUI();\n  ui();\n  persist();\n  generatorDialog.close();\n  track('puzzle_generated', {\n    ...analyticsDetails(),\n    minimum_moves: record.moves,\n    snowballs: record.board.targets.length,\n  });\n  say(\n    `A fresh rink. ${record.moves} moves minimum. Clear ${snowballObjective(record.board.targets.length)}.`,\n  );\n}\nfunction freshSeed() {\n  if (globalThis.crypto?.getRandomValues) {\n    const a = new Uint32Array(2);\n    crypto.getRandomValues(a);\n    return [...a].map((n) => n.toString(36)).join('-');\n  }\n  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\nfunction beginGeneration(fresh = false) {\n  if (generatorBusy) return;\n  if (fresh) $('generatorSeed').value = '';\n  let settings;\n  const explicitSeed = !fresh && $('generatorSeed').value.trim() !== '';\n  try {\n    settings = normalizeSettings({\n      snowballs: $('generatorBalls').value,\n      minMoves: $('generatorMoves').value,\n      randomness: $('generatorRandomness').value,\n      seed: explicitSeed ? $('generatorSeed').value : freshSeed(),\n    });\n  } catch (e) {\n    $('generatorStatus').textContent = formatGenerationFailure(e.message, $('generatorSeed').value);\n    return;\n  }\n  openGenerator();\n  generatorBusy = true;\n  $('generateButton').disabled = true;\n  $('generateButton').textContent = 'Searching\u2026';\n  $('generatorCancel').textContent = 'Cancel search';\n  $('generatorStatus').textContent = 'Finding a solvable rink\u2026';\n  try {\n    generatorWorker = createTaskWorker(new URL('./generator-worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    const job = generatorWorker;\n    let checked = 0,\n      best = 0;\n    generatorWorker.onmessage = (event) => {\n      if (generatorWorker !== job) return;\n      if (event.data.type === 'progress') {\n        checked = event.data.attempt;\n        best = event.data.best;\n        $('generatorStatus').textContent =\n          `Finding a solvable rink\u2026 ${checked} layouts checked. Best route so far: ${best} moves.`;\n      } else if (event.data.type === 'complete') {\n        const record = { ...event.data.record, explicitSeed };\n        stopGeneration();\n        acceptGenerated(record);\n      } else if (event.data.type === 'error') {\n        stopGeneration();\n        $('generatorStatus').textContent = formatGenerationFailure(\n          event.data.message,\n          explicitSeed ? settings.seed : '',\n        );\n      }\n    };\n    generatorWorker.onerror = (event) => {\n      if (generatorWorker !== job) return;\n      stopGeneration();\n      const reason = event?.message?.includes('took too long')\n        ? 'Search stopped at the 30-second limit.'\n        : 'The background search stopped before it could finish.';\n      const progress = checked\n        ? ` Last update: ${checked} layouts; ${best ? `best solvable candidate ${best} moves` : 'no solvable candidate yet'}.`\n        : '';\n      $('generatorStatus').textContent = formatGenerationFailure(\n        `${reason}${progress} Change or clear the seed${settings.minMoves > 5 ? ', or lower the requested minimum' : ''}. Your settings were not lowered and your current puzzle is kept.`,\n        explicitSeed ? settings.seed : '',\n      );\n    };\n    generatorWorker.postMessage({\n      settings,\n      // Seed identity must not depend on the previous board.\n      exclude: '',\n    });\n  } catch {\n    stopGeneration();\n    $('generatorStatus').textContent = 'Background generation is unavailable in this browser.';\n  }\n}\n$('modeClassic').addEventListener('click', () => selectLevel(modeLast.classic));\n$('modeCustom').addEventListener('click', () => selectLevel(modeLast.custom));\n$('modeGenerator').addEventListener('click', () =>\n  generatedRecord ? selectLevel('generated') : openGenerator(),\n);\nlet resumeReturnFocus = false;\n$('resumeGeneratedButton').addEventListener('click', () => {\n  if (!generatedRecord) return;\n  const resumed = selectLevel('generated');\n  resumeReturnFocus = resumed === true;\n  $('levelPickerDialog').close();\n});\n$('levelPickerDialog').addEventListener('close', () => {\n  if (!resumeReturnFocus) return;\n  resumeReturnFocus = false;\n  Promise.resolve().then(() => {\n    if (state.levelId === 'generated' && !dialogOpen()) canvas.focus?.({ preventScroll: true });\n  });\n});\n$('generatorSettingsButton').addEventListener('click', openGenerator);\nbindCompletionPresentation({\n  setVisible: (value) => {\n    completionVisible = value;\n  },\n  update: ui,\n  dialogOpen,\n});\n$('generatorForm').addEventListener('submit', (e) => {\n  e.preventDefault();\n  beginGeneration();\n});\n$('generatorCancel').addEventListener('click', () => {\n  stopGeneration();\n  generatorDialog.close();\n});\n$('generatorClose').addEventListener('click', () => {\n  stopGeneration();\n  generatorDialog.close();\n});\ngeneratorDialog.addEventListener('cancel', stopGeneration);\n$('generatorRandomness').addEventListener('input', () => {\n  $('randomnessValue').textContent = `${$('generatorRandomness').value}%`;\n});\n$('useSeedButton').addEventListener('click', () => {\n  if (generatedReady) {\n    $('generatorSeed').value = generatedRecord.seed;\n    $('generatorStatus').textContent =\n      'Seed filled. Keep the matching settings to replay that board.';\n    refreshGeneratorDisclosure();\n  }\n});\nif (generatedReady) {\n  $('generatorBalls').value = String(generatedRecord.settings.snowballs);\n  $('generatorMoves').value = String(generatedRecord.settings.minMoves);\n  $('generatorRandomness').value = String(generatedRecord.settings.randomness);\n  $('randomnessValue').textContent = `${generatedRecord.settings.randomness}%`;\n  $('generatorSeed').value = generatedRecord.explicitSeed ? generatedRecord.seed : '';\n}\ncacheBoard();\neditionUI();\nif (started)\n  say(\n    recoveryNote ||\n      (state.won\n        ? 'Challenge complete! Play again whenever you like.'\n        : routeClear(state)\n          ? 'Welcome back. The gate is open; reach the top platform.'\n          : 'Welcome back. Your cleared snowballs are right where you left them.'),\n  );\nui();\nrequestAnimationFrame(frame);\n\nsetupFeedback({\n  gym: 'snowpoint',\n  track,\n  beforeOpen: () => {\n    clearInput();\n    if (animation) finishMove();\n    persist();\n    lastFrame = performance.now();\n  },\n  afterClose: () => {\n    lastFrame = performance.now();\n  },\n  context: () => ({\n    ...analyticsDetails(),\n    level_name: level(state.levelId).name,\n    moves: state.moves,\n    player_x: state.x,\n    player_y: state.y,\n    snowball_mask: state.mask,\n    puzzle_state: state,\n    duration_seconds: Math.round(elapsed / 1000),\n    ...(state.levelId === 'generated' && generatedRecord\n      ? { puzzle_seed: generatedRecord.seed, puzzle_settings: generatedRecord.settings }\n      : {}),\n  }),\n});\n\nsaveStore.watch(\n  () => state.levelId,\n  () => {\n    clearInput();\n    $('saveLabel').textContent = 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD';\n    say(SAVE_CONFLICT_MESSAGE);\n  },\n);\n\nwindow.addEventListener('gym-ui-open', () => {\n  clearInput();\n  if (animation) finishMove();\n  persist();\n  lastFrame = performance.now();\n});\nwindow.addEventListener('gym-ui-close', () => {\n  lastFrame = performance.now();\n});\n$('generatorDialog').addEventListener('close', () => {\n  if (generatorWorker) stopGeneration();\n});\n\n$('generatorDialog').addEventListener('gym-dialog-close', () => {\n  if (generatorWorker) stopGeneration();\n});\n\nfunction refreshGeneratorDisclosure() {\n  const details = $('generatorLayoutDetails');\n  if (!details) return;\n  const explicit = $('generatorSeed').value.trim() !== '';\n  $('generatorLayoutSummary').textContent =\n    `${$('generatorRandomness').value}% randomness \u00B7 ${explicit ? 'custom seed' : 'random seed'}`;\n  if (explicit) details.open = true;\n}\nfor (const [id, advice] of Object.entries({\n  generatorBalls: 'Choose 1\u201310 snowballs.',\n  generatorMoves: 'Choose a minimum of 5\u2013120 moves.',\n  generatorRandomness: 'Choose randomness from 0\u2013100%.',\n  generatorSeed: 'Use a seed of at most 64 characters.',\n})) {\n  $(id).addEventListener('input', () => {\n    if (!generatorBusy) $('generatorStatus').textContent = '';\n  });\n  $(id).addEventListener('invalid', () => {\n    $('generatorStatus').textContent = `${advice} Your current puzzle is kept.`;\n  });\n}\nfor (const id of ['generatorSeed', 'generatorRandomness']) {\n  $(id).addEventListener('input', refreshGeneratorDisclosure);\n  $(id).addEventListener('invalid', () => {\n    $('generatorLayoutDetails').open = true;\n  });\n}\nconst refreshGeneratorGuidance = bindGeneratorGuidance('snowpoint', document, (gym, config) => {\n  const result = guidance(gym, config);\n  $('generatorDetailsGuidance').textContent = formatGenerationFailure(\n    result.messages.join(' '),\n    $('generatorSeed').value,\n  );\n  return {\n    ...result,\n    messages:\n      config.minMoves > 40\n        ? ['Larger minimums may take longer or fail. Your requested minimum is never lowered.']\n        : [],\n  };\n});\nrefreshGeneratorDisclosure();\n"],
  "mappings": "AAAA,OAAS,0BAAAA,OAA8B,0CACvC,OAAS,yBAAAC,OAA6B,wCACtC,OAAS,cAAAC,OAAkB,uCAC3B,OAAS,oBAAAC,OAAwB,mCACjC,OAAS,gBAAAC,OAAoB,qCAC7B,OACE,mBAAAC,GACA,oBAAAC,GACA,8BAAAC,GACA,oBAAAC,GACA,mBAAAC,OACK,yCACP,OAAS,kBAAAC,OAAsB,sCAC/B,OAAS,gBAAAC,OAAoB,yCAC7B,OACE,yBAAAC,GACA,2BAAAC,GACA,YAAAC,OACK,8CACP,OAAS,2BAAAC,OAA+B,yCACxC,OAAS,iBAAAC,MAAqB,6CAC9B,OAAS,oBAAAC,OAAwB,uCACjC,OAAS,mBAAAC,GAAiB,yBAAAC,OAA6B,sCACvD,OAAS,uBAAAC,OAA2B,4CACpC,OAAS,mBAAAC,GAAiB,qBAAAC,OAAyB,uCACnD,OAAS,qBAAAC,GAAmB,kBAAAC,OAAsB,8CAClD,OAAS,iBAAAC,OAAqB,oCAC9B,OACE,WAAAC,GACA,QAAAC,GACA,SAAAC,GACA,UAAAC,GACA,QAAAC,GACA,QAAAC,GACA,eAAAC,EACA,cAAAC,GACA,YAAAC,GACA,YAAAC,GACA,WAAAC,GACA,KAAAC,GACA,KAAAC,OACK,kCACP,OAAS,SAAAC,GAAO,aAAAC,GAAW,KAAAC,MAAS,kCACpC,OAAS,UAAAC,GAAQ,UAAAC,OAAc,kCAC/B,OAAS,UAAAC,EAAQ,SAAAC,EAAO,UAAAC,EAAQ,oBAAAC,OAAwB,kCACxD,OAAS,YAAAC,GAAU,kBAAAC,GAAgB,gBAAAC,GAAc,kBAAAC,OAAsB,iCACvE,OAAS,eAAAC,GAAa,eAAAC,GAAa,qBAAAC,GAAmB,iBAAAC,OAAqB,qCAC3E,OAAS,uBAAAC,OAA2B,oCACpC,OAAS,mBAAAC,OAAuB,qCAChC,MAAMC,GAAsB3C,GAAwB,EAC9C4C,EAAQF,GAAgB,WAAW,EACnCG,EAAKC,GAAO,SAAS,eAAeA,CAAE,EAC1CC,EAASF,EAAE,MAAM,EACjBG,GAAMD,EAAO,WAAW,IAAI,EACxBE,GAAO,CAAC,GAAG,SAAS,iBAAiB,YAAY,CAAC,EAClDC,GAAS,CAAE,GAAI,SAAK,MAAO,SAAK,KAAM,SAAK,KAAM,QAAI,EAC3D,IAAIC,EAAQxC,GAAQ,EAClByC,EAAS,CAAE,GAAGD,CAAM,EACpBE,EAAU,CAAC,EACXC,EAAU,GACVC,EAAM,GACNC,EAAM,KACJC,EAAY,KACdC,EAAY,CAAC,EACbC,EAAO,KACPC,EAAU,KACVC,GAAQ,GACRC,EAAQ,KACNC,EAAU,EACZC,EAAY,YAAY,IAAI,EAC5BC,GAAW,EACXC,EAAS,KACTC,GAAe,GACjB,MAAMC,GAAa,yCACnBnF,GAAuB,EACvB,MAAMoF,EAAYlE,GAAgBiE,EAAU,EAC5C,IAAIE,EAAkB,KACpBC,EAAiB,GACjBC,EAAkB,KAClBC,EAAgB,GAChBC,EAAa,KACf,MAAMC,GAAW,CAAE,QAAS,UAAW,OAAQ,cAAe,EAC9D,IAAIC,EAAQ,CAAC,EACXC,GAAgB,CAAC,EACjBC,GAAQ,KACNC,GAAW,KACf,MAAMC,EAAO,IAAI/C,GACXgD,GAAa,IAAI9F,GACvB,IAAI+F,EAAoB,GACxB,MAAMC,EAAQ,IAAIjD,GAAekD,EAAW,EACtCC,GAAQ,IAAMtD,EAAOoB,EAAM,OAAO,EAAE,QAAQ,OAChDmC,EAAW,IAAMvD,EAAOoB,EAAM,OAAO,EAAE,SACnCoC,EAAarG,GAAsB,EACnCsG,EAAmB,KAAO,CAC9B,SAAUrC,EAAM,QAChB,KAAMrB,EAAMqB,EAAM,OAAO,EAAE,KAC3B,WAAYrB,EAAMqB,EAAM,OAAO,EAAE,YAAc,SACjD,GAEA,SAASsC,GAAcC,EAAG,CACxB,OACE,OAAO,UAAUA,GAAG,CAAC,GAAK,OAAO,UAAUA,GAAG,CAAC,GAAKA,EAAE,GAAK,GAAKA,EAAE,EAAIpE,IAAKoE,EAAE,GAAK,GAAKA,EAAE,EAAInE,EAEjG,CACA,SAASoE,GAAUD,EAAG,CACpB,OAAO,OAAO,UAAUA,GAAG,IAAI,GAAKA,EAAE,MAAQ,GAAKA,EAAE,KAAO,GAAK3D,EAAO2D,EAAE,OAAO,EAAE,QAAQ,MAC7F,CACA,SAASE,GAAUF,EAAG,CACpB,MAAMG,EAAO,CACX,QAAS/D,EAAM4D,EAAE,OAAO,EAAE,GAC1B,EAAGA,EAAE,EACL,EAAGA,EAAE,EACL,KAAMA,EAAE,KACR,MAAO,OAAO,UAAUA,EAAE,KAAK,EAAI,KAAK,IAAI,EAAGA,EAAE,KAAK,EAAI,EAC1D,IAAK,EACP,EACA,OACE1E,GAAK6E,EAAK,EAAGA,EAAK,EAAGA,EAAK,OAAO,IAAM,QACtCA,EAAK,GAAK,GAAKA,EAAK,GAAK,IAAMA,EAAK,GAAK,GAAK,CAAC3E,GAAW2E,CAAI,KAE/DA,EAAK,EAAI,GACTA,EAAK,EAAI,IAEXA,EAAK,IAAM1E,GAAS0E,CAAI,EACjBA,CACT,CACA,SAASC,GAAShD,EAAI,CACpB,MAAMiD,EAAQnB,EAAM9B,CAAE,EAKtB,GAJAK,EAAQxC,GAAQmC,CAAE,EAClBO,EAAU,CAAC,EACXU,EAAU,EACVT,EAAU,GACNyC,EAAO,CACT,MAAMC,EAAM,CAAE,GAAGD,EAAM,MAAO,QAASjD,CAAG,EACtC2C,GAAcO,CAAG,GAAKL,GAAUK,CAAG,IACrC7C,EAAQyC,GAAUI,CAAG,GACjB7C,EAAM,IAAM6C,EAAI,GAAK7C,EAAM,IAAM6C,EAAI,KACvC7B,GAAe,gEACjBJ,EAAU,OAAO,SAASgC,EAAM,OAAO,EAAI,KAAK,IAAI,EAAGA,EAAM,OAAO,EAAI,EACxEzC,EAAUyC,EAAM,UAAY,GAC5B1C,EAAU,MAAM,QAAQ0C,EAAM,OAAO,EACjCA,EAAM,QACH,IAAKL,IAAO,CAAE,GAAGA,EAAG,QAAS5C,CAAG,EAAE,EAClC,OAAQ4C,GAAMD,GAAcC,CAAC,GAAKC,GAAUD,CAAC,CAAC,EAC9C,IAAIE,EAAS,EACb,MAAM,IAAI,EACb,CAAC,EAET,CACAxC,EAAS,CAAE,GAAGD,CAAM,CACtB,CACA,GAAI,CACF,MAAM4C,EAAQ3G,GAAiBiF,EAAU,KAAK,EAAGxC,CAAM,EACvDyC,EAAkByB,GAAO,WAAa,KACtC,MAAME,EAAWzD,GAAc8B,CAAe,EAC1C2B,IACFjE,GAAiBiE,EAAS,MAAO3B,CAAe,EAChDC,EAAiB,IAEnB,MAAM2B,EAAWzD,GAAoBsD,CAAK,EAC1CnB,EAAQsB,EAAS,MAEbH,GAAO,OAAS,OAAO,OAAOA,EAAM,MAAO,WAAW,IACxDnB,EAAM,UAAYmB,EAAM,MAAM,WAChClB,GAAgBqB,EAAS,SACrBA,EAAS,WAAa,aAAeC,GAAqB,EAAGC,GAAkB,EAC9EN,GAASI,EAAS,WAAa,YAAcrE,EAAO,CAAC,EAAE,GAAKqE,EAAS,QAAQ,CACpF,MAAQ,CAAC,CACT,MAAMG,GAAgBzG,GAAa,EACnC,SAAS0G,IAAa,CACpBxB,GAAQuB,GAActE,EAAOoB,EAAM,OAAO,EAAG,QAAS,IAAM,CAC1D,MAAMoD,EAAI,SAAS,cAAc,QAAQ,EACzC,OAAAA,EAAE,MAAQjF,GAAII,EACd6E,EAAE,OAAShF,GAAIG,EACfD,GAAU8E,EAAE,WAAW,IAAI,EAAGpD,EAAM,OAAO,EACpCoD,CACT,CAAC,CACH,CACA,SAASC,GAAkBC,EAAO,CAChC,OAAOA,IAAU,EAAI,eAAiB,OAAOA,CAAK,YACpD,CACA,SAASC,IAAY,CACnB,MAAMC,EAAI7E,EAAMqB,EAAM,OAAO,EAC7BN,EAAE,aAAa,EAAE,MAAQ8D,EAAE,GAC3B9D,EAAE,eAAe,EAAE,SAAW,CAAC0B,EAC/B1B,EAAE,uBAAuB,EAAE,OAAS,CAACyB,GAAmBnB,EAAM,UAAY,YAC1EN,EAAE,aAAa,EAAE,OAAS8D,EAAE,OAAS,YACrC,SAAW,CAACC,EAAM9D,CAAE,IAAK,OAAO,QAAQ,CACtC,QAAS,cACT,OAAQ,aACR,UAAW,eACb,CAAC,EACCD,EAAEC,CAAE,EAAE,aAAa,eAAgB,OAAO6D,EAAE,OAASC,CAAI,CAAC,EACxDD,EAAE,OAAS,cAAahC,GAASgC,EAAE,IAAI,EAAIA,EAAE,IACjD9D,EAAE,WAAW,EAAE,YAAc8D,EAAE,KAC/B9D,EAAE,aAAa,EAAE,YAAc8D,EAAE,UACjC9D,EAAE,iBAAiB,EAAE,YAAcvD,GAAgBqH,CAAC,EACpD9D,EAAE,YAAY,EAAE,YAAc8D,EAAE,OAAS,UAAYA,EAAE,KAAO,uBAC9D9D,EAAE,kBAAkB,EAAE,YACpB8D,EAAE,OAAS,UACP,GAAGA,EAAE,UAAU,eAAYH,GAAkBlB,EAAS,CAAC,CAAC,wBACxD,4EACNzC,EAAE,cAAc,EAAE,YAChB8D,EAAE,OAAS,UAAY,oBAAsB,0BAC/C9D,EAAE,eAAe,EAAE,YAAc,KAAK,OAAOyC,EAAS,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,GACzEzC,EAAE,UAAU,EAAE,YACZ8D,EAAE,OAAS,UACP,SAASH,GAAkBlB,EAAS,CAAC,CAAC,4EAA4EqB,EAAE,GAAG,UACvH,aAAarB,EAAS,CAAC,2EAA2ED,GAAM,EAAIC,EAAS,CAAC,gCAC5H,SAAS,gBAAgB,MAAM,YAAY,SAAUqB,EAAE,MAAM,EAC7D,MAAME,EAAUhF,EAAO,OAAQ8E,GAAMlG,GAAekG,EAAG/B,EAAM+B,EAAE,EAAE,CAAC,CAAC,EAAE,OACrE9D,EAAE,iBAAiB,EAAE,YACnB,GAAGgE,CAAO,MAAMhF,EAAO,MAAM,IAAIsB,EAAM,UAAY,YAAc,2BAA6B,SAAS,GACzG,MAAM0C,EAAOhE,GAAQA,EAAO,UAAW8E,GAAMA,EAAE,KAAOxD,EAAM,OAAO,EAAI,GAAKtB,EAAO,MAAM,EACzFgB,EAAE,YAAY,EAAE,YACd8D,EAAE,OAAS,YAAc,yBAAsB,SAASd,EAAK,IAAI,SACrE,CACA,SAASM,IAAuB,CAC9B,MAAMW,EAAMlC,EAAM,UAClB,GACE,CAACL,GACD,CAACuC,GACD,CAAC,OAAO,SAASA,EAAI,OAAO,GAC5BA,EAAI,QAAU,GACd,OAAOA,EAAI,SAAY,WACvB,CAAC,MAAM,QAAQA,EAAI,OAAO,GAC1BA,EAAI,QAAQ,OAAS,IAErB,MAAO,GACT,MAAMC,EAASrB,GACbA,GAAG,UAAY,aACfD,GAAcC,CAAC,GACfC,GAAUD,CAAC,GACX,OAAO,UAAUA,EAAE,KAAK,GACxBA,EAAE,OAAS,GACX,OAAOA,EAAE,KAAQ,WACjB,CAAC,UAAW,IAAK,IAAK,OAAQ,QAAS,KAAK,EAAE,MAAOsB,GAAQpB,GAAUF,CAAC,EAAEsB,CAAG,IAAMtB,EAAEsB,CAAG,CAAC,EAC3F,OAAOD,EAAMD,EAAI,KAAK,GAAKA,EAAI,QAAQ,MAAMC,CAAK,CACpD,CACA,SAASX,IAAoB,CAC3B,MAAMU,EAAMlC,EAAM,UAClBzB,EAAQ,CAAE,GAAG2D,EAAI,KAAM,EACvBzD,EAAUyD,EAAI,QAAQ,IAAKpB,IAAO,CAAE,GAAGA,CAAE,EAAE,EAC3C3B,EAAU+C,EAAI,QACdxD,EAAUwD,EAAI,QACd1D,EAAS,CAAE,GAAGD,CAAM,CACtB,CACA,SAAS8D,GAAYnE,EAAI,CACvB,GAAIuB,EAAU,WAAY,MAAO,GACjC,GAAIvB,IAAO,YAAa,CACtB,GAAI,CAACuB,EAAU,eAAe,EAC5B,OAAA6C,EAAI9G,EAAqB,EAClB,GAET,GAAI,CAAC+F,GAAqB,EACxB,OAAAe,EACE,6FACF,EACO,EAEX,CAMA,GALAhC,EAAoB,GACpBrC,EAAE,cAAc,EAAE,QAAU,GAC5BsE,EAAW,EACP1D,GAAW2D,EAAW,EAC1BC,EAAQ,EACJhD,EAAU,WAAY,MAAO,GACjC,GAAIvB,IAAO,aAAe,CAACuB,EAAU,eAAe,EAClD,OAAA6C,EAAI9G,EAAqB,EAClB,GAETqD,EAAY,KACZC,EAAY,CAAC,EACbC,EAAO,KACPO,EAAS,KACTV,EAAM,KACNW,GAAe,GACf,MAAMmD,EAASxF,EAAMgB,CAAE,EAAE,GACzB,OAAIwE,IAAW,cAAa1C,EAAM0C,CAAM,EAAIjD,EAAU,QAAQiD,CAAM,EAAE,MAAMA,CAAM,GAClFpC,EAAoB,GAChBoC,IAAW,YAAalB,GAAkB,EACzCN,GAASwB,CAAM,EACpBhB,GAAW,EACXI,GAAU,EACVa,EAAG,EACHF,EAAQ,EACRzE,EAAM,qBAAsB4C,EAAiB,CAAC,EAC9C0B,EACE/D,EAAM,IACF,0DACAG,EACE,0DACAxB,EAAMgB,CAAE,EAAE,IAClB,EACO,EACT,CACA,SAASoE,EAAIM,EAAS,CACpB9H,GACEmD,EAAE,SAAS,EACXwB,EAAU,WAAajE,GAAwBoH,EAC/CnD,EAAU,UACZ,CACF,CACA,SAASoD,IAAW,CAClB,MAAMC,EAAU,KAAK,MAAM3D,EAAU,GAAI,EACzC,MAAO,GAAG,OAAO,KAAK,MAAM2D,EAAU,EAAE,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAU,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EACtG,CACA,SAASC,GAASC,EAAOzE,EAAM,KAAM,CACnCN,EAAE,QAAQ,EAAE,YAAc,OAAO5B,EAAY,CAAE,GAAGkC,EAAO,KAAAyE,CAAK,CAAC,CAAC,EAAE,SAAS,EAAG,GAAG,EACjF/E,EAAE,UAAU,EAAE,YAAc,GAAG/B,GAAO,CAAE,KAAA8G,CAAK,CAAC,CAAC,MAAMvC,GAAM,CAAC,GAC5DxC,EAAE,cAAc,EAAE,MAAM,MAAQ,GAAI5B,EAAY,CAAE,GAAGkC,EAAO,KAAAyE,CAAK,CAAC,EAAItC,EAAS,EAAK,GAAG,GACzF,CACA,SAASuC,IAAU,CACjBhF,EAAE,aAAa,EAAE,OAAS,CAACe,EAC3Bf,EAAE,aAAa,EAAE,YAAce,EAC3B,eAAeA,EAAQ,QAAQ,WAAY,KAAK,EAAE,YAAY,CAAC,IAAIV,GAAOU,CAAO,CAAC,GAClF,GACJX,GAAK,QAAS6E,GAAM,CAClBA,EAAE,SAAW3E,EAAM,IACnB2E,EAAE,UAAU,OAAO,YAAalE,IAAYkE,EAAE,QAAQ,GAAG,EACzDA,EAAE,UAAU,OACV,YACA3C,EAAM,OAAS2C,EAAE,QAAQ,KAAQ,CAAC,CAACrE,GAAaD,IAAQsE,EAAE,QAAQ,GACpE,CACF,CAAC,CACH,CACA,SAASP,GAAK,CACZ5E,GAAoB,CAClB,KAAMb,EAAMqB,EAAM,OAAO,EAAE,KAC3B,MAAAA,EACA,MAAO7B,GACP,OAAQC,GACR,KAAM,CAACwG,EAAGC,IAAM,CACd,GAAI5G,GAAS,CAAE,EAAA2G,EAAG,EAAAC,CAAE,CAAC,EAAG,MAAO,kCAC/B,MAAMlD,EAAQ/C,EAAOoB,EAAM,OAAO,EAChC8E,EAAInD,EAAM,QAAQ,UAAU,CAAC,CAACoD,EAAIC,CAAE,IAAMD,IAAOH,GAAKI,IAAOH,CAAC,EAC1DI,EAAOtD,EAAM,MAAM,IAAI,GAAGiD,CAAC,IAAIC,CAAC,EAAE,EACxC,OAAOC,GAAK,GAAK,EAAE9E,EAAM,KAAQ,GAAK8E,GAClC,GAAGnD,EAAM,UAAa,GAAKmD,EAAK,WAAa,UAAU,sCACvDG,EACE,kBAAkBA,CAAI,kCACtBpH,GAAK+G,EAAGC,EAAG7E,EAAM,OAAO,CAChC,EACA,WAAY,CAAC,+BAA+BlC,EAAYkC,CAAK,CAAC,OAAOmC,EAAS,CAAC,EAAE,CACnF,CAAC,EACDzC,EAAE,mBAAmB,EAAE,UAAYrC,GACjC2C,EAAM,UAAY,YAAc,CAAC,GAAGtB,EAAQC,EAAMqB,EAAM,OAAO,CAAC,EAAItB,EACpE,CACE,GAAG+C,EACH,CAACzB,EAAM,OAAO,EAAG,CACf,GAAGyB,EAAMzB,EAAM,OAAO,EACtB,SAAUrB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAC3C,MAAAA,EACA,QAAAG,CACF,CACF,EACAH,EAAM,OACR,EACA,MAAMkF,EAAQ1I,GAAe,YAAakC,EAAQ,CAChD,GAAG+C,EACH,CAACzB,EAAM,OAAO,EAAG,CACf,GAAGyB,EAAMzB,EAAM,OAAO,EACtB,SAAUrB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAC3C,MAAAA,EACA,QAAAG,CACF,CACF,CAAC,EACDqE,GAAS,EACT9E,EAAE,OAAO,EAAE,YAAc,OAAOM,EAAM,KAAK,EAC3CN,EAAE,OAAO,EAAE,YAAc4E,GAAS,EAClC5E,EAAE,YAAY,EAAE,SAAW,CAACQ,EAAQ,QAAUF,EAAM,IACpDN,EAAE,YAAY,EAAE,SAAW,CAAC,CAACY,GAAaN,EAAM,IAChDN,EAAE,WAAW,EAAE,YAAcM,EAAM,IAC/B,oBACAM,EACE,gBACAH,EACE,iBACA,qBACRT,EAAE,cAAc,EAAE,OAASS,EAC3BT,EAAE,YAAY,EAAE,OAAS,CAACM,EAAM,KAAO,CAAC+B,EACxCrC,EAAE,UAAU,EAAE,YAAc,qBACxBM,EAAM,MACRN,EAAE,UAAU,EAAE,YACZ,GAAG/B,GAAOqC,CAAK,CAAC,IAAIrC,GAAOqC,CAAK,IAAM,EAAI,WAAa,WAAW,SAAMA,EAAM,KAAK,IAAIA,EAAM,QAAU,EAAI,OAAS,OAAO,SAAMsE,GAAS,CAAC,IAC/IlI,GAAiB,CACf,OAAQsC,EACR,MAAO,CACL,GAAG+C,EACH,CAACzB,EAAM,OAAO,EAAG,CACf,GAAGyB,EAAMzB,EAAM,OAAO,EACtB,SAAUrB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAC3C,MAAAA,EACA,QAAAG,EACA,QAAAD,CACF,CACF,EACA,SAAUF,EAAM,QAChB,KAAM,CAAE,MAAAA,EAAO,QAAAG,EAAS,QAAAD,CAAQ,EAChC,QAAS6B,EACT,MAAAmD,EACA,KAAM,CAAC,CAAC5E,CACV,CAAC,EACDoE,GAAQ,CACV,CACA,SAASR,GAAU,CACjBzC,EAAMzB,EAAM,OAAO,EAAI,CACrB,GAAIA,EAAM,UAAY,YAClByB,EAAM,UACNA,EAAMzB,EAAM,OAAO,GAAG,UAAY,GAChC,CAAE,QAAS,EAAK,EAChB,CAAC,EACP,MAAO,CAAE,GAAGA,CAAM,EAClB,QAAAY,EACA,QAAAT,EACA,SAAUxB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAC3C,QAASE,EAAQ,MAAM,IAAI,CAC7B,EACA,GAAI,CACF,MAAMiF,EAASjE,EAAU,MACvB,CACE,QAAS,EACT,UAAWC,EACX,SAAUO,GACV,SAAU1B,EAAM,QAChB,MAAAyB,EACA,MAAAzB,EACA,QAAAY,EACA,QAAAT,EACA,QAASD,EAAQ,MAAM,IAAI,CAC7B,EACAF,EAAM,OACR,EACImF,EAAO,SAAW,YAAYpB,EAAI9G,EAAqB,EACvDkI,EAAO,SAAW,UACpBzF,EAAE,WAAW,EAAE,YACbyF,EAAO,SAAW,WAAa,0CAAuC,eAC5E,MAAQ,CACNzF,EAAE,WAAW,EAAE,YAAc,cAC/B,CACF,CACA,SAAS0F,EAAKC,EAAMC,EAAW,IAAMC,EAAO,SAAUC,EAAS,KAAOC,EAAS,CAC7E,GAAK/E,GACL,GAAI,CACFC,IAAU,IAAK,OAAO,cAAgB,OAAO,oBACzCA,EAAM,QAAU,aAAaA,EAAM,OAAO,EAC9C,MAAM+E,EAAI/E,EAAM,iBAAiB,EAC/B6C,EAAI7C,EAAM,WAAW,EACvB+E,EAAE,KAAOH,EACTG,EAAE,UAAU,eAAeL,EAAM1E,EAAM,WAAW,EAC9C8E,GAASC,EAAE,UAAU,6BAA6BD,EAAS9E,EAAM,YAAc2E,CAAQ,EAC3F9B,EAAE,KAAK,eAAegC,EAAQ7E,EAAM,WAAW,EAC/C6C,EAAE,KAAK,6BAA6B,KAAQ7C,EAAM,YAAc2E,CAAQ,EACxEI,EAAE,QAAQlC,CAAC,EACXA,EAAE,QAAQ7C,EAAM,WAAW,EAC3B+E,EAAE,MAAM,EACRA,EAAE,KAAK/E,EAAM,YAAc2E,CAAQ,CACrC,MAAQ,CAAC,CACX,CACA,SAASK,IAAQ,CACf/F,EAAO,QAAQ,CAAE,cAAe,EAAK,CAAC,EAClC,CAACO,GAAW,CAACH,EAAM,KACrBP,EAAM,oBAAqB,CAAE,GAAG4C,EAAiB,EAAG,QAAS,OAAQ,CAAC,EACxElC,EAAU,GACV4D,EACEnF,EAAOoB,EAAM,OAAO,EAAE,OAClB,gFACA,mDACN,EACAoE,EAAG,EACHF,EAAQ,CACV,CACA,SAAS0B,GAAM,EAAG,CAChB,GAAI,CAAA9I,EAAc,EAClB,CAAAsI,EAAK,IAAK,IAAM,WAAY,KAAO,GAAG,EACtC,QAASN,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,MAAMe,EAAI,KAAK,OAAO,EAAI,KAAK,GAAK,EAClCtD,EAAI,GAAK,KAAK,OAAO,EAAI,GAC3BhC,EAAU,KAAK,CACb,EAAG,EAAE,EAAIhC,EAAI,EACb,EAAG,EAAE,EAAIA,EAAI,EACb,GAAI,KAAK,IAAIsH,CAAC,EAAItD,EAClB,GAAI,KAAK,IAAIsD,CAAC,EAAItD,EAAI,GACtB,KAAM,GAAM,KAAK,OAAO,EAAI,GAC5B,KAAM,KAAK,OAAO,EAAI,GAAM,EAAI,EAChC,MAAOuC,EAAI,EAAI,UAAY,SAC7B,CAAC,CACH,EACF,CACA,SAASd,GAAa,CACpBzC,GAAY,UAAU,EACtBA,EAAa,KACbd,EAAU,KACVoB,EAAK,MAAM,EACXG,EAAM,MAAM,EACZJ,IAAU,MAAM,EAChB8C,GAAQ,CACV,CACA,MAAMoB,GACJ,iFACF,SAASC,GAAkBZ,EAAQ,CACjC,OAAOA,EAAO,OAAO,KAClBa,GAAUA,EAAM,OAAS,QAAUpH,EAAOoB,EAAM,OAAO,EAAE,MAAM,IAAI,GAAGgG,EAAM,CAAC,IAAIA,EAAM,CAAC,EAAE,CAC7F,CACF,CACA,SAAS/D,GAAYgE,EAAGC,EAAW,GAAO,CACxC,GAAIhF,EAAU,YAAckB,EAAW,GAAK,CAACxE,GAAKqI,CAAC,GAAKjG,EAAM,IAAK,OAInE,GAHAuB,GAAY,UAAU,EACtBA,EAAa,KACRpB,GAASwF,GAAM,EAChBrF,EAAW,CACR4F,IACHrE,EAAK,KAAKoE,CAAC,EACXxF,EAAUoB,EAAK,MAAM,CAAC,GAAK,KAC3B6C,GAAQ,GAEV,MACF,CACArE,EAAM4F,EACNzF,EAAO,KACP,MAAM2E,EAAS1H,GAAKuC,EAAOiG,CAAC,EAC5B,GAAI,CAACd,EAAO,KAAK,OAAQ,CACnBA,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,MAAM,EAC7CpC,EACE,sBAAsB5B,EAAS,EAAIrE,EAAYkC,CAAK,CAAC,0BAA0BmC,EAAS,EAAIrE,EAAYkC,CAAK,IAAM,EAAI,GAAK,GAAG,GACjI,EACOmF,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,MAAM,EAClDpC,EAAI,8DAA8D,EAC3DgC,GAAkBZ,CAAM,EAAGpB,EAAI+B,EAAiB,EACpD/B,EAAI,6DAA6D,EACtEqB,EAAK,IAAK,IAAM,UAAU,EAC1B,MAAMgB,EAAUvE,EAAK,MAAM,EAC3BpB,EAAUoB,EAAK,MAAM,CAAC,GAAK,KAC3B6C,GAAQ,EACJ0B,GAASnE,GAAYmE,CAAO,EAChC,MACF,CACAlG,EAAQ,KAAK,CAAE,GAAGF,CAAM,CAAC,EACrBE,EAAQ,OAAS,KAAKA,EAAQ,MAAM,EACxCI,EAAY9B,GAAO2G,EAAQnF,EAAO,YAAY,IAAI,CAAC,EAC/ClD,EAAc,GAAGmH,EAAW,EAChCG,EAAG,EACHgB,EAAK,IAAK,GAAK,WAAY,KAAO,GAAG,CACvC,CACA,SAASnB,GAAa,CACpB,KAAM,CAAE,OAAAkB,CAAO,EAAI7E,EACnBN,EAAQmF,EAAO,MACfpD,EAAoB/B,EAAM,IAC1BC,EAAS,CAAE,GAAGD,CAAM,EACpBM,EAAY,KACRN,EAAM,KACRP,EAAM,sBAAuB,CAC3B,GAAG4C,EAAiB,EACpB,MAAOrC,EAAM,MACb,iBAAkB,KAAK,MAAMY,EAAU,GAAI,CAC7C,CAAC,EACDoD,EAAW,EACXD,EAAI,iDAAiD,EACrD,CAAC,IAAK,IAAK,IAAK,IAAI,EAAE,QAAQ,CAACsC,EAAGvB,IAChC,WAAW,IAAMM,EAAKiB,EAAG,IAAM,WAAY,GAAI,EAAGvB,EAAI,GAAG,CAC3D,GACS/G,GAAWiC,CAAK,EACzB+D,EAAI,kEAAkE,EAC/DoB,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,MAAM,EAClDpC,EACE,kBAAkB5B,EAAS,EAAIrE,EAAYkC,CAAK,CAAC,0BAA0BmC,EAAS,EAAIrE,EAAYkC,CAAK,IAAM,EAAI,GAAK,GAAG,WAC7H,EACOmF,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,OAAO,EACnDpC,EACE,GAAGjG,EAAYkC,CAAK,CAAC,OAAOmC,EAAS,CAAC,IAAIvD,EAAOoB,EAAM,OAAO,EAAE,OAAS,YAAc,iBAAiB,iCAC1G,EACOmF,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,MAAM,EAClDpC,EAAI,iEAAiE,EAC9DgC,GAAkBZ,CAAM,EAAGpB,EAAI+B,EAAiB,EAChDX,EAAO,OAAO,KAAMgB,GAAMA,EAAE,OAAS,MAAM,EAClDpC,EAAI,+DAA+D,EAEnEA,EACElG,GAAKmC,EAAM,EAAGA,EAAM,EAAGA,EAAM,OAAO,IAAM,OACtC,wDACA,+CACN,EACF,MAAM0C,EAAOb,EAAK,MAAM,EACxBpB,EAAUoB,EAAK,MAAM,CAAC,GAAK,KAC3BuC,EAAG,EACHF,EAAQ,EACJlE,EAAM,MACRuD,GAAU,EACVa,EAAG,EACH1E,EAAE,YAAY,EAAE,QAAQ,CAAE,cAAe,EAAK,CAAC,GAE7CgD,GAAQ,CAAC1C,EAAM,KAAKiC,GAAYS,CAAI,CAC1C,CACA,SAAS4D,IAAO,CACVpF,EAAU,YACV,CAAChB,EAAQ,QAAUF,EAAM,MAC7BgE,EAAW,EACX1D,EAAY,KACZN,EAAQE,EAAQ,IAAI,EACpBD,EAAS,CAAE,GAAGD,CAAM,EACpBQ,EAAO,KACPD,EAAY,CAAC,EACbwD,EAAI,sDAAsD,EAC1DhC,EAAoB,GACpBqC,EAAG,EACHF,EAAQ,EACRkB,EAAK,IAAK,IAAM,UAAU,EAC5B,CACA,SAASmB,IAAQ,CACXrF,EAAU,aACdO,EAAMzB,EAAM,OAAO,EAAI,CACrB,GAAGyB,EAAMzB,EAAM,OAAO,EACtB,QAAS1C,GAAeqB,EAAMqB,EAAM,OAAO,EAAG,CAC5C,GAAGyB,EAAMzB,EAAM,OAAO,EACtB,SAAUrB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAC3C,MAAAA,CACF,CAAC,CACH,EACAgE,EAAW,EACXhE,EAAQxC,GAAQwC,EAAM,OAAO,EAC7BC,EAAS,CAAE,GAAGD,CAAM,EACpBE,EAAU,CAAC,EACXI,EAAY,KACZC,EAAY,CAAC,EACbC,EAAO,KACPI,EAAU,EACVT,EAAU,GACVE,EAAM,KACNU,EAAS,KACTgD,EAAI,iEAAiE,EACrEhC,EAAoB,GACpBqC,EAAG,EACHF,EAAQ,EACRX,GAAU,EACV9D,EAAM,oBAAqB,CAAE,GAAG4C,EAAiB,EAAG,QAAS,SAAU,CAAC,EAC1E,CACA,SAASmE,IAAmB,CACtBtF,EAAU,YACVlB,EAAM,MACVgE,EAAW,EACP1D,GAAW2D,EAAW,EACtB,EAAA/C,EAAU,YAAclB,EAAM,OAClCE,EAAQ,KAAK,CAAE,GAAGF,CAAM,CAAC,EACzBA,EAAQ9B,GAAQ8B,CAAK,EACrBC,EAAS,CAAE,GAAGD,CAAM,EACpBO,EAAY,CAAC,EACbC,EAAO,KACPO,EAAS,KACTZ,EAAU,GACV4D,EAAI,qEAAqE,EACzEhC,EAAoB,GACpBqC,EAAG,EACHF,EAAQ,GACV,CACA,SAASuC,GAAYC,EAAOC,EAAW,GAAO,CAC5C,GACE,CAACA,GACDD,GAAO,QACP,CAAC5E,GAAW,SACVlD,EAAOoB,EAAM,OAAO,EACpBA,EACA,CAAE,OAAQ,KAAM,MAAA0G,CAAM,EACtB,CAACE,EAAMC,IAAeA,IAAc,SAAW3I,GAAQ0I,CAAI,EAAInJ,GAAKmJ,EAAMC,CAAS,EAAE,KACvF,EACA,CACA9C,EAAI,sEAAsE,EAC1E,MACF,CACA,GAAI,CAAC2C,GAAO,OAAQ,CAClB3C,EAAI,sCAAsC,EAC1C,MACF,CACA,MAAMkC,EAAIS,EAAM,CAAC,EACjB,GAAIT,IAAM,SAAU,CAClBzF,EAAO,KACPuD,EAAI,4DAA4D,EAChE,MACF,CACA,KAAM,CAAC+C,EAAIC,CAAE,EAAInJ,GAAKqI,CAAC,EACvBzF,EAAO,CAAE,EAAGR,EAAM,EAAI8G,EAAI,EAAG9G,EAAM,EAAI+G,EAAI,MAAO,YAAY,IAAI,EAAI,GAAK,EAC3EhD,EACE,OAAOkC,EAAE,YAAY,CAAC,IAAIlG,GAAOkG,CAAC,CAAC,KAAKlI,GAAWiC,CAAK,EAAI,0CAA4C,yDAAyD,EACnK,EACAoF,EAAK,IAAK,IAAM,MAAM,CACxB,CACA,SAAS4B,IAAW,CAClB,GAAI9F,EAAU,YAAcZ,GAAaN,EAAM,KAAOoC,EAAW,EAAG,OAC/DjC,GAASwF,GAAM,EACpBlG,EAAM,iBAAkB4C,EAAiB,CAAC,EAC1C,MAAM4E,EAASnF,GAAW,IAAIlD,EAAOoB,EAAM,OAAO,EAAGA,CAAK,EAC1D,GAAIiH,EAAQ,CACVR,GAAYQ,EAAO,MAAO,EAAI,EAC9B,MACF,CACA,GAAIjH,EAAM,UAAY,YAAa,CACjCuB,GAAY,UAAU,EACtBA,EAAa,KACb,MAAM2F,EAAW,KAAK,UAAUlH,CAAK,EACrC,GAAI,CACF,MAAMmH,EAAOpK,GAAiB,IAAI,IAAI,4CAA6C,YAAY,GAAG,CAAC,EACnGwE,EAAa4F,EACbpD,EAAI,8BAAyB,EAC7BoD,EAAK,UAAahB,GAAM,CACtBgB,EAAK,UAAU,EACX5F,IAAe4F,IACnB5F,EAAa,KACT,KAAK,UAAUvB,CAAK,IAAMkH,GAAUT,GAAYN,EAAE,KAAK,QAAQ,KAAK,EAC1E,EACAgB,EAAK,QAAU,IAAM,CACnBA,EAAK,UAAU,EACX5F,IAAe4F,IACnB5F,EAAa,KACbwC,EAAI,gEAAgE,EACtE,EACAoD,EAAK,YAAY,CACf,KAAM,OACN,MAAOhI,GAAYP,EAAOoB,EAAM,OAAO,CAAC,EACxC,MAAO,CAAE,GAAGA,CAAM,CACpB,CAAC,CACH,MAAQ,CACNuB,GAAY,UAAU,EACtBA,EAAa,KACbwC,EACE,8FACF,CACF,CACF,MACE0C,GACE/I,GAAMsC,EAAO,KAAQ,CAAE,SAAU,EAAM,CAAC,GAAKtC,GAAMsC,EAAO,KAAQ,CAAE,SAAU,EAAK,CAAC,CACtF,CACJ,CACA,SAASoH,IAAY,CACnBhH,EAAM,CAACA,EACPW,EAAS,KACTnB,EAAO,MAAQQ,EAAM,IAAM,IAC3BR,EAAO,OAASQ,EAAM,IAAM,IAC5BjD,GAAgBuC,EAAE,WAAW,EAAGU,CAAG,EACnC,SAAS,cAAc,UAAU,EAAE,UAAU,OAAO,aAAcA,CAAG,CACvE,CACA,SAASiH,GAAMC,EAAK,CAClB,MAAMC,EAAQrL,GAAaoL,EAAKzG,CAAS,EAAI,IAC3C2G,EAAK,KAAK,IAAID,EAAO,EAAG,EAC1B1G,EAAYyG,EACRnH,GAAW,CAACH,EAAM,KAAO,SAAS,kBAAoB,UAAY,CAACoC,EAAW,IAChFxB,GAAW2G,EAAQ,KACrBhH,EAAU,QAASkH,GAAM,CACvBA,EAAE,MAAQD,EACVC,EAAE,GAAKA,EAAE,GAAKD,EACdC,EAAE,GAAKA,EAAE,GAAKD,EACdC,EAAE,IAAM,GAAKD,CACf,CAAC,EACDjH,EAAYA,EAAU,OAAQkH,GAAMA,EAAE,KAAO,CAAC,EAC1C3K,EAAc,IAChByD,EAAY,CAAC,EACTD,GAAW2D,EAAW,GAE5B,IAAIyD,EAAa1H,EACf2H,EAAU,GACZ,GAAIrH,EAAW,CACb,MAAMuF,EAAIvF,EACRiC,EAAI9D,GAAOoH,EAAGyB,CAAG,EACnBrH,EAAS,CAAE,EAAGsC,EAAE,EAAG,EAAGA,EAAE,CAAE,EAC1BoF,EAAUpF,EAAE,QACZsD,EAAE,OAAO,OAAO,QAAQ,CAACM,EAAGrB,KAAM,CAC5BqB,EAAE,OAAS,QAAa5D,EAAE,SAAWsD,EAAE,KAAKM,EAAE,IAAI,GAAK,CAACN,EAAE,MAAM,IAAIf,EAAC,IACvEe,EAAE,MAAM,IAAIf,EAAC,EACTqB,EAAE,OAAS,SACbN,EAAE,MAAQ,GAAKM,EAAE,MACjBP,GAAMO,CAAC,EACP3B,GAASqB,EAAE,IAAI,GACNM,EAAE,OAAS,QAAQf,EAAK,IAAK,IAAM,WAAY,KAAO,GAAG,EAExE,CAAC,EACDsC,EAAa,CAAE,GAAG1H,EAAO,KAAM6F,EAAE,IAAK,EAClCtD,EAAE,OACJ0B,EAAW,EACXyD,EAAa1H,EACb2H,EAAU,GAEd,CACA,MAAMC,EAAS,CACb,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIzJ,GAAII,EAAI,IAAK0B,EAAO,EAAI1B,EAAI,GAAG,CAAC,EACxD,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIH,GAAIG,EAAI,IAAK0B,EAAO,EAAI1B,EAAI,EAAE,CAAC,CACzD,EACA,GAAI,CAACwC,GAAUjE,EAAc,EAAGiE,EAAS6G,MACpC,CACH,MAAM/B,EAAI,EAAI,KAAK,IAAI,CAAC2B,EAAK,EAAE,EAC/BzG,EAAO,IAAM6G,EAAO,EAAI7G,EAAO,GAAK8E,EACpC9E,EAAO,IAAM6G,EAAO,EAAI7G,EAAO,GAAK8E,CACtC,CACIrF,GAAQ8G,EAAM9G,EAAK,QAAOA,EAAO,MACrCwB,EAAM,OAAOsF,EAAK,CAAC,CAAChH,GAAa8B,EAAW,GAAKpC,EAAM,GAAG,EAC1D3B,GAAMwB,GAAK,CACT,MAAA8B,GACA,MAAO+F,EACP,OAAAzH,EACA,IAAAI,EACA,KAAMvD,EAAc,EAAI,EAAIwK,EAC5B,OAAQ,CAACxK,EAAc,GAAK,CAAC,CAACwD,EAC9B,IAAAF,EACA,UAAAG,EACA,KAAAC,EACA,OAAAO,EACA,QAAA4G,CACF,CAAC,EACD,MAAME,EAAQvD,GAAS,EACnB5E,EAAE,OAAO,EAAE,cAAgBmI,IAAOnI,EAAE,OAAO,EAAE,YAAcmI,GAC3DP,EAAMxG,GAAW,MACf,CAACR,GAAaH,GAAS+D,EAAQ,EACnCpD,GAAWwG,GAEb,sBAAsBD,EAAK,CAC7B,CACA3H,EAAE,aAAa,EAAE,iBAAiB,QAASiG,EAAK,EAChDjG,EAAE,aAAa,EAAE,iBAAiB,QAAS6G,EAAK,EAChD7G,EAAE,aAAa,EAAE,iBAAiB,QAAS,IACzCA,EAAE,cAAc,EAAE,SAAW,CAACM,EAAM,IAAMwG,GAAiB,EAAID,GAAM,CACvE,EACA7G,EAAE,cAAc,EAAE,iBAAiB,QAAS8G,EAAgB,EAC5D9G,EAAE,YAAY,EAAE,iBAAiB,QAAS4G,EAAI,EAC9C5G,EAAE,YAAY,EAAE,iBAAiB,QAASsH,EAAQ,EAClDtH,EAAE,WAAW,EAAE,iBAAiB,QAAS0H,EAAS,EAClD1H,EAAE,aAAa,EAAE,iBAAiB,QAAS,IAAM,CAC/CgB,GAAQ,CAACA,GACTtD,GAAkBsC,EAAE,aAAa,EAAGgB,EAAK,EACzC0E,EAAK,IAAK,IAAM,UAAU,CAC5B,CAAC,EACD,MAAM0C,EAAOpI,EAAE,YAAY,EAC3BA,EAAE,YAAY,EAAE,iBAAiB,QAAS,IAAM,CAC9CsE,EAAW,EACP1D,GAAW2D,EAAW,EAC1B6D,EAAK,UAAU,CACjB,CAAC,EACDpI,EAAE,WAAW,EAAE,iBAAiB,QAAS,IAAMoI,EAAK,MAAM,CAAC,EAC3DpI,EAAE,UAAU,EAAE,iBAAiB,QAAS,IAAMoI,EAAK,MAAM,CAAC,EAC1DA,EAAK,iBAAiB,QAAU,GAAM,CACpC,GAAI,EAAE,SAAWA,EAAM,OACvB,MAAM,EAAIA,EAAK,sBAAsB,GACjC,EAAE,QAAU,EAAE,MAAQ,EAAE,QAAU,EAAE,OAAS,EAAE,QAAU,EAAE,KAAO,EAAE,QAAU,EAAE,SAClFA,EAAK,MAAM,CACf,CAAC,EACD,MAAMC,GAAO,CACX,QAAS,KACT,EAAG,KACH,EAAG,KACH,WAAY,QACZ,EAAG,QACH,EAAG,QACH,UAAW,OACX,EAAG,OACH,EAAG,OACH,UAAW,OACX,EAAG,OACH,EAAG,MACL,EACA,OAAO,iBAAiB,UAAY,GAAM,CAEtC3F,EAAW,GACX,EAAE,SACF,EAAE,SACF,EAAE,QACF,EAAE,QAAQ,UAAU,mBAAmB,GACvC,EAAE,QAAQ,mBACV,CAAC,SAAU,QAAS,UAAU,EAAE,SAAS,EAAE,QAAQ,OAAO,IAGxD2F,GAAK,EAAE,GAAG,GACZ,EAAE,eAAe,EACb,CAAC,EAAE,QAAU,CAAC/F,EAAM,KAAK,IAAI,OAAO,EAAE,IAAI,YAAY,CAAC,EAAE,GAC3DA,EAAM,MAAM,OAAO,EAAE,IAAI,YAAY,CAAC,GAAI+F,GAAK,EAAE,GAAG,EAAG,YAAY,IAAI,CAAC,GACjE,EAAE,IAAI,YAAY,IAAM,KACjC,EAAE,eAAe,EACjBzB,GAAK,GACI,EAAE,IAAI,YAAY,IAAM,KACjC,EAAE,eAAe,EACjBE,GAAiB,GACR,EAAE,IAAI,YAAY,IAAM,MACjC,EAAE,eAAe,EACjB9G,EAAE,cAAc,EAAE,SAAW,CAACM,EAAM,IAAMwG,GAAiB,EAAID,GAAM,GAEzE,CAAC,EACD,OAAO,iBAAiB,QAAU,GAAM,CAClCwB,GAAK,EAAE,GAAG,IACZ/F,EAAM,QAAQ,OAAO,EAAE,IAAI,YAAY,CAAC,GAAI,YAAY,IAAI,CAAC,EAC7D0C,GAAQ,EAEZ,CAAC,EACD9C,GAAW1E,GAAoB,CAC7B,OAAA0C,EACA,KAAMF,EAAE,MAAM,EACd,KAAAI,GACA,MAAAkC,EACA,QAASC,GACT,QAAS,IAAM,CAACG,EAAW,GAAK,CAACpC,EAAM,IACvC,WAAAgE,EACA,OAAQU,GACR,aAAA1F,GACA,eAAAC,EACF,CAAC,EACD,OAAO,iBAAiB,OAAQ+E,CAAU,EAC1C,OAAO,iBAAiB,mBAAoBA,CAAU,EACtD,SAAS,iBAAiB,mBAAoB,IAAM,CAClDA,EAAW,EACP,SAAS,kBAAoB,UAAY1D,GAAW2D,EAAW,EACnEC,EAAQ,EACRrD,EAAY,YAAY,IAAI,CAC9B,CAAC,EACD,OAAO,iBAAiB,WAAY,IAAM,CACxCmD,EAAW,EACP1D,GAAW2D,EAAW,EAC1BC,EAAQ,CACV,CAAC,EACDxE,EAAE,aAAa,EAAE,iBAAiB,SAAW,GAAMoE,GAAY,EAAE,OAAO,KAAK,CAAC,EAC9EpE,EAAE,YAAY,EAAE,iBAAiB,QAAS,IACxCM,EAAM,UAAY,YACdgI,GAAgB,EAAI,EACpB1L,GACEoC,EACA,CAAE,GAAG+C,EAAO,CAACzB,EAAM,OAAO,EAAG,CAAE,SAAUrB,EAAMqB,EAAM,OAAO,EAAE,UAAY,EAAG,MAAAA,CAAM,CAAE,EACrFA,EAAM,QACN8D,EACF,CACN,EACA,MAAMmE,GAAkBvI,EAAE,iBAAiB,EAC3C,SAASwI,IAAgB,CACvBlE,EAAW,EACP1D,GAAW2D,EAAW,EAC1BkE,GAAyB,EACzBC,GAA2B,EACvB,CAAC9G,GAAiB5B,EAAE,iBAAiB,EAAE,YAAY,WAAW,SAAS,IACzEA,EAAE,iBAAiB,EAAE,YAAc,IACrCuI,GAAgB,UAAU,CAC5B,CACA,SAASI,GAAiB,CACpB/G,IACF5B,EAAE,iBAAiB,EAAE,YAAc,kDACrC2B,GAAiB,UAAU,EAC3BA,EAAkB,KAClBC,EAAgB,GAChB5B,EAAE,gBAAgB,EAAE,SAAW,GAC/BA,EAAE,gBAAgB,EAAE,YAAc,yBAClCA,EAAE,iBAAiB,EAAE,YAAc,OACrC,CACA,SAAS4I,GAAgBC,EAAQ,CAC/B7I,EAAE,iBAAiB,EAAE,YACnB,UAAU6I,EAAO,KAAK,iDACxBvE,EAAW,EACP1D,GAAW2D,EAAW,EAC1BC,EAAQ,EACR/C,EAAkBoH,EAClBnH,EAAiB,GACjBvC,GAAiBK,GAAYqJ,EAAO,KAAK,EAAGA,CAAM,EAClD,OAAO9G,EAAM,UACbM,EAAoB,GACpBrC,EAAE,cAAc,EAAE,QAAU,GAC5BM,EAAQxC,GAAQ,WAAW,EAC3ByC,EAAS,CAAE,GAAGD,CAAM,EACpBE,EAAU,CAAC,EACXU,EAAU,EACVT,EAAU,GACVG,EAAY,KACZC,EAAY,CAAC,EACbC,EAAO,KACPO,EAAS,KACTV,EAAM,KACN8C,GAAW,EACXI,GAAU,EACVa,EAAG,EACHF,EAAQ,EACR+D,GAAgB,MAAM,EACtBxI,EAAM,mBAAoB,CACxB,GAAG4C,EAAiB,EACpB,cAAekG,EAAO,MACtB,UAAWA,EAAO,MAAM,QAAQ,MAClC,CAAC,EACDxE,EACE,iBAAiBwE,EAAO,KAAK,yBAAyBlF,GAAkBkF,EAAO,MAAM,QAAQ,MAAM,CAAC,GACtG,CACF,CACA,SAASC,IAAY,CACnB,GAAI,WAAW,QAAQ,gBAAiB,CACtC,MAAM3C,EAAI,IAAI,YAAY,CAAC,EAC3B,cAAO,gBAAgBA,CAAC,EACjB,CAAC,GAAGA,CAAC,EAAE,IAAK4C,GAAMA,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,CACnD,CACA,MAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAAC,EAC9E,CACA,SAAST,GAAgBU,EAAQ,GAAO,CACtC,GAAIpH,EAAe,OACfoH,IAAOhJ,EAAE,eAAe,EAAE,MAAQ,IACtC,IAAIiJ,EACJ,MAAMC,EAAe,CAACF,GAAShJ,EAAE,eAAe,EAAE,MAAM,KAAK,IAAM,GACnE,GAAI,CACFiJ,EAAWvJ,GAAkB,CAC3B,UAAWM,EAAE,gBAAgB,EAAE,MAC/B,SAAUA,EAAE,gBAAgB,EAAE,MAC9B,WAAYA,EAAE,qBAAqB,EAAE,MACrC,KAAMkJ,EAAelJ,EAAE,eAAe,EAAE,MAAQ8I,GAAU,CAC5D,CAAC,CACH,OAASrC,EAAG,CACVzG,EAAE,iBAAiB,EAAE,YAAc/C,GAAwBwJ,EAAE,QAASzG,EAAE,eAAe,EAAE,KAAK,EAC9F,MACF,CACAwI,GAAc,EACd5G,EAAgB,GAChB5B,EAAE,gBAAgB,EAAE,SAAW,GAC/BA,EAAE,gBAAgB,EAAE,YAAc,kBAClCA,EAAE,iBAAiB,EAAE,YAAc,gBACnCA,EAAE,iBAAiB,EAAE,YAAc,gCACnC,GAAI,CACF2B,EAAkBtE,GAAiB,IAAI,IAAI,4CAA6C,YAAY,GAAG,CAAC,EACxG,MAAM8L,EAAMxH,EACZ,IAAIyH,EAAU,EACZC,EAAO,EACT1H,EAAgB,UAAa2E,GAAU,CACrC,GAAI3E,IAAoBwH,EACxB,GAAI7C,EAAM,KAAK,OAAS,WACtB8C,EAAU9C,EAAM,KAAK,QACrB+C,EAAO/C,EAAM,KAAK,KAClBtG,EAAE,iBAAiB,EAAE,YACnB,iCAA4BoJ,CAAO,wCAAwCC,CAAI,kBACxE/C,EAAM,KAAK,OAAS,WAAY,CACzC,MAAMuC,EAAS,CAAE,GAAGvC,EAAM,KAAK,OAAQ,aAAA4C,CAAa,EACpDP,EAAe,EACfC,GAAgBC,CAAM,CACxB,MAAWvC,EAAM,KAAK,OAAS,UAC7BqC,EAAe,EACf3I,EAAE,iBAAiB,EAAE,YAAc/C,GACjCqJ,EAAM,KAAK,QACX4C,EAAeD,EAAS,KAAO,EACjC,EAEJ,EACAtH,EAAgB,QAAW2E,GAAU,CACnC,GAAI3E,IAAoBwH,EAAK,OAC7BR,EAAe,EACf,MAAMW,EAAShD,GAAO,SAAS,SAAS,eAAe,EACnD,yCACA,wDACEiD,EAAWH,EACb,iBAAiBA,CAAO,aAAaC,EAAO,2BAA2BA,CAAI,SAAW,2BAA2B,IACjH,GACJrJ,EAAE,iBAAiB,EAAE,YAAc/C,GACjC,GAAGqM,CAAM,GAAGC,CAAQ,4BAA4BN,EAAS,SAAW,EAAI,mCAAqC,EAAE,oEAC/GC,EAAeD,EAAS,KAAO,EACjC,CACF,EACAtH,EAAgB,YAAY,CAC1B,SAAAsH,EAEA,QAAS,EACX,CAAC,CACH,MAAQ,CACNN,EAAe,EACf3I,EAAE,iBAAiB,EAAE,YAAc,uDACrC,CACF,CACAA,EAAE,aAAa,EAAE,iBAAiB,QAAS,IAAMoE,GAAYtC,GAAS,OAAO,CAAC,EAC9E9B,EAAE,YAAY,EAAE,iBAAiB,QAAS,IAAMoE,GAAYtC,GAAS,MAAM,CAAC,EAC5E9B,EAAE,eAAe,EAAE,iBAAiB,QAAS,IAC3CyB,EAAkB2C,GAAY,WAAW,EAAIoE,GAAc,CAC7D,EACA,IAAIgB,GAAoB,GACxBxJ,EAAE,uBAAuB,EAAE,iBAAiB,QAAS,IAAM,CACzD,GAAI,CAACyB,EAAiB,OAEtB+H,GADgBpF,GAAY,WAAW,IACP,GAChCpE,EAAE,mBAAmB,EAAE,MAAM,CAC/B,CAAC,EACDA,EAAE,mBAAmB,EAAE,iBAAiB,QAAS,IAAM,CAChDwJ,KACLA,GAAoB,GACpB,QAAQ,QAAQ,EAAE,KAAK,IAAM,CACvBlJ,EAAM,UAAY,aAAe,CAACoC,EAAW,GAAGxC,EAAO,QAAQ,CAAE,cAAe,EAAK,CAAC,CAC5F,CAAC,EACH,CAAC,EACDF,EAAE,yBAAyB,EAAE,iBAAiB,QAASwI,EAAa,EACpE7L,GAA2B,CACzB,WAAa8M,GAAU,CACrBpH,EAAoBoH,CACtB,EACA,OAAQ/E,EACR,WAAAhC,CACF,CAAC,EACD1C,EAAE,eAAe,EAAE,iBAAiB,SAAW,GAAM,CACnD,EAAE,eAAe,EACjBsI,GAAgB,CAClB,CAAC,EACDtI,EAAE,iBAAiB,EAAE,iBAAiB,QAAS,IAAM,CACnD2I,EAAe,EACfJ,GAAgB,MAAM,CACxB,CAAC,EACDvI,EAAE,gBAAgB,EAAE,iBAAiB,QAAS,IAAM,CAClD2I,EAAe,EACfJ,GAAgB,MAAM,CACxB,CAAC,EACDA,GAAgB,iBAAiB,SAAUI,CAAc,EACzD3I,EAAE,qBAAqB,EAAE,iBAAiB,QAAS,IAAM,CACvDA,EAAE,iBAAiB,EAAE,YAAc,GAAGA,EAAE,qBAAqB,EAAE,KAAK,GACtE,CAAC,EACDA,EAAE,eAAe,EAAE,iBAAiB,QAAS,IAAM,CAC7C0B,IACF1B,EAAE,eAAe,EAAE,MAAQyB,EAAgB,KAC3CzB,EAAE,iBAAiB,EAAE,YACnB,gEACF0I,GAA2B,EAE/B,CAAC,EACGhH,IACF1B,EAAE,gBAAgB,EAAE,MAAQ,OAAOyB,EAAgB,SAAS,SAAS,EACrEzB,EAAE,gBAAgB,EAAE,MAAQ,OAAOyB,EAAgB,SAAS,QAAQ,EACpEzB,EAAE,qBAAqB,EAAE,MAAQ,OAAOyB,EAAgB,SAAS,UAAU,EAC3EzB,EAAE,iBAAiB,EAAE,YAAc,GAAGyB,EAAgB,SAAS,UAAU,IACzEzB,EAAE,eAAe,EAAE,MAAQyB,EAAgB,aAAeA,EAAgB,KAAO,IAEnFgC,GAAW,EACXI,GAAU,EACNpD,GACF4D,EACE/C,KACGhB,EAAM,IACH,oDACAjC,GAAWiC,CAAK,EACd,0DACA,sEACV,EACFoE,EAAG,EACH,sBAAsBiD,EAAK,EAE3B9J,GAAc,CACZ,IAAK,YACL,MAAAkC,EACA,WAAY,IAAM,CAChBuE,EAAW,EACP1D,GAAW2D,EAAW,EAC1BC,EAAQ,EACRrD,EAAY,YAAY,IAAI,CAC9B,EACA,WAAY,IAAM,CAChBA,EAAY,YAAY,IAAI,CAC9B,EACA,QAAS,KAAO,CACd,GAAGwB,EAAiB,EACpB,WAAY1D,EAAMqB,EAAM,OAAO,EAAE,KACjC,MAAOA,EAAM,MACb,SAAUA,EAAM,EAChB,SAAUA,EAAM,EAChB,cAAeA,EAAM,KACrB,aAAcA,EACd,iBAAkB,KAAK,MAAMY,EAAU,GAAI,EAC3C,GAAIZ,EAAM,UAAY,aAAemB,EACjC,CAAE,YAAaA,EAAgB,KAAM,gBAAiBA,EAAgB,QAAS,EAC/E,CAAC,CACP,EACF,CAAC,EAEDD,EAAU,MACR,IAAMlB,EAAM,QACZ,IAAM,CACJgE,EAAW,EACXtE,EAAE,WAAW,EAAE,YAAc,0CAC7BqE,EAAI9G,EAAqB,CAC3B,CACF,EAEA,OAAO,iBAAiB,cAAe,IAAM,CAC3C+G,EAAW,EACP1D,GAAW2D,EAAW,EAC1BC,EAAQ,EACRrD,EAAY,YAAY,IAAI,CAC9B,CAAC,EACD,OAAO,iBAAiB,eAAgB,IAAM,CAC5CA,EAAY,YAAY,IAAI,CAC9B,CAAC,EACDnB,EAAE,iBAAiB,EAAE,iBAAiB,QAAS,IAAM,CAC/C2B,GAAiBgH,EAAe,CACtC,CAAC,EAED3I,EAAE,iBAAiB,EAAE,iBAAiB,mBAAoB,IAAM,CAC1D2B,GAAiBgH,EAAe,CACtC,CAAC,EAED,SAASD,IAA6B,CACpC,MAAMgB,EAAU1J,EAAE,wBAAwB,EAC1C,GAAI,CAAC0J,EAAS,OACd,MAAMC,EAAW3J,EAAE,eAAe,EAAE,MAAM,KAAK,IAAM,GACrDA,EAAE,wBAAwB,EAAE,YAC1B,GAAGA,EAAE,qBAAqB,EAAE,KAAK,qBAAkB2J,EAAW,cAAgB,aAAa,GACzFA,IAAUD,EAAQ,KAAO,GAC/B,CACA,SAAW,CAACzJ,EAAI2J,CAAM,IAAK,OAAO,QAAQ,CACxC,eAAgB,8BAChB,eAAgB,wCAChB,oBAAqB,sCACrB,cAAe,sCACjB,CAAC,EACC5J,EAAEC,CAAE,EAAE,iBAAiB,QAAS,IAAM,CAC/B2B,IAAe5B,EAAE,iBAAiB,EAAE,YAAc,GACzD,CAAC,EACDA,EAAEC,CAAE,EAAE,iBAAiB,UAAW,IAAM,CACtCD,EAAE,iBAAiB,EAAE,YAAc,GAAG4J,CAAM,+BAC9C,CAAC,EAEH,UAAW3J,IAAM,CAAC,gBAAiB,qBAAqB,EACtDD,EAAEC,CAAE,EAAE,iBAAiB,QAASyI,EAA0B,EAC1D1I,EAAEC,CAAE,EAAE,iBAAiB,UAAW,IAAM,CACtCD,EAAE,wBAAwB,EAAE,KAAO,EACrC,CAAC,EAEH,MAAMyI,GAA2BzL,GAAsB,YAAa,SAAU,CAAC6M,EAAKC,IAAW,CAC7F,MAAMrE,EAASvI,GAAS2M,EAAKC,CAAM,EACnC,OAAA9J,EAAE,0BAA0B,EAAE,YAAc/C,GAC1CwI,EAAO,SAAS,KAAK,GAAG,EACxBzF,EAAE,eAAe,EAAE,KACrB,EACO,CACL,GAAGyF,EACH,SACEqE,EAAO,SAAW,GACd,CAAC,mFAAmF,EACpF,CAAC,CACT,CACF,CAAC,EACDpB,GAA2B",
  "names": ["prepareGameplayStorage", "createGameplayBlocker", "HintRoutes", "startupSelection", "elapsedSince", "difficultyLabel", "updateCompletion", "bindCompletionPresentation", "advanceChallenge", "showGameMessage", "updateGymBadge", "drawingCache", "bindGeneratorGuidance", "formatGenerationFailure", "guidance", "setupBoardAccessibility", "reducedMotion", "createTaskWorker", "createSaveStore", "SAVE_CONFLICT_MESSAGE", "bindPointerControls", "updateMapButton", "updateSoundButton", "challengeProgress", "isLevelCleared", "setupFeedback", "initial", "move", "solve", "broken", "DIRS", "tile", "routeBroken", "routeClear", "complete", "atFinish", "recover", "W", "H", "scene", "drawBoard", "T", "motion", "sample", "LEVELS", "level", "puzzle", "installGenerated", "TapQueue", "DirectionInput", "padDirection", "swipeDirection", "decodeBoard", "encodeBoard", "normalizeSettings", "restoreRecord", "consolidateProgress", "createAnalytics", "updateAccessibility", "track", "$", "id", "canvas", "ctx", "pads", "arrows", "state", "visual", "history", "started", "map", "dir", "animation", "particles", "hint", "pending", "sound", "audio", "elapsed", "lastFrame", "lastSave", "camera", "recoveryNote", "storageKey", "saveStore", "generatedRecord", "generatedReady", "generatorWorker", "generatorBusy", "hintWorker", "modeLast", "slots", "archivedSlots", "board", "controls", "taps", "hintRoutes", "completionVisible", "input", "requestMove", "total", "required", "dialogOpen", "analyticsDetails", "validPosition", "s", "validMask", "normalize", "next", "loadSlot", "saved", "raw", "restored", "migrated", "validGeneratedResume", "loadGeneratedSlot", "cachedDrawing", "cacheBoard", "c", "snowballObjective", "count", "editionUI", "g", "kind", "cleared", "run", "valid", "key", "selectLevel", "say", "clearInput", "finishMove", "persist", "nextId", "ui", "message", "timeText", "seconds", "counters", "mask", "inputUI", "b", "x", "y", "i", "tx", "ty", "ramp", "badge", "result", "tone", "freq", "duration", "type", "volume", "endFreq", "o", "start", "smash", "a", "RAMP_SIDE_MESSAGE", "stoppedAtRampSide", "event", "d", "isRepeat", "e", "nextTap", "f", "undo", "reset", "returnToEntrance", "presentHint", "route", "verified", "from", "direction", "dx", "dy", "showHint", "cached", "snapshot", "task", "toggleMap", "frame", "now", "rawDt", "dt", "p", "paintState", "powered", "target", "clock", "help", "keys", "beginGeneration", "generatorDialog", "openGenerator", "refreshGeneratorGuidance", "refreshGeneratorDisclosure", "stopGeneration", "acceptGenerated", "record", "freshSeed", "n", "fresh", "settings", "explicitSeed", "job", "checked", "best", "reason", "progress", "resumeReturnFocus", "value", "details", "explicit", "advice", "gym", "config"]
}
